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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_break_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, 'fb2dfJZgLJCE5tfZeGx9YKo', 'hero_break_window');
// Scripts/mod/hero/view/hero_break_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-10 10:03:31
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var HeroEvent = require("hero_event");
 
var BackpackController = require("backpack_controller");
 
var SkillItem = require("skill_item");
 
var HeroBreakWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hero", "hero_break_panel");
    this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {},
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.mask_bg_nd = this.seekChild("mask_bg");
    this.attr_panel_nd = this.seekChild("attr_panel");
    this.break_btn_nd = this.seekChild("break_btn");
    this.empty_panel_nd = this.seekChild("empty_panel"); // skill
 
    this.skill_panel_nd = this.seekChild("skill_panel");
    this.skill_name_lb = this.seekChild("skill_name", cc.Label);
    this.skill_con_nd = this.seekChild("skill_con");
    this.skill_item = new SkillItem();
    this.skill_item.setParent(this.skill_con_nd);
    this.skill_item.setScale(0.8);
    this.skill_item.setShowTips(true);
    this.mask_bg_nd.scale = FIT_SCALE;
    this.const_items = {};
 
    for (var item_i = 1; item_i <= 2; item_i++) {
      var const_item = this.const_items[item_i] = {};
      var const_panel = const_item["const_panel"] = this.seekChild("item_cost_panel" + item_i);
      const_item["iten_icon"] = this.seekChild(const_panel, "item_icon", cc.Sprite);
      const_item["iten_num_nd"] = this.seekChild(const_panel, "label");
      const_item["iten_num"] = this.seekChild(const_panel, "label", cc.Label);
    }
 
    this.attr_items = {};
 
    for (var attr_i = 1; attr_i <= 5; attr_i++) {
      var attr_item = this.attr_items[attr_i] = {};
      attr_item["attr_icon"] = this.seekChild(this.attr_panel_nd, "attr_icon" + attr_i, cc.Sprite);
      attr_item["attr_label_key"] = this.seekChild(this.attr_panel_nd, "attr_label_key" + attr_i, cc.Label);
      attr_item["attr_label_left"] = this.seekChild(this.attr_panel_nd, "attr_label_left" + attr_i, cc.Label);
      attr_item["attr_label_right"] = this.seekChild(this.attr_panel_nd, "attr_label_right" + attr_i, cc.Label);
    }
 
    this.break_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickBreakBtn, this);
    this.mask_bg_nd.on(cc.Node.EventType.TOUCH_END, this.onClickMask, this);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    this.addGlobalEvent(HeroEvent.Next_Break_Info_Event, function (data) {
      if (data) this.updateWidgets(data);
    }.bind(this));
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    if (!params) return;
    this.hero_vo = params;
    this.ctrl.sender11016(this.hero_vo.partner_id); // this.updateWidgets();
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    this.ctrl.openHeroBreakPanel(false);
  },
  onClickBreakBtn: function onClickBreakBtn() {
    if (this.hero_vo) {
      if (this.need_items.length > 0) {
        var expend_item_cfg = gdata("item_data", "data_unit1", this.need_items[0], false);
        message(Utils.TI18N("物品[" + expend_item_cfg.name + "]不足"));
        BackpackController.getInstance().openTipsSource(true, this.need_items[0]);
      } else {
        this.ctrl.sender11004(this.hero_vo.id);
        this.ctrl.openHeroBreakPanel(false);
      }
    }
  },
  onClickMask: function onClickMask() {
    this.ctrl.openHeroBreakPanel(false);
  },
  updateWidgets: function updateWidgets(next_data) {
    var cur_break_key = this.hero_vo.type + "_" + this.hero_vo.break_id + "_" + this.hero_vo.break_lev;
    var next_break_key = this.hero_vo.type + "_" + this.hero_vo.break_id + "_" + (this.hero_vo.break_lev + 1);
    var cur_break_cfg = Config.partner_data.data_partner_brach[cur_break_key];
    var next_break_cfg = Config.partner_data.data_partner_brach[next_break_key];
    if (!cur_break_cfg || !next_break_cfg) return; // 属性
 
    for (var attr_i = 1; attr_i <= 5; attr_i++) {
      var attr_item = this.attr_items[attr_i];
 
      if (attr_i == 1) {
        attr_item["attr_label_left"].string = cur_break_cfg.lev_max;
        attr_item["attr_label_right"].string = next_break_cfg.lev_max;
      } else {
        var attr = next_break_cfg.all_attr[attr_i - 2];
 
        if (attr) {
          // icon
          var attr_str = attr[0];
          var attr_res = PathTool.getAttrIconByStr(attr_str);
          var attr_res_path = PathTool.getUIIconPath("common", attr_res);
          this.loadRes(attr_res_path, function (icon_sp, icon_sf) {
            icon_sp.spriteFrame = icon_sf;
          }.bind(this, attr_item["attr_icon"])); // name
 
          var attr_name = Config.attr_data.data_key_to_name[attr_str];
          attr_item["attr_label_key"].string = attr_name; // attr
 
          if (attr_str == "hp_max") attr_str = "hp";
          var left_attr = this.hero_vo[attr_str];
          var right_attr = next_data[attr_str] || 0;
          attr_item["attr_label_left"].string = left_attr;
          attr_item["attr_label_right"].string = right_attr;
        }
      }
    } // 消耗
 
 
    this.need_items = [];
 
    if (cur_break_cfg.expend == 0) {
      this.const_items["1"].const_panel.active = false;
      this.const_items["2"].const_panel.active = false;
    } else {
      for (var item_i = 1; item_i <= 2; item_i++) {
        var const_item = this.const_items[item_i];
        var const_info = cur_break_cfg.expend[item_i - 1];
 
        if (const_info) {
          var item_cfg = Utils.getItemConfig(const_info[0]);
          cc.log(item_cfg);
          var item_icon_path = PathTool.getIconPath("item", item_cfg.icon);
          this.loadRes(item_icon_path, function (item_sp, item_sf) {
            item_sp.spriteFrame = item_sf;
          }.bind(this, const_item["iten_icon"]));
          var have_num = BackpackController.getInstance().getModel().getItemNumByBid(const_info[0]);
          var num_str = cc.js.formatStr("%s/%s", Utils.getMoneyString(have_num), Utils.getMoneyString(const_info[1]));
          const_item["iten_num"].string = num_str;
 
          if (have_num < const_info[1]) {
            var text_color = new cc.Color(0xff, 0x59, 0x43, 0xff);
            const_item["iten_num_nd"].color = text_color;
            this.need_items.push(const_info[0]);
          }
        } else {
          const_item.const_panel.active = false;
        }
      }
    } // 技能
 
 
    if (next_break_cfg.skill_num > cur_break_cfg.skill_num) {
      var star_key = this.hero_vo.bid + "_" + this.hero_vo.star;
      var star_cfg = gdata("partner_data", "data_partner_star", star_key);
 
      if (star_cfg) {
        var skill_id = null;
 
        for (var skill_i in star_cfg.skills) {
          if (star_cfg.skills[skill_i][0] == next_break_cfg.skill_num) skill_id = star_cfg.skills[skill_i][1];
        }
 
        if (skill_id) {
          var skill_cfg = gdata('skill_data', 'data_get_skill', skill_id);
          this.skill_panel_nd.active = true;
          this.skill_name_lb.string = skill_cfg.name;
          this.skill_item.setData(skill_id);
        } else {
          this.showNoneSkillInfo();
        }
      } else {
        this.showNoneSkillInfo();
      }
    } else {
      // 什么都没有
      this.showNoneSkillInfo();
    }
  },
  showNoneSkillInfo: function showNoneSkillInfo() {
    this.skill_panel_nd.active = false;
    this.empty_panel_nd.active = true;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX2JyZWFrX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJIZXJvRXZlbnQiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJTa2lsbEl0ZW0iLCJIZXJvQnJlYWtXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJGdWxsIiwiY3RybCIsImFyZ3VtZW50cyIsImluaXRDb25maWciLCJvcGVuQ2FsbEJhY2siLCJtYXNrX2JnX25kIiwic2Vla0NoaWxkIiwiYXR0cl9wYW5lbF9uZCIsImJyZWFrX2J0bl9uZCIsImVtcHR5X3BhbmVsX25kIiwic2tpbGxfcGFuZWxfbmQiLCJza2lsbF9uYW1lX2xiIiwiTGFiZWwiLCJza2lsbF9jb25fbmQiLCJza2lsbF9pdGVtIiwic2V0UGFyZW50Iiwic2V0U2NhbGUiLCJzZXRTaG93VGlwcyIsInNjYWxlIiwiRklUX1NDQUxFIiwiY29uc3RfaXRlbXMiLCJpdGVtX2kiLCJjb25zdF9pdGVtIiwiY29uc3RfcGFuZWwiLCJTcHJpdGUiLCJhdHRyX2l0ZW1zIiwiYXR0cl9pIiwiYXR0cl9pdGVtIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwib25DbGlja0JyZWFrQnRuIiwib25DbGlja01hc2siLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJOZXh0X0JyZWFrX0luZm9fRXZlbnQiLCJkYXRhIiwidXBkYXRlV2lkZ2V0cyIsImJpbmQiLCJvcGVuUm9vdFduZCIsInBhcmFtcyIsImhlcm9fdm8iLCJzZW5kZXIxMTAxNiIsInBhcnRuZXJfaWQiLCJjbG9zZUNhbGxCYWNrIiwib3Blbkhlcm9CcmVha1BhbmVsIiwibmVlZF9pdGVtcyIsImxlbmd0aCIsImV4cGVuZF9pdGVtX2NmZyIsImdkYXRhIiwibWVzc2FnZSIsIlV0aWxzIiwiVEkxOE4iLCJuYW1lIiwiZ2V0SW5zdGFuY2UiLCJvcGVuVGlwc1NvdXJjZSIsInNlbmRlcjExMDA0IiwiaWQiLCJuZXh0X2RhdGEiLCJjdXJfYnJlYWtfa2V5IiwidHlwZSIsImJyZWFrX2lkIiwiYnJlYWtfbGV2IiwibmV4dF9icmVha19rZXkiLCJjdXJfYnJlYWtfY2ZnIiwiQ29uZmlnIiwicGFydG5lcl9kYXRhIiwiZGF0YV9wYXJ0bmVyX2JyYWNoIiwibmV4dF9icmVha19jZmciLCJzdHJpbmciLCJsZXZfbWF4IiwiYXR0ciIsImFsbF9hdHRyIiwiYXR0cl9zdHIiLCJhdHRyX3JlcyIsImdldEF0dHJJY29uQnlTdHIiLCJhdHRyX3Jlc19wYXRoIiwiZ2V0VUlJY29uUGF0aCIsImxvYWRSZXMiLCJpY29uX3NwIiwiaWNvbl9zZiIsInNwcml0ZUZyYW1lIiwiYXR0cl9uYW1lIiwiYXR0cl9kYXRhIiwiZGF0YV9rZXlfdG9fbmFtZSIsImxlZnRfYXR0ciIsInJpZ2h0X2F0dHIiLCJleHBlbmQiLCJhY3RpdmUiLCJjb25zdF9pbmZvIiwiaXRlbV9jZmciLCJnZXRJdGVtQ29uZmlnIiwibG9nIiwiaXRlbV9pY29uX3BhdGgiLCJnZXRJY29uUGF0aCIsImljb24iLCJpdGVtX3NwIiwiaXRlbV9zZiIsImhhdmVfbnVtIiwiZ2V0TW9kZWwiLCJnZXRJdGVtTnVtQnlCaWQiLCJudW1fc3RyIiwianMiLCJmb3JtYXRTdHIiLCJnZXRNb25leVN0cmluZyIsInRleHRfY29sb3IiLCJDb2xvciIsImNvbG9yIiwicHVzaCIsInNraWxsX251bSIsInN0YXJfa2V5IiwiYmlkIiwic3RhciIsInN0YXJfY2ZnIiwic2tpbGxfaWQiLCJza2lsbF9pIiwic2tpbGxzIiwic2tpbGxfY2ZnIiwic2V0RGF0YSIsInNob3dOb25lU2tpbGxJbmZvIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtB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aUIsbUJBQWpCLEVBQXNDNkQsUUFBdEMsQ0FBcEI7O0FBQ0EsVUFBSUcsUUFBSixFQUFjO0FBQ1YsWUFBSUMsUUFBUSxHQUFHLElBQWY7O0FBQ0EsYUFBSyxJQUFJQyxPQUFULElBQW9CRixRQUFRLENBQUNHLE1BQTdCLEVBQXFDO0FBQ2pDLGNBQUlILFFBQVEsQ0FBQ0csTUFBVCxDQUFnQkQsT0FBaEIsRUFBeUIsQ0FBekIsS0FBK0IvQyxjQUFjLENBQUN5QyxTQUFsRCxFQUNJSyxRQUFRLEdBQUdELFFBQVEsQ0FBQ0csTUFBVCxDQUFnQkQsT0FBaEIsRUFBeUIsQ0FBekIsQ0FBWDtBQUNQOztBQUVELFlBQUlELFFBQUosRUFBYztBQUNWLGNBQUlHLFNBQVMsR0FBR3BFLEtBQUssQ0FBQyxZQUFELEVBQWUsZ0JBQWYsRUFBaUNpRSxRQUFqQyxDQUFyQjtBQUNBLGVBQUt6RyxjQUFMLENBQW9CK0UsTUFBcEIsR0FBNkIsSUFBN0I7QUFDQSxlQUFLOUUsYUFBTCxDQUFtQjJELE1BQW5CLEdBQTRCZ0QsU0FBUyxDQUFDaEUsSUFBdEM7QUFDQSxlQUFLeEMsVUFBTCxDQUFnQnlHLE9BQWhCLENBQXdCSixRQUF4QjtBQUNILFNBTEQsTUFLTztBQUNILGVBQUtLLGlCQUFMO0FBQ0g7QUFDSixPQWZELE1BZU87QUFDSCxhQUFLQSxpQkFBTDtBQUNIO0FBQ0osS0FyQkQsTUFxQk87QUFBVztBQUNkLFdBQUtBLGlCQUFMO0FBQ0g7QUFDSixHQXpMMEI7QUEyTDNCQSxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixTQUFLOUcsY0FBTCxDQUFvQitFLE1BQXBCLEdBQTZCLEtBQTdCO0FBQ0EsU0FBS2hGLGNBQUwsQ0FBb0JnRixNQUFwQixHQUE2QixJQUE3QjtBQUNIO0FBOUwwQixDQUFULENBQXRCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wNC0xMCAxMDowMzozMVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCAgICAgICAgICAgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgSGVyb0V2ZW50ICAgICAgICAgID0gcmVxdWlyZShcImhlcm9fZXZlbnRcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgU2tpbGxJdGVtICAgICAgICAgID0gcmVxdWlyZShcInNraWxsX2l0ZW1cIik7XG5cbnZhciBIZXJvQnJlYWtXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGVyb1wiLCBcImhlcm9fYnJlYWtfcGFuZWxcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG5cbiAgICAgICAgdGhpcy5jdHJsID0gYXJndW1lbnRzWzBdO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuXG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5tYXNrX2JnX25kICAgICA9IHRoaXMuc2Vla0NoaWxkKFwibWFza19iZ1wiKTtcbiAgICAgICAgdGhpcy5hdHRyX3BhbmVsX25kICA9IHRoaXMuc2Vla0NoaWxkKFwiYXR0cl9wYW5lbFwiKTtcbiAgICAgICAgdGhpcy5icmVha19idG5fbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwiYnJlYWtfYnRuXCIpO1xuICAgICAgICB0aGlzLmVtcHR5X3BhbmVsX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJlbXB0eV9wYW5lbFwiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHNraWxsXG4gICAgICAgIHRoaXMuc2tpbGxfcGFuZWxfbmQgPSB0aGlzLnNlZWtDaGlsZChcInNraWxsX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLnNraWxsX25hbWVfbGIgID0gdGhpcy5zZWVrQ2hpbGQoXCJza2lsbF9uYW1lXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5za2lsbF9jb25fbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwic2tpbGxfY29uXCIpO1xuXG4gICAgICAgIHRoaXMuc2tpbGxfaXRlbSA9IG5ldyBTa2lsbEl0ZW0oKTtcbiAgICAgICAgdGhpcy5za2lsbF9pdGVtLnNldFBhcmVudCh0aGlzLnNraWxsX2Nvbl9uZCk7XG4gICAgICAgIHRoaXMuc2tpbGxfaXRlbS5zZXRTY2FsZSgwLjgpO1xuICAgICAgICB0aGlzLnNraWxsX2l0ZW0uc2V0U2hvd1RpcHModHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5tYXNrX2JnX25kLnNjYWxlID0gRklUX1NDQUxFO1xuXG4gICAgICAgIHRoaXMuY29uc3RfaXRlbXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaXRlbV9pID0gMTsgaXRlbV9pIDw9IDI7IGl0ZW1faSsrKSB7XG4gICAgICAgICAgICB2YXIgY29uc3RfaXRlbSA9IHRoaXMuY29uc3RfaXRlbXNbaXRlbV9pXSA9IHt9O1xuICAgICAgICAgICAgdmFyIGNvbnN0X3BhbmVsID0gY29uc3RfaXRlbVtcImNvbnN0X3BhbmVsXCJdID0gdGhpcy5zZWVrQ2hpbGQoXCJpdGVtX2Nvc3RfcGFuZWxcIiArIGl0ZW1faSk7XG4gICAgICAgICAgICBjb25zdF9pdGVtW1wiaXRlbl9pY29uXCJdICAgPSB0aGlzLnNlZWtDaGlsZChjb25zdF9wYW5lbCwgXCJpdGVtX2ljb25cIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIGNvbnN0X2l0ZW1bXCJpdGVuX251bV9uZFwiXSA9IHRoaXMuc2Vla0NoaWxkKGNvbnN0X3BhbmVsLCBcImxhYmVsXCIpOyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3RfaXRlbVtcIml0ZW5fbnVtXCJdICAgID0gdGhpcy5zZWVrQ2hpbGQoY29uc3RfcGFuZWwsIFwibGFiZWxcIiwgY2MuTGFiZWwpOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdHRyX2l0ZW1zID0ge307XG4gICAgICAgIGZvciAodmFyIGF0dHJfaSA9IDE7IGF0dHJfaSA8PSA1OyBhdHRyX2krKykge1xuICAgICAgICAgICAgdmFyIGF0dHJfaXRlbSA9IHRoaXMuYXR0cl9pdGVtc1thdHRyX2ldID0ge307XG4gICAgICAgICAgICBhdHRyX2l0ZW1bXCJhdHRyX2ljb25cIl0gICAgICAgID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5hdHRyX3BhbmVsX25kLCBcImF0dHJfaWNvblwiICsgYXR0cl9pLCBjYy5TcHJpdGUpO1xuICAgICAgICAgICAgYXR0cl9pdGVtW1wiYXR0cl9sYWJlbF9rZXlcIl0gICA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYXR0cl9wYW5lbF9uZCwgXCJhdHRyX2xhYmVsX2tleVwiICsgYXR0cl9pLCBjYy5MYWJlbCk7XG4gICAgICAgICAgICBhdHRyX2l0ZW1bXCJhdHRyX2xhYmVsX2xlZnRcIl0gID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5hdHRyX3BhbmVsX25kLCBcImF0dHJfbGFiZWxfbGVmdFwiICsgYXR0cl9pLCBjYy5MYWJlbCk7XG4gICAgICAgICAgICBhdHRyX2l0ZW1bXCJhdHRyX2xhYmVsX3JpZ2h0XCJdID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5hdHRyX3BhbmVsX25kLCBcImF0dHJfbGFiZWxfcmlnaHRcIiArIGF0dHJfaSwgY2MuTGFiZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5icmVha19idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uQ2xpY2tCcmVha0J0biwgdGhpcyk7XG4gICAgICAgIHRoaXMubWFza19iZ19uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMub25DbGlja01hc2ssIHRoaXMpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhlcm9FdmVudC5OZXh0X0JyZWFrX0luZm9fRXZlbnQsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChkYXRhKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0cyhkYXRhKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCOLOa3u+WKoOWIsOWvueW6lOS4u+iKgueCueS5i+WQjueahOWbnuiwgyzkuZ/lsLHmmK/kuIDkuKrnqpfkvZPnmoTmraPlvI/lhaXlj6Ms5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXG4gICAgb3BlblJvb3RXbmQ6ZnVuY3Rpb24ocGFyYW1zKXtcbiAgICAgICAgaWYgKCFwYXJhbXMpIHJldHVybjtcbiAgICAgICAgdGhpcy5oZXJvX3ZvID0gcGFyYW1zO1xuICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMTYodGhpcy5oZXJvX3ZvLnBhcnRuZXJfaWQpO1xuICAgICAgICAvLyB0aGlzLnVwZGF0ZVdpZGdldHMoKTtcbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5IZXJvQnJlYWtQYW5lbChmYWxzZSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tCcmVha0J0bjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmhlcm9fdm8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRfaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBleHBlbmRfaXRlbV9jZmcgPSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDFcIiwgdGhpcy5uZWVkX2l0ZW1zWzBdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIueJqeWTgVtcIiArIGV4cGVuZF9pdGVtX2NmZy5uYW1lICsgXCJd5LiN6LazXCIpKTtcbiAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLCB0aGlzLm5lZWRfaXRlbXNbMF0pOyAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMDQodGhpcy5oZXJvX3ZvLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9CcmVha1BhbmVsKGZhbHNlKTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGlja01hc2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9CcmVha1BhbmVsKGZhbHNlKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlV2lkZ2V0czogZnVuY3Rpb24obmV4dF9kYXRhKSB7XG4gICAgICAgIHZhciBjdXJfYnJlYWtfa2V5ICA9IHRoaXMuaGVyb192by50eXBlICsgXCJfXCIgKyB0aGlzLmhlcm9fdm8uYnJlYWtfaWQgKyBcIl9cIiArIHRoaXMuaGVyb192by5icmVha19sZXY7XG4gICAgICAgIHZhciBuZXh0X2JyZWFrX2tleSA9IHRoaXMuaGVyb192by50eXBlICsgXCJfXCIgKyB0aGlzLmhlcm9fdm8uYnJlYWtfaWQgKyBcIl9cIiArICh0aGlzLmhlcm9fdm8uYnJlYWtfbGV2ICsgMSk7XG4gICAgICAgIHZhciBjdXJfYnJlYWtfY2ZnICA9IENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9wYXJ0bmVyX2JyYWNoW2N1cl9icmVha19rZXldO1xuICAgICAgICB2YXIgbmV4dF9icmVha19jZmcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9icmFjaFtuZXh0X2JyZWFrX2tleV07XG4gICAgICAgIGlmICghY3VyX2JyZWFrX2NmZyB8fCAhbmV4dF9icmVha19jZmcpIHJldHVybjtcblxuICAgICAgICAvLyDlsZ7mgKdcbiAgICAgICAgZm9yICh2YXIgYXR0cl9pID0gMTsgYXR0cl9pIDw9IDU7IGF0dHJfaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cl9pdGVtID0gdGhpcy5hdHRyX2l0ZW1zW2F0dHJfaV07XG4gICAgICAgICAgICBpZiAoYXR0cl9pID09IDEpIHtcbiAgICAgICAgICAgICAgICBhdHRyX2l0ZW1bXCJhdHRyX2xhYmVsX2xlZnRcIl0uc3RyaW5nID0gY3VyX2JyZWFrX2NmZy5sZXZfbWF4O1xuICAgICAgICAgICAgICAgIGF0dHJfaXRlbVtcImF0dHJfbGFiZWxfcmlnaHRcIl0uc3RyaW5nID0gbmV4dF9icmVha19jZmcubGV2X21heDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBuZXh0X2JyZWFrX2NmZy5hbGxfYXR0clthdHRyX2ktMl07XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWNvblxuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9zdHIgPSBhdHRyWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9yZXMgPSBQYXRoVG9vbC5nZXRBdHRySWNvbkJ5U3RyKGF0dHJfc3RyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsIGF0dHJfcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGF0dHJfcmVzX3BhdGgsIGZ1bmN0aW9uKGljb25fc3AsIGljb25fc2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25fc3Auc3ByaXRlRnJhbWUgPSBpY29uX3NmO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgYXR0cl9pdGVtW1wiYXR0cl9pY29uXCJdKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfbmFtZSA9IENvbmZpZy5hdHRyX2RhdGEuZGF0YV9rZXlfdG9fbmFtZVthdHRyX3N0cl07XG4gICAgICAgICAgICAgICAgICAgIGF0dHJfaXRlbVtcImF0dHJfbGFiZWxfa2V5XCJdLnN0cmluZyA9IGF0dHJfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXR0clxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cl9zdHIgPT0gXCJocF9tYXhcIikgYXR0cl9zdHIgPSBcImhwXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZWZ0X2F0dHIgPSB0aGlzLmhlcm9fdm9bYXR0cl9zdHJdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRfYXR0ciA9IG5leHRfZGF0YVthdHRyX3N0cl0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgYXR0cl9pdGVtW1wiYXR0cl9sYWJlbF9sZWZ0XCJdLnN0cmluZyA9IGxlZnRfYXR0cjtcbiAgICAgICAgICAgICAgICAgICAgYXR0cl9pdGVtW1wiYXR0cl9sYWJlbF9yaWdodFwiXS5zdHJpbmcgPSByaWdodF9hdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOa2iOiAl1xuICAgICAgICB0aGlzLm5lZWRfaXRlbXMgPSBbXTtcbiAgICAgICAgaWYgKGN1cl9icmVha19jZmcuZXhwZW5kID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29uc3RfaXRlbXNbXCIxXCJdLmNvbnN0X3BhbmVsLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb25zdF9pdGVtc1tcIjJcIl0uY29uc3RfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpdGVtX2kgPSAxOyBpdGVtX2kgPD0gMjsgaXRlbV9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uc3RfaXRlbSA9IHRoaXMuY29uc3RfaXRlbXNbaXRlbV9pXTtcbiAgICAgICAgICAgICAgICB2YXIgY29uc3RfaW5mbyA9IGN1cl9icmVha19jZmcuZXhwZW5kW2l0ZW1faSAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjb25zdF9pbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtX2NmZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoY29uc3RfaW5mb1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGNjLmxvZyhpdGVtX2NmZyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtX2ljb25fcGF0aCA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaXRlbVwiLCBpdGVtX2NmZy5pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGl0ZW1faWNvbl9wYXRoLCBmdW5jdGlvbihpdGVtX3NwLCBpdGVtX3NmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtX3NwLnNwcml0ZUZyYW1lID0gaXRlbV9zZjtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGNvbnN0X2l0ZW1bXCJpdGVuX2ljb25cIl0pKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhdmVfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQoY29uc3RfaW5mb1swXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1fc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiJXMvJXNcIiwgVXRpbHMuZ2V0TW9uZXlTdHJpbmcoaGF2ZV9udW0pLCBVdGlscy5nZXRNb25leVN0cmluZyhjb25zdF9pbmZvWzFdKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZW1bXCJpdGVuX251bVwiXS5zdHJpbmcgPSBudW1fc3RyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZV9udW0gPCBjb25zdF9pbmZvWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dF9jb2xvciA9IG5ldyBjYy5Db2xvcigweGZmLCAweDU5LCAweDQzLCAweGZmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZW1bXCJpdGVuX251bV9uZFwiXS5jb2xvciA9IHRleHRfY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRfaXRlbXMucHVzaChjb25zdF9pbmZvWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZW0uY29uc3RfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5oqA6IO9XG4gICAgICAgIGlmIChuZXh0X2JyZWFrX2NmZy5za2lsbF9udW0gPiBjdXJfYnJlYWtfY2ZnLnNraWxsX251bSkge1xuICAgICAgICAgICAgdmFyIHN0YXJfa2V5ID0gdGhpcy5oZXJvX3ZvLmJpZCArIFwiX1wiICsgdGhpcy5oZXJvX3ZvLnN0YXI7XG4gICAgICAgICAgICB2YXIgc3Rhcl9jZmcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIHN0YXJfa2V5KTtcbiAgICAgICAgICAgIGlmIChzdGFyX2NmZykge1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9pZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc2tpbGxfaSBpbiBzdGFyX2NmZy5za2lsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJfY2ZnLnNraWxsc1tza2lsbF9pXVswXSA9PSBuZXh0X2JyZWFrX2NmZy5za2lsbF9udW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9pZCA9IHN0YXJfY2ZnLnNraWxsc1tza2lsbF9pXVsxXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpbGxfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNraWxsX2NmZyA9IGdkYXRhKCdza2lsbF9kYXRhJywgJ2RhdGFfZ2V0X3NraWxsJywgc2tpbGxfaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX3BhbmVsX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbmFtZV9sYi5zdHJpbmcgPSBza2lsbF9jZmcubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lsbF9pdGVtLnNldERhdGEoc2tpbGxfaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd05vbmVTa2lsbEluZm8oKTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Tm9uZVNraWxsSW5mbygpOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgLy8g5LuA5LmI6YO95rKh5pyJXG4gICAgICAgICAgICB0aGlzLnNob3dOb25lU2tpbGxJbmZvKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvd05vbmVTa2lsbEluZm86IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNraWxsX3BhbmVsX25kLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtcHR5X3BhbmVsX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgfSxcbn0pIl19