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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/redbag/view/redbag_send_panel.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, '9c0d5vfkGBJN7b1Ocs11bzH', 'redbag_send_panel');
// Scripts/mod/redbag/view/redbag_send_panel.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: @syg.com(必填, 创建模块的人员)
// @description:
//      抢红包
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RedbagController = require("redbag_controller");
 
var RedbagEvent = require("redbag_event");
 
var RedBagItem = require("redbag_item");
 
var RedBagListPanel = require("redbag_list_panel");
 
var BackpackController = require("backpack_controller");
 
var BackPackConst = require("backpack_const");
 
var RedBagGetPanel = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("redbag", "redbag_send");
    this.ctrl = RedbagController.getInstance();
    this.size = cc.v2(644, 740);
    this.is_can_save = false;
    this.item_list = {};
    this.need_list = {};
    this.default_msg = Utils.TI18N("身为土豪,有钱任性");
    this.is_send_proto = false;
    this.use_assert = 0; //使用道具还是资产法红包
 
    this.msg_list = {};
    this.extend_id = arguments[0] || this.ctrl.getModel().getHaveItemID() || 1;
    this.select_msg = null;
  },
  initPanel: function initPanel() {
    // this.background = this.seekChild("background");
    this.main_panel = this.seekChild("main_panel");
    this.top_panel = this.seekChild(this.main_panel, "top_panel");
    this.bottom_panel = this.seekChild(this.main_panel, "bottom_panel");
    this.num_panel = this.seekChild(this.bottom_panel, "num_panel");
    this.send_btn = this.seekChild(this.bottom_panel, "send_btn");
    this.send_btn_red_point = this.seekChild(this.send_btn, "red_point");
    this.send_btn_red_point.active = false;
    this.btn_label = this.seekChild(this.send_btn, "label", cc.RichText);
    this.send_tips_lb = this.seekChild("send_tips", cc.Label);
    this.left_btn = this.seekChild(this.top_panel, "left_btn");
    this.right_btn = this.seekChild(this.top_panel, "right_btn");
    this.right_btn_red_point = this.seekChild(this.right_btn, "red_point");
    this.right_btn_red_point.active = false;
    this.left_btn_red_point = this.seekChild(this.left_btn, "red_point");
    this.left_btn_red_point.active = false;
    this.item_container = this.seekChild(this.bottom_panel, "item_container");
    this.num_label = this.seekChild(this.bottom_panel, "num_label", cc.Label);
    this.send_content = this.seekChild(this.bottom_panel, "send_content", cc.Label);
    this.createDesc();
    this.requireProto();
  },
  createDesc: function createDesc() {
    this.send_notice = this.seekChild(this.top_panel, "send_notice", cc.RichText);
    this.send_notice.string = cc.js.formatStr(Utils.TI18N("(今日还可发<color=#249003>%s</c>)"), 100); //红包金额
 
    this.coin_label = this.seekChild(this.bottom_panel, "coin_label", cc.RichText);
    this.coin_img = this.seekChild(this.bottom_panel, "coin_img", cc.Sprite);
    this.updateBagList();
  },
  requireProto: function requireProto() {
    this.ctrl.send13546();
  },
  registerEvent: function registerEvent() {
    this.send_btn.on(cc.Node.EventType.TOUCH_END, function () {
      if (this.red_send_info == null || this.select_vo == null) return;
 
      if (this.cost_item_bid && this.cost_item_bid != 0) {
        this.ctrl.sender13535(this.select_vo.id, 1);
      } else {
        var charge_config = gdata("charge_data", "data_charge_data", [this.select_vo.charge_id]);
 
        if (charge_config) {
          SDK.pay(charge_config.val, null, charge_config.id, charge_config.name, charge_config.name, null, null);
        }
      }
    }.bind(this));
    this.left_btn.on(cc.Node.EventType.TOUCH_END, function () {
      if (this.list_view) {
        this.list_view.runLeftPostion();
      }
    }.bind(this));
    this.right_btn.on(cc.Node.EventType.TOUCH_END, function () {
      if (this.list_view) {
        this.list_view.runRightPostion();
      }
    }.bind(this));
    this.addGlobalEvent(RedbagEvent.Update_Red_Bag_Event, function (data) {
      this.updateRedInfo(data);
    }.bind(this)); //道具数量更新
 
    this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, data_list) {
      this.updateItemNum(bag_code, data_list);
    }.bind(this));
    this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, data_list) {
      this.updateItemNum(bag_code, data_list);
    }.bind(this));
    this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, data_list) {
      this.updateItemNum(bag_code, data_list);
    }.bind(this));
  },
  openRootWnd: function openRootWnd() {},
  updateBagList: function updateBagList() {
    if (this.list_view == null) {
      var list_size = cc.size(580, 370);
      var setting = {
        item_class: RedBagItem,
        // 单元类
        start_x: 0,
        // 第一个单元的X起点
        space_x: 0,
        // x方向的间隔
        start_y: 2,
        // 第一个单元的Y起点
        space_y: 0,
        // y方向的间隔
        item_width: 262,
        // 单元的尺寸width
        item_height: 327,
        // 单元的尺寸height
        row: 1,
        // 行数,作用于水平滚动类型
        col: 1 // 列数,作用于垂直滚动类型
 
      };
      this.list_view = new RedBagListPanel();
      this.list_view.createScroll(this.top_panel, cc.v2(270, 20), ScrollViewDir.horizontal, ScrollViewStartPos.top, list_size, setting, cc.v2(0.5, 0.5));
    }
 
    var config = Config.guild_data.data_guild_red_bag;
    var list = [];
    var index = 0;
 
    for (var i in config) {
      var v = config[i];
      list[index] = {
        data: v,
        open_type: 1
      };
      index = index + 1;
    }
 
    for (var i in list) {
      var v = list[i];
      v.sort_index = 1;
      if (v.data.id == this.extend_id) v.sort_index = 0;
    }
 
    list.sort(Utils.tableLowerSorter(["sort_index", "id"]));
    this.list_view.setData(list);
    this.list_view.addEndCallBack(function () {
      this.updateMessage();
    }.bind(this));
    this.list_view.setData(list);
  },
  updateMessage: function updateMessage() {
    var item = this.list_view.getSelectItem();
    var vo = null;
 
    if (item) {
      vo = item.getData();
    }
 
    if (item == null) return;
    if (this.select_vo && this.select_vo == vo) return;
    this.select_vo = vo;
    if (!this.select_vo) return;
    var data = this.select_vo; //红包金额
 
    var coint = data.assets;
    var item_id = gdata("item_data", "data_assets_label2id", [coint]);
    var item_config = Utils.getItemConfig(item_id);
 
    if (item_config) {
      this.coin_label.string = String(data.val);
      var res = PathTool.getItemRes(item_config.icon);
      this.loadRes(res, function (res_object) {
        this.coin_img.spriteFrame = res_object;
      }.bind(this));
    }
 
    this.send_content.string = data.msg;
    this.num_label.string = data.num;
    this.fileRewardsItem(data.reward);
    this.showRedSendNum();
  },
  fileRewardsItem: function fileRewardsItem(list) {
    if (list == null || Utils.next(list) == null) return;
 
    for (var k in this.item_list) {
      var v = this.item_list[k];
      v.setVisible(false);
    }
 
    var scale = 0.7;
    var off = 10;
 
    for (var i in list) {
      var v = list[i];
 
      if (this.item_list[i] == null) {
        var item = ItemsPool.getInstance().getItem("backpack_item");
        item.initConfig(false, scale, false, false);
        item.show();
        var x = 20 + (120 * scale + off) * (i - 1) + 120 * scale * 0.5 - 388 / 2 + 60 * scale;
        item.setPosition(x, 50);
        item.setParent(this.item_container);
        this.item_list[i] = item;
      }
 
      var item = this.item_list[i];
      item.setData({
        bid: v[0],
        num: v[1]
      });
      item.setVisible(true);
    }
  },
  //设置红包可发次数
  updateRedInfo: function updateRedInfo(data) {
    this.red_send_info = data;
    this.showRedSendNum();
  },
  updateItemNum: function updateItemNum(bag_code, data_list) {
    if (this.cost_item_bid) {
      if (bag_code != null && data_list != null) {
        if (bag_code == BackPackConst.Bag_Code.BACKPACK) {
          for (var i in data_list) {
            var v = data_list[i];
 
            if (v && v.base_id != null && this.cost_item_bid == v.base_id) {
              this.showRedSendNum();
              break;
            }
          }
        }
      }
    }
  },
  showRedSendNum: function showRedSendNum() {
    if (this.red_send_info == null || this.select_vo == null) return;
    var red_config = Config.guild_data.data_guild_red_bag[this.select_vo.id];
    if (!red_config) return;
    this.cost_item_bid = 0; //可以消耗道具发红包的道具bid
 
    this.send_tips_lb.node.active = false;
    var send_num = 0;
 
    for (var i in this.red_send_info) {
      var v = this.red_send_info[i];
 
      if (v.id == this.select_vo.id) {
        send_num = v.num;
        break;
      }
    }
 
    send_num = this.select_vo.limit - send_num;
 
    if (send_num < 0) {
      send_num = 0;
    }
 
    this.send_notice.string = cc.js.formatStr(Utils.TI18N("(今日还可发<color=#249003>%s</c>)"), send_num);
 
    if (send_num == 0) {
      this.btn_label.string = Utils.TI18N("次数已达上限");
    } else {
      var charge_config = gdata("charge_data", "data_charge_data", [this.select_vo.charge_id]);
 
      if (this.checkLossItemIsEnough(red_config.loss_item)) {
        var bid = red_config.loss_item[0][0];
        var num = red_config.loss_item[0][1];
        var item_cfg = Utils.getItemConfig(bid);
 
        if (item_cfg) {
          this.cost_item_bid = bid;
          var res = PathTool.getItemRes(item_cfg.icon);
          this.btn_label.string = cc.js.formatStr(Utils.TI18N("<img src='%s'/><outline width=2 color=#6C2B00>%s 发红包</outline>"), item_cfg.icon, num);
          this.loadRes(res, function (resObject) {
            this.btn_label.addSpriteFrame(resObject);
          }.bind(this));
          this.send_tips_lb.string = cc.js.formatStr(Utils.TI18N("当前拥有红包令,消耗%s个可发放1次该红包"), num);
          this.send_tips_lb.node.active = true;
        }
      } else if (charge_config) this.btn_label.string = cc.js.formatStr(Utils.TI18N("<outline width=2 color=#6C2B00>%s元 发红包</outline>"), charge_config.val);
    }
 
    if (this.cur_send_num != send_num) {
      this.cur_send_num = send_num;
 
      if (send_num == 0) {
        Utils.setGreyButton(this.send_btn, true); // this.btn_label
      } else {
        Utils.setGreyButton(this.send_btn, false); // enableOutline
      }
    }
  },
  //判断道具数量是否足够发红包
  checkLossItemIsEnough: function checkLossItemIsEnough(loss_item) {
    var is_enough = false;
 
    if (loss_item && loss_item[0] != null) {
      var bid = loss_item[0][0];
      var need_num = loss_item[0][1];
      var have_num = BackpackController.getInstance().getModel().getItemNumByBid(bid);
 
      if (have_num >= need_num) {
        is_enough = true;
      }
    }
 
    return is_enough;
  },
  setVisibleStatus: function setVisibleStatus(bool) {
    this.setVisible(bool);
  },
  onShow: function onShow() {},
  setData: function setData(data) {},
  onDelete: function onDelete() {
    if (this.list_view) {
      this.list_view.deleteMe();
      this.list_view = null;
    }
 
    if (this.item_list) {
      for (var k in this.item_list) {
        var v = this.item_list[k];
        v.deleteMe();
      }
 
      this.item_list = null;
    }
  }
});
module.exports = RedBagGetPanel;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxyZWRiYWdcXHZpZXdcXHJlZGJhZ19zZW5kX3BhbmVsLmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlJlZGJhZ0NvbnRyb2xsZXIiLCJSZWRiYWdFdmVudCIsIlJlZEJhZ0l0ZW0iLCJSZWRCYWdMaXN0UGFuZWwiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJCYWNrUGFja0NvbnN0IiwiUmVkQmFnR2V0UGFuZWwiLCJjYyIsIkNsYXNzIiwiQmFzZVBhbmVsIiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiY3RybCIsImdldEluc3RhbmNlIiwic2l6ZSIsInYyIiwiaXNfY2FuX3NhdmUiLCJpdGVtX2xpc3QiLCJuZWVkX2xpc3QiLCJkZWZhdWx0X21zZyIsIlV0aWxzIiwiVEkxOE4iLCJpc19zZW5kX3Byb3RvIiwidXNlX2Fzc2VydCIsIm1zZ19saXN0IiwiZXh0ZW5kX2lkIiwiYXJndW1lbnRzIiwiZ2V0TW9kZWwiLCJnZXRIYXZlSXRlbUlEIiwic2VsZWN0X21zZyIsImluaXRQYW5lbCIsIm1haW5fcGFuZWwiLCJzZWVrQ2hpbGQiLCJ0b3BfcGFuZWwiLCJib3R0b21fcGFuZWwiLCJudW1fcGFuZWwiLCJzZW5kX2J0biIsInNlbmRfYnRuX3JlZF9wb2ludCIsImFjdGl2ZSIsImJ0bl9sYWJlbCIsIlJpY2hUZXh0Iiwic2VuZF90aXBzX2xiIiwiTGFiZWwiLCJsZWZ0X2J0biIsInJpZ2h0X2J0biIsInJpZ2h0X2J0bl9yZWRfcG9pbnQiLCJsZWZ0X2J0bl9yZWRfcG9pbnQiLCJpdGVtX2NvbnRhaW5lciIsIm51bV9sYWJlbCIsInNlbmRfY29udGVudCIsImNyZWF0ZURlc2MiLCJyZXF1aXJlUHJvdG8iLCJzZW5kX25vdGljZSIsInN0cmluZyIsImpzIiwiZm9ybWF0U3RyIiwiY29pbl9sYWJlbCIsImNvaW5faW1nIiwiU3ByaXRlIiwidXBkYXRlQmFnTGlzdCIsInNlbmQxMzU0NiIsInJlZ2lzdGVyRXZlbnQiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJyZWRfc2VuZF9pbmZvIiwic2VsZWN0X3ZvIiwiY29zdF9pdGVtX2JpZCIsInNlbmRlcjEzNTM1IiwiaWQiLCJjaGFyZ2VfY29uZmlnIiwiZ2RhdGEiLCJjaGFyZ2VfaWQiLCJTREsiLCJwYXkiLCJ2YWwiLCJuYW1lIiwiYmluZCIsImxpc3RfdmlldyIsInJ1bkxlZnRQb3N0aW9uIiwicnVuUmlnaHRQb3N0aW9uIiwiYWRkR2xvYmFsRXZlbnQiLCJVcGRhdGVfUmVkX0JhZ19FdmVudCIsImRhdGEiLCJ1cGRhdGVSZWRJbmZvIiwiRXZlbnRJZCIsIkFERF9HT09EUyIsImJhZ19jb2RlIiwiZGF0YV9saXN0IiwidXBkYXRlSXRlbU51bSIsIkRFTEVURV9HT09EUyIsIk1PRElGWV9HT09EU19OVU0iLCJvcGVuUm9vdFduZCIsImxpc3Rfc2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsImNyZWF0ZVNjcm9sbCIsIlNjcm9sbFZpZXdEaXIiLCJob3Jpem9udGFsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwiY29uZmlnIiwiQ29uZmlnIiwiZ3VpbGRfZGF0YSIsImRhdGFfZ3VpbGRfcmVkX2JhZyIsImxpc3QiLCJpbmRleCIsImkiLCJ2Iiwib3Blbl90eXBlIiwic29ydF9pbmRleCIsInNvcnQiLCJ0YWJsZUxvd2VyU29ydGVyIiwic2V0RGF0YSIsImFkZEVuZENhbGxCYWNrIiwidXBkYXRlTWVzc2FnZSIsIml0ZW0iLCJnZXRTZWxlY3RJdGVtIiwidm8iLCJnZXREYXRhIiwiY29pbnQiLCJhc3NldHMiLCJpdGVtX2lkIiwiaXRlbV9jb25maWciLCJnZXRJdGVtQ29uZmlnIiwiU3RyaW5nIiwicmVzIiwiZ2V0SXRlbVJlcyIsImljb24iLCJsb2FkUmVzIiwicmVzX29iamVjdCIsInNwcml0ZUZyYW1lIiwibXNnIiwibnVtIiwiZmlsZVJld2FyZHNJdGVtIiwicmV3YXJkIiwic2hvd1JlZFNlbmROdW0iLCJuZXh0IiwiayIsInNldFZpc2libGUiLCJzY2FsZSIsIm9mZiIsIkl0ZW1zUG9vbCIsImdldEl0ZW0iLCJpbml0Q29uZmlnIiwic2hvdyIsIngiLCJzZXRQb3NpdGlvbiIsInNldFBhcmVudCIsImJpZCIsIkJhZ19Db2RlIiwiQkFDS1BBQ0siLCJiYXNlX2lkIiwicmVkX2NvbmZpZyIsIm5vZGUiLCJzZW5kX251bSIsImxpbWl0IiwiY2hlY2tMb3NzSXRlbUlzRW5vdWdoIiwibG9zc19pdGVtIiwiaXRlbV9jZmciLCJyZXNPYmplY3QiLCJhZGRTcHJpdGVGcmFtZSIsImN1cl9zZW5kX251bSIsInNldEdyZXlCdXR0b24iLCJpc19lbm91Z2giLCJuZWVkX251bSIsImhhdmVfbnVtIiwiZ2V0SXRlbU51bUJ5QmlkIiwic2V0VmlzaWJsZVN0YXR1cyIsImJvb2wiLCJvblNob3ciLCJvbkRlbGV0ZSIsImRlbGV0ZU1lIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLGdCQUFnQixHQUFHRCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUUsV0FBVyxHQUFHRixPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJRyxVQUFVLEdBQUdILE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlJLGVBQWUsR0FBR0osT0FBTyxDQUFDLG1CQUFELENBQTdCOztBQUNBLElBQUlLLGtCQUFrQixHQUFHTCxPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSU0sYUFBYSxHQUFHTixPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBRUEsSUFBSU8sY0FBYyxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUMxQixhQUFTQyxTQURpQjtBQUUxQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTCxHQUFrQmIsUUFBUSxDQUFDYyxhQUFULENBQXVCLFFBQXZCLEVBQWlDLGFBQWpDLENBQWxCO0FBQ0EsU0FBS0MsSUFBTCxHQUFZYixnQkFBZ0IsQ0FBQ2MsV0FBakIsRUFBWjtBQUNBLFNBQUtDLElBQUwsR0FBWVIsRUFBRSxDQUFDUyxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBWjtBQUVBLFNBQUtDLFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixFQUFqQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUJDLEtBQUssQ0FBQ0MsS0FBTixDQUFZLFdBQVosQ0FBbkI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixDQUFsQixDQVZjLENBVU87O0FBQ3JCLFNBQUtDLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCQyxTQUFTLENBQUMsQ0FBRCxDQUFULElBQWdCLEtBQUtkLElBQUwsQ0FBVWUsUUFBVixHQUFxQkMsYUFBckIsRUFBaEIsSUFBd0QsQ0FBekU7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLElBQWxCO0FBQ0gsR0FoQnlCO0FBa0IxQkMsRUFBQUEsU0FBUyxFQUFFLHFCQUFZO0FBQ25CO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixLQUFLQyxTQUFMLENBQWUsWUFBZixDQUFsQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsS0FBS0QsU0FBTCxDQUFlLEtBQUtELFVBQXBCLEVBQWdDLFdBQWhDLENBQWpCO0FBQ0EsU0FBS0csWUFBTCxHQUFvQixLQUFLRixTQUFMLENBQWUsS0FBS0QsVUFBcEIsRUFBZ0MsY0FBaEMsQ0FBcEI7QUFDQSxTQUFLSSxTQUFMLEdBQWlCLEtBQUtILFNBQUwsQ0FBZSxLQUFLRSxZQUFwQixFQUFrQyxXQUFsQyxDQUFqQjtBQUNBLFNBQUtFLFFBQUwsR0FBZ0IsS0FBS0osU0FBTCxDQUFlLEtBQUtFLFlBQXBCLEVBQWtDLFVBQWxDLENBQWhCO0FBQ0EsU0FBS0csa0JBQUwsR0FBMEIsS0FBS0wsU0FBTCxDQUFlLEtBQUtJLFFBQXBCLEVBQThCLFdBQTlCLENBQTFCO0FBQ0EsU0FBS0Msa0JBQUwsQ0FBd0JDLE1BQXhCLEdBQWlDLEtBQWpDO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixLQUFLUCxTQUFMLENBQWUsS0FBS0ksUUFBcEIsRUFBOEIsT0FBOUIsRUFBdUM5QixFQUFFLENBQUNrQyxRQUExQyxDQUFqQjtBQUNBLFNBQUtDLFlBQUwsR0FBb0IsS0FBS1QsU0FBTCxDQUFlLFdBQWYsRUFBNEIxQixFQUFFLENBQUNvQyxLQUEvQixDQUFwQjtBQUVBLFNBQUtDLFFBQUwsR0FBZ0IsS0FBS1gsU0FBTCxDQUFlLEtBQUtDLFNBQXBCLEVBQStCLFVBQS9CLENBQWhCO0FBQ0EsU0FBS1csU0FBTCxHQUFpQixLQUFLWixTQUFMLENBQWUsS0FBS0MsU0FBcEIsRUFBK0IsV0FBL0IsQ0FBakI7QUFDQSxTQUFLWSxtQkFBTCxHQUEyQixLQUFLYixTQUFMLENBQWUsS0FBS1ksU0FBcEIsRUFBK0IsV0FBL0IsQ0FBM0I7QUFDQSxTQUFLQyxtQkFBTCxDQUF5QlAsTUFBekIsR0FBa0MsS0FBbEM7QUFFQSxTQUFLUSxrQkFBTCxHQUEwQixLQUFLZCxTQUFMLENBQWUsS0FBS1csUUFBcEIsRUFBOEIsV0FBOUIsQ0FBMUI7QUFDQSxTQUFLRyxrQkFBTCxDQUF3QlIsTUFBeEIsR0FBaUMsS0FBakM7QUFFQSxTQUFLUyxjQUFMLEdBQXNCLEtBQUtmLFNBQUwsQ0FBZSxLQUFLRSxZQUFwQixFQUFrQyxnQkFBbEMsQ0FBdEI7QUFDQSxTQUFLYyxTQUFMLEdBQWlCLEtBQUtoQixTQUFMLENBQWUsS0FBS0UsWUFBcEIsRUFBa0MsV0FBbEMsRUFBK0M1QixFQUFFLENBQUNvQyxLQUFsRCxDQUFqQjtBQUVBLFNBQUtPLFlBQUwsR0FBb0IsS0FBS2pCLFNBQUwsQ0FBZSxLQUFLRSxZQUFwQixFQUFrQyxjQUFsQyxFQUFrRDVCLEVBQUUsQ0FBQ29DLEtBQXJELENBQXBCO0FBRUEsU0FBS1EsVUFBTDtBQUNBLFNBQUtDLFlBQUw7QUFDSCxHQTdDeUI7QUFnRDFCRCxFQUFBQSxVQUFVLEVBQUUsc0JBQVk7QUFDcEIsU0FBS0UsV0FBTCxHQUFtQixLQUFLcEIsU0FBTCxDQUFlLEtBQUtDLFNBQXBCLEVBQStCLGFBQS9CLEVBQThDM0IsRUFBRSxDQUFDa0MsUUFBakQsQ0FBbkI7QUFDQSxTQUFLWSxXQUFMLENBQWlCQyxNQUFqQixHQUEwQi9DLEVBQUUsQ0FBQ2dELEVBQUgsQ0FBTUMsU0FBTixDQUFnQm5DLEtBQUssQ0FBQ0MsS0FBTixDQUFZLDhCQUFaLENBQWhCLEVBQTZELEdBQTdELENBQTFCLENBRm9CLENBSXBCOztBQUNBLFNBQUttQyxVQUFMLEdBQWtCLEtBQUt4QixTQUFMLENBQWUsS0FBS0UsWUFBcEIsRUFBa0MsWUFBbEMsRUFBZ0Q1QixFQUFFLENBQUNrQyxRQUFuRCxDQUFsQjtBQUNBLFNBQUtpQixRQUFMLEdBQWdCLEtBQUt6QixTQUFMLENBQWUsS0FBS0UsWUFBcEIsRUFBa0MsVUFBbEMsRUFBOEM1QixFQUFFLENBQUNvRCxNQUFqRCxDQUFoQjtBQUVBLFNBQUtDLGFBQUw7QUFDSCxHQXpEeUI7QUEyRDFCUixFQUFBQSxZQUFZLEVBQUUsd0JBQVk7QUFDdEIsU0FBS3ZDLElBQUwsQ0FBVWdELFNBQVY7QUFDSCxHQTdEeUI7QUErRDFCQyxFQUFBQSxhQUFhLEVBQUUseUJBQVk7QUFDdkIsU0FBS3pCLFFBQUwsQ0FBYzBCLEVBQWQsQ0FBaUJ4RCxFQUFFLENBQUN5RCxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQW5DLEVBQThDLFlBQVk7QUFDdEQsVUFBSSxLQUFLQyxhQUFMLElBQXNCLElBQXRCLElBQThCLEtBQUtDLFNBQUwsSUFBa0IsSUFBcEQsRUFBMEQ7O0FBQzFELFVBQUksS0FBS0MsYUFBTCxJQUFzQixLQUFLQSxhQUFMLElBQXNCLENBQWhELEVBQW1EO0FBQy9DLGFBQUt4RCxJQUFMLENBQVV5RCxXQUFWLENBQXNCLEtBQUtGLFNBQUwsQ0FBZUcsRUFBckMsRUFBeUMsQ0FBekM7QUFDSCxPQUZELE1BRU87QUFDSCxZQUFJQyxhQUFhLEdBQUdDLEtBQUssQ0FBQyxhQUFELEVBQWdCLGtCQUFoQixFQUFvQyxDQUFDLEtBQUtMLFNBQUwsQ0FBZU0sU0FBaEIsQ0FBcEMsQ0FBekI7O0FBQ0EsWUFBSUYsYUFBSixFQUFtQjtBQUNmRyxVQUFBQSxHQUFHLENBQUNDLEdBQUosQ0FBUUosYUFBYSxDQUFDSyxHQUF0QixFQUEyQixJQUEzQixFQUFpQ0wsYUFBYSxDQUFDRCxFQUEvQyxFQUFtREMsYUFBYSxDQUFDTSxJQUFqRSxFQUF1RU4sYUFBYSxDQUFDTSxJQUFyRixFQUEyRixJQUEzRixFQUFpRyxJQUFqRztBQUNIO0FBQ0o7QUFDSixLQVY2QyxDQVU1Q0MsSUFWNEMsQ0FVdkMsSUFWdUMsQ0FBOUM7QUFZQSxTQUFLbkMsUUFBTCxDQUFjbUIsRUFBZCxDQUFpQnhELEVBQUUsQ0FBQ3lELElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBbkMsRUFBOEMsWUFBWTtBQUN0RCxVQUFJLEtBQUtjLFNBQVQsRUFBb0I7QUFDaEIsYUFBS0EsU0FBTCxDQUFlQyxjQUFmO0FBQ0g7QUFDSixLQUo2QyxDQUk1Q0YsSUFKNEMsQ0FJdkMsSUFKdUMsQ0FBOUM7QUFLQSxTQUFLbEMsU0FBTCxDQUFla0IsRUFBZixDQUFrQnhELEVBQUUsQ0FBQ3lELElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBcEMsRUFBK0MsWUFBWTtBQUN2RCxVQUFJLEtBQUtjLFNBQVQsRUFBb0I7QUFDaEIsYUFBS0EsU0FBTCxDQUFlRSxlQUFmO0FBQ0g7QUFDSixLQUo4QyxDQUk3Q0gsSUFKNkMsQ0FJeEMsSUFKd0MsQ0FBL0M7QUFNQSxTQUFLSSxjQUFMLENBQW9CbEYsV0FBVyxDQUFDbUYsb0JBQWhDLEVBQXNELFVBQVVDLElBQVYsRUFBZ0I7QUFDbEUsV0FBS0MsYUFBTCxDQUFtQkQsSUFBbkI7QUFDSCxLQUZxRCxDQUVwRE4sSUFGb0QsQ0FFL0MsSUFGK0MsQ0FBdEQsRUF4QnVCLENBNEJ2Qjs7QUFDQSxTQUFLSSxjQUFMLENBQW9CSSxPQUFPLENBQUNDLFNBQTVCLEVBQXVDLFVBQVVDLFFBQVYsRUFBb0JDLFNBQXBCLEVBQStCO0FBQ2xFLFdBQUtDLGFBQUwsQ0FBbUJGLFFBQW5CLEVBQTZCQyxTQUE3QjtBQUNILEtBRnNDLENBRXJDWCxJQUZxQyxDQUVoQyxJQUZnQyxDQUF2QztBQUdBLFNBQUtJLGNBQUwsQ0FBb0JJLE9BQU8sQ0FBQ0ssWUFBNUIsRUFBMEMsVUFBVUgsUUFBVixFQUFvQkMsU0FBcEIsRUFBK0I7QUFDckUsV0FBS0MsYUFBTCxDQUFtQkYsUUFBbkIsRUFBNkJDLFNBQTdCO0FBQ0gsS0FGeUMsQ0FFeENYLElBRndDLENBRW5DLElBRm1DLENBQTFDO0FBR0EsU0FBS0ksY0FBTCxDQUFvQkksT0FBTyxDQUFDTSxnQkFBNUIsRUFBOEMsVUFBVUosUUFBVixFQUFvQkMsU0FBcEIsRUFBK0I7QUFDekUsV0FBS0MsYUFBTCxDQUFtQkYsUUFBbkIsRUFBNkJDLFNBQTdCO0FBQ0gsS0FGNkMsQ0FFNUNYLElBRjRDLENBRXZDLElBRnVDLENBQTlDO0FBR0gsR0FyR3lCO0FBdUcxQmUsRUFBQUEsV0FBVyxFQUFFLHVCQUFZLENBRXhCLENBekd5QjtBQTJHMUJsQyxFQUFBQSxhQUFhLEVBQUUseUJBQVk7QUFDdkIsUUFBSSxLQUFLb0IsU0FBTCxJQUFrQixJQUF0QixFQUE0QjtBQUN4QixVQUFJZSxTQUFTLEdBQUd4RixFQUFFLENBQUNRLElBQUgsQ0FBUSxHQUFSLEVBQWEsR0FBYixDQUFoQjtBQUNBLFVBQUlpRixPQUFPLEdBQUc7QUFDVkMsUUFBQUEsVUFBVSxFQUFFL0YsVUFERjtBQUNtQjtBQUM3QmdHLFFBQUFBLE9BQU8sRUFBRSxDQUZDO0FBRXFCO0FBQy9CQyxRQUFBQSxPQUFPLEVBQUUsQ0FIQztBQUdxQjtBQUMvQkMsUUFBQUEsT0FBTyxFQUFFLENBSkM7QUFJcUI7QUFDL0JDLFFBQUFBLE9BQU8sRUFBRSxDQUxDO0FBS29CO0FBQzlCQyxRQUFBQSxVQUFVLEVBQUUsR0FORjtBQU1xQjtBQUMvQkMsUUFBQUEsV0FBVyxFQUFFLEdBUEg7QUFPcUI7QUFDL0JDLFFBQUFBLEdBQUcsRUFBRSxDQVJLO0FBUXFCO0FBQy9CQyxRQUFBQSxHQUFHLEVBQUUsQ0FUSyxDQVNxQjs7QUFUckIsT0FBZDtBQVdBLFdBQUt6QixTQUFMLEdBQWlCLElBQUk3RSxlQUFKLEVBQWpCO0FBQ0EsV0FBSzZFLFNBQUwsQ0FBZTBCLFlBQWYsQ0FBNEIsS0FBS3hFLFNBQWpDLEVBQTRDM0IsRUFBRSxDQUFDUyxFQUFILENBQU0sR0FBTixFQUFXLEVBQVgsQ0FBNUMsRUFBNEQyRixhQUFhLENBQUNDLFVBQTFFLEVBQXNGQyxrQkFBa0IsQ0FBQ0MsR0FBekcsRUFBOEdmLFNBQTlHLEVBQXlIQyxPQUF6SCxFQUFrSXpGLEVBQUUsQ0FBQ1MsRUFBSCxDQUFNLEdBQU4sRUFBVyxHQUFYLENBQWxJO0FBQ0g7O0FBRUQsUUFBSStGLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxVQUFQLENBQWtCQyxrQkFBL0I7QUFDQSxRQUFJQyxJQUFJLEdBQUcsRUFBWDtBQUNBLFFBQUlDLEtBQUssR0FBRyxDQUFaOztBQUNBLFNBQUssSUFBSUMsQ0FBVCxJQUFjTixNQUFkLEVBQXNCO0FBQ2xCLFVBQUlPLENBQUMsR0FBR1AsTUFBTSxDQUFDTSxDQUFELENBQWQ7QUFDQUYsTUFBQUEsSUFBSSxDQUFDQyxLQUFELENBQUosR0FBYztBQUFFL0IsUUFBQUEsSUFBSSxFQUFFaUMsQ0FBUjtBQUFXQyxRQUFBQSxTQUFTLEVBQUU7QUFBdEIsT0FBZDtBQUNBSCxNQUFBQSxLQUFLLEdBQUdBLEtBQUssR0FBRyxDQUFoQjtBQUNIOztBQUNELFNBQUssSUFBSUMsQ0FBVCxJQUFjRixJQUFkLEVBQW9CO0FBQ2hCLFVBQUlHLENBQUMsR0FBR0gsSUFBSSxDQUFDRSxDQUFELENBQVo7QUFDQUMsTUFBQUEsQ0FBQyxDQUFDRSxVQUFGLEdBQWUsQ0FBZjtBQUNBLFVBQUlGLENBQUMsQ0FBQ2pDLElBQUYsQ0FBT2QsRUFBUCxJQUFhLEtBQUs3QyxTQUF0QixFQUNJNEYsQ0FBQyxDQUFDRSxVQUFGLEdBQWUsQ0FBZjtBQUNQOztBQUNETCxJQUFBQSxJQUFJLENBQUNNLElBQUwsQ0FBVXBHLEtBQUssQ0FBQ3FHLGdCQUFOLENBQXVCLENBQUMsWUFBRCxFQUFlLElBQWYsQ0FBdkIsQ0FBVjtBQUNBLFNBQUsxQyxTQUFMLENBQWUyQyxPQUFmLENBQXVCUixJQUF2QjtBQUNBLFNBQUtuQyxTQUFMLENBQWU0QyxjQUFmLENBQThCLFlBQVk7QUFDdEMsV0FBS0MsYUFBTDtBQUNILEtBRjZCLENBRTVCOUMsSUFGNEIsQ0FFdkIsSUFGdUIsQ0FBOUI7QUFJQSxTQUFLQyxTQUFMLENBQWUyQyxPQUFmLENBQXVCUixJQUF2QjtBQUVILEdBbkp5QjtBQXFKMUJVLEVBQUFBLGFBQWEsRUFBRSx5QkFBWTtBQUN2QixRQUFJQyxJQUFJLEdBQUcsS0FBSzlDLFNBQUwsQ0FBZStDLGFBQWYsRUFBWDtBQUNBLFFBQUlDLEVBQUUsR0FBRyxJQUFUOztBQUNBLFFBQUlGLElBQUosRUFBVTtBQUNORSxNQUFBQSxFQUFFLEdBQUdGLElBQUksQ0FBQ0csT0FBTCxFQUFMO0FBQ0g7O0FBQ0QsUUFBSUgsSUFBSSxJQUFJLElBQVosRUFBa0I7QUFDbEIsUUFBSSxLQUFLMUQsU0FBTCxJQUFrQixLQUFLQSxTQUFMLElBQWtCNEQsRUFBeEMsRUFBNEM7QUFDNUMsU0FBSzVELFNBQUwsR0FBaUI0RCxFQUFqQjtBQUNBLFFBQUksQ0FBQyxLQUFLNUQsU0FBVixFQUFxQjtBQUNyQixRQUFJaUIsSUFBSSxHQUFHLEtBQUtqQixTQUFoQixDQVZ1QixDQVd2Qjs7QUFDQSxRQUFJOEQsS0FBSyxHQUFHN0MsSUFBSSxDQUFDOEMsTUFBakI7QUFDQSxRQUFJQyxPQUFPLEdBQUczRCxLQUFLLENBQUMsV0FBRCxFQUFjLHNCQUFkLEVBQXNDLENBQUN5RCxLQUFELENBQXRDLENBQW5CO0FBQ0EsUUFBSUcsV0FBVyxHQUFHaEgsS0FBSyxDQUFDaUgsYUFBTixDQUFvQkYsT0FBcEIsQ0FBbEI7O0FBQ0EsUUFBSUMsV0FBSixFQUFpQjtBQUNiLFdBQUs1RSxVQUFMLENBQWdCSCxNQUFoQixHQUF5QmlGLE1BQU0sQ0FBQ2xELElBQUksQ0FBQ1IsR0FBTixDQUEvQjtBQUNBLFVBQUkyRCxHQUFHLEdBQUcxSSxRQUFRLENBQUMySSxVQUFULENBQW9CSixXQUFXLENBQUNLLElBQWhDLENBQVY7QUFDQSxXQUFLQyxPQUFMLENBQWFILEdBQWIsRUFBa0IsVUFBVUksVUFBVixFQUFzQjtBQUNwQyxhQUFLbEYsUUFBTCxDQUFjbUYsV0FBZCxHQUE0QkQsVUFBNUI7QUFDSCxPQUZpQixDQUVoQjdELElBRmdCLENBRVgsSUFGVyxDQUFsQjtBQUdIOztBQUNELFNBQUs3QixZQUFMLENBQWtCSSxNQUFsQixHQUEyQitCLElBQUksQ0FBQ3lELEdBQWhDO0FBQ0EsU0FBSzdGLFNBQUwsQ0FBZUssTUFBZixHQUF3QitCLElBQUksQ0FBQzBELEdBQTdCO0FBQ0EsU0FBS0MsZUFBTCxDQUFxQjNELElBQUksQ0FBQzRELE1BQTFCO0FBQ0EsU0FBS0MsY0FBTDtBQUNILEdBL0t5QjtBQWlMMUJGLEVBQUFBLGVBQWUsRUFBRSx5QkFBVTdCLElBQVYsRUFBZ0I7QUFDN0IsUUFBSUEsSUFBSSxJQUFJLElBQVIsSUFBZ0I5RixLQUFLLENBQUM4SCxJQUFOLENBQVdoQyxJQUFYLEtBQW9CLElBQXhDLEVBQThDOztBQUM5QyxTQUFLLElBQUlpQyxDQUFULElBQWMsS0FBS2xJLFNBQW5CLEVBQThCO0FBQzFCLFVBQUlvRyxDQUFDLEdBQUcsS0FBS3BHLFNBQUwsQ0FBZWtJLENBQWYsQ0FBUjtBQUNBOUIsTUFBQUEsQ0FBQyxDQUFDK0IsVUFBRixDQUFhLEtBQWI7QUFDSDs7QUFFRCxRQUFJQyxLQUFLLEdBQUcsR0FBWjtBQUNBLFFBQUlDLEdBQUcsR0FBRyxFQUFWOztBQUNBLFNBQUssSUFBSWxDLENBQVQsSUFBY0YsSUFBZCxFQUFvQjtBQUNoQixVQUFJRyxDQUFDLEdBQUdILElBQUksQ0FBQ0UsQ0FBRCxDQUFaOztBQUNBLFVBQUksS0FBS25HLFNBQUwsQ0FBZW1HLENBQWYsS0FBcUIsSUFBekIsRUFBK0I7QUFDM0IsWUFBSVMsSUFBSSxHQUFHMEIsU0FBUyxDQUFDMUksV0FBVixHQUF3QjJJLE9BQXhCLENBQWdDLGVBQWhDLENBQVg7QUFDQTNCLFFBQUFBLElBQUksQ0FBQzRCLFVBQUwsQ0FBZ0IsS0FBaEIsRUFBdUJKLEtBQXZCLEVBQThCLEtBQTlCLEVBQXFDLEtBQXJDO0FBQ0F4QixRQUFBQSxJQUFJLENBQUM2QixJQUFMO0FBQ0EsWUFBSUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNTixLQUFOLEdBQWNDLEdBQWYsS0FBdUJsQyxDQUFDLEdBQUcsQ0FBM0IsQ0FBTCxHQUFxQyxNQUFNaUMsS0FBTixHQUFjLEdBQW5ELEdBQXlELE1BQU0sQ0FBL0QsR0FBbUUsS0FBS0EsS0FBaEY7QUFDQXhCLFFBQUFBLElBQUksQ0FBQytCLFdBQUwsQ0FBaUJELENBQWpCLEVBQW9CLEVBQXBCO0FBQ0E5QixRQUFBQSxJQUFJLENBQUNnQyxTQUFMLENBQWUsS0FBSzlHLGNBQXBCO0FBQ0EsYUFBSzlCLFNBQUwsQ0FBZW1HLENBQWYsSUFBb0JTLElBQXBCO0FBQ0g7O0FBQ0QsVUFBSUEsSUFBSSxHQUFHLEtBQUs1RyxTQUFMLENBQWVtRyxDQUFmLENBQVg7QUFDQVMsTUFBQUEsSUFBSSxDQUFDSCxPQUFMLENBQWE7QUFBRW9DLFFBQUFBLEdBQUcsRUFBRXpDLENBQUMsQ0FBQyxDQUFELENBQVI7QUFBYXlCLFFBQUFBLEdBQUcsRUFBRXpCLENBQUMsQ0FBQyxDQUFEO0FBQW5CLE9BQWI7QUFDQVEsTUFBQUEsSUFBSSxDQUFDdUIsVUFBTCxDQUFnQixJQUFoQjtBQUNIO0FBQ0osR0F6TXlCO0FBMk0xQjtBQUNBL0QsRUFBQUEsYUFBYSxFQUFFLHVCQUFVRCxJQUFWLEVBQWdCO0FBQzNCLFNBQUtsQixhQUFMLEdBQXFCa0IsSUFBckI7QUFDQSxTQUFLNkQsY0FBTDtBQUNILEdBL015QjtBQWlOMUJ2RCxFQUFBQSxhQUFhLEVBQUUsdUJBQVVGLFFBQVYsRUFBb0JDLFNBQXBCLEVBQStCO0FBQzFDLFFBQUksS0FBS3JCLGFBQVQsRUFBd0I7QUFDcEIsVUFBSW9CLFFBQVEsSUFBSSxJQUFaLElBQW9CQyxTQUFTLElBQUksSUFBckMsRUFBMkM7QUFDdkMsWUFBSUQsUUFBUSxJQUFJcEYsYUFBYSxDQUFDMkosUUFBZCxDQUF1QkMsUUFBdkMsRUFBaUQ7QUFDN0MsZUFBSyxJQUFJNUMsQ0FBVCxJQUFjM0IsU0FBZCxFQUF5QjtBQUNyQixnQkFBSTRCLENBQUMsR0FBRzVCLFNBQVMsQ0FBQzJCLENBQUQsQ0FBakI7O0FBQ0EsZ0JBQUlDLENBQUMsSUFBSUEsQ0FBQyxDQUFDNEMsT0FBRixJQUFhLElBQWxCLElBQTBCLEtBQUs3RixhQUFMLElBQXNCaUQsQ0FBQyxDQUFDNEMsT0FBdEQsRUFBK0Q7QUFDM0QsbUJBQUtoQixjQUFMO0FBQ0E7QUFDSDtBQUNKO0FBQ0o7QUFDSjtBQUNKO0FBQ0osR0EvTnlCO0FBaU8xQkEsRUFBQUEsY0FBYyxFQUFFLDBCQUFZO0FBQ3hCLFFBQUksS0FBSy9FLGFBQUwsSUFBc0IsSUFBdEIsSUFBOEIsS0FBS0MsU0FBTCxJQUFrQixJQUFwRCxFQUEwRDtBQUMxRCxRQUFJK0YsVUFBVSxHQUFHbkQsTUFBTSxDQUFDQyxVQUFQLENBQWtCQyxrQkFBbEIsQ0FBcUMsS0FBSzlDLFNBQUwsQ0FBZUcsRUFBcEQsQ0FBakI7QUFDQSxRQUFJLENBQUM0RixVQUFMLEVBQWlCO0FBRWpCLFNBQUs5RixhQUFMLEdBQXFCLENBQXJCLENBTHdCLENBS0k7O0FBQzVCLFNBQUszQixZQUFMLENBQWtCMEgsSUFBbEIsQ0FBdUI3SCxNQUF2QixHQUFnQyxLQUFoQztBQUVBLFFBQUk4SCxRQUFRLEdBQUcsQ0FBZjs7QUFDQSxTQUFLLElBQUloRCxDQUFULElBQWMsS0FBS2xELGFBQW5CLEVBQWtDO0FBQzlCLFVBQUltRCxDQUFDLEdBQUcsS0FBS25ELGFBQUwsQ0FBbUJrRCxDQUFuQixDQUFSOztBQUNBLFVBQUlDLENBQUMsQ0FBQy9DLEVBQUYsSUFBUSxLQUFLSCxTQUFMLENBQWVHLEVBQTNCLEVBQStCO0FBQzNCOEYsUUFBQUEsUUFBUSxHQUFHL0MsQ0FBQyxDQUFDeUIsR0FBYjtBQUNBO0FBQ0g7QUFDSjs7QUFDRHNCLElBQUFBLFFBQVEsR0FBRyxLQUFLakcsU0FBTCxDQUFla0csS0FBZixHQUF1QkQsUUFBbEM7O0FBQ0EsUUFBSUEsUUFBUSxHQUFHLENBQWYsRUFBa0I7QUFDZEEsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDSDs7QUFDRCxTQUFLaEgsV0FBTCxDQUFpQkMsTUFBakIsR0FBMEIvQyxFQUFFLENBQUNnRCxFQUFILENBQU1DLFNBQU4sQ0FBZ0JuQyxLQUFLLENBQUNDLEtBQU4sQ0FBWSw4QkFBWixDQUFoQixFQUE2RCtJLFFBQTdELENBQTFCOztBQUNBLFFBQUlBLFFBQVEsSUFBSSxDQUFoQixFQUFtQjtBQUNmLFdBQUs3SCxTQUFMLENBQWVjLE1BQWYsR0FBd0JqQyxLQUFLLENBQUNDLEtBQU4sQ0FBWSxRQUFaLENBQXhCO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsVUFBSWtELGFBQWEsR0FBR0MsS0FBSyxDQUFDLGFBQUQsRUFBZ0Isa0JBQWhCLEVBQW9DLENBQUMsS0FBS0wsU0FBTCxDQUFlTSxTQUFoQixDQUFwQyxDQUF6Qjs7QUFDQSxVQUFJLEtBQUs2RixxQkFBTCxDQUEyQkosVUFBVSxDQUFDSyxTQUF0QyxDQUFKLEVBQXNEO0FBQ2xELFlBQUlULEdBQUcsR0FBR0ksVUFBVSxDQUFDSyxTQUFYLENBQXFCLENBQXJCLEVBQXdCLENBQXhCLENBQVY7QUFDQSxZQUFJekIsR0FBRyxHQUFHb0IsVUFBVSxDQUFDSyxTQUFYLENBQXFCLENBQXJCLEVBQXdCLENBQXhCLENBQVY7QUFDQSxZQUFJQyxRQUFRLEdBQUdwSixLQUFLLENBQUNpSCxhQUFOLENBQW9CeUIsR0FBcEIsQ0FBZjs7QUFDQSxZQUFJVSxRQUFKLEVBQWM7QUFDVixlQUFLcEcsYUFBTCxHQUFxQjBGLEdBQXJCO0FBQ0EsY0FBSXZCLEdBQUcsR0FBRzFJLFFBQVEsQ0FBQzJJLFVBQVQsQ0FBb0JnQyxRQUFRLENBQUMvQixJQUE3QixDQUFWO0FBQ0EsZUFBS2xHLFNBQUwsQ0FBZWMsTUFBZixHQUF3Qi9DLEVBQUUsQ0FBQ2dELEVBQUgsQ0FBTUMsU0FBTixDQUFnQm5DLEtBQUssQ0FBQ0MsS0FBTixDQUFZLGdFQUFaLENBQWhCLEVBQStGbUosUUFBUSxDQUFDL0IsSUFBeEcsRUFBOEdLLEdBQTlHLENBQXhCO0FBQ0EsZUFBS0osT0FBTCxDQUFhSCxHQUFiLEVBQW1CLFVBQVVrQyxTQUFWLEVBQXFCO0FBQ3BDLGlCQUFLbEksU0FBTCxDQUFlbUksY0FBZixDQUE4QkQsU0FBOUI7QUFDSCxXQUZpQixDQUVmM0YsSUFGZSxDQUVWLElBRlUsQ0FBbEI7QUFHQSxlQUFLckMsWUFBTCxDQUFrQlksTUFBbEIsR0FBMkIvQyxFQUFFLENBQUNnRCxFQUFILENBQU1DLFNBQU4sQ0FBZ0JuQyxLQUFLLENBQUNDLEtBQU4sQ0FBWSx1QkFBWixDQUFoQixFQUFzRHlILEdBQXRELENBQTNCO0FBQ0EsZUFBS3JHLFlBQUwsQ0FBa0IwSCxJQUFsQixDQUF1QjdILE1BQXZCLEdBQWdDLElBQWhDO0FBQ0g7QUFDSixPQWRELE1BZUssSUFBSWlDLGFBQUosRUFDRCxLQUFLaEMsU0FBTCxDQUFlYyxNQUFmLEdBQXdCL0MsRUFBRSxDQUFDZ0QsRUFBSCxDQUFNQyxTQUFOLENBQWdCbkMsS0FBSyxDQUFDQyxLQUFOLENBQVksa0RBQVosQ0FBaEIsRUFBaUZrRCxhQUFhLENBQUNLLEdBQS9GLENBQXhCO0FBQ1A7O0FBQ0QsUUFBSSxLQUFLK0YsWUFBTCxJQUFxQlAsUUFBekIsRUFBbUM7QUFDL0IsV0FBS08sWUFBTCxHQUFvQlAsUUFBcEI7O0FBQ0EsVUFBSUEsUUFBUSxJQUFJLENBQWhCLEVBQW1CO0FBQ2ZoSixRQUFBQSxLQUFLLENBQUN3SixhQUFOLENBQW9CLEtBQUt4SSxRQUF6QixFQUFtQyxJQUFuQyxFQURlLENBRWY7QUFDSCxPQUhELE1BR087QUFDSGhCLFFBQUFBLEtBQUssQ0FBQ3dKLGFBQU4sQ0FBb0IsS0FBS3hJLFFBQXpCLEVBQW1DLEtBQW5DLEVBREcsQ0FFSDtBQUNIO0FBQ0o7QUFDSixHQXRSeUI7QUF3UjFCO0FBQ0FrSSxFQUFBQSxxQkFBcUIsRUFBRSwrQkFBVUMsU0FBVixFQUFxQjtBQUN4QyxRQUFJTSxTQUFTLEdBQUcsS0FBaEI7O0FBQ0EsUUFBSU4sU0FBUyxJQUFJQSxTQUFTLENBQUMsQ0FBRCxDQUFULElBQWdCLElBQWpDLEVBQXVDO0FBQ25DLFVBQUlULEdBQUcsR0FBR1MsU0FBUyxDQUFDLENBQUQsQ0FBVCxDQUFhLENBQWIsQ0FBVjtBQUNBLFVBQUlPLFFBQVEsR0FBR1AsU0FBUyxDQUFDLENBQUQsQ0FBVCxDQUFhLENBQWIsQ0FBZjtBQUNBLFVBQUlRLFFBQVEsR0FBRzVLLGtCQUFrQixDQUFDVSxXQUFuQixHQUFpQ2MsUUFBakMsR0FBNENxSixlQUE1QyxDQUE0RGxCLEdBQTVELENBQWY7O0FBQ0EsVUFBSWlCLFFBQVEsSUFBSUQsUUFBaEIsRUFBMEI7QUFDdEJELFFBQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0g7QUFDSjs7QUFDRCxXQUFPQSxTQUFQO0FBQ0gsR0FwU3lCO0FBc1MxQkksRUFBQUEsZ0JBQWdCLEVBQUUsMEJBQVVDLElBQVYsRUFBZ0I7QUFDOUIsU0FBSzlCLFVBQUwsQ0FBZ0I4QixJQUFoQjtBQUNILEdBeFN5QjtBQTBTMUJDLEVBQUFBLE1BQU0sRUFBRSxrQkFBWSxDQUNuQixDQTNTeUI7QUE2UzFCekQsRUFBQUEsT0FBTyxFQUFFLGlCQUFVdEMsSUFBVixFQUFnQixDQUV4QixDQS9TeUI7QUFrVDFCZ0csRUFBQUEsUUFBUSxFQUFFLG9CQUFZO0FBQ2xCLFFBQUksS0FBS3JHLFNBQVQsRUFBb0I7QUFDaEIsV0FBS0EsU0FBTCxDQUFlc0csUUFBZjtBQUNBLFdBQUt0RyxTQUFMLEdBQWlCLElBQWpCO0FBQ0g7O0FBQ0QsUUFBSSxLQUFLOUQsU0FBVCxFQUFvQjtBQUNoQixXQUFLLElBQUlrSSxDQUFULElBQWMsS0FBS2xJLFNBQW5CLEVBQThCO0FBQzFCLFlBQUlvRyxDQUFDLEdBQUcsS0FBS3BHLFNBQUwsQ0FBZWtJLENBQWYsQ0FBUjtBQUNBOUIsUUFBQUEsQ0FBQyxDQUFDZ0UsUUFBRjtBQUNIOztBQUNELFdBQUtwSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0g7QUFDSjtBQTlUeUIsQ0FBVCxDQUFyQjtBQWlVQXFLLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmxMLGNBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBAYXV0aG9yOiBAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOaKoue6ouWMhVxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBSZWRiYWdDb250cm9sbGVyID0gcmVxdWlyZShcInJlZGJhZ19jb250cm9sbGVyXCIpO1xyXG52YXIgUmVkYmFnRXZlbnQgPSByZXF1aXJlKFwicmVkYmFnX2V2ZW50XCIpO1xyXG52YXIgUmVkQmFnSXRlbSA9IHJlcXVpcmUoXCJyZWRiYWdfaXRlbVwiKTtcclxudmFyIFJlZEJhZ0xpc3RQYW5lbCA9IHJlcXVpcmUoXCJyZWRiYWdfbGlzdF9wYW5lbFwiKTtcclxudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xyXG52YXIgQmFja1BhY2tDb25zdCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb25zdFwiKTtcclxuXHJcbnZhciBSZWRCYWdHZXRQYW5lbCA9IGNjLkNsYXNzKHtcclxuICAgIGV4dGVuZHM6IEJhc2VQYW5lbCxcclxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwicmVkYmFnXCIsIFwicmVkYmFnX3NlbmRcIik7XHJcbiAgICAgICAgdGhpcy5jdHJsID0gUmVkYmFnQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnYyKDY0NCwgNzQwKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc19jYW5fc2F2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXRlbV9saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5uZWVkX2xpc3QgPSB7fTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRfbXNnID0gVXRpbHMuVEkxOE4oXCLouqvkuLrlnJ/osarvvIzmnInpkrHku7vmgKdcIik7XHJcbiAgICAgICAgdGhpcy5pc19zZW5kX3Byb3RvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy51c2VfYXNzZXJ0ID0gMDsgLy/kvb/nlKjpgZPlhbfov5jmmK/otYTkuqfms5XnuqLljIVcclxuICAgICAgICB0aGlzLm1zZ19saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5leHRlbmRfaWQgPSBhcmd1bWVudHNbMF0gfHwgdGhpcy5jdHJsLmdldE1vZGVsKCkuZ2V0SGF2ZUl0ZW1JRCgpIHx8IDE7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RfbXNnID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdFBhbmVsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5zZWVrQ2hpbGQoXCJiYWNrZ3JvdW5kXCIpO1xyXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9wYW5lbFwiKTtcclxuICAgICAgICB0aGlzLnRvcF9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCwgXCJ0b3BfcGFuZWxcIik7XHJcbiAgICAgICAgdGhpcy5ib3R0b21fcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsIFwiYm90dG9tX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMubnVtX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwibnVtX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuc2VuZF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJzZW5kX2J0blwiKTtcclxuICAgICAgICB0aGlzLnNlbmRfYnRuX3JlZF9wb2ludCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc2VuZF9idG4sIFwicmVkX3BvaW50XCIpO1xyXG4gICAgICAgIHRoaXMuc2VuZF9idG5fcmVkX3BvaW50LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYnRuX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zZW5kX2J0biwgXCJsYWJlbFwiLCBjYy5SaWNoVGV4dCk7XHJcbiAgICAgICAgdGhpcy5zZW5kX3RpcHNfbGIgPSB0aGlzLnNlZWtDaGlsZChcInNlbmRfdGlwc1wiLCBjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIHRoaXMubGVmdF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnRvcF9wYW5lbCwgXCJsZWZ0X2J0blwiKTtcclxuICAgICAgICB0aGlzLnJpZ2h0X2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcInJpZ2h0X2J0blwiKTtcclxuICAgICAgICB0aGlzLnJpZ2h0X2J0bl9yZWRfcG9pbnQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJpZ2h0X2J0biwgXCJyZWRfcG9pbnRcIik7XHJcbiAgICAgICAgdGhpcy5yaWdodF9idG5fcmVkX3BvaW50LmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmxlZnRfYnRuX3JlZF9wb2ludCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubGVmdF9idG4sIFwicmVkX3BvaW50XCIpO1xyXG4gICAgICAgIHRoaXMubGVmdF9idG5fcmVkX3BvaW50LmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLml0ZW1fY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwiaXRlbV9jb250YWluZXJcIik7XHJcbiAgICAgICAgdGhpcy5udW1fbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJudW1fbGFiZWxcIiwgY2MuTGFiZWwpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbmRfY29udGVudCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcInNlbmRfY29udGVudFwiLCBjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzYygpO1xyXG4gICAgICAgIHRoaXMucmVxdWlyZVByb3RvKCk7XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBjcmVhdGVEZXNjOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kX25vdGljZSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcInNlbmRfbm90aWNlXCIsIGNjLlJpY2hUZXh0KTtcclxuICAgICAgICB0aGlzLnNlbmRfbm90aWNlLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIijku4rml6Xov5jlj6/lj5E8Y29sb3I9IzI0OTAwMz4lczwvYz4pXCIpLCAxMDApXHJcblxyXG4gICAgICAgIC8v57qi5YyF6YeR6aKdXHJcbiAgICAgICAgdGhpcy5jb2luX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwiY29pbl9sYWJlbFwiLCBjYy5SaWNoVGV4dCk7XHJcbiAgICAgICAgdGhpcy5jb2luX2ltZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImNvaW5faW1nXCIsIGNjLlNwcml0ZSk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQmFnTGlzdCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZXF1aXJlUHJvdG86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN0cmwuc2VuZDEzNTQ2KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnNlbmRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZWRfc2VuZF9pbmZvID09IG51bGwgfHwgdGhpcy5zZWxlY3Rfdm8gPT0gbnVsbCkgcmV0dXJuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvc3RfaXRlbV9iaWQgJiYgdGhpcy5jb3N0X2l0ZW1fYmlkICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMzUzNSh0aGlzLnNlbGVjdF92by5pZCwgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hhcmdlX2NvbmZpZyA9IGdkYXRhKFwiY2hhcmdlX2RhdGFcIiwgXCJkYXRhX2NoYXJnZV9kYXRhXCIsIFt0aGlzLnNlbGVjdF92by5jaGFyZ2VfaWRdKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGFyZ2VfY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgU0RLLnBheShjaGFyZ2VfY29uZmlnLnZhbCwgbnVsbCwgY2hhcmdlX2NvbmZpZy5pZCwgY2hhcmdlX2NvbmZpZy5uYW1lLCBjaGFyZ2VfY29uZmlnLm5hbWUsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICB0aGlzLmxlZnRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0X3ZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF92aWV3LnJ1bkxlZnRQb3N0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgdGhpcy5yaWdodF9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3Rfdmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0X3ZpZXcucnVuUmlnaHRQb3N0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcykpXHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoUmVkYmFnRXZlbnQuVXBkYXRlX1JlZF9CYWdfRXZlbnQsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVkSW5mbyhkYXRhKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpXHJcblxyXG4gICAgICAgIC8v6YGT5YW35pWw6YeP5pu05pawXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBkYXRhX2xpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtTnVtKGJhZ19jb2RlLCBkYXRhX2xpc3QpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEV2ZW50SWQuREVMRVRFX0dPT0RTLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGRhdGFfbGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1OdW0oYmFnX2NvZGUsIGRhdGFfbGlzdCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGRhdGFfbGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1OdW0oYmFnX2NvZGUsIGRhdGFfbGlzdCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgdXBkYXRlQmFnTGlzdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RfdmlldyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBsaXN0X3NpemUgPSBjYy5zaXplKDU4MCwgMzcwKTtcclxuICAgICAgICAgICAgdmFyIHNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtX2NsYXNzOiBSZWRCYWdJdGVtLCAgICAgIC8vIOWNleWFg+exu1xyXG4gICAgICAgICAgICAgICAgc3RhcnRfeDogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFjotbfngrlcclxuICAgICAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXHJcbiAgICAgICAgICAgICAgICBzdGFydF95OiAyLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxyXG4gICAgICAgICAgICAgICAgc3BhY2VfeTogMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxyXG4gICAgICAgICAgICAgICAgaXRlbV93aWR0aDogMjYyLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXHJcbiAgICAgICAgICAgICAgICBpdGVtX2hlaWdodDogMzI3LCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XHJcbiAgICAgICAgICAgICAgICByb3c6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgICAgICBjb2w6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saXN0X3ZpZXcgPSBuZXcgUmVkQmFnTGlzdFBhbmVsKClcclxuICAgICAgICAgICAgdGhpcy5saXN0X3ZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMudG9wX3BhbmVsLCBjYy52MigyNzAsIDIwKSwgU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBsaXN0X3NpemUsIHNldHRpbmcsIGNjLnYyKDAuNSwgMC41KSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBjb25maWcgPSBDb25maWcuZ3VpbGRfZGF0YS5kYXRhX2d1aWxkX3JlZF9iYWc7XHJcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcclxuICAgICAgICB2YXIgaW5kZXggPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gY29uZmlnW2ldO1xyXG4gICAgICAgICAgICBsaXN0W2luZGV4XSA9IHsgZGF0YTogdiwgb3Blbl90eXBlOiAxIH07XHJcbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBsaXN0W2ldO1xyXG4gICAgICAgICAgICB2LnNvcnRfaW5kZXggPSAxO1xyXG4gICAgICAgICAgICBpZiAodi5kYXRhLmlkID09IHRoaXMuZXh0ZW5kX2lkKVxyXG4gICAgICAgICAgICAgICAgdi5zb3J0X2luZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wic29ydF9pbmRleFwiLCBcImlkXCJdKSk7XHJcbiAgICAgICAgdGhpcy5saXN0X3ZpZXcuc2V0RGF0YShsaXN0KTtcclxuICAgICAgICB0aGlzLmxpc3Rfdmlldy5hZGRFbmRDYWxsQmFjayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTWVzc2FnZSgpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgdGhpcy5saXN0X3ZpZXcuc2V0RGF0YShsaXN0KTtcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZU1lc3NhZ2U6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaXRlbSA9IHRoaXMubGlzdF92aWV3LmdldFNlbGVjdEl0ZW0oKTtcclxuICAgICAgICB2YXIgdm8gPSBudWxsO1xyXG4gICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgIHZvID0gaXRlbS5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdF92byAmJiB0aGlzLnNlbGVjdF92byA9PSB2bykgcmV0dXJuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rfdm8gPSB2bztcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0X3ZvKSByZXR1cm5cclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuc2VsZWN0X3ZvO1xyXG4gICAgICAgIC8v57qi5YyF6YeR6aKdXHJcbiAgICAgICAgdmFyIGNvaW50ID0gZGF0YS5hc3NldHM7XHJcbiAgICAgICAgdmFyIGl0ZW1faWQgPSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFtjb2ludF0pO1xyXG4gICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoaXRlbV9pZCk7XHJcbiAgICAgICAgaWYgKGl0ZW1fY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29pbl9sYWJlbC5zdHJpbmcgPSBTdHJpbmcoZGF0YS52YWwpO1xyXG4gICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29pbl9pbWcuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VuZF9jb250ZW50LnN0cmluZyA9IGRhdGEubXNnO1xyXG4gICAgICAgIHRoaXMubnVtX2xhYmVsLnN0cmluZyA9IGRhdGEubnVtO1xyXG4gICAgICAgIHRoaXMuZmlsZVJld2FyZHNJdGVtKGRhdGEucmV3YXJkKTtcclxuICAgICAgICB0aGlzLnNob3dSZWRTZW5kTnVtKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGZpbGVSZXdhcmRzSXRlbTogZnVuY3Rpb24gKGxpc3QpIHtcclxuICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQobGlzdCkgPT0gbnVsbCkgcmV0dXJuXHJcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLml0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuaXRlbV9saXN0W2tdO1xyXG4gICAgICAgICAgICB2LnNldFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNjYWxlID0gMC43O1xyXG4gICAgICAgIHZhciBvZmYgPSAxMDtcclxuICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBsaXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RbaV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBJdGVtc1Bvb2wuZ2V0SW5zdGFuY2UoKS5nZXRJdGVtKFwiYmFja3BhY2tfaXRlbVwiKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaW5pdENvbmZpZyhmYWxzZSwgc2NhbGUsIGZhbHNlLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHggPSAyMCArICgxMjAgKiBzY2FsZSArIG9mZikgKiAoaSAtIDEpICsgMTIwICogc2NhbGUgKiAwLjUgLSAzODggLyAyICsgNjAgKiBzY2FsZTtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0UG9zaXRpb24oeCwgNTApO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRQYXJlbnQodGhpcy5pdGVtX2NvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdFtpXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdFtpXTtcclxuICAgICAgICAgICAgaXRlbS5zZXREYXRhKHsgYmlkOiB2WzBdLCBudW06IHZbMV0gfSk7XHJcbiAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u57qi5YyF5Y+v5Y+R5qyh5pWwXHJcbiAgICB1cGRhdGVSZWRJbmZvOiBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMucmVkX3NlbmRfaW5mbyA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5zaG93UmVkU2VuZE51bSgpO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVJdGVtTnVtOiBmdW5jdGlvbiAoYmFnX2NvZGUsIGRhdGFfbGlzdCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvc3RfaXRlbV9iaWQpIHtcclxuICAgICAgICAgICAgaWYgKGJhZ19jb2RlICE9IG51bGwgJiYgZGF0YV9saXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChiYWdfY29kZSA9PSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiBkYXRhX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHYgPSBkYXRhX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmIHYuYmFzZV9pZCAhPSBudWxsICYmIHRoaXMuY29zdF9pdGVtX2JpZCA9PSB2LmJhc2VfaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JlZFNlbmROdW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHNob3dSZWRTZW5kTnVtOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVkX3NlbmRfaW5mbyA9PSBudWxsIHx8IHRoaXMuc2VsZWN0X3ZvID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGxldCByZWRfY29uZmlnID0gQ29uZmlnLmd1aWxkX2RhdGEuZGF0YV9ndWlsZF9yZWRfYmFnW3RoaXMuc2VsZWN0X3ZvLmlkXTtcclxuICAgICAgICBpZiAoIXJlZF9jb25maWcpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLmNvc3RfaXRlbV9iaWQgPSAwOyAgICAgLy/lj6/ku6XmtojogJfpgZPlhbflj5HnuqLljIXnmoTpgZPlhbdiaWRcclxuICAgICAgICB0aGlzLnNlbmRfdGlwc19sYi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB2YXIgc2VuZF9udW0gPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5yZWRfc2VuZF9pbmZvKSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5yZWRfc2VuZF9pbmZvW2ldO1xyXG4gICAgICAgICAgICBpZiAodi5pZCA9PSB0aGlzLnNlbGVjdF92by5pZCkge1xyXG4gICAgICAgICAgICAgICAgc2VuZF9udW0gPSB2Lm51bTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbmRfbnVtID0gdGhpcy5zZWxlY3Rfdm8ubGltaXQgLSBzZW5kX251bTtcclxuICAgICAgICBpZiAoc2VuZF9udW0gPCAwKSB7XHJcbiAgICAgICAgICAgIHNlbmRfbnVtID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZW5kX25vdGljZS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIo5LuK5pel6L+Y5Y+v5Y+RPGNvbG9yPSMyNDkwMDM+JXM8L2M+KVwiKSwgc2VuZF9udW0pO1xyXG4gICAgICAgIGlmIChzZW5kX251bSA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnRuX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5qyh5pWw5bey6L6+5LiK6ZmQXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFyZ2VfY29uZmlnID0gZ2RhdGEoXCJjaGFyZ2VfZGF0YVwiLCBcImRhdGFfY2hhcmdlX2RhdGFcIiwgW3RoaXMuc2VsZWN0X3ZvLmNoYXJnZV9pZF0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0xvc3NJdGVtSXNFbm91Z2gocmVkX2NvbmZpZy5sb3NzX2l0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmlkID0gcmVkX2NvbmZpZy5sb3NzX2l0ZW1bMF1bMF07XHJcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gcmVkX2NvbmZpZy5sb3NzX2l0ZW1bMF1bMV07XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbV9jZmcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGJpZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbV9jZmcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvc3RfaXRlbV9iaWQgPSBiaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jZmcuaWNvbilcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCI8aW1nIHNyYz0nJXMnLz48b3V0bGluZSB3aWR0aD0yIGNvbG9yPSM2QzJCMDA+JXMg5Y+R57qi5YyFPC9vdXRsaW5lPlwiKSwgaXRlbV9jZmcuaWNvbiwgbnVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCAoZnVuY3Rpb24gKHJlc09iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9sYWJlbC5hZGRTcHJpdGVGcmFtZShyZXNPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZF90aXBzX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW9k+WJjeaLpeaciee6ouWMheS7pO+8jOa2iOiAlyVz5Liq5Y+v5Y+R5pS+Measoeivpee6ouWMhVwiKSwgbnVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRfdGlwc19sYi5ub2RlLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmdlX2NvbmZpZylcclxuICAgICAgICAgICAgICAgIHRoaXMuYnRuX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxvdXRsaW5lIHdpZHRoPTIgY29sb3I9IzZDMkIwMD4lc+WFgyDlj5HnuqLljIU8L291dGxpbmU+XCIpLCBjaGFyZ2VfY29uZmlnLnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9zZW5kX251bSAhPSBzZW5kX251bSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cl9zZW5kX251bSA9IHNlbmRfbnVtO1xyXG4gICAgICAgICAgICBpZiAoc2VuZF9udW0gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLnNlbmRfYnRuLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYnRuX2xhYmVsXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5zZXRHcmV5QnV0dG9uKHRoaXMuc2VuZF9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIC8vIGVuYWJsZU91dGxpbmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/liKTmlq3pgZPlhbfmlbDph4/mmK/lkKbotrPlpJ/lj5HnuqLljIVcclxuICAgIGNoZWNrTG9zc0l0ZW1Jc0Vub3VnaDogZnVuY3Rpb24gKGxvc3NfaXRlbSkge1xyXG4gICAgICAgIGxldCBpc19lbm91Z2ggPSBmYWxzZTtcclxuICAgICAgICBpZiAobG9zc19pdGVtICYmIGxvc3NfaXRlbVswXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBiaWQgPSBsb3NzX2l0ZW1bMF1bMF07XHJcbiAgICAgICAgICAgIGxldCBuZWVkX251bSA9IGxvc3NfaXRlbVswXVsxXTtcclxuICAgICAgICAgICAgbGV0IGhhdmVfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQoYmlkKTtcclxuICAgICAgICAgICAgaWYgKGhhdmVfbnVtID49IG5lZWRfbnVtKSB7XHJcbiAgICAgICAgICAgICAgICBpc19lbm91Z2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc19lbm91Z2hcclxuICAgIH0sXHJcblxyXG4gICAgc2V0VmlzaWJsZVN0YXR1czogZnVuY3Rpb24gKGJvb2wpIHtcclxuICAgICAgICB0aGlzLnNldFZpc2libGUoYm9vbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIG9uU2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXREYXRhOiBmdW5jdGlvbiAoZGF0YSkge1xyXG5cclxuICAgIH0sXHJcblxyXG5cclxuICAgIG9uRGVsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdF92aWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdF92aWV3LmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdF92aWV3ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5pdGVtX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5pdGVtX2xpc3Rba107XHJcbiAgICAgICAgICAgICAgICB2LmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFJlZEJhZ0dldFBhbmVsOyJdfQ==