difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/sdks/wx_sdk.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '2d077OaeBRL8JWTIOk7HYAN', 'wx_sdk');
// Scripts/sdks/wx_sdk.js
 
"use strict";
 
// window.PLATFORM = "wx";        // 平台号
// window.PACKAGE_VERSION = "0.0.2";
// window.CHANNEL = "h5sszg_wx";  // 渠道号
window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号
 
var LoginController = require("login_controller");
 
var RoleController = require("role_controller");
 
var sha1 = require('sha1.min');
 
var WXSDK = function WXSDK() {
  wx = null;
}; // 7dec9c4e4c26c46cf1a4e28a083f82bd
 
 
WXSDK.account_info = null;
WXSDK.user_info = null; // 游戏加载完成、初始化SDK
 
WXSDK.initSDK = function () {
  console.log("微信SDK相关");
  console.log(window);
  if (!window.wx) return;
  this.initTopInfo();
  wx.setKeepScreenOn({
    keepScreenOn: true
  });
  wx.onShow(function (res) {
    wx.setKeepScreenOn({
      keepScreenOn: true
    });
  });
  wx.onHide(function (res) {
    wx.setKeepScreenOn({
      keepScreenOn: false
    });
  });
  wx.showShareMenu({
    success: function success() {
      wx.onShareAppMessage(function () {
        return {
          title: '闪烁之光',
          imageUrl: '' // 图片 URL
 
        };
      });
    }
  });
  wx.getSetting({
    success: function success(res) {
      cc.log(res);
 
      if (res.authSetting["scope.userInfo"]) {
        WXSDK.checkLoginStatus();
      } else {
        var info = wx.getSystemInfoSync();
        var button = wx.createUserInfoButton({
          type: 'text',
          text: '',
          style: {
            left: 0,
            bottom: 0,
            width: info.screenWidth,
            height: info.screenHeight / 2,
            lineHeight: 40,
            backgroundColor: '',
            color: '#ffffff',
            textAlign: 'center',
            fontSize: 16,
            borderRadius: 4
          }
        });
        button.show();
        button.onTap(function (res) {
          button.hide();
          WXSDK.checkLoginStatus();
          console.log(res);
        });
      }
    }
  });
};
 
WXSDK.initTopInfo = function () {
  var menuInfo = wx.getMenuButtonBoundingClientRect();
  var systemInfo = wx.getSystemInfoSync();
  window.WX_FIT = menuInfo.top / systemInfo.screenHeight * 0.8 || 0;
  console.log("微信小游戏菜单栏的适配值");
  cc.log(WX_FIT);
};
 
WXSDK.checkLoginStatus = function () {
  // 获取本地key
  try {
    var value = this.account_info = wx.getStorageSync('account_info');
 
    if (value) {
      WXSDK.checkSessionKey(value);
    } else {
      WXSDK.login();
    }
  } catch (e) {// Do something when catch error
  }
};
 
WXSDK.login = function () {
  if (window.wx) {
    wx.login({
      success: function success(res) {
        if (res.code) {
          //发起网络请求
          cc.log("初始化登录信息返回");
          cc.log(res);
          wx.request({
            url: 'https://s1-wx-h5sszg.shiyuegame.com/api.php/pf/wx/login/',
            method: "POST",
            data: {
              js_code: res.code,
              cps: "wxtest"
            },
            header: {
              'content-type': 'application/json' // 默认值
 
            },
            success: function success(res) {
              cc.log("服务器登录信息返回");
              cc.log(res);
 
              if (res && res.data) {
                if (res.data.error == 666) {
                  // 请求成功
                  try {
                    console.log("保存用户信息到本地");
                    cc.log(res.data.msg);
                    WXSDK.account_info = res.data.msg;
                    wx.setStorageSync('account_info', res.data.msg); // 请求成功开始登录游戏
 
                    WXSDK.initUserInfo();
                  } catch (e) {}
                }
              }
            }
          });
        } else {
          console.log('登录失败!' + res.errMsg);
        }
      }
    });
  }
};
 
WXSDK.checkSessionKey = function (data) {
  cc.log("校验key是否过期");
  wx.checkSession({
    success: function success() {
      // 没有失效,继续登录
      WXSDK.initUserInfo();
    },
    fail: function fail() {
      // session_key 已经失效,需要重新执行登录流程
      WXSDK.login();
    }
  }); // wx.getUserInfo({
  //   success: function(res) {
  //     console.log("用户信息");
  //     console.log(res)
  //     // 请求access_token
  //     cc.log("发送到服务器校验是否过期");
  //     cc.log(data);
  //     wx.request({
  //       url: 'http://s1-release-h5sszg.shiyuegame.com/api.php/pf/wx/token',
  //       data: {
  //         cps: "wxtest"
  //       },
  //       header: {
  //         'content-type': 'application/json' // 默认值
  //       },
  //       success (res1) {
  //         if (res1 && res1.data) {
  //           cc.log("ASSESS_TOKEN返回");
  //           cc.log(res1);
  //           if (res1.data.error == 666) {    // 请求成功
  //             cc.log("校验ASSESS_TOKEN是否过期");
  //             var signature = sha1(res.rawData + data.session_key)
  //             wx.request({
  //               url: 'http://s1-release-h5sszg.shiyuegame.com/api.php/pf/wx/check_session',
  //               data: {
  //                 access_token: res1.data.msg.access_token,
  //                 openid: data.openid,
  //                 signature: signature,
  //                 cps: "wxtest",
  //               },
  //               header: {
  //                 'content-type': 'application/json' // 默认值
  //               },
  //               success (res) {
  //                 cc.log("校验结果");
  //                 cc.log(res);
  //                 if (res && res.data) {
  //                   if (res.data.error == 666) {    // 请求成功
  //                     try {
  //                         console.log("HHHHHHHHHHHHHHHHHHHHHHHHH");
  //                         console.log("校验成功开始登录游戏");
  //                     } catch (e) {
  //                     }
  //                   }
  //                 }
  //               }
  //             })
  //           }
  //         }
  //       }
  //     })
  //   },
  //   fail: function(res) {
  //     console.log("UUUUUUUUUUUUUUUUu");
  //     console.log(res)
  //   }
  // })
};
 
WXSDK.initUserInfo = function () {
  wx.getUserInfo({
    success: function success(res) {
      WXSDK.user_info = res;
      cc.log("获取用户信息成功");
      cc.log(res);
      WXSDK.setLoginData(res);
    },
    fail: function fail(res) {
      cc.log("获取用户信息失败");
    }
  });
};
 
WXSDK.setLoginData = function (user_info) {
  this.user_info = user_info;
  this.sdkBackLogin();
}; // SDK登录成功回调
 
 
WXSDK.sdkBackLogin = function () {
  var login_data = {};
  login_data.usrName = "wx_" + this.account_info.openid;
  login_data.password = "wx123456";
  console.log("微信数据初始花成功,开始请求服务器列表");
  LoginController.getInstance().loginPlatformRequest(login_data);
};
 
WXSDK.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) {
  console.log("开始调用支付");
  var loginInfo = LoginController.getInstance().model.getLoginInfo();
  var roleVo = RoleController.getInstance().getRoleVo();
  if (roleVo == null) return;
  var severInfo = roleVo.srv_id.split("_");
  var platform = severInfo[0] || "";
  var zone_id = severInfo[1];
  var systemInfo = wx.getSystemInfoSync();
  var systemName = systemInfo.system;
  var pf = "";
 
  if (systemName.indexOf("iOS") > -1) {// return;
  } else if (systemName.indexOf("Android") > -1) {
    pf = "android";
  }
 
  var data = {
    openid: WXSDK.account_info.openid,
    time: WXSDK.account_info.time,
    sign: WXSDK.account_info.sign,
    zone_id: zone_id,
    pf: pf,
    cps: "wxtest"
  };
  wx.request({
    url: "https://" + loginInfo.host + "/api.php/pf/wx/balance",
    method: "POST",
    data: data,
    header: {
      'content-type': 'application/json' // 默认值
 
    },
    success: function success(res) {
      console.log("请求余额", res);
 
      if (res && res.data) {
        if (res.data.error == 666) {
          // 请求成功
          try {
            //时间戳
            var date_time = Math.ceil(Date.now() / 1000);
            productName = productName || money * 10 + "钻石";
            var cps = "wxtest";
            var channel = CHANNEL;
 
            var _extension = roleVo.rid + "$$" + platform + "$$" + zone_id + "$$" + channel + "$$" + prodId + "$$" + productName + "$$" + cps + "$$" + date_time;
 
            cc.log("拓展参数_extension==>", _extension);
 
            var base_64 = require("base64").Base64;
 
            _extension = base_64.encode(_extension);
            cc.log("拓展参数_extension==222222222>", _extension);
 
            if (res.data.msg) {
              if (res.data.msg.balance >= money * 10) {
                wx.request({
                  url: "https://" + loginInfo.host + "/api.php/pf/wx/pay",
                  method: "POST",
                  data: {
                    openid: WXSDK.account_info.openid,
                    zone_id: zone_id,
                    pf: pf,
                    amt: money * 10,
                    time: WXSDK.account_info.time,
                    sign: WXSDK.account_info.sign,
                    app_remark: _extension,
                    cps: cps
                  },
                  header: {
                    'content-type': 'application/json' // 默认值
 
                  },
                  success: function success(res) {
                    console.log("预下单返回");
                    console.log(res);
 
                    if (res && res.data) {
                      if (res.data.error == 666) {// 请求成功
                      } else if (res.data.error == 1) {} else if (res.data.error == -1) {
                        console.log("充值失败");
                      }
                    }
                  }
                });
              } else {
                wx.requestMidasPayment({
                  mode: "game",
                  env: 1,
                  //
                  offerId: "1450021881",
                  currencyType: "CNY",
                  platform: pf,
                  buyQuantity: money * 10,
                  zoneId: zone_id,
                  success: function success(res) {
                    console.log("支付回调成功");
                    wx.request({
                      url: "https://" + loginInfo.host + "/api.php/pf/wx/pay",
                      method: "POST",
                      data: {
                        openid: WXSDK.account_info.openid,
                        zone_id: zone_id,
                        pf: pf,
                        amt: money * 10,
                        time: WXSDK.account_info.time,
                        sign: WXSDK.account_info.sign,
                        app_remark: _extension,
                        cps: cps
                      },
                      header: {
                        'content-type': 'application/json' // 默认值
 
                      },
                      success: function success(res) {
                        console.log("预下单返回");
                        console.log(res);
 
                        if (res && res.data) {
                          if (res.data.error == 666) {// 请求成功
                          } else if (res.data.error == 1) {} else if (res.data.error == -1) {
                            console.log("充值失败");
                          }
                        }
                      }
                    });
                  },
                  fail: function fail(res) {
                    console.log("支付回调失败", res);
                  },
                  complete: function complete(res) {
                    console.log("支付回调complete", res);
                  }
                });
              }
            }
          } catch (e) {}
        }
      }
    }
  });
};
 
WXSDK.loginGame = function () {
  var test_acount = LoginController.getInstance().getTestAccount();
  cc.log("使用了微信测试账号");
  cc.log(test_acount); // SDK请求登录游戏
 
  var login_data = {};
 
  if (test_acount) {
    login_data.account = test_acount;
  } else {
    login_data.account = "wx_" + this.account_info.openid;
  }
 
  login_data.rawData = this.user_info.rawData;
  login_data.signature = this.user_info.signature;
  login_data.channel = CHANNEL;
  login_data.package_name = PACKAGE_NAME;
  login_data.package_version = PACKAGE_VERSION;
  login_data.platform = PLATFORM;
  login_data.token = WXSDK.account_info.session_key;
  login_data.timestamp = WXSDK.account_info.time;
  login_data.sign = WXSDK.account_info.sign;
  LoginController.getInstance().cusSDKLogin(login_data);
}; // 通知服务器成功
 
 
WXSDK.submitLogin = function (url) {
  if (url) {
    var submit_url = "https://" + url + "/api.php/pf/wx/session";
    console.log(submit_url);
    console.log(WXSDK.account_info);
    wx.request({
      url: submit_url,
      method: "POST",
      data: {
        session_key: WXSDK.account_info.session_key,
        openid: WXSDK.account_info.openid,
        time: WXSDK.account_info.time,
        sign: WXSDK.account_info.sign,
        cps: "wxtest"
      },
      header: {
        'content-type': 'application/json' // 默认值
 
      },
      success: function success(res) {
        cc.log("服务器登录信息返回");
        cc.log(res);
 
        if (res && res.data) {
          console.log(res.data);
 
          if (res.data.error == 666) {// 请求成功
          }
        }
      }
    });
  }
};
 
WXSDK.getCurrChannel = function () {};
 
WXSDK.getSubChannel = function () {};
 
WXSDK.loginLog = function () {
  var options = wx.getLaunchOptionsSync();
  console.log("xhj------------", options);
  if (options == null || options.query == null || options.query.weixinadinfo == null) return;
  var weixinadinfoArr = options.query.weixinadinfo.split(".");
  var aid = weixinadinfoArr[0];
  if (aid == null) return;
  var url = window.location.href;
  console.log("xhj+++++++++++++", url);
  wx.request({
    url: "",
    method: "POST",
    data: {
      sku: options.query.sku,
      app_id: options.query.app_id,
      sy_ad_id: options.query.sy_ad_id,
      channel_id: options.query.channel_id,
      gdt_vid: options.query.gdt_vid,
      weixinadinfo: options.query.weixinadinfo,
      sub_ad_id: aid,
      url: url
    },
    header: {
      'content-type': 'application/json' // 默认值
 
    },
    success: function success(res) {
      console.log("上报登录信息返回");
      console.log(res);
    }
  });
};
 
WXSDK.download_qrcode_png = function () {
  wx.request({
    url: 'https://s1-h5mlf-h5sszg.shiyuegame.com/api.php/pf/wx/token',
    method: "POST",
    data: {
      cps: "wxtest"
    },
    header: {
      'content-type': 'application/json' // 默认值
 
    },
    success: function success(res1) {
      if (res1.data.error == 666) {
        // 请求成功
        //res1.data.msg.access_token,
        console.log("获取assess_token");
        console.log(res1);
        var query = wx.getLaunchOptionsSync();
        var scene = decodeURIComponent(query.scene);
        console.log("获取小游戏scene");
        console.log(query);
        console.log(scene);
        console.log("请求二维码相关");
      }
    }
  });
};
 
WXSDK.createGameClubButton = function () {
  var clubButton = wx.createGameClubButton({
    icon: 'green',
    style: {
      left: 10,
      top: 76,
      width: 40,
      height: 40
    }
  });
};
 
module.exports = WXSDK;
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xcd3hfc2RrLmpzIl0sIm5hbWVzIjpbIndpbmRvdyIsIlBBQ0tBR0VfTkFNRSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsInNoYTEiLCJXWFNESyIsInd4IiwiYWNjb3VudF9pbmZvIiwidXNlcl9pbmZvIiwiaW5pdFNESyIsImNvbnNvbGUiLCJsb2ciLCJpbml0VG9wSW5mbyIsInNldEtlZXBTY3JlZW5PbiIsImtlZXBTY3JlZW5PbiIsIm9uU2hvdyIsInJlcyIsIm9uSGlkZSIsInNob3dTaGFyZU1lbnUiLCJzdWNjZXNzIiwib25TaGFyZUFwcE1lc3NhZ2UiLCJ0aXRsZSIsImltYWdlVXJsIiwiZ2V0U2V0dGluZyIsImNjIiwiYXV0aFNldHRpbmciLCJjaGVja0xvZ2luU3RhdHVzIiwiaW5mbyIsImdldFN5c3RlbUluZm9TeW5jIiwiYnV0dG9uIiwiY3JlYXRlVXNlckluZm9CdXR0b24iLCJ0eXBlIiwidGV4dCIsInN0eWxlIiwibGVmdCIsImJvdHRvbSIsIndpZHRoIiwic2NyZWVuV2lkdGgiLCJoZWlnaHQiLCJzY3JlZW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiYmFja2dyb3VuZENvbG9yIiwiY29sb3IiLCJ0ZXh0QWxpZ24iLCJmb250U2l6ZSIsImJvcmRlclJhZGl1cyIsInNob3ciLCJvblRhcCIsImhpZGUiLCJtZW51SW5mbyIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzeXN0ZW1JbmZvIiwiV1hfRklUIiwidG9wIiwidmFsdWUiLCJnZXRTdG9yYWdlU3luYyIsImNoZWNrU2Vzc2lvbktleSIsImxvZ2luIiwiZSIsImNvZGUiLCJyZXF1ZXN0IiwidXJsIiwibWV0aG9kIiwiZGF0YSIsImpzX2NvZGUiLCJjcHMiLCJoZWFkZXIiLCJlcnJvciIsIm1zZyIsInNldFN0b3JhZ2VTeW5jIiwiaW5pdFVzZXJJbmZvIiwiZXJyTXNnIiwiY2hlY2tTZXNzaW9uIiwiZmFpbCIsImdldFVzZXJJbmZvIiwic2V0TG9naW5EYXRhIiwic2RrQmFja0xvZ2luIiwibG9naW5fZGF0YSIsInVzck5hbWUiLCJvcGVuaWQiLCJwYXNzd29yZCIsImdldEluc3RhbmNlIiwibG9naW5QbGF0Zm9ybVJlcXVlc3QiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwibG9naW5JbmZvIiwibW9kZWwiLCJnZXRMb2dpbkluZm8iLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJzZXZlckluZm8iLCJzcnZfaWQiLCJzcGxpdCIsInBsYXRmb3JtIiwiem9uZV9pZCIsInN5c3RlbU5hbWUiLCJzeXN0ZW0iLCJwZiIsImluZGV4T2YiLCJ0aW1lIiwic2lnbiIsImhvc3QiLCJkYXRlX3RpbWUiLCJNYXRoIiwiY2VpbCIsIkRhdGUiLCJub3ciLCJjaGFubmVsIiwiQ0hBTk5FTCIsIl9leHRlbnNpb24iLCJyaWQiLCJiYXNlXzY0IiwiQmFzZTY0IiwiZW5jb2RlIiwiYmFsYW5jZSIsImFtdCIsImFwcF9yZW1hcmsiLCJyZXF1ZXN0TWlkYXNQYXltZW50IiwibW9kZSIsImVudiIsIm9mZmVySWQiLCJjdXJyZW5jeVR5cGUiLCJidXlRdWFudGl0eSIsInpvbmVJZCIsImNvbXBsZXRlIiwibG9naW5HYW1lIiwidGVzdF9hY291bnQiLCJnZXRUZXN0QWNjb3VudCIsImFjY291bnQiLCJyYXdEYXRhIiwic2lnbmF0dXJlIiwicGFja2FnZV9uYW1lIiwicGFja2FnZV92ZXJzaW9uIiwiUEFDS0FHRV9WRVJTSU9OIiwiUExBVEZPUk0iLCJ0b2tlbiIsInNlc3Npb25fa2V5IiwidGltZXN0YW1wIiwiY3VzU0RLTG9naW4iLCJzdWJtaXRMb2dpbiIsInN1Ym1pdF91cmwiLCJnZXRDdXJyQ2hhbm5lbCIsImdldFN1YkNoYW5uZWwiLCJsb2dpbkxvZyIsIm9wdGlvbnMiLCJnZXRMYXVuY2hPcHRpb25zU3luYyIsInF1ZXJ5Iiwid2VpeGluYWRpbmZvIiwid2VpeGluYWRpbmZvQXJyIiwiYWlkIiwibG9jYXRpb24iLCJocmVmIiwic2t1IiwiYXBwX2lkIiwic3lfYWRfaWQiLCJjaGFubmVsX2lkIiwiZ2R0X3ZpZCIsInN1Yl9hZF9pZCIsImRvd25sb2FkX3FyY29kZV9wbmciLCJyZXMxIiwic2NlbmUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJjcmVhdGVHYW1lQ2x1YkJ1dHRvbiIsImNsdWJCdXR0b24iLCJpY29uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxZQUFQLEdBQXNCLFNBQXRCLEVBQWtDOztBQUVsQyxJQUFJQyxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxJQUFJLEdBQUdGLE9BQU8sQ0FBQyxVQUFELENBQWxCOztBQUVBLElBQUlHLEtBQUssR0FBRyxTQUFSQSxLQUFRLEdBQVc7QUFDbkJDLEVBQUFBLEVBQUUsR0FBRyxJQUFMO0FBQ0gsQ0FGRCxFQUlBOzs7QUFDQUQsS0FBSyxDQUFDRSxZQUFOLEdBQXFCLElBQXJCO0FBQ0FGLEtBQUssQ0FBQ0csU0FBTixHQUFrQixJQUFsQixFQUVBOztBQUNBSCxLQUFLLENBQUNJLE9BQU4sR0FBZ0IsWUFBVztBQUN2QkMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksU0FBWjtBQUNBRCxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWVosTUFBWjtBQUVBLE1BQUksQ0FBQ0EsTUFBTSxDQUFDTyxFQUFaLEVBQWlCO0FBRWpCLE9BQUtNLFdBQUw7QUFFQU4sRUFBQUEsRUFBRSxDQUFDTyxlQUFILENBQW1CO0FBQ2ZDLElBQUFBLFlBQVksRUFBRTtBQURDLEdBQW5CO0FBR0FSLEVBQUFBLEVBQUUsQ0FBQ1MsTUFBSCxDQUFVLFVBQVNDLEdBQVQsRUFB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SDtBQUVIbUIsTUFBQUEsR0FBRyxFQUFFLEVBRkY7QUFHSGpCLE1BQUFBLEtBQUssRUFBRSxFQUhKO0FBSUhFLE1BQUFBLE1BQU0sRUFBRTtBQUpMO0FBRmdDLEdBQXhCLENBQWpCO0FBU0QsQ0FWRDs7QUFZQXFJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnZLLEtBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLy8gd2luZG93LlBMQVRGT1JNID0gXCJ3eFwiOyAgICAgICAgLy8g5bmz5Y+w5Y+3XHJcbi8vIHdpbmRvdy5QQUNLQUdFX1ZFUlNJT04gPSBcIjAuMC4yXCI7XHJcbi8vIHdpbmRvdy5DSEFOTkVMID0gXCJoNXNzemdfd3hcIjsgIC8vIOa4oOmBk+WPt1xyXG53aW5kb3cuUEFDS0FHRV9OQU1FID0gXCLpl6rng4HkuYvlhYnlj6PooovniYhcIjsgIC8vIOa4oOmBk+WPt1xyXG5cclxudmFyIExvZ2luQ29udHJvbGxlciA9IHJlcXVpcmUoXCJsb2dpbl9jb250cm9sbGVyXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgc2hhMSA9IHJlcXVpcmUoJ3NoYTEubWluJyk7XHJcblxyXG52YXIgV1hTREsgPSBmdW5jdGlvbigpIHtcclxuICAgIHd4ID0gbnVsbDtcclxufVxyXG5cclxuLy8gN2RlYzljNGU0YzI2YzQ2Y2YxYTRlMjhhMDgzZjgyYmRcclxuV1hTREsuYWNjb3VudF9pbmZvID0gbnVsbDtcclxuV1hTREsudXNlcl9pbmZvID0gbnVsbDtcclxuXHJcbi8vIOa4uOaIj+WKoOi9veWujOaIkOOAgeWIneWni+WMllNES1xyXG5XWFNESy5pbml0U0RLID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIuW+ruS/oVNES+ebuOWFs1wiKTtcclxuICAgIGNvbnNvbGUubG9nKHdpbmRvdyk7XHJcblxyXG4gICAgaWYgKCF3aW5kb3cud3gpICByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuaW5pdFRvcEluZm8oKTtcclxuICAgIFxyXG4gICAgd3guc2V0S2VlcFNjcmVlbk9uKHtcclxuICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgIH0pXHJcbiAgICB3eC5vblNob3coZnVuY3Rpb24ocmVzKXtcclxuICAgICAgd3guc2V0S2VlcFNjcmVlbk9uKHtcclxuICAgICAgICBrZWVwU2NyZWVuT246IHRydWVcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIHd4Lm9uSGlkZShmdW5jdGlvbihyZXMpe1xyXG4gICAgICB3eC5zZXRLZWVwU2NyZWVuT24oe1xyXG4gICAgICAgIGtlZXBTY3JlZW5PbjogZmFsc2VcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICB3eC5zaG93U2hhcmVNZW51KHtcclxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgd3gub25TaGFyZUFwcE1lc3NhZ2UoKCkgPT4gKHtcclxuICAgICAgICAgIHRpdGxlOiAn6Zeq54OB5LmL5YWJJyxcclxuICAgICAgICAgIGltYWdlVXJsOiAnJyAvLyDlm77niYcgVVJMXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgd3guZ2V0U2V0dGluZyh7XHJcbiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgIGlmIChyZXMuYXV0aFNldHRpbmdbXCJzY29wZS51c2VySW5mb1wiXSkge1xyXG4gICAgICAgICAgV1hTREsuY2hlY2tMb2dpblN0YXR1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgaW5mbyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICB2YXIgYnV0dG9uID0gd3guY3JlYXRlVXNlckluZm9CdXR0b24oe1xyXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXHJcbiAgICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICBib3R0b206IDAsXHJcbiAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGluZm8uc2NyZWVuSGVpZ2h0LzIsXHJcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDQwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcnLFxyXG4gICAgICAgICAgICBjb2xvcjogJyNmZmZmZmYnLFxyXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogMTYsXHJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogNFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnV0dG9uLnNob3coKTtcclxuICAgICAgICAgIGJ1dHRvbi5vblRhcCgocmVzKT0+e1xyXG4gICAgICAgICAgICBidXR0b24uaGlkZSgpO1xyXG4gICAgICAgICAgICBXWFNESy5jaGVja0xvZ2luU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcylcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuV1hTREsuaW5pdFRvcEluZm8gPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBtZW51SW5mbyA9IHd4LmdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHZhciBzeXN0ZW1JbmZvID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgIHdpbmRvdy5XWF9GSVQgPSBtZW51SW5mby50b3AgLyBzeXN0ZW1JbmZvLnNjcmVlbkhlaWdodCAqIDAuOCB8fCAwO1xyXG4gICAgY29uc29sZS5sb2coXCLlvq7kv6HlsI/muLjmiI/oj5zljZXmoI/nmoTpgILphY3lgLxcIik7XHJcbiAgICBjYy5sb2coV1hfRklUKTtcclxufVxyXG5cclxuV1hTREsuY2hlY2tMb2dpblN0YXR1cyA9IGZ1bmN0aW9uKCkge1xyXG4gIC8vIOiOt+WPluacrOWcsGtleVxyXG4gIHRyeSB7XHJcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmFjY291bnRfaW5mbyA9IHd4LmdldFN0b3JhZ2VTeW5jKCdhY2NvdW50X2luZm8nKVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIFdYU0RLLmNoZWNrU2Vzc2lvbktleSh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBXWFNESy5sb2dpbigpO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIERvIHNvbWV0aGluZyB3aGVuIGNhdGNoIGVycm9yXHJcbiAgfVxyXG59XHJcblxyXG5cclxuV1hTREsubG9naW4gPSBmdW5jdGlvbigpIHtcclxuICBpZiAod2luZG93Lnd4KSB7XHJcbiAgICAgIHd4LmxvZ2luKHtcclxuICAgICAgICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICAgICAgICBpZiAocmVzLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgIC8v5Y+R6LW3572R57uc6K+35rGCXHJcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLliJ3lp4vljJbnmbvlvZXkv6Hmga/ov5Tlm55cIik7XHJcbiAgICAgICAgICAgICAgICBjYy5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgIHd4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3MxLXd4LWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L2xvZ2luLycsXHJcbiAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBqc19jb2RlOiByZXMuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS/neWtmOeUqOaIt+S/oeaBr+WIsOacrOWcsFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMuZGF0YS5tc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1hTREsuYWNjb3VudF9pbmZvID0gcmVzLmRhdGEubXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3guc2V0U3RvcmFnZVN5bmMoJ2FjY291bnRfaW5mbycsIHJlcy5kYXRhLm1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDor7fmsYLmiJDlip/lvIDlp4vnmbvlvZXmuLjmiI9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYU0RLLmluaXRVc2VySW5mbygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+eZu+W9leWksei0pe+8gScgKyByZXMuZXJyTXNnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuV1hTREsuY2hlY2tTZXNzaW9uS2V5ID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgY2MubG9nKFwi5qCh6aqMa2V55piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgICB3eC5jaGVja1Nlc3Npb24oe1xyXG4gICAgICAgIHN1Y2Nlc3MgKCkge1xyXG4gICAgICAgICAgLy8g5rKh5pyJ5aSx5pWI77yM57un57ut55m75b2VXHJcbiAgICAgICAgICBXWFNESy5pbml0VXNlckluZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZhaWwgKCkge1xyXG4gICAgICAgICAgLy8gc2Vzc2lvbl9rZXkg5bey57uP5aSx5pWI77yM6ZyA6KaB6YeN5paw5omn6KGM55m75b2V5rWB56iLXHJcbiAgICAgICAgICBXWFNESy5sb2dpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIC8vIHd4LmdldFVzZXJJbmZvKHtcclxuICAgIC8vICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCLnlKjmiLfkv6Hmga9cIik7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2cocmVzKVxyXG5cclxuICAgIC8vICAgICAvLyDor7fmsYJhY2Nlc3NfdG9rZW5cclxuICAgIC8vICAgICBjYy5sb2coXCLlj5HpgIHliLDmnI3liqHlmajmoKHpqozmmK/lkKbov4fmnJ9cIik7XHJcbiAgICAvLyAgICAgY2MubG9nKGRhdGEpO1xyXG5cclxuICAgIC8vICAgICB3eC5yZXF1ZXN0KHtcclxuICAgIC8vICAgICAgIHVybDogJ2h0dHA6Ly9zMS1yZWxlYXNlLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L3Rva2VuJyxcclxuICAgIC8vICAgICAgIGRhdGE6IHtcclxuICAgIC8vICAgICAgICAgY3BzOiBcInd4dGVzdFwiXHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgICAgaGVhZGVyOiB7XHJcbiAgICAvLyAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgICAgc3VjY2VzcyAocmVzMSkge1xyXG4gICAgLy8gICAgICAgICBpZiAocmVzMSAmJiByZXMxLmRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICBjYy5sb2coXCJBU1NFU1NfVE9LRU7ov5Tlm55cIik7XHJcbiAgICAvLyAgICAgICAgICAgY2MubG9nKHJlczEpO1xyXG4gICAgLy8gICAgICAgICAgIGlmIChyZXMxLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgLy8gICAgICAgICAgICAgY2MubG9nKFwi5qCh6aqMQVNTRVNTX1RPS0VO5piv5ZCm6L+H5pyfXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHNoYTEocmVzLnJhd0RhdGEgKyBkYXRhLnNlc3Npb25fa2V5KVxyXG4gICAgLy8gICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAvLyAgICAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zMS1yZWxlYXNlLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L2NoZWNrX3Nlc3Npb24nLFxyXG4gICAgLy8gICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiByZXMxLmRhdGEubXNnLmFjY2Vzc190b2tlbixcclxuICAgIC8vICAgICAgICAgICAgICAgICBvcGVuaWQ6IGRhdGEub3BlbmlkLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNwczogXCJ3eHRlc3RcIixcclxuICAgIC8vICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIC8vICAgICAgICAgICAgICAgfSxcclxuICAgIC8vICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY2MubG9nKFwi5qCh6aqM57uT5p6cXCIpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNjLmxvZyhyZXMpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhISEhISEhISEhISEhISEhISEhISEhISEhcIik7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuagoemqjOaIkOWKn+W8gOWni+eZu+W9lea4uOaIj1wiKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgLy8gICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pXHJcblxyXG4gICAgLy8gICB9LFxyXG5cclxuICAgIC8vICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAvLyAgICAgY29uc29sZS5sb2coXCJVVVVVVVVVVVVVVVVVVVVVdVwiKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhyZXMpXHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pXHJcbn1cclxuXHJcbldYU0RLLmluaXRVc2VySW5mbyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB3eC5nZXRVc2VySW5mbyh7XHJcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICBXWFNESy51c2VyX2luZm8gPSByZXM7XHJcbiAgICAgICAgICBjYy5sb2coXCLojrflj5bnlKjmiLfkv6Hmga/miJDlip9cIik7XHJcbiAgICAgICAgICBjYy5sb2cocmVzKTtcclxuICAgICAgICAgIFdYU0RLLnNldExvZ2luRGF0YShyZXMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZhaWw6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgICAgY2MubG9nKFwi6I635Y+W55So5oi35L+h5oGv5aSx6LSlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxufVxyXG5cclxuV1hTREsuc2V0TG9naW5EYXRhID0gZnVuY3Rpb24odXNlcl9pbmZvKSB7XHJcbiAgdGhpcy51c2VyX2luZm8gPSB1c2VyX2luZm87XHJcbiAgdGhpcy5zZGtCYWNrTG9naW4oKTtcclxufVxyXG5cclxuLy8gU0RL55m75b2V5oiQ5Yqf5Zue6LCDXHJcbldYU0RLLnNka0JhY2tMb2dpbiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBsb2dpbl9kYXRhID0ge307XHJcbiAgbG9naW5fZGF0YS51c3JOYW1lID0gXCJ3eF9cIiArIHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZDtcclxuICBsb2dpbl9kYXRhLnBhc3N3b3JkID0gXCJ3eDEyMzQ1NlwiO1xyXG4gIGNvbnNvbGUubG9nKFwi5b6u5L+h5pWw5o2u5Yid5aeL6Iqx5oiQ5Yqf77yM5byA5aeL6K+35rGC5pyN5Yqh5Zmo5YiX6KGoXCIpO1xyXG4gIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmxvZ2luUGxhdGZvcm1SZXF1ZXN0KGxvZ2luX2RhdGEpO1xyXG59XHJcblxyXG5XWFNESy5wYXkgPSBmdW5jdGlvbihtb25leSwgYnV5TnVtLCBwcm9kSWQsIHByb2R1Y3ROYW1lLCBwcm9kdWN0RGVzYywgZXh0ZW5zaW9uLCBjb2luTnVtKSB7XHJcbiAgY29uc29sZS5sb2coXCLlvIDlp4vosIPnlKjmlK/ku5hcIik7XHJcbiAgdmFyIGxvZ2luSW5mbyA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm1vZGVsLmdldExvZ2luSW5mbygpO1xyXG4gIHZhciByb2xlVm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gIGlmIChyb2xlVm8gPT0gbnVsbCkgcmV0dXJuO1xyXG4gIHZhciBzZXZlckluZm8gPSByb2xlVm8uc3J2X2lkLnNwbGl0KFwiX1wiKTtcclxuICB2YXIgcGxhdGZvcm0gPSBzZXZlckluZm9bMF0gfHwgXCJcIjtcclxuICB2YXIgem9uZV9pZCA9IHNldmVySW5mb1sxXTtcclxuXHJcbiAgdmFyIHN5c3RlbUluZm8gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gIHZhciBzeXN0ZW1OYW1lID0gc3lzdGVtSW5mby5zeXN0ZW07XHJcbiAgdmFyIHBmID0gXCJcIjtcclxuICBpZihzeXN0ZW1OYW1lLmluZGV4T2YoXCJpT1NcIik+LTEpe1xyXG4gICAgLy8gcmV0dXJuO1xyXG4gIH1lbHNlIGlmKHN5c3RlbU5hbWUuaW5kZXhPZihcIkFuZHJvaWRcIik+LTEpe1xyXG4gICAgcGYgPSBcImFuZHJvaWRcIjtcclxuICB9XHJcbiAgdmFyIGRhdGEgPSB7XHJcbiAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgc2lnbjpXWFNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgem9uZV9pZDogem9uZV9pZCxcclxuICAgICAgcGY6IHBmLFxyXG4gICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgIH1cclxuICAgIFxyXG4gIHd4LnJlcXVlc3Qoe1xyXG4gICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9iYWxhbmNlXCIsXHJcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgZGF0YTogZGF0YSxcclxuICAgIGhlYWRlcjoge1xyXG4gICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgfSxcclxuICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuivt+axguS9meminVwiLHJlcyk7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICBpZiAocmVzLmRhdGEuZXJyb3IgPT0gNjY2KSB7ICAgIC8vIOivt+axguaIkOWKn1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAvL+aXtumXtOaIs1xyXG4gICAgICAgICAgICAgIHZhciBkYXRlX3RpbWUgPSBNYXRoLmNlaWwoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG5cclxuICAgICAgICAgICAgICBwcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lIHx8IChtb25leSAqIDEwKSArIFwi6ZK755+zXCI7XHJcbiAgICAgICAgICAgICAgdmFyIGNwcyA9IFwid3h0ZXN0XCI7XHJcbiAgICAgICAgICAgICAgdmFyIGNoYW5uZWwgPSBDSEFOTkVMO1xyXG5cclxuICAgICAgICAgICAgICB2YXIgX2V4dGVuc2lvbiA9IHJvbGVWby5yaWQgKyBcIiQkXCIgKyBwbGF0Zm9ybSArIFwiJCRcIiArIHpvbmVfaWQgK1xyXG4gICAgICAgICAgICAgICAgXCIkJFwiICsgY2hhbm5lbCArIFwiJCRcIiArIHByb2RJZCArIFwiJCRcIiArIHByb2R1Y3ROYW1lICsgXCIkJFwiICsgY3BzICsgXCIkJFwiICsgZGF0ZV90aW1lO1xyXG4gICAgICAgICAgICAgICAgICBjYy5sb2coXCLmi5PlsZXlj4LmlbBfZXh0ZW5zaW9uPT0+XCIsIF9leHRlbnNpb24pXHJcbiAgICAgICAgICAgICAgICAgIHZhciBiYXNlXzY0ID0gcmVxdWlyZShcImJhc2U2NFwiKS5CYXNlNjQ7XHJcbiAgICAgICAgICAgICAgICAgIF9leHRlbnNpb24gPSBiYXNlXzY0LmVuY29kZShfZXh0ZW5zaW9uKTtcclxuICAgICAgICAgICAgICAgICAgY2MubG9nKFwi5ouT5bGV5Y+C5pWwX2V4dGVuc2lvbj09MjIyMjIyMjIyPlwiLCBfZXh0ZW5zaW9uKVxyXG5cclxuICAgICAgICAgICAgICBpZihyZXMuZGF0YS5tc2cpe1xyXG4gICAgICAgICAgICAgICAgaWYocmVzLmRhdGEubXNnLmJhbGFuY2U+PW1vbmV5KjEwKXtcclxuICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9wYXlcIixcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgIHpvbmVfaWQ6IHpvbmVfaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwZjogcGYsXHJcbiAgICAgICAgICAgICAgICAgICAgICBhbXQ6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aW1lOldYU0RLLmFjY291bnRfaW5mby50aW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbjpXWFNESy5hY2NvdW50X2luZm8uc2lnbixcclxuICAgICAgICAgICAgICAgICAgICAgIGFwcF9yZW1hcms6X2V4dGVuc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGNwczogY3BzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgLy8g6buY6K6k5YC8XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6aKE5LiL5Y2V6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmVycm9yID09IDY2NikgeyAgICAvLyDor7fmsYLmiJDlip9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzLmRhdGEuZXJyb3IgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlcy5kYXRhLmVycm9yID09IC0xKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWFheWAvOWksei0pVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgd3gucmVxdWVzdE1pZGFzUGF5bWVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZTpcImdhbWVcIixcclxuICAgICAgICAgICAgICAgICAgICBlbnY6MSwvL1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZmVySWQ6XCIxNDUwMDIxODgxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lUeXBlOlwiQ05ZXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06cGYsXHJcbiAgICAgICAgICAgICAgICAgICAgYnV5UXVhbnRpdHk6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgem9uZUlkOnpvbmVfaWQsXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCD5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vXCIrbG9naW5JbmZvLmhvc3QrXCIvYXBpLnBocC9wZi93eC9wYXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5pZDogV1hTREsuYWNjb3VudF9pbmZvLm9wZW5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lX2lkOiB6b25lX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBmOiBwZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbXQ6bW9uZXkqMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduOldYU0RLLmFjY291bnRfaW5mby5zaWduLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9yZW1hcms6X2V4dGVuc2lvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjcHM6IGNwc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumihOS4i+WNlei/lOWbnlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzLmRhdGEuZXJyb3IgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihyZXMuZGF0YS5lcnJvciA9PSAtMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YWF5YC85aSx6LSlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCD5aSx6LSlXCIscmVzKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24ocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pSv5LuY5Zue6LCDY29tcGxldGVcIixyZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgXHJcbiAgXHJcbiAgXHJcbn1cclxuXHJcbldYU0RLLmxvZ2luR2FtZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciB0ZXN0X2Fjb3VudCA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFRlc3RBY2NvdW50KCk7XHJcbiAgY2MubG9nKFwi5L2/55So5LqG5b6u5L+h5rWL6K+V6LSm5Y+3XCIpO1xyXG4gIGNjLmxvZyh0ZXN0X2Fjb3VudCk7XHJcblxyXG4gIC8vIFNES+ivt+axgueZu+W9lea4uOaIj1xyXG4gIHZhciBsb2dpbl9kYXRhID0ge307XHJcbiAgaWYgKHRlc3RfYWNvdW50KSB7XHJcbiAgICBsb2dpbl9kYXRhLmFjY291bnQgPSB0ZXN0X2Fjb3VudDtcclxuICB9IGVsc2Uge1xyXG4gICAgbG9naW5fZGF0YS5hY2NvdW50ID0gXCJ3eF9cIiArIHRoaXMuYWNjb3VudF9pbmZvLm9wZW5pZDtcclxuICB9XHJcbiAgbG9naW5fZGF0YS5yYXdEYXRhID0gdGhpcy51c2VyX2luZm8ucmF3RGF0YTtcclxuICBsb2dpbl9kYXRhLnNpZ25hdHVyZSA9IHRoaXMudXNlcl9pbmZvLnNpZ25hdHVyZTtcclxuICBsb2dpbl9kYXRhLmNoYW5uZWwgPSBDSEFOTkVMO1xyXG4gIGxvZ2luX2RhdGEucGFja2FnZV9uYW1lID0gUEFDS0FHRV9OQU1FO1xyXG4gIGxvZ2luX2RhdGEucGFja2FnZV92ZXJzaW9uID0gUEFDS0FHRV9WRVJTSU9OO1xyXG4gIGxvZ2luX2RhdGEucGxhdGZvcm0gPSBQTEFURk9STTtcclxuICBsb2dpbl9kYXRhLnRva2VuID0gV1hTREsuYWNjb3VudF9pbmZvLnNlc3Npb25fa2V5O1xyXG4gIGxvZ2luX2RhdGEudGltZXN0YW1wID0gV1hTREsuYWNjb3VudF9pbmZvLnRpbWU7XHJcbiAgbG9naW5fZGF0YS5zaWduID0gV1hTREsuYWNjb3VudF9pbmZvLnNpZ247XHJcblxyXG4gIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmN1c1NES0xvZ2luKGxvZ2luX2RhdGEpO1xyXG59XHJcblxyXG4vLyDpgJrnn6XmnI3liqHlmajmiJDlip9cclxuV1hTREsuc3VibWl0TG9naW4gPSBmdW5jdGlvbih1cmwpIHtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdmFyIHN1Ym1pdF91cmwgPSBcImh0dHBzOi8vXCIgKyB1cmwgKyBcIi9hcGkucGhwL3BmL3d4L3Nlc3Npb25cIjtcclxuICAgICAgY29uc29sZS5sb2coc3VibWl0X3VybCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFdYU0RLLmFjY291bnRfaW5mbyk7XHJcblxyXG4gICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6IHN1Ym1pdF91cmwsXHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBzZXNzaW9uX2tleTogV1hTREsuYWNjb3VudF9pbmZvLnNlc3Npb25fa2V5LFxyXG4gICAgICAgICAgb3BlbmlkOiBXWFNESy5hY2NvdW50X2luZm8ub3BlbmlkLFxyXG4gICAgICAgICAgdGltZTpXWFNESy5hY2NvdW50X2luZm8udGltZSxcclxuICAgICAgICAgIHNpZ246V1hTREsuYWNjb3VudF9pbmZvLnNpZ24sXHJcbiAgICAgICAgICBjcHM6IFwid3h0ZXN0XCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN1Y2Nlc3MgKHJlcykge1xyXG4gICAgICAgICAgY2MubG9nKFwi5pyN5Yqh5Zmo55m75b2V5L+h5oGv6L+U5ZueXCIpO1xyXG4gICAgICAgICAgY2MubG9nKHJlcyk7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmVycm9yID09IDY2NikgeyAgICAvLyDor7fmsYLmiJDlip9cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgfSBcclxufVxyXG5cclxuV1hTREsuZ2V0Q3VyckNoYW5uZWwgPSBmdW5jdGlvbigpIHtcclxuXHJcbn1cclxuXHJcbldYU0RLLmdldFN1YkNoYW5uZWwgPSBmdW5jdGlvbigpIHtcclxuICBcclxufVxyXG5cclxuXHJcbldYU0RLLmxvZ2luTG9nID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIG9wdGlvbnMgPSB3eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gIGNvbnNvbGUubG9nKFwieGhqLS0tLS0tLS0tLS0tXCIsb3B0aW9ucyk7XHJcbiAgXHJcbiAgaWYob3B0aW9ucyA9PSBudWxsIHx8IG9wdGlvbnMucXVlcnkgPT0gbnVsbCB8fCBvcHRpb25zLnF1ZXJ5LndlaXhpbmFkaW5mbyA9PSBudWxsKXJldHVybjtcclxuICBcclxuICB2YXIgd2VpeGluYWRpbmZvQXJyID0gb3B0aW9ucy5xdWVyeS53ZWl4aW5hZGluZm8uc3BsaXQoXCIuXCIpO1xyXG4gIHZhciBhaWQgPSB3ZWl4aW5hZGluZm9BcnJbMF07XHJcbiAgaWYoYWlkID09IG51bGwpcmV0dXJuO1xyXG5cclxuICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgY29uc29sZS5sb2coXCJ4aGorKysrKysrKysrKysrXCIsdXJsKTtcclxuICB3eC5yZXF1ZXN0KHtcclxuICAgIHVybDogXCJcIixcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgIHNrdTogb3B0aW9ucy5xdWVyeS5za3UsXHJcbiAgICAgIGFwcF9pZDogb3B0aW9ucy5xdWVyeS5hcHBfaWQsXHJcbiAgICAgIHN5X2FkX2lkOm9wdGlvbnMucXVlcnkuc3lfYWRfaWQsXHJcbiAgICAgIGNoYW5uZWxfaWQ6b3B0aW9ucy5xdWVyeS5jaGFubmVsX2lkLFxyXG4gICAgICBnZHRfdmlkOiBvcHRpb25zLnF1ZXJ5LmdkdF92aWQsXHJcbiAgICAgIHdlaXhpbmFkaW5mbzpvcHRpb25zLnF1ZXJ5LndlaXhpbmFkaW5mbyxcclxuICAgICAgc3ViX2FkX2lkOmFpZCxcclxuICAgICAgdXJsOnVybCxcclxuICAgIH0sXHJcbiAgICBoZWFkZXI6IHtcclxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyAvLyDpu5jorqTlgLxcclxuICAgIH0sXHJcbiAgICBzdWNjZXNzIChyZXMpIHtcclxuICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXnmbvlvZXkv6Hmga/ov5Tlm55cIik7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuV1hTREsuZG93bmxvYWRfcXJjb2RlX3BuZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6ICdodHRwczovL3MxLWg1bWxmLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL3d4L3Rva2VuJyxcclxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNwczogXCJ3eHRlc3RcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIC8vIOm7mOiupOWAvFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3VjY2VzcyAocmVzMSkge1xyXG4gICAgICAgICAgaWYgKHJlczEuZGF0YS5lcnJvciA9PSA2NjYpIHsgICAgLy8g6K+35rGC5oiQ5YqfXHJcbiAgICAgICAgICAgICAgLy9yZXMxLmRhdGEubXNnLmFjY2Vzc190b2tlbixcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPlmFzc2Vzc190b2tlblwiKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMxKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB3eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNjZW5lID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5LnNjZW5lKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluWwj+a4uOaIj3NjZW5lXCIpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5KTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzY2VuZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6K+35rGC5LqM57u056CB55u45YWzXCIpXHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuXHJcbn1cclxuXHJcbldYU0RLLmNyZWF0ZUdhbWVDbHViQnV0dG9uID0gZnVuY3Rpb24gKCkge1xyXG4gIHZhciBjbHViQnV0dG9uID0gd3guY3JlYXRlR2FtZUNsdWJCdXR0b24oe1xyXG7CoCDCoCBpY29uOiAnZ3JlZW4nLFxyXG7CoCDCoMKgc3R5bGU6IHtcclxuwqAgwqAgwqAgwqAgbGVmdDogMTAsIFxyXG7CoCDCoCDCoCDCoCB0b3A6IDc2LCBcclxuwqAgwqAgwqAgwqAgd2lkdGg6IDQwLFxyXG7CoCDCoCDCoCDCoCBoZWlnaHQ6IDQwXHJcbsKgIMKgIH1cclxuICB9KTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBXWFNESzsiXX0=