difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guide/view/task_guide_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, 'f400dE4DSJL9a6LH1XJW6Eq', 'task_guide_window');
// Scripts/mod/guide/view/task_guide_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-08-16 17:09:17
// --------------------------------------------------------------------
var PathTool = require("pathtool"); // var HallowsEvent = require("hallows_event");
 
 
var GuideController = require("guide_controller");
 
var GuideConst = require("guide_const");
 
var GuideEvent = require("guide_event"); // var HallowsController = require("hallows_controller");
 
 
var TaskEvent = require("task_event");
 
var TaskController = require("task_controller");
 
var Task_guideWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("drama", "task_guide_view");
    this.viewTag = SCENE_TAG.msg; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
    // this.win_type = WinType.Full;               //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.ctrl = GuideController.getInstance();
    this.model = this.ctrl.getModel(); // this.hallow_ctrl = HallowsController.getInstance();
    // this.hallow_model = this.hallow_ctrl.getModel();
 
    this.task_ctrl = TaskController.getInstance();
    this.task_model = this.task_ctrl.getModel();
    this.step = 0; //步数0开始,对应数组第0个
 
    this.timer_hander = null;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    if (game.views_js) game.views_js.cancelTouch();
    this.root_wg = this.root_wnd.getComponent(cc.Widget);
 
    if (window.FIT_SCALE > 1) {
      this.root_wg.isAlignTop = true;
      this.root_wg.isAlignBottom = true;
    }
 
    this.background_nd = this.seekChild("background");
    this.clip_con_nd = this.seekChild("clip_con");
    this.effect_con_nd = this.seekChild("effect_con");
    this.effect_con_sk = this.seekChild("effect_con", sp.Skeleton); // this.handleEffect(true);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    //界面点击,触发下一步特效
    this.addGlobalEvent(GuideEvent.TaskNextStep, function (data) {
      // cc.log(data, this.target_name)
      // if (this.root_name == "summonshow" && data == "confirm_btn") {
      //     this.effect_con_nd.active = false;
      // }
      // if (this.target_name) {
      //     if (this.target_name == data) {
      //         this.step += 1;
      //         this.findRootWndByCondition();
      //     } else {
      //         this.handleEffect(false);
      //     }
      // } else {
      //     this.handleEffect(false);
      // }
      if (data == "quick_btn" || data == "quick_add_btn" || data == "compound_btn") {
        if (this.target_name == data) {
          this.step += 1;
          this.findRootWndByCondition();
        } else {
          this.handleEffect(false);
        }
      }
 
      if (data == "challenge_btn") {
        if (this.target_name == data) {
          // this.findRootWndByCondition();
          this.root_name = this.target_data[this.step + 1][0];
        } else {
          this.handleEffect(false);
        }
      }
    }, this); //界面关闭,取消特效
 
    this.addGlobalEvent(GuideEvent.CloseTaskEffect, function () {
      this.handleEffect(false);
      this.model.setTaskGuideLastPos(null);
      this.step = 10;
      window.TASK_TIPS = false;
    }, this); // this.addGlobalEvent(HallowsEvent.UpdateHallowsTaskEvent, function () {
    //     if (this.config && this.effect_con_nd){
    //         this.effect_con_nd.active = this.hallow_model.getHallowsTaks(this.config.id).finish < 1;
    //         window.TASK_TIPS = this.effect_con_nd.active;
    //     }
    // }, this)
 
    this.addGlobalEvent(TaskEvent.UpdateMainQuestTask, function (data) {
      if (this.config && this.effect_con_nd) {
        this.effect_con_nd.active = data.finish < 1;
        window.TASK_TIPS = this.effect_con_nd.active;
      }
    }, this);
    this.addGlobalEvent(GuideEvent.OpenTaskEffect, function (node) {
      // if (node == this.target_data[this.step + 1][0]) {
      //     cc.log("node",node)
      // } else {
      //     this.handleEffect(false);
      //     this.model.setTaskGuideLastPos(null);
      //     this.step = 10;
      //     window.TASK_TIPS = false;
      // }
      if (node.task_tips) {
        this.target_root_wnd = node;
        this.effect_con_nd.active = false;
        this.step += 1;
        this.findTargetNode();
        return;
      }
 
      if (node.name == "guide_main_view" || window.TASK_TIPS == false || node.name == "arena_loop_match_window") return;
      if (this.root_name == "forge_house_window" || this.root_name == "guildboss_main_window") return;
      this.target_root_wnd = node;
      this.effect_con_nd.active = false;
      this.step += 1;
 
      if (node.name == "battle_drama_reward_window") {
        this.step = 0;
      }
 
      this.findTargetNode();
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(config) {
    this.config = config;
    this.target_data = config.drama_eff;
    cc.log("target", this.target_data);
    this.step = 0;
    this.model.setTaskGuideLastPos(null);
    if (this.timer_hander) this.removeTimer();
    this.getTaskTipsEffectNd();
    this.findRootWndByCondition();
  },
  setVisibleStatus: function setVisibleStatus(status, config) {
    this.setVisible(status);
    this.model.setTaskGuideLastPos(null); // this.handleEffect(status);
 
    if (this.timer_hander) this.removeTimer();
    this.config = config;
    this.target_data = config.drama_eff;
    cc.log("target", this.target_data);
    this.step = 0;
    this.getTaskTipsEffectNd();
    this.findRootWndByCondition();
  },
  getTaskTipsEffectNd: function getTaskTipsEffectNd() {
    var node = require("mainui_controller").getInstance().getTaskTipsPanel();
 
    this.target = this.seekChild(node, "main");
    this.drawTargetRect();
  },
  //手指特效显示
  handleEffect: function handleEffect(status) {
    if (status == false) {
      if (this.effect_con_sk) {
        this.effect_con_sk.setToSetupPose();
        this.effect_con_sk.clearTracks();
      }
    } else {
      if (this.effect_con_sk) {
        var eff_res = PathTool.getEffectRes(240);
        var eff_path = PathTool.getSpinePath(eff_res);
        this.loadRes(eff_path, function (res_object) {
          this.effect_con_sk.skeletonData = res_object;
          this.effect_con_sk.setAnimation(0, PlayerAction.action_1, true);
        }.bind(this));
      }
    }
  },
  findRootWndByCondition: function findRootWndByCondition(num) {
    if (this.effect_con_nd.active) {
      this.effect_con_nd.active = false;
    }
 
    if (!this.target_data || !this.target_data[0]) {
      window.TASK_TIPS = false;
      return;
    }
 
    if (this.target_data[this.step] == null) {
      this.handleEffect(false);
      window.TASK_TIPS = false;
      return;
    }
 
    var root_name = this.target_data[this.step][0];
    cc.log(root_name);
    this.root_name = root_name;
    var root_wnd = null;
 
    if (root_name == "partner") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroBagRoot();
    } else if (root_name == "battletopscene") {
      var BattleController = require("battle_controller");
 
      root_wnd = BattleController.getInstance().getDramaFightUI();
    } else if (root_name == "battlesceneview") {
      var BattleController = require("battle_controller");
 
      root_wnd = BattleController.getInstance().getCtrlBattleScene();
    } else if (root_name == "adventurescene") {
      root_wnd = AdventureController.getInstance().getAdventureRoot();
    } else if (root_name == "partnerform") {
      root_wnd = HeroController.getInstance().getHeroFormRoot();
    } else if (root_name == "partnereinfoview") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroMianInfoRoot();
    } else if (root_name == "partnergofight") {
      var HeroController = require("hero_controller");
 
      root_wnd = HeroController.getInstance().getHeroGoFightRoot();
    } else if (root_name == "adventureevtview") {
      root_wnd = AdventureController.getInstance().getAdventureEvtRoot();
    } else if (root_name == "esecsiceview") {
      var EsecsiceController = require("esecsice_controller");
 
      root_wnd = EsecsiceController.getInstance().getEsecsiceRoot();
    } else if (root_name == "stonedunview") {
      var Stone_dungeonController = require("stone_dungeon_controller");
 
      root_wnd = Stone_dungeonController.getInstance().getStoneDungeonRoot();
    } else if (root_name == "varietystoreview") {
      var MallController = require("mall_controller");
 
      root_wnd = MallController.getInstance().getVarietyStoreRoot();
    } else if (root_name == "summon") {
      var PartnersummonController = require("partnersummon_controller");
 
      root_wnd = PartnersummonController.getInstance().getSummonItemRoot();
    } else if (root_name == "summonshow") {
      var PartnersummonController = require("partnersummon_controller");
 
      root_wnd = PartnersummonController.getInstance().getSummonShowRoot();
    } else if (root_name == "summonresult") {
      var PartnersummonController = require("partnersummon_controller");
 
      root_wnd = PartnersummonController.getInstance().getSummonResultRoot();
    } else if (root_name == "arenaloopview") {
      var ArenaController = require("arena_controller");
 
      root_wnd = ArenaController.getInstance().getArenaRoot();
    } else if (root_name == "voyageview") {
      var VoyageController = require("voyage_controller");
 
      root_wnd = VoyageController.getInstance().getVoyageMainRoot();
    } else if (root_name == "voyagedispatchview") {
      var VoyageController = require("voyage_controller");
 
      root_wnd = VoyageController.getInstance().getVoyageDispatchRoot();
    } else if (root_name == "forge_house_window") {
      var ForgeController = require("forgehouse_controller");
 
      root_wnd = ForgeController.getInstance().getForgeHouseRoot();
    } else if (root_name == "forge_artifact_panel") {
      var ForgeController = require("forgehouse_controller");
 
      root_wnd = ForgeController.getInstance().getForgeArtifactRoot();
    } else if (root_name == "guild_main_window") {
      var GuildController = require("guild_controller");
 
      root_wnd = GuildController.getInstance().getGuildMainRootWnd();
    } else if (root_name == "guildboss_main_window") {
      var GuildController = require("guildboss_controller");
 
      root_wnd = GuildController.getInstance().getGuildBossMainRootWnd();
    } else if (root_name == "battle_drama_reward_window") {
      var BattleDramaController = require("battle_drama_controller");
 
      root_wnd = BattleDramaController.getInstance().getDramaBattlePassRewardRoot();
    } else if (root_name == "backpack_window_3") {
      var BackpackController = require("backpack_controller");
 
      root_wnd = BackpackController.getInstance().getBackpackRoot();
    } else if (root_name == "backpack_comp_tips_window") {
      var TipsController = require("tips_controller");
 
      root_wnd = TipsController.getInstance().getCompTipsRoot();
    }
 
    this.target_root_wnd = root_wnd; // this.findTargetNode();
 
    if (this.target_root_wnd) {
      gcore.Timer.set(function () {
        this.findTargetNode();
      }.bind(this), 50, 1);
      if (this.timer_hander) this.removeTimer();
    } else {
      if (!this.timer_hander) {
        this.effect_con_nd.active = false;
        this.timer_hander = this.startUpdate(10, this.findRootWndByCondition.bind(this), 300);
      }
    }
 
    if (num && num >= 10) {
      this.effect_con_nd.active = false;
      this.step = 10;
      window.TASK_TIPS = false;
    }
  },
  delayPlayNextGuide: function delayPlayNextGuide(delay_time) {
    if (this.hasTicket("delayPlayNextGuide")) {
      this.delTicker("delayPlayNextGuide");
    }
 
    this.addTicket(this.findTargetNode.bind(this), delay_time, "delayPlayNextGuide");
  },
  removeTimer: function removeTimer() {
    if (this.timer_hander) {
      this.stopUpdate(this.timer_hander);
      this.time_num = 0;
      this.timer_hander = null;
    }
  },
  //寻找目标界面的子节点
  findTargetNode: function findTargetNode(num) {
    if (!this.target_data[this.step]) {
      this.effect_con_nd.active = false;
      window.TASK_TIPS = false;
      return;
    }
 
    var target_name = this.target_data[this.step][1];
    var real_name = GuideConst.NodeKeys[target_name];
    var name_info = GuideConst.getNameInfo(target_name);
    if (!real_name) real_name = target_name;
 
    if (name_info && name_info.length == 2) {
      if (name_info[0] == "tag") {
        this.target = this.seekChildByTag(this.target_root_wnd, name_info[1]);
        this.target_name = name_info[1];
      }
    } else {
      if (this.target_data[this.step][0] == "arenaloopview") {
        this.target = this.seekChildByTag(this.target_root_wnd, real_name);
      } else if (this.target_data[this.step][0] == "forge_house_window" && real_name == "tab_btn_2") {
        var top = this.seekChild(this.target_root_wnd, "top_container");
        this.target = this.seekChild(top, real_name);
      } else {
        this.target = this.seekChild(this.target_root_wnd, real_name);
      }
 
      this.target_name = real_name;
    }
 
    cc.log("targe", this.target);
 
    if (this.target) {
      this.removeTimer();
      this.drawTargetRect();
    } else {
      if (!this.timer_hander) {
        this.time_num = 0;
        this.timer_hander = this.startUpdate(6, this.findTargetNode.bind(this), 1000);
      } //
      // return
 
    }
 
    if (num && num >= 5) {
      this.removeTimer();
      this.effect_con_nd.active = false;
      this.model.setTaskGuideLastPos(null);
      window.TASK_TIPS = false; // this.endPlayGuide(true);
    }
  },
  drawTargetRect: function drawTargetRect() {
    if (this.target) {
      this.clip_con_nd.active = true;
      this.effect_con_nd.active = true; // this.background_bi.enabled = false;
 
      var target_pos_1 = this.target.convertToWorldSpaceAR(cc.v2(0, 0));
      var target_pos = this.root_wnd.convertToNodeSpaceAR(target_pos_1);
      if (target_pos.y < target_pos_1.y) target_pos.y = target_pos_1.y;
      var final_posX = target_pos.x + (0.5 - this.target.anchorX) * this.target.width;
      var final_posY = target_pos.y + (0.5 - this.target.anchorY) * this.target.height;
      var final_pos = cc.v2(final_posX, final_posY);
      cc.log(final_pos);
      this.clip_con_nd.position = final_pos;
      this.clip_con_nd.width = this.target.width;
      this.clip_con_nd.height = this.target.height;
      this.show_guide_step = true;
 
      if (this.show_guide_step) {
        // 显示手指
        var last_pos = this.model.getTaskGuideLastPos(); // 显示手指
 
        var action_name = PlayerAction.action_1;
        if (last_pos) action_name = PlayerAction.action_2;
        var eff_res = PathTool.getEffectRes(240);
        var eff_path = PathTool.getSpinePath(eff_res);
        this.loadRes(eff_path, function (action_name, eff_sd) {
          this.effect_con_sk.skeletonData = eff_sd;
          this.effect_con_sk.setAnimation(0, action_name, true);
        }.bind(this, action_name));
        this.effect_con_nd.stopAllActions();
 
        if (last_pos) {
          var move_dis = this.calDistanch(final_pos, last_pos);
          var time = move_dis / GuideConst.Finger_Speed;
          var call_func = cc.callFunc(function () {
            this.effect_con_sk.setAnimation(0, PlayerAction.action_1, true);
            this.finish_action = true;
          }, this);
          var move_act = cc.moveTo(time, final_pos);
          var act_queqe = cc.sequence(move_act, call_func);
          this.effect_con_nd.runAction(act_queqe);
          this.finish_action = false;
        } else {
          this.effect_con_nd.position = final_pos;
        }
      }
 
      this.model.setTaskGuideLastPos(final_pos);
    }
  },
  calDistanch: function calDistanch(pos1, pos2) {
    return Math.sqrt(Math.pow(pos1.x - pos2.x, 2) + Math.pow(pos1.y - pos2.y, 2));
  },
  playNextGuide: function playNextGuide() {
    this.saveGuideStep();
 
    if (!this.act_list || this.act_list.length == 0) {
      this.endPlayGuide();
    } else {
      this.target_data = this.act_list.shift();
      this.guide_step = this.guide_step + 1;
      cc.log("当前步骤的数据");
      cc.log(this.target_data); // 判断当前步骤是否已经做过了,
 
      if (this.guide_cache_data[this.act_config.id] && this.guide_cache_data[this.act_config.id][this.guide_step] && !this.cur_zone_list[this.guide_step]) {
        this.playNextGuide();
      } else {
        if (this.target_data) {
          this.findRootWndByCondition();
        }
      }
    }
  },
  endPlayGuide: function endPlayGuide(is_skip) {
    cc.log("结束当前引导---" + this.act_config.id);
    this.step = 0;
    if (this.model) this.model.setTaskGuideLastPos(null);
  },
  saveGuideStep: function saveGuideStep() {// if (this.config && this.config.over_step && this.config.over_step == this.guide_step) {
    //     if (!this.guide_cache_data[this.config.id])
    //         this.guide_cache_data[this.config.id] = {}
    //     this.guide_cache_data[this.config.id][this.config.over_step] = true;
    //     var RoleController = require("role_controller")
    //     var role_vo = RoleController.getInstance().getRoleVo();
    //     cc.sys.localStorage.setItem("task_guide_data" + role_vo.srv_id + role_vo.rid, JSON.stringify(this.guide_cache_data));
    // }
  },
  getEffectActive: function getEffectActive() {
    if (this.effect_con_nd) {
      return this.effect_con_nd.active;
    }
 
    return false;
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    this.removeTimer();
    this.ctrl.openTaskGuideWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlkZVxcdmlld1xcdGFza19ndWlkZV93aW5kb3cuanMiXSwibmFtZXMiOlsiUGF0aFRvb2wiLCJyZXF1aXJlIiwiR3VpZGVDb250cm9sbGVyIiwiR3VpZGVDb25zdCIsIkd1aWRlRXZlbnQiLCJUYXNrRXZlbnQiLCJUYXNrQ29udHJvbGxlciIsIlRhc2tfZ3VpZGVXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwibXNnIiwiaW5pdENvbmZpZyIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJ0YXNrX2N0cmwiLCJ0YXNrX21vZGVsIiwic3RlcCIsInRpbWVyX2hhbmRlciIsIm9wZW5DYWxsQmFjayIsImdhbWUiLCJ2aWV3c19qcyIsImNhbmNlbFRvdWNoIiwicm9vdF93ZyIsInJvb3Rfd25kIiwiZ2V0Q29tcG9uZW50IiwiV2lkZ2V0Iiwid2luZG93IiwiRklUX1NDQUxFIiwiaXNBbGlnblRvcCIsImlzQWxpZ25Cb3R0b20iLCJiYWNrZ3JvdW5kX25kIiwic2Vla0NoaWxkIiwiY2xpcF9jb25fbmQiLCJlZmZlY3RfY29uX25kIiwiZWZmZWN0X2Nvbl9zayIsInNwIiwiU2tlbGV0b24iLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJUYXNrTmV4dFN0ZXAiLCJkYXRhIiwidGFyZ2V0X25hbWUiLCJmaW5kUm9vdFduZEJ5Q29uZGl0aW9uIiwiaGFuZGxlRWZmZWN0Iiwicm9vdF9uYW1lIiwidGFyZ2V0X2RhdGEiLCJDbG9zZVRhc2tFZmZlY3QiLCJzZXRUYXNrR3VpZGVMYXN0UG9zIiwiVEFTS19USVBTIiwiVXBkYXRlTWFpblF1ZXN0VGFzayIsImNvbmZpZyIsImFjdGl2ZSIsImZpbmlzaCIsIk9wZW5UYXNrRWZmZWN0Iiwibm9kZSIsInRhc2tfdGlwcyIsInRhcmdldF9yb290X3duZCIsImZpbmRUYXJnZXROb2RlIiwibmFtZSIsIm9wZW5Sb290V25kIiwiZHJhbWFfZWZmIiwibG9nIiwicmVtb3ZlVGltZXIiLCJnZXRUYXNrVGlwc0VmZmVjdE5kIiwic2V0VmlzaWJsZVN0YXR1cyIsInN0YXR1cyIsInNldFZpc2libGUiLCJnZXRUYXNrVGlwc1BhbmVsIiwidGFyZ2V0IiwiZHJhd1RhcmdldFJlY3QiLCJzZXRUb1NldHVwUG9zZSIsImNsZWFyVHJhY2tzIiwiZWZmX3JlcyIsImdldEVmZmVjdFJlcyIsImVmZl9wYXRoIiwiZ2V0U3BpbmVQYXRoIiwibG9hZFJlcyIsInJlc19vYmplY3QiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb24iLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb25fMSIsImJpbmQiLCJudW0iLCJIZXJvQ29udHJvbGxlciIsImdldEhlcm9CYWdSb290IiwiQmF0dGxlQ29udHJvbGxlciIsImdldERyYW1hRmlnaHRVSSIsImdldEN0cmxCYXR0bGVTY2VuZSIsIkFkdmVudHVyZUNvbnRyb2xsZXIiLCJnZXRBZHZlbnR1cmVSb290IiwiZ2V0SGVyb0Zvcm1Sb290IiwiZ2V0SGVyb01pYW5JbmZvUm9vdCIsImdldEhlcm9Hb0ZpZ2h0Um9vdCIsImdldEFkdmVudHVyZUV2dFJvb3QiLCJFc2Vjc2ljZUNvbnRyb2xsZXIiLCJnZXRFc2Vjc2ljZVJvb3QiLCJTdG9uZV9kdW5nZW9uQ29udHJvbGxlciIsImdldFN0b25lRHVuZ2VvblJvb3QiLCJNYWxsQ29udHJvbGxlciIsImdldFZhcmlldHlTdG9yZVJvb3QiLCJQYXJ0bmVyc3VtbW9uQ29udHJvbGxlciIsImdldFN1bW1vbkl0ZW1Sb290IiwiZ2V0U3VtbW9uU2hvd1Jvb3QiLCJnZXRTdW1tb25SZXN1bHRSb290IiwiQXJlbmFDb250cm9sbGVyIiwiZ2V0QXJlbmFSb290IiwiVm95YWdlQ29udHJvbGxlciIsImdldFZveWFnZU1haW5Sb290IiwiZ2V0Vm95YWdlRGlzcGF0Y2hSb290IiwiRm9yZ2VDb250cm9sbGVyIiwiZ2V0Rm9yZ2VIb3VzZVJvb3QiLCJnZXRGb3JnZUFydGlmYWN0Um9vdCIsIkd1aWxkQ29udHJvbGxlciIsImdldEd1aWxkTWFpblJvb3RXbmQiLCJnZXRHdWlsZEJvc3NNYWluUm9vdFduZCIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsImdldERyYW1hQmF0dGxlUGFzc1Jld2FyZFJvb3QiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJnZXRCYWNrcGFja1Jvb3QiLCJUaXBzQ29udHJvbGxlciIsImdldENvbXBUaXBzUm9vdCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJzdGFydFVwZGF0ZSIsImRlbGF5UGxheU5leHRHdWlkZSIsImRlbGF5X3RpbWUiLCJoYXNUaWNrZXQiLCJkZWxUaWNrZXIiLCJhZGRUaWNrZXQiLCJzdG9wVXBkYXRlIiwidGltZV9udW0iLCJyZWFsX25hbWUiLCJOb2RlS2V5cyIsIm5hbWVfaW5mbyIsImdldE5hbWVJbmZvIiwibGVuZ3RoIiwic2Vla0NoaWxkQnlUYWciLCJ0b3AiLCJ0YXJnZXRfcG9zXzEiLCJjb252ZXJ0VG9Xb3JsZFNwYWNlQVIiLCJ2MiIsInRhcmdldF9wb3MiLCJjb252ZXJ0VG9Ob2RlU3BhY2VBUiIsInkiLCJmaW5hbF9wb3NYIiwieCIsImFuY2hvclgiLCJ3aWR0aCIsImZpbmFsX3Bvc1kiLCJhbmNob3JZIiwiaGVpZ2h0IiwiZmluYWxfcG9zIiwicG9zaXRpb24iLCJzaG93X2d1aWRlX3N0ZXAiLCJsYXN0X3BvcyIsImdldFRhc2tHdWlkZUxhc3RQb3MiLCJhY3Rpb25fbmFtZSIsImFjdGlvbl8yIiwiZWZmX3NkIiwic3RvcEFsbEFjdGlvbnMiLCJtb3ZlX2RpcyIsImNhbERpc3RhbmNoIiwidGltZSIsIkZpbmdlcl9TcGVlZCIsImNhbGxfZnVuYyIsImNhbGxGdW5jIiwiZmluaXNoX2FjdGlvbiIsIm1vdmVfYWN0IiwibW92ZVRvIiwiYWN0X3F1ZXFlIiwic2VxdWVuY2UiLCJydW5BY3Rpb24iLCJwb3MxIiwicG9zMiIsIk1hdGgiLCJzcXJ0IiwicG93IiwicGxheU5leHRHdWlkZSIsInNhdmVHdWlkZVN0ZXAiLCJhY3RfbGlzdCIsImVuZFBsYXlHdWlkZSIsInNoaWZ0IiwiZ3VpZGVfc3RlcCIsImd1aWRlX2NhY2hlX2RhdGEiLCJhY3RfY29uZmlnIiwiaWQiLCJjdXJfem9uZV9saXN0IiwiaXNfc2tpcCIsImdldEVmZmVjdEFjdGl2ZSIsImNsb3NlQ2FsbEJhY2siLCJvcGVuVGFza0d1aWRlV2luZG93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEIsRUFDQTs7O0FBQ0EsSUFBSUMsZUFBZSxHQUFHRCxPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBQ0EsSUFBSUUsVUFBVSxHQUFHRixPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxhQUFELENBQXhCLEVBQ0E7OztBQUNBLElBQUlJLFNBQVMsR0FBR0osT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUssY0FBYyxHQUFHTCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBRUEsSUFBSU0sZ0JBQWdCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzVCLGFBQVNDLFFBRG1CO0FBRTVCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCWixRQUFRLENBQUNhLGFBQVQsQ0FBdUIsT0FBdkIsRUFBZ0MsaUJBQWhDLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLEdBQXpCLENBRmMsQ0FFK0I7QUFDN0M7QUFDSCxHQU4yQjtBQVE1QjtBQUNBQyxFQUFBQSxVQUFVLEVBQUUsc0JBQVk7QUFDcEIsU0FBS0MsSUFBTCxHQUFZaEIsZUFBZSxDQUFDaUIsV0FBaEIsRUFBWjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxLQUFLRixJQUFMLENBQVVHLFFBQVYs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LEVBQUUseUJBQVksQ0FDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNILEdBL2MyQjtBQWlkNUJVLEVBQUFBLGVBQWUsRUFBRSwyQkFBWTtBQUN6QixRQUFJLEtBQUs3SixhQUFULEVBQXdCO0FBQ3BCLGFBQU8sS0FBS0EsYUFBTCxDQUFtQmtCLE1BQTFCO0FBQ0g7O0FBQ0QsV0FBTyxLQUFQO0FBQ0gsR0F0ZDJCO0FBd2Q1QjtBQUNBNEksRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBRXZCLFNBQUtqSSxXQUFMO0FBQ0EsU0FBS3BELElBQUwsQ0FBVXNMLG1CQUFWLENBQThCLEtBQTlCO0FBQ0g7QUE3ZDJCLENBQVQsQ0FBdkIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA4LTE2IDE3OjA5OjE3XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xuLy8gdmFyIEhhbGxvd3NFdmVudCA9IHJlcXVpcmUoXCJoYWxsb3dzX2V2ZW50XCIpO1xudmFyIEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWRlQ29uc3QgPSByZXF1aXJlKFwiZ3VpZGVfY29uc3RcIik7XG52YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcbi8vIHZhciBIYWxsb3dzQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoYWxsb3dzX2NvbnRyb2xsZXJcIik7XG52YXIgVGFza0V2ZW50ID0gcmVxdWlyZShcInRhc2tfZXZlbnRcIik7XG52YXIgVGFza0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGFza19jb250cm9sbGVyXCIpO1xuXG52YXIgVGFza19ndWlkZVdpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJkcmFtYVwiLCBcInRhc2tfZ3VpZGVfdmlld1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLm1zZzsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIC8vIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIC8vIHRoaXMuaGFsbG93X2N0cmwgPSBIYWxsb3dzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAvLyB0aGlzLmhhbGxvd19tb2RlbCA9IHRoaXMuaGFsbG93X2N0cmwuZ2V0TW9kZWwoKTtcbiAgICAgICAgdGhpcy50YXNrX2N0cmwgPSBUYXNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLnRhc2tfbW9kZWwgPSB0aGlzLnRhc2tfY3RybC5nZXRNb2RlbCgpO1xuXG4gICAgICAgIHRoaXMuc3RlcCA9IDA7ICAvL+atpeaVsDDlvIDlp4vvvIzlr7nlupTmlbDnu4TnrKww5LiqXG4gICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZ2FtZS52aWV3c19qcylcbiAgICAgICAgICAgIGdhbWUudmlld3NfanMuY2FuY2VsVG91Y2goKTtcblxuICAgICAgICB0aGlzLnJvb3Rfd2cgPSB0aGlzLnJvb3Rfd25kLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICBpZiAod2luZG93LkZJVF9TQ0FMRSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdF93Zy5pc0FsaWduVG9wID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93Zy5pc0FsaWduQm90dG9tID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZF9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiY2xpcF9jb25cIik7XG4gICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwiZWZmZWN0X2NvblwiKTtcbiAgICAgICAgdGhpcy5lZmZlY3RfY29uX3NrID0gdGhpcy5zZWVrQ2hpbGQoXCJlZmZlY3RfY29uXCIsIHNwLlNrZWxldG9uKTtcblxuICAgICAgICAvLyB0aGlzLmhhbmRsZUVmZmVjdCh0cnVlKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL+eVjOmdoueCueWHu++8jOinpuWPkeS4i+S4gOatpeeJueaViFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWRlRXZlbnQuVGFza05leHRTdGVwLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgLy8gY2MubG9nKGRhdGEsIHRoaXMudGFyZ2V0X25hbWUpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5yb290X25hbWUgPT0gXCJzdW1tb25zaG93XCIgJiYgZGF0YSA9PSBcImNvbmZpcm1fYnRuXCIpIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBpZiAodGhpcy50YXJnZXRfbmFtZSkge1xuICAgICAgICAgICAgLy8gICAgIGlmICh0aGlzLnRhcmdldF9uYW1lID09IGRhdGEpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5zdGVwICs9IDE7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09IFwicXVpY2tfYnRuXCIgfHwgZGF0YSA9PSBcInF1aWNrX2FkZF9idG5cIiB8fCBkYXRhID09IFwiY29tcG91bmRfYnRuXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfbmFtZSA9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRSb290V25kQnlDb25kaXRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT0gXCJjaGFsbGVuZ2VfYnRuXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfbmFtZSA9PSBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwICsgMV1bMF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v55WM6Z2i5YWz6Zet77yM5Y+W5raI54m55pWIXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpZGVFdmVudC5DbG9zZVRhc2tFZmZlY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcCA9IDEwO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICB9LCB0aGlzKVxuIFxuICAgICAgICAvLyB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5VcGRhdGVIYWxsb3dzVGFza0V2ZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5lZmZlY3RfY29uX25kKXtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gdGhpcy5oYWxsb3dfbW9kZWwuZ2V0SGFsbG93c1Rha3ModGhpcy5jb25maWcuaWQpLmZpbmlzaCA8IDE7XG4gICAgICAgIC8vICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmU7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChUYXNrRXZlbnQuVXBkYXRlTWFpblF1ZXN0VGFzaywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmVmZmVjdF9jb25fbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZGF0YS5maW5pc2ggPCAxO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5UQVNLX1RJUFMgPSB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIGlmIChub2RlID09IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwICsgMV1bMF0pIHtcbiAgICAgICAgICAgIC8vICAgICBjYy5sb2coXCJub2RlXCIsbm9kZSlcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5oYW5kbGVFZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnN0ZXAgPSAxMDtcbiAgICAgICAgICAgIC8vICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobm9kZS50YXNrX3RpcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcCArPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRhcmdldE5vZGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT0gXCJndWlkZV9tYWluX3ZpZXdcIiB8fCB3aW5kb3cuVEFTS19USVBTID09IGZhbHNlIHx8IG5vZGUubmFtZSA9PSBcImFyZW5hX2xvb3BfbWF0Y2hfd2luZG93XCIpIHJldHVyblxuICAgICAgICAgICAgaWYgKHRoaXMucm9vdF9uYW1lID09IFwiZm9yZ2VfaG91c2Vfd2luZG93XCIgfHwgdGhpcy5yb290X25hbWUgPT0gXCJndWlsZGJvc3NfbWFpbl93aW5kb3dcIikgcmV0dXJuXG4gICAgICAgICAgICB0aGlzLnRhcmdldF9yb290X3duZCA9IG5vZGU7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0ZXAgKz0gMTtcbiAgICAgICAgICAgIGlmKG5vZGUubmFtZSA9PSBcImJhdHRsZV9kcmFtYV9yZXdhcmRfd2luZG93XCIpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3RlcCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbmRUYXJnZXROb2RlKCk7XG4gICAgICAgIH0sIHRoaXMpXG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnRhcmdldF9kYXRhID0gY29uZmlnLmRyYW1hX2VmZjtcbiAgICAgICAgY2MubG9nKFwidGFyZ2V0XCIsIHRoaXMudGFyZ2V0X2RhdGEpXG4gICAgICAgIHRoaXMuc3RlcCA9IDA7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0VGFza0d1aWRlTGFzdFBvcyhudWxsKTtcbiAgICAgICAgaWYgKHRoaXMudGltZXJfaGFuZGVyKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICB0aGlzLmdldFRhc2tUaXBzRWZmZWN0TmQoKTtcbiAgICAgICAgdGhpcy5maW5kUm9vdFduZEJ5Q29uZGl0aW9uKCk7XG4gICAgfSxcblxuICAgIHNldFZpc2libGVTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMsIGNvbmZpZykge1xuICAgICAgICB0aGlzLnNldFZpc2libGUoc3RhdHVzKTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKG51bGwpO1xuICAgICAgICAvLyB0aGlzLmhhbmRsZUVmZmVjdChzdGF0dXMpO1xuICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnRhcmdldF9kYXRhID0gY29uZmlnLmRyYW1hX2VmZjtcbiAgICAgICAgY2MubG9nKFwidGFyZ2V0XCIsIHRoaXMudGFyZ2V0X2RhdGEpO1xuICAgICAgICB0aGlzLnN0ZXAgPSAwO1xuICAgICAgICB0aGlzLmdldFRhc2tUaXBzRWZmZWN0TmQoKTtcbiAgICAgICAgdGhpcy5maW5kUm9vdFduZEJ5Q29uZGl0aW9uKCk7XG4gICAgfSxcblxuICAgIGdldFRhc2tUaXBzRWZmZWN0TmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRUYXNrVGlwc1BhbmVsKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5zZWVrQ2hpbGQobm9kZSwgXCJtYWluXCIpO1xuICAgICAgICB0aGlzLmRyYXdUYXJnZXRSZWN0KCk7XG4gICAgfSxcblxuICAgIC8v5omL5oyH54m55pWI5pi+56S6XG4gICAgaGFuZGxlRWZmZWN0OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fc2spIHtcbiAgICAgICAgICAgICAgICB2YXIgZWZmX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygyNDApO1xuICAgICAgICAgICAgICAgIHZhciBlZmZfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZfcmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoZWZmX3BhdGgsIGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fc2suc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMSwgdHJ1ZSlcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICBmaW5kUm9vdFduZEJ5Q29uZGl0aW9uOiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnRhcmdldF9kYXRhIHx8ICF0aGlzLnRhcmdldF9kYXRhWzBdKSB7XG4gICAgICAgICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5UQVNLX1RJUFMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvb3RfbmFtZSA9IHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwXVswXTtcbiAgICAgICAgY2MubG9nKHJvb3RfbmFtZSlcbiAgICAgICAgdGhpcy5yb290X25hbWUgPSByb290X25hbWU7XG4gICAgICAgIHZhciByb290X3duZCA9IG51bGw7XG4gICAgICAgIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyXCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0JhZ1Jvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZXRvcHNjZW5lXCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0RHJhbWFGaWdodFVJKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmF0dGxlc2NlbmV2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Q3RybEJhdHRsZVNjZW5lKClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVzY2VuZVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEFkdmVudHVyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRBZHZlbnR1cmVSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZm9ybVwiKSB7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0Zvcm1Sb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJwYXJ0bmVyZWluZm92aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb01pYW5JbmZvUm9vdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInBhcnRuZXJnb2ZpZ2h0XCIpIHtcbiAgICAgICAgICAgIHZhciBIZXJvQ29udHJvbGxlciA9IHJlcXVpcmUoXCJoZXJvX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SGVyb0dvRmlnaHRSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhZHZlbnR1cmVldnR2aWV3XCIpIHtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gQWR2ZW50dXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEFkdmVudHVyZUV2dFJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImVzZWNzaWNldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgRXNlY3NpY2VDb250cm9sbGVyID0gcmVxdWlyZShcImVzZWNzaWNlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEVzZWNzaWNlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEVzZWNzaWNlUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic3RvbmVkdW52aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBTdG9uZV9kdW5nZW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJzdG9uZV9kdW5nZW9uX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IFN0b25lX2R1bmdlb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0U3RvbmVEdW5nZW9uUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwidmFyaWV0eXN0b3Jldmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZhcmlldHlTdG9yZVJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInN1bW1vblwiKSB7XG4gICAgICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vbkl0ZW1Sb290KCk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwic3VtbW9uc2hvd1wiKSB7XG4gICAgICAgICAgICB2YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBQYXJ0bmVyc3VtbW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFN1bW1vblNob3dSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJzdW1tb25yZXN1bHRcIikge1xuICAgICAgICAgICAgdmFyIFBhcnRuZXJzdW1tb25Db250cm9sbGVyID0gcmVxdWlyZShcInBhcnRuZXJzdW1tb25fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdW1tb25SZXN1bHRSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJhcmVuYWxvb3B2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBBcmVuYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYXJlbmFfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gQXJlbmFDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0QXJlbmFSb290KClcbiAgICAgICAgfSBlbHNlIGlmIChyb290X25hbWUgPT0gXCJ2b3lhZ2V2aWV3XCIpIHtcbiAgICAgICAgICAgIHZhciBWb3lhZ2VDb250cm9sbGVyID0gcmVxdWlyZShcInZveWFnZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBWb3lhZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Vm95YWdlTWFpblJvb3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcInZveWFnZWRpc3BhdGNodmlld1wiKSB7XG4gICAgICAgICAgICB2YXIgVm95YWdlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ2b3lhZ2VfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gVm95YWdlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFZveWFnZURpc3BhdGNoUm9vdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocm9vdF9uYW1lID09IFwiZm9yZ2VfaG91c2Vfd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBGb3JnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBGb3JnZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRGb3JnZUhvdXNlUm9vdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImZvcmdlX2FydGlmYWN0X3BhbmVsXCIpIHtcbiAgICAgICAgICAgIHZhciBGb3JnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBGb3JnZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRGb3JnZUFydGlmYWN0Um9vdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImd1aWxkX21haW5fd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBHdWlsZENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpbGRfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIHJvb3Rfd25kID0gR3VpbGRDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0R3VpbGRNYWluUm9vdFduZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImd1aWxkYm9zc19tYWluX3dpbmRvd1wiKSB7XG4gICAgICAgICAgICB2YXIgR3VpbGRDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBHdWlsZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRHdWlsZEJvc3NNYWluUm9vdFduZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3RfbmFtZSA9PSBcImJhdHRsZV9kcmFtYV9yZXdhcmRfd2luZG93XCIpIHtcbiAgICAgICAgICAgIHZhciBCYXR0bGVEcmFtYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICByb290X3duZCA9IEJhdHRsZURyYW1hQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldERyYW1hQmF0dGxlUGFzc1Jld2FyZFJvb3QoKTtcbiAgICAgICAgfVxuICAgICAgICAgZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmFja3BhY2tfd2luZG93XzNcIikge1xuICAgICAgICAgICAgdmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRCYWNrcGFja1Jvb3QoKTtcbiAgICAgICAgfVxuICAgICAgICAgZWxzZSBpZiAocm9vdF9uYW1lID09IFwiYmFja3BhY2tfY29tcF90aXBzX3dpbmRvd1wiKSB7XG4gICAgICAgICAgICB2YXIgVGlwc0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgcm9vdF93bmQgPSBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldENvbXBUaXBzUm9vdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFyZ2V0X3Jvb3Rfd25kID0gcm9vdF93bmQ7XG5cbiAgICAgICAgLy8gdGhpcy5maW5kVGFyZ2V0Tm9kZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldF9yb290X3duZCkge1xuXG4gICAgICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZFRhcmdldE5vZGUoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgNTAsIDEpXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVyX2hhbmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVyX2hhbmRlciA9IHRoaXMuc3RhcnRVcGRhdGUoMTAsIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbi5iaW5kKHRoaXMpLCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bSAmJiBudW0gPj0gMTApIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RlcCA9IDEwO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlbGF5UGxheU5leHRHdWlkZTogZnVuY3Rpb24gKGRlbGF5X3RpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlja2V0KFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmRlbFRpY2tlcihcImRlbGF5UGxheU5leHRHdWlkZVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFRpY2tldCh0aGlzLmZpbmRUYXJnZXROb2RlLmJpbmQodGhpcyksIGRlbGF5X3RpbWUsIFwiZGVsYXlQbGF5TmV4dEd1aWRlXCIpO1xuICAgIH0sXG5cbiAgICByZW1vdmVUaW1lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lcl9oYW5kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcFVwZGF0ZSh0aGlzLnRpbWVyX2hhbmRlcik7XG4gICAgICAgICAgICB0aGlzLnRpbWVfbnVtID0gMDtcbiAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+Wvu+aJvuebruagh+eVjOmdoueahOWtkOiKgueCuVxuICAgIGZpbmRUYXJnZXROb2RlOiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIGlmICghdGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdKSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB3aW5kb3cuVEFTS19USVBTID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGFyZ2V0X25hbWUgPSB0aGlzLnRhcmdldF9kYXRhW3RoaXMuc3RlcF1bMV07XG4gICAgICAgIHZhciByZWFsX25hbWUgPSBHdWlkZUNvbnN0Lk5vZGVLZXlzW3RhcmdldF9uYW1lXTtcbiAgICAgICAgdmFyIG5hbWVfaW5mbyA9IEd1aWRlQ29uc3QuZ2V0TmFtZUluZm8odGFyZ2V0X25hbWUpO1xuXG4gICAgICAgIGlmICghcmVhbF9uYW1lKVxuICAgICAgICAgICAgcmVhbF9uYW1lID0gdGFyZ2V0X25hbWU7XG5cbiAgICAgICAgaWYgKG5hbWVfaW5mbyAmJiBuYW1lX2luZm8ubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgIGlmIChuYW1lX2luZm9bMF0gPT0gXCJ0YWdcIikge1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5zZWVrQ2hpbGRCeVRhZyh0aGlzLnRhcmdldF9yb290X3duZCwgbmFtZV9pbmZvWzFdKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldF9uYW1lID0gbmFtZV9pbmZvWzFdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfZGF0YVt0aGlzLnN0ZXBdWzBdID09IFwiYXJlbmFsb29wdmlld1wiICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkQnlUYWcodGhpcy50YXJnZXRfcm9vdF93bmQsIHJlYWxfbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFyZ2V0X2RhdGFbdGhpcy5zdGVwXVswXSA9PSBcImZvcmdlX2hvdXNlX3dpbmRvd1wiICYmIHJlYWxfbmFtZSA9PSBcInRhYl9idG5fMlwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGFyZ2V0X3Jvb3Rfd25kLCBcInRvcF9jb250YWluZXJcIilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuc2Vla0NoaWxkKHRvcCwgcmVhbF9uYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnRhcmdldF9yb290X3duZCwgcmVhbF9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGFyZ2V0X25hbWUgPSByZWFsX25hbWU7XG4gICAgICAgIH1cbiAgICAgICAgY2MubG9nKFwidGFyZ2VcIiwgdGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGFyZ2V0UmVjdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVyX2hhbmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV9udW0gPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZXJfaGFuZGVyID0gdGhpcy5zdGFydFVwZGF0ZSg2LCB0aGlzLmZpbmRUYXJnZXROb2RlLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bSAmJiBudW0gPj0gNSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKG51bGwpO1xuICAgICAgICAgICAgd2luZG93LlRBU0tfVElQUyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gdGhpcy5lbmRQbGF5R3VpZGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZHJhd1RhcmdldFJlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMuYmFja2dyb3VuZF9iaS5lbmFibGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHZhciB0YXJnZXRfcG9zXzEgPSB0aGlzLnRhcmdldC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdmFyIHRhcmdldF9wb3MgPSB0aGlzLnJvb3Rfd25kLmNvbnZlcnRUb05vZGVTcGFjZUFSKHRhcmdldF9wb3NfMSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0X3Bvcy55IDwgdGFyZ2V0X3Bvc18xLnkpXG4gICAgICAgICAgICAgICAgdGFyZ2V0X3Bvcy55ID0gdGFyZ2V0X3Bvc18xLnk7XG4gICAgICAgICAgICB2YXIgZmluYWxfcG9zWCA9IHRhcmdldF9wb3MueCArICgwLjUgLSB0aGlzLnRhcmdldC5hbmNob3JYKSAqIHRoaXMudGFyZ2V0LndpZHRoO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3Bvc1kgPSB0YXJnZXRfcG9zLnkgKyAoMC41IC0gdGhpcy50YXJnZXQuYW5jaG9yWSkgKiB0aGlzLnRhcmdldC5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgZmluYWxfcG9zID0gY2MudjIoZmluYWxfcG9zWCwgZmluYWxfcG9zWSk7XG5cbiAgICAgICAgICAgIGNjLmxvZyhmaW5hbF9wb3MpO1xuXG4gICAgICAgICAgICB0aGlzLmNsaXBfY29uX25kLnBvc2l0aW9uID0gZmluYWxfcG9zO1xuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC53aWR0aCA9IHRoaXMudGFyZ2V0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5jbGlwX2Nvbl9uZC5oZWlnaHQgPSB0aGlzLnRhcmdldC5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd19ndWlkZV9zdGVwID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dfZ3VpZGVfc3RlcCkgeyAgLy8g5pi+56S65omL5oyHXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RfcG9zID0gdGhpcy5tb2RlbC5nZXRUYXNrR3VpZGVMYXN0UG9zKCk7XG5cbiAgICAgICAgICAgICAgICAvLyDmmL7npLrmiYvmjIdcbiAgICAgICAgICAgICAgICB2YXIgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzE7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfcG9zKVxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcbiAgICAgICAgICAgICAgICB2YXIgZWZmX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygyNDApO1xuICAgICAgICAgICAgICAgIHZhciBlZmZfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZfcmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoZWZmX3BhdGgsIGZ1bmN0aW9uIChhY3Rpb25fbmFtZSwgZWZmX3NkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5za2VsZXRvbkRhdGEgPSBlZmZfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBhY3Rpb25fbmFtZSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RfcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX2RpcyA9IHRoaXMuY2FsRGlzdGFuY2goZmluYWxfcG9zLCBsYXN0X3Bvcyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbW92ZV9kaXMgLyBHdWlkZUNvbnN0LkZpbmdlcl9TcGVlZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxfZnVuYyA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9zay5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8xLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZV9hY3QgPSBjYy5tb3ZlVG8odGltZSwgZmluYWxfcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdF9xdWVxZSA9IGNjLnNlcXVlbmNlKG1vdmVfYWN0LCBjYWxsX2Z1bmMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9jb25fbmQucnVuQWN0aW9uKGFjdF9xdWVxZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2FjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X2Nvbl9uZC5wb3NpdGlvbiA9IGZpbmFsX3BvcztcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRUYXNrR3VpZGVMYXN0UG9zKGZpbmFsX3Bvcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsRGlzdGFuY2g6IGZ1bmN0aW9uIChwb3MxLCBwb3MyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coKHBvczEueCAtIHBvczIueCksIDIpICsgTWF0aC5wb3coKHBvczEueSAtIHBvczIueSksIDIpKTtcbiAgICB9LFxuXG4gICAgcGxheU5leHRHdWlkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNhdmVHdWlkZVN0ZXAoKVxuICAgICAgICBpZiAoIXRoaXMuYWN0X2xpc3QgfHwgdGhpcy5hY3RfbGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRQbGF5R3VpZGUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YXJnZXRfZGF0YSA9IHRoaXMuYWN0X2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuZ3VpZGVfc3RlcCA9IHRoaXMuZ3VpZGVfc3RlcCArIDE7XG5cbiAgICAgICAgICAgIGNjLmxvZyhcIuW9k+WJjeatpemqpOeahOaVsOaNrlwiKTtcbiAgICAgICAgICAgIGNjLmxvZyh0aGlzLnRhcmdldF9kYXRhKTtcblxuICAgICAgICAgICAgLy8g5Yik5pat5b2T5YmN5q2l6aqk5piv5ZCm5bey57uP5YGa6L+H5LqGLFxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmFjdF9jb25maWcuaWRdICYmIHRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmFjdF9jb25maWcuaWRdW3RoaXMuZ3VpZGVfc3RlcF0gJiYgIXRoaXMuY3VyX3pvbmVfbGlzdFt0aGlzLmd1aWRlX3N0ZXBdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5TmV4dEd1aWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhcmdldF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFJvb3RXbmRCeUNvbmRpdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBlbmRQbGF5R3VpZGU6IGZ1bmN0aW9uIChpc19za2lwKSB7XG4gICAgICAgIGNjLmxvZyhcIue7k+adn+W9k+WJjeW8leWvvC0tLVwiICsgdGhpcy5hY3RfY29uZmlnLmlkKTtcbiAgICAgICAgdGhpcy5zdGVwID0gMDtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldFRhc2tHdWlkZUxhc3RQb3MobnVsbCk7XG4gICAgfSxcblxuICAgIHNhdmVHdWlkZVN0ZXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLm92ZXJfc3RlcCAmJiB0aGlzLmNvbmZpZy5vdmVyX3N0ZXAgPT0gdGhpcy5ndWlkZV9zdGVwKSB7XG4gICAgICAgIC8vICAgICBpZiAoIXRoaXMuZ3VpZGVfY2FjaGVfZGF0YVt0aGlzLmNvbmZpZy5pZF0pXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ndWlkZV9jYWNoZV9kYXRhW3RoaXMuY29uZmlnLmlkXSA9IHt9XG4gICAgICAgIC8vICAgICB0aGlzLmd1aWRlX2NhY2hlX2RhdGFbdGhpcy5jb25maWcuaWRdW3RoaXMuY29uZmlnLm92ZXJfc3RlcF0gPSB0cnVlO1xuICAgICAgICAvLyAgICAgdmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxuICAgICAgICAvLyAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuXG4gICAgICAgIC8vICAgICBjYy5zeXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ0YXNrX2d1aWRlX2RhdGFcIiArIHJvbGVfdm8uc3J2X2lkICsgcm9sZV92by5yaWQsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVfY2FjaGVfZGF0YSkpO1xuICAgICAgICAvLyB9XG4gICAgfSxcblxuICAgIGdldEVmZmVjdEFjdGl2ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RfY29uX25kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZmZlY3RfY29uX25kLmFjdGl2ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHRoaXMucmVtb3ZlVGltZXIoKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5UYXNrR3VpZGVXaW5kb3coZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==