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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/hero_vo.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, '65e401GrPNMSJBVRQ85LY0j', 'hero_vo');
// Scripts/mod/hero/hero_vo.js
 
"use strict";
 
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
 
var PartnerConst = require("partner_const");
 
var HeroConst = require("hero_const");
 
var HeroConst = require("hero_const");
 
var GoodsVo = require("goods_vo");
 
var HeroVo = cc.Class({
  "extends": gcore.BaseEvent,
  ctor: function ctor() {
    this.partner_id = 0; //  此英雄的唯一标识id
 
    this.id = 0; //  已废弃用上面的, 如果有 那么一定是和 partner_id相等.
 
    this.bid = 0; //  此配置表对应英雄id
 
    this.camp_type = 1; // 阵营 配置表有
 
    this.rare_type = 0; // 伙伴类型 1:N 2:R 3:SR 4:SSR
 
    this.name = "";
    this.type = 0; // 职业; [3]=TI18N("法攻"),[4]=TI18N("物攻"),[5]=TI18N("肉盾"),[6]=TI18N("辅助")
 
    this.face_id = 0; // 头像id;
 
    this.lev = 0;
    this.exp = 0; //  经验;
 
    this.break_lev = 0; // 突破等级
 
    this.max_exp = 0; // 经验上限
 
    this.star_step = 0; // 星星阶段
 
    this.star = 0; // 星数
 
    this.quality = 0; // 品质
 
    this.looks = {};
    this.body_res = "";
    this.res_id = "";
    this.power = 0; // 战力
 
    this.rid = 0;
    this.srv_id = "";
    this.recruit_type = 1; //  卡库 
 
    this.chips_id = 0; //  碎片id
 
    this.chips_num = 0; //  初始碎片数
 
    this.clothes_id = 0; // 时装id
 
    this.other_form = 0;
    this.fetter = {}; //  绑定的星命,多个      
 
    this.fetter_power = 0; // 星命加成战力 
 
    this.fetter_atk = 0; // 星命攻击加成
 
    this.fetter_hp = 0; // 星命生命加成
 
    this.fetter_speed = 0; // 星命速度加成
 
    this.fetter_def = 0; // 星命防御加成
    // 属性部分
 
    this.atk = 0; //  攻击;
 
    this.def_p = 0; //  物防;
 
    this.def_s = 0; //  法防;
 
    this.hp = 0; //  气血;
 
    this.speed = 0; //  速度;
 
    this.def = 0; //  防御
 
    this.hit_rate = 0; //  命中
 
    this.dodge_rate = 0; //  闪避
 
    this.crit_rate = 0; //  暴击率;
 
    this.crit_ratio = 0; //  暴击伤害;
 
    this.hit_magic = 0; //  效果命中;
 
    this.dodge_magic = 0; //  效果抵抗;
    // 对应的属性列表
 
    this.group_attr = {}; // 成长值
 
    this.skills = {}; // "技能列表{[1] = {skill_bid = xx}}
 
    this.break_skills = {}; // 突破技能列表
 
    this.eqm_list = {}; // 伙伴装备列表
 
    this.artifact_list = {}; // 神器列表
 
    this.awaken_count = 0; //  觉醒次数,如果是0 就是没有觉醒
 
    this.awaken_skills = {};
    this.form_param = 100; // 布阵的参数
 
    this.is_in_form = 0; // 是否在阵上,是的话为阵上位置 其值的 :逻辑是 PartnerConst.Fun_Form.xxx * 10 + pos
 
    this.dic_in_form = {}; // 在那个布阵信息 如: this.dic_in_form[PartnerConst.Fun_Form.Drama] = pos
 
    this.sort_order = 0; // 排序用
 
    this.show_order = 0;
    this.order = 0; //  this.dispather_order = 0
 
    this.is_lock = 0; // 是否锁定..只要 this.dic_locks 列表中有一个被锁定.此值都是锁定的
    // 判定是否锁定..尽量用 HeroVo:isLock()方法
 
    this.dic_locks = {}; // 锁定信息 this.dic_locks[锁定类型] = 0 
 
    this.red_point = {}; // 红点列表 HeroConst.Red_Point_Type    
    // 天赋技能列表  self.talent_skill_list[位置] = skill_id
 
    this.talent_skill_list = null;
  },
  setAttr: function setAttr(key, val) {
    this[key] = val;
  },
  updateHeroVo: function updateHeroVo(hero_info) {
    if (!hero_info) return;
 
    for (var info_k in hero_info) {
      this.setAttr(info_k, hero_info[info_k]);
      if (info_k == "show_order") this.sort_order = hero_info[info_k];
      if (info_k == "eqms") this.updateEqmList(hero_info[info_k]);
      if (info_k == "artifacts") this.updateArtifactList(hero_info[info_k]);
      if (info_k == "is_lock") this.updateLock(hero_info[info_k]);
      if (info_k == "dower_skill") this.updateSkill(hero_info[info_k]);
    }
 
    this.fire(this.UPDATE_PARTNER_ATTR, this); // 发出更新事件
  },
  updateSkill: function updateSkill(list) {
    this.talent_skill_list = {};
 
    for (var i = 0; i < list.length; ++i) {
      var v = list[i];
      this.talent_skill_list[v.pos] = v.skill_id;
    }
  },
  updateEqmList: function updateEqmList(equips) {
    if (!equips) return;
 
    for (var equip_i in equips) {
      var new_info = equips[equip_i];
      var goods_vo = this.eqm_list[new_info.type];
      if (!goods_vo) this.eqm_list[new_info.type] = goods_vo = new GoodsVo();
      goods_vo.setBaseId(new_info.base_id);
      goods_vo.initAttrData(new_info);
      goods_vo.setEnchantScore(0);
    } // 刪除处理
 
 
    for (var goods_i in this.eqm_list) {
      if (this.eqm_list[goods_i]) {
        var cur_info = this.eqm_list[goods_i];
        var is_delete = true;
 
        for (var new_i in equips) {
          if (equips[new_i].base_id === cur_info.base_id) {
            is_delete = false;
          }
        }
 
        if (is_delete) {
          this.eqm_list[goods_i] = null;
        }
      }
    }
  },
  updateArtifactList: function updateArtifactList(data) {
    var list = data || {};
    var dic_pos = {};
 
    for (var i in list) {
      dic_pos[list[i].artifact_pos] = list[i];
    } //写死只有两个神器 (神器位置类型: 1, 2 )
 
 
    for (var i = 1; i <= 2; i++) {
      var artifact_data = dic_pos[i];
      var goods_vo = this.artifact_list[i];
 
      if (artifact_data && goods_vo) {
        if (goods_vo["initAttrData"]) {
          goods_vo.initAttrData(artifact_data);
        }
      } else if (artifact_data && goods_vo == null) {
        goods_vo = new GoodsVo();
        goods_vo.setBaseId(artifact_data.base_id);
 
        if (goods_vo["initAttrData"]) {
          goods_vo.initAttrData(artifact_data);
        }
 
        this.artifact_list[i] = goods_vo;
      } else if (artifact_data == null && goods_vo) {
        this.artifact_list[i] = null;
        goods_vo = null;
      }
    }
  },
  updateLock: function updateLock(datas) {
    this.is_lock = 0;
 
    for (var data_i in datas) {
      var data = datas[data_i];
      this.dic_locks[data.lock_type] = data.is_lock;
 
      if (this.is_lock == 0) {
        this.is_lock = data.is_lock;
      }
    }
  },
  isLock: function isLock() {
    for (var lock_i in this.dic_locks) {
      if (this.dic_locks[lock_i] > 0) return true;
    }
 
    return false;
  },
  // 更新阵法
  updateFormPos: function updateFormPos(pos, fun_form_type) {
    fun_form_type = fun_form_type || PartnerConst.Fun_Form.Drama;
    pos = pos || 0;
    this.is_in_form = 0;
 
    if (pos == 0) {
      delete this.dic_in_form[fun_form_type]; // this.dic_in_form[fun_form_type] = null;
    } else {
      this.dic_in_form[fun_form_type] = pos;
    } // for(let _type in this.dic_in_form){
    //     let _pos = this.dic_in_form[_type]
    //     let cur_pos = _type * 10 + _pos
    //     if (this.is_in_form == 0){
    //         this.is_in_form = cur_pos
    //     }else{
    //         if (this.is_in_form > cur_pos){
    //             this.is_in_form = cur_pos
    //         }
    //     }
    // }
    // for _type, _pos in pairs(this.dic_in_form) do
    //     local cur_pos = _type * 10 + _pos
    //     if self.is_in_form == 0 then
    //         self.is_in_form = cur_pos
    //     else
    //         if self.is_in_form > cur_pos then
    //             self.is_in_form = cur_pos
 
 
    for (var pos_i in this.dic_in_form) {
      var cur_pos = pos_i * 10 + this.dic_in_form[pos_i];
 
      if (this.is_in_form == 0 || this.is_in_form > cur_pos) {
        this.is_in_form = cur_pos;
      }
    }
 
    this.updateHeroVo("is_in_form", this.is_in_form);
  },
  // --检查英雄锁定tips
  // -- is_all 是否全部判定
  // -- lock_type_list 需要检查的锁定类型 参考HeroConst.LockType
  checkHeroLockTips: function checkHeroLockTips(is_all, lock_type_list) {
    if (is_all) {
      var _lock_type_list;
 
      lock_type_list = (_lock_type_list = {}, _defineProperty(_lock_type_list, 1, HeroConst.LockType.eFormLock), _defineProperty(_lock_type_list, 2, HeroConst.LockType.eHeroLock), _defineProperty(_lock_type_list, 3, HeroConst.LockType.eHeroChangeLock), _lock_type_list);
    } else {
      lock_type_list = lock_type_list || {};
    }
 
    for (var i in lock_type_list) {
      var lock_type = lock_type_list[i];
 
      if (lock_type == HeroConst.LockType.eFormLock) {
        if (this.is_in_form > 0) {
          var fun_form_type = Math.floor(this.is_in_form / this.form_param);
 
          if (fun_form_type == PartnerConst.Fun_Form.Drama) {
            message("该英雄已上阵,请前往英雄-布阵界面下阵");
          } else if (fun_form_type == PartnerConst.Fun_Form.Arena) {
            message("该英雄在竞技场防守阵容中已上阵");
          } else if (fun_form_type == PartnerConst.Fun_Form.EliteMatch || fun_form_type == PartnerConst.Fun_Form.EliteKingMatch) {
            message("该英雄在精英赛阵容中已上阵");
          }
 
          return true;
        }
      } else {
        if (this.dic_locks[lock_type] && this.dic_locks[lock_type] > 0) {
          if (lock_type == HeroConst.LockType.eHeroLock) {
            message("该英雄已锁定,请前往英雄界面解锁");
          } else if (lock_type == HeroConst.LockType.eHeroChangeLock) {
            message("该英雄转换中,请前往先知圣殿解除");
          }
 
          return true;
        }
      }
    }
  },
  isFormDrama: function isFormDrama() {
    if (this.is_in_form > 0) {
      var fun_form_type = Math.floor(this.is_in_form / this.form_param);
      if (fun_form_type == PartnerConst.Fun_Form.Drama) return true;
    }
 
    return false;
  },
  ishaveTalentData: function ishaveTalentData() {
    if (!this.talent_skill_list) return false;
    return true;
  },
  updateRedPoint: function updateRedPoint(index, bool) {
    if (bool != null) {
      if (this.red_point[index] != bool) {
        this.red_point[index] = bool;
        this.fire(HeroVo.UPDATE_Partner_ATTR, this);
      }
    }
  }
});
HeroVo.prototype.UPDATE_PARTNER_ATTR = "UPDATE_PARTNER_ATTR";
module.exports = HeroVo;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxoZXJvX3ZvLmpzIl0sIm5hbWVzIjpbIlBhcnRuZXJDb25zdCIsInJlcXVpcmUiLCJIZXJvQ29uc3QiLCJHb29kc1ZvIiwiSGVyb1ZvIiwiY2MiLCJDbGFzcyIsImdjb3JlIiwiQmFzZUV2ZW50IiwiY3RvciIsInBhcnRuZXJfaWQiLCJpZCIsImJpZCIsImNhbXBfdHlwZSIsInJhcmVfdHlwZSIsIm5hbWUiLCJ0eXBlIiwiZmFjZV9pZCIsImxldiIsImV4cCIsImJyZWFrX2xldiIsIm1heF9leHAiLCJzdGFyX3N0ZXAiLCJzdGFyIiwicXVhbGl0eSIsImxvb2tzIiwiYm9keV9yZXMiLCJyZXNfaWQiLCJwb3dlciIsInJpZCIsInNydl9pZCIsInJlY3J1aXRfdHlwZSIsImNoaXBzX2lkIiwiY2hpcHNfbnVtIiwiY2xvdGhlc19pZCIsIm90aGVyX2Zvcm0iLCJmZXR0ZXIiLCJmZXR0ZXJfcG93ZXIiLCJmZXR0ZXJfYXRrIiwiZmV0dGVyX2hwIiwiZmV0dGVyX3NwZWVkIiwiZmV0dGVyX2RlZiIsImF0ayIsImRlZl9wIiwiZGVmX3MiLCJocCIsInNwZWVkIiwiZGVmIiwiaGl0X3JhdGUiLCJkb2RnZV9yYXRlIiwiY3JpdF9yYXRlIiwiY3JpdF9yYXRpbyIsImhpdF9tYWdpYyIsImRvZGdlX21hZ2ljIiwiZ3JvdXBfYXR0ciIsInNraWxscyIsImJyZWFrX3NraWxscyIsImVxbV9saXN0IiwiYXJ0aWZhY3RfbGlzdCIsImF3YWtlbl9jb3VudCIsImF3YWtlbl9za2lsbHMiLCJmb3JtX3BhcmFtIiwiaXNfaW5fZm9ybSIsImRpY19pbl9mb3JtIiwic29ydF9vcmRlciIsInNob3dfb3JkZXIiLCJvcmRlciIsImlzX2xvY2siLCJkaWNfbG9ja3MiLCJyZWRfcG9pbnQiLCJ0YWxlbnRfc2tpbGxfbGlzdCIsInNldEF0dHIiLCJrZXkiLCJ2YWwiLCJ1cGRhdGVIZXJvVm8iLCJoZXJvX2luZm8iLCJpbmZvX2siLCJ1cGRhdGVFcW1MaXN0IiwidXBkYXRlQXJ0aWZhY3RMaXN0IiwidXBkYXRlTG9jayIsInVwZGF0ZVNraWxsIiwiZmlyZSIsIlVQREFURV9QQVJUTkVSX0FUVFIiLCJsaXN0IiwiaSIsImxlbmd0aCIsInYiLCJwb3MiLCJza2lsbF9pZCIsImVxdWlwcyIsImVxdWlwX2kiLCJuZXdfaW5mbyIsImdvb2RzX3ZvIiwic2V0QmFzZUlkIiwiYmFzZV9pZCIsImluaXRBdHRyRGF0YSIsInNldEVuY2hhbnRTY29yZSIsImdvb2RzX2kiLCJjdXJfaW5mbyIsImlzX2RlbGV0ZSIsIm5ld19pIiwiZGF0YSIsImRpY19wb3MiLCJhcnRpZmFjdF9wb3MiLCJhcnRpZmFjdF9kYXRhIiwiZGF0YXMiLCJkYXRhX2kiLCJsb2NrX3R5cGUiLCJpc0xvY2siLCJsb2NrX2kiLCJ1cGRhdGVGb3JtUG9zIiwiZnVuX2Zvcm1fdHlwZSIsIkZ1bl9Gb3JtIiwiRHJhbWEiLCJwb3NfaSIsImN1cl9wb3MiLCJjaGVja0hlcm9Mb2NrVGlwcyIsImlzX2FsbCIsImxvY2tfdHlwZV9saXN0IiwiTG9ja1R5cGUiLCJlRm9ybUxvY2siLCJlSGVyb0xvY2siLCJlSGVyb0NoYW5nZUxvY2siLCJNYXRoIiwiZmxvb3IiLCJtZXNzYWdlIiwiQXJlbmEiLCJFbGl0ZU1hdGNoIiwiRWxpdGVLaW5nTWF0Y2giLCJpc0Zvcm1EcmFtYSIsImlzaGF2ZVRhbGVudERhdGEiLCJ1cGRhdGVSZWRQb2ludCIsImluZGV4IiwiYm9vbCIsIlVQREFURV9QYXJ0bmVyX0FUVFIiLCJwcm90b3R5cGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsWUFBWSxHQUFHQyxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFDQSxJQUFJQyxTQUFTLEdBQUdELE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlDLFNBQVMsR0FBTUQsT0FBTyxDQUFDLFlBQUQsQ0FBMUI7O0FBQ0EsSUFBSUUsT0FBTyxHQUFRRixPQUFP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QWtCLENBQXRCLEVBQXlCO0FBQ3JCLFVBQUlpRCxhQUFhLEdBQUlZLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUs5RCxVQUFMLEdBQWtCLEtBQUtELFVBQWxDLENBQXJCO0FBQ0EsVUFBSWtELGFBQWEsSUFBSS9HLFlBQVksQ0FBQ2dILFFBQWIsQ0FBc0JDLEtBQTNDLEVBQ0ksT0FBTyxJQUFQO0FBQ1A7O0FBQ0QsV0FBTyxLQUFQO0FBQ0gsR0EzUm9CO0FBNlJyQmlCLEVBQUFBLGdCQUFnQixFQUFFLDRCQUFXO0FBQzVCLFFBQUksQ0FBQyxLQUFLNUQsaUJBQVYsRUFDQyxPQUFPLEtBQVA7QUFDRCxXQUFPLElBQVA7QUFDQSxHQWpTb0I7QUFtU3JCNkQsRUFBQUEsY0FBYyxFQUFDLHdCQUFTQyxLQUFULEVBQWVDLElBQWYsRUFBb0I7QUFDbEMsUUFBR0EsSUFBSSxJQUFJLElBQVgsRUFBZ0I7QUFDZixVQUFHLEtBQUtoRSxTQUFMLENBQWUrRCxLQUFmLEtBQXlCQyxJQUE1QixFQUFpQztBQUNoQyxhQUFLaEUsU0FBTCxDQUFlK0QsS0FBZixJQUF3QkMsSUFBeEI7QUFDQSxhQUFLcEQsSUFBTCxDQUFVN0UsTUFBTSxDQUFDa0ksbUJBQWpCLEVBQXFDLElBQXJDO0FBQ0E7QUFDRDtBQUNEO0FBMVNvQixDQUFULENBQWI7QUE2U0FsSSxNQUFNLENBQUNtSSxTQUFQLENBQWlCckQsbUJBQWpCLEdBQXVDLHFCQUF2QztBQUVBc0QsTUFBTSxDQUFDQyxPQUFQLEdBQWlCckksTUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbInZhciBQYXJ0bmVyQ29uc3QgPSByZXF1aXJlKFwicGFydG5lcl9jb25zdFwiKTtcclxudmFyIEhlcm9Db25zdCA9IHJlcXVpcmUoXCJoZXJvX2NvbnN0XCIpXHJcbnZhciBIZXJvQ29uc3QgICAgPSByZXF1aXJlKFwiaGVyb19jb25zdFwiKTtcclxudmFyIEdvb2RzVm8gICAgICA9IHJlcXVpcmUoXCJnb29kc192b1wiKTtcclxuXHJcbnZhciBIZXJvVm8gPSBjYy5DbGFzcyh7XHJcblx0ZXh0ZW5kczogZ2NvcmUuQmFzZUV2ZW50LFxyXG5cclxuXHRjdG9yOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMucGFydG5lcl9pZCAgICAgICAgICA9IDA7ICAgICAvLyAg5q2k6Iux6ZuE55qE5ZSv5LiA5qCH6K+GaWRcclxuXHRcdHRoaXMuaWQgICAgICAgICAgICAgICAgICA9IDA7ICAgICAvLyAg5bey5bqf5byD55So5LiK6Z2i55qELCDlpoLmnpzmnIkg6YKj5LmI5LiA5a6a5piv5ZKMIHBhcnRuZXJfaWTnm7jnrYkuXHJcblx0XHR0aGlzLmJpZCAgICAgICAgICAgICAgICAgPSAwOyAgICAgLy8gIOatpOmFjee9ruihqOWvueW6lOiLsembhGlkXHJcblx0XHRcclxuXHRcdHRoaXMuY2FtcF90eXBlICAgICAgICAgICA9IDE7ICAgICAvLyDpmLXokKUg6YWN572u6KGo5pyJXHJcblx0XHRcclxuXHRcdHRoaXMucmFyZV90eXBlICAgICAgICAgICA9IDA7ICAgICAvLyDkvJnkvLTnsbvlnosgMe+8mk4gMu+8mlIgM++8mlNSIDTvvJpTU1JcclxuXHRcdHRoaXMubmFtZSAgICAgICAgICAgICAgICA9IFwiXCI7XHJcblx0XHR0aGlzLnR5cGUgICAgICAgICAgICAgICAgPSAwOyAgICAgLy8g6IGM5Lia77ybIFszXT1USTE4TihcIuazleaUu1wiKSxbNF09VEkxOE4oXCLnianmlLtcIiksWzVdPVRJMThOKFwi6IKJ55u+XCIpLFs2XT1USTE4TihcIui+heWKqVwiKVxyXG5cdFx0dGhpcy5mYWNlX2lkICAgICAgICAgICAgID0gMDsgICAgIC8vIOWktOWDj2lkO1xyXG5cdFx0dGhpcy5sZXYgICAgICAgICAgICAgICAgID0gMDtcclxuXHRcdHRoaXMuZXhwICAgICAgICAgICAgICAgICA9IDA7ICAgICAvLyAg57uP6aqMO1xyXG5cdFx0dGhpcy5icmVha19sZXYgICAgICAgICAgID0gMDsgICAgIC8vIOeqgeegtOetiee6p1xyXG5cdFx0dGhpcy5tYXhfZXhwICAgICAgICAgICAgID0gMDsgICAgIC8vIOe7j+mqjOS4iumZkFxyXG5cdFx0dGhpcy5zdGFyX3N0ZXAgICAgICAgICAgID0gMDsgICAgIC8vIOaYn+aYn+mYtuautVxyXG5cdFx0dGhpcy5zdGFyICAgICAgICAgICAgICAgID0gMDsgICAgIC8vIOaYn+aVsFxyXG5cdFx0dGhpcy5xdWFsaXR5ICAgICAgICAgICAgID0gMDsgICAgIC8vIOWTgei0qFxyXG5cdFx0dGhpcy5sb29rcyAgICAgICAgICAgICAgID0ge307XHJcblx0XHR0aGlzLmJvZHlfcmVzICAgICAgICAgICAgPSBcIlwiO1xyXG5cdFx0dGhpcy5yZXNfaWQgICAgICAgICAgICAgID0gXCJcIjtcclxuXHRcdHRoaXMucG93ZXIgICAgICAgICAgICAgICA9IDA7ICAgICAvLyDmiJjliptcclxuXHRcdHRoaXMucmlkICAgICAgICAgICAgICAgICA9IDA7XHJcblx0XHR0aGlzLnNydl9pZCAgICAgICAgICAgICAgPSBcIlwiO1xyXG5cdFx0dGhpcy5yZWNydWl0X3R5cGUgICAgICAgID0gMTsgICAgIC8vICDljaHlupMgXHJcblx0XHR0aGlzLmNoaXBzX2lkICAgICAgICAgICAgPSAwOyAgICAgLy8gIOeijueJh2lkXHJcblx0XHR0aGlzLmNoaXBzX251bSAgICAgICAgICAgPSAwOyAgICAgLy8gIOWIneWni+eijueJh+aVsFxyXG5cdFx0XHJcblx0XHR0aGlzLmNsb3RoZXNfaWQgICAgICAgICAgPSAwOyAgICAgLy8g5pe26KOFaWRcclxuXHRcdFxyXG5cdFx0dGhpcy5vdGhlcl9mb3JtICAgICAgICAgID0gMDtcclxuXHRcdFxyXG5cdFx0dGhpcy5mZXR0ZXIgICAgICAgICAgICAgID0ge307ICAgIC8vICDnu5HlrprnmoTmmJ/lkb0s5aSa5LiqICAgICAgXHJcblx0XHRcclxuXHRcdHRoaXMuZmV0dGVyX3Bvd2VyICAgICAgICA9IDA7ICAgICAvLyDmmJ/lkb3liqDmiJDmiJjlipsgXHJcblx0XHRcclxuXHRcdHRoaXMuZmV0dGVyX2F0ayAgICAgICAgICA9IDA7ICAgICAvLyDmmJ/lkb3mlLvlh7vliqDmiJBcclxuXHRcdHRoaXMuZmV0dGVyX2hwICAgICAgICAgICA9IDA7ICAgICAvLyDmmJ/lkb3nlJ/lkb3liqDmiJBcclxuXHRcdHRoaXMuZmV0dGVyX3NwZWVkICAgICAgICA9IDA7ICAgICAvLyDmmJ/lkb3pgJ/luqbliqDmiJBcclxuXHRcdHRoaXMuZmV0dGVyX2RlZiAgICAgICAgICA9IDA7ICAgICAvLyDmmJ/lkb3pmLLlvqHliqDmiJBcclxuXHRcdFxyXG5cdFx0Ly8g5bGe5oCn6YOo5YiGXHJcblx0XHR0aGlzLmF0ayAgICAgICAgICAgICAgICAgPSAwOyAgICAgLy8gIOaUu+WHuztcclxuXHRcdHRoaXMuZGVmX3AgICAgICAgICAgICAgICA9IDA7ICAgICAvLyAg54mp6ZiyO1xyXG5cdFx0dGhpcy5kZWZfcyAgICAgICAgICAgICAgID0gMDsgICAgIC8vICDms5XpmLI7XHJcblx0XHR0aGlzLmhwICAgICAgICAgICAgICAgICAgPSAwOyAgICAgLy8gIOawlOihgDtcclxuXHRcdHRoaXMuc3BlZWQgICAgICAgICAgICAgICA9IDA7ICAgICAvLyAg6YCf5bqmO1xyXG5cdFx0dGhpcy5kZWYgICAgICAgICAgICAgICAgID0gMDsgICAgIC8vICDpmLLlvqFcclxuXHRcdFxyXG5cdFx0dGhpcy5oaXRfcmF0ZSAgICAgICAgICAgID0gMDsgICAgIC8vICDlkb3kuK1cclxuXHRcdHRoaXMuZG9kZ2VfcmF0ZSAgICAgICAgICA9IDA7ICAgICAvLyAg6Zeq6YG/XHJcblx0XHR0aGlzLmNyaXRfcmF0ZSAgICAgICAgICAgPSAwOyAgICAgLy8gIOaatOWHu+eOhztcclxuXHRcdHRoaXMuY3JpdF9yYXRpbyAgICAgICAgICA9IDA7ICAgICAvLyAg5pq05Ye75Lyk5a6zO1xyXG5cdFx0dGhpcy5oaXRfbWFnaWMgICAgICAgICAgID0gMDsgICAgIC8vICDmlYjmnpzlkb3kuK07XHJcblx0XHR0aGlzLmRvZGdlX21hZ2ljICAgICAgICAgPSAwOyAgICAgLy8gIOaViOaenOaKteaKlztcclxuXHRcdFxyXG5cdFx0Ly8g5a+55bqU55qE5bGe5oCn5YiX6KGoXHJcblx0XHR0aGlzLmdyb3VwX2F0dHIgICAgICAgICAgPSB7fTsgICAgLy8g5oiQ6ZW/5YC8XHJcblx0XHRcclxuXHRcdHRoaXMuc2tpbGxzICAgICAgICAgICAgICA9IHt9OyAgICAvLyBcIuaKgOiDveWIl+ihqHtbMV0gPSB7c2tpbGxfYmlkID0geHh9fVxyXG5cdFx0dGhpcy5icmVha19za2lsbHMgICAgICAgID0ge307ICAgIC8vIOeqgeegtOaKgOiDveWIl+ihqFxyXG5cdFx0dGhpcy5lcW1fbGlzdCAgICAgICAgICAgID0ge307ICAgIC8vIOS8meS8tOijheWkh+WIl+ihqFxyXG5cdFx0dGhpcy5hcnRpZmFjdF9saXN0ICAgICAgID0ge307ICAgIC8vIOelnuWZqOWIl+ihqFxyXG5cdFx0XHJcblx0XHR0aGlzLmF3YWtlbl9jb3VudCAgICAgICAgPSAwOyAgICAgLy8gIOiniemGkuasoeaVsCzlpoLmnpzmmK8wIOWwseaYr+ayoeacieiniemGklxyXG5cdFx0dGhpcy5hd2FrZW5fc2tpbGxzICAgICAgID0ge307XHJcblx0XHRcclxuXHRcdHRoaXMuZm9ybV9wYXJhbSAgICAgXHQgPSAxMDAgICAgLy8g5biD6Zi155qE5Y+C5pWwXHJcblx0XHR0aGlzLmlzX2luX2Zvcm0gICAgICAgICAgPSAwOyAgICAgLy8g5piv5ZCm5Zyo6Zi15LiK77yM5piv55qE6K+d5Li66Zi15LiK5L2N572uIOWFtuWAvOeahCA66YC76L6R5pivIFBhcnRuZXJDb25zdC5GdW5fRm9ybS54eHggKiAxMCArIHBvc1xyXG5cdFx0dGhpcy5kaWNfaW5fZm9ybSAgICAgICAgID0ge307ICAgIC8vIOWcqOmCo+S4quW4g+mYteS/oeaBryDlpoI6IHRoaXMuZGljX2luX2Zvcm1bUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkRyYW1hXSA9IHBvc1xyXG5cdFx0XHJcblx0XHR0aGlzLnNvcnRfb3JkZXIgICAgICAgICAgPSAwOyAgICAgLy8g5o6S5bqP55SoXHJcblx0XHR0aGlzLnNob3dfb3JkZXIgICAgICAgICAgPSAwO1xyXG5cdFx0dGhpcy5vcmRlciAgICAgICAgICAgICAgID0gMDtcclxuXHRcdC8vICB0aGlzLmRpc3BhdGhlcl9vcmRlciA9IDBcclxuXHRcdFxyXG5cdFx0dGhpcy5pc19sb2NrICAgICAgICAgICAgID0gMDsgICAgIC8vIOaYr+WQpumUgeWumi4u5Y+q6KaBIHRoaXMuZGljX2xvY2tzIOWIl+ihqOS4reacieS4gOS4quiiq+mUgeWumi7mraTlgLzpg73mmK/plIHlrprnmoRcclxuXHRcdC8vIOWIpOWumuaYr+WQpumUgeWumi4u5bC96YeP55SoIEhlcm9Wbzppc0xvY2soKeaWueazlVxyXG5cdFx0dGhpcy5kaWNfbG9ja3MgICAgICAgICAgID0ge307ICAgIC8vIOmUgeWumuS/oeaBryB0aGlzLmRpY19sb2Nrc1vplIHlrprnsbvlnotdID0gMCBcclxuXHRcdHRoaXMucmVkX3BvaW50ICAgICAgICAgICA9IHt9OyAgICAvLyDnuqLngrnliJfooaggSGVyb0NvbnN0LlJlZF9Qb2ludF9UeXBlXHRcclxuXHRcdFxyXG5cdFx0Ly8g5aSp6LWL5oqA6IO95YiX6KGoICBzZWxmLnRhbGVudF9za2lsbF9saXN0W+S9jee9rl0gPSBza2lsbF9pZFxyXG4gICAgXHR0aGlzLnRhbGVudF9za2lsbF9saXN0ID0gbnVsbDtcclxuXHR9LFxyXG5cclxuXHRzZXRBdHRyOiBmdW5jdGlvbihrZXksIHZhbCkge1xyXG5cdFx0dGhpc1trZXldID0gdmFsO1xyXG5cdH0sXHJcblxyXG5cdHVwZGF0ZUhlcm9WbzogZnVuY3Rpb24oaGVyb19pbmZvKSB7XHJcblx0XHRpZiAoIWhlcm9faW5mbykgcmV0dXJuO1xyXG5cclxuXHRcdGZvciAodmFyIGluZm9fayBpbiBoZXJvX2luZm8pIHtcclxuXHRcdFx0dGhpcy5zZXRBdHRyKGluZm9faywgaGVyb19pbmZvW2luZm9fa10pO1xyXG5cclxuXHRcdFx0aWYgKGluZm9fayA9PSBcInNob3dfb3JkZXJcIilcclxuXHRcdFx0XHR0aGlzLnNvcnRfb3JkZXIgPSBoZXJvX2luZm9baW5mb19rXTtcclxuXHRcdFx0aWYgKGluZm9fayA9PSBcImVxbXNcIilcclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUVxbUxpc3QoaGVyb19pbmZvW2luZm9fa10pO1xyXG5cdFx0XHRpZiAoaW5mb19rID09IFwiYXJ0aWZhY3RzXCIpXHJcblx0XHRcdFx0dGhpcy51cGRhdGVBcnRpZmFjdExpc3QoaGVyb19pbmZvW2luZm9fa10pO1xyXG5cdFx0XHRpZiAoaW5mb19rID09IFwiaXNfbG9ja1wiKVxyXG5cdFx0XHRcdHRoaXMudXBkYXRlTG9jayhoZXJvX2luZm9baW5mb19rXSk7XHJcblx0XHRcdGlmIChpbmZvX2sgPT0gXCJkb3dlcl9za2lsbFwiKVxyXG5cdFx0XHRcdHRoaXMudXBkYXRlU2tpbGwoaGVyb19pbmZvW2luZm9fa10pXHJcblx0XHR9XHJcblx0XHR0aGlzLmZpcmUodGhpcy5VUERBVEVfUEFSVE5FUl9BVFRSLCB0aGlzKTtcclxuXHRcdC8vIOWPkeWHuuabtOaWsOS6i+S7tlxyXG5cdH0sXHJcblx0dXBkYXRlU2tpbGwobGlzdCl7XHJcblx0XHR0aGlzLnRhbGVudF9za2lsbF9saXN0ID0ge31cclxuXHRcdGZvcihsZXQgaT0wO2k8bGlzdC5sZW5ndGg7KytpKXtcclxuXHRcdFx0bGV0IHYgPSBsaXN0W2ldXHJcblx0XHRcdHRoaXMudGFsZW50X3NraWxsX2xpc3Rbdi5wb3NdID0gdi5za2lsbF9pZFxyXG5cdFx0fVxyXG5cdH0sXHJcblx0dXBkYXRlRXFtTGlzdDogZnVuY3Rpb24oZXF1aXBzKSB7XHJcblx0XHRpZiAoIWVxdWlwcykgcmV0dXJuO1xyXG5cdFx0Zm9yICh2YXIgZXF1aXBfaSBpbiBlcXVpcHMpIHtcclxuXHRcdFx0dmFyIG5ld19pbmZvID0gZXF1aXBzW2VxdWlwX2ldO1xyXG5cdFx0XHR2YXIgZ29vZHNfdm8gPSB0aGlzLmVxbV9saXN0W25ld19pbmZvLnR5cGVdO1xyXG5cdFx0XHRpZiAoIWdvb2RzX3ZvKVxyXG5cdFx0XHRcdHRoaXMuZXFtX2xpc3RbbmV3X2luZm8udHlwZV0gPSBnb29kc192byA9IG5ldyBHb29kc1ZvKCk7XHJcblx0XHRcdGdvb2RzX3ZvLnNldEJhc2VJZChuZXdfaW5mby5iYXNlX2lkKTtcclxuXHRcdFx0Z29vZHNfdm8uaW5pdEF0dHJEYXRhKG5ld19pbmZvKTtcclxuXHRcdFx0Z29vZHNfdm8uc2V0RW5jaGFudFNjb3JlKDApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOWIqumZpOWkhOeQhlxyXG5cdFx0Zm9yICh2YXIgZ29vZHNfaSBpbiB0aGlzLmVxbV9saXN0KSB7XHJcblx0XHRcdGlmICh0aGlzLmVxbV9saXN0W2dvb2RzX2ldKSB7XHJcblx0XHRcdFx0dmFyIGN1cl9pbmZvID0gdGhpcy5lcW1fbGlzdFtnb29kc19pXTtcclxuXHRcdFx0XHR2YXIgaXNfZGVsZXRlID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IgKHZhciBuZXdfaSBpbiBlcXVpcHMpIHtcclxuXHRcdFx0XHRcdGlmIChlcXVpcHNbbmV3X2ldLmJhc2VfaWQgPT09IGN1cl9pbmZvLmJhc2VfaWQpIHtcclxuXHRcdFx0XHRcdFx0aXNfZGVsZXRlID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChpc19kZWxldGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXFtX2xpc3RbZ29vZHNfaV0gPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG4gXHR9LFxyXG5cclxuXHR1cGRhdGVBcnRpZmFjdExpc3Q6IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdHZhciBsaXN0ID0gZGF0YSB8fCB7fTtcclxuXHRcdHZhciBkaWNfcG9zID0ge307XHJcblx0XHRmb3IodmFyIGkgaW4gbGlzdCl7XHJcblx0XHRcdGRpY19wb3NbbGlzdFtpXS5hcnRpZmFjdF9wb3NdID0gbGlzdFtpXTtcclxuXHRcdH1cclxuXHRcdC8v5YaZ5q275Y+q5pyJ5Lik5Liq56We5ZmoICjnpZ7lmajkvY3nva7nsbvlnos6IDEsIDIgKVxyXG5cdFx0Zm9yKHZhciBpID0gMTtpIDw9IDI7aSsrKXtcclxuXHRcdFx0dmFyIGFydGlmYWN0X2RhdGEgPSBkaWNfcG9zW2ldO1xyXG5cdFx0XHR2YXIgZ29vZHNfdm8gPSB0aGlzLmFydGlmYWN0X2xpc3RbaV07XHJcblx0XHRcdGlmKGFydGlmYWN0X2RhdGEgJiYgZ29vZHNfdm8pe1xyXG5cdFx0XHRcdGlmKCBnb29kc192b1tcImluaXRBdHRyRGF0YVwiXSl7XHJcblx0XHRcdFx0XHRnb29kc192by5pbml0QXR0ckRhdGEoYXJ0aWZhY3RfZGF0YSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ZWxzZSBpZiAoYXJ0aWZhY3RfZGF0YSAmJiBnb29kc192byA9PSBudWxsKXtcclxuXHRcdFx0XHRnb29kc192byA9IG5ldyBHb29kc1ZvKCk7XHJcblx0XHRcdFx0Z29vZHNfdm8uc2V0QmFzZUlkKGFydGlmYWN0X2RhdGEuYmFzZV9pZCk7XHJcblx0XHRcdFx0aWYoZ29vZHNfdm9bXCJpbml0QXR0ckRhdGFcIl0pe1xyXG5cdFx0XHRcdFx0Z29vZHNfdm8uaW5pdEF0dHJEYXRhKGFydGlmYWN0X2RhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmFydGlmYWN0X2xpc3RbaV0gPSBnb29kc192bztcclxuXHRcdFx0fWVsc2UgaWYgKGFydGlmYWN0X2RhdGEgPT0gbnVsbCAmJiBnb29kc192byl7XHJcblx0XHRcdFx0dGhpcy5hcnRpZmFjdF9saXN0W2ldID0gbnVsbDtcclxuXHRcdFx0XHRnb29kc192byA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0dXBkYXRlTG9jazogZnVuY3Rpb24oZGF0YXMpIHtcclxuXHQgICAgdGhpcy5pc19sb2NrID0gMFxyXG5cdCAgICBmb3IgKHZhciBkYXRhX2kgaW4gZGF0YXMpIHtcclxuXHQgICAgXHR2YXIgZGF0YSA9IGRhdGFzW2RhdGFfaV1cclxuXHQgICAgXHR0aGlzLmRpY19sb2Nrc1tkYXRhLmxvY2tfdHlwZV0gPSBkYXRhLmlzX2xvY2s7XHJcblx0ICAgIFx0aWYgKHRoaXMuaXNfbG9jayA9PSAwKSB7XHJcblx0ICAgIFx0XHR0aGlzLmlzX2xvY2sgPSBkYXRhLmlzX2xvY2s7XHJcblx0ICAgIFx0fVxyXG5cdCAgICB9XHJcblx0fSxcclxuXHJcblx0aXNMb2NrOiBmdW5jdGlvbigpIHtcclxuXHRcdGZvciAodmFyIGxvY2tfaSBpbiB0aGlzLmRpY19sb2Nrcykge1xyXG5cdFx0XHRpZiAodGhpcy5kaWNfbG9ja3NbbG9ja19pXSA+IDApXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fSxcclxuXHJcblx0Ly8g5pu05paw6Zi15rOVXHJcblx0dXBkYXRlRm9ybVBvczogZnVuY3Rpb24ocG9zLCBmdW5fZm9ybV90eXBlKSB7XHJcblx0ICAgIGZ1bl9mb3JtX3R5cGUgPSBmdW5fZm9ybV90eXBlIHx8IFBhcnRuZXJDb25zdC5GdW5fRm9ybS5EcmFtYTtcclxuXHQgICAgcG9zID0gcG9zIHx8IDA7XHJcblx0ICAgIHRoaXMuaXNfaW5fZm9ybSA9IDA7XHJcblx0ICAgIGlmIChwb3MgPT0gMCkge1xyXG5cdCAgICBcdGRlbGV0ZSB0aGlzLmRpY19pbl9mb3JtW2Z1bl9mb3JtX3R5cGVdO1xyXG5cdCAgICAgICAgLy8gdGhpcy5kaWNfaW5fZm9ybVtmdW5fZm9ybV90eXBlXSA9IG51bGw7XHJcblx0ICAgIH0gZWxzZSB7XHJcblx0ICAgICAgICB0aGlzLmRpY19pbl9mb3JtW2Z1bl9mb3JtX3R5cGVdID0gcG9zO1xyXG5cdCAgICB9XHJcblx0XHQvLyBmb3IobGV0IF90eXBlIGluIHRoaXMuZGljX2luX2Zvcm0pe1xyXG5cdFx0Ly8gXHRsZXQgX3BvcyA9IHRoaXMuZGljX2luX2Zvcm1bX3R5cGVdXHJcblx0XHQvLyBcdGxldCBjdXJfcG9zID0gX3R5cGUgKiAxMCArIF9wb3NcclxuXHRcdC8vIFx0aWYgKHRoaXMuaXNfaW5fZm9ybSA9PSAwKXtcclxuXHRcdC8vIFx0ICAgIHRoaXMuaXNfaW5fZm9ybSA9IGN1cl9wb3NcclxuXHRcdC8vIFx0fWVsc2V7XHJcblx0XHQvLyBcdCAgICBpZiAodGhpcy5pc19pbl9mb3JtID4gY3VyX3Bvcyl7XHJcblx0XHQvLyBcdFx0XHR0aGlzLmlzX2luX2Zvcm0gPSBjdXJfcG9zXHJcblx0XHQvLyBcdFx0fVxyXG5cdFx0Ly8gXHR9XHJcblx0XHQvLyB9XHJcblx0ICAgIC8vIGZvciBfdHlwZSwgX3BvcyBpbiBwYWlycyh0aGlzLmRpY19pbl9mb3JtKSBkb1xyXG5cdCAgICAvLyAgICAgbG9jYWwgY3VyX3BvcyA9IF90eXBlICogMTAgKyBfcG9zXHJcblx0ICAgIC8vICAgICBpZiBzZWxmLmlzX2luX2Zvcm0gPT0gMCB0aGVuXHJcblx0ICAgIC8vICAgICAgICAgc2VsZi5pc19pbl9mb3JtID0gY3VyX3Bvc1xyXG5cdCAgICAvLyAgICAgZWxzZVxyXG5cdCAgICAvLyAgICAgICAgIGlmIHNlbGYuaXNfaW5fZm9ybSA+IGN1cl9wb3MgdGhlblxyXG5cdCAgICAvLyAgICAgICAgICAgICBzZWxmLmlzX2luX2Zvcm0gPSBjdXJfcG9zXHJcblxyXG5cdCAgICBmb3IgKHZhciBwb3NfaSBpbiB0aGlzLmRpY19pbl9mb3JtKSB7XHJcblx0ICAgIFx0dmFyIGN1cl9wb3MgPSBwb3NfaSAqIDEwICsgdGhpcy5kaWNfaW5fZm9ybVtwb3NfaV07XHJcblx0ICAgIFx0aWYgKHRoaXMuaXNfaW5fZm9ybSA9PSAwIHx8IHRoaXMuaXNfaW5fZm9ybSA+IGN1cl9wb3MpIHtcclxuXHQgICAgXHRcdHRoaXMuaXNfaW5fZm9ybSA9IGN1cl9wb3M7XHJcblx0ICAgIFx0fVxyXG5cdCAgICB9XHJcblxyXG5cdCAgICB0aGlzLnVwZGF0ZUhlcm9WbyhcImlzX2luX2Zvcm1cIiwgdGhpcy5pc19pbl9mb3JtKTtcclxuXHR9LFxyXG5cdC8vIC0t5qOA5p+l6Iux6ZuE6ZSB5a6adGlwc1xyXG5cdC8vIC0tIGlzX2FsbCDmmK/lkKblhajpg6jliKTlrppcclxuXHQvLyAtLSBsb2NrX3R5cGVfbGlzdCDpnIDopoHmo4Dmn6XnmoTplIHlrprnsbvlnosg5Y+C6ICDSGVyb0NvbnN0LkxvY2tUeXBlXHJcblx0Y2hlY2tIZXJvTG9ja1RpcHM6ZnVuY3Rpb24oaXNfYWxsLCBsb2NrX3R5cGVfbGlzdCl7XHJcblx0XHRpZiAoaXNfYWxsKXtcclxuXHRcdFx0bG9ja190eXBlX2xpc3QgPSB7XHJcblx0XHRcdFx0WzFdIDogSGVyb0NvbnN0LkxvY2tUeXBlLmVGb3JtTG9jaywgLy8tLeS8mOWFiOWIpOWumuW3suS4iumYtVxyXG5cdFx0XHRcdFsyXSA6IEhlcm9Db25zdC5Mb2NrVHlwZS5lSGVyb0xvY2ssIFxyXG5cdFx0XHRcdFszXSA6IEhlcm9Db25zdC5Mb2NrVHlwZS5lSGVyb0NoYW5nZUxvY2ssIFxyXG5cdFx0XHR9XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0bG9ja190eXBlX2xpc3QgPSBsb2NrX3R5cGVfbGlzdCB8fCB7fSBcclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGxldCBpIGluIGxvY2tfdHlwZV9saXN0KXtcclxuXHRcdFx0bGV0IGxvY2tfdHlwZSA9IGxvY2tfdHlwZV9saXN0W2ldXHJcblx0XHRcdGlmIChsb2NrX3R5cGUgPT0gSGVyb0NvbnN0LkxvY2tUeXBlLmVGb3JtTG9jayl7XHJcblx0XHRcdFx0aWYgKHRoaXMuaXNfaW5fZm9ybSA+IDAgKXtcclxuXHRcdFx0XHRcdGxldCBmdW5fZm9ybV90eXBlID0gIE1hdGguZmxvb3IodGhpcy5pc19pbl9mb3JtL3RoaXMuZm9ybV9wYXJhbSlcclxuXHRcdFx0XHRcdGlmIChmdW5fZm9ybV90eXBlID09IFBhcnRuZXJDb25zdC5GdW5fRm9ybS5EcmFtYSl7XHJcblx0XHRcdFx0XHRcdG1lc3NhZ2UoXCLor6Xoi7Hpm4Tlt7LkuIrpmLXvvIzor7fliY3lvoDoi7Hpm4Qt5biD6Zi155WM6Z2i5LiL6Zi1XCIpXHJcblx0XHRcdFx0XHR9ZWxzZSBpZiAoZnVuX2Zvcm1fdHlwZSA9PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uQXJlbmEpe1xyXG5cdFx0XHRcdFx0XHRtZXNzYWdlKFwi6K+l6Iux6ZuE5Zyo56ue5oqA5Zy66Ziy5a6I6Zi15a655Lit5bey5LiK6Zi1XCIpXHJcblx0XHRcdFx0XHR9ZWxzZSBpZiAoZnVuX2Zvcm1fdHlwZSA9PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRWxpdGVNYXRjaCB8fCBmdW5fZm9ybV90eXBlID09IFBhcnRuZXJDb25zdC5GdW5fRm9ybS5FbGl0ZUtpbmdNYXRjaCApe1xyXG5cdFx0XHRcdFx0XHRtZXNzYWdlKFwi6K+l6Iux6ZuE5Zyo57K+6Iux6LWb6Zi15a655Lit5bey5LiK6Zi1XCIpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0aWYgKHRoaXMuZGljX2xvY2tzW2xvY2tfdHlwZV0gJiYgdGhpcy5kaWNfbG9ja3NbbG9ja190eXBlXSA+IDAgKXtcclxuXHRcdFx0XHRcdGlmIChsb2NrX3R5cGUgPT0gSGVyb0NvbnN0LkxvY2tUeXBlLmVIZXJvTG9jayl7XHJcblx0XHRcdFx0XHRcdG1lc3NhZ2UoXCLor6Xoi7Hpm4Tlt7LplIHlrprvvIzor7fliY3lvoDoi7Hpm4TnlYzpnaLop6PplIFcIilcclxuXHRcdFx0XHRcdH1lbHNlIGlmIChsb2NrX3R5cGUgPT0gSGVyb0NvbnN0LkxvY2tUeXBlLmVIZXJvQ2hhbmdlTG9jayl7XHJcblx0XHRcdFx0XHRcdG1lc3NhZ2UoXCLor6Xoi7Hpm4TovazmjaLkuK3vvIzor7fliY3lvoDlhYjnn6XlnKPmrr/op6PpmaRcIilcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0aXNGb3JtRHJhbWE6IGZ1bmN0aW9uKCkge1xyXG5cdCAgICBpZiAodGhpcy5pc19pbl9mb3JtID4gMCkge1xyXG5cdCAgICAgICAgdmFyIGZ1bl9mb3JtX3R5cGUgPSAgTWF0aC5mbG9vcih0aGlzLmlzX2luX2Zvcm0gLyB0aGlzLmZvcm1fcGFyYW0pO1xyXG5cdCAgICAgICAgaWYgKGZ1bl9mb3JtX3R5cGUgPT0gUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkRyYW1hKVxyXG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlXHJcblx0ICAgIH1cclxuXHQgICAgcmV0dXJuIGZhbHNlXHJcblx0fSxcclxuXHJcblx0aXNoYXZlVGFsZW50RGF0YTogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoIXRoaXMudGFsZW50X3NraWxsX2xpc3QpXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdHJldHVybiB0cnVlXHJcblx0fSxcclxuXHJcblx0dXBkYXRlUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgsYm9vbCl7XHJcblx0XHRpZihib29sICE9IG51bGwpe1xyXG5cdFx0XHRpZih0aGlzLnJlZF9wb2ludFtpbmRleF0gIT0gYm9vbCl7XHJcblx0XHRcdFx0dGhpcy5yZWRfcG9pbnRbaW5kZXhdID0gYm9vbDtcclxuXHRcdFx0XHR0aGlzLmZpcmUoSGVyb1ZvLlVQREFURV9QYXJ0bmVyX0FUVFIsdGhpcyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG59KVxyXG5cclxuSGVyb1ZvLnByb3RvdHlwZS5VUERBVEVfUEFSVE5FUl9BVFRSID0gXCJVUERBVEVfUEFSVE5FUl9BVFRSXCI7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEhlcm9WbzsiXX0=