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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/primus/view/primus_main_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, '4873e7BaVROM5aUlgXt2UcB', 'primus_main_window');
// Scripts/mod/primus/view/primus_main_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-03-16 10:25:16
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var BaseRole = require("baserole");
 
var Primus_mainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("primus", "primus_main_window");
    this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    // 站台数据
    this.station_list = []; // tips描述
 
    this.tips_list = []; // 是否已有称号
 
    this.is_have_title = false;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.root_wnd.getChildByName("background");
    this.background.scale = FIT_SCALE;
    this.background_bg = this.root_wnd.getChildByName("background").getComponent(cc.Sprite);
    this.loadRes(PathTool.getBigBg("primus_bigbg_1", "jpg", "primus"), function (resObject) {
      if (this.background_bg) {
        this.background_bg.spriteFrame = resObject;
      }
    }.bind(this));
    this.main_container = this.root_wnd.getChildByName("main_container");
    this.primus_bigbg_2_node = this.main_container.getChildByName("primus_bigbg_2");
    this.primus_bigbg_2_node.scale = 2;
    this.primus_bigbg_2 = this.primus_bigbg_2_node.getComponent(cc.Sprite);
    this.loadRes(PathTool.getBigBg("primus_bigbg_2", null, "primus"), function (resObject) {
      if (this.primus_bigbg_2) {
        this.primus_bigbg_2.spriteFrame = resObject;
      }
    }.bind(this));
    this.main_panel = this.main_container.getChildByName("main_panel");
    this.main_panel.zIndex = 2;
    this.explain_btn = this.main_panel.getChildByName("explain_btn");
    this.title_bg = this.main_panel.getChildByName("title_bg");
    var title_lab = this.title_bg.getChildByName("title_lab").getComponent(cc.Label);
    title_lab.string = Utils.TI18N("星河神殿");
    this.exit_btn = this.title_bg.getChildByName("exit_btn");
    var text = this.exit_btn.getChildByName("text").getComponent(cc.Label);
    text.string = Utils.TI18N("退出");
    this.tips_panel = this.main_panel.getChildByName("tips_panel");
 
    for (var i = 1; i <= 6; i++) {
      var station_lay = this.main_panel.getChildByName("station_lay_" + i);
      var station_item = {};
      station_item.station_lay = station_lay;
      station_item.title_img = station_lay.getChildByName("title_img").getComponent(cc.Sprite);
      station_item.mode_node = station_lay.getChildByName("mode_node");
      station_item.name = station_lay.getChildByName("name").getComponent(cc.Label);
      this.station_list[i] = station_item;
    }
 
    for (var j = 1; j <= 3; j++) {
      this.tips_list[j] = this.tips_panel.getChildByName("tips_node_" + j);
    }
 
    var title = this.tips_panel.getChildByName("title").getComponent(cc.Label);
    title.string = Utils.TI18N("挑战条件:"); // 说明
 
    this.initTipsInfo();
    this.addEffect();
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.exit_btn, function () {
      this._onClickBtnClose();
    }.bind(this), 2);
    this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      Utils.playButtonSound(ButtonSound.Normal);
      var config = Config.primus_data.data_const.game_rule;
      var pos = event.touch.getLocation();
 
      require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
    });
  },
  _onClickBtnClose: function _onClickBtnClose() {
    this.ctrl.openPrimusMainWindow(false);
  },
  _onClickByPosIndex: function _onClickByPosIndex(pos_index) {
    if (this.station_list && this.station_list[pos_index] && this.station_list[pos_index].sever_data) {
      this.ctrl.openPrimusChallengePanel(true, this.station_list[pos_index].sever_data, this.is_have_title);
    }
  },
  addEffect: function addEffect() {
    this.size = this.main_container.getContentSize(); // 流星
 
    if (this.scene_effect_1 == null) {
      var node = new cc.Node();
      node.setAnchorPoint(0.5, 0.5);
      node.setPosition(0, 0);
      this.background.addChild(node, 0);
      this.scene_effect_1 = node.addComponent(sp.Skeleton);
      var anima_path = PathTool.getSpinePath(PathTool.getEffectRes(305), "action");
      this.loadRes(anima_path, function (ske_data) {
        if (this.scene_effect_1) {
          this.scene_effect_1.skeletonData = ske_data;
          this.scene_effect_1.setAnimation(0, PlayerAction.action, true);
        }
      }.bind(this));
    } // 星星
 
 
    if (this.scene_effect_2 == null) {
      var node2 = new cc.Node();
      node2.setAnchorPoint(0.5, 0.5);
      node2.setPosition(0, 0);
      this.background.addChild(node2, 0);
      this.scene_effect_2 = node2.addComponent(sp.Skeleton);
      var anima_path = PathTool.getSpinePath(PathTool.getEffectRes(306), "action");
      this.loadRes(anima_path, function (ske_data) {
        if (this.scene_effect_2) {
          this.scene_effect_2.skeletonData = ske_data;
          this.scene_effect_2.setAnimation(0, PlayerAction.action, true);
        }
      }.bind(this));
    } // 流水
 
 
    if (this.scene_effect_3 == null) {
      var node3 = new cc.Node();
      node3.setAnchorPoint(0.5, 0.5);
      node3.setPosition(0, 0);
      this.main_container.addChild(node3, 0);
      this.scene_effect_3 = node3.addComponent(sp.Skeleton);
      var anima_path = PathTool.getSpinePath(PathTool.getEffectRes(307), "action");
      this.loadRes(anima_path, function (ske_data) {
        if (this.scene_effect_3) {
          this.scene_effect_3.skeletonData = ske_data;
          this.scene_effect_3.setAnimation(0, PlayerAction.action, true);
        }
      }.bind(this));
    } // -- this.fight_effect = createEffectSpine( PathTool.getEffectRes(186), cc.p(48,106), cc.p(0,0), true, PlayerAction.action)
    // --         this.fight_effect:setScale(1.5)
    // --         this.item_icon:addChild(this.fight_effect, 10)  
 
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.ctrl.requestPrimusChallengeCount();
    this.ctrl.sender20701();
 
    var MainuiController = require("mainui_controller");
 
    var MainUiConst = require("mainui_const");
 
    var SceneConst = require("scene_const");
 
    MainuiController.getInstance().setBtnRedPoint(MainUiConst.btn_index.esecsice, {
      bid: SceneConst.RedPointType.primus,
      status: false
    });
  },
  setData: function setData(data) {
    this.is_have_title = false;
    data.list.sort(function (a, b) {
      return a.pos - b.pos;
    });
    if (!this.station_list) return;
 
    for (var i in data.list) {
      if (this.station_list[data.list[i].pos]) {
        this.station_list[data.list[i].pos].sever_data = data.list[i];
        this.station_list[data.list[i].pos].var_data = Config.primus_data.data_upgrade[data.list[i].pos];
        this.updateStationInfoByPos(data.list[i].pos); // 有数据才有监听
 
        var pos = data.list[i].pos;
 
        if (this.station_list[pos].station_lay) {
          Utils.onTouchEnd(this.station_list[pos].station_lay, function (pos) {
            this._onClickByPosIndex(pos);
          }.bind(this, pos), 2);
        }
      }
    }
  },
  updateStationInfoByPos: function updateStationInfoByPos(pos_index) {
    var station_item = this.station_list[pos_index];
    if (!station_item) return;
    var sever_data = station_item.sever_data;
    if (!sever_data) return; // 称号
 
    if (station_item.var_data) {
      var honor_data = Config.honor_data.data_title[station_item.var_data.honor_id];
 
      if (honor_data) {
        this.loadRes(PathTool.getHonorRes(honor_data.res_id), function (resObject) {
          if (station_item && station_item.title_img) {
            station_item.title_img.spriteFrame = resObject;
          }
        }.bind(this));
      }
    } // 名字
 
 
    if (sever_data.name == null || sever_data.name == "") {
      station_item.name.string = Utils.TI18N("虚位以待");
      station_item.name.node.color = new cc.Color(0xff, 0xff, 0xff, 0xff); // 模型
 
      this.updateSpine(station_item.var_data.look_id, pos_index);
    } else {
      station_item.name.string = sever_data.name;
      var roleVo = RoleController.getInstance().getRoleVo();
 
      if (roleVo && sever_data.rid == roleVo.rid && sever_data.srv_id == roleVo.srv_id) {
        this.is_have_title = true;
        station_item.name.node.color = new cc.Color(0x14, 0xff, 0x32, 0xff);
      } else {
        station_item.name.node.color = new cc.Color(0xff, 0xe2, 0x40, 0xff);
      } // 模型 
 
 
      this.updateSpine(sever_data.look_id, pos_index);
    }
  },
  // 更新模型,也是初始化模型
  updateSpine: function updateSpine(look_id, pos_index) {
    var station_item = this.station_list[pos_index];
    if (!station_item) return;
 
    if (!station_item.spine) {
      station_item.spine = new BaseRole(); // station_item.spine:setCascade(true)
 
      station_item.spine.setParent(station_item.mode_node);
      station_item.spine.node.setPosition(0, 45);
      station_item.spine.node.setAnchorPoint(cc.v2(0.5, 0.5)); // station_item.spine:setOpacity(0)
      // var action = cc.fadeIn(0.2);
      // station_item.spine.runAction(action);
    }
 
    if (station_item.spine) {
      station_item.spine.setData(BaseRole.type.role, look_id, PlayerAction.show, true, 0.6, {
        scale: 0.72
      }); //原生0.8倍
      // station_item.spine:setCascade(true)
      // var action = cc.fadeOut(0.2);
      // station_item.spine.node.runAction(cc.sequence(action, cc.CallFunc(function(){
      // station_item.spine.node.stopAllActions();    
      // })))
    }
  },
  initTipsInfo: function initTipsInfo() {
    if (!this.tips_list) return; // 默认写死 对应
 
    var id_list = [1, 2, 4];
 
    for (var i in id_list) {
      var var_data = Config.primus_data.data_upgrade[id_list[i]];
 
      if (this.tips_list[parseInt(i) + 1] && var_data) {
        var str = cc.js.formatStr(Utils.TI18N("%s:竞技场排行<color=#14ff32>前%s名</color>"), var_data.name, var_data.arena_rank);
        var label = Utils.createRichLabel(22, new cc.Color(0xff, 0xff, 0xff, 0xff), cc.v2(0, 0), cc.v2(0, 0), 30, 500);
        label.horizontalAlign = cc.macro.TextAlignment.LEFT;
        label.string = str;
        this.tips_list[parseInt(i) + 1].addChild(label.node);
      }
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    for (var i in this.station_list) {
      if (this.station_list[i]) {
        if (this.station_list[i].spine) {
          this.station_list[i].spine.deleteMe();
          this.station_list[i].spine = null;
        }
 
        this.station_list[i] = null;
      }
    }
 
    this.station_list = null;
    this.ctrl.openPrimusMainWindow(false);
  }
});
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxwcmltdXNcXHZpZXdcXHByaW11c19tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkJhc2VSb2xlIiwiUHJpbXVzX21haW5XaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwidWkiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJGdWxsIiwiY3RybCIsImFyZ3VtZW50cyIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJpbml0Q29uZmlnIiwic3RhdGlvbl9saXN0IiwidGlwc19saXN0IiwiaXNfaGF2ZV90aXRsZSIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJyb290X3duZCIsImdldENoaWxkQnlOYW1lIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJiYWNrZ3JvdW5kX2JnIiwiZ2V0Q29tcG9uZW50IiwiU3ByaXRlIiwibG9hZFJlcyIsImdldEJpZ0JnIiwicmVzT2JqZWN0Iiwic3ByaXRlRnJhbWUiLCJiaW5kIiwibWFpbl9jb250YWluZXIiLCJwcmltdXNfYmlnYmdfMl9ub2RlIiwicHJpbXVzX2JpZ2JnXzIiLCJtYWluX3BhbmVsIiwiekluZGV4IiwiZXhwbGFpbl9idG4iLCJ0aXRsZV9iZyIsInRpdGxlX2xhYiIsIkxhYmVsIiwic3RyaW5nIiwiVXRpbHMiLCJUSTE4TiIsImV4aXRfYnRuIiwidGV4dCIsInRpcHNfcGFuZWwiLCJpIiwic3RhdGlvbl9sYXkiLCJzdGF0aW9uX2l0ZW0iLCJ0aXRsZV9pbWciLCJtb2RlX25vZGUiLCJuYW1lIiwiaiIsInRpdGxlIiwiaW5pdFRpcHNJbmZvIiwiYWRkRWZmZWN0IiwicmVnaXN0ZXJFdmVudCIsIm9uVG91Y2hFbmQiLCJfb25DbGlja0J0bkNsb3NlIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJwbGF5QnV0dG9uU291bmQiLCJCdXR0b25Tb3VuZCIsIk5vcm1hbCIsImNvbmZpZyIsIkNvbmZpZyIsInByaW11c19kYXRhIiwiZGF0YV9jb25zdCIsImdhbWVfcnVsZSIsInBvcyIsInRvdWNoIiwiZ2V0TG9jYXRpb24iLCJnZXRJbnN0YW5jZSIsInNob3dDb21tb25UaXBzIiwiZGVzYyIsIm9wZW5QcmltdXNNYWluV2luZG93IiwiX29uQ2xpY2tCeVBvc0luZGV4IiwicG9zX2luZGV4Iiwic2V2ZXJfZGF0YSIsIm9wZW5QcmltdXNDaGFsbGVuZ2VQYW5lbCIsInNpemUiLCJnZXRDb250ZW50U2l6ZSIsInNjZW5lX2VmZmVjdF8xIiwibm9kZSIsInNldEFuY2hvclBvaW50Iiwic2V0UG9zaXRpb24iLCJhZGRDaGlsZCIsImFkZENvbXBvbmVudCIsInNwIiwiU2tlbGV0b24iLCJhbmltYV9wYXRoIiwiZ2V0U3BpbmVQYXRoIiwiZ2V0RWZmZWN0UmVzIiwic2tlX2RhdGEiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb24iLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb24iLCJzY2VuZV9lZmZlY3RfMiIsIm5vZGUyIiwic2NlbmVfZWZmZWN0XzMiLCJub2RlMyIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwicmVxdWVzdFByaW11c0NoYWxsZW5nZUNvdW50Iiwic2VuZGVyMjA3MDEiLCJNYWludWlDb250cm9sbGVyIiwiTWFpblVpQ29uc3QiLCJTY2VuZUNvbnN0Iiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJlc2Vjc2ljZSIsImJpZCIsIlJlZFBvaW50VHlwZSIsInByaW11cyIsInN0YXR1cyIsInNldERhdGEiLCJkYXRhIiwibGlzdCIsInNvcnQiLCJhIiwiYiIsInZhcl9kYXRhIiwiZGF0YV91cGdyYWRlIiwidXBkYXRlU3RhdGlvbkluZm9CeVBvcyIsImhvbm9yX2RhdGEiLCJkYXRhX3RpdGxlIiwiaG9ub3JfaWQiLCJnZXRIb25vclJlcyIsInJlc19pZCIsImNvbG9yIiwiQ29sb3IiLCJ1cGRhdGVTcGluZSIsImxvb2tfaWQiLCJyb2xlVm8iLCJnZXRSb2xlVm8iLCJyaWQiLCJzcnZfaWQiLCJzcGluZSIsInNldFBhcmVudCIsInYyIiwidHlwZSIsInJvbGUiLCJzaG93IiwiaWRfbGlzdCIsInBhcnNlSW50Iiwic3RyIiwianMiLCJmb3JtYXRTdHIiLCJhcmVuYV9yYW5rIiwibGFiZWwiLCJjcmVhdGVSaWNoTGFiZWwiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJMRUZUIiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsUUFBUSxHQUFHRixPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFFQSxJQUFJRyxpQkFBaUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDN0IsYUFBU0MsUUFEb0I7QUFFN0JDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLFVBQUwsR0FBa0JULFFBQVEsQ0FBQ1UsYUFBVCxDQUF1QixRQUF2QixFQUFpQyxvQkFBakMsQ0FBbEI7QUFDQSxTQUFLQyxPQUFMLEdBQWVDLFNBQVMsQ0FBQ0MsRUFBekIsQ0FGYyxDQUU4Qjs7QUFDNUMsU0FBS0MsUUFBTCxHQUFnQkMsT0FBTyxDQUFDQyxJQUF4QixDQUhjLENBRzhCOztBQUM1QyxTQUFLQyxJQUFMLEdBQVlDLFNBQVMsQ0FBQyxDQUFELENBQXJCO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLEtBQUtGLElBQUwsQ0FBVUcsUUFBVixFQUFiO0FBQ0gsR0FSNEI7QUFVN0I7QUFDQUMsRUFBQUEsVUFBVSxFQUFDLHNCQUFVO0FBQ2pCO0FBQ0EsU0FBS0MsWUFBTCxHQUFv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LENBQUN0RyxDQUFELENBQVIsR0FBWSxDQUEzQixFQUE4QjJDLFFBQTlCLENBQXVDZ0UsS0FBSyxDQUFDbkUsSUFBN0M7QUFDSDtBQUNKO0FBQ0osR0E5UTRCO0FBaVI3QjtBQUNBeUUsRUFBQUEsYUFBYSxFQUFDLHlCQUFVO0FBQ3BCLFNBQUksSUFBSWpILENBQVIsSUFBYSxLQUFLaEMsWUFBbEIsRUFBK0I7QUFDM0IsVUFBRyxLQUFLQSxZQUFMLENBQWtCZ0MsQ0FBbEIsQ0FBSCxFQUF3QjtBQUNwQixZQUFHLEtBQUtoQyxZQUFMLENBQWtCZ0MsQ0FBbEIsRUFBcUIrRixLQUF4QixFQUE4QjtBQUMxQixlQUFLL0gsWUFBTCxDQUFrQmdDLENBQWxCLEVBQXFCK0YsS0FBckIsQ0FBMkJtQixRQUEzQjtBQUNBLGVBQUtsSixZQUFMLENBQWtCZ0MsQ0FBbEIsRUFBcUIrRixLQUFyQixHQUE2QixJQUE3QjtBQUNIOztBQUNELGFBQUsvSCxZQUFMLENBQWtCZ0MsQ0FBbEIsSUFBdUIsSUFBdkI7QUFDSDtBQUNKOztBQUVELFNBQUtoQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsU0FBS0wsSUFBTCxDQUFVcUUsb0JBQVYsQ0FBK0IsS0FBL0I7QUFDSDtBQS9SNEIsQ0FBVCxDQUF4QiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDMtMTYgMTA6MjU6MTZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIEJhc2VSb2xlID0gcmVxdWlyZShcImJhc2Vyb2xlXCIpO1xuIFxudmFyIFByaW11c19tYWluV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcInByaW11c1wiLCBcInByaW11c19tYWluX3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLnVpOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuRnVsbDsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIOermeWPsOaVsOaNrlxuICAgICAgICB0aGlzLnN0YXRpb25fbGlzdCA9IFtdO1xuICAgIFxuICAgICAgICAvLyB0aXBz5o+P6L+wXG4gICAgICAgIHRoaXMudGlwc19saXN0ID0gW107XG4gICAgICAgIC8vIOaYr+WQpuW3suacieensOWPt1xuICAgICAgICB0aGlzLmlzX2hhdmVfdGl0bGUgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLmJhY2tncm91bmRfYmcgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwiYmFja2dyb3VuZFwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwicHJpbXVzX2JpZ2JnXzFcIixcImpwZ1wiLFwicHJpbXVzXCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuYmFja2dyb3VuZF9iZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kX2JnLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICBcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJtYWluX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5wcmltdXNfYmlnYmdfMl9ub2RlID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInByaW11c19iaWdiZ18yXCIpO1xuICAgICAgICB0aGlzLnByaW11c19iaWdiZ18yX25vZGUuc2NhbGUgPSAyO1xuICAgICAgICB0aGlzLnByaW11c19iaWdiZ18yID0gdGhpcy5wcmltdXNfYmlnYmdfMl9ub2RlLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJwcmltdXNfYmlnYmdfMlwiLG51bGwsXCJwcmltdXNcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgaWYodGhpcy5wcmltdXNfYmlnYmdfMil7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmltdXNfYmlnYmdfMi5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5tYWluX3BhbmVsID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIik7XG4gICAgICAgIHRoaXMubWFpbl9wYW5lbC56SW5kZXggPSAyO1xuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiZXhwbGFpbl9idG5cIik7XG4gICAgXG4gICAgICAgIHRoaXMudGl0bGVfYmcgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9iZ1wiKTtcbiAgICAgICAgdmFyIHRpdGxlX2xhYiA9IHRoaXMudGl0bGVfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9sYWJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGl0bGVfbGFiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5pif5rKz56We5q6/XCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5leGl0X2J0biA9IHRoaXMudGl0bGVfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJleGl0X2J0blwiKTtcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLmV4aXRfYnRuLmdldENoaWxkQnlOYW1lKFwidGV4dFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0ZXh0LnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6YCA5Ye6XCIpO1xuICAgICAgICB0aGlzLnRpcHNfcGFuZWwgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBzX3BhbmVsXCIpO1xuXG4gICAgICAgIGZvcih2YXIgaSA9IDE7aTw9NjtpKyspe1xuICAgICAgICAgICAgdmFyIHN0YXRpb25fbGF5ID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwic3RhdGlvbl9sYXlfXCIraSk7XG4gICAgICAgICAgICB2YXIgc3RhdGlvbl9pdGVtID0ge307XG4gICAgICAgICAgICBzdGF0aW9uX2l0ZW0uc3RhdGlvbl9sYXkgPSBzdGF0aW9uX2xheTtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS50aXRsZV9pbWcgPSBzdGF0aW9uX2xheS5nZXRDaGlsZEJ5TmFtZShcInRpdGxlX2ltZ1wiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5tb2RlX25vZGUgPSBzdGF0aW9uX2xheS5nZXRDaGlsZEJ5TmFtZShcIm1vZGVfbm9kZVwiKTtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5uYW1lID0gc3RhdGlvbl9sYXkuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRpb25fbGlzdFtpXSA9IHN0YXRpb25faXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaiA9IDE7ajw9MztqKyspe1xuICAgICAgICAgICAgdGhpcy50aXBzX2xpc3Rbal0gPSB0aGlzLnRpcHNfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXBzX25vZGVfXCIraik7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy50aXBzX3BhbmVsLmdldENoaWxkQnlOYW1lKFwidGl0bGVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGl0bGUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmjJHmiJjmnaHku7Y6XCIpO1xuICAgICAgICAvLyDor7TmmI5cbiAgICAgICAgdGhpcy5pbml0VGlwc0luZm8oKTtcbiAgICAgICAgdGhpcy5hZGRFZmZlY3QoKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmV4aXRfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrQnRuQ2xvc2UoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKTtcblxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcucHJpbXVzX2RhdGEuZGF0YV9jb25zdC5nYW1lX3J1bGU7XG4gICAgICAgICAgICB2YXIgcG9zID0gZXZlbnQudG91Y2guZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgICAgIHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zaG93Q29tbW9uVGlwcyhjb25maWcuZGVzYywgcG9zLG51bGwsbnVsbCw1MDApO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgX29uQ2xpY2tCdG5DbG9zZTpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN0cmwub3BlblByaW11c01haW5XaW5kb3coZmFsc2UpO1xuICAgIH0sXG5cbiAgICBfb25DbGlja0J5UG9zSW5kZXg6ZnVuY3Rpb24ocG9zX2luZGV4KXtcbiAgICAgICAgaWYodGhpcy5zdGF0aW9uX2xpc3QgJiYgdGhpcy5zdGF0aW9uX2xpc3RbcG9zX2luZGV4XSAmJiB0aGlzLnN0YXRpb25fbGlzdFtwb3NfaW5kZXhdLnNldmVyX2RhdGEpe1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5QcmltdXNDaGFsbGVuZ2VQYW5lbCh0cnVlLCB0aGlzLnN0YXRpb25fbGlzdFtwb3NfaW5kZXhdLnNldmVyX2RhdGEsIHRoaXMuaXNfaGF2ZV90aXRsZSk7ICAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkRWZmZWN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q29udGVudFNpemUoKTtcbiAgICAgICAgLy8g5rWB5pifXG4gICAgICAgIGlmKHRoaXMuc2NlbmVfZWZmZWN0XzEgPT0gbnVsbCl7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICBub2RlLnNldEFuY2hvclBvaW50KDAuNSwwLjUpXG4gICAgICAgICAgICBub2RlLnNldFBvc2l0aW9uKDAsMCk7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuYWRkQ2hpbGQobm9kZSwwKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0XzEgPSBub2RlLmFkZENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMzA1KSwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoYW5pbWFfcGF0aCwgZnVuY3Rpb24oc2tlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNjZW5lX2VmZmVjdF8xKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZV9lZmZlY3RfMS5za2VsZXRvbkRhdGEgPSBza2VfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZV9lZmZlY3RfMS5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOaYn+aYn1xuICAgICAgICBpZih0aGlzLnNjZW5lX2VmZmVjdF8yID09IG51bGwpe1xuICAgICAgICAgICAgdmFyIG5vZGUyID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgIG5vZGUyLnNldEFuY2hvclBvaW50KDAuNSwwLjUpXG4gICAgICAgICAgICBub2RlMi5zZXRQb3NpdGlvbigwLDApO1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmFkZENoaWxkKG5vZGUyLDApO1xuICAgIFxuICAgICAgICAgICAgdGhpcy5zY2VuZV9lZmZlY3RfMiA9IG5vZGUyLmFkZENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMzA2KSwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoYW5pbWFfcGF0aCwgZnVuY3Rpb24oc2tlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNjZW5lX2VmZmVjdF8yKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZV9lZmZlY3RfMi5za2VsZXRvbkRhdGEgPSBza2VfZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZV9lZmZlY3RfMi5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOa1geawtFxuICAgICAgICBpZih0aGlzLnNjZW5lX2VmZmVjdF8zID09IG51bGwpe1xuICAgICAgICAgICAgdmFyIG5vZGUzID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgIG5vZGUzLnNldEFuY2hvclBvaW50KDAuNSwwLjUpXG4gICAgICAgICAgICBub2RlMy5zZXRQb3NpdGlvbigwLDApO1xuICAgICAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lci5hZGRDaGlsZChub2RlMywwKTtcbiAgICBcbiAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0XzMgPSBub2RlMy5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDMwNyksIFwiYWN0aW9uXCIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKHNrZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zY2VuZV9lZmZlY3RfMyl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0XzMuc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0XzMuc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb24sIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgLy8gLS0gdGhpcy5maWdodF9lZmZlY3QgPSBjcmVhdGVFZmZlY3RTcGluZSggUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDE4NiksIGNjLnAoNDgsMTA2KSwgY2MucCgwLDApLCB0cnVlLCBQbGF5ZXJBY3Rpb24uYWN0aW9uKVxuICAgICAgICAvLyAtLSAgICAgICAgIHRoaXMuZmlnaHRfZWZmZWN0OnNldFNjYWxlKDEuNSlcbiAgICAgICAgLy8gLS0gICAgICAgICB0aGlzLml0ZW1faWNvbjphZGRDaGlsZCh0aGlzLmZpZ2h0X2VmZmVjdCwgMTApICBcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCOLOa3u+WKoOWIsOWvueW6lOS4u+iKgueCueS5i+WQjueahOWbnuiwgyzkuZ/lsLHmmK/kuIDkuKrnqpfkvZPnmoTmraPlvI/lhaXlj6Ms5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXG4gICAgb3BlblJvb3RXbmQ6ZnVuY3Rpb24ocGFyYW1zKXtcbiAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RQcmltdXNDaGFsbGVuZ2VDb3VudCgpO1xuICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMjA3MDEoKTtcbiAgICAgICAgdmFyIE1haW51aUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIHZhciBNYWluVWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG4gICAgICAgIHZhciBTY2VuZUNvbnN0ID0gcmVxdWlyZShcInNjZW5lX2NvbnN0XCIpO1xuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpblVpQ29uc3QuYnRuX2luZGV4LmVzZWNzaWNlLCB7YmlkOlNjZW5lQ29uc3QuUmVkUG9pbnRUeXBlLnByaW11cywgc3RhdHVzOmZhbHNlfSkgXG4gICAgfSxcblxuICAgIHNldERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuaXNfaGF2ZV90aXRsZSA9IGZhbHNlICAgIFxuICAgICAgICBkYXRhLmxpc3Quc29ydChmdW5jdGlvbihhLCBiKXtcbiAgICAgICAgICAgIHJldHVybiBhLnBvcyAtIGIucG9zO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZighdGhpcy5zdGF0aW9uX2xpc3QpcmV0dXJuO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YS5saXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RhdGlvbl9saXN0W2RhdGEubGlzdFtpXS5wb3NdKXtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRpb25fbGlzdFtkYXRhLmxpc3RbaV0ucG9zXS5zZXZlcl9kYXRhID0gZGF0YS5saXN0W2ldO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGlvbl9saXN0W2RhdGEubGlzdFtpXS5wb3NdLnZhcl9kYXRhID0gQ29uZmlnLnByaW11c19kYXRhLmRhdGFfdXBncmFkZVtkYXRhLmxpc3RbaV0ucG9zXTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGlvbkluZm9CeVBvcyhkYXRhLmxpc3RbaV0ucG9zKTtcbiAgICAgICAgICAgICAgICAvLyDmnInmlbDmja7miY3mnInnm5HlkKxcbiAgICAgICAgICAgICAgICB2YXIgcG9zID0gZGF0YS5saXN0W2ldLnBvcztcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRpb25fbGlzdFtwb3NdLnN0YXRpb25fbGF5KXtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnN0YXRpb25fbGlzdFtwb3NdLnN0YXRpb25fbGF5LCBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNsaWNrQnlQb3NJbmRleChwb3MpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyxwb3MpLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlU3RhdGlvbkluZm9CeVBvczpmdW5jdGlvbihwb3NfaW5kZXgpe1xuICAgICAgICB2YXIgc3RhdGlvbl9pdGVtID0gdGhpcy5zdGF0aW9uX2xpc3RbcG9zX2luZGV4XTtcbiAgICAgICAgaWYoIXN0YXRpb25faXRlbSlyZXR1cm47XG4gICAgICAgIHZhciBzZXZlcl9kYXRhID0gc3RhdGlvbl9pdGVtLnNldmVyX2RhdGE7XG4gICAgICAgIGlmKCFzZXZlcl9kYXRhKXJldHVybjtcbiAgICAgICAgLy8g56ew5Y+3XG4gICAgICAgIGlmKHN0YXRpb25faXRlbS52YXJfZGF0YSl7XG4gICAgICAgICAgICB2YXIgaG9ub3JfZGF0YSA9IENvbmZpZy5ob25vcl9kYXRhLmRhdGFfdGl0bGVbc3RhdGlvbl9pdGVtLnZhcl9kYXRhLmhvbm9yX2lkXTtcbiAgICAgICAgICAgIGlmKGhvbm9yX2RhdGEpe1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRIb25vclJlcyhob25vcl9kYXRhLnJlc19pZCksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICBpZihzdGF0aW9uX2l0ZW0gJiYgc3RhdGlvbl9pdGVtLnRpdGxlX2ltZyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aW9uX2l0ZW0udGl0bGVfaW1nLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlkI3lrZdcbiAgICAgICAgaWYoc2V2ZXJfZGF0YS5uYW1lID09IG51bGwgfHwgc2V2ZXJfZGF0YS5uYW1lID09IFwiXCIpe1xuICAgICAgICAgICAgc3RhdGlvbl9pdGVtLm5hbWUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLomZrkvY3ku6XlvoVcIik7XG4gICAgICAgICAgICBzdGF0aW9uX2l0ZW0ubmFtZS5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsMHhmZiwweGZmLDB4ZmYpO1xuICAgICAgICAgICAgLy8g5qih5Z6LXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNwaW5lKHN0YXRpb25faXRlbS52YXJfZGF0YS5sb29rX2lkLCBwb3NfaW5kZXgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5uYW1lLnN0cmluZyA9IHNldmVyX2RhdGEubmFtZTtcbiAgICAgICAgICAgIHZhciByb2xlVm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAgICAgaWYocm9sZVZvICYmIHNldmVyX2RhdGEucmlkID09IHJvbGVWby5yaWQgJiYgc2V2ZXJfZGF0YS5zcnZfaWQgPT0gcm9sZVZvLnNydl9pZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc19oYXZlX3RpdGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGF0aW9uX2l0ZW0ubmFtZS5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDB4MTQsMHhmZiwweDMyLDB4ZmYpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgc3RhdGlvbl9pdGVtLm5hbWUubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigweGZmLDB4ZTIsMHg0MCwweGZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOaooeWeiyBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3BpbmUoc2V2ZXJfZGF0YS5sb29rX2lkLCBwb3NfaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8g5pu05paw5qih5Z6LLOS5n+aYr+WIneWni+WMluaooeWei1xuICAgIHVwZGF0ZVNwaW5lOmZ1bmN0aW9uKGxvb2tfaWQsIHBvc19pbmRleCl7XG4gICAgICAgIHZhciBzdGF0aW9uX2l0ZW0gPSB0aGlzLnN0YXRpb25fbGlzdFtwb3NfaW5kZXhdO1xuICAgICAgICBpZighc3RhdGlvbl9pdGVtKXJldHVybjtcblxuICAgICAgICBpZighc3RhdGlvbl9pdGVtLnNwaW5lKXtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5zcGluZSA9IG5ldyBCYXNlUm9sZSgpO1xuICAgICAgICAgICAgLy8gc3RhdGlvbl9pdGVtLnNwaW5lOnNldENhc2NhZGUodHJ1ZSlcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5zcGluZS5zZXRQYXJlbnQoc3RhdGlvbl9pdGVtLm1vZGVfbm9kZSk7XG4gICAgICAgICAgICBzdGF0aW9uX2l0ZW0uc3BpbmUubm9kZS5zZXRQb3NpdGlvbigwLDQ1KTtcbiAgICAgICAgICAgIHN0YXRpb25faXRlbS5zcGluZS5ub2RlLnNldEFuY2hvclBvaW50KGNjLnYyKDAuNSwwLjUpKTtcbiAgICAgICAgICAgIC8vIHN0YXRpb25faXRlbS5zcGluZTpzZXRPcGFjaXR5KDApXG4gICAgICAgICAgICAvLyB2YXIgYWN0aW9uID0gY2MuZmFkZUluKDAuMik7XG4gICAgICAgICAgICAvLyBzdGF0aW9uX2l0ZW0uc3BpbmUucnVuQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKHN0YXRpb25faXRlbS5zcGluZSl7XG4gICAgICAgICAgICBzdGF0aW9uX2l0ZW0uc3BpbmUuc2V0RGF0YShCYXNlUm9sZS50eXBlLnJvbGUsIGxvb2tfaWQsIFBsYXllckFjdGlvbi5zaG93LCB0cnVlLDAuNix7c2NhbGU6MC43Mn0pLy/ljp/nlJ8wLjjlgI1cbiAgICAgICAgICAgIC8vIHN0YXRpb25faXRlbS5zcGluZTpzZXRDYXNjYWRlKHRydWUpXG4gICAgICAgICAgICAvLyB2YXIgYWN0aW9uID0gY2MuZmFkZU91dCgwLjIpO1xuICAgICAgICAgICAgLy8gc3RhdGlvbl9pdGVtLnNwaW5lLm5vZGUucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGFjdGlvbiwgY2MuQ2FsbEZ1bmMoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAvLyBzdGF0aW9uX2l0ZW0uc3BpbmUubm9kZS5zdG9wQWxsQWN0aW9ucygpOyAgICBcbiAgICAgICAgICAgIC8vIH0pKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0VGlwc0luZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMudGlwc19saXN0KXJldHVybjtcbiAgICAgICAgLy8g6buY6K6k5YaZ5q27IOWvueW6lFxuICAgICAgICB2YXIgaWRfbGlzdCA9IFsxLDIsNF07XG4gICAgICAgIGZvcih2YXIgaSBpbiBpZF9saXN0KXtcbiAgICAgICAgICAgIHZhciB2YXJfZGF0YSA9IENvbmZpZy5wcmltdXNfZGF0YS5kYXRhX3VwZ3JhZGVbaWRfbGlzdFtpXV07XG4gICAgICAgICAgICBpZih0aGlzLnRpcHNfbGlzdFtwYXJzZUludChpKSsxXSAmJiB2YXJfZGF0YSl7XG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVzOuernuaKgOWcuuaOkuihjDxjb2xvcj0jMTRmZjMyPuWJjSVz5ZCNPC9jb2xvcj5cIiksIHZhcl9kYXRhLm5hbWUsIHZhcl9kYXRhLmFyZW5hX3JhbmspO1xuICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMiwgbmV3IGNjLkNvbG9yKDB4ZmYsMHhmZiwweGZmLCAweGZmKSwgY2MudjIoMCwgMCksIGNjLnYyKDAsMCksMzAsNTAwKTtcbiAgICAgICAgICAgICAgICBsYWJlbC5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XG4gICAgICAgICAgICAgICAgbGFiZWwuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgICAgIHRoaXMudGlwc19saXN0W3BhcnNlSW50KGkpKzFdLmFkZENoaWxkKGxhYmVsLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLnN0YXRpb25fbGlzdCl7XG4gICAgICAgICAgICBpZih0aGlzLnN0YXRpb25fbGlzdFtpXSl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0aW9uX2xpc3RbaV0uc3BpbmUpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRpb25fbGlzdFtpXS5zcGluZS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRpb25fbGlzdFtpXS5zcGluZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGlvbl9saXN0W2ldID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5zdGF0aW9uX2xpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmN0cmwub3BlblByaW11c01haW5XaW5kb3coZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==