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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hallows/view/hallows_task_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, '73916WkaclNb4/zAzsuqnIG', 'hallows_task_window');
// Scripts/mod/hallows/view/hallows_task_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-02-18 17:52:10
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var MainuiConst = require("mainui_const");
 
var MainuiController = require("mainui_controller");
 
var HallowsEvent = require("hallows_event");
 
var CommonScrollView = require("common_scrollview");
 
var HallowsTaskItem = require("hallows_task_item_panel");
 
var PartnerCalculate = require("partner_calculate");
 
var Hallows_taskWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hallows", "hallows_task_window");
    this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
    this.rleasePrefab = false;
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.attr_bgs = [];
    this.base_attr_list = {};
    this.all_hallows_id = []; // 所有神器id(有序,翻页按钮用)
 
    this.cur_index = 0; //当前选中的神器在all_hallows_id的下标
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.seekChild(this.root_wnd, "background");
    this.background.scale = FIT_SCALE;
    this.bg = this.seekChild(this.root_wnd, "background", cc.Sprite);
    this.loadRes(PathTool.getBigBg("bigbg_68", "jpg"), function (resObject) {
      this.bg.spriteFrame = resObject;
    }.bind(this));
    this.main_panel = this.seekChild("main_panel");
    this.title_bg = this.main_panel.getChildByName("title_bg").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_2015"), function (resObject) {
      this.title_bg.spriteFrame = resObject;
    }.bind(this));
    this.skill_bg = this.main_panel.getChildByName("skill_bg");
    this.skill_bg_img = this.skill_bg.getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1092"), function (resObject) {
      this.skill_bg_img.spriteFrame = resObject;
    }.bind(this));
    this.bottom_bg = this.main_panel.getChildByName("bottom_bg").getComponent(cc.Sprite);
    this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1001"), function (resObject) {
      this.bottom_bg.spriteFrame = resObject;
    }.bind(this));
    this.task_panel = this.seekChild(this.main_panel, "task_panel");
    this.attr_panel = this.seekChild(this.main_panel, "attr_panel");
    this.attr_panel.active = false;
    this.attr_bg_1 = this.attr_panel.getChildByName("attr_bg_1").getComponent(cc.Sprite);
    this.attr_bg_2 = this.attr_panel.getChildByName("attr_bg_2").getComponent(cc.Sprite);
    this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1007"), function (resObject) {
      this.attr_bg_1.spriteFrame = resObject;
      this.attr_bg_2.spriteFrame = resObject;
    }.bind(this));
    this.max_bg_l = this.attr_panel.getChildByName("max_bg_l").getComponent(cc.Sprite);
    this.max_bg_r = this.attr_panel.getChildByName("max_bg_r").getComponent(cc.Sprite);
    this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1005"), function (resObject) {
      this.max_bg_l.spriteFrame = resObject;
      this.max_bg_r.spriteFrame = resObject;
    }.bind(this));
    this.bottom_bg_2 = this.attr_panel.getChildByName("bottom_bg_2").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_2007"), function (resObject) {
      this.bottom_bg_2.spriteFrame = resObject;
    }.bind(this));
    this.desc_label = this.attr_panel.getChildByName("desc_label").getComponent(cc.Label);
    this.desc_label.string = Utils.TI18N("出战界面选择穿戴激活神器技能和主属性");
    this.go_battle_btn = this.seekChild(this.attr_panel, "go_battle_btn");
    this.hallows_name = this.seekChild(this.main_panel, "hallows_name", cc.Label);
    this.explain_btn = this.seekChild(this.main_panel, "explain_btn");
    this.artifact_btn = this.seekChild(this.main_panel, "artifact_btn");
    this.touch_layout = this.seekChild(this.main_panel, "touch_layout");
    this.progress = this.seekChild(this.main_panel, "progress").getComponent(cc.ProgressBar);
    this.progress_value = this.seekChild(this.main_panel, "value").getComponent(cc.Label);
    this.left_btn = this.seekChild(this.main_panel, "left_btn");
    this.right_btn = this.seekChild(this.main_panel, "right_btn");
    this.list_view = this.seekChild(this.main_panel, "list_view");
 
    for (var i = 1; i < 3; i++) {
      var attr_bg = this.seekChild(this.main_panel, "attr_bg_" + i);
      this.attr_bgs[i] = attr_bg;
    }
 
    this.hallows_eff_node = this.seekChild("hallows_eff_node");
    this.hallows_eff_sk = this.seekChild("hallows_eff_node", sp.Skeleton);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    this.artifact_btn.on("click", function () {
      Utils.playButtonSound(ButtonSound.Normal);
      this.ctrl.openHallowsPreviewWindow(true);
    }, this);
    this.go_battle_btn.on("click", function () {
      Utils.playButtonSound(ButtonSound.Normal);
      MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.drama_scene);
      this.ctrl.openHallowsMainWindow(false);
    }, this);
    this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(ButtonSound.Normal);
      var config = config = Config.hallows_data.data_const.game_rule;
      var pos = event.touch.getLocation();
 
      require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
    }, this);
    this.left_btn.on("click", function () {
      Utils.playButtonSound(ButtonSound.Normal);
 
      this._onClickBtnLeft();
    }, this);
    this.right_btn.on("click", function () {
      Utils.playButtonSound(ButtonSound.Normal);
 
      this._onClickBtnRight();
    }, this);
    this.touch_layout.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Normal);
 
      if (this.hallows_id) {
        var max_vo = this.model.makeHighestHallowVo(this.hallows_id);
        this.ctrl.openHallowsTips(true, max_vo);
      }
    }, this); //任务变化
 
    this.addGlobalEvent(HallowsEvent.UpdateHallowsTaskEvent, function () {
      this.updateHallowsTaskInfo();
    }.bind(this)); //神器数据更新
 
    this.addGlobalEvent(HallowsEvent.HallowsUpdateEvent, function (id) {
      if (id == this.hallows_id) {
        this.refreshView();
      }
    }.bind(this)); //激活圣器
 
    this.addGlobalEvent(HallowsEvent.HallowsActivityEvent, function () {
      var hallows_id = this.model.getCurActivityHallowsId();
 
      if (hallows_id) {
        this.hallows_id = hallows_id;
        this.initUnlockHallowsData(hallows_id);
        this.refreshView();
      }
    }.bind(this)); //显示为某一神器(从所有神器预览界面打开)
 
    this.addGlobalEvent(HallowsEvent.UndateHallowsInfoEvent, function (id) {
      if (id && this.hallows_id != id) {
        this.hallows_id = id;
        this.initUnlockHallowsData(id);
        this.refreshView();
      }
    }.bind(this));
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(hallows_id) {
    var hallows_id = hallows_id || this.model.getCurActivityHallowsId();
 
    if (hallows_id) {
      this.hallows_id = hallows_id;
      this.initUnlockHallowsData(hallows_id);
      this.refreshView();
    }
  },
  //设置已解锁和正在进行的神器数据
  initUnlockHallowsData: function initUnlockHallowsData(hallows_id) {
    this.all_hallows_id = [];
    var activity_id = this.model.getCurActivityHallowsId(); // 正在进行中的神器id
 
    for (var i in Config.hallows_data.data_base) {
      var tempCfg = Config.hallows_data.data_base[i];
 
      if (this.model.getHallowsById(tempCfg.id) || tempCfg.id == activity_id) {
        this.all_hallows_id.push(tempCfg.id);
 
        if (hallows_id && tempCfg.id == hallows_id) {
          this.cur_index = this.all_hallows_id.length - 1;
        }
      }
    }
 
    this.left_btn.active = this.all_hallows_id.length > 1;
    this.right_btn.active = this.all_hallows_id.length > 1;
  },
  updateHallowsBaseInfo: function updateHallowsBaseInfo() {
    if (!this.hallows_id) return;
    var hallows_config = Config.hallows_data.data_base[this.hallows_id];
    if (!hallows_config) return;
 
    if (this.hallows_model_id != hallows_config.effect) {
      this.hallows_model_id = hallows_config.effect;
 
      if (this.hallows_eff_sk) {
        this.hallows_eff_sk.setToSetupPose();
        this.hallows_eff_sk.clearTracks();
      }
    }
 
    this.hallows_name.string = hallows_config.name;
 
    if (this.model.getHallowsById(this.hallows_id)) {
      // setChildUnEnabled(false, this.hallows_model)
      this.hallows_eff_node.color = new cc.Color(255, 255, 255, 255);
      var anima_path = PathTool.getSpinePath(this.hallows_model_id, "action");
      this.loadRes(anima_path, function (ske_data) {
        this.hallows_eff_sk.skeletonData = ske_data;
        this.hallows_eff_sk.setAnimation(0, PlayerAction.action_2, true);
      }.bind(this));
    } else {
      // setChildUnEnabled(true, this.hallows_model)
      this.hallows_eff_node.color = new cc.Color(169, 169, 169, 255);
      var anima_path = PathTool.getSpinePath(this.hallows_model_id, "action");
      this.loadRes(anima_path, function (ske_data) {
        this.hallows_eff_sk.skeletonData = ske_data;
        this.hallows_eff_sk.setAnimation(0, PlayerAction.action_1, true);
      }.bind(this));
    }
  },
  updateHallowsTaskInfo: function updateHallowsTaskInfo() {
    if (!this.hallows_id) return; //判断是否已获得
 
    if (this.model.getHallowsById(this.hallows_id)) {
      this.attr_panel.active = true;
      this.task_panel.active = false;
      this.progress.progress = 1;
      this.progress_value.string = Utils.TI18N("已完成");
 
      for (var i in this.base_attr_list) {
        this.base_attr_list[i].active = false;
      }
 
      var hallows_base = gdata("hallows_data", "data_info", Utils.getNorKey(this.hallows_id, 1));
 
      if (hallows_base) {
        for (var j in hallows_base.attr) {
          if (j > 2) break; //UI只支持显示两个技能
 
          var attr_key = hallows_base.attr[j][0];
          var attr_val = hallows_base.attr[j][1] || 0;
          var attr_name = Config.attr_data.data_key_to_name[attr_key];
 
          if (attr_name) {
            var attr_text = this.base_attr_list[j];
 
            if (!attr_text) {
              attr_text = Utils.createRichLabel(24, new cc.Color(100, 50, 35, 255), cc.v2(0, 0.5), cc.v2(20, 20), 30, 380);
              attr_text.horizontalAlign = cc.macro.TextAlignment.LEFT;
              var attr_bg = this.attr_bgs[parseInt(j) + 1];
              attr_bg.addChild(attr_text.node);
              this.base_attr_list[j] = attr_text;
            }
 
            attr_text.active = true;
            var icon = PathTool.getAttrIconByStr(attr_key);
            var is_per = PartnerCalculate.isShowPerByStr(attr_key);
 
            if (is_per == true) {
              attr_val = attr_val / 10 + "%";
            }
 
            var attr_str = cc.js.formatStr("<img src='%s'/> <color=#643223> %s%s:</c><color=#643223>%s</c>", icon, Utils.TI18N("全队"), attr_name, attr_val);
            attr_text.string = attr_str;
            this.loadRes(PathTool.getCommonIcomPath(icon), function (attr_text, resObject) {
              attr_text.addSpriteFrame(resObject);
            }.bind(this, attr_text));
          }
        }
      }
    } else {
      this.attr_panel.active = false;
      this.task_panel.active = true;
      var task_list = this.model.getHallowsTaskList(this.hallows_id);
 
      if (task_list) {
        var max_num = task_list.length;
        var cur_num = 0;
 
        for (var k in task_list) {
          if (task_list[k].finish == 2) {
            cur_num = cur_num + 1;
          }
        }
 
        var percent = cur_num / max_num;
        this.progress.progress = percent;
        this.progress_value.string = cur_num + "/" + max_num;
      }
 
      if (this.scroll_view == null) {
        var size = this.list_view.getContentSize();
        var setting = {
          item_class: HallowsTaskItem,
          // 单元类 
          start_x: 0,
          // 第一个单元的X起点
          space_x: 10,
          // x方向的间隔
          start_y: 0,
          // 第一个单元的Y起点
          space_y: 4,
          // y方向的间隔
          item_width: 331,
          // 单元的尺寸width
          item_height: 139,
          // 单元的尺寸height
          row: 0,
          // 行数,作用于水平滚动类型
          col: 2,
          // 列数,作用于垂直滚动类型
          need_dynamic: true
        };
        this.scroll_view = new CommonScrollView();
        this.scroll_view.createScroll(this.list_view, null, null, null, size, setting);
      }
 
      this.scroll_view.setData(task_list);
    }
  },
  // 神器技能
  updateHallowsSkillInfo: function updateHallowsSkillInfo() {
    if (!this.hallows_id) return;
    var hallows_skill = gdata("hallows_data", "data_skill_up", Utils.getNorKey(this.hallows_id, 1)); // 显示1级时的技能
 
    if (hallows_skill && hallows_skill.skill_bid != 0) {
      var config = gdata("skill_data", "data_get_skill", hallows_skill.skill_bid) || {};
 
      if (!this.skill_icon) {
        var SkillItem = require("skill_item");
 
        this.skill_icon = new SkillItem(); //true,true,true,0.9
 
        this.skill_icon.setParent(this.skill_bg);
        this.skill_icon.setScale(0.9);
        this.skill_icon.setLeveStatus(false);
        this.skill_icon.setPosition(cc.v2(75, 70));
      }
 
      this.skill_icon.setData(config.bid);
 
      if (!this.skill_name) {
        //颜色需修改
        this.skill_name = Utils.createLabel(24, new cc.Color(255, 238, 194, 255), null, 135, 80, "", this.skill_bg, 1, cc.v2(0, 0));
      }
 
      this.skill_name.string = config.name;
 
      if (!this.skill_desc) {
        //颜色需修改
        this.skill_desc = Utils.createRichLabel(20, new cc.Color(255, 238, 194, 255), cc.v2(0, 1), cc.v2(135, 80), 30, 500);
        this.skill_desc.horizontalAlign = cc.macro.TextAlignment.LEFT;
        this.skill_bg.addChild(this.skill_desc.node);
      }
 
      this.skill_desc.string = config.des;
    }
  },
  // 向左翻页
  _onClickBtnLeft: function _onClickBtnLeft() {
    this.cur_index = this.cur_index - 1;
 
    if (this.cur_index < 0) {
      this.cur_index = this.all_hallows_id.length - 1;
    }
 
    this.hallows_id = this.all_hallows_id[this.cur_index];
    this.refreshView();
  },
  // -- 向右翻页
  _onClickBtnRight: function _onClickBtnRight() {
    this.cur_index = this.cur_index + 1;
 
    if (this.cur_index >= this.all_hallows_id.length) {
      this.cur_index = 0;
    }
 
    this.hallows_id = this.all_hallows_id[this.cur_index];
    this.refreshView();
  },
  // 刷新界面
  refreshView: function refreshView() {
    this.updateHallowsBaseInfo();
    this.updateHallowsTaskInfo();
    this.updateHallowsSkillInfo();
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.scroll_view) {
      this.scroll_view.deleteMe();
      this.scroll_view = null;
    }
 
    if (this.skill_icon) {
      this.skill_icon.deleteMe();
      this.skill_icon = null;
    }
 
    if (this.hallows_eff_sk) {
      this.hallows_eff_sk.setToSetupPose();
      this.hallows_eff_sk.clearTracks();
    }
 
    this.ctrl.openHallowsMainWindow(false);
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFx2aWV3XFxoYWxsb3dzX3Rhc2tfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIk1haW51aUNvbnN0IiwiTWFpbnVpQ29udHJvbGxlciIsIkhhbGxvd3NFdmVudCIsIkNvbW1vblNjcm9sbFZpZXciLCJIYWxsb3dzVGFza0l0ZW0iLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiSGFsbG93c190YXNrV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwicmxlYXNlUHJlZmFiIiwiaW5pdENvbmZpZyIsImF0dHJfYmdzIiwiYmFzZV9hdHRyX2xpc3QiLCJhbGxfaGFsbG93c19pZCIsImN1cl9pbmRleCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJyb290X3duZCIsInNjYWxlIiwiRklUX1NDQUxFIiwiYmciLCJTcHJpdGUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJyZXNPYmplY3QiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJtYWluX3BhbmVsIiwidGl0bGVfYmciLCJnZXRDaGlsZEJ5TmFtZSIsImdldENvbXBvbmVudCIsImdldENvbW1vbkljb21QYXRoIiwic2tpbGxfYmciLCJza2lsbF9iZ19pbWciLCJib3R0b21fYmciLCJnZXRVSUljb25QYXRoIiwidGFza19wYW5lbCIsImF0dHJfcGFuZWwiLCJhY3RpdmUiLCJhdHRyX2JnXzEiLCJhdHRyX2JnXzIiLCJtYXhfYmdfbCIsIm1heF9iZ19yIiwiYm90dG9tX2JnXzIiLCJkZXNjX2xhYmVsIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiZ29fYmF0dGxlX2J0biIsImhhbGxvd3NfbmFtZSIsImV4cGxhaW5fYnRuIiwiYXJ0aWZhY3RfYnRuIiwidG91Y2hfbGF5b3V0IiwicHJvZ3Jlc3MiLCJQcm9ncmVzc0JhciIsInByb2dyZXNzX3ZhbHVlIiwibGVmdF9idG4iLCJyaWdodF9idG4iLCJsaXN0X3ZpZXciLCJpIiwiYXR0cl9iZyIsImhhbGxvd3NfZWZmX25vZGUiLCJoYWxsb3dzX2VmZl9zayIsInNwIiwiU2tlbGV0b24iLCJyZWdpc3RlckV2ZW50Iiwib24iLCJwbGF5QnV0dG9uU291bmQiLCJCdXR0b25Tb3VuZCIsIk5vcm1hbCIsIm9wZW5IYWxsb3dzUHJldmlld1dpbmRvdyIsImdldEluc3RhbmNlIiwiY2hhbmdlTWFpblVJU3RhdHVzIiwiYnRuX2luZGV4IiwiZHJhbWFfc2NlbmUiLCJvcGVuSGFsbG93c01haW5XaW5kb3ciLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJjb25maWciLCJDb25maWciLCJoYWxsb3dzX2RhdGEiLCJkYXRhX2NvbnN0IiwiZ2FtZV9ydWxlIiwicG9zIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwiZGVzYyIsIl9vbkNsaWNrQnRuTGVmdCIsIl9vbkNsaWNrQnRuUmlnaHQiLCJoYWxsb3dzX2lkIiwibWF4X3ZvIiwibWFrZUhpZ2hlc3RIYWxsb3dWbyIsIm9wZW5IYWxsb3dzVGlwcyIsImFkZEdsb2JhbEV2ZW50IiwiVXBkYXRlSGFsbG93c1Rhc2tFdmVudCIsInVwZGF0ZUhhbGxvd3NUYXNrSW5mbyIsIkhhbGxvd3NVcGRhdGVFdmVudCIsImlkIiwicmVmcmVzaFZpZXciLCJIYWxsb3dzQWN0aXZpdHlFdmVudCIsImdldEN1ckFjdGl2aXR5SGFsbG93c0lkIiwiaW5pdFVubG9ja0hhbGxvd3NEYXRhIiwiVW5kYXRlSGFsbG93c0luZm9FdmVudCIsIm9wZW5Sb290V25kIiwiYWN0aXZpdHlfaWQiLCJkYXRhX2Jhc2UiLCJ0ZW1wQ2ZnIiwiZ2V0SGFsbG93c0J5SWQiLCJwdXNoIiwibGVuZ3RoIiwidXBkYXRlSGFsbG93c0Jhc2VJbmZvIiwiaGFsbG93c19jb25maWciLCJoYWxsb3dzX21vZGVsX2lkIiwiZWZmZWN0Iiwic2V0VG9TZXR1cFBvc2UiLCJjbGVhclRyYWNrcyIsIm5hbWUiLCJjb2xvciIsIkNvbG9yIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInNrZV9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uXzIiLCJhY3Rpb25fMSIsImhhbGxvd3NfYmFzZSIsImdkYXRhIiwiZ2V0Tm9yS2V5IiwiaiIsImF0dHIiLCJhdHRyX2tleSIsImF0dHJfdmFsIiwiYXR0cl9uYW1lIiwiYXR0cl9kYXRhIiwiZGF0YV9rZXlfdG9fbmFtZSIsImF0dHJfdGV4dCIsImNyZWF0ZVJpY2hMYWJlbCIsInYyIiwiaG9yaXpvbnRhbEFsaWduIiwibWFjcm8iLCJUZXh0QWxpZ25tZW50IiwiTEVGVCIsInBhcnNlSW50IiwiYWRkQ2hpbGQiLCJub2RlIiwiaWNvbiIsImdldEF0dHJJY29uQnlTdHIiLCJpc19wZXIiLCJpc1Nob3dQZXJCeVN0ciIsImF0dHJfc3RyIiwianMiLCJmb3JtYXRTdHIiLCJhZGRTcHJpdGVGcmFtZSIsInRhc2tfbGlzdCIsImdldEhhbGxvd3NUYXNrTGlzdCIsIm1heF9udW0iLCJjdXJfbnVtIiwiayIsImZpbmlzaCIsInBlcmNlbnQiLCJzY3JvbGxfdmlldyIsInNpemUiLCJnZXRDb250ZW50U2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm5lZWRfZHluYW1pYyIsImNyZWF0ZVNjcm9sbCIsInNldERhdGEiLCJ1cGRhdGVIYWxsb3dzU2tpbGxJbmZvIiwiaGFsbG93c19za2lsbCIsInNraWxsX2JpZCIsInNraWxsX2ljb24iLCJTa2lsbEl0ZW0iLCJzZXRQYXJlbnQiLCJzZXRTY2FsZSIsInNldExldmVTdGF0dXMiLCJzZXRQb3NpdGlvbiIsImJpZCIsInNraWxsX25hbWUiLCJjcmVhdGVMYWJlbCIsInNraWxsX2Rlc2MiLCJkZXMiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlFLGdCQUFnQixHQUFHRixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsWUFBWSxHQUFHSCxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFDQSxJQUFJSSxnQkFBZ0IsR0FBR0osT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlLLGVBQWUsR0FBR0wsT0FBTyxDQUFDLHlCQUFELENBQTdCOztBQUNBLElBQUlNLGdCQUFnQixHQUFHTixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBRUEsSUFBSU8sa0JBQWtCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzlCLGFBQVNDLFFBRHFCO0FBRTlCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCYixRQUFRLENBQUNjLGFBQVQsQ0FBdUIsU0FBdkIsRUFBa0MscUJBQWxDLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLEVBQXpCLENBRmMsQ0FFOEI7O0FBQzVDLFNBQUtDLFFBQUwsR0FBZ0JDLE9BQU8sQ0FBQ0MsSUFBeEIsQ0FIYyxDQUc4Qjs7QUFFNUMsU0FBS0MsSUFBTCxHQUFZQyxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxLQUFLRixJQUFMLENBQVVHLFFBQVYsRUFBYjtBQUNBLFNBQUtDLFlBQUwsR0FBb0IsS0FBcEI7QUFD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QSxTQUFLeUYsV0FBTDtBQUNILEdBL1c2QjtBQWlYOUI7QUFDQUEsRUFBQUEsV0FBVyxFQUFDLHVCQUFVO0FBQ2xCLFNBQUtZLHFCQUFMO0FBQ0EsU0FBS2YscUJBQUw7QUFDQSxTQUFLbUYsc0JBQUw7QUFFSCxHQXZYNkI7QUF5WDlCO0FBQ0FjLEVBQUFBLGFBQWEsRUFBQyx5QkFBVTtBQUNwQixRQUFHLEtBQUs5QixXQUFSLEVBQW9CO0FBQ2hCLFdBQUtBLFdBQUwsQ0FBaUIrQixRQUFqQjtBQUNBLFdBQUsvQixXQUFMLEdBQW1CLElBQW5CO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLbUIsVUFBUixFQUFtQjtBQUNmLFdBQUtBLFVBQUwsQ0FBZ0JZLFFBQWhCO0FBQ0EsV0FBS1osVUFBTCxHQUFrQixJQUFsQjtBQUNIOztBQUVELFFBQUcsS0FBSzFILGNBQVIsRUFBdUI7QUFDbkIsV0FBS0EsY0FBTCxDQUFvQnVELGNBQXBCO0FBQ0EsV0FBS3ZELGNBQUwsQ0FBb0J3RCxXQUFwQjtBQUVIOztBQUNBLFNBQUtuSCxJQUFMLENBQVV3RSxxQkFBVixDQUFnQyxLQUFoQztBQUNKO0FBMVk2QixDQUFULENBQXpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMi0xOCAxNzo1MjoxMFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBIYWxsb3dzRXZlbnQgPSByZXF1aXJlKFwiaGFsbG93c19ldmVudFwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIEhhbGxvd3NUYXNrSXRlbSA9IHJlcXVpcmUoXCJoYWxsb3dzX3Rhc2tfaXRlbV9wYW5lbFwiKTtcbnZhciBQYXJ0bmVyQ2FsY3VsYXRlID0gcmVxdWlyZShcInBhcnRuZXJfY2FsY3VsYXRlXCIpO1xuXG52YXIgSGFsbG93c190YXNrV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImhhbGxvd3NcIiwgXCJoYWxsb3dzX3Rhc2tfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLnJsZWFzZVByZWZhYiA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmF0dHJfYmdzID0gW107XG4gICAgICAgIHRoaXMuYmFzZV9hdHRyX2xpc3QgPSB7fVxuICAgICAgICB0aGlzLmFsbF9oYWxsb3dzX2lkID0gW107IC8vIOaJgOacieelnuWZqGlkKOacieW6j++8jOe/u+mhteaMiemSrueUqClcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSAwIFx0XHQgLy/lvZPliY3pgInkuK3nmoTnpZ7lmajlnKhhbGxfaGFsbG93c19pZOeahOS4i+agh1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucm9vdF93bmQsIFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLmJnID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5yb290X3duZCwgXCJiYWNrZ3JvdW5kXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRCaWdCZyhcImJpZ2JnXzY4XCIsXCJqcGdcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIFxuXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9wYW5lbFwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGl0bGVfYmcgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9iZ1wiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzIwMTVcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy50aXRsZV9iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5za2lsbF9iZyA9IHRoaXMubWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2JnXCIpO1xuXG4gICAgICAgIHRoaXMuc2tpbGxfYmdfaW1nID0gdGhpcy5za2lsbF9iZy5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzEwOTJcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5za2lsbF9iZ19pbWcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYm90dG9tX2JnXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhhbGxvd3NcIixcImhhbGxvd3NfMTAwMVwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhc2tfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJ0YXNrX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJhdHRyX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hdHRyX2JnXzEgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX2JnXzFcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuYXR0cl9iZ18yID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9iZ18yXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhhbGxvd3NcIixcImhhbGxvd3NfMTAwN1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmF0dHJfYmdfMS5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMuYXR0cl9iZ18yLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLm1heF9iZ19sID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwibWF4X2JnX2xcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubWF4X2JnX3IgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJtYXhfYmdfclwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoYWxsb3dzXCIsXCJoYWxsb3dzXzEwMDVcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5tYXhfYmdfbC5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMubWF4X2JnX3Iuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnXzIgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJib3R0b21fYmdfMlwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzIwMDdcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5ib3R0b21fYmdfMi5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICB0aGlzLmRlc2NfbGFiZWwgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJkZXNjX2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuZGVzY19sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWHuuaImOeVjOmdoumAieaLqeepv+aItOa/gOa0u+elnuWZqOaKgOiDveWSjOS4u+WxnuaAp1wiKTtcblxuICAgICAgICB0aGlzLmdvX2JhdHRsZV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmF0dHJfcGFuZWwsXCJnb19iYXR0bGVfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMuaGFsbG93c19uYW1lID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwiaGFsbG93c19uYW1lXCIsY2MuTGFiZWwpO1xuXG4gICAgICAgIHRoaXMuZXhwbGFpbl9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJleHBsYWluX2J0blwiKTtcblxuICAgICAgICB0aGlzLmFydGlmYWN0X2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCxcImFydGlmYWN0X2J0blwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudG91Y2hfbGF5b3V0ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwidG91Y2hfbGF5b3V0XCIpO1xuXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJwcm9ncmVzc1wiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xuICAgICAgICB0aGlzLnByb2dyZXNzX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwidmFsdWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLmxlZnRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwibGVmdF9idG5cIik7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwicmlnaHRfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMubGlzdF92aWV3ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwibGlzdF92aWV3XCIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cl9iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCxcImF0dHJfYmdfXCIraSk7XG4gICAgICAgICAgICB0aGlzLmF0dHJfYmdzW2ldID0gYXR0cl9iZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsbG93c19lZmZfbm9kZSA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiKTtcbiAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zayAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiLCBzcC5Ta2VsZXRvbik7XG5cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5hcnRpZmFjdF9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1ByZXZpZXdXaW5kb3codHJ1ZSk7XG4gICAgICAgIH0sdGhpcyk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmdvX2JhdHRsZV9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGFuZ2VNYWluVUlTdGF0dXMoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c01haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2NvbnN0LmdhbWVfcnVsZVxuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoY29uZmlnLmRlc2MsIHBvcyxudWxsLG51bGwsNTAwKTsgICAgICAgICAgICBcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLmxlZnRfYnRuLm9uKFwiY2xpY2tcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrQnRuTGVmdCgpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yaWdodF9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tCdG5SaWdodCgpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50b3VjaF9sYXlvdXQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19pZCl7XG4gICAgICAgICAgICAgICAgdmFyIG1heF92byA9IHRoaXMubW9kZWwubWFrZUhpZ2hlc3RIYWxsb3dWbyh0aGlzLmhhbGxvd3NfaWQpXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5IYWxsb3dzVGlwcyh0cnVlLG1heF92byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgLy/ku7vliqHlj5jljJZcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuVXBkYXRlSGFsbG93c1Rhc2tFdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIYWxsb3dzVGFza0luZm8oKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvL+elnuWZqOaVsOaNruabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5IYWxsb3dzVXBkYXRlRXZlbnQsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgaWYoaWQgPT0gdGhpcy5oYWxsb3dzX2lkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/mv4DmtLvlnKPlmahcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuSGFsbG93c0FjdGl2aXR5RXZlbnQsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBoYWxsb3dzX2lkID0gdGhpcy5tb2RlbC5nZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCgpO1xuICAgICAgICAgICAgaWYoaGFsbG93c19pZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2lkID0gaGFsbG93c19pZDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRVbmxvY2tIYWxsb3dzRGF0YShoYWxsb3dzX2lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/mmL7npLrkuLrmn5DkuIDnpZ7lmajvvIjku47miYDmnInnpZ7lmajpooTop4jnlYzpnaLmiZPlvIDvvIlcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuVW5kYXRlSGFsbG93c0luZm9FdmVudCxmdW5jdGlvbihpZCl7XG4gICAgICAgICAgICBpZihpZCAmJiB0aGlzLmhhbGxvd3NfaWQgIT0gaWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19pZCA9IGlkO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFVubG9ja0hhbGxvd3NEYXRhKGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKGhhbGxvd3NfaWQpe1xuICAgICAgICB2YXIgaGFsbG93c19pZCA9IGhhbGxvd3NfaWQgfHwgdGhpcy5tb2RlbC5nZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCgpO1xuICAgICAgICBpZihoYWxsb3dzX2lkKXtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19pZCA9IGhhbGxvd3NfaWQ7XG4gICAgICAgICAgICB0aGlzLmluaXRVbmxvY2tIYWxsb3dzRGF0YShoYWxsb3dzX2lkKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuvue9ruW3suino+mUgeWSjOato+WcqOi/m+ihjOeahOelnuWZqOaVsOaNrlxuICAgIGluaXRVbmxvY2tIYWxsb3dzRGF0YTpmdW5jdGlvbihoYWxsb3dzX2lkKXtcbiAgICAgICAgdGhpcy5hbGxfaGFsbG93c19pZCA9IFtdO1xuICAgICAgICB2YXIgYWN0aXZpdHlfaWQgPSB0aGlzLm1vZGVsLmdldEN1ckFjdGl2aXR5SGFsbG93c0lkKCkgLy8g5q2j5Zyo6L+b6KGM5Lit55qE56We5ZmoaWRcbiAgICAgICAgZm9yICh2YXIgaSBpbiBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfYmFzZSkge1xuICAgICAgICAgICAgdmFyIHRlbXBDZmcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfYmFzZVtpXTtcbiAgICAgICAgICAgIGlmKHRoaXMubW9kZWwuZ2V0SGFsbG93c0J5SWQodGVtcENmZy5pZCkgfHwgdGVtcENmZy5pZCA9PSBhY3Rpdml0eV9pZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxfaGFsbG93c19pZC5wdXNoKHRlbXBDZmcuaWQpO1xuICAgICAgICAgICAgICAgIGlmKGhhbGxvd3NfaWQgJiYgdGVtcENmZy5pZCA9PSBoYWxsb3dzX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfaW5kZXggPSB0aGlzLmFsbF9oYWxsb3dzX2lkLmxlbmd0aC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRfYnRuLmFjdGl2ZSA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoPjE7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuLmFjdGl2ZSA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoPjE7XG4gICAgfSxcblxuICAgIHVwZGF0ZUhhbGxvd3NCYXNlSW5mbzpmdW5jdGlvbigpe1xuICAgICAgICBpZighdGhpcy5oYWxsb3dzX2lkKXJldHVybjtcbiAgICAgICAgdmFyIGhhbGxvd3NfY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2Jhc2VbdGhpcy5oYWxsb3dzX2lkXTtcbiAgICAgICAgaWYoIWhhbGxvd3NfY29uZmlnKXJldHVybjtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX21vZGVsX2lkICE9IGhhbGxvd3NfY29uZmlnLmVmZmVjdCl7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfbW9kZWxfaWQgPSBoYWxsb3dzX2NvbmZpZy5lZmZlY3Q7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfZWZmX3NrKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYWxsb3dzX25hbWUuc3RyaW5nID0gaGFsbG93c19jb25maWcubmFtZTtcbiAgICAgICAgaWYodGhpcy5tb2RlbC5nZXRIYWxsb3dzQnlJZCh0aGlzLmhhbGxvd3NfaWQpKXtcbiAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKGZhbHNlLCB0aGlzLmhhbGxvd3NfbW9kZWwpXG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX25vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMjU1LDI1NSwyNTUsMjU1KTtcbiAgICAgICAgICAgIHZhciBhbmltYV9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKHRoaXMuaGFsbG93c19tb2RlbF9pZCwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoYW5pbWFfcGF0aCwgZnVuY3Rpb24oc2tlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX3NrLnNrZWxldG9uRGF0YSA9IHNrZV9kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMiwgdHJ1ZSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKHRydWUsIHRoaXMuaGFsbG93c19tb2RlbClcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfbm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigxNjksMTY5LDE2OSwyNTUpO1xuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgodGhpcy5oYWxsb3dzX21vZGVsX2lkLCBcImFjdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhhbmltYV9wYXRoLCBmdW5jdGlvbihza2VfZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8xLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlSGFsbG93c1Rhc2tJbmZvOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKCF0aGlzLmhhbGxvd3NfaWQpcmV0dXJuO1xuICAgICAgICAvL+WIpOaWreaYr+WQpuW3suiOt+W+l1xuICAgICAgICBpZih0aGlzLm1vZGVsLmdldEhhbGxvd3NCeUlkKHRoaXMuaGFsbG93c19pZCkpe1xuICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRhc2tfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gMTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NfdmFsdWUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlt7LlrozmiJBcIik7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5iYXNlX2F0dHJfbGlzdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGhhbGxvd3NfYmFzZSA9IGdkYXRhKFwiaGFsbG93c19kYXRhXCIsXCJkYXRhX2luZm9cIixVdGlscy5nZXROb3JLZXkodGhpcy5oYWxsb3dzX2lkLCAxKSk7XG4gICAgICAgICAgICBpZihoYWxsb3dzX2Jhc2Upe1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBoYWxsb3dzX2Jhc2UuYXR0cil7XG4gICAgICAgICAgICAgICAgICAgIGlmKGo+MilicmVhazsvL1VJ5Y+q5pSv5oyB5pi+56S65Lik5Liq5oqA6IO9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyX2tleSA9IGhhbGxvd3NfYmFzZS5hdHRyW2pdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl92YWwgPSBoYWxsb3dzX2Jhc2UuYXR0cltqXVsxXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9uYW1lID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2tleV90b19uYW1lW2F0dHJfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYoYXR0cl9uYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyX3RleHQgPSB0aGlzLmJhc2VfYXR0cl9saXN0W2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWF0dHJfdGV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl90ZXh0ID0gVXRpbHMuY3JlYXRlUmljaExhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMTAwLDUwLDM1LDI1NSksIGNjLnYyKDAsIDAuNSksIGNjLnYyKDIwLCAyMCksIDMwLCAzODApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl90ZXh0Lmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9iZyA9IHRoaXMuYXR0cl9iZ3NbcGFyc2VJbnQoaikrMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9iZy5hZGRDaGlsZChhdHRyX3RleHQubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdFtqXSA9IGF0dHJfdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfdGV4dC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGljb24gPSBQYXRoVG9vbC5nZXRBdHRySWNvbkJ5U3RyKGF0dHJfa2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzX3BlciA9IFBhcnRuZXJDYWxjdWxhdGUuaXNTaG93UGVyQnlTdHIoYXR0cl9rZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpc19wZXIgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl92YWwgPSAoYXR0cl92YWwvMTApK1wiJVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiPGltZyBzcmM9JyVzJy8+IDxjb2xvcj0jNjQzMjIzPiAlcyVz77yaPC9jPjxjb2xvcj0jNjQzMjIzPiVzPC9jPlwiLCBpY29uLCBVdGlscy5USTE4TihcIuWFqOmYn1wiKSwgYXR0cl9uYW1lLCBhdHRyX3ZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQuc3RyaW5nID0gYXR0cl9zdHI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoaWNvbiksIChmdW5jdGlvbihhdHRyX3RleHQscmVzT2JqZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyxhdHRyX3RleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRhc2tfcGFuZWwuYWN0aXZlID0gdHJ1ZTtcbiAgICBcbiAgICAgICAgICAgIHZhciB0YXNrX2xpc3QgPSB0aGlzLm1vZGVsLmdldEhhbGxvd3NUYXNrTGlzdCh0aGlzLmhhbGxvd3NfaWQpXG4gICAgICAgICAgICBpZiAodGFza19saXN0KXtcbiAgICAgICAgICAgICAgICB2YXIgbWF4X251bSA9IHRhc2tfbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGN1cl9udW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvcih2YXIgayBpbiB0YXNrX2xpc3Qpe1xuICAgICAgICAgICAgICAgICAgICBpZih0YXNrX2xpc3Rba10uZmluaXNoID09IDIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX251bSA9IGN1cl9udW0gKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gY3VyX251bSAvIG1heF9udW07XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc192YWx1ZS5zdHJpbmcgPSBjdXJfbnVtK1wiL1wiK21heF9udW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMuc2Nyb2xsX3ZpZXcgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLmxpc3Rfdmlldy5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtX2NsYXNzOiBIYWxsb3dzVGFza0l0ZW0sIC8vIOWNleWFg+exuyBcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfeDogMCwgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgICAgICAgICBzcGFjZV94OiAxMCwgLy8geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgICAgICAgICBzdGFydF95OiAwLCAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlX3k6IDQsIC8vIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgICAgICAgICAgaXRlbV93aWR0aDogMzMxLCAvLyDljZXlhYPnmoTlsLrlr7h3aWR0aFxuICAgICAgICAgICAgICAgICAgICBpdGVtX2hlaWdodDogMTM5LCAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgcm93OiAwLCAvLyDooYzmlbDvvIzkvZznlKjkuo7msLTlubPmu5rliqjnsbvlnotcbiAgICAgICAgICAgICAgICAgICAgY29sOiAyLCAvLyDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcbiAgICAgICAgICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5saXN0X3ZpZXcsIG51bGwsIG51bGwsIG51bGwsIHNpemUsIHNldHRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldERhdGEodGFza19saXN0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vIOelnuWZqOaKgOiDvVxuICAgIHVwZGF0ZUhhbGxvd3NTa2lsbEluZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMuaGFsbG93c19pZClyZXR1cm47XG4gICAgICAgIHZhciBoYWxsb3dzX3NraWxsID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfc2tpbGxfdXBcIixVdGlscy5nZXROb3JLZXkodGhpcy5oYWxsb3dzX2lkLCAxKSkgLy8g5pi+56S6Mee6p+aXtueahOaKgOiDvVxuICAgICAgICBpZihoYWxsb3dzX3NraWxsICYmIGhhbGxvd3Nfc2tpbGwuc2tpbGxfYmlkICE9IDApe1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwic2tpbGxfZGF0YVwiLFwiZGF0YV9nZXRfc2tpbGxcIixoYWxsb3dzX3NraWxsLnNraWxsX2JpZCkgfHwge307XG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9pY29uKXtcbiAgICAgICAgICAgICAgICB2YXIgU2tpbGxJdGVtID0gcmVxdWlyZShcInNraWxsX2l0ZW1cIilcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2ljb24gICA9IG5ldyBTa2lsbEl0ZW0oKTsvL3RydWUsdHJ1ZSx0cnVlLDAuOVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXRQYXJlbnQodGhpcy5za2lsbF9iZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uLnNldFNjYWxlKDAuOSk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uLnNldExldmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXRQb3NpdGlvbihjYy52Mig3NSwgNzApKSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXREYXRhKGNvbmZpZy5iaWQpO1xuXG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9uYW1lKXsvL+minOiJsumcgOS/ruaUuVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbmFtZSA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMjU1LDIzOCwxOTQsMjU1KSwgbnVsbCwgMTM1LCA4MCwgXCJcIiwgdGhpcy5za2lsbF9iZywgMSwgY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5za2lsbF9uYW1lLnN0cmluZyA9IGNvbmZpZy5uYW1lO1xuXG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9kZXNjKXsvL+minOiJsumcgOS/ruaUuVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfZGVzYyA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMCwgbmV3IGNjLkNvbG9yKDI1NSwyMzgsMTk0LDI1NSksY2MudjIoMCwxKSwgY2MudjIoMTM1LDgwKSwgMzAsIDUwMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9kZXNjLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2JnLmFkZENoaWxkKHRoaXMuc2tpbGxfZGVzYy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpbGxfZGVzYy5zdHJpbmcgPSBjb25maWcuZGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8g5ZCR5bem57+76aG1XG4gICAgX29uQ2xpY2tCdG5MZWZ0OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuY3VyX2luZGV4ID0gdGhpcy5jdXJfaW5kZXggLSAxXG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4IDwgMCl7XG4gICAgICAgICAgICB0aGlzLmN1cl9pbmRleCA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoLTFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbGxvd3NfaWQgPSB0aGlzLmFsbF9oYWxsb3dzX2lkW3RoaXMuY3VyX2luZGV4XVxuICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KClcbiAgICB9LFxuICAgIFxuICAgIFxuICAgIC8vIC0tIOWQkeWPs+e/u+mhtVxuICAgIF9vbkNsaWNrQnRuUmlnaHQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSB0aGlzLmN1cl9pbmRleCArIDFcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPj0gdGhpcy5hbGxfaGFsbG93c19pZC5sZW5ndGgpe1xuICAgICAgICAgICAgdGhpcy5jdXJfaW5kZXggPSAwXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYWxsb3dzX2lkID0gdGhpcy5hbGxfaGFsbG93c19pZFt0aGlzLmN1cl9pbmRleF1cbiAgICAgICAgdGhpcy5yZWZyZXNoVmlldygpXG4gICAgfSxcblxuICAgIC8vIOWIt+aWsOeVjOmdolxuICAgIHJlZnJlc2hWaWV3OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c0Jhc2VJbmZvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1Rhc2tJbmZvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1NraWxsSW5mbygpO1xuXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuc2Nyb2xsX3ZpZXcpe1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5za2lsbF9pY29uKXtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaGFsbG93c19lZmZfc2spe1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c01haW5XaW5kb3coZmFsc2UpXG4gICAgfSxcbiAgICBcbn0pIl19