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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guild/view/guild_donate_window.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, 'b24e1N99hdD1plf6g9CHud5', 'guild_donate_window');
// Scripts/mod/guild/view/guild_donate_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      公会捐献面板
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var GuildController = require("guild_controller");
 
var GuildConst = require("guild_const");
 
var CommonScrollView = require("common_scrollview");
 
var RoleController = require("role_controller");
 
var GuildEvent = require("guild_event");
 
var GuildDonateItem = require("guild_donate_item");
 
var GuildDonateWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("guild", "guild_donate_window");
    this.win_type = WinType.Big;
    this.viewTag = SCENE_TAG.dialogue;
    this.ctrl = GuildController.getInstance();
    this.model = this.ctrl.getModel();
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.awards_list = {};
  },
  openCallBack: function openCallBack() {
    this.main_panel = this.seekChild("main_panel");
    this.close_btn = this.seekChild(this.main_panel, "close_btn");
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    this.donate_container = this.seekChild("donate_container");
    this.progress_bar = this.seekChild("progress_bar", cc.ProgressBar);
    this.lev_title = this.seekChild("lev_title", cc.Label);
    this.exp_value = this.seekChild("exp_value", cc.Label);
    this.explain_btn = this.seekChild("explain_btn");
    this.total_width = this.progress_bar.node.getContentSize().width;
    this.start_x = 206 - 32;
    var config = Config.guild_data.data_const.day_exp_max;
 
    if (config) {
      for (var i in Config.guild_data.data_donate_box) {
        var v = gdata("guild_data", "data_donate_box", [i]);
        var awards = this.seekChild(cc.js.formatStr("awards_%s", Number(i)));
        awards.active = true;
        var container = awards.getChildByName("container");
        var skeleton = container.getComponent(sp.Skeleton);
        var value = awards.getChildByName("value").getComponent(cc.Label);
        value.string = v.box_val;
        var percent = v.box_val / config.val;
        awards.setPosition(this.start_x + this.total_width * percent, 270);
        var object = {};
        object.item = awards;
        object.container = container;
        object.status = GuildConst.status.normal;
        object.id = i;
        object.config = v;
        object.skeleton = skeleton;
        object.is_show_tips = true;
        this.awards_list[i] = object;
      }
    }
 
    this.desc = this.seekChild("desc", cc.RichText);
    var size = this.donate_container.getContentSize();
    var list_size = cc.size(size.width, size.height - 10);
    var setting = {
      item_class: GuildDonateItem,
      // 单元类
      start_x: 4,
      // 第一个单元的X起点
      space_x: 0,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: -1,
      // y方向的间隔
      item_width: 614,
      // 单元的尺寸width
      item_height: 187,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 1,
      // 列数,作用于垂直滚动类型
      need_dynamic: true
    };
    this.scroll_view = new CommonScrollView();
    this.scroll_view.createScroll(this.donate_container, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, list_size, setting, cc.v2(0.5, 0.5));
  },
  registerEvent: function registerEvent() {
    var _this = this;
 
    this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      var config = Config.guild_data.data_const.game_rule1;
      Utils.playButtonSound(1);
      var pos = event.touch.getLocation();
 
      require("tips_controller").getInstance().showCommonTips(config.desc, pos);
    }, this);
    this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
      this.ctrl.openGuildDonateWindow(false);
    }, this);
    this.background.on(cc.Node.EventType.TOUCH_END, function () {
      this.ctrl.openGuildDonateWindow(false);
    }, this);
 
    var _loop = function _loop() {
      var object = _this.awards_list[i];
      object.item.on(cc.Node.EventType.TOUCH_END, function () {
        if (object.config) {
          if (object.is_show_tips == true) {
            var CommonAlert = require("commonalert");
 
            CommonAlert.showItemApply(Utils.TI18N("当前捐献活跃度奖励"), object.config.rewards, null, Utils.TI18N("确定"), null, null, Utils.TI18N("奖励"), null, null, true);
          } else {
            this.ctrl.requestDonateBoxRewards(object.id);
          }
        }
      }, _this);
    };
 
    for (var i in this.awards_list) {
      _loop();
    }
 
    if (this.my_guild_info == null) {
      this.my_guild_info = this.model.getMyGuildInfo();
      this.addGlobalEvent(GuildEvent.UpdateMyInfoEvent, function (key, value) {
        if (key == "lev") this.updateMyGuildLev();
      }, this);
    }
 
    this.addGlobalEvent(GuildEvent.UpdateDonateInfo, function () {
      this.updateDonateListStatus();
    }, this);
    this.addGlobalEvent(GuildEvent.UpdateDonateBoxStatus, function (id) {
      if (id != null) {
        var object = this.awards_list[id];
 
        if (object) {
          object.is_show_tips = true;
          object.status = GuildConst.status.finish;
 
          if (object.skeleton) {
            object.skeleton.setToSetupPose();
            object.skeleton.clearTracks();
            object.skeleton.setAnimation(0, PlayerAction.action_3, true);
          }
        }
      } else this.updateDonateBoxList();
    }, this);
  },
  openRootWnd: function openRootWnd() {
    var config_list = Config.guild_data.data_donate;
    var list = [];
 
    for (var i in config_list) {
      list.push(config_list[i]);
    }
 
    this.scroll_view.setData(list);
    this.updateDonateBoxList();
    this.updateMyGuildLev();
  },
  //更新活跃度宝箱
  updateDonateBoxList: function updateDonateBoxList() {
    var activity_value = this.model.getDonateActivityValue();
    this.exp_value.string = activity_value;
    var config = gdata("guild_data", "data_const", "day_exp_max");
    if (config == null) return;
    this.progress_bar.progress = activity_value / config.val;
 
    for (var i in this.awards_list) {
      var object = this.awards_list[i];
      var config = object.config;
      var box_status = this.model.getDonateBoxStatus(object.id);
      var tmp_status = GuildConst.status.normal;
      if (box_status == true) tmp_status = GuildConst.status.finish;else {
        if (activity_value >= object.config.box_val) tmp_status = GuildConst.status.activity;else tmp_status = GuildConst.status.un_activity;
      }
      var box_action = PlayerAction.action_1;
      if (tmp_status == GuildConst.status.finish) box_action = PlayerAction.action_3;else if (tmp_status == GuildConst.status.activity) box_action = PlayerAction.action_2;
      if (tmp_status == GuildConst.status.activity) object.is_show_tips = false;else object.is_show_tips = true;
 
      if (object.skeleton.skeletonData) {
        if (tmp_status != object.status) {
          object.status = tmp_status;
          object.skeleton.setAnimation(0, box_action, true);
        }
      } else {
        var res_id = PathTool.getEffectRes(object.config.effect_id);
        var path = cc.js.formatStr("spine/%s/action.atlas", res_id);
        var _skeleton = object.skeleton;
        this.createEffect(_skeleton, path, box_action);
      }
    }
  },
  //生成宝箱
  createEffect: function createEffect(_skeleton, path, box_action) {
    this.loadRes(path, function (res) {
      _skeleton.skeletonData = res;
 
      _skeleton.setAnimation(0, box_action, true);
    }.bind(this));
  },
  //设置等级相关
  updateMyGuildLev: function updateMyGuildLev() {
    if (this.my_guild_info == null) return;
    this.lev_title.string = cc.js.formatStr(Utils.TI18N("公会等级:%s级"), this.my_guild_info.lev);
    var next_lv = this.my_guild_info.lev + 1;
    var config = gdata("guild_data", "data_guild_lev", [next_lv]);
    if (config == null) this.desc.string = Utils.TI18N("当前已达最大值!");else this.desc.string = StringUtil.parse(config.desc);
  },
  updateDonateListStatus: function updateDonateListStatus() {
    var item_list = this.scroll_view.getItemList();
 
    if (item_list) {
      for (var k in item_list) {
        var v = item_list[k];
        if (v.updateDonateStatus) v.updateDonateStatus();
      }
    }
  },
  closeCallBack: function closeCallBack() {
    this.ctrl.openGuildDonateWindow(false);
 
    if (this.scroll_view) {
      this.scroll_view.DeleteMe();
    }
 
    this.scroll_view = null;
  }
});
module.exports = GuildDonateWindow;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZFxcdmlld1xcZ3VpbGRfZG9uYXRlX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJHdWlsZENvbnRyb2xsZXIiLCJHdWlsZENvbnN0IiwiQ29tbW9uU2Nyb2xsVmlldyIsIlJvbGVDb250cm9sbGVyIiwiR3VpbGRFdmVudCIsIkd1aWxkRG9uYXRlSXRlbSIsIkd1aWxkRG9uYXRlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwiY3RybCIsImdldEluc3RhbmNlIiwibW9kZWwiLCJnZXRNb2RlbCIsInJvbGVfdm8iLCJnZXRSb2xlVm8iLCJhd2FyZHNfbGlzdCIsIm9wZW5DYWxsQmFjayIsIm1haW5fcGFuZWwiLCJzZWVrQ2hpbGQiLCJjbG9zZV9idG4iLCJiYWNrZ3JvdW5kIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJkb25hdGVfY29udGFpbmVyIiwicHJvZ3Jlc3NfYmFyIiwiUHJvZ3Jlc3NCYXIiLCJsZXZfdGl0bGUiLCJMYWJlbCIsImV4cF92YWx1ZSIsImV4cGxhaW5fYnRuIiwidG90YWxfd2lkdGgiLCJub2RlIiwiZ2V0Q29udGVudFNpemUiLCJ3aWR0aCIsInN0YXJ0X3giLCJjb25maWciLCJDb25maWciLCJndWlsZF9kYXRhIiwiZGF0YV9jb25zdCIsImRheV9leHBfbWF4IiwiaSIsImRhdGFfZG9uYXRlX2JveCIsInYiLCJnZGF0YSIsImF3YXJkcyIsImpzIiwiZm9ybWF0U3RyIiwiTnVtYmVyIiwiYWN0aXZlIiwiY29udGFpbmVyIiwiZ2V0Q2hpbGRCeU5hbWUiLCJza2VsZXRvbiIsImdldENvbXBvbmVudCIsInNwIiwiU2tlbGV0b24iLCJ2YWx1ZSIsInN0cmluZyIsImJveF92YWwiLCJwZXJjZW50IiwidmFsIiwic2V0UG9zaXRpb24iLCJvYmplY3QiLCJpdGVtIiwic3RhdHVzIiwibm9ybWFsIiwiaWQiLCJpc19zaG93X3RpcHMiLCJkZXNjIiwiUmljaFRleHQiLCJzaXplIiwibGlzdF9zaXplIiwiaGVpZ2h0Iiwic2V0dGluZyIsIml0ZW1fY2xhc3MiLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJzY3JvbGxfdmlldyIsImNyZWF0ZVNjcm9sbCIsInYyIiwiU2Nyb2xsVmlld0RpciIsInZlcnRpY2FsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwicmVnaXN0ZXJFdmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImV2ZW50IiwiZ2FtZV9ydWxlMSIsIlV0aWxzIiwicGxheUJ1dHRvblNvdW5kIiwicG9zIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwib3Blbkd1aWxkRG9uYXRlV2luZG93IiwiQ29tbW9uQWxlcnQiLCJzaG93SXRlbUFwcGx5IiwiVEkxOE4iLCJyZXdhcmRzIiwicmVxdWVzdERvbmF0ZUJveFJld2FyZHMiLCJteV9ndWlsZF9pbmZvIiwiZ2V0TXlHdWlsZEluZm8iLCJhZGRHbG9iYWxFdmVudCIsIlVwZGF0ZU15SW5mb0V2ZW50Iiwia2V5IiwidXBkYXRlTXlHdWlsZExldiIsIlVwZGF0ZURvbmF0ZUluZm8iLCJ1cGRhdGVEb25hdGVMaXN0U3RhdHVzIiwiVXBkYXRlRG9uYXRlQm94U3RhdHVzIiwiZmluaXNoIiwic2V0VG9TZXR1cFBvc2UiLCJjbGVhclRyYWNrcyIsInNldEFuaW1hdGlvbiIsIlBsYXllckFjdGlvbiIsImFjdGlvbl8zIiwidXBkYXRlRG9uYXRlQm94TGlzdCIsIm9wZW5Sb290V25kIiwiY29uZmlnX2xpc3QiLCJkYXRhX2RvbmF0ZSIsImxpc3QiLCJwdXNoIiwic2V0RGF0YSIsImFjdGl2aXR5X3ZhbHVlIiwiZ2V0RG9uYXRlQWN0aXZpdHlWYWx1ZSIsInByb2dyZXNzIiwiYm94X3N0YXR1cyIsImdldERvbmF0ZUJveFN0YXR1cyIsInRtcF9zdGF0dXMiLCJhY3Rpdml0eSIsInVuX2FjdGl2aXR5IiwiYm94X2FjdGlvbiIsImFjdGlvbl8xIiwiYWN0aW9uXzIiLCJza2VsZXRvbkRhdGEiLCJyZXNfaWQiLCJnZXRFZmZlY3RSZXMiLCJlZmZlY3RfaWQiLCJwYXRoIiwiX3NrZWxldG9uIiwiY3JlYXRlRWZmZWN0IiwibG9hZFJlcyIsInJlcyIsImJpbmQiLCJsZXYiLCJuZXh0X2x2IiwiU3RyaW5nVXRpbCIsInBhcnNlIiwiaXRlbV9saXN0IiwiZ2V0SXRlbUxpc3QiLCJrIiwidXBkYXRlRG9uYXRlU3RhdHVzIiwiY2xvc2VDYWxsQmFjayIsIkRlbGV0ZU1lIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLGVBQWUsR0FBR0QsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUNBLElBQUlFLFVBQVUsR0FBR0YsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsZ0JBQWdCLEdBQUdILE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJSSxjQUFjLEdBQUdKLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJSyxVQUFVLEdBQUdMLE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlNLGVBQWUsR0FBR04sT0FBTyxDQUFDLG1CQUFELENBQTdCOztBQUVBLElBQUlPLGlCQUFpQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM3QixhQUFTQyxRQURvQjtBQUU3QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTCxHQUFrQmIsUUFBUSxDQUFDYyxh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QUFtQndDLEtBQUssQ0FBQ1MsS0FBTixDQUFZLFVBQVosQ0FBbkIsQ0FESixLQUdJLEtBQUt0QyxJQUFMLENBQVVYLE1BQVYsR0FBbUJpRyxVQUFVLENBQUNDLEtBQVgsQ0FBaUJ2SCxNQUFNLENBQUNnQyxJQUF4QixDQUFuQjtBQUNQLEdBaE40QjtBQWtON0JnRCxFQUFBQSxzQkFBc0IsRUFBRSxrQ0FBWTtBQUNoQyxRQUFJd0MsU0FBUyxHQUFHLEtBQUt6RSxXQUFMLENBQWlCMEUsV0FBakIsRUFBaEI7O0FBQ0EsUUFBSUQsU0FBSixFQUFlO0FBQ1gsV0FBSyxJQUFJRSxDQUFULElBQWNGLFNBQWQsRUFBeUI7QUFDckIsWUFBSWpILENBQUMsR0FBR2lILFNBQVMsQ0FBQ0UsQ0FBRCxDQUFqQjtBQUNBLFlBQUluSCxDQUFDLENBQUNvSCxrQkFBTixFQUNJcEgsQ0FBQyxDQUFDb0gsa0JBQUY7QUFDUDtBQUNKO0FBQ0osR0EzTjRCO0FBNk43QkMsRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFNBQUt0SixJQUFMLENBQVU2RixxQkFBVixDQUFnQyxLQUFoQzs7QUFDQSxRQUFJLEtBQUtwQixXQUFULEVBQXFCO0FBQ2pCLFdBQUtBLFdBQUwsQ0FBaUI4RSxRQUFqQjtBQUNIOztBQUNELFNBQUs5RSxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7QUFuTzRCLENBQVQsQ0FBeEI7QUF1T0ErRSxNQUFNLENBQUNDLE9BQVAsR0FBaUJ0SyxpQkFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOWFrOS8muaNkOeMrumdouadv1xyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBHdWlsZENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpbGRfY29udHJvbGxlclwiKTtcclxudmFyIEd1aWxkQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRfY29uc3RcIik7XHJcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgR3VpbGRFdmVudCA9IHJlcXVpcmUoXCJndWlsZF9ldmVudFwiKTtcclxudmFyIEd1aWxkRG9uYXRlSXRlbSA9IHJlcXVpcmUoXCJndWlsZF9kb25hdGVfaXRlbVwiKTtcclxuXHJcbnZhciBHdWlsZERvbmF0ZVdpbmRvdyA9IGNjLkNsYXNzKHtcclxuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJndWlsZFwiLCBcImd1aWxkX2RvbmF0ZV93aW5kb3dcIik7XHJcbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuQmlnO1xyXG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTsgXHJcbiAgICAgICAgdGhpcy5jdHJsID0gR3VpbGRDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICAgICAgdGhpcy5hd2FyZHNfbGlzdCA9IHt9O1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5tYWluX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLCBcImNsb3NlX2J0blwiKTtcclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xyXG4gICAgICAgIHRoaXMuZG9uYXRlX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwiZG9uYXRlX2NvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLnByb2dyZXNzX2JhciA9IHRoaXMuc2Vla0NoaWxkKFwicHJvZ3Jlc3NfYmFyXCIsIGNjLlByb2dyZXNzQmFyKTtcclxuICAgICAgICB0aGlzLmxldl90aXRsZSA9IHRoaXMuc2Vla0NoaWxkKFwibGV2X3RpdGxlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmV4cF92YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKFwiZXhwX3ZhbHVlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJleHBsYWluX2J0blwiKTtcclxuICAgICAgICB0aGlzLnRvdGFsX3dpZHRoID0gdGhpcy5wcm9ncmVzc19iYXIubm9kZS5nZXRDb250ZW50U2l6ZSgpLndpZHRoO1xyXG4gICAgICAgIHRoaXMuc3RhcnRfeCA9IDIwNi0zMjtcclxuXHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9kYXRhLmRhdGFfY29uc3QuZGF5X2V4cF9tYXg7XHJcbiAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIENvbmZpZy5ndWlsZF9kYXRhLmRhdGFfZG9uYXRlX2JveCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBnZGF0YShcImd1aWxkX2RhdGFcIiwgXCJkYXRhX2RvbmF0ZV9ib3hcIiwgW2ldKTtcclxuICAgICAgICAgICAgICAgIHZhciBhd2FyZHMgPSB0aGlzLnNlZWtDaGlsZChjYy5qcy5mb3JtYXRTdHIoXCJhd2FyZHNfJXNcIiwgTnVtYmVyKGkpKSk7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBhd2FyZHMuZ2V0Q2hpbGRCeU5hbWUoXCJjb250YWluZXJcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2tlbGV0b24gPSBjb250YWluZXIuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGF3YXJkcy5nZXRDaGlsZEJ5TmFtZShcInZhbHVlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5zdHJpbmcgPSB2LmJveF92YWw7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9IHYuYm94X3ZhbCAvIGNvbmZpZy52YWw7XHJcbiAgICAgICAgICAgICAgICBhd2FyZHMuc2V0UG9zaXRpb24odGhpcy5zdGFydF94ICsgdGhpcy50b3RhbF93aWR0aCAqIHBlcmNlbnQsIDI3MCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmplY3QuaXRlbSA9IGF3YXJkcztcclxuICAgICAgICAgICAgICAgIG9iamVjdC5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBvYmplY3Quc3RhdHVzID0gR3VpbGRDb25zdC5zdGF0dXMubm9ybWFsO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LmlkID0gaTtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5jb25maWcgPSB2O1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNrZWxldG9uID0gc2tlbGV0b247XHJcbiAgICAgICAgICAgICAgICBvYmplY3QuaXNfc2hvd190aXBzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXdhcmRzX2xpc3RbaV0gPSBvYmplY3Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGVzYyA9IHRoaXMuc2Vla0NoaWxkKFwiZGVzY1wiLCBjYy5SaWNoVGV4dCk7XHJcbiAgICAgICAgdmFyIHNpemUgPSB0aGlzLmRvbmF0ZV9jb250YWluZXIuZ2V0Q29udGVudFNpemUoKTtcclxuICAgICAgICB2YXIgbGlzdF9zaXplID0gY2Muc2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCAtIDEwKTtcclxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcclxuICAgICAgICAgICAgaXRlbV9jbGFzczogR3VpbGREb25hdGVJdGVtLCAgICAgIC8vIOWNleWFg+exu1xyXG4gICAgICAgICAgICBzdGFydF94OiA0LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxyXG4gICAgICAgICAgICBzcGFjZV94OiAwLCAgICAgICAgICAgICAgICAgICAgLy8geOaWueWQkeeahOmXtOmalFxyXG4gICAgICAgICAgICBzdGFydF95OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxyXG4gICAgICAgICAgICBzcGFjZV95OiAtMSwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxyXG4gICAgICAgICAgICBpdGVtX3dpZHRoOiA2MTQsICAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4d2lkdGhcclxuICAgICAgICAgICAgaXRlbV9oZWlnaHQ6IDE4NywgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuGhlaWdodFxyXG4gICAgICAgICAgICByb3c6IDAsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIGNvbDogMSwgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcclxuICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBuZXcgQ29tbW9uU2Nyb2xsVmlldygpXHJcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5kb25hdGVfY29udGFpbmVyLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgbGlzdF9zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsIDAuNSkpXHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuZXhwbGFpbl9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9kYXRhLmRhdGFfY29uc3QuZ2FtZV9ydWxlMTtcclxuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpO1xyXG4gICAgICAgICAgICB2YXIgcG9zID0gZXZlbnQudG91Y2guZ2V0TG9jYXRpb24oKTtcclxuICAgICAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dDb21tb25UaXBzKGNvbmZpZy5kZXNjLCBwb3MpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgdGhpcy5jbG9zZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuR3VpbGREb25hdGVXaW5kb3coZmFsc2UpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbkd1aWxkRG9uYXRlV2luZG93KGZhbHNlKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYXdhcmRzX2xpc3QpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5hd2FyZHNfbGlzdFtpXTtcclxuICAgICAgICAgICAgb2JqZWN0Lml0ZW0ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuaXNfc2hvd190aXBzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93SXRlbUFwcGx5KFV0aWxzLlRJMThOKFwi5b2T5YmN5o2Q54yu5rS76LeD5bqm5aWW5YqxXCIpLCBvYmplY3QuY29uZmlnLnJld2FyZHMsIG51bGwsIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBudWxsLCBudWxsLCBVdGlscy5USTE4TihcIuWlluWKsVwiKSwgbnVsbCwgbnVsbCwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdERvbmF0ZUJveFJld2FyZHMob2JqZWN0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5teV9ndWlsZF9pbmZvID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5teV9ndWlsZF9pbmZvID0gdGhpcy5tb2RlbC5nZXRNeUd1aWxkSW5mbygpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkRXZlbnQuVXBkYXRlTXlJbmZvRXZlbnQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwibGV2XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNeUd1aWxkTGV2KCk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkRXZlbnQuVXBkYXRlRG9uYXRlSW5mbywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURvbmF0ZUxpc3RTdGF0dXMoKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZEV2ZW50LlVwZGF0ZURvbmF0ZUJveFN0YXR1cywgZnVuY3Rpb24gKGlkKSB7XHJcbiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5hd2FyZHNfbGlzdFtpZF07XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmlzX3Nob3dfdGlwcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnN0YXR1cyA9IEd1aWxkQ29uc3Quc3RhdHVzLmZpbmlzaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0LnNrZWxldG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5za2VsZXRvbi5zZXRUb1NldHVwUG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2tlbGV0b24uY2xlYXJUcmFja3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uXzMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvbmF0ZUJveExpc3QoKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBjb25maWdfbGlzdCA9IENvbmZpZy5ndWlsZF9kYXRhLmRhdGFfZG9uYXRlO1xyXG4gICAgICAgIHZhciBsaXN0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBjb25maWdfbGlzdCkge1xyXG4gICAgICAgICAgICBsaXN0LnB1c2goY29uZmlnX2xpc3RbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldERhdGEobGlzdCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEb25hdGVCb3hMaXN0KCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNeUd1aWxkTGV2KCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5pu05paw5rS76LeD5bqm5a6d566xXHJcbiAgICB1cGRhdGVEb25hdGVCb3hMaXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGFjdGl2aXR5X3ZhbHVlID0gdGhpcy5tb2RlbC5nZXREb25hdGVBY3Rpdml0eVZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5leHBfdmFsdWUuc3RyaW5nID0gYWN0aXZpdHlfdmFsdWU7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgXCJkYXlfZXhwX21heFwiKTtcclxuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfYmFyLnByb2dyZXNzID0gYWN0aXZpdHlfdmFsdWUgLyBjb25maWcudmFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYXdhcmRzX2xpc3QpIHtcclxuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHRoaXMuYXdhcmRzX2xpc3RbaV07XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBvYmplY3QuY29uZmlnO1xyXG4gICAgICAgICAgICB2YXIgYm94X3N0YXR1cyA9IHRoaXMubW9kZWwuZ2V0RG9uYXRlQm94U3RhdHVzKG9iamVjdC5pZCk7XHJcbiAgICAgICAgICAgIHZhciB0bXBfc3RhdHVzID0gR3VpbGRDb25zdC5zdGF0dXMubm9ybWFsO1xyXG4gICAgICAgICAgICBpZiAoYm94X3N0YXR1cyA9PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgdG1wX3N0YXR1cyA9IEd1aWxkQ29uc3Quc3RhdHVzLmZpbmlzaDtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlfdmFsdWUgPj0gb2JqZWN0LmNvbmZpZy5ib3hfdmFsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRtcF9zdGF0dXMgPSBHdWlsZENvbnN0LnN0YXR1cy5hY3Rpdml0eTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0bXBfc3RhdHVzID0gR3VpbGRDb25zdC5zdGF0dXMudW5fYWN0aXZpdHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBib3hfYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8xO1xyXG4gICAgICAgICAgICBpZiAodG1wX3N0YXR1cyA9PSBHdWlsZENvbnN0LnN0YXR1cy5maW5pc2gpXHJcbiAgICAgICAgICAgICAgICBib3hfYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8zO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0bXBfc3RhdHVzID09IEd1aWxkQ29uc3Quc3RhdHVzLmFjdGl2aXR5KVxyXG4gICAgICAgICAgICAgICAgYm94X2FjdGlvbiA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0bXBfc3RhdHVzID09IEd1aWxkQ29uc3Quc3RhdHVzLmFjdGl2aXR5KVxyXG4gICAgICAgICAgICAgICAgb2JqZWN0LmlzX3Nob3dfdGlwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBvYmplY3QuaXNfc2hvd190aXBzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvYmplY3Quc2tlbGV0b24uc2tlbGV0b25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodG1wX3N0YXR1cyAhPSBvYmplY3Quc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnN0YXR1cyA9IHRtcF9zdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBib3hfYWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNfaWQgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMob2JqZWN0LmNvbmZpZy5lZmZlY3RfaWQpXHJcbiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzL2FjdGlvbi5hdGxhc1wiLCByZXNfaWQpXHJcbiAgICAgICAgICAgICAgICB2YXIgX3NrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVmZmVjdChfc2tlbGV0b24sIHBhdGgsIGJveF9hY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+eUn+aIkOWuneeusVxyXG4gICAgY3JlYXRlRWZmZWN0KF9za2VsZXRvbiwgcGF0aCwgYm94X2FjdGlvbikge1xyXG4gICAgICAgIHRoaXMubG9hZFJlcyhwYXRoLCAoZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICBfc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzO1xyXG4gICAgICAgICAgICBfc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIGJveF9hY3Rpb24sIHRydWUpO1xyXG4gICAgICAgIH0pLmJpbmQodGhpcykpXHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u562J57qn55u45YWzXHJcbiAgICB1cGRhdGVNeUd1aWxkTGV2OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubXlfZ3VpbGRfaW5mbyA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB0aGlzLmxldl90aXRsZS5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlhazkvJrnrYnnuqfvvJolc+e6p1wiKSwgdGhpcy5teV9ndWlsZF9pbmZvLmxldik7XHJcblxyXG4gICAgICAgIHZhciBuZXh0X2x2ID0gdGhpcy5teV9ndWlsZF9pbmZvLmxldiArIDE7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfZGF0YVwiLCBcImRhdGFfZ3VpbGRfbGV2XCIsIFtuZXh0X2x2XSk7XHJcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLmRlc2Muc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlvZPliY3lt7Lovr7mnIDlpKflgLzvvIFcIik7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmRlc2Muc3RyaW5nID0gU3RyaW5nVXRpbC5wYXJzZShjb25maWcuZGVzYyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZURvbmF0ZUxpc3RTdGF0dXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgaXRlbV9saXN0ID0gdGhpcy5zY3JvbGxfdmlldy5nZXRJdGVtTGlzdCgpO1xyXG4gICAgICAgIGlmIChpdGVtX2xpc3QpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gaXRlbV9saXN0W2tdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYudXBkYXRlRG9uYXRlU3RhdHVzKVxyXG4gICAgICAgICAgICAgICAgICAgIHYudXBkYXRlRG9uYXRlU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN0cmwub3Blbkd1aWxkRG9uYXRlV2luZG93KGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxfdmlldyl7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuRGVsZXRlTWUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gbnVsbFxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWxkRG9uYXRlV2luZG93OyJdfQ==