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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/partnersummon/view/partnersummon_gain_window.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, '1f4502T3qVFapFZQ5PPUam2', 'partnersummon_gain_window');
// Scripts/mod/partnersummon/view/partnersummon_gain_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-01-16 10:06:06
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var SummonConst = require("partnersummon_const");
 
var RoleController = require("role_controller");
 
var BackpackController = require("backpack_controller");
 
var TimesummonController = require("timesummon_controller");
 
var PartnersummonGainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("partnersummon", "partnersummon_gain_window");
    this.viewTag = SCENE_TAG.dialogue; // 该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; // 是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.can_show = false;
    this.ctrl = arguments[0];
    this.modle = this.ctrl.getModel();
    this.recruit_data = this.modle.getRecruitData();
  },
  initConfig: function initConfig() {
    this.partnersummon_config = Config.recruit_data.data_partnersummon_data;
  },
  openCallBack: function openCallBack() {
    this.summon_bg_sp = this.seekChild("summon_bg", cc.Sprite);
    this.bg_effect_sk = this.seekChild("bg_effect", sp.Skeleton);
    this.partnersummon_bg = this.seekChild("partnersummon_bg");
    this.summon_bg_nd = this.seekChild("summon_bg");
    this.partnersummon_bg.scale = FIT_SCALE;
    this.summon_bg_nd.scale = FIT_SCALE;
    this.get_des_nd = this.seekChild("get_des");
    this.items_content_nd = this.seekChild("items_content");
    this.again_btn_nd = this.seekChild("again_btn");
    this.confirm_btn_nd = this.seekChild("confirm_btn");
    this.again_one_txt_nd = this.seekChild("again_one_txt");
    this.again_ten_txt_nd = this.seekChild("again_ten_txt");
    this.again_need_nd = this.seekChild("again_need");
    this.goods_num_lb = this.seekChild("goods_num", cc.RichText);
    this.goods_sp = this.seekChild("goods", cc.Sprite);
    this.confirm_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickConfirmBtn, this);
    this.again_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickAgainBtn, this);
  },
  registerEvent: function registerEvent() {},
  closeCallBack: function closeCallBack() {
    if (this.item_nds) {
      for (var i = 0; i < this.item_nds.length; ++i) {
        if (this.item_nds[i]) {
          this.item_nds[i].deleteMe();
          this.item_nds[i] = null;
        }
      }
 
      this.item_nds = null;
    }
 
    var GuideEvent = require("guide_event");
 
    gcore.GlobalEvent.fire(GuideEvent.CloseTaskEffect);
 
    if (this.get_des_nd && this.get_des_nd.isValid) {
      this.get_des_nd.stopAllActions();
    }
 
    this.ctrl.openSummonGainWindow(false);
  },
  openRootWnd: function openRootWnd(params) {
    if (!this.recruit_data) return;
    this.udpateWidgets();
    this.createGetItems();
    this.analyseRecruitData();
  },
  udpateWidgets: function udpateWidgets() {
    this.type_flag = this.recruit_data.flag; // 背景
 
    if (this.type_flag == 0) {
      this.partnersummon_config = Config.recruit_data.data_partnersummon_data;
    } else if (this.type_flag == 1) {
      this.partnersummon_config = Config.recruit_holiday_data.data_summon;
    } else if (this.type_flag == 2) {
      this.partnersummon_config = Config.recruit_holiday_elite_data.data_summon;
    }
 
    var summon_cfg_item = this.partnersummon_config[this.recruit_data.group_id];
    var resources_id = "partnersummon_call_bg_100";
    if (summon_cfg_item) resources_id = summon_cfg_item.call_bg;
    var bg_path = PathTool.getUIIconPath("bigbg/partnersummon", resources_id);
    this.loadRes(bg_path, function (bigbg_sf) {
      this.summon_bg_sp.spriteFrame = bigbg_sf;
    }.bind(this)); // 背景动画
    // var bg_effect_id = "140"
    // if (summon_cfg_item)
    //     bg_effect_id = summon_cfg_item.call_bg_action;
    // var effect_res = PathTool.getEffectRes(bg_effect_id);
    // var effect_path = PathTool.getSpinePath(effect_res, "action");
    // this.loadRes(effect_path, function(bg_sd) {
    //     this.bg_effect_sk.skeletonData = bg_sd;
    //     this.bg_effect_sk.setAnimation(0, "action", true);
    // }.bind(this));
    // 按钮
 
    if (this.recruit_data.times === 1) {
      this.again_one_txt_nd.active = true;
      this.again_ten_txt_nd.active = false;
    } else {
      this.again_one_txt_nd.active = false;
      this.again_ten_txt_nd.active = true;
    } // 道具提示
 
 
    this.need_item_id = null;
    this.item_enough = false;
    var need_count;
    var have_count;
 
    if (this.recruit_data.group_id != SummonConst.Summon_Type.Score) {
      if (this.type_flag == 0) {
        if (this.recruit_data.times === 1) {
          this.need_item_id = summon_cfg_item.item_once[0][0];
          need_count = summon_cfg_item.item_once[0][1];
        } else {
          this.need_item_id = summon_cfg_item.item_five[0][0];
          need_count = summon_cfg_item.item_five[0][1];
        }
      } else if (this.type_flag == 1) {
        if (this.recruit_data.times === 1) {
          this.need_item_id = summon_cfg_item.loss_item_once[0][0];
          need_count = summon_cfg_item.loss_item_once[0][1];
        } else {
          this.need_item_id = summon_cfg_item.loss_item_ten[0][0];
          need_count = summon_cfg_item.loss_item_ten[0][1];
        }
      } else if (this.type_flag == 2) {
        if (this.recruit_data.times === 1) {
          this.need_item_id = summon_cfg_item.loss_item_once[0][0];
          need_count = summon_cfg_item.loss_item_once[0][1];
        } else {
          this.need_item_id = summon_cfg_item.loss_item_ten[0][0];
          need_count = summon_cfg_item.loss_item_ten[0][1];
        }
      }
    } else {}
 
    if (this.recruit_data.group_id === SummonConst.Summon_Type.Friend) {
      var role_vo = RoleController.getInstance().getRoleVo();
      have_count = role_vo.friend_point;
    } else {
      have_count = BackpackController.getInstance().getModel().getBackPackItemNumByBid(this.need_item_id);
    }
 
    if (this.recruit_data.group_id === SummonConst.Summon_Type.Score) {
      this.again_need_nd.active = false;
      this.again_btn_nd.active = false;
      this.confirm_btn_nd.x = this.root_wnd.width * 0.5;
    } else {
      this.again_need_nd.active = true;
      this.again_btn_nd.active = true;
      this.confirm_btn_nd.x = 530;
      var good_res_config = Utils.getItemConfig(this.need_item_id);
      var good_res_path = PathTool.getItemRes(good_res_config.icon); // var item_res_path = PathTool.getIconPath("item", this.need_item_id);
 
      this.loadRes(good_res_path, function (item_sf) {
        this.goods_sp.spriteFrame = item_sf;
      }.bind(this));
      var label_str = "";
 
      if (have_count < need_count) {
        this.item_enough = false;
        label_str = cc.js.formatStr("<color=#e14737><outline color=#000000 width=2>%s</outline></color><color=#ffffff><outline color=#000000 width=2>/%s</outline></color>", have_count, need_count);
      } else {
        this.item_enough = true;
        label_str = cc.js.formatStr("<color=#35ff14><outline color=#000000 width=2>%s</outline></color><color=#ffffff><outline color=#000000 width=2>/%s</outline></color>", have_count, need_count);
      }
 
      this.goods_num_lb.string = label_str;
    }
  },
  showItems: function showItems() {
    if (!this.get_des_nd || !this.get_des_nd.isValid) return;
    this.get_des_nd.scale = 1.5;
 
    if (!this.get_action) {
      var delay_act = cc.delayTime(0.1);
      var scale_act = cc.scaleTo(0.1, 1);
      this.get_action = cc.sequence(delay_act, scale_act);
    }
 
    this.get_des_nd.runAction(this.get_action);
    this.can_show = true;
 
    if (this.items_init) {
      this.addGetItems();
    }
  },
  addGetItems: function addGetItems() {
    Utils.playEffectSound(AUDIO_TYPE.Recruit, "result_01");
    if (this.item_nds == null) return;
 
    for (var item_i = 0; item_i < this.item_nds.length; item_i++) {
      this.items_content_nd.addChild(this.item_nds[item_i].root_wnd);
      this.item_nds[item_i].playShowAction(item_i); // this.item_nds[item_i].showEffect();
    }
  },
  createGetItems: function createGetItems() {
    if (!this.recruit_data) return;
    this.rewards = this.recruit_data.rewards;
    this.init_num = 0;
    this.item_nds = [];
    var scheIndex = 0;
 
    var HeroExhibitionItem = require("hero_get_item");
 
    var create_item_sch = gcore.Timer.set(function () {
      var hero_item = new HeroExhibitionItem(this.rewards[scheIndex], scheIndex, this.itemFinishCreate.bind(this));
      if (this.item_nds == null) return;
      this.item_nds.push(hero_item);
      ++scheIndex;
    }.bind(this), 50, this.rewards.length);
  },
  itemFinishCreate: function itemFinishCreate(index, root_wn) {
    ++this.init_num;
 
    if (this.init_num == this.rewards.length) {
      if (this.item_nds == null) return;
 
      if (this.item_nds.length > 5) {
        this.items_content_nd.width = 120 * 5 + 20 * 4;
      } else {
        this.items_content_nd.width = 120 * this.item_nds.length + (20 * this.item_nds.length - 1);
      }
 
      this.items_init = true;
      if (this.can_show) this.addGetItems();
    }
  },
  analyseRecruitData: function analyseRecruitData() {
    if (this.finish_cb) this.finish_cb(); // return
 
    var show_bids = []; // 需要召唤的高级英雄 
 
    if (this.recruit_data.partner_bids) {
      var bid_info = null;
 
      for (var bid_i in this.recruit_data.partner_bids) {
        bid_info = this.recruit_data.partner_bids[bid_i];
        var par_config = Config.partner_data.data_partner_base[bid_info.partner_bid];
        if (par_config.show_effect) show_bids.push(bid_info);
      }
    }
 
    if (show_bids.length > 0) {
      this.ctrl.openSummonGainShowWindow(true, show_bids, this.showItems.bind(this));
    } else {
      this.showItems();
    }
  },
  didClickConfirmBtn: function didClickConfirmBtn(event) {
    // var show_bids = [{partner_bid: 40403, init_star: 4}, {partner_bid: 20504, init_star: 5}, {partner_bid: 30402, init_star: 4}];
    // this.ctrl.openSummonGainShowWindow(true, show_bids, this.showItems.bind(this));
    this.ctrl.openSummonGainWindow(false);
  },
  didClickAgainBtn: function didClickAgainBtn(event) {
    // 判断英雄背包空间
    var HeroController = require("hero_controller");
 
    var hero_model = HeroController.getInstance().getModel();
    var hero_bag_info = hero_model.getHeroMaxCount();
    var limit_num = hero_bag_info.max_count - hero_bag_info.have_coutn;
 
    if (this.recruit_data.times > limit_num) {
      var str = Utils.TI18N("英雄列表已满,可通过提升贵族等级或购买增加英雄携带数量,是否前往购买?");
 
      var CommonAlert = require("commonalert");
 
      CommonAlert.show(str, Utils.TI18N("确定"), function () {
        var MainuiConst = require("mainui_const");
 
        var ActionController = require("action_controller");
 
        var MainuiController = require("mainui_controller");
 
        MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.partner);
        ActionController.getInstance().openActionMainPanel(false);
      }, Utils.TI18N("取消"), function () {});
      return;
    }
 
    if (this.type_flag == 0) {
      if (!this.item_enough) {
        if (this.recruit_data.group_id == SummonConst.Summon_Type.Advanced) {
          this.showGoldTips(this.recruit_data.times);
          return;
        }
 
        BackpackController.getInstance().openTipsSource(true, this.need_item_id);
      } else {
        this.ctrl.againRecruit();
 
        if (this.modle.getClickStatus()) {
          this.modle.clickIntervalStatus(false);
        } else {
          this.ctrl.openSummonGainWindow(false);
        }
      }
    } else {
      if (this.item_enough) {
        if (this.type_flag == 1) {
          this.ctrl.openSummonGainWindow(false);
          TimesummonController.getInstance().requestTimeSummon(this.recruit_data.times, 4);
        } else if (this.type_flag == 2) {
          this.ctrl.openSummonGainWindow(false);
 
          var ElitesummonController = require("elitesummon_controller");
 
          ElitesummonController.getInstance().send23221(this.recruit_data.times, 4);
        }
 
        return;
      }
 
      this.showGoldTips(this.recruit_data.times);
    }
  },
  showGoldTips: function showGoldTips(times) {
    var config_data;
 
    if (this.type_flag == 0) {
      config_data = Config.recruit_data.data_partnersummon_data["300"];
    } else if (this.type_flag == 1) {
      config_data = Config.recruit_holiday_data.data_summon[this.recruit_data.group_id];
    } else if (this.type_flag == 2) {
      config_data = Config.recruit_holiday_elite_data.data_summon[this.recruit_data.group_id];
    }
 
    var recruit_data = this.modle.getSummonProtoDataByGroupID(300);
 
    var RoleController = require("role_controller");
 
    var role_vo = RoleController.getInstance().getRoleVo();
    var need_num, val_str, val_num, call_num;
 
    if (this.type_flag == 0) {
      // good_res_config = Utils.getItemConfig(config_data.exchange_once[0][0]);
      need_num = config_data.exchange_once[0][1];
      val_str = Utils.getItemConfig(config_data.exchange_once_gain[0][0]).name;
      val_num = config_data.exchange_once_gain[0][1];
      call_num = recruit_data.draw_list[1].times || 1;
    } else if (this.type_flag == 1 || this.type_flag == 2) {
      // good_res_config = Utils.getItemConfig(config_data.loss_gold_once[0][0]);
      need_num = config_data.loss_gold_once[0][1];
      val_str = Utils.getItemConfig(config_data.gain_once[0][0]).name;
      val_num = config_data.gain_once[0][1];
      call_num = this.recruit_data.times;
    }
 
    var good_res_path = "3";
    var hvae_num = role_vo.gold;
 
    if (times === 10) {
      if (this.type_flag == 0) {
        need_num = config_data.exchange_five[0][1];
        val_str = Utils.getItemConfig(config_data.exchange_five_gain[0][0]).name;
        val_num = config_data.exchange_once_gain[0][1];
        call_num = recruit_data.draw_list[0].times || 10;
      } else if (this.type_flag == 1 || this.type_flag == 2) {
        need_num = config_data.loss_gold_ten[0][1];
        val_str = Utils.getItemConfig(config_data.gain_ten[0][0]).name;
        val_num = config_data.gain_once[0][1];
        call_num = this.recruit_data.times;
      }
    }
 
    var buy_ori = cc.js.formatStr(StringUtil.parseStr(Lang.DIAMOND_CONSUME).string, good_res_path, need_num, hvae_num);
    var get_ori = cc.js.formatStr(StringUtil.parseStr(Lang.BUY_DES).string, val_str, val_num, call_num);
    var des_str = buy_ori + get_ori;
    var frame_arrays = [];
    var good_path = PathTool.getIconPath("item", "3");
    frame_arrays.push(good_path);
 
    var CommonAlert = require("commonalert");
 
    var common_aler_view = CommonAlert.show(des_str, "确定", this.configUseGold.bind(this, times), "取消", null, null, null, {
      resArr: frame_arrays,
      maxWidth: 450,
      align: cc.macro.TextAlignment.LEFT
    });
  },
  configUseGold: function configUseGold() {
    if (this.type_flag == 0) {
      var group_id = 300;
      var times = this.recruit_data.times;
      var recruit_type = 3;
      this.ctrl.recurit(group_id, times, recruit_type);
      this.ctrl.openSummonGainWindow(false);
    } else if (this.type_flag == 1) {
      TimesummonController.getInstance().requestTimeSummon(this.recruit_data.times, 3);
      this.ctrl.openSummonGainWindow(false);
    } else if (this.type_flag == 2) {
      var ElitesummonController = require("elitesummon_controller");
 
      ElitesummonController.getInstance().send23221(this.recruit_data.times, 3);
      this.ctrl.openSummonGainWindow(false);
    } // if (this.recruit_cb) this.recruit_cb(group_id, times, recruit_type);
 
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxwYXJ0bmVyc3VtbW9uXFx2aWV3XFxwYXJ0bmVyc3VtbW9uX2dhaW5fd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlN1bW1vbkNvbnN0IiwiUm9sZUNvbnRyb2xsZXIiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJUaW1lc3VtbW9uQ29udHJvbGxlciIsIlBhcnRuZXJzdW1tb25HYWluV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImNhbl9zaG93IiwiY3RybCIsImFyZ3VtZW50cyIsIm1vZGxlIiwiZ2V0TW9kZWwiLCJyZWNydWl0X2RhdGEiLCJnZXRSZWNydWl0RGF0YSIsImluaXRDb25maWciLCJwYXJ0bmVyc3VtbW9uX2NvbmZpZyIsIkNvbmZpZyIsImRhdGFfcGFydG5lcnN1bW1vbl9kYXRhIiwib3BlbkNhbGxCYWNrIiwic3VtbW9uX2JnX3NwIiwic2Vla0NoaWxkIiwiU3ByaXRlIiwiYmdfZWZmZWN0X3NrIiwic3AiLCJTa2VsZXRvbiIsInBhcnRuZXJzdW1tb25fYmciLCJzdW1tb25fYmdfbmQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImdldF9kZXNfbmQiLCJpdGVtc19jb250ZW50X25kIiwiYWdhaW5fYnRuX25kIiwiY29uZmlybV9idG5fbmQiLCJhZ2Fpbl9vbmVfdHh0X25kIiwiYWdhaW5fdGVuX3R4dF9uZCIsImFnYWluX25lZWRfbmQiLCJnb29kc19udW1fbGIiLCJSaWNoVGV4dCIsImdvb2RzX3NwIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZGlkQ2xpY2tDb25maXJtQnRuIiwiZGlkQ2xpY2tBZ2FpbkJ0biIsInJlZ2lzdGVyRXZlbnQiLCJjbG9zZUNhbGxCYWNrIiwiaXRlbV9uZHMiLCJpIiwibGVuZ3RoIiwiZGVsZXRlTWUiLCJHdWlkZUV2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJDbG9zZVRhc2tFZmZlY3QiLCJpc1ZhbGlkIiwic3RvcEFsbEFjdGlvbnMiLCJvcGVuU3VtbW9uR2FpbldpbmRvdyIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwidWRwYXRlV2lkZ2V0cyIsImNyZWF0ZUdldEl0ZW1zIiwiYW5hbHlzZVJlY3J1aXREYXRhIiwidHlwZV9mbGFnIiwiZmxhZyIsInJlY3J1aXRfaG9saWRheV9kYXRhIiwiZGF0YV9zdW1tb24iLCJyZWNydWl0X2hvbGlkYXlfZWxpdGVfZGF0YSIsInN1bW1vbl9jZmdfaXRlbSIsImdyb3VwX2lkIiwicmVzb3VyY2VzX2lkIiwiY2FsbF9iZyIsImJnX3BhdGgiLCJnZXRVSUljb25QYXRoIiwibG9hZFJlcyIsImJpZ2JnX3NmIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwidGltZXMiLCJhY3RpdmUiLCJuZWVkX2l0ZW1faWQiLCJpdGVtX2Vub3VnaCIsIm5lZWRfY291bnQiLCJoYXZlX2NvdW50IiwiU3VtbW9uX1R5cGUiLCJTY29yZSIsIml0ZW1fb25jZSIsIml0ZW1fZml2ZSIsImxvc3NfaXRlbV9vbmNlIiwibG9zc19pdGVtX3RlbiIsIkZyaWVuZCIsInJvbGVfdm8iLCJnZXRJbnN0YW5jZSIsImdldFJvbGVWbyIsImZyaWVuZF9wb2ludCIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwieCIsInJvb3Rfd25kIiwid2lkdGgiLCJnb29kX3Jlc19jb25maWciLCJVdGlscyIsImdldEl0ZW1Db25maWciLCJnb29kX3Jlc19wYXRoIiwiZ2V0SXRlbVJlcyIsImljb24iLCJpdGVtX3NmIiwibGFiZWxfc3RyIiwianMiLCJmb3JtYXRTdHIiLCJzdHJpbmciLCJzaG93SXRlbXMiLCJnZXRfYWN0aW9uIiwiZGVsYXlfYWN0IiwiZGVsYXlUaW1lIiwic2NhbGVfYWN0Iiwic2NhbGVUbyIsInNlcXVlbmNlIiwicnVuQWN0aW9uIiwiaXRlbXNfaW5pdCIsImFkZEdldEl0ZW1zIiwicGxheUVmZmVjdFNvdW5kIiwiQVVESU9fVFlQRSIsIlJlY3J1aXQiLCJpdGVtX2kiLCJhZGRDaGlsZCIsInBsYXlTaG93QWN0aW9uIiwicmV3YXJkcyIsImluaXRfbnVtIiwic2NoZUluZGV4IiwiSGVyb0V4aGliaXRpb25JdGVtIiwiY3JlYXRlX2l0ZW1fc2NoIiwiVGltZXIiLCJzZXQiLCJoZXJvX2l0ZW0iLCJpdGVtRmluaXNoQ3JlYXRlIiwicHVzaCIsImluZGV4Iiwicm9vdF93biIsImZpbmlzaF9jYiIsInNob3dfYmlkcyIsInBhcnRuZXJfYmlkcyIsImJpZF9pbmZvIiwiYmlkX2kiLCJwYXJfY29uZmlnIiwicGFydG5lcl9kYXRhIiwiZGF0YV9wYXJ0bmVyX2Jhc2UiLCJwYXJ0bmVyX2JpZCIsInNob3dfZWZmZWN0Iiwib3BlblN1bW1vbkdhaW5TaG93V2luZG93IiwiZXZlbnQiLCJIZXJvQ29udHJvbGxlciIsImhlcm9fbW9kZWwiLCJoZXJvX2JhZ19pbmZvIiwiZ2V0SGVyb01heENvdW50IiwibGltaXRfbnVtIiwibWF4X2NvdW50IiwiaGF2ZV9jb3V0biIsInN0ciIsIlRJMThOIiwiQ29tbW9uQWxlcnQiLCJzaG93IiwiTWFpbnVpQ29uc3QiLCJBY3Rpb25Db250cm9sbGVyIiwiTWFpbnVpQ29udHJvbGxlciIsImNoYW5nZU1haW5VSVN0YXR1cyIsImJ0bl9pbmRleCIsInBhcnRuZXIiLCJvcGVuQWN0aW9uTWFpblBhbmVsIiwiQWR2YW5jZWQiLCJzaG93R29sZFRpcHMiLCJvcGVuVGlwc1NvdXJjZSIsImFnYWluUmVjcnVpdCIsImdldENsaWNrU3RhdHVzIiwiY2xpY2tJbnRlcnZhbFN0YXR1cyIsInJlcXVlc3RUaW1lU3VtbW9uIiwiRWxpdGVzdW1tb25Db250cm9sbGVyIiwic2VuZDIzMjIxIiwiY29uZmlnX2RhdGEiLCJnZXRTdW1tb25Qcm90b0RhdGFCeUdyb3VwSUQiLCJuZWVkX251bSIsInZhbF9zdHIiLCJ2YWxfbnVtIiwiY2FsbF9udW0iLCJleGNoYW5nZV9vbmNlIiwiZXhjaGFuZ2Vfb25jZV9nYWluIiwibmFtZSIsImRyYXdfbGlzdCIsImxvc3NfZ29sZF9vbmNlIiwiZ2Fpbl9vbmNlIiwiaHZhZV9udW0iLCJnb2xkIiwiZXhjaGFuZ2VfZml2ZSIsImV4Y2hhbmdlX2ZpdmVfZ2FpbiIsImxvc3NfZ29sZF90ZW4iLCJnYWluX3RlbiIsImJ1eV9vcmkiLCJTdHJpbmdVdGlsIiwicGFyc2VTdHIiLCJMYW5nIiwiRElBTU9ORF9DT05TVU1FIiwiZ2V0X29yaSIsIkJVWV9ERVMiLCJkZXNfc3RyIiwiZnJhbWVfYXJyYXlzIiwiZ29vZF9wYXRoIiwiZ2V0SWNvblBhdGgiLCJjb21tb25fYWxlcl92aWV3IiwiY29uZmlnVXNlR29sZCIsInJlc0FyciIsIm1heFdpZHRoIiwiYWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJMRUZUIiwicmVjcnVpdF90eXBlIiwicmVjdXJpdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxRQUFRLEdBQWFDLE9BQU8sQ0FBQyxVQUFELENBQWhDOztBQUNBLElBQUlDLFdBQVcsR0FBVUQsT0FBTyxDQUFDLHFCQUFELENBQWhDOztBQUNBLElBQUlFLGNBQWMsR0FBT0YsT0FBTyxDQUFDLGlCQUFELENBQWhDOztBQUNBLElBQUlHLGtCQUFrQixHQUFHSCxPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSUksb0JBQW9CLEdBQUdKLE9BQU8sQ0FBQyx1QkFBRCxDQUFsQzs7QUFDQSxJQUFJSyx1QkFBdUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDbkMsYUFBU0MsUUFEMEI7QUFFbkNDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLFVBQUwsR0FBa0JYLFFBQVEsQ0FBQ1ksYUFBVCxDQUF1QixlQUF2QixFQUF3QywyQkFBeEMsQ0FBbEI7QUFDQSxTQUFLQyxPQUFM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b0JBQW9CLENBQUNvRyxXQUFyQixHQUFtQ2tGLGlCQUFuQyxDQUFxRCxLQUFLbkssWUFBTCxDQUFrQm1FLEtBQXZFLEVBQTZFLENBQTdFO0FBQ0EsV0FBS3ZFLElBQUwsQ0FBVWtELG9CQUFWLENBQStCLEtBQS9CO0FBQ0gsS0FISyxNQUdBLElBQUcsS0FBS00sU0FBTCxJQUFrQixDQUFyQixFQUF1QjtBQUN6QixVQUFJZ0gscUJBQXFCLEdBQUczTCxPQUFPLENBQUMsd0JBQUQsQ0FBbkM7O0FBQ0EyTCxNQUFBQSxxQkFBcUIsQ0FBQ25GLFdBQXRCLEdBQW9Db0YsU0FBcEMsQ0FBK0MsS0FBS3JLLFlBQUwsQ0FBa0JtRSxLQUFqRSxFQUF3RSxDQUF4RTtBQUNBLFdBQUt2RSxJQUFMLENBQVVrRCxvQkFBVixDQUErQixLQUEvQjtBQUNILEtBZnFCLENBaUJ0Qjs7QUFDSDtBQXZZa0MsQ0FBVCxDQUE5QiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDEtMTYgMTA6MDY6MDZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgICAgICAgICAgID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFN1bW1vbkNvbnN0ICAgICAgICA9IHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnN0XCIpO1xudmFyIFJvbGVDb250cm9sbGVyICAgICA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgVGltZXN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwidGltZXN1bW1vbl9jb250cm9sbGVyXCIpXG52YXIgUGFydG5lcnN1bW1vbkdhaW5XaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwicGFydG5lcnN1bW1vblwiLCBcInBhcnRuZXJzdW1tb25fZ2Fpbl93aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTsgICAgICAgICAgLy8g6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8vIOaYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICAgICAgdGhpcy5jYW5fc2hvdyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RsZSA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLnJlY3J1aXRfZGF0YSA9IHRoaXMubW9kbGUuZ2V0UmVjcnVpdERhdGEoKTtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfZGF0YS5kYXRhX3BhcnRuZXJzdW1tb25fZGF0YTtcbiAgICB9LFxuXG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuc3VtbW9uX2JnX3NwICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic3VtbW9uX2JnXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuYmdfZWZmZWN0X3NrICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiYmdfZWZmZWN0XCIsIHNwLlNrZWxldG9uKTtcbiAgICAgICAgdGhpcy5wYXJ0bmVyc3VtbW9uX2JnICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJwYXJ0bmVyc3VtbW9uX2JnXCIpO1xuICAgICAgICB0aGlzLnN1bW1vbl9iZ19uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInN1bW1vbl9iZ1wiKTtcbiAgICAgICAgdGhpcy5wYXJ0bmVyc3VtbW9uX2JnLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLnN1bW1vbl9iZ19uZC5zY2FsZSAgICAgPSBGSVRfU0NBTEVcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZ2V0X2Rlc19uZCAgICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZ2V0X2Rlc1wiKTtcbiAgICAgICAgdGhpcy5pdGVtc19jb250ZW50X25kICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJpdGVtc19jb250ZW50XCIpO1xuICAgICAgICB0aGlzLmFnYWluX2J0bl9uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImFnYWluX2J0blwiKTtcbiAgICAgICAgdGhpcy5jb25maXJtX2J0bl9uZCAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJjb25maXJtX2J0blwiKTtcbiAgICAgICAgdGhpcy5hZ2Fpbl9vbmVfdHh0X25kICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJhZ2Fpbl9vbmVfdHh0XCIpOyAgICAgICAgXG4gICAgICAgIHRoaXMuYWdhaW5fdGVuX3R4dF9uZCAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiYWdhaW5fdGVuX3R4dFwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWdhaW5fbmVlZF9uZCAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiYWdhaW5fbmVlZFwiKTtcbiAgICAgICAgdGhpcy5nb29kc19udW1fbGIgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJnb29kc19udW1cIiwgY2MuUmljaFRleHQpO1xuICAgICAgICB0aGlzLmdvb2RzX3NwICAgICAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImdvb2RzXCIsIGNjLlNwcml0ZSk7XG5cbiAgICAgICAgdGhpcy5jb25maXJtX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tDb25maXJtQnRuLCB0aGlzKTtcbiAgICAgICAgdGhpcy5hZ2Fpbl9idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrQWdhaW5CdG4sIHRoaXMpO1xuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG5cbiAgICB9LFxuXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLml0ZW1fbmRzKXtcbiAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8dGhpcy5pdGVtX25kcy5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLml0ZW1fbmRzW2ldKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX25kc1tpXS5kZWxldGVNZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9uZHNbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXRlbV9uZHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBHdWlkZUV2ZW50ID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuQ2xvc2VUYXNrRWZmZWN0KTtcbiAgICAgICAgaWYodGhpcy5nZXRfZGVzX25kICYmIHRoaXMuZ2V0X2Rlc19uZC5pc1ZhbGlkKXtcbiAgICAgICAgICAgIHRoaXMuZ2V0X2Rlc19uZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHJsLm9wZW5TdW1tb25HYWluV2luZG93KGZhbHNlKVxuICAgIH0sXG5cbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICBpZiAoIXRoaXMucmVjcnVpdF9kYXRhKSByZXR1cm47XG4gICAgICAgIHRoaXMudWRwYXRlV2lkZ2V0cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUdldEl0ZW1zKCk7XG4gICAgICAgIHRoaXMuYW5hbHlzZVJlY3J1aXREYXRhKCk7XG4gICAgfSxcblxuICAgIHVkcGF0ZVdpZGdldHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnR5cGVfZmxhZz0gdGhpcy5yZWNydWl0X2RhdGEuZmxhZ1xuICAgICAgICAvLyDog4zmma9cbiAgICAgICAgaWYodGhpcy50eXBlX2ZsYWcgPT0gMCl7XG4gICAgICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfZGF0YS5kYXRhX3BhcnRuZXJzdW1tb25fZGF0YTtcbiAgICAgICAgfWVsc2UgaWYodGhpcy50eXBlX2ZsYWcgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnID0gQ29uZmlnLnJlY3J1aXRfaG9saWRheV9kYXRhLmRhdGFfc3VtbW9uXG4gICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDIpe1xuICAgICAgICAgICAgdGhpcy5wYXJ0bmVyc3VtbW9uX2NvbmZpZyA9IENvbmZpZy5yZWNydWl0X2hvbGlkYXlfZWxpdGVfZGF0YS5kYXRhX3N1bW1vblxuICAgICAgICB9XG4gICAgICAgIHZhciBzdW1tb25fY2ZnX2l0ZW0gPSB0aGlzLnBhcnRuZXJzdW1tb25fY29uZmlnW3RoaXMucmVjcnVpdF9kYXRhLmdyb3VwX2lkXTtcbiAgICAgICAgdmFyIHJlc291cmNlc19pZCA9IFwicGFydG5lcnN1bW1vbl9jYWxsX2JnXzEwMFwiO1xuICAgICAgICBpZiAoc3VtbW9uX2NmZ19pdGVtKVxuICAgICAgICAgICAgcmVzb3VyY2VzX2lkID0gc3VtbW9uX2NmZ19pdGVtLmNhbGxfYmc7XG4gICAgICAgIHZhciBiZ19wYXRoID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImJpZ2JnL3BhcnRuZXJzdW1tb25cIiwgcmVzb3VyY2VzX2lkKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKGJnX3BhdGgsIGZ1bmN0aW9uKGJpZ2JnX3NmKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1vbl9iZ19zcC5zcHJpdGVGcmFtZSA9IGJpZ2JnX3NmO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIOiDjOaZr+WKqOeUu1xuICAgICAgICAvLyB2YXIgYmdfZWZmZWN0X2lkID0gXCIxNDBcIlxuICAgICAgICAvLyBpZiAoc3VtbW9uX2NmZ19pdGVtKVxuICAgICAgICAvLyAgICAgYmdfZWZmZWN0X2lkID0gc3VtbW9uX2NmZ19pdGVtLmNhbGxfYmdfYWN0aW9uO1xuXG4gICAgICAgIC8vIHZhciBlZmZlY3RfcmVzID0gUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKGJnX2VmZmVjdF9pZCk7XG4gICAgICAgIC8vIHZhciBlZmZlY3RfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZlY3RfcmVzLCBcImFjdGlvblwiKTtcblxuICAgICAgICAvLyB0aGlzLmxvYWRSZXMoZWZmZWN0X3BhdGgsIGZ1bmN0aW9uKGJnX3NkKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmJnX2VmZmVjdF9zay5za2VsZXRvbkRhdGEgPSBiZ19zZDtcbiAgICAgICAgLy8gICAgIHRoaXMuYmdfZWZmZWN0X3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCB0cnVlKTtcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyDmjInpkq5cbiAgICAgICAgaWYgKHRoaXMucmVjcnVpdF9kYXRhLnRpbWVzID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmFnYWluX29uZV90eHRfbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fdGVuX3R4dF9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fb25lX3R4dF9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fdGVuX3R4dF9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6YGT5YW35o+Q56S6XG4gICAgICAgIHRoaXMubmVlZF9pdGVtX2lkID0gbnVsbDtcbiAgICAgICAgdGhpcy5pdGVtX2Vub3VnaCA9IGZhbHNlO1xuICAgICAgICB2YXIgbmVlZF9jb3VudDtcbiAgICAgICAgdmFyIGhhdmVfY291bnQ7XG5cbiAgICAgICAgaWYgKHRoaXMucmVjcnVpdF9kYXRhLmdyb3VwX2lkICE9IFN1bW1vbkNvbnN0LlN1bW1vbl9UeXBlLlNjb3JlKSB7XG4gICAgICAgICAgICBpZih0aGlzLnR5cGVfZmxhZyA9PSAwKXtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNydWl0X2RhdGEudGltZXMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkX2l0ZW1faWQgPSBzdW1tb25fY2ZnX2l0ZW0uaXRlbV9vbmNlWzBdWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZWVkX2NvdW50ID0gc3VtbW9uX2NmZ19pdGVtLml0ZW1fb25jZVswXVsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRfaXRlbV9pZCA9IHN1bW1vbl9jZmdfaXRlbS5pdGVtX2ZpdmVbMF1bMF07XG4gICAgICAgICAgICAgICAgICAgIG5lZWRfY291bnQgPSBzdW1tb25fY2ZnX2l0ZW0uaXRlbV9maXZlWzBdWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDEpe1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY3J1aXRfZGF0YS50aW1lcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRfaXRlbV9pZCA9IHN1bW1vbl9jZmdfaXRlbS5sb3NzX2l0ZW1fb25jZVswXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbmVlZF9jb3VudCA9IHN1bW1vbl9jZmdfaXRlbS5sb3NzX2l0ZW1fb25jZVswXVsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRfaXRlbV9pZCA9IHN1bW1vbl9jZmdfaXRlbS5sb3NzX2l0ZW1fdGVuWzBdWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZWVkX2NvdW50ID0gc3VtbW9uX2NmZ19pdGVtLmxvc3NfaXRlbV90ZW5bMF1bMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2UgaWYodGhpcy50eXBlX2ZsYWcgPT0gMil7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjcnVpdF9kYXRhLnRpbWVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZF9pdGVtX2lkID0gc3VtbW9uX2NmZ19pdGVtLmxvc3NfaXRlbV9vbmNlWzBdWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZWVkX2NvdW50ID0gc3VtbW9uX2NmZ19pdGVtLmxvc3NfaXRlbV9vbmNlWzBdWzFdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZF9pdGVtX2lkID0gc3VtbW9uX2NmZ19pdGVtLmxvc3NfaXRlbV90ZW5bMF1bMF07XG4gICAgICAgICAgICAgICAgICAgIG5lZWRfY291bnQgPSBzdW1tb25fY2ZnX2l0ZW0ubG9zc19pdGVtX3RlblswXVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVjcnVpdF9kYXRhLmdyb3VwX2lkID09PSBTdW1tb25Db25zdC5TdW1tb25fVHlwZS5GcmllbmQpIHtcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIGhhdmVfY291bnQgPSByb2xlX3ZvLmZyaWVuZF9wb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhdmVfY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEJhY2tQYWNrSXRlbU51bUJ5QmlkKHRoaXMubmVlZF9pdGVtX2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlY3J1aXRfZGF0YS5ncm91cF9pZCA9PT0gU3VtbW9uQ29uc3QuU3VtbW9uX1R5cGUuU2NvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fbmVlZF9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fYnRuX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb25maXJtX2J0bl9uZC54ID0gdGhpcy5yb290X3duZC53aWR0aCAqIDAuNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWdhaW5fbmVlZF9uZC5hY3RpdmUgPSB0cnVlOyAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5hZ2Fpbl9idG5fbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybV9idG5fbmQueCA9IDUzMDtcbiAgICAgICAgICAgIHZhciBnb29kX3Jlc19jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKHRoaXMubmVlZF9pdGVtX2lkKTtcbiAgICAgICAgICAgIHZhciBnb29kX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhnb29kX3Jlc19jb25maWcuaWNvbilcbiAgICAgICAgICAgIC8vIHZhciBpdGVtX3Jlc19wYXRoID0gUGF0aFRvb2wuZ2V0SWNvblBhdGgoXCJpdGVtXCIsIHRoaXMubmVlZF9pdGVtX2lkKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhnb29kX3Jlc19wYXRoLCBmdW5jdGlvbihpdGVtX3NmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb29kc19zcC5zcHJpdGVGcmFtZSA9IGl0ZW1fc2Y7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICB2YXIgbGFiZWxfc3RyID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChoYXZlX2NvdW50IDwgbmVlZF9jb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9lbm91Z2ggPSBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGFiZWxfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiPGNvbG9yPSNlMTQ3Mzc+PG91dGxpbmUgY29sb3I9IzAwMDAwMCB3aWR0aD0yPiVzPC9vdXRsaW5lPjwvY29sb3I+PGNvbG9yPSNmZmZmZmY+PG91dGxpbmUgY29sb3I9IzAwMDAwMCB3aWR0aD0yPi8lczwvb3V0bGluZT48L2NvbG9yPlwiLCBoYXZlX2NvdW50LCBuZWVkX2NvdW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX2Vub3VnaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGFiZWxfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiPGNvbG9yPSMzNWZmMTQ+PG91dGxpbmUgY29sb3I9IzAwMDAwMCB3aWR0aD0yPiVzPC9vdXRsaW5lPjwvY29sb3I+PGNvbG9yPSNmZmZmZmY+PG91dGxpbmUgY29sb3I9IzAwMDAwMCB3aWR0aD0yPi8lczwvb3V0bGluZT48L2NvbG9yPlwiLCBoYXZlX2NvdW50LCBuZWVkX2NvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ29vZHNfbnVtX2xiLnN0cmluZyA9IGxhYmVsX3N0cjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93SXRlbXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZighdGhpcy5nZXRfZGVzX25kIHx8ICF0aGlzLmdldF9kZXNfbmQuaXNWYWxpZClyZXR1cm5cbiAgICAgICAgdGhpcy5nZXRfZGVzX25kLnNjYWxlID0gMS41O1xuICAgICAgICBpZiAoIXRoaXMuZ2V0X2FjdGlvbikgeyAgICAgICAgXG4gICAgICAgICAgICB2YXIgZGVsYXlfYWN0ID0gY2MuZGVsYXlUaW1lKDAuMSk7XG4gICAgICAgICAgICB2YXIgc2NhbGVfYWN0ID0gY2Muc2NhbGVUbygwLjEsIDEpO1xuICAgICAgICAgICAgdGhpcy5nZXRfYWN0aW9uID0gY2Muc2VxdWVuY2UoZGVsYXlfYWN0LCBzY2FsZV9hY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2V0X2Rlc19uZC5ydW5BY3Rpb24odGhpcy5nZXRfYWN0aW9uKTtcbiAgICAgICAgdGhpcy5jYW5fc2hvdyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLml0ZW1zX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkR2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRHZXRJdGVtczogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlFZmZlY3RTb3VuZChBVURJT19UWVBFLlJlY3J1aXQsIFwicmVzdWx0XzAxXCIpO1xuICAgICAgICBpZih0aGlzLml0ZW1fbmRzPT1udWxsKXJldHVyblxuICAgICAgICBmb3IgKHZhciBpdGVtX2kgPSAwOyBpdGVtX2kgPCB0aGlzLml0ZW1fbmRzLmxlbmd0aDsgaXRlbV9pKyspIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNfY29udGVudF9uZC5hZGRDaGlsZCh0aGlzLml0ZW1fbmRzW2l0ZW1faV0ucm9vdF93bmQpO1xuICAgICAgICAgICAgdGhpcy5pdGVtX25kc1tpdGVtX2ldLnBsYXlTaG93QWN0aW9uKGl0ZW1faSk7XG4gICAgICAgICAgICAvLyB0aGlzLml0ZW1fbmRzW2l0ZW1faV0uc2hvd0VmZmVjdCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUdldEl0ZW1zOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlY3J1aXRfZGF0YSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnJld2FyZHMgPSB0aGlzLnJlY3J1aXRfZGF0YS5yZXdhcmRzO1xuICAgICAgICB0aGlzLmluaXRfbnVtID0gMDtcbiAgICAgICAgdGhpcy5pdGVtX25kcyA9IFtdO1xuICAgICAgICB2YXIgc2NoZUluZGV4ID0gMDtcblxuICAgICAgICB2YXIgSGVyb0V4aGliaXRpb25JdGVtID0gcmVxdWlyZShcImhlcm9fZ2V0X2l0ZW1cIik7XG4gICAgICAgIHZhciBjcmVhdGVfaXRlbV9zY2ggPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB2YXIgaGVyb19pdGVtID0gbmV3IEhlcm9FeGhpYml0aW9uSXRlbSh0aGlzLnJld2FyZHNbc2NoZUluZGV4XSwgc2NoZUluZGV4LCB0aGlzLml0ZW1GaW5pc2hDcmVhdGUuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fbmRzPT1udWxsKXJldHVyblxuICAgICAgICAgICAgdGhpcy5pdGVtX25kcy5wdXNoKGhlcm9faXRlbSk7XG4gICAgICAgICAgICArK3NjaGVJbmRleDtcbiAgICAgICAgfS5iaW5kKHRoaXMpKSwgNTAsIHRoaXMucmV3YXJkcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICBpdGVtRmluaXNoQ3JlYXRlOiBmdW5jdGlvbihpbmRleCwgcm9vdF93bikge1xuICAgICAgICArK3RoaXMuaW5pdF9udW1cbiAgICAgICAgaWYgKHRoaXMuaW5pdF9udW0gPT0gdGhpcy5yZXdhcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYodGhpcy5pdGVtX25kcz09bnVsbClyZXR1cm5cbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1fbmRzLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zX2NvbnRlbnRfbmQud2lkdGggPSAxMjAgKiA1ICsgMjAgKiA0XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNfY29udGVudF9uZC53aWR0aCA9IDEyMCAqIHRoaXMuaXRlbV9uZHMubGVuZ3RoICsgKDIwICogdGhpcy5pdGVtX25kcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pdGVtc19pbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbl9zaG93KVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkR2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhbmFseXNlUmVjcnVpdERhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5maW5pc2hfY2IpIHRoaXMuZmluaXNoX2NiKCk7XG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICB2YXIgc2hvd19iaWRzID0gW107ICAgICAvLyDpnIDopoHlj6zllKTnmoTpq5jnuqfoi7Hpm4QgXG4gICAgICAgIGlmICh0aGlzLnJlY3J1aXRfZGF0YS5wYXJ0bmVyX2JpZHMpIHtcbiAgICAgICAgICAgIHZhciBiaWRfaW5mbyA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKHZhciBiaWRfaSBpbiB0aGlzLnJlY3J1aXRfZGF0YS5wYXJ0bmVyX2JpZHMpIHtcbiAgICAgICAgICAgICAgICBiaWRfaW5mbyA9IHRoaXMucmVjcnVpdF9kYXRhLnBhcnRuZXJfYmlkc1tiaWRfaV07XG4gICAgICAgICAgICAgICAgdmFyIHBhcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW2JpZF9pbmZvLnBhcnRuZXJfYmlkXVxuICAgICAgICAgICAgICAgIGlmIChwYXJfY29uZmlnLnNob3dfZWZmZWN0KSBzaG93X2JpZHMucHVzaChiaWRfaW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvd19iaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuU3VtbW9uR2FpblNob3dXaW5kb3codHJ1ZSwgc2hvd19iaWRzLCB0aGlzLnNob3dJdGVtcy5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0l0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlkQ2xpY2tDb25maXJtQnRuOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAvLyB2YXIgc2hvd19iaWRzID0gW3twYXJ0bmVyX2JpZDogNDA0MDMsIGluaXRfc3RhcjogNH0sIHtwYXJ0bmVyX2JpZDogMjA1MDQsIGluaXRfc3RhcjogNX0sIHtwYXJ0bmVyX2JpZDogMzA0MDIsIGluaXRfc3RhcjogNH1dO1xuICAgICAgICAvLyB0aGlzLmN0cmwub3BlblN1bW1vbkdhaW5TaG93V2luZG93KHRydWUsIHNob3dfYmlkcywgdGhpcy5zaG93SXRlbXMuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuY3RybC5vcGVuU3VtbW9uR2FpbldpbmRvdyhmYWxzZSk7XG4gICAgfSxcblxuICAgIGRpZENsaWNrQWdhaW5CdG46IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIC8vIOWIpOaWreiLsembhOiDjOWMheepuumXtFxuICAgICAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xuICAgICAgICB2YXIgaGVyb19tb2RlbCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgdmFyIGhlcm9fYmFnX2luZm8gPSBoZXJvX21vZGVsLmdldEhlcm9NYXhDb3VudCgpO1xuICAgICAgICB2YXIgbGltaXRfbnVtID0gaGVyb19iYWdfaW5mby5tYXhfY291bnQgLSBoZXJvX2JhZ19pbmZvLmhhdmVfY291dG47XG4gICAgICAgIGlmKHRoaXMucmVjcnVpdF9kYXRhLnRpbWVzID4gbGltaXRfbnVtKXtcbiAgICAgICAgICAgIHZhciBzdHIgPSBVdGlscy5USTE4TihcIuiLsembhOWIl+ihqOW3sua7oe+8jOWPr+mAmui/h+aPkOWNh+i0teaXj+etiee6p+aIlui0reS5sOWinuWKoOiLsembhOaQuuW4puaVsOmHj++8jOaYr+WQpuWJjeW+gOi0reS5sO+8n1wiKVxuICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xuICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHIsIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpXG4gICAgICAgICAgICAgICAgdmFyIEFjdGlvbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICB2YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGFuZ2VNYWluVUlTdGF0dXMoTWFpbnVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXIpXG4gICAgICAgICAgICAgICAgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5BY3Rpb25NYWluUGFuZWwoZmFsc2UpXG4gICAgICAgICAgICB9LCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy50eXBlX2ZsYWcgPT0gMCl7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXRlbV9lbm91Z2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNydWl0X2RhdGEuZ3JvdXBfaWQgPT0gU3VtbW9uQ29uc3QuU3VtbW9uX1R5cGUuQWR2YW5jZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93R29sZFRpcHModGhpcy5yZWNydWl0X2RhdGEudGltZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlblRpcHNTb3VyY2UodHJ1ZSwgdGhpcy5uZWVkX2l0ZW1faWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuYWdhaW5SZWNydWl0KCk7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5tb2RsZS5nZXRDbGlja1N0YXR1cygpKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RsZS5jbGlja0ludGVydmFsU3RhdHVzKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlblN1bW1vbkdhaW5XaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fZW5vdWdoKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnR5cGVfZmxhZyA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5TdW1tb25HYWluV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgVGltZXN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5yZXF1ZXN0VGltZVN1bW1vbiggdGhpcy5yZWNydWl0X2RhdGEudGltZXMsIDQgKVxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDIpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlblN1bW1vbkdhaW5XaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRWxpdGVzdW1tb25Db250cm9sbGVyID0gcmVxdWlyZShcImVsaXRlc3VtbW9uX2NvbnRyb2xsZXJcIilcbiAgICAgICAgICAgICAgICAgICAgRWxpdGVzdW1tb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZDIzMjIxKCB0aGlzLnJlY3J1aXRfZGF0YS50aW1lcywgNCApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaG93R29sZFRpcHModGhpcy5yZWNydWl0X2RhdGEudGltZXMpXG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgfSxcbiAgICBcbiAgICBzaG93R29sZFRpcHM6IGZ1bmN0aW9uKHRpbWVzKSB7XG4gICAgICAgIHZhciBjb25maWdfZGF0YSBcbiAgICAgICAgaWYodGhpcy50eXBlX2ZsYWcgPT0gMCl7XG4gICAgICAgICAgICBjb25maWdfZGF0YSA9IENvbmZpZy5yZWNydWl0X2RhdGEuZGF0YV9wYXJ0bmVyc3VtbW9uX2RhdGFbXCIzMDBcIl07XG4gICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDEpe1xuICAgICAgICAgICAgY29uZmlnX2RhdGEgPSBDb25maWcucmVjcnVpdF9ob2xpZGF5X2RhdGEuZGF0YV9zdW1tb25bdGhpcy5yZWNydWl0X2RhdGEuZ3JvdXBfaWRdO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLnR5cGVfZmxhZyA9PSAyKXtcbiAgICAgICAgICAgIGNvbmZpZ19kYXRhID0gQ29uZmlnLnJlY3J1aXRfaG9saWRheV9lbGl0ZV9kYXRhLmRhdGFfc3VtbW9uW3RoaXMucmVjcnVpdF9kYXRhLmdyb3VwX2lkXVxuICAgICAgICB9XG4gICAgICAgICBcbiAgICAgICAgdmFyIHJlY3J1aXRfZGF0YSA9IHRoaXMubW9kbGUuZ2V0U3VtbW9uUHJvdG9EYXRhQnlHcm91cElEKDMwMCk7XG5cbiAgICAgICAgdmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIHZhciBuZWVkX251bSx2YWxfc3RyLHZhbF9udW0sY2FsbF9udW1cbiAgICAgICAgaWYodGhpcy50eXBlX2ZsYWcgPT0gMCl7XG4gICAgICAgICAgICAvLyBnb29kX3Jlc19jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGNvbmZpZ19kYXRhLmV4Y2hhbmdlX29uY2VbMF1bMF0pO1xuICAgICAgICAgICAgbmVlZF9udW0gPSBjb25maWdfZGF0YS5leGNoYW5nZV9vbmNlWzBdWzFdO1xuICAgICAgICAgICAgdmFsX3N0ciA9IFV0aWxzLmdldEl0ZW1Db25maWcoY29uZmlnX2RhdGEuZXhjaGFuZ2Vfb25jZV9nYWluWzBdWzBdKS5uYW1lXG4gICAgICAgICAgICB2YWxfbnVtID0gY29uZmlnX2RhdGEuZXhjaGFuZ2Vfb25jZV9nYWluWzBdWzFdO1xuICAgICAgICAgICAgY2FsbF9udW0gPSByZWNydWl0X2RhdGEuZHJhd19saXN0WzFdLnRpbWVzIHx8IDE7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDEgfHwgdGhpcy50eXBlX2ZsYWcgPT0gMil7XG4gICAgICAgICAgICAvLyBnb29kX3Jlc19jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGNvbmZpZ19kYXRhLmxvc3NfZ29sZF9vbmNlWzBdWzBdKTtcbiAgICAgICAgICAgIG5lZWRfbnVtID0gY29uZmlnX2RhdGEubG9zc19nb2xkX29uY2VbMF1bMV1cbiAgICAgICAgICAgIHZhbF9zdHIgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGNvbmZpZ19kYXRhLmdhaW5fb25jZVswXVswXSkubmFtZVxuICAgICAgICAgICAgdmFsX251bSA9IGNvbmZpZ19kYXRhLmdhaW5fb25jZVswXVsxXTtcbiAgICAgICAgICAgIGNhbGxfbnVtID0gdGhpcy5yZWNydWl0X2RhdGEudGltZXNcbiAgICAgICAgfSBcbiAgICAgICAgdmFyIGdvb2RfcmVzX3BhdGggICA9IFwiM1wiO1xuICAgICAgICB2YXIgaHZhZV9udW0gICAgICAgID0gcm9sZV92by5nb2xkO1xuXG4gICAgICAgIGlmICh0aW1lcyA9PT0gMTApIHtcbiAgICAgICAgICAgIGlmKHRoaXMudHlwZV9mbGFnID09IDApe1xuICAgICAgICAgICAgICAgIG5lZWRfbnVtID0gY29uZmlnX2RhdGEuZXhjaGFuZ2VfZml2ZVswXVsxXTtcbiAgICAgICAgICAgICAgICB2YWxfc3RyICA9IFV0aWxzLmdldEl0ZW1Db25maWcoY29uZmlnX2RhdGEuZXhjaGFuZ2VfZml2ZV9nYWluWzBdWzBdKS5uYW1lICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFsX251bSAgPSBjb25maWdfZGF0YS5leGNoYW5nZV9vbmNlX2dhaW5bMF1bMV07XG4gICAgICAgICAgICAgICAgY2FsbF9udW0gPSByZWNydWl0X2RhdGEuZHJhd19saXN0WzBdLnRpbWVzIHx8IDEwO1xuICAgICAgICAgICAgfWVsc2UgaWYodGhpcy50eXBlX2ZsYWcgPT0gMSB8fCB0aGlzLnR5cGVfZmxhZyA9PSAyKXtcbiAgICAgICAgICAgICAgICBuZWVkX251bSA9IGNvbmZpZ19kYXRhLmxvc3NfZ29sZF90ZW5bMF1bMV07XG4gICAgICAgICAgICAgICAgdmFsX3N0ciAgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGNvbmZpZ19kYXRhLmdhaW5fdGVuWzBdWzBdKS5uYW1lICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFsX251bSAgPSBjb25maWdfZGF0YS5nYWluX29uY2VbMF1bMV07XG4gICAgICAgICAgICAgICAgY2FsbF9udW0gPSB0aGlzLnJlY3J1aXRfZGF0YS50aW1lcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJ1eV9vcmkgPSBjYy5qcy5mb3JtYXRTdHIoU3RyaW5nVXRpbC5wYXJzZVN0cihMYW5nLkRJQU1PTkRfQ09OU1VNRSkuc3RyaW5nLCBnb29kX3Jlc19wYXRoLCBuZWVkX251bSwgaHZhZV9udW0pO1xuICAgICAgICB2YXIgZ2V0X29yaSA9IGNjLmpzLmZvcm1hdFN0cihTdHJpbmdVdGlsLnBhcnNlU3RyKExhbmcuQlVZX0RFUykuc3RyaW5nLCB2YWxfc3RyLCB2YWxfbnVtLCBjYWxsX251bSk7XG4gICAgICAgIHZhciBkZXNfc3RyID0gYnV5X29yaSArIGdldF9vcmk7XG5cbiAgICAgICAgdmFyIGZyYW1lX2FycmF5cyA9IFtdO1xuICAgICAgICB2YXIgZ29vZF9wYXRoID0gUGF0aFRvb2wuZ2V0SWNvblBhdGgoXCJpdGVtXCIsIFwiM1wiKTtcbiAgICAgICAgZnJhbWVfYXJyYXlzLnB1c2goZ29vZF9wYXRoKTtcblxuICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG4gICAgICAgIHZhciBjb21tb25fYWxlcl92aWV3ID0gQ29tbW9uQWxlcnQuc2hvdyhkZXNfc3RyLCBcIuehruWumlwiLCB0aGlzLmNvbmZpZ1VzZUdvbGQuYmluZCh0aGlzLCB0aW1lcyksIFwi5Y+W5raIXCIsIG51bGwsIG51bGwsIG51bGwsIHtyZXNBcnI6IGZyYW1lX2FycmF5cyxtYXhXaWR0aDo0NTAsYWxpZ246Y2MubWFjcm8uVGV4dEFsaWdubWVudC5MRUZUfSk7XG4gICAgfSxcblxuICAgIGNvbmZpZ1VzZUdvbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZih0aGlzLnR5cGVfZmxhZyA9PSAwKXtcbiAgICAgICAgICAgIHZhciBncm91cF9pZCA9IDMwMDtcbiAgICAgICAgICAgIHZhciB0aW1lcyA9IHRoaXMucmVjcnVpdF9kYXRhLnRpbWVzO1xuICAgICAgICAgICAgdmFyIHJlY3J1aXRfdHlwZSA9IDM7XG4gICAgXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVjdXJpdChncm91cF9pZCwgdGltZXMsIHJlY3J1aXRfdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlblN1bW1vbkdhaW5XaW5kb3coZmFsc2UpO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLnR5cGVfZmxhZyA9PSAxKXtcbiAgICAgICAgICAgIFRpbWVzdW1tb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkucmVxdWVzdFRpbWVTdW1tb24odGhpcy5yZWNydWl0X2RhdGEudGltZXMsMylcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuU3VtbW9uR2FpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMudHlwZV9mbGFnID09IDIpe1xuICAgICAgICAgICAgdmFyIEVsaXRlc3VtbW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJlbGl0ZXN1bW1vbl9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICBFbGl0ZXN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZW5kMjMyMjEoIHRoaXMucmVjcnVpdF9kYXRhLnRpbWVzLCAzIClcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuU3VtbW9uR2FpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAodGhpcy5yZWNydWl0X2NiKSB0aGlzLnJlY3J1aXRfY2IoZ3JvdXBfaWQsIHRpbWVzLCByZWNydWl0X3R5cGUpO1xuICAgIH0sXG59KSJdfQ==