difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/mainscene/view/mainscene.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, '693f99CVQFBN5FORw91LWR9', 'mainscene');
// Scripts/mod/mainscene/view/mainscene.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      主城
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var LoaderManager = require("loadermanager");
 
var SceneCtrl = require("mainscene_controller");
 
var SceneEvent = require("mainscene_event");
 
var SceneConst = require("scene_const");
 
var BuildItem = require("build_item");
 
var GuideController = require("guide_controller");
 
var MainScene = cc.Class({
  "extends": BaseClass,
  properties: {
    build_list: null,
    effect_render_list: [],
    config: null,
    cur_time_type: 1,
    // 当前时间类型
    map_type: null,
    last_map_res: [],
    // 存储地图的资源路径
    scene_effect: [],
    get_build_cb: {
      "default": {}
    },
    build_items: {
      "default": {}
    }
  },
  ctor: function ctor() {
    this.config = arguments[0];
    this.initConfig();
    this.createRootWnd();
    this.registerEvent();
    this.createScene();
  },
  // 初始化一些配置数据
  initConfig: function initConfig() {
    this.size = cc.size(1440, 1280); // 地图尺寸
 
    this.layer_num = 4; // 当前地图层数
 
    this.map_layer = []; // 地图层级
 
    this.speed_list = [0.2, 0, -0.15, 0]; // 各层地图相对一定的速度
 
    this.init_x = 0;
    this.init_y = 0;
    this.map_cache = []; // 带创建的地图列表
 
    this.layer_img_list = ["1.png", "2.png", "3.png", "4.jpg"];
    this.last_point = null;
  },
  setTimeType: function setTimeType(timevalue) {
    var cur_type;
 
    if (timevalue >= 6 && timevalue < 18) {
      cur_type = 1;
    } else {
      cur_type = 2;
    }
 
    if (this.cur_time_type !== cur_type) {
      this.cur_time_type = cur_type;
      if (this.root.active) this.changeSceneMap();
    }
  },
  getTiemType: function getTiemType() {
    var myDate = new Date();
    var curTime = myDate.getHours();
    var cur_time_type = 2;
 
    if (curTime >= 6 && curTime <= 18) {
      cur_time_type = 1;
    }
 
    return cur_time_type;
  },
  // 创建主城相关节点
  createRootWnd: function createRootWnd() {
    this.root = new cc.Node("base_root");
    this.root.setAnchorPoint(0, 0);
    var scene_scale = this.scene_scale = 1;
    var width_scale = this.width_scale = 1;
 
    if (window.FIT_HEIDGHT) {
      width_scale = FIT_SCALE;
    }
 
    if (window.FIT_WIDTH) {
      scene_scale = FIT_SCALE;
    }
 
    this.root.setContentSize(SCREEN_WIDTH * width_scale, SCREEN_HEIGHT);
    this.root.setPosition(-SCREEN_WIDTH * 0.5 * width_scale, -SCREEN_HEIGHT * 0.5 * scene_scale);
    this.root.addComponent(cc.Mask); // 设置剪辑区域
 
    ViewManager.getInstance().addToSceneNode(this.root, SCENE_TAG.scene);
    this.root.scale = scene_scale;
    this.rootShowY = this.root.y;
    this.rootHideY = -this.root.height * 2; // 主的操作节点
 
    this.root_wnd = new cc.Node("handle_root");
    this.root_wnd.setAnchorPoint(0, 0);
    this.root_wnd.setContentSize(this.size);
    this.root_wnd.parent = this.root; // 地图层级
 
    for (var index = 0; index < this.layer_num; index++) {
      var map_layer = new cc.Node("map_layer" + index);
      map_layer.setAnchorPoint(0, 0);
      map_layer.setContentSize(this.size);
      this.root_wnd.addChild(map_layer, 10 - index);
      this.map_layer[index] = {
        node: map_layer,
        index: index,
        sprite: null,
        frame: null,
        res: null
      };
    } // 初始化坐标
 
 
    this.init_x = (SCREEN_WIDTH - this.size.width) * 0.5;
    this.init_y = (SCREEN_HEIGHT - this.size.height) * 0.5;
    this.updateMainScene(this.init_x, this.init_y);
    this.playBackgroundMusic();
  },
  // 注册监听事件,这里包含场景的
  registerEvent: function registerEvent() {
    var self = this;
    this.root.on(cc.Node.EventType.TOUCH_START, function (event) {
      self.last_point = null;
      var _iteratorNormalCompletion = true;
      var _didIteratorError = false;
      var _iteratorError = undefined;
 
      try {
        for (var _iterator = self.map_layer[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
          var iterator = _step.value;
 
          if (iterator.node) {
            iterator.node.stopAllActions();
          }
        }
      } catch (err) {
        _didIteratorError = true;
        _iteratorError = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion && _iterator["return"] != null) {
            _iterator["return"]();
          }
        } finally {
          if (_didIteratorError) {
            throw _iteratorError;
          }
        }
      }
 
      self.root_wnd.stopAllActions();
    }, this);
    this.root.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
      var touches = event.getTouches();
      self.last_point = touches[0].getDelta();
      self.moveMainScene(self.last_point.x);
    }, this);
    this.root.on(cc.Node.EventType.TOUCH_END, function (event) {
      if (self.last_point == null) {
        return;
      }
 
      var interval_x = self.last_point.x * 3; // var interval_x = (self.last_point.x/Math.abs(self.last_point.x)) * 30;
 
      var temp_x = self.root_wnd.getPosition().x + interval_x;
      var target_x = self.scaleCheckPoint(temp_x);
      var _iteratorNormalCompletion2 = true;
      var _didIteratorError2 = false;
      var _iteratorError2 = undefined;
 
      try {
        for (var _iterator2 = self.map_layer[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
          var iterator = _step2.value;
 
          if (iterator.node) {
            var speed = self.speed_list[iterator.index];
            var move_to = cc.moveTo(2, (target_x - self.init_x) * speed, 0).easing(cc.easeBackOut());
            iterator.node.runAction(move_to);
          }
        }
      } catch (err) {
        _didIteratorError2 = true;
        _iteratorError2 = err;
      } finally {
        try {
          if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
            _iterator2["return"]();
          }
        } finally {
          if (_didIteratorError2) {
            throw _iteratorError2;
          }
        }
      }
 
      var root_move_to = cc.moveTo(2, target_x, self.init_y);
      self.root_wnd.runAction(root_move_to.easing(cc.easeBackOut()));
    }, this);
  },
  // 设置主城是否可见
  setVisible: function setVisible(status) {
    if (!status) {
      // this.rootY = this.root.y;
      this.root.y = this.rootHideY; // this.root.active = status;
    } else {
      var cur_time_type = this.getTiemType();
 
      if (cur_time_type !== this.cur_time_type) {
        this.changeSceneMap();
      }
 
      this.root.y = this.rootShowY;
    }
  },
  // 移动主城位置
  updateMainScene: function updateMainScene(x, y) {
    y = y ? y : this.init_y;
 
    for (var index = 0; index < this.map_layer.length; index++) {
      var element = this.map_layer[index];
      var speed = this.speed_list[index];
      element.node.setPosition((x - this.init_x) * speed, y - this.init_y);
    }
 
    this.root_wnd.setPosition(x, y);
  },
  // 创建具体显示数据,包括背景,马赛克等
  createScene: function createScene() {
    this.cur_time_type = this.getTiemType(); // this.changeSceneMap();
 
    this.renderSmallPic();
    gcore.Timer.set(function () {
      this.changeSceneMap();
    }.bind(this), 2000, 1);
    var build_list = SceneCtrl.getInstance().getBuildList();
 
    if (Utils.isEmpty(build_list) && !this.wait_create_build_event) {
      this.create_build_vo = gcore.GlobalEvent.bind(SceneEvent.CreateBuildVoOver, function () {
        this.wait_create_build_event = null;
        gcore.GlobalEvent.unbind(this.create_build_vo);
        this.beforeCreateBuild();
      }.bind(this));
    } else {
      this.beforeCreateBuild();
    } // this.quequeCreateEffect();
    // 开始预加载资源
 
 
    DownloadManager.getInstance().checkAnimaCache();
  },
  // 延迟创建地图
  mainLoop: function mainLoop() {
    if (this.map_cache && this.map_cache.length > 0) {
      var map_info = this.map_cache.shift();
 
      if (map_info.res) {
        LoaderManager.getInstance().loadRes(map_info.res, function (limit_num, res_object) {
          var map_layer = this.map_layer[map_info.layer];
 
          if (map_layer && map_layer.node) {
            if (map_layer.sprite == null) {
              map_layer.sprite = new cc.Node();
              map_layer.sprite.setPosition(map_info.pos);
              map_layer.sprite.setAnchorPoint(map_info.ap);
 
              if (map_info.layer == 3) {
                //最后一层的时候需要放大4倍
                if (this.cur_time_type == 1) {
                  map_layer.sprite.setScale(4);
                } else {
                  map_layer.sprite.setScale(1);
                }
              }
 
              map_layer.node.addChild(map_layer.sprite, -1);
              map_layer.frame = map_layer.sprite.addComponent(cc.Sprite);
            }
 
            map_layer.frame.spriteFrame = res_object;
 
            if (map_layer.res) {
              LoaderManager.getInstance().releaseRes(map_layer.res);
            }
 
            map_layer.res = map_info.res; // 储存资源,到时候切换时间的时候要释放掉的
          }
 
          if (limit_num == 0) {
            if (this.small_sprite) {
              this.small_sprite.destroy();
              this.small_sprite = null;
              LoaderManager.getInstance().deleteRes("res/centerscene/preview/centercity_1");
            }
          }
        }.bind(this, this.map_cache.length));
      }
    }
 
    if (this.effect_render_list.length > 0) this.quequeCreateEffect();
 
    if (this.effect_render_list == 0 && this.map_cache.length == 0) {
      gcore.Timer.del(this.timer);
      this.timer = null;
    }
  },
  // 创建马赛克地图
  renderSmallPic: function renderSmallPic() {
    var small_path = "res/centerscene/preview/centercity_" + this.cur_time_type + ".jpg";
    if (small_path && this.small_path) return;
    LoaderManager.getInstance().loadRes(small_path, function (res_object) {
      this.small_sprite = new cc.Node();
      this.small_sprite.setPosition(0, 0);
      this.small_sprite.setAnchorPoint(0, 0);
      this.root_wnd.addChild(this.small_sprite, 1);
      var sprite = this.small_sprite.addComponent(cc.Sprite);
      sprite.spriteFrame = res_object;
      var size = this.small_sprite.getContentSize();
      this.small_sprite.setScale(this.size.width / size.width, this.size.height / size.height);
    }.bind(this));
    this.small_path = small_path;
  },
  // 设置待创建资源
  renderMapPic: function renderMapPic() {
    var map_res = "res/centerscene/centercity/" + this.map_type;
 
    for (var index = 0; index < this.layer_img_list.length; index++) {
      var pos = cc.v2(0, 0);
      var ap = cc.v2(0, 0);
      var element = this.layer_img_list[index]; // var res_path = map_res + "/" + (index + 1) + "/" + element;
 
      var res_path = map_res + "/" + element;
 
      if (index == 0) {
        pos.x = -80;
      } else if (index == 1) {} else if (index == 2) {
        pos.x = 59;
        pos.y = 472;
      } else {
        pos.y = this.size.height;
        ap.y = 1;
      }
 
      this.map_cache.push({
        res: res_path,
        layer: index,
        pos: pos,
        ap: ap
      });
    }
  },
  // 地图移动
  moveMainScene: function moveMainScene(x) {
    if (GuideController.getInstance().isInGuide()) return;
    x = this.root_wnd.getPosition().x + x;
 
    var _x = this.scaleCheckPoint(x);
 
    this.updateMainScene(_x);
  },
  moveToBuild: function moveToBuild(id) {
    if (this.build_items[id]) {
      var build_nd = this.build_items[id].root_wnd;
      var build_word_pos = build_nd.convertToWorldSpaceAR(cc.v2(0, 0));
      var final_pso = this.root_wnd.convertToNodeSpaceAR(build_word_pos); // var _x = this.scaleCheckPoint(-(final_pso.x - cc.winSize.width * 0.5));
 
      var _x = this.scaleCheckPoint(-(final_pso.x - SCREEN_WIDTH * 0.5));
 
      this.updateMainScene(_x);
    }
  },
  // 判断点是否越界
  scaleCheckPoint: function scaleCheckPoint(x) {
    var _x = x;
 
    if (x > 0) {
      _x = 0;
    } else if (x < this.root.width - this.size.width) {
      _x = this.root.width - this.size.width;
    }
 
    return _x;
  },
  beforeCreateBuild: function beforeCreateBuild() {
    var build_list = SceneCtrl.getInstance().getBuildList();
    var listNum = Object.keys(build_list).length;
    var scheIndex = 0;
    var createItemSche = gcore.Timer.set(function () {
      var buildKey = Object.keys(build_list)[scheIndex];
      var buildInfo = build_list[buildKey];
      this.createBuildItem(buildInfo);
 
      if (scheIndex == listNum - 1) {
        gcore.Timer.del(createItemSche);
      }
 
      scheIndex++;
    }.bind(this), 100, listNum); // var battle_drama_model = require("battle_drama_controller").getInstance().getModel();
    // battle_drama_model.preloadDramaScene();
  },
  createBuildItem: function createBuildItem(buildInfo) {
    var build_item = new BuildItem(buildInfo, SceneConst.BuildItemType.build);
    var layerIndex = buildInfo.config.layer;
    this.map_layer[layerIndex - 1].node.addChild(build_item.root_wnd, 999); // 判断节点
 
    this.build_items[buildInfo.config.bid] = build_item;
 
    if (this.get_build_cb[buildInfo.config.bid]) {
      var calbacks = this.get_build_cb[buildInfo.config.bid];
 
      for (var cb_i in calbacks) {
        calbacks[cb_i](build_item);
      }
    }
  },
  changeSceneMap: function changeSceneMap() {
    if (!this.map_type || this.map_type !== this.cur_time_type) {
      this.map_type = this.cur_time_type;
      this.renderSmallPic();
      this.renderMapPic();
      this.changeSceneEffect(); // 开始创建地图
 
      if (!this.timer) {
        this.timer = gcore.Timer.set(function () {
          this.mainLoop();
        }.bind(this), 400, -1);
      }
    }
  },
  // 改变当前场景的一些特效
  changeSceneEffect: function changeSceneEffect() {
    if (this.effect_render_list.length > 0) {
      this.effect_render_list.length = [];
    }
 
    for (var effectIndex in this.scene_effect) {
      this.scene_effect[effectIndex].deleteMe(); // var effectIten = this.scene_effect.shift();
      // effectIten.deleteMe();
    }
 
    this.analysisEffect();
  },
  // 解析特效数据
  analysisEffect: function analysisEffect() {
    this.effect_render_list = [];
 
    if (this.config && this.config.building_list) {
      for (var buildIndex in this.config.building_list) {
        var buildItem = this.config.building_list[buildIndex];
 
        if (buildItem.dun_id == 0 || this.cur_time_type == buildItem.dun_id) {
          if (buildItem.type !== SceneConst.BuildItemType.build) {
            if (buildItem && buildItem.res) {
              if (buildItem.res == "E54539" || buildItem.res == "E54540") {
                continue;
              }
            }
 
            this.effect_render_list.push(buildItem);
          }
        }
      }
    }
  },
  // 创建场景特效
  quequeCreateEffect: function quequeCreateEffect() {
    // for (var effectIndx = 0; effectIndx < this.effect_render_list.length; effectIndx ++) {
    var effectConf = this.effect_render_list.shift();
    var buildItem = new BuildItem(effectConf, effectConf.type);
    this.map_layer[effectConf.layer - 1].node.addChild(buildItem.root_wnd);
    this.scene_effect.push(buildItem); // }
  },
  playBackgroundMusic: function playBackgroundMusic() {
    Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true);
  },
  getBuildById: function getBuildById(id, finish_cb) {
    if (this.build_items[id]) {
      finish_cb(this.build_items[id]);
    } else {
      if (!this.get_build_cb[id]) this.get_build_cb[id] = [];
      this.get_build_cb[id].push(finish_cb);
    }
 
    cc.log(this.get_build_cb);
  }
});
module.exports = MainScene;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWluc2NlbmVcXHZpZXdcXG1haW5zY2VuZS5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlNjZW5lQ3RybCIsIlNjZW5lRXZlbnQiLCJTY2VuZUNvbnN0IiwiQnVpbGRJdGVtIiwiR3VpZGVDb250cm9sbGVyIiwiTWFpblNjZW5lIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsInByb3BlcnRpZXMiLCJidWlsZF9saXN0IiwiZWZmZWN0X3JlbmRlcl9saXN0IiwiY29uZmlnIiwiY3VyX3RpbWVfdHlwZSIsIm1hcF90eXBlIiwibGFzdF9tYXBfcmVzIiwic2NlbmVfZWZmZWN0IiwiZ2V0X2J1aWxkX2NiIiwiYnVpbGRfaXRlbXMiLCJjdG9yIiwiYXJndW1lbnRzIiwiaW5pdENvbmZpZyIsImNyZWF0ZVJvb3RXbmQiLCJyZWdpc3RlckV2ZW50IiwiY3JlYXRlU2NlbmUiLCJzaXplIiwibGF5ZXJfbnVtIiwibWFwX2xheWVyIiwic3BlZWRfbGlzdCIsImluaXRfeCIsImluaXRfeSIsIm1hcF9jYWNoZSIsImxheWVyX2ltZ19saXN0IiwibGFzdF9wb2ludCIsInNldFRpbWVUeXBlIiwidGltZXZhbHVlIiwiY3VyX3R5cGUiLCJyb290IiwiYWN0aXZlIiwiY2hhbmdlU2NlbmVNYXAiLCJnZXRUaWVtVHlwZSIsIm15RGF0ZSIsIkRhdGUiLCJjdXJUaW1lIiwiZ2V0SG91cnMiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJzY2VuZV9zY2FsZSIsIndpZHRoX3NjYWxlIiwid2luZG93IiwiRklUX0hFSURHSFQiLCJGSVRfU0NBTEUiLCJGSVRfV0lEVEgiLCJzZXRDb250ZW50U2l6ZSIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJzZXRQb3NpdGlvbiIsImFkZENvbXBvbmVudCIsIk1hc2siLCJWaWV3TWFuYWdlciIsImdldEluc3RhbmNlIiwiYWRkVG9TY2VuZU5vZGUiLCJTQ0VORV9UQUciLCJzY2VuZSIsInNjYWxlIiwicm9vdFNob3dZIiwieSIsInJvb3RIaWRlWSIsImhlaWdodCIsInJvb3Rfd25kIiwicGFyZW50IiwiaW5kZXgiLCJhZGRDaGlsZCIsIm5vZGUiLCJzcHJpdGUiLCJmcmFtZSIsInJlcyIsIndpZHRoIiwidXBkYXRlTWFpblNjZW5lIiwicGxheUJhY2tncm91bmRNdXNpYyIsInNlbGYiLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX1NUQVJUIiwiZXZlbnQiLCJpdGVyYXRvciIsInN0b3BBbGxBY3Rpb25zIiwiVE9VQ0hfTU9WRSIsInRvdWNoZXMiLCJnZXRUb3VjaGVzIiwiZ2V0RGVsdGEiLCJtb3ZlTWFpblNjZW5lIiwieCIsIlRPVUNIX0VORCIsImludGVydmFsX3giLCJ0ZW1wX3giLCJnZXRQb3NpdGlvbiIsInRhcmdldF94Iiwic2NhbGVDaGVja1BvaW50Iiwic3BlZWQiLCJtb3ZlX3RvIiwibW92ZVRvIiwiZWFzaW5nIiwiZWFzZUJhY2tPdXQiLCJydW5BY3Rpb24iLCJyb290X21vdmVfdG8iLCJzZXRWaXNpYmxlIiwic3RhdHVzIiwibGVuZ3RoIiwiZWxlbWVudCIsInJlbmRlclNtYWxsUGljIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImJpbmQiLCJnZXRCdWlsZExpc3QiLCJVdGlscyIsImlzRW1wdHkiLCJ3YWl0X2NyZWF0ZV9idWlsZF9ldmVudCIsImNyZWF0ZV9idWlsZF92byIsIkdsb2JhbEV2ZW50IiwiQ3JlYXRlQnVpbGRWb092ZXIiLCJ1bmJpbmQiLCJiZWZvcmVDcmVhdGVCdWlsZCIsIkRvd25sb2FkTWFuYWdlciIsImNoZWNrQW5pbWFDYWNoZSIsIm1haW5Mb29wIiwibWFwX2luZm8iLCJzaGlmdCIsImxvYWRSZXMiLCJsaW1pdF9udW0iLCJyZXNfb2JqZWN0IiwibGF5ZXIiLCJwb3MiLCJhcCIsInNldFNjYWxlIiwiU3ByaXRlIiwic3ByaXRlRnJhbWUiLCJyZWxlYXNlUmVzIiwic21hbGxfc3ByaXRlIiwiZGVzdHJveSIsImRlbGV0ZVJlcyIsInF1ZXF1ZUNyZWF0ZUVmZmVjdCIsImRlbCIsInRpbWVyIiwic21hbGxfcGF0aCIsImdldENvbnRlbnRTaXplIiwicmVuZGVyTWFwUGljIiwibWFwX3JlcyIsInYyIiwicmVzX3BhdGgiLCJwdXNoIiwiaXNJbkd1aWRlIiwiX3giLCJtb3ZlVG9CdWlsZCIsImlkIiwiYnVpbGRfbmQiLCJidWlsZF93b3JkX3BvcyIsImNvbnZlcnRUb1dvcmxkU3BhY2VBUiIsImZpbmFsX3BzbyIsImNvbnZlcnRUb05vZGVTcGFjZUFSIiwibGlzdE51bSIsIk9iamVjdCIsImtleXMiLCJzY2hlSW5kZXgiLCJjcmVhdGVJdGVtU2NoZSIsImJ1aWxkS2V5IiwiYnVpbGRJbmZvIiwiY3JlYXRlQnVpbGRJdGVtIiwiYnVpbGRfaXRlbSIsIkJ1aWxkSXRlbVR5cGUiLCJidWlsZCIsImxheWVySW5kZXgiLCJiaWQiLCJjYWxiYWNrcyIsImNiX2kiLCJjaGFuZ2VTY2VuZUVmZmVjdCIsImVmZmVjdEluZGV4IiwiZGVsZXRlTWUiLCJhbmFseXNpc0VmZmVjdCIsImJ1aWxkaW5nX2xpc3QiLCJidWlsZEluZGV4IiwiYnVpbGRJdGVtIiwiZHVuX2lkIiwidHlwZSIsImVmZmVjdENvbmYiLCJwbGF5TXVzaWMiLCJBVURJT19UWVBFIiwiU0NFTkUiLCJnZXRCdWlsZEJ5SWQiLCJmaW5pc2hfY2IiLCJsb2ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLGFBQWEsR0FBR0MsT0FBTyxDQUFDLGVBQUQsQ0FBM0I7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsc0JBQUQsQ0FBdkI7O0FBQ0EsSUFBSUUsVUFBVSxHQUFHRixPQUFPLENBQUMsaUJBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsVUFBVSxHQUFHSCxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlLLGVBQWUsR0FBR0wsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUVBLElBQUlNLFNBQVMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDckIsYUFBU0MsU0FEWTtBQUdyQkMsRUFBQUEsVUFBVSxFQUFFO0FBQ1JDLElBQUFBLFVBQVUsRUFBRSxJQURKO0FBRVJDLElBQUFBLGtCQUFrQixFQUFFLEVBRlo7QUFHUkMsSUFBQUEsTUFBTSxFQUFFLElBSEE7QUFJUkMsSUFBQUEsYUFBYSxFQUFFLENBSlA7QUFJb0I7QUFDNUJDLElBQUFBLFFBQVEsRUFBRSxJQUxGO0FBTVJDLElBQUFBLFlBQVksRUFBRSxFQU5OO0FBTW9CO0FBQzVCQyxJQUFBQSxZQUFZLEVBQUUsRUFQTjtBQVFSQyxJQUFBQSxZQUFZLEVBQUU7QUFDVixpQkFBUztBQURDLEtBUk47QUFXUkMsSUFBQUEsV0FBVyxFQUFFO0FBQ1QsaUJBQVM7QUFEQTtBQVhMLEdBSFM7QUFtQnJCQyxFQUFBQSxJQUFJLEVBQUMsZ0JBQVU7QUFDWCxTQUFLUCxNQUFMLEdBQWNRLFNBQVMsQ0FBQyxDQUFELENBQXZCO0FBQ0EsU0FBS0MsVUFBTDtBQUNBLFNBQUtDLGFBQUw7QUFDQSxTQUFLQyxhQUFMO0FBQ0EsU0FBS0MsV0FBTDtBQUNILEdBekJvQjtBQTJCckI7QUFDQUgsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFNBQUtJLElBQUwsR0FBWW5CLEVBQUUsQ0FBQ21CLElBQUgsQ0FBUSxJQUFSLEVBQWMsSUFBZCxDQUFaLENBRG9CLENBQ3dCOztBQUM1QyxTQUFLQyxTQUFMLEdBQWlCLENBQWpCLENBRm9CLENBRXdCOztBQUM1QyxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBSG9CLENBR3dCOztBQUM1QyxTQUFLQyxVQUFMLEdBQWtCLENBQUMsR0FBRCxFQUFNLENBQU4sRUFBUyxDQUFDLElBQVYsRUFBZ0IsQ0FBaEIsQ0FBbEIsQ0FKb0IsQ0FJb0I7O0FBQ3hDLFNBQUtDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsU0FBS0MsTUFBTCxHQUFjLENBQWQ7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBUG9CLENBT3dCOztBQUM1QyxTQUFLQyxjQUFMLEdBQXNCLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEIsT0FBNUIsQ0FBdEI7QUFFQSxTQUFLQyxVQUFMLEdBQWtCLElBQWxCO0FBQ0gsR0F2Q29CO0FBeUNyQkMsRUFBQUEsV0FBVyxFQUFFLHFCQUFTQyxTQUFULEVBQW9CO0FBQzdCLFFBQUlDLFFBQUo7O0FBQ0EsUUFBSUQsU0FBUyxJQUFJLENBQWIsSUFBa0JBLFNBQVMsR0FBRyxFQUFsQyxFQUFzQztBQUNsQ0MsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDSCxLQUZELE1BRU87QUFDSEEsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDSDs7QUFFRCxRQUFJLEtBQUt2QixhQUFMLEtBQXVCdUIsUUFBM0IsRUFBcUM7QUFDakMsV0FBS3ZCLGFBQUwsR0FBcUJ1QixRQUFyQjtBQUNBLFVBQUksS0FBS0MsSUFBTCxDQUFVQyxNQUFkLEVBQXNCLEtBQUtDLGNBQUw7QUFDekI7QUFDSixHQXJEb0I7QUF1RHJCQyxFQUFBQSxXQUFXLEVBQUUsdUJBQVc7QUFDcEIsUUFBSUMsTUFBTSxHQUFHLElBQUlDLElBQUosRUFBYjtBQUNBLFFBQUlDLE9BQU8sR0FBR0YsTUFBTSxDQUFDRyxRQUFQLEVBQWQ7QUFDQSxRQUFJL0IsYUFBYSxHQUFHLENBQXBCOztBQUNBLFFBQUk4QixPQUFPLElBQUksQ0FBWCxJQUFnQkEsT0FBTyxJQUFJLEVBQS9CLEVBQW1DO0FBQy9COUIsTUFBQUEsYUFBYSxHQUFHLENBQWhCO0FBQ0g7O0FBQ0QsV0FBT0EsYUFBUDtBQUNILEdBL0RvQjtBQWlFckI7QUFDQVMsRUFBQUEsYUFBYSxFQUFFLHlCQUFVO0FBQ3JCLFNBQUtlLElBQUwsR0FBWSxJQUFJL0IsRUFBRSxDQUFDdUMsSUFBUCxDQUFZLFdBQVosQ0FBWjtBQUNBLFNBQUtSLElBQUwsQ0FBVVMsY0FBVixDQUF5QixDQUF6QixFQUE0QixDQUE1QjtBQUNBLFFBQUlDLFdBQVcsR0FBRyxLQUFLQSxXQUFMLEdBQW1CLENBQXJDO0FBQ0EsUUFBSUMsV0FBVyxHQUFHLEtBQUtBLFdBQUwsR0FBbUIsQ0FBckM7O0FBRUEsUUFBSUMsTUFBTSxDQUFDQyxXQUFYLEVBQXdCO0FBQ3BCRixNQUFBQSxXQUFXLEdBQUdHLFNBQWQ7QUFDSDs7QUFFRCxRQUFJRixNQUFNLENBQUNHLFNBQVgsRUFBc0I7QUFDbEJMLE1BQUFBLFdBQVcsR0FBR0ksU0FBZDtBQUNIOztBQUVELFNBQUtkLElBQUwsQ0FBVWdCLGNBQVYsQ0FBeUJDLFlBQVksR0FBR04sV0FBeEMsRUFBcURPLGFBQXJEO0FBQ0EsU0FBS2xCLElBQUwsQ0FBVW1CLFdBQVYsQ0FBc0IsQ0FBQ0YsWUFBRCxHQUFnQixHQUFoQixHQUFzQk4sV0FBNUMsRUFBeUQsQ0FBQ08sYUFBRCxHQUFpQixHQUFqQixHQUF1QlIsV0FBaEY7QUFDQSxTQUFLVixJQUFMLENBQVVvQixZQUFWLENBQXVCbkQsRUFBRSxDQUFDb0QsSUFBMUIsRUFoQnFCLENBZ0JlOztBQUVwQ0MsSUFBQUEsV0FBVyxDQUFDQyxXQUFaLEdBQTBCQyxjQUExQixDQUF5QyxLQUFLeEIsSUFBOUMsRUFBb0R5QixTQUFTLENBQUNDLEtBQTlEO0FBQ0EsU0FBSzFCLElBQUwsQ0FBVTJCLEtBQVYsR0FBa0JqQixXQUFsQjtBQUVBLFNBQUtrQixTQUFMLEdBQWlCLEtBQUs1QixJQUFMLENBQVU2QixDQUEzQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsQ0FBRSxLQUFLOUIsSUFBTCxDQUFVK0IsTUFBWixHQUFxQixDQUF0QyxDQXRCcUIsQ0F3QnJCOztBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsSUFBSS9ELEVBQUUsQ0FBQ3VDLElBQVAsQ0FBWSxhQUFaLENBQWhCO0FBQ0EsU0FBS3dCLFFBQUwsQ0FBY3ZCLGNBQWQsQ0FBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEM7QUFDQSxTQUFLdUIsUUFBTCxDQUFjaEIsY0FBZCxDQUE2QixLQUFLNUIsSUFBbEM7QUFDQSxTQUFLNEMsUUFBTCxDQUFjQyxNQUFkLEdBQXVCLEtBQUtqQyxJQUE1QixDQTVCcUIsQ0E4QnJCOztBQUNBLFNBQUssSUFBSWtDLEtBQUssR0FBRyxDQUFqQixFQUFvQkEsS0FBSyxHQUFHLEtBQUs3QyxTQUFqQyxFQUE0QzZDLEtBQUssRUFBakQsRUFBcUQ7QUFDakQsVUFBSTVDLFNBQVMsR0FBRyxJQUFJckIsRUFBRSxDQUFDdUMsSUFBUCxDQUFZLGNBQVkwQixLQUF4QixDQUFoQjtBQUNBNUMsTUFBQUEsU0FBUyxDQUFDbUIsY0FBVixDQUF5QixDQUF6QixFQUE0QixDQUE1QjtBQUNBbkIsTUFBQUEsU0FBUyxDQUFDMEIsY0FBVixDQUF5QixLQUFLNUIsSUFBOUI7QUFDQSxXQUFLNEMsUUFBTCxDQUFjRyxRQUFkLENBQXVCN0MsU0FBdkIsRUFBbUMsS0FBRzRDLEtBQXRDO0FBQ0EsV0FBSzVDLFNBQUwsQ0FBZTRDLEtBQWYsSUFBd0I7QUFBQ0UsUUFBQUEsSUFBSSxFQUFDOUMsU0FBTjtBQUFpQjRDLFFBQUFBLEtBQUssRUFBQ0EsS0FBdkI7QUFBOEJHLFFBQUFBLE1BQU0sRUFBQyxJQUFyQztBQUEyQ0MsUUFBQUEsS0FBSyxFQUFDLElBQWpEO0FBQXVEQyxRQUFBQSxHQUFHLEVBQUM7QUFBM0QsT0FBeEI7QUFDSCxLQXJDb0IsQ0F1Q3JCOzs7QUFDQSxTQUFLL0MsTUFBTCxHQUFjLENBQUN5QixZQUFZLEdBQUcsS0FBSzdCLElBQUwsQ0FBVW9ELEtBQTFCLElBQW1DLEdBQWpEO0FBQ0EsU0FBSy9DLE1BQUwsR0FBYyxDQUFDeUIsYUFBYSxHQUFHLEtBQUs5QixJQUFMLENBQVUyQyxNQUEzQixJQUFxQyxHQUFuRDtBQUNBLFNBQUtVLGVBQUwsQ0FBcUIsS0FBS2pELE1BQTFCLEVBQWtDLEtBQUtDLE1BQXZDO0FBRUEsU0FBS2lELG1CQUFMO0FBQ0gsR0EvR29CO0FBaUhyQjtBQUNBeEQsRUFBQUEsYUFBYSxFQUFFLHlCQUFVO0FBQ3JCLFFBQUl5RCxJQUFJLEdBQUcsSUFBWDtBQUNBLFNBQUszQyxJQUFMLENBQVU0QyxFQUFWLENBQWEzRSxFQUFFLENBQUN1QyxJQUFILENBQVFxQyxTQUFSLENBQWtCQyxXQUEvQixFQUE0QyxVQUFVQyxLQUFWLEVBQWlCO0FBQ3pESixNQUFBQSxJQUFJLENBQUMvQyxVQUFMLEdBQWtCLElBQWxCO0FBRHlEO0FBQUE7QUFBQTs7QUFBQTtBQUV6RCw2QkFBdUIrQyxJQUFJLENBQUNyRCxTQUE1Qiw4SEFBdUM7QUFBQSxjQUE1QjBELFFBQTRCOztBQUNuQyxjQUFJQSxRQUFRLENBQUNaLElBQWIsRUFBa0I7QUFDZFksWUFBQUEsUUFBUSxDQUFDWixJQUFULENBQWNhLGNBQWQ7QUFDSDtBQUNKO0FBTndEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT3pETixNQUFBQSxJQUFJLENBQUNYLFFBQUwsQ0FBY2lCLGNBQWQ7QUFDSCxLQVJELEVBUUcsSUFSSDtBQVVBLFNBQUtqRCxJQUFMLENBQVU0QyxFQUFWLENBQWEzRSxFQUFFLENBQUN1QyxJQUFILENBQVFxQyxTQUFSLENBQWtCSyxVQUEvQixFQUEyQyxVQUFTSCxLQUFULEVBQWU7QUFDdEQsVUFBSUksT0FBTyxHQUFHSixLQUFLLENBQUNLLFVBQU4sRUFBZDtBQUNBVCxNQUFBQSxJQUFJLENBQUMvQyxVQUFMLEdBQWtCdUQsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRSxRQUFYLEVBQWxCO0FBQ0FWLE1BQUFBLElBQUksQ0FBQ1csYUFBTCxDQUFtQlgsSUFBSSxDQUFDL0MsVUFBTCxDQUFnQjJELENBQW5DO0FBQ0gsS0FKRCxFQUlHLElBSkg7QUFNQSxTQUFLdkQsSUFBTCxDQUFVNEMsRUFBVixDQUFhM0UsRUFBRSxDQUFDdUMsSUFBSCxDQUFRcUMsU0FBUixDQUFrQlcsU0FBL0IsRUFBMEMsVUFBU1QsS0FBVCxFQUFlO0FBQ3JELFVBQUlKLElBQUksQ0FBQy9DLFVBQUwsSUFBbUIsSUFBdkIsRUFBNEI7QUFDeEI7QUFDSDs7QUFDRCxVQUFJNkQsVUFBVSxHQUFHZCxJQUFJLENBQUMvQyxVQUFMLENBQWdCMkQsQ0FBaEIsR0FBb0IsQ0FBckMsQ0FKcUQsQ0FLckQ7O0FBQ0EsVUFBSUcsTUFBTSxHQUFHZixJQUFJLENBQUNYLFFBQUwsQ0FBYzJCLFdBQWQsR0FBNEJKLENBQTVCLEdBQWdDRSxVQUE3QztBQUNBLFVBQUlHLFFBQVEsR0FBR2pCLElBQUksQ0FBQ2tCLGVBQUwsQ0FBcUJILE1BQXJCLENBQWY7QUFQcUQ7QUFBQTtBQUFBOztBQUFBO0FBUXJELDhCQUF1QmYsSUFBSSxDQUFDckQsU0FBNUIsbUlBQXVDO0FBQUEsY0FBNUIwRCxRQUE0Qjs7QUFDbkMsY0FBSUEsUUFBUSxDQUFDWixJQUFiLEVBQWtCO0FBQ2QsZ0JBQUkwQixLQUFLLEdBQUduQixJQUFJLENBQUNwRCxVQUFMLENBQWdCeUQsUUFBUSxDQUFDZCxLQUF6QixDQUFaO0FBQ0EsZ0JBQUk2QixPQUFPLEdBQUc5RixFQUFFLENBQUMrRixNQUFILENBQVUsQ0FBVixFQUFhLENBQUNKLFFBQVEsR0FBR2pCLElBQUksQ0FBQ25ELE1BQWpCLElBQTJCc0UsS0FBeEMsRUFBK0MsQ0FBL0MsRUFBa0RHLE1BQWxELENBQXlEaEcsRUFBRSxDQUFDaUcsV0FBSCxFQUF6RCxDQUFkO0FBQ0FsQixZQUFBQSxRQUFRLENBQUNaLElBQVQsQ0FBYytCLFNBQWQsQ0FBd0JKLE9BQXhCO0FBQ0g7QUFDSjtBQWRvRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWVyRCxVQUFJSyxZQUFZLEdBQUduRyxFQUFFLENBQUMrRixNQUFILENBQVUsQ0FBVixFQUFhSixRQUFiLEVBQXVCakIsSUFBSSxDQUFDbEQsTUFBNUIsQ0FBbkI7QUFDQWtELE1BQUFBLElBQUksQ0FBQ1gsUUFBTCxDQUFjbUMsU0FBZCxDQUF3QkMsWUFBWSxDQUFDSCxNQUFiLENBQW9CaEcsRUFBRSxDQUFDaUcsV0FBSCxFQUFwQixDQUF4QjtBQUVILEtBbEJELEVBa0JHLElBbEJIO0FBbUJILEdBdkpvQjtBQXlKckI7QUFDQUcsRUFBQUEsVUFBVSxFQUFDLG9CQUFTQyxNQUFULEVBQWdCO0FBQ3ZCLFFBQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1Q7QUFDQSxXQUFLdEUsSUFBTCxDQUFVNkIsQ0FBVixHQUFjLEtBQUtDLFNBQW5CLENBRlMsQ0FHVDtBQUNILEtBSkQsTUFJTztBQUNILFVBQUl0RCxhQUFhLEdBQUcsS0FBSzJCLFdBQUwsRUFBcEI7O0FBQ0EsVUFBSTNCLGFBQWEsS0FBSyxLQUFLQSxhQUEzQixFQUEwQztBQUN0QyxhQUFLMEIsY0FBTDtBQUNIOztBQUNELFdBQUtGLElBQUwsQ0FBVTZCLENBQVYsR0FBYyxLQUFLRCxTQUFuQjtBQUNIO0FBQ0osR0F0S29CO0FBd0tyQjtBQUNBYSxFQUFBQSxlQUFlLEVBQUMseUJBQVNjLENBQVQsRUFBWTFCLENBQVosRUFBYztBQUMxQkEsSUFBQUEsQ0FBQyxHQUFHQSxDQUFDLEdBQUdBLENBQUgsR0FBTyxLQUFLcEMsTUFBakI7O0FBQ0EsU0FBSyxJQUFJeUMsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcsS0FBSzVDLFNBQUwsQ0FBZWlGLE1BQTNDLEVBQW1EckMsS0FBSyxFQUF4RCxFQUE0RDtBQUN4RCxVQUFNc0MsT0FBTyxHQUFHLEtBQUtsRixTQUFMLENBQWU0QyxLQUFmLENBQWhCO0FBQ0EsVUFBTTRCLEtBQUssR0FBRyxLQUFLdkUsVUFBTCxDQUFnQjJDLEtBQWhCLENBQWQ7QUFDQXNDLE1BQUFBLE9BQU8sQ0FBQ3BDLElBQVIsQ0FBYWpCLFdBQWIsQ0FBeUIsQ0FBQ29DLENBQUMsR0FBQyxLQUFLL0QsTUFBUixJQUFrQnNFLEtBQTNDLEVBQWtEakMsQ0FBQyxHQUFHLEtBQUtwQyxNQUEzRDtBQUNIOztBQUNELFNBQUt1QyxRQUFMLENBQWNiLFdBQWQsQ0FBMEJvQyxDQUExQixFQUE2QjFCLENBQTdCO0FBQ0gsR0FqTG9CO0FBbUxyQjtBQUNBMUMsRUFBQUEsV0FBVyxFQUFDLHVCQUFVO0FBQ2xCLFNBQUtYLGFBQUwsR0FBcUIsS0FBSzJCLFdBQUwsRUFBckIsQ0FEa0IsQ0FFbEI7O0FBQ0EsU0FBS3NFLGNBQUw7QUFDQUMsSUFBQUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLEdBQVosQ0FBZ0IsWUFBVztBQUN2QixXQUFLMUUsY0FBTDtBQUNILEtBRmUsQ0FFZDJFLElBRmMsQ0FFVCxJQUZTLENBQWhCLEVBRWMsSUFGZCxFQUVvQixDQUZwQjtBQUlBLFFBQUl4RyxVQUFVLEdBQUdWLFNBQVMsQ0FBQzRELFdBQVYsR0FBd0J1RCxZQUF4QixFQUFqQjs7QUFDQSxRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBYzNHLFVBQWQsS0FBNkIsQ0FBQyxLQUFLNEcsdUJBQXZDLEVBQWdFO0FBQzVELFdBQUtDLGVBQUwsR0FBdUJSLEtBQUssQ0FBQ1MsV0FBTixDQUFrQk4sSUFBbEIsQ0FBdUJqSCxVQUFVLENBQUN3SCxpQkFBbEMsRUFBc0QsWUFBVTtBQUNuRixhQUFLSCx1QkFBTCxHQUErQixJQUEvQjtBQUNBUCxRQUFBQSxLQUFLLENBQUNTLFdBQU4sQ0FBa0JFLE1BQWxCLENBQXlCLEtBQUtILGVBQTlCO0FBQ0EsYUFBS0ksaUJBQUw7QUFDSCxPQUoyRSxDQUl6RVQsSUFKeUUsQ0FJcEUsSUFKb0UsQ0FBckQsQ0FBdkI7QUFLSCxLQU5ELE1BTU87QUFDSCxXQUFLUyxpQkFBTDtBQUNILEtBakJpQixDQWtCbEI7QUFDQTs7O0FBQ0FDLElBQUFBLGVBQWUsQ0FBQ2hFLFdBQWhCLEdBQThCaUUsZUFBOUI7QUFDSCxHQXpNb0I7QUEyTXJCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBQyxvQkFBVTtBQUNmLFFBQUksS0FBSy9GLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlNkUsTUFBZixHQUF3QixDQUE5QyxFQUFnRDtBQUM1QyxVQUFJbUIsUUFBUSxHQUFHLEtBQUtoRyxTQUFMLENBQWVpRyxLQUFmLEVBQWY7O0FBQ0EsVUFBSUQsUUFBUSxDQUFDbkQsR0FBYixFQUFpQjtBQUNiOUUsUUFBQUEsYUFBYSxDQUFDOEQsV0FBZCxHQUE0QnFFLE9BQTVCLENBQW9DRixRQUFRLENBQUNuRCxHQUE3QyxFQUFrRCxVQUFTc0QsU0FBVCxFQUFvQkMsVUFBcEIsRUFBK0I7QUFDN0UsY0FBSXhHLFNBQVMsR0FBRyxLQUFLQSxTQUFMLENBQWVvRyxRQUFRLENBQUNLLEtBQXhCLENBQWhCOztBQUNBLGNBQUl6RyxTQUFTLElBQUlBLFNBQVMsQ0FBQzhDLElBQTNCLEVBQWdDO0FBQzVCLGdCQUFJOUMsU0FBUyxDQUFDK0MsTUFBVixJQUFvQixJQUF4QixFQUE2QjtBQUN6Qi9DLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsR0FBbUIsSUFBSXBFLEVBQUUsQ0FBQ3VDLElBQVAsRUFBbkI7QUFDQWxCLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUJsQixXQUFqQixDQUE2QnVFLFFBQVEsQ0FBQ00sR0FBdEM7QUFDQTFHLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUI1QixjQUFqQixDQUFnQ2lGLFFBQVEsQ0FBQ08sRUFBekM7O0FBQ0Esa0JBQUlQLFFBQVEsQ0FBQ0ssS0FBVCxJQUFrQixDQUF0QixFQUF5QjtBQUFJO0FBQ3pCLG9CQUFJLEtBQUt2SCxhQUFMLElBQXNCLENBQTFCLEVBQTZCO0FBQ3pCYyxrQkFBQUEsU0FBUyxDQUFDK0MsTUFBVixDQUFpQjZELFFBQWpCLENBQTBCLENBQTFCO0FBQ0gsaUJBRkQsTUFFTztBQUNINUcsa0JBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUI2RCxRQUFqQixDQUEwQixDQUExQjtBQUNIO0FBQ0o7O0FBQ0Q1RyxjQUFBQSxTQUFTLENBQUM4QyxJQUFWLENBQWVELFFBQWYsQ0FBd0I3QyxTQUFTLENBQUMrQyxNQUFsQyxFQUEwQyxDQUFDLENBQTNDO0FBQ0EvQyxjQUFBQSxTQUFTLENBQUNnRCxLQUFWLEdBQWtCaEQsU0FBUyxDQUFDK0MsTUFBVixDQUFpQmpCLFlBQWpCLENBQThCbkQsRUFBRSxDQUFDa0ksTUFBakMsQ0FBbEI7QUFDSDs7QUFDRDdHLFlBQUFBLFNBQVMsQ0FBQ2dELEtBQVYsQ0FBZ0I4RCxXQUFoQixHQUE4Qk4sVUFBOUI7O0FBQ0EsZ0JBQUl4RyxTQUFTLENBQUNpRCxHQUFkLEVBQW1CO0FBQ2Y5RSxjQUFBQSxhQUFhLENBQUM4RCxXQUFkLEdBQTRCOEUsVUFBNUIsQ0FBdUMvRyxTQUFTLENBQUNpRCxHQUFqRDtBQUNIOztBQUNEakQsWUFBQUEsU0FBUyxDQUFDaUQsR0FBVixHQUFnQm1ELFFBQVEsQ0FBQ25ELEdBQXpCLENBbkI0QixDQW1CUTtBQUN2Qzs7QUFDRCxjQUFJc0QsU0FBUyxJQUFJLENBQWpCLEVBQW9CO0FBQ2hCLGdCQUFJLEtBQUtTLFlBQVQsRUFBc0I7QUFDbEIsbUJBQUtBLFlBQUwsQ0FBa0JDLE9BQWxCO0FBQ0EsbUJBQUtELFlBQUwsR0FBb0IsSUFBcEI7QUFDQTdJLGNBQUFBLGFBQWEsQ0FBQzhELFdBQWQsR0FBNEJpRixTQUE1QixDQUFzQyxzQ0FBdEM7QUFDSDtBQUNKO0FBQ0osU0E5QmlELENBOEJoRDNCLElBOUJnRCxDQThCM0MsSUE5QjJDLEVBOEJyQyxLQUFLbkYsU0FBTCxDQUFlNkUsTUE5QnNCLENBQWxEO0FBK0JIO0FBQ0o7O0FBRUQsUUFBSSxLQUFLakcsa0JBQUwsQ0FBd0JpRyxNQUF4QixHQUFpQyxDQUFyQyxFQUNJLEtBQUtrQyxrQkFBTDs7QUFFSixRQUFJLEtBQUtuSSxrQkFBTCxJQUEyQixDQUEzQixJQUFnQyxLQUFLb0IsU0FBTCxDQUFlNkUsTUFBZixJQUF5QixDQUE3RCxFQUFnRTtBQUM1REcsTUFBQUEsS0FBSyxDQUFDQyxLQUFOLENBQVkrQixHQUFaLENBQWdCLEtBQUtDLEtBQXJCO0FBQ0EsV0FBS0EsS0FBTCxHQUFhLElBQWI7QUFDSDtBQUNKLEdBelBvQjtBQTJQckI7QUFDQWxDLEVBQUFBLGNBQWMsRUFBQywwQkFBVTtBQUNyQixRQUFJbUMsVUFBVSxHQUFJLHdDQUF3QyxLQUFLcEksYUFBN0MsR0FBNkQsTUFBL0U7QUFDQSxRQUFJb0ksVUFBVSxJQUFJLEtBQUtBLFVBQXZCLEVBQ0k7QUFFSm5KLElBQUFBLGFBQWEsQ0FBQzhELFdBQWQsR0FBNEJxRSxPQUE1QixDQUFvQ2dCLFVBQXBDLEVBQWdELFVBQVVkLFVBQVYsRUFBc0I7QUFDbEUsV0FBS1EsWUFBTCxHQUFvQixJQUFJckksRUFBRSxDQUFDdUMsSUFBUCxFQUFwQjtBQUNBLFdBQUs4RixZQUFMLENBQWtCbkYsV0FBbEIsQ0FBOEIsQ0FBOUIsRUFBaUMsQ0FBakM7QUFDQSxXQUFLbUYsWUFBTCxDQUFrQjdGLGNBQWxCLENBQWlDLENBQWpDLEVBQW9DLENBQXBDO0FBQ0EsV0FBS3VCLFFBQUwsQ0FBY0csUUFBZCxDQUF1QixLQUFLbUUsWUFBNUIsRUFBMEMsQ0FBMUM7QUFFQSxVQUFNakUsTUFBTSxHQUFHLEtBQUtpRSxZQUFMLENBQWtCbEYsWUFBbEIsQ0FBK0JuRCxFQUFFLENBQUNrSSxNQUFsQyxDQUFmO0FBQ0E5RCxNQUFBQSxNQUFNLENBQUMrRCxXQUFQLEdBQXFCTixVQUFyQjtBQUNBLFVBQUkxRyxJQUFJLEdBQUcsS0FBS2tILFlBQUwsQ0FBa0JPLGNBQWxCLEVBQVg7QUFDQSxXQUFLUCxZQUFMLENBQWtCSixRQUFsQixDQUEyQixLQUFLOUcsSUFBTCxDQUFVb0QsS0FBVixHQUFrQnBELElBQUksQ0FBQ29ELEtBQWxELEVBQXlELEtBQUtwRCxJQUFMLENBQVUyQyxNQUFWLEdBQW1CM0MsSUFBSSxDQUFDMkMsTUFBakY7QUFDSCxLQVYrQyxDQVU5QzhDLElBVjhDLENBVXpDLElBVnlDLENBQWhEO0FBV0EsU0FBSytCLFVBQUwsR0FBa0JBLFVBQWxCO0FBQ0gsR0E3UW9CO0FBK1FyQjtBQUNBRSxFQUFBQSxZQUFZLEVBQUUsd0JBQVU7QUFDcEIsUUFBSUMsT0FBTyxHQUFHLGdDQUFnQyxLQUFLdEksUUFBbkQ7O0FBQ0EsU0FBSyxJQUFJeUQsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcsS0FBS3ZDLGNBQUwsQ0FBb0I0RSxNQUFoRCxFQUF3RHJDLEtBQUssRUFBN0QsRUFBaUU7QUFDN0QsVUFBSThELEdBQUcsR0FBRy9ILEVBQUUsQ0FBQytJLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUFWO0FBQ0EsVUFBSWYsRUFBRSxHQUFHaEksRUFBRSxDQUFDK0ksRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQVQ7QUFDQSxVQUFNeEMsT0FBTyxHQUFHLEtBQUs3RSxjQUFMLENBQW9CdUMsS0FBcEIsQ0FBaEIsQ0FINkQsQ0FJN0Q7O0FBQ0EsVUFBSStFLFFBQVEsR0FBR0YsT0FBTyxHQUFHLEdBQVYsR0FBaUJ2QyxPQUFoQzs7QUFFQSxVQUFJdEMsS0FBSyxJQUFJLENBQWIsRUFBZ0I7QUFDWjhELFFBQUFBLEdBQUcsQ0FBQ3pDLENBQUosR0FBUSxDQUFDLEVBQVQ7QUFDSCxPQUZELE1BRU0sSUFBSXJCLEtBQUssSUFBSSxDQUFiLEVBQWUsQ0FFcEIsQ0FGSyxNQUVBLElBQUlBLEtBQUssSUFBSSxDQUFiLEVBQWU7QUFDakI4RCxRQUFBQSxHQUFHLENBQUN6QyxDQUFKLEdBQVEsRUFBUjtBQUNBeUMsUUFBQUEsR0FBRyxDQUFDbkUsQ0FBSixHQUFRLEdBQVI7QUFDSCxPQUhLLE1BR0Q7QUFDRG1FLFFBQUFBLEdBQUcsQ0FBQ25FLENBQUosR0FBUSxLQUFLekMsSUFBTCxDQUFVMkMsTUFBbEI7QUFDQWtFLFFBQUFBLEVBQUUsQ0FBQ3BFLENBQUgsR0FBTyxDQUFQO0FBQ0g7O0FBQ0QsV0FBS25DLFNBQUwsQ0FBZXdILElBQWYsQ0FBb0I7QUFBQzNFLFFBQUFBLEdBQUcsRUFBQzBFLFFBQUw7QUFBZWxCLFFBQUFBLEtBQUssRUFBQzdELEtBQXJCO0FBQTRCOEQsUUFBQUEsR0FBRyxFQUFDQSxHQUFoQztBQUFxQ0MsUUFBQUEsRUFBRSxFQUFDQTtBQUF4QyxPQUFwQjtBQUNIO0FBQ0osR0F0U29CO0FBd1NyQjtBQUNBM0MsRUFBQUEsYUFBYSxFQUFFLHVCQUFVQyxDQUFWLEVBQWE7QUFDeEIsUUFBSXhGLGVBQWUsQ0FBQ3dELFdBQWhCLEdBQThCNEYsU0FBOUIsRUFBSixFQUNJO0FBRUo1RCxJQUFBQSxDQUFDLEdBQUcsS0FBS3ZCLFFBQUwsQ0FBYzJCLFdBQWQsR0FBNEJKLENBQTVCLEdBQWdDQSxDQUFwQzs7QUFDQSxRQUFJNkQsRUFBRSxHQUFHLEtBQUt2RCxlQUFMLENBQXFCTixDQUFyQixDQUFUOztBQUNBLFNBQUtkLGVBQUwsQ0FBcUIyRSxFQUFyQjtBQUNILEdBaFRvQjtBQWtUckJDLEVBQUFBLFdBQVcsRUFBRSxxQkFBU0MsRUFBVCxFQUFhO0FBQ3RCLFFBQUksS0FBS3pJLFdBQUwsQ0FBaUJ5SSxFQUFqQixDQUFKLEVBQTBCO0FBQ3RCLFVBQUlDLFFBQVEsR0FBRyxLQUFLMUksV0FBTCxDQUFpQnlJLEVBQWpCLEVBQXFCdEYsUUFBcEM7QUFDQSxVQUFJd0YsY0FBYyxHQUFHRCxRQUFRLENBQUNFLHFCQUFULENBQStCeEosRUFBRSxDQUFDK0ksRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQS9CLENBQXJCO0FBQ0EsVUFBSVUsU0FBUyxHQUFHLEtBQUsxRixRQUFMLENBQWMyRixvQkFBZCxDQUFtQ0gsY0FBbkMsQ0FBaEIsQ0FIc0IsQ0FLdEI7O0FBQ0EsVUFBSUosRUFBRSxHQUFHLEtBQUt2RCxlQUFMLENBQXFCLEVBQUU2RCxTQUFTLENBQUNuRSxDQUFWLEdBQWN0QyxZQUFZLEdBQUcsR0FBL0IsQ0FBckIsQ0FBVDs7QUFDQSxXQUFLd0IsZUFBTCxDQUFxQjJFLEVBQXJCO0FBQ0g7QUFDSixHQTVUb0I7QUE4VHJCO0FBQ0F2RCxFQUFBQSxlQUFlLEVBQUUseUJBQVVOLENBQVYsRUFBYTtBQUMxQixRQUFJNkQsRUFBRSxHQUFHN0QsQ0FBVDs7QUFDQSxRQUFJQSxDQUFDLEdBQUcsQ0FBUixFQUFXO0FBQ1A2RCxNQUFBQSxFQUFFLEdBQUcsQ0FBTDtBQUNILEtBRkQsTUFFTyxJQUFJN0QsQ0FBQyxHQUFJLEtBQUt2RCxJQUFMLENBQVV3QyxLQUFWLEdBQWtCLEtBQUtwRCxJQUFMLENBQVVvRCxLQUFyQyxFQUE2QztBQUNoRDRFLE1BQUFBLEVBQUUsR0FBRyxLQUFLcEgsSUFBTCxDQUFVd0MsS0FBVixHQUFrQixLQUFLcEQsSUFBTCxDQUFVb0QsS0FBakM7QUFDSDs7QUFDRCxXQUFPNEUsRUFBUDtBQUNILEdBdlVvQjtBQXlVckI5QixFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixRQUFJakgsVUFBVSxHQUFHVixTQUFTLENBQUM0RCxXQUFWLEdBQXdCdUQsWUFBeEIsRUFBakI7QUFDQSxRQUFJOEMsT0FBTyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWXpKLFVBQVosRUFBd0JrRyxNQUF0QztBQUNBLFFBQUl3RCxTQUFTLEdBQUcsQ0FBaEI7QUFDQSxRQUFJQyxjQUFjLEdBQUd0RCxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsR0FBWixDQUFpQixZQUFVO0FBQzVDLFVBQUlxRCxRQUFRLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZekosVUFBWixFQUF3QjBKLFNBQXhCLENBQWY7QUFDQSxVQUFJRyxTQUFTLEdBQUc3SixVQUFVLENBQUM0SixRQUFELENBQTFCO0FBQ0EsV0FBS0UsZUFBTCxDQUFxQkQsU0FBckI7O0FBQ0EsVUFBSUgsU0FBUyxJQUFJSCxPQUFPLEdBQUcsQ0FBM0IsRUFBOEI7QUFDMUJsRCxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWStCLEdBQVosQ0FBZ0JzQixjQUFoQjtBQUNIOztBQUNERCxNQUFBQSxTQUFTO0FBQ1osS0FSb0MsQ0FRbENsRCxJQVJrQyxDQVE3QixJQVI2QixDQUFoQixFQVFOLEdBUk0sRUFRRCtDLE9BUkMsQ0FBckIsQ0FKMEIsQ0FlMUI7QUFDQTtBQUNILEdBMVZvQjtBQTZWckJPLEVBQUFBLGVBQWUsRUFBRSx5QkFBU0QsU0FBVCxFQUFvQjtBQUNqQyxRQUFJRSxVQUFVLEdBQUcsSUFBSXRLLFNBQUosQ0FBY29LLFNBQWQsRUFBeUJySyxVQUFVLENBQUN3SyxhQUFYLENBQXlCQyxLQUFsRCxDQUFqQjtBQUNBLFFBQUlDLFVBQVUsR0FBR0wsU0FBUyxDQUFDM0osTUFBVixDQUFpQndILEtBQWxDO0FBQ0EsU0FBS3pHLFNBQUwsQ0FBZWlKLFVBQVUsR0FBRyxDQUE1QixFQUErQm5HLElBQS9CLENBQW9DRCxRQUFwQyxDQUE2Q2lHLFVBQVUsQ0FBQ3BHLFFBQXhELEVBQWtFLEdBQWxFLEVBSGlDLENBS2pDOztBQUNBLFNBQUtuRCxXQUFMLENBQWlCcUosU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQWxDLElBQXlDSixVQUF6Qzs7QUFDQSxRQUFJLEtBQUt4SixZQUFMLENBQWtCc0osU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQW5DLENBQUosRUFBNkM7QUFDekMsVUFBSUMsUUFBUSxHQUFHLEtBQUs3SixZQUFMLENBQWtCc0osU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQW5DLENBQWY7O0FBQ0EsV0FBSyxJQUFJRSxJQUFULElBQWlCRCxRQUFqQixFQUEyQjtBQUN2QkEsUUFBQUEsUUFBUSxDQUFDQyxJQUFELENBQVIsQ0FBZU4sVUFBZjtBQUNIO0FBQ0o7QUFDSixHQTFXb0I7QUE0V3JCbEksRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLekIsUUFBTixJQUFrQixLQUFLQSxRQUFMLEtBQWtCLEtBQUtELGFBQTdDLEVBQTREO0FBQ3hELFdBQUtDLFFBQUwsR0FBZ0IsS0FBS0QsYUFBckI7QUFDQSxXQUFLaUcsY0FBTDtBQUNBLFdBQUtxQyxZQUFMO0FBQ0EsV0FBSzZCLGlCQUFMLEdBSndELENBS3hEOztBQUNBLFVBQUksQ0FBQyxLQUFLaEMsS0FBVixFQUFnQjtBQUNaLGFBQUtBLEtBQUwsR0FBYWpDLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxHQUFaLENBQWlCLFlBQVU7QUFDcEMsZUFBS2EsUUFBTDtBQUNILFNBRjRCLENBRTFCWixJQUYwQixDQUVyQixJQUZxQixDQUFoQixFQUVFLEdBRkYsRUFFTyxDQUFDLENBRlIsQ0FBYjtBQUdIO0FBQ0o7QUFDSixHQXpYb0I7QUEyWHJCO0FBQ0E4RCxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixRQUFJLEtBQUtySyxrQkFBTCxDQUF3QmlHLE1BQXhCLEdBQWlDLENBQXJDLEVBQXdDO0FBQ3BDLFdBQUtqRyxrQkFBTCxDQUF3QmlHLE1BQXhCLEdBQWlDLEVBQWpDO0FBQ0g7O0FBRUQsU0FBSyxJQUFJcUUsV0FBVCxJQUF3QixLQUFLakssWUFBN0IsRUFBMkM7QUFDdkMsV0FBS0EsWUFBTCxDQUFrQmlLLFdBQWxCLEVBQStCQyxRQUEvQixHQUR1QyxDQUV2QztBQUNBO0FBQ0g7O0FBRUQsU0FBS0MsY0FBTDtBQUNILEdBeFlvQjtBQTBZckI7QUFDQUEsRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCLFNBQUt4SyxrQkFBTCxHQUEwQixFQUExQjs7QUFDQSxRQUFJLEtBQUtDLE1BQUwsSUFBZSxLQUFLQSxNQUFMLENBQVl3SyxhQUEvQixFQUE4QztBQUMxQyxXQUFLLElBQUlDLFVBQVQsSUFBdUIsS0FBS3pLLE1BQUwsQ0FBWXdLLGFBQW5DLEVBQWtEO0FBQzlDLFlBQUlFLFNBQVMsR0FBRyxLQUFLMUssTUFBTCxDQUFZd0ssYUFBWixDQUEwQkMsVUFBMUIsQ0FBaEI7O0FBQ0EsWUFBSUMsU0FBUyxDQUFDQyxNQUFWLElBQW9CLENBQXBCLElBQXlCLEtBQUsxSyxhQUFMLElBQXNCeUssU0FBUyxDQUFDQyxNQUE3RCxFQUFxRTtBQUNqRSxjQUFJRCxTQUFTLENBQUNFLElBQVYsS0FBb0J0TCxVQUFVLENBQUN3SyxhQUFYLENBQXlCQyxLQUFqRCxFQUF3RDtBQUNwRCxnQkFBSVcsU0FBUyxJQUFJQSxTQUFTLENBQUMxRyxHQUEzQixFQUFnQztBQUM1QixrQkFBSTBHLFNBQVMsQ0FBQzFHLEdBQVYsSUFBaUIsUUFBakIsSUFBNkIwRyxTQUFTLENBQUMxRyxHQUFWLElBQWlCLFFBQWxELEVBQTREO0FBQ3hEO0FBQ0g7QUFDSjs7QUFDRCxpQkFBS2pFLGtCQUFMLENBQXdCNEksSUFBeEIsQ0FBNkIrQixTQUE3QjtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0osR0E1Wm9CO0FBOFpyQjtBQUNBeEMsRUFBQUEsa0JBQWtCLEVBQUUsOEJBQVc7QUFDM0I7QUFDSSxRQUFJMkMsVUFBVSxHQUFHLEtBQUs5SyxrQkFBTCxDQUF3QnFILEtBQXhCLEVBQWpCO0FBQ0EsUUFBSXNELFNBQVMsR0FBRyxJQUFJbkwsU0FBSixDQUFjc0wsVUFBZCxFQUEwQkEsVUFBVSxDQUFDRCxJQUFyQyxDQUFoQjtBQUNBLFNBQUs3SixTQUFMLENBQWU4SixVQUFVLENBQUNyRCxLQUFYLEdBQW1CLENBQWxDLEVBQXFDM0QsSUFBckMsQ0FBMENELFFBQTFDLENBQW1EOEcsU0FBUyxDQUFDakgsUUFBN0Q7QUFDQSxTQUFLckQsWUFBTCxDQUFrQnVJLElBQWxCLENBQXVCK0IsU0FBdkIsRUFMdUIsQ0FNM0I7QUFDSCxHQXRhb0I7QUF3YXJCdkcsRUFBQUEsbUJBQW1CLEVBQUUsK0JBQVc7QUFDNUJxQyxJQUFBQSxLQUFLLENBQUNzRSxTQUFOLENBQWdCQyxVQUFVLENBQUNDLEtBQTNCLEVBQWtDLE9BQWxDLEVBQTJDLElBQTNDO0FBQ0gsR0ExYW9CO0FBNGFyQkMsRUFBQUEsWUFBWSxFQUFFLHNCQUFTbEMsRUFBVCxFQUFhbUMsU0FBYixFQUF1QjtBQUNqQyxRQUFJLEtBQUs1SyxXQUFMLENBQWlCeUksRUFBakIsQ0FBSixFQUEwQjtBQUN0Qm1DLE1BQUFBLFNBQVMsQ0FBQyxLQUFLNUssV0FBTCxDQUFpQnlJLEVBQWpCLENBQUQsQ0FBVDtBQUNILEtBRkQsTUFFTztBQUNILFVBQUksQ0FBQyxLQUFLMUksWUFBTCxDQUFrQjBJLEVBQWxCLENBQUwsRUFDSSxLQUFLMUksWUFBTCxDQUFrQjBJLEVBQWxCLElBQXdCLEVBQXhCO0FBQ0osV0FBSzFJLFlBQUwsQ0FBa0IwSSxFQUFsQixFQUFzQkosSUFBdEIsQ0FBMkJ1QyxTQUEzQjtBQUNIOztBQUVEeEwsSUFBQUEsRUFBRSxDQUFDeUwsR0FBSCxDQUFPLEtBQUs5SyxZQUFaO0FBQ0g7QUF0Ym9CLENBQVQsQ0FBaEI7QUF5YkErSyxNQUFNLENBQUNDLE9BQVAsR0FBaUI1TCxTQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg5Li75Z+OXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBTY2VuZUN0cmwgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG52YXIgU2NlbmVFdmVudCA9IHJlcXVpcmUoXCJtYWluc2NlbmVfZXZlbnRcIik7XG52YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbnZhciBCdWlsZEl0ZW0gPSByZXF1aXJlKFwiYnVpbGRfaXRlbVwiKTtcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIE1haW5TY2VuZSA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGJ1aWxkX2xpc3Q6IG51bGwsXG4gICAgICAgIGVmZmVjdF9yZW5kZXJfbGlzdDogW10sXG4gICAgICAgIGNvbmZpZzogbnVsbCxcbiAgICAgICAgY3VyX3RpbWVfdHlwZTogMSwgICAgICAgICAgIC8vIOW9k+WJjeaXtumXtOexu+Wei1xuICAgICAgICBtYXBfdHlwZTogbnVsbCxcbiAgICAgICAgbGFzdF9tYXBfcmVzOiBbXSwgICAgICAgICAgIC8vIOWtmOWCqOWcsOWbvueahOi1hOa6kOi3r+W+hFxuICAgICAgICBzY2VuZV9lZmZlY3Q6IFtdLFxuICAgICAgICBnZXRfYnVpbGRfY2I6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkX2l0ZW1zOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LCAgICAgICAgXG4gICAgfSxcblxuICAgIGN0b3I6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KClcbiAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnNpemUoMTQ0MCwgMTI4MCk7ICAgICAgICAgICAgLy8g5Zyw5Zu+5bC65a+4XG4gICAgICAgIHRoaXMubGF5ZXJfbnVtID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5Zyw5Zu+5bGC5pWwXG4gICAgICAgIHRoaXMubWFwX2xheWVyID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Zyw5Zu+5bGC57qnXG4gICAgICAgIHRoaXMuc3BlZWRfbGlzdCA9IFswLjIsIDAsIC0wLjE1LCAwXTsgICAvLyDlkITlsYLlnLDlm77nm7jlr7nkuIDlrprnmoTpgJ/luqZcbiAgICAgICAgdGhpcy5pbml0X3ggPSAwO1xuICAgICAgICB0aGlzLmluaXRfeSA9IDA7XG4gICAgICAgIHRoaXMubWFwX2NhY2hlID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5bim5Yib5bu655qE5Zyw5Zu+5YiX6KGoXG4gICAgICAgIHRoaXMubGF5ZXJfaW1nX2xpc3QgPSBbXCIxLnBuZ1wiLCBcIjIucG5nXCIsIFwiMy5wbmdcIiwgXCI0LmpwZ1wiXTtcblxuICAgICAgICB0aGlzLmxhc3RfcG9pbnQgPSBudWxsO1xuICAgIH0sXG5cbiAgICBzZXRUaW1lVHlwZTogZnVuY3Rpb24odGltZXZhbHVlKSB7XG4gICAgICAgIHZhciBjdXJfdHlwZTtcbiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+PSA2ICYmIHRpbWV2YWx1ZSA8IDE4KSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJfdGltZV90eXBlICE9PSBjdXJfdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfdGltZV90eXBlID0gY3VyX3R5cGU7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290LmFjdGl2ZSkgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpZW1UeXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG15RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjdXJUaW1lID0gbXlEYXRlLmdldEhvdXJzKCk7XG4gICAgICAgIHZhciBjdXJfdGltZV90eXBlID0gMjtcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gNiAmJiBjdXJUaW1lIDw9IDE4KSB7XG4gICAgICAgICAgICBjdXJfdGltZV90eXBlID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyX3RpbWVfdHlwZTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65Li75Z+O55u45YWz6IqC54K5XG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5yb290ID0gbmV3IGNjLk5vZGUoXCJiYXNlX3Jvb3RcIik7XG4gICAgICAgIHRoaXMucm9vdC5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgdmFyIHNjZW5lX3NjYWxlID0gdGhpcy5zY2VuZV9zY2FsZSA9IDE7XG4gICAgICAgIHZhciB3aWR0aF9zY2FsZSA9IHRoaXMud2lkdGhfc2NhbGUgPSAxO1xuXG4gICAgICAgIGlmICh3aW5kb3cuRklUX0hFSURHSFQpIHtcbiAgICAgICAgICAgIHdpZHRoX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5GSVRfV0lEVEgpIHtcbiAgICAgICAgICAgIHNjZW5lX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290LnNldENvbnRlbnRTaXplKFNDUkVFTl9XSURUSCAqIHdpZHRoX3NjYWxlLCBTQ1JFRU5fSEVJR0hUKTtcbiAgICAgICAgdGhpcy5yb290LnNldFBvc2l0aW9uKC1TQ1JFRU5fV0lEVEggKiAwLjUgKiB3aWR0aF9zY2FsZSwgLVNDUkVFTl9IRUlHSFQgKiAwLjUgKiBzY2VuZV9zY2FsZSk7XG4gICAgICAgIHRoaXMucm9vdC5hZGRDb21wb25lbnQoY2MuTWFzayk7ICAgIC8vIOiuvue9ruWJqui+keWMuuWfn1xuXG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5yb290LCBTQ0VORV9UQUcuc2NlbmUpO1xuICAgICAgICB0aGlzLnJvb3Quc2NhbGUgPSBzY2VuZV9zY2FsZTtcblxuICAgICAgICB0aGlzLnJvb3RTaG93WSA9IHRoaXMucm9vdC55O1xuICAgICAgICB0aGlzLnJvb3RIaWRlWSA9IC0gdGhpcy5yb290LmhlaWdodCAqIDI7XG5cbiAgICAgICAgLy8g5Li755qE5pON5L2c6IqC54K5XG4gICAgICAgIHRoaXMucm9vdF93bmQgPSBuZXcgY2MuTm9kZShcImhhbmRsZV9yb290XCIpO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldEFuY2hvclBvaW50KDAsIDApO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucm9vdF93bmQucGFyZW50ID0gdGhpcy5yb290O1xuXG4gICAgICAgIC8vIOWcsOWbvuWxgue6p1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5sYXllcl9udW07IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSBuZXcgY2MuTm9kZShcIm1hcF9sYXllclwiK2luZGV4KTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hZGRDaGlsZChtYXBfbGF5ZXIsICgxMC1pbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5tYXBfbGF5ZXJbaW5kZXhdID0ge25vZGU6bWFwX2xheWVyLCBpbmRleDppbmRleCwgc3ByaXRlOm51bGwsIGZyYW1lOm51bGwsIHJlczpudWxsfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWIneWni+WMluWdkOagh1xuICAgICAgICB0aGlzLmluaXRfeCA9IChTQ1JFRU5fV0lEVEggLSB0aGlzLnNpemUud2lkdGgpICogMC41O1xuICAgICAgICB0aGlzLmluaXRfeSA9IChTQ1JFRU5fSEVJR0hUIC0gdGhpcy5zaXplLmhlaWdodCkgKiAwLjU7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKHRoaXMuaW5pdF94LCB0aGlzLmluaXRfeSk7XG5cbiAgICAgICAgdGhpcy5wbGF5QmFja2dyb3VuZE11c2ljKCk7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tizov5nph4zljIXlkKvlnLrmma/nmoRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgdGhpcy5yb290Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHNlbGYubWFwX2xheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5yb290X3duZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmdldFRvdWNoZXMoKTtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IHRvdWNoZXNbMF0uZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHNlbGYubW92ZU1haW5TY2VuZShzZWxmLmxhc3RfcG9pbnQueCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIGlmIChzZWxmLmxhc3RfcG9pbnQgPT0gbnVsbCl7IFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGludGVydmFsX3ggPSBzZWxmLmxhc3RfcG9pbnQueCAqIDM7XG4gICAgICAgICAgICAvLyB2YXIgaW50ZXJ2YWxfeCA9IChzZWxmLmxhc3RfcG9pbnQueC9NYXRoLmFicyhzZWxmLmxhc3RfcG9pbnQueCkpICogMzA7XG4gICAgICAgICAgICB2YXIgdGVtcF94ID0gc2VsZi5yb290X3duZC5nZXRQb3NpdGlvbigpLnggKyBpbnRlcnZhbF94O1xuICAgICAgICAgICAgdmFyIHRhcmdldF94ID0gc2VsZi5zY2FsZUNoZWNrUG9pbnQodGVtcF94KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlcmF0b3Igb2Ygc2VsZi5tYXBfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3Iubm9kZSl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcGVlZCA9IHNlbGYuc3BlZWRfbGlzdFtpdGVyYXRvci5pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDIsICh0YXJnZXRfeCAtIHNlbGYuaW5pdF94KSAqIHNwZWVkLCAwKS5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5vZGUucnVuQWN0aW9uKG1vdmVfdG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByb290X21vdmVfdG8gPSBjYy5tb3ZlVG8oMiwgdGFyZ2V0X3gsIHNlbGYuaW5pdF95KTtcbiAgICAgICAgICAgIHNlbGYucm9vdF93bmQucnVuQWN0aW9uKHJvb3RfbW92ZV90by5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSkpO1xuXG4gICAgICAgIH0sIHRoaXMpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruS4u+WfjuaYr+WQpuWPr+ingVxuICAgIHNldFZpc2libGU6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIHRoaXMucm9vdFkgPSB0aGlzLnJvb3QueTtcbiAgICAgICAgICAgIHRoaXMucm9vdC55ID0gdGhpcy5yb290SGlkZVk7XG4gICAgICAgICAgICAvLyB0aGlzLnJvb3QuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgICAgICBpZiAoY3VyX3RpbWVfdHlwZSAhPT0gdGhpcy5jdXJfdGltZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yb290LnkgPSB0aGlzLnJvb3RTaG93WTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnp7vliqjkuLvln47kvY3nva5cbiAgICB1cGRhdGVNYWluU2NlbmU6ZnVuY3Rpb24oeCwgeSl7XG4gICAgICAgIHkgPSB5ID8geSA6IHRoaXMuaW5pdF95O1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5tYXBfbGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5tYXBfbGF5ZXJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3BlZWQgPSB0aGlzLnNwZWVkX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgZWxlbWVudC5ub2RlLnNldFBvc2l0aW9uKCh4LXRoaXMuaW5pdF94KSAqIHNwZWVkLCB5IC0gdGhpcy5pbml0X3kpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbih4LCB5KTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65YW35L2T5pi+56S65pWw5o2uLOWMheaLrOiDjOaZryzpqazotZvlhYvnrYlcbiAgICBjcmVhdGVTY2VuZTpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgIC8vIHRoaXMuY2hhbmdlU2NlbmVNYXAoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJTbWFsbFBpYygpO1xuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lTWFwKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwMCwgMSlcblxuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICBpZiAoVXRpbHMuaXNFbXB0eShidWlsZF9saXN0KSAmJiAhdGhpcy53YWl0X2NyZWF0ZV9idWlsZF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVfYnVpbGRfdm8gPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFNjZW5lRXZlbnQuQ3JlYXRlQnVpbGRWb092ZXIsIChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdF9jcmVhdGVfYnVpbGRfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmNyZWF0ZV9idWlsZF92byk7XG4gICAgICAgICAgICAgICAgdGhpcy5iZWZvcmVDcmVhdGVCdWlsZCgpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZUNyZWF0ZUJ1aWxkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5xdWVxdWVDcmVhdGVFZmZlY3QoKTtcbiAgICAgICAgLy8g5byA5aeL6aKE5Yqg6L296LWE5rqQXG4gICAgICAgIERvd25sb2FkTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrQW5pbWFDYWNoZSgpXG4gICAgfSxcblxuICAgIC8vIOW7tui/n+WIm+W7uuWcsOWbvlxuICAgIG1haW5Mb29wOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLm1hcF9jYWNoZSAmJiB0aGlzLm1hcF9jYWNoZS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHZhciBtYXBfaW5mbyA9IHRoaXMubWFwX2NhY2hlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAobWFwX2luZm8ucmVzKXtcbiAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhtYXBfaW5mby5yZXMsIGZ1bmN0aW9uKGxpbWl0X251bSwgcmVzX29iamVjdCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSB0aGlzLm1hcF9sYXllclttYXBfaW5mby5sYXllcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXBfbGF5ZXIgJiYgbWFwX2xheWVyLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9sYXllci5zcHJpdGUgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRQb3NpdGlvbihtYXBfaW5mby5wb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRBbmNob3JQb2ludChtYXBfaW5mby5hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9pbmZvLmxheWVyID09IDMpIHsgICAvL+acgOWQjuS4gOWxgueahOaXtuWAmemcgOimgeaUvuWkpzTlgI1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3RpbWVfdHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIuc3ByaXRlLnNldFNjYWxlKDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRTY2FsZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIubm9kZS5hZGRDaGlsZChtYXBfbGF5ZXIuc3ByaXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLmZyYW1lID0gbWFwX2xheWVyLnNwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9sYXllci5mcmFtZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwX2xheWVyLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKG1hcF9sYXllci5yZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnJlcyA9IG1hcF9pbmZvLnJlcyAgICAgICAgLy8g5YKo5a2Y6LWE5rqQLOWIsOaXtuWAmeWIh+aNouaXtumXtOeahOaXtuWAmeimgemHiuaUvuaOieeahFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdF9udW0gPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc21hbGxfc3ByaXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXMoXCJyZXMvY2VudGVyc2NlbmUvcHJldmlldy9jZW50ZXJjaXR5XzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgdGhpcy5tYXBfY2FjaGUubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRoaXMucXVlcXVlQ3JlYXRlRWZmZWN0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0ID09IDAgJiYgdGhpcy5tYXBfY2FjaGUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIm+W7uumprOi1m+WFi+WcsOWbvlxuICAgIHJlbmRlclNtYWxsUGljOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzbWFsbF9wYXRoICA9IFwicmVzL2NlbnRlcnNjZW5lL3ByZXZpZXcvY2VudGVyY2l0eV9cIiArIHRoaXMuY3VyX3RpbWVfdHlwZSArIFwiLmpwZ1wiXG4gICAgICAgIGlmIChzbWFsbF9wYXRoICYmIHRoaXMuc21hbGxfcGF0aCkgXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhzbWFsbF9wYXRoLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUuc2V0UG9zaXRpb24oMCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWRkQ2hpbGQodGhpcy5zbWFsbF9zcHJpdGUsIDEpO1xuXG4gICAgICAgICAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnNtYWxsX3Nwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIHNwcml0ZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc21hbGxfc3ByaXRlLmdldENvbnRlbnRTaXplKCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRTY2FsZSh0aGlzLnNpemUud2lkdGggLyBzaXplLndpZHRoLCB0aGlzLnNpemUuaGVpZ2h0IC8gc2l6ZS5oZWlnaHQpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnNtYWxsX3BhdGggPSBzbWFsbF9wYXRoO1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvoXliJvlu7rotYTmupBcbiAgICByZW5kZXJNYXBQaWM6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBtYXBfcmVzID0gXCJyZXMvY2VudGVyc2NlbmUvY2VudGVyY2l0eS9cIiArIHRoaXMubWFwX3R5cGU7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmxheWVyX2ltZ19saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGNjLnYyKDAsIDApXG4gICAgICAgICAgICB2YXIgYXAgPSBjYy52MigwLCAwKVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubGF5ZXJfaW1nX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgLy8gdmFyIHJlc19wYXRoID0gbWFwX3JlcyArIFwiL1wiICsgKGluZGV4ICsgMSkgKyBcIi9cIiArIGVsZW1lbnQ7XG4gICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBtYXBfcmVzICsgXCIvXCIgICsgZWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICBwb3MueCA9IC04MDtcbiAgICAgICAgICAgIH1lbHNlIGlmIChpbmRleCA9PSAxKXtcblxuICAgICAgICAgICAgfWVsc2UgaWYgKGluZGV4ID09IDIpe1xuICAgICAgICAgICAgICAgIHBvcy54ID0gNTk7XG4gICAgICAgICAgICAgICAgcG9zLnkgPSA0NzI7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwb3MueSA9IHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgYXAueSA9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwX2NhY2hlLnB1c2goe3JlczpyZXNfcGF0aCwgbGF5ZXI6aW5kZXgsIHBvczpwb3MsIGFwOmFwfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Zyw5Zu+56e75YqoXG4gICAgbW92ZU1haW5TY2VuZTogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzSW5HdWlkZSgpKVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgeCA9IHRoaXMucm9vdF93bmQuZ2V0UG9zaXRpb24oKS54ICsgeDtcbiAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoeCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKF94KTtcbiAgICB9LFxuXG4gICAgbW92ZVRvQnVpbGQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkX2l0ZW1zW2lkXSkge1xuICAgICAgICAgICAgdmFyIGJ1aWxkX25kID0gdGhpcy5idWlsZF9pdGVtc1tpZF0ucm9vdF93bmQ7XG4gICAgICAgICAgICB2YXIgYnVpbGRfd29yZF9wb3MgPSBidWlsZF9uZC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3BzbyA9IHRoaXMucm9vdF93bmQuY29udmVydFRvTm9kZVNwYWNlQVIoYnVpbGRfd29yZF9wb3MpO1xuXG4gICAgICAgICAgICAvLyB2YXIgX3ggPSB0aGlzLnNjYWxlQ2hlY2tQb2ludCgtKGZpbmFsX3Bzby54IC0gY2Mud2luU2l6ZS53aWR0aCAqIDAuNSkpO1xuICAgICAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoLShmaW5hbF9wc28ueCAtIFNDUkVFTl9XSURUSCAqIDAuNSkpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy51cGRhdGVNYWluU2NlbmUoX3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIpOaWreeCueaYr+WQpui2iueVjFxuICAgIHNjYWxlQ2hlY2tQb2ludDogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIF94ID0geDtcbiAgICAgICAgaWYgKHggPiAwKSB7XG4gICAgICAgICAgICBfeCA9IDBcbiAgICAgICAgfSBlbHNlIGlmICh4IDwgKHRoaXMucm9vdC53aWR0aCAtIHRoaXMuc2l6ZS53aWR0aCkpIHtcbiAgICAgICAgICAgIF94ID0gdGhpcy5yb290LndpZHRoIC0gdGhpcy5zaXplLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfeDtcbiAgICB9LFxuXG4gICAgYmVmb3JlQ3JlYXRlQnVpbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICB2YXIgbGlzdE51bSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpLmxlbmd0aDtcbiAgICAgICAgdmFyIHNjaGVJbmRleCA9IDA7XG4gICAgICAgIHZhciBjcmVhdGVJdGVtU2NoZSA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBidWlsZEtleSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpW3NjaGVJbmRleF07XG4gICAgICAgICAgICB2YXIgYnVpbGRJbmZvID0gYnVpbGRfbGlzdFtidWlsZEtleV07XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1aWxkSXRlbShidWlsZEluZm8pO1xuICAgICAgICAgICAgaWYgKHNjaGVJbmRleCA9PSBsaXN0TnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChjcmVhdGVJdGVtU2NoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2hlSW5kZXggKys7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIDEwMCwgbGlzdE51bSk7XG5cblxuICAgICAgICAvLyB2YXIgYmF0dGxlX2RyYW1hX21vZGVsID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgLy8gYmF0dGxlX2RyYW1hX21vZGVsLnByZWxvYWREcmFtYVNjZW5lKCk7XG4gICAgfSxcblxuXG4gICAgY3JlYXRlQnVpbGRJdGVtOiBmdW5jdGlvbihidWlsZEluZm8pIHtcbiAgICAgICAgdmFyIGJ1aWxkX2l0ZW0gPSBuZXcgQnVpbGRJdGVtKGJ1aWxkSW5mbywgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKTtcbiAgICAgICAgdmFyIGxheWVySW5kZXggPSBidWlsZEluZm8uY29uZmlnLmxheWVyO1xuICAgICAgICB0aGlzLm1hcF9sYXllcltsYXllckluZGV4IC0gMV0ubm9kZS5hZGRDaGlsZChidWlsZF9pdGVtLnJvb3Rfd25kLCA5OTkpO1xuXG4gICAgICAgIC8vIOWIpOaWreiKgueCuVxuICAgICAgICB0aGlzLmJ1aWxkX2l0ZW1zW2J1aWxkSW5mby5jb25maWcuYmlkXSA9IGJ1aWxkX2l0ZW07XG4gICAgICAgIGlmICh0aGlzLmdldF9idWlsZF9jYltidWlsZEluZm8uY29uZmlnLmJpZF0pIHtcbiAgICAgICAgICAgIHZhciBjYWxiYWNrcyA9IHRoaXMuZ2V0X2J1aWxkX2NiW2J1aWxkSW5mby5jb25maWcuYmlkXTtcbiAgICAgICAgICAgIGZvciAodmFyIGNiX2kgaW4gY2FsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjYWxiYWNrc1tjYl9pXShidWlsZF9pdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VTY2VuZU1hcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXBfdHlwZSB8fCB0aGlzLm1hcF90eXBlICE9PSB0aGlzLmN1cl90aW1lX3R5cGUpIHsgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5tYXBfdHlwZSA9IHRoaXMuY3VyX3RpbWVfdHlwZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU21hbGxQaWMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTWFwUGljKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lRWZmZWN0KCk7XG4gICAgICAgICAgICAvLyDlvIDlp4vliJvlu7rlnLDlm75cbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lcil7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lciA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWluTG9vcCgpO1xuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDQwMCwgLTEpO1xuICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaUueWPmOW9k+WJjeWcuuaZr+eahOS4gOS6m+eJueaViFxuICAgIGNoYW5nZVNjZW5lRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgZWZmZWN0SW5kZXggaW4gdGhpcy5zY2VuZV9lZmZlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0W2VmZmVjdEluZGV4XS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgLy8gdmFyIGVmZmVjdEl0ZW4gPSB0aGlzLnNjZW5lX2VmZmVjdC5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gZWZmZWN0SXRlbi5kZWxldGVNZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmFseXNpc0VmZmVjdCgpXG4gICAgfSxcblxuICAgIC8vIOino+aekOeJueaViOaVsOaNrlxuICAgIGFuYWx5c2lzRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmJ1aWxkaW5nX2xpc3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGJ1aWxkSW5kZXggaW4gdGhpcy5jb25maWcuYnVpbGRpbmdfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBidWlsZEl0ZW0gPSB0aGlzLmNvbmZpZy5idWlsZGluZ19saXN0W2J1aWxkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0uZHVuX2lkID09IDAgfHwgdGhpcy5jdXJfdGltZV90eXBlID09IGJ1aWxkSXRlbS5kdW5faWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkSXRlbS50eXBlICE9PSAgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKSB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0gJiYgYnVpbGRJdGVtLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0ucmVzID09IFwiRTU0NTM5XCIgfHwgYnVpbGRJdGVtLnJlcyA9PSBcIkU1NDU0MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0LnB1c2goYnVpbGRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rlnLrmma/nibnmlYhcbiAgICBxdWVxdWVDcmVhdGVFZmZlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBmb3IgKHZhciBlZmZlY3RJbmR4ID0gMDsgZWZmZWN0SW5keCA8IHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aDsgZWZmZWN0SW5keCArKykge1xuICAgICAgICAgICAgdmFyIGVmZmVjdENvbmYgPSB0aGlzLmVmZmVjdF9yZW5kZXJfbGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgdmFyIGJ1aWxkSXRlbSA9IG5ldyBCdWlsZEl0ZW0oZWZmZWN0Q29uZiwgZWZmZWN0Q29uZi50eXBlKTtcbiAgICAgICAgICAgIHRoaXMubWFwX2xheWVyW2VmZmVjdENvbmYubGF5ZXIgLSAxXS5ub2RlLmFkZENoaWxkKGJ1aWxkSXRlbS5yb290X3duZCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lX2VmZmVjdC5wdXNoKGJ1aWxkSXRlbSk7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgcGxheUJhY2tncm91bmRNdXNpYzogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLlNDRU5FLCBcInNfMDAyXCIsIHRydWUpO1xuICAgIH0sXG5cbiAgICBnZXRCdWlsZEJ5SWQ6IGZ1bmN0aW9uKGlkLCBmaW5pc2hfY2Ipe1xuICAgICAgICBpZiAodGhpcy5idWlsZF9pdGVtc1tpZF0pIHtcbiAgICAgICAgICAgIGZpbmlzaF9jYih0aGlzLmJ1aWxkX2l0ZW1zW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0X2J1aWxkX2NiW2lkXSlcbiAgICAgICAgICAgICAgICB0aGlzLmdldF9idWlsZF9jYltpZF0gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ2V0X2J1aWxkX2NiW2lkXS5wdXNoKGZpbmlzaF9jYik7XG4gICAgICAgIH1cblxuICAgICAgICBjYy5sb2codGhpcy5nZXRfYnVpbGRfY2IpO1xuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYWluU2NlbmU7Il19