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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/role/view/role_faced_panel.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '3d53bsaLvBAzqAuZrycMbaP', 'role_faced_panel');
// Scripts/mod/role/view/role_faced_panel.js
 
"use strict";
 
// --------------------------------------------------------------------
// uthor: xxx@syg.com(必填, 创建模块的人员)
// description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-04-17 10:35:09
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var BackpackController = require("backpack_controller");
 
var CommonScrollView = require("common_scrollview");
 
var RoleFaceItem = require("role_face_item");
 
var RoleEvent = require("role_event");
 
var Role_facedPanel = cc.Class({
  "extends": BasePanel,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("roleinfo", "role_face_panel");
  },
  // 可以初始化声明一些变量的
  initConfig: function initConfig() {
    this.ctrl = RoleController.getInstance();
    this.item_list = {};
    this.group_list = {};
    this.have_list = {};
    this.is_first = true;
    this.role_vo = this.ctrl.getRoleVo();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initPanel: function initPanel() {
    this.scroll_con = this.root_wnd.getChildByName("scroll_con");
    this.view = this.scroll_con.getChildByName("view");
    this.content = this.view.getChildByName("content");
    this.use_btn = this.root_wnd.getChildByName("ok_btn");
    this.use_btn_label = this.use_btn.getChildByName("Label").getComponent(cc.Label);
    this.item = this.root_wnd.getChildByName("item");
    var setting = {
      item_class: RoleFaceItem,
      // 单元类
      start_x: 5,
      // 第一个单元的X起点
      space_x: 4,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 10,
      // y方向的间隔
      item_width: 141,
      // 单元的尺寸width
      item_height: 120,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 4,
      // 列数,作用于垂直滚动类型
      once_num: 4,
      need_dynamic: true
    };
    var scroll_view_size = cc.size(604, 514);
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(this.scroll_con, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
    this.ctrl.send21500();
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.use_btn, function () {
      if (this.select_item && this.select_item.getData()) {
        var data = this.select_item.getData();
 
        if (data && data.base_id) {
          var is_lock = this.select_item.getIsLock() || false;
 
          if (is_lock == true) {
            this.ctrl.send21503(data.base_id);
            return;
          }
 
          var bid = data.base_id;
 
          if (data.group == 110) {
            for (var i in this.have_list) {
              var v = this.have_list[i];
 
              for (var i in this.have_list) {
                if (this.isSameGroup(v.base_id, data.base_id)) {
                  bid = v.base_id;
                }
 
                ;
              }
            }
          }
 
          this.ctrl.send21501(bid);
        }
      }
    }.bind(this), 1);
    this.addGlobalEvent(RoleEvent.GetFaceList, function (data) {
      if (data && data.avatar_frame) {
        for (var i in data.avatar_frame) {
          var v = data.avatar_frame[i];
 
          if (v && v.base_id) {
            this.have_list[v.base_id] = v;
            var config = Config.avatar_data.data_avatar[v.base_id];
 
            if (config && config.group) {
              this.group_list[config.group] = config;
            }
          }
        }
      }
 
      this.createItemList();
    });
 
    if (!this.role_update_evt) {
      this.role_update_evt = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, val) {
        if (key == "avatar_base_id") {
          if (this.role_vo && this.role_vo.avatar_base_id) {}
        }
      }, this);
    }
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调可以设置一些数据了
  onShow: function onShow(params) {},
  createItemList: function createItemList() {
    var num = Config.avatar_data.data_avatar_length || 0;
    var config = Config.avatar_data.data_avatar;
    if (!config) return;
    var index = 1;
    var array = [];
 
    for (var i in config) {
      var v = config[i];
 
      if (v.is_show == 1) {
        v.has = 3; //这个没激活
 
        if (v.loss && Utils.next(v.loss || {}) != null) {
          var loss_bid = v.loss[0][0];
          var loss_num = v.loss[0][1];
 
          if (!this.have_list[v.base_id]) {
            //如果是不存在已在列表又尚未激活的
            var has_num = BackpackController.getInstance().getModel().getBackPackItemNumByBid(loss_bid);
 
            if (has_num >= loss_num) {
              //可激活的
              v.has = 0;
            }
          }
        } else {
          v.has = 1;
        }
 
        array.push(v);
      }
    }
 
    for (var i = 0; i < array.length; i++) {
      var v = array[i];
 
      if (this.have_list[v.base_id]) {
        //已经拥有的
        v.has = 2;
      }
    }
 
    array.sort(Utils.tableLowerSorter(["has", "base_id"]));
 
    var func = function (face_item, vo) {
      if (this.select_item) {
        this.select_item.setSelected(false);
      }
 
      this.select_item = face_item;
      this.select_item.setSelected(true);
      var is_lock = this.select_item.getIsLock() || false;
 
      if (is_lock == true) {
        this.use_btn_label.string = Utils.TI18N("激 活");
      } else {
        this.use_btn_label.string = Utils.TI18N("更 换");
      }
 
      if (this.is_first == false) {// TipsManager:getInstance():showFaceTips(2,face_item:getData(),self.scroll_view:convertToWorldSpace(cc.p(self.select_item:getPositionX(),343)))
      } else {
        this.is_first = false;
      }
    }.bind(this);
 
    this.item_scrollview.setData(array);
  },
  //是否是同组的
  isSameGroup: function isSameGroup(bid1, bid2) {
    var config_1 = Config.avatar_data.data_avatar[bid1];
    if (!config_1) return false;
    var config_2 = Config.avatar_data.data_avatar[bid2];
    if (!config_2) return false;
 
    if (config_1.group && config_1.group == config_2.group) {
      return true;
    }
 
    return false;
  },
  //根据bid获取该组id
  getGroupByBid: function getGroupByBid(bid) {
    var config = Config.avatar_data.data_avatar[bid];
    if (!config) return 0;
    return config.group || 0;
  },
  setVisibleStatus: function setVisibleStatus(bool) {
    this.setVisible(bool);
  },
  createTimer: function createTimer(value) {},
  // 面板设置不可见的回调,这里做一些不可见的屏蔽处理
  onHide: function onHide() {},
  // 当面板从主节点释放掉的调用接口,需要手动调用,而且也一定要调用
  onDelete: function onDelete() {
    if (this.item_scrollview) {
      this.item_scrollview.deleteMe();
      this.item_scrollview = null;
    }
 
    if (this.role_update_evt) {
      this.role_vo.unbind(this.role_update_evt);
    }
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxyb2xlXFx2aWV3XFxyb2xlX2ZhY2VkX3BhbmVsLmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiQmFja3BhY2tDb250cm9sbGVyIiwiQ29tbW9uU2Nyb2xsVmlldyIsIlJvbGVGYWNlSXRlbSIsIlJvbGVFdmVudCIsIlJvbGVfZmFjZWRQYW5lbCIsImNjIiwiQ2xhc3MiLCJCYXNlUGFuZWwiLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJpbml0Q29uZmlnIiwiY3RybCIsImdldEluc3RhbmNlIiwiaXRlbV9saXN0IiwiZ3JvdXBfbGlzdCIsImhhdmVfbGlzdCIsImlzX2ZpcnN0Iiwicm9sZV92byIsImdldFJvbGVWbyIsImluaXRQYW5lbCIsInNjcm9sbF9jb24iLCJyb290X3duZCIsImdldENoaWxkQnlOYW1lIiwidmlldyIsImNvbnRlbnQiLCJ1c2VfYnRuIiwidXNlX2J0bl9sYWJlbCIsImdldENvbXBvbmVudCIsIkxhYmVsIiwiaXRlbSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm9uY2VfbnVtIiwibmVlZF9keW5hbWljIiwic2Nyb2xsX3ZpZXdfc2l6ZSIsInNpemUiLCJpdGVtX3Njcm9sbHZpZXciLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsInNlbmQyMTUwMCIsInJlZ2lzdGVyRXZlbnQiLCJVdGlscyIsIm9uVG91Y2hFbmQiLCJzZWxlY3RfaXRlbSIsImdldERhdGEiLCJkYXRhIiwiYmFzZV9pZCIsImlzX2xvY2siLCJnZXRJc0xvY2siLCJzZW5kMjE1MDMiLCJiaWQiLCJncm91cCIsImkiLCJ2IiwiaXNTYW1lR3JvdXAiLCJzZW5kMjE1MDEiLCJiaW5kIiwiYWRkR2xvYmFsRXZlbnQiLCJHZXRGYWNlTGlzdCIsImF2YXRhcl9mcmFtZSIsImNvbmZpZyIsIkNvbmZpZyIsImF2YXRhcl9kYXRhIiwiZGF0YV9hdmF0YXIiLCJjcmVhdGVJdGVtTGlzdCIsInJvbGVfdXBkYXRlX2V2dCIsIkV2ZW50SWQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWwiLCJhdmF0YXJfYmFzZV9pZCIsIm9uU2hvdyIsInBhcmFtcyIsIm51bSIsImRhdGFfYXZhdGFyX2xlbmd0aCIsImluZGV4IiwiYXJyYXkiLCJpc19zaG93IiwiaGFzIiwibG9zcyIsIm5leHQiLCJsb3NzX2JpZCIsImxvc3NfbnVtIiwiaGFzX251bSIsImdldE1vZGVsIiwiZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQiLCJwdXNoIiwibGVuZ3RoIiwic29ydCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJmdW5jIiwiZmFjZV9pdGVtIiwidm8iLCJzZXRTZWxlY3RlZCIsInN0cmluZyIsIlRJMThOIiwic2V0RGF0YSIsImJpZDEiLCJiaWQyIiwiY29uZmlnXzEiLCJjb25maWdfMiIsImdldEdyb3VwQnlCaWQiLCJzZXRWaXNpYmxlU3RhdHVzIiwiYm9vbCIsInNldFZpc2libGUiLCJjcmVhdGVUaW1lciIsInZhbHVlIiwib25IaWRlIiwib25EZWxldGUiLCJkZWxldGVNZSIsInVuYmluZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLGtCQUFrQixHQUFHRixPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSUcsZ0JBQWdCLEdBQUdILE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJSSxZQUFZLEdB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LENBRW5CLENBL0wwQjtBQWlNM0I7QUFDQUMsRUFBQUEsUUFBUSxFQUFFLG9CQUFZO0FBQ2xCLFFBQUcsS0FBSzVFLGVBQVIsRUFBd0I7QUFDcEIsV0FBS0EsZUFBTCxDQUFxQjZFLFFBQXJCO0FBQ0EsV0FBSzdFLGVBQUwsR0FBdUIsSUFBdkI7QUFDSDs7QUFDRCxRQUFHLEtBQUtpQyxlQUFSLEVBQXdCO0FBQ3BCLFdBQUs1RCxPQUFMLENBQWF5RyxNQUFiLENBQW9CLEtBQUs3QyxlQUF6QjtBQUNIO0FBQ0o7QUExTTBCLENBQVQsQ0FBdEIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIHV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gZGVzY3JpcHRpb246XHJcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcclxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDQtMTcgMTA6MzU6MDlcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xyXG52YXIgUm9sZUZhY2VJdGVtID0gcmVxdWlyZShcInJvbGVfZmFjZV9pdGVtXCIpXHJcbnZhciBSb2xlRXZlbnQgPSByZXF1aXJlKFwicm9sZV9ldmVudFwiKTtcclxuXHJcbnZhciBSb2xlX2ZhY2VkUGFuZWwgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlUGFuZWwsXHJcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcInJvbGVpbmZvXCIsIFwicm9sZV9mYWNlX3BhbmVsXCIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlj6/ku6XliJ3lp4vljJblo7DmmI7kuIDkupvlj5jph4/nmoRcclxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN0cmwgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMuaXRlbV9saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5ncm91cF9saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5oYXZlX2xpc3QgPSB7fTtcclxuICAgICAgICB0aGlzLmlzX2ZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJvbGVfdm8gPSB0aGlzLmN0cmwuZ2V0Um9sZVZvKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcclxuICAgIGluaXRQYW5lbDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsX2NvbiA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJzY3JvbGxfY29uXCIpO1xyXG4gICAgICAgIHRoaXMudmlldyA9IHRoaXMuc2Nyb2xsX2Nvbi5nZXRDaGlsZEJ5TmFtZShcInZpZXdcIik7XHJcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGhpcy52aWV3LmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcclxuICAgICAgICB0aGlzLnVzZV9idG4gPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwib2tfYnRuXCIpO1xyXG4gICAgICAgIHRoaXMudXNlX2J0bl9sYWJlbCA9IHRoaXMudXNlX2J0bi5nZXRDaGlsZEJ5TmFtZShcIkxhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbSA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJpdGVtXCIpO1xyXG5cclxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcclxuICAgICAgICAgICAgaXRlbV9jbGFzczogUm9sZUZhY2VJdGVtLCAgICAgIC8vIOWNleWFg+exu1xyXG4gICAgICAgICAgICBzdGFydF94OiA1LCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxyXG4gICAgICAgICAgICBzcGFjZV94OiA0LCAgICAgICAgICAgICAgICAgICAgLy8geOaWueWQkeeahOmXtOmalFxyXG4gICAgICAgICAgICBzdGFydF95OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWei1t+eCuVxyXG4gICAgICAgICAgICBzcGFjZV95OiAxMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxyXG4gICAgICAgICAgICBpdGVtX3dpZHRoOiAxNDEsICAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4d2lkdGhcclxuICAgICAgICAgICAgaXRlbV9oZWlnaHQ6IDEyMCwgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuGhlaWdodFxyXG4gICAgICAgICAgICByb3c6IDAsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIGNvbDogNCwgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcclxuICAgICAgICAgICAgb25jZV9udW06IDQsXHJcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHNjcm9sbF92aWV3X3NpemUgPSBjYy5zaXplKDYwNCwgNTE0KTtcclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwodGhpcy5zY3JvbGxfY29uLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgc2Nyb2xsX3ZpZXdfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LCAwLjUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdHJsLnNlbmQyMTUwMCgpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XHJcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnVzZV9idG4sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2l0ZW0gJiYgdGhpcy5zZWxlY3RfaXRlbS5nZXREYXRhKCkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5zZWxlY3RfaXRlbS5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmJhc2VfaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNfbG9jayA9IHRoaXMuc2VsZWN0X2l0ZW0uZ2V0SXNMb2NrKCkgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xvY2sgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZDIxNTAzKGRhdGEuYmFzZV9pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmlkID0gZGF0YS5iYXNlX2lkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmdyb3VwID09IDExMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaGF2ZV9saXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuaGF2ZV9saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmhhdmVfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2FtZUdyb3VwKHYuYmFzZV9pZCwgZGF0YS5iYXNlX2lkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQgPSB2LmJhc2VfaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kMjE1MDEoYmlkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoUm9sZUV2ZW50LkdldEZhY2VMaXN0LCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmF2YXRhcl9mcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhLmF2YXRhcl9mcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gZGF0YS5hdmF0YXJfZnJhbWVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgdi5iYXNlX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGF2ZV9saXN0W3YuYmFzZV9pZF0gPSB2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmF2YXRhcl9kYXRhLmRhdGFfYXZhdGFyW3YuYmFzZV9pZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwX2xpc3RbY29uZmlnLmdyb3VwXSA9IGNvbmZpZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUl0ZW1MaXN0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yb2xlX3VwZGF0ZV9ldnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yb2xlX3VwZGF0ZV9ldnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgKGZ1bmN0aW9uIChrZXksIHZhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSBcImF2YXRhcl9iYXNlX2lkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJvbGVfdm8gJiYgdGhpcy5yb2xlX3ZvLmF2YXRhcl9iYXNlX2lkKXtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLCB0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCD5Y+v5Lul6K6+572u5LiA5Lqb5pWw5o2u5LqGXHJcbiAgICBvblNob3c6IGZ1bmN0aW9uIChwYXJhbXMpIHtcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIGNyZWF0ZUl0ZW1MaXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIG51bSA9IENvbmZpZy5hdmF0YXJfZGF0YS5kYXRhX2F2YXRhcl9sZW5ndGggfHwgMDtcclxuICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLmF2YXRhcl9kYXRhLmRhdGFfYXZhdGFyO1xyXG4gICAgICAgIGlmICghY29uZmlnKSByZXR1cm5cclxuICAgICAgICB2YXIgaW5kZXggPSAxO1xyXG5cclxuICAgICAgICB2YXIgYXJyYXkgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpIGluIGNvbmZpZykge1xyXG4gICAgICAgICAgICB2YXIgdiA9IGNvbmZpZ1tpXTtcclxuICAgICAgICAgICAgaWYgKHYuaXNfc2hvdyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB2LmhhcyA9IDM7ICAgICAgLy/ov5nkuKrmsqHmv4DmtLtcclxuICAgICAgICAgICAgICAgIGlmICh2Lmxvc3MgJiYgVXRpbHMubmV4dCh2Lmxvc3MgfHwge30pICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbG9zc19iaWQgPSB2Lmxvc3NbMF1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvc3NfbnVtID0gdi5sb3NzWzBdWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXZlX2xpc3Rbdi5iYXNlX2lkXSkgeyAgICAgICAgICAgLy/lpoLmnpzmmK/kuI3lrZjlnKjlt7LlnKjliJfooajlj4jlsJrmnKrmv4DmtLvnmoRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc19udW0gPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEJhY2tQYWNrSXRlbU51bUJ5QmlkKGxvc3NfYmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc19udW0gPj0gbG9zc19udW0pIHsgICAgICAgICAgLy/lj6/mv4DmtLvnmoRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuaGFzID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5oYXMgPSAxXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGF2ZV9saXN0W3YuYmFzZV9pZF0pIHsgICAgICAvL+W3sue7j+aLpeacieeahFxyXG4gICAgICAgICAgICAgICAgdi5oYXMgPSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFycmF5LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJoYXNcIixcImJhc2VfaWRcIl0pKTtcclxuXHJcbiAgICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbihmYWNlX2l0ZW0sdm8pe1xyXG4gICAgICAgICAgICBpZih0aGlzLnNlbGVjdF9pdGVtKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0X2l0ZW0uc2V0U2VsZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2l0ZW0gPSBmYWNlX2l0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2l0ZW0uc2V0U2VsZWN0ZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBpc19sb2NrID0gdGhpcy5zZWxlY3RfaXRlbS5nZXRJc0xvY2soKSB8fCBmYWxzZTtcclxuICAgICAgICAgICAgaWYoaXNfbG9jayA9PSB0cnVlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIua/gCDmtLtcIik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VfYnRuX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5pu0IOaNolwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLmlzX2ZpcnN0ID09IGZhbHNlKXtcclxuICAgICAgICAgICAgICAgIC8vIFRpcHNNYW5hZ2VyOmdldEluc3RhbmNlKCk6c2hvd0ZhY2VUaXBzKDIsZmFjZV9pdGVtOmdldERhdGEoKSxzZWxmLnNjcm9sbF92aWV3OmNvbnZlcnRUb1dvcmxkU3BhY2UoY2MucChzZWxmLnNlbGVjdF9pdGVtOmdldFBvc2l0aW9uWCgpLDM0MykpKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNfZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKGFycmF5KVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+aYr+WQpuaYr+WQjOe7hOeahFxyXG4gICAgaXNTYW1lR3JvdXA6ZnVuY3Rpb24oYmlkMSxiaWQyKXtcclxuICAgICAgICB2YXIgY29uZmlnXzEgPSBDb25maWcuYXZhdGFyX2RhdGEuZGF0YV9hdmF0YXJbYmlkMV07XHJcbiAgICAgICAgaWYoIWNvbmZpZ18xKXJldHVybiBmYWxzZVxyXG4gICAgICAgIHZhciBjb25maWdfMiA9IENvbmZpZy5hdmF0YXJfZGF0YS5kYXRhX2F2YXRhcltiaWQyXTtcclxuICAgICAgICBpZighY29uZmlnXzIpcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgaWYoY29uZmlnXzEuZ3JvdXAgJiYgY29uZmlnXzEuZ3JvdXAgPT0gY29uZmlnXzIuZ3JvdXApe1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgIH0sXHJcblxyXG4gICAgLy/moLnmja5iaWTojrflj5bor6Xnu4RpZFxyXG4gICAgZ2V0R3JvdXBCeUJpZDpmdW5jdGlvbihiaWQpe1xyXG4gICAgICAgIHZhciBjb25maWcgPSBDb25maWcuYXZhdGFyX2RhdGEuZGF0YV9hdmF0YXJbYmlkXTtcclxuICAgICAgICBpZighY29uZmlnKXJldHVybiAwXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5ncm91cCB8fCAwO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRWaXNpYmxlU3RhdHVzOmZ1bmN0aW9uKGJvb2wpe1xyXG4gICAgICAgIHRoaXMuc2V0VmlzaWJsZShib29sKVxyXG4gICAgfSxcclxuXHJcbiAgICBjcmVhdGVUaW1lcjpmdW5jdGlvbih2YWx1ZSl7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDpnaLmnb/orr7nva7kuI3lj6/op4HnmoTlm57osIMs6L+Z6YeM5YGa5LiA5Lqb5LiN5Y+v6KeB55qE5bGP6JS95aSE55CGXHJcbiAgICBvbkhpZGU6IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOW9k+mdouadv+S7juS4u+iKgueCuemHiuaUvuaOieeahOiwg+eUqOaOpeWPoyzpnIDopoHmiYvliqjosIPnlKgs6ICM5LiU5Lmf5LiA5a6a6KaB6LCD55SoXHJcbiAgICBvbkRlbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmKHRoaXMuaXRlbV9zY3JvbGx2aWV3KXtcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLnJvbGVfdXBkYXRlX2V2dCl7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX3VwZGF0ZV9ldnQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbn0pIl19