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/common/baserole.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, '1e370LPZpZI56omBMKNFvi0', 'baserole');
// Scripts/common/baserole.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      通用展示角色对象
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
// var LoaderManager = require("loadermanager");
var PathTool = require("pathtool");
 
var BaseRole = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.loadFinish = false; // 是否加载完成
  },
  is_load_finish: false,
  action_data: null,
  // 尚未创建完成之前播放动作的携带数据
  anima_path: null,
  effect_path: null,
  statics: {
    type: {
      hero: 1,
      unit: 2
    }
  },
  setParent: function setParent(parent) {
    this.parent = parent;
    this.node = new cc.Node("");
    this.node.setAnchorPoint(0.5, 0.5);
    this.spine = this.node.addComponent(sp.Skeleton);
    var effect_nd = new cc.Node("");
    this.effect_sk = effect_nd.addComponent(sp.Skeleton);
    this.parent.addChild(this.node);
    this.node.addChild(effect_nd);
  },
  // 设置数据,这个是主接口,怪物类型和怪物id
  setData: function setData(unit_type, bidordata, action_name, loop, scale, setting) {
    // cc.log(unit_type, bidordata, action_name, loop, scale)
    var anima_path = null;
    var effect_path = null;
    scale = scale || 1;
    this.node.scale = scale;
    setting = setting || {};
    var effectScale = setting.scale || 1;
    this.effect_sk.node.scale = effectScale;
 
    if (unit_type == BaseRole.type.role) {
      var config = Config.looks_data.data_data[bidordata];
 
      if (config) {
        var key = Utils.getNorKey(config.partner_id, config.star);
        var star_config = gdata("partner_data", "data_partner_star", key);
        action_name = action_name ? action_name : PlayerAction.show;
        anima_path = cc.js.formatStr("spine/%s/%s.atlas", config.ico_id, action_name);
 
        if (star_config && star_config.show_effect != "") {
          // action_name = action_name ? action_name : PlayerAction.show; 
          // anima_path = cc.js.formatStr("spine/%s/%s.atlas", star_config.show_effect, action_name);
          if (star_config.show_effect) {
            effect_path = "spine/" + star_config.show_effect + "/action.atlas";
            var skin_id = config.skin_id;
 
            if (skin_id == 0 && setting.skin_id != null) {
              skin_id = setting.skin_id;
            }
 
            var skin_config = Config.partner_skin_data.data_skin_info[skin_id];
 
            if (skin_config && skin_config.res_id != null && skin_config.res_id != "") {
              anima_path = "spine/" + skin_config.res_id + "/show.atlas";
            }
 
            if (skin_config && skin_config.show_effect != "") {
              effect_path = "spine/" + skin_config.show_effect + "/action.atlas";
            }
          } else {
            if (this.effect_sk) {
              this.effect_sk.setToSetupPose();
              this.effect_sk.clearTracks();
            }
          }
        }
      }
    } else if (unit_type == BaseRole.type.partner) {
      // 测试使用
      var star_key = bidordata.bid + "_" + bidordata.star;
      var star_cfg = gdata("partner_data", "data_partner_star", star_key);
      anima_path = "spine/" + star_cfg.res_id + "/show.atlas";
      var test_cfg = gdata("partner_data", "data_partner_base", bidordata.bid); //英雄皮肤id
 
      var _skin_id = setting.skin_id;
      var _skin_config = Config.partner_skin_data.data_skin_info[_skin_id];
 
      if (_skin_config && _skin_config.res_id != null && _skin_config.res_id != "") {
        anima_path = "spine/" + _skin_config.res_id + "/show.atlas";
      } // 十星特效
 
 
      if (star_cfg.show_effect) {
        effect_path = "spine/" + star_cfg.show_effect + "/action.atlas";
 
        if (_skin_config && _skin_config.show_effect != "") {
          effect_path = "spine/" + _skin_config.show_effect + "/action.atlas";
        }
      } else {
        if (this.effect_sk) {
          this.effect_sk.setToSetupPose();
          this.effect_sk.clearTracks();
        }
      }
    } else if (unit_type == BaseRole.type.unit) {
      var config = Utils.getUnitConfig(bidordata);
 
      if (PathTool.specialBSModel(Number(bidordata))) {
        action_name = PlayerAction.battle_stand;
      }
 
      if (config != null) {
        anima_path = cc.js.formatStr("spine/%s/%s.atlas", config.body_id, action_name);
      }
    } else if (unit_type == BaseRole.type.skin) {
      if (typeof bidordata == "number") {
        //显示皮肤外观
        var _skin_id2 = bidordata;
        var _skin_config2 = Config.partner_skin_data.data_skin_info[_skin_id2];
 
        if (_skin_config2 && _skin_config2.res_id != null && _skin_config2.res_id != "") {
          anima_path = "spine/" + _skin_config2.res_id + "/show.atlas";
        }
 
        if (_skin_config2 && _skin_config2.show_effect != "") {
          effect_path = "spine/" + _skin_config2.show_effect + "/action.atlas";
        }
      }
    } else {}
 
    if (!anima_path) return;
 
    if (this.anima_path && this.anima_path != anima_path) {
      this.spine.enabled = false;
      LoaderManager.getInstance().releaseRes(this.anima_path);
    }
 
    if (this.effect_path && this.effect_path != effect_path) {
      this.effect_sk.enabled = false;
      LoaderManager.getInstance().releaseRes(this.effect_path);
    }
 
    LoaderManager.getInstance().loadRes(anima_path, function (res) {
      this.spine.enabled = true;
      this.spine.skeletonData = res;
      this.is_load_finish = true;
      this.setAnimationAct(action_name, loop);
    }.bind(this));
 
    if (effect_path) {
      LoaderManager.getInstance().loadRes(effect_path, function (effect_sd) {
        this.effect_sk.enabled = true;
        this.effect_sk.skeletonData = effect_sd;
        this.effect_sk.setAnimation(0, "action", true);
      }.bind(this));
    }
 
    this.effect_path = effect_path;
    this.anima_path = anima_path;
  },
  // 设置动作,如果是加载完成之后,那么直接播放,否则等加载之后播放
  setAnimation: function setAnimation(action_name, loop) {
    action_name = action_name ? action_name : PlayerAction.show;
 
    if (loop == null) {
      loop = true;
    }
 
    if (this.is_load_finish) {
      this.setAnimationAct(action_name, loop);
    } else {
      this.action_data = {
        action_name: action_name,
        loop: loop
      };
    }
  },
  // 播放动作的具体细节
  setAnimationAct: function setAnimationAct(action_name, loop) {
    if (this.spine.skeletonData) {
      this.spine.setAnimation(0, action_name, loop);
    }
  },
  setPosition: function setPosition(x, y) {
    if (this.node) {
      this.node.setPosition(x, y);
    }
  },
  showShadowUI: function showShadowUI(status) {
    if (status) {
      if (this.shadow == null) {
        var node = new cc.Node();
        this.sript_path = PathTool.getUIIconPath("common", "common_90095");
        LoaderManager.getInstance().loadRes(this.sript_path, function (res) {
          if (node && node.isValid) {
            node.addComponent(cc.Sprite).spriteFrame = res;
          }
        }.bind(this));
        this.node.addChild(node, -2);
        node.setPosition(0, -210);
        this.shadow = node;
      } else {
        this.shadow.active = true;
      }
    } else {
      if (this.shadow) {
        this.shadow.active = false;
      }
    }
  },
  // 移除对象,并且移除掉加载资源
  deleteMe: function deleteMe() {
    if (this.anima_path) LoaderManager.getInstance().releaseRes(this.anima_path);
    if (this.effect_path) LoaderManager.getInstance().releaseRes(this.effect_path);
    if (this.sript_path) LoaderManager.getInstance().releaseRes(this.sript_path);
    this.node.destroy();
  }
}); // 类型
 
BaseRole.type = {
  role: 0,
  //角色外观的       
  partner: 1,
  //伙伴的 在partner_data表里面的
  unit: 2,
  skin: 3 //显示皮肤外观
 
};
module.exports = BaseRole;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxiYXNlcm9sZS5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJCYXNlUm9sZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwibG9hZEZpbmlzaCIsImlzX2xvYWRfZmluaXNoIiwiYWN0aW9uX2RhdGEiLCJhbmltYV9wYXRoIiwiZWZmZWN0X3BhdGgiLCJzdGF0aWNzIiwidHlwZSIsImhlcm8iLCJ1bml0Iiwic2V0UGFyZW50IiwicGFyZW50Iiwibm9kZSIsIk5vZGUiLCJzZXRBbmNob3JQb2ludCIsInNwaW5lIiwiYWRkQ29tcG9uZW50Iiwic3AiLCJTa2VsZXRvbiIsImVmZmVjdF9uZCIsImVmZmVjdF9zayIsImFkZENoaWxkIiwic2V0RGF0YSIsInVuaXRfdHlwZSIsImJpZG9yZGF0YSIsImFjdGlvbl9uYW1lIiwibG9vcCIsInNjYWxlIiwic2V0dGluZyIsImVmZmVjdFNjYWxlIiwicm9sZSIsImNvbmZpZyIsIkNvbmZpZyIsImxvb2tzX2RhdGEiLCJkYXRhX2RhdGEiLCJrZXkiLCJVdGlscyIsImdldE5vcktleSIsInBhcnRuZXJfaWQiLCJzdGFyIiwic3Rhcl9jb25maWciLCJnZGF0YSIsIlBsYXllckFjdGlvbiIsInNob3ciLCJqcyIsImZvcm1hdFN0ciIsImljb19pZCIsInNob3dfZWZmZWN0Iiwic2tpbl9pZCIsInNraW5fY29uZmlnIiwicGFydG5lcl9za2luX2RhdGEiLCJkYXRhX3NraW5faW5mbyIsInJlc19pZCIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJwYXJ0bmVyIiwic3Rhcl9rZXkiLCJiaWQiLCJzdGFyX2NmZyIsInRlc3RfY2ZnIiwiZ2V0VW5pdENvbmZpZyIsInNwZWNpYWxCU01vZGVsIiwiTnVtYmVyIiwiYmF0dGxlX3N0YW5kIiwiYm9keV9pZCIsInNraW4iLCJlbmFibGVkIiwiTG9hZGVyTWFuYWdlciIsImdldEluc3RhbmNlIiwicmVsZWFzZVJlcyIsImxvYWRSZXMiLCJyZXMiLCJza2VsZXRvbkRhdGEiLCJzZXRBbmltYXRpb25BY3QiLCJiaW5kIiwiZWZmZWN0X3NkIiwic2V0QW5pbWF0aW9uIiwic2V0UG9zaXRpb24iLCJ4IiwieSIsInNob3dTaGFkb3dVSSIsInN0YXR1cyIsInNoYWRvdyIsInNyaXB0X3BhdGgiLCJnZXRVSUljb25QYXRoIiwiaXNWYWxpZCIsIlNwcml0ZSIsInNwcml0ZUZyYW1lIiwiYWN0aXZlIiwiZGVsZXRlTWUiLCJkZXN0cm95IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBRUEsSUFBSUMsUUFBUSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUNwQixhQUFTQyxTQURXO0FBRXBCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCLEtBQWxCLENBRGMsQ0FDa0I7QUFDbkMsR0FKbUI7QUFLcEJDLEVBQUFBLGNBQWMsRUFBRSxLQUxJO0FBTXBCQyxFQUFBQSxXQUFXLEVBQUUsSUFOTztBQU1pQjtBQUNyQ0MsRUFBQUEsVUFBVSxFQUFFLElBUFE7QUFRcEJDLEVBQUFBLFdBQVcsRUFBRSxJQVJPO0FBU3BCQyxFQUFBQSxPQUFPLEVBQUU7QUFDTEMsSUFBQUEsSUFBSSxFQUFFO0FBQ0ZDLE1BQUFBLElBQUksRUFBRSxDQURKO0FBRUZDLE1BQUFBLElBQUksRUFBRTtBQUZKO0FBREQsR0FUVztBQWdCcEJDLEVBQUFBLFNBQVMsRUFBRSxtQkFBVUMsTUFBVixFQUFrQjtBQUN6QixTQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxTQUFLQyxJQUFMLEdBQVksSUFBSWYsRUFBRSxDQUFDZ0IsSUFBUCxDQUFZLEVBQVosQ0FBWjtBQUNBLFNBQUtELElBQUwsQ0FBVUUsY0FBVixDQUF5QixHQUF6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QUFMLENBQVlNLE1BQVosR0FBc0IsSUFBdEI7QUFDSDtBQUNKLEtBZkQsTUFlTztBQUNILFVBQUksS0FBS04sTUFBVCxFQUFpQjtBQUNiLGFBQUtBLE1BQUwsQ0FBWU0sTUFBWixHQUFzQixLQUF0QjtBQUNIO0FBQ0o7QUFDSixHQXpNbUI7QUEwTXBCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixRQUFJLEtBQUtyRixVQUFULEVBQ0krRCxhQUFhLENBQUNDLFdBQWQsR0FBNEJDLFVBQTVCLENBQXVDLEtBQUtqRSxVQUE1QztBQUNKLFFBQUksS0FBS0MsV0FBVCxFQUNJOEQsYUFBYSxDQUFDQyxXQUFkLEdBQTRCQyxVQUE1QixDQUF1QyxLQUFLaEUsV0FBNUM7QUFDSixRQUFJLEtBQUs4RSxVQUFULEVBQ0loQixhQUFhLENBQUNDLFdBQWQsR0FBNEJDLFVBQTVCLENBQXVDLEtBQUtjLFVBQTVDO0FBQ0osU0FBS3ZFLElBQUwsQ0FBVThFLE9BQVY7QUFDSDtBQW5ObUIsQ0FBVCxDQUFmLEVBc05BOztBQUNBOUYsUUFBUSxDQUFDVyxJQUFULEdBQ0k7QUFDSXVCLEVBQUFBLElBQUksRUFBRSxDQURWO0FBQ2dCO0FBQ1p5QixFQUFBQSxPQUFPLEVBQUUsQ0FGYjtBQUVnQjtBQUNaOUMsRUFBQUEsSUFBSSxFQUFFLENBSFY7QUFJSXdELEVBQUFBLElBQUksRUFBRSxDQUpWLENBSWdCOztBQUpoQixDQURKO0FBUUEwQixNQUFNLENBQUNDLE9BQVAsR0FBaUJoRyxRQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6YCa55So5bGV56S66KeS6Imy5a+56LGhXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKVxuXG52YXIgQmFzZVJvbGUgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5sb2FkRmluaXNoID0gZmFsc2U7ICAgICAgICAvLyDmmK/lkKbliqDovb3lrozmiJBcbiAgICB9LFxuICAgIGlzX2xvYWRfZmluaXNoOiBmYWxzZSxcbiAgICBhY3Rpb25fZGF0YTogbnVsbCwgICAgICAgICAgICAgICAgICAgLy8g5bCa5pyq5Yib5bu65a6M5oiQ5LmL5YmN5pKt5pS+5Yqo5L2c55qE5pC65bim5pWw5o2uXG4gICAgYW5pbWFfcGF0aDogbnVsbCxcbiAgICBlZmZlY3RfcGF0aDogbnVsbCxcbiAgICBzdGF0aWNzOiB7XG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGhlcm86IDEsXG4gICAgICAgICAgICB1bml0OiAyLFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldFBhcmVudDogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5ub2RlID0gbmV3IGNjLk5vZGUoXCJcIik7XG4gICAgICAgIHRoaXMubm9kZS5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSk7XG4gICAgICAgIHRoaXMuc3BpbmUgPSB0aGlzLm5vZGUuYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgdmFyIGVmZmVjdF9uZCA9IG5ldyBjYy5Ob2RlKFwiXCIpO1xuICAgICAgICB0aGlzLmVmZmVjdF9zayA9IGVmZmVjdF9uZC5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICB0aGlzLnBhcmVudC5hZGRDaGlsZCh0aGlzLm5vZGUpO1xuICAgICAgICB0aGlzLm5vZGUuYWRkQ2hpbGQoZWZmZWN0X25kKTtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5pWw5o2uLOi/meS4quaYr+S4u+aOpeWPoyzmgKrniannsbvlnovlkozmgKrnialpZFxuICAgIHNldERhdGE6IGZ1bmN0aW9uICh1bml0X3R5cGUsIGJpZG9yZGF0YSwgYWN0aW9uX25hbWUsIGxvb3AsIHNjYWxlLCBzZXR0aW5nKSB7XG4gICAgICAgIC8vIGNjLmxvZyh1bml0X3R5cGUsIGJpZG9yZGF0YSwgYWN0aW9uX25hbWUsIGxvb3AsIHNjYWxlKVxuICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IG51bGw7XG4gICAgICAgIHZhciBlZmZlY3RfcGF0aCA9IG51bGw7XG4gICAgICAgIHNjYWxlID0gc2NhbGUgfHwgMTtcbiAgICAgICAgdGhpcy5ub2RlLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIHNldHRpbmcgPSBzZXR0aW5nIHx8IHt9O1xuICAgICAgICBsZXQgZWZmZWN0U2NhbGUgPSBzZXR0aW5nLnNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMuZWZmZWN0X3NrLm5vZGUuc2NhbGUgPSBlZmZlY3RTY2FsZTtcbiAgICAgICAgaWYgKHVuaXRfdHlwZSA9PSBCYXNlUm9sZS50eXBlLnJvbGUpIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcubG9va3NfZGF0YS5kYXRhX2RhdGFbYmlkb3JkYXRhXTtcbiAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KGNvbmZpZy5wYXJ0bmVyX2lkLCBjb25maWcuc3RhcilcbiAgICAgICAgICAgICAgICB2YXIgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIGtleSlcbiAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IGFjdGlvbl9uYW1lID8gYWN0aW9uX25hbWUgOiBQbGF5ZXJBY3Rpb24uc2hvdztcbiAgICAgICAgICAgICAgICBhbmltYV9wYXRoID0gY2MuanMuZm9ybWF0U3RyKFwic3BpbmUvJXMvJXMuYXRsYXNcIiwgY29uZmlnLmljb19pZCwgYWN0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFyX2NvbmZpZyAmJiBzdGFyX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbl9uYW1lID0gYWN0aW9uX25hbWUgPyBhY3Rpb25fbmFtZSA6IFBsYXllckFjdGlvbi5zaG93OyBcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5pbWFfcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzLyVzLmF0bGFzXCIsIHN0YXJfY29uZmlnLnNob3dfZWZmZWN0LCBhY3Rpb25fbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFyX2NvbmZpZy5zaG93X2VmZmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhdGggPSBcInNwaW5lL1wiICsgc3Rhcl9jb25maWcuc2hvd19lZmZlY3QgKyBcIi9hY3Rpb24uYXRsYXNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBza2luX2lkID0gY29uZmlnLnNraW5faWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbl9pZCA9PSAwICYmIHNldHRpbmcuc2tpbl9pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbl9pZCA9IHNldHRpbmcuc2tpbl9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tza2luX2lkXVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW5fY29uZmlnICYmIHNraW5fY29uZmlnLnJlc19pZCAhPSBudWxsICYmIHNraW5fY29uZmlnLnJlc19pZCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWFfcGF0aCA9IFwic3BpbmUvXCIgKyBza2luX2NvbmZpZy5yZXNfaWQgKyBcIi9zaG93LmF0bGFzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhdGggPSBcInNwaW5lL1wiICsgc2tpbl9jb25maWcuc2hvd19lZmZlY3QgKyBcIi9hY3Rpb24uYXRsYXNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9zaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1bml0X3R5cGUgPT0gQmFzZVJvbGUudHlwZS5wYXJ0bmVyKSB7XG4gICAgICAgICAgICAvLyDmtYvor5Xkvb/nlKhcbiAgICAgICAgICAgIHZhciBzdGFyX2tleSA9IGJpZG9yZGF0YS5iaWQgKyBcIl9cIiArIGJpZG9yZGF0YS5zdGFyO1xuICAgICAgICAgICAgdmFyIHN0YXJfY2ZnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfc3RhclwiLCBzdGFyX2tleSk7XG4gICAgICAgICAgICBhbmltYV9wYXRoID0gXCJzcGluZS9cIiArIHN0YXJfY2ZnLnJlc19pZCArIFwiL3Nob3cuYXRsYXNcIjtcblxuICAgICAgICAgICAgdmFyIHRlc3RfY2ZnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfYmFzZVwiLCBiaWRvcmRhdGEuYmlkKTtcblxuICAgICAgICAgICAgLy/oi7Hpm4Tnmq7ogqRpZFxuICAgICAgICAgICAgbGV0IHNraW5faWQgPSBzZXR0aW5nLnNraW5faWQ7XG4gICAgICAgICAgICBsZXQgc2tpbl9jb25maWcgPSBDb25maWcucGFydG5lcl9za2luX2RhdGEuZGF0YV9za2luX2luZm9bc2tpbl9pZF1cbiAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gbnVsbCAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGFuaW1hX3BhdGggPSBcInNwaW5lL1wiICsgc2tpbl9jb25maWcucmVzX2lkICsgXCIvc2hvdy5hdGxhc1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5Y2B5pif54m55pWIXG4gICAgICAgICAgICBpZiAoc3Rhcl9jZmcuc2hvd19lZmZlY3QpIHtcbiAgICAgICAgICAgICAgICBlZmZlY3RfcGF0aCA9IFwic3BpbmUvXCIgKyBzdGFyX2NmZy5zaG93X2VmZmVjdCArIFwiL2FjdGlvbi5hdGxhc1wiO1xuICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5zaG93X2VmZmVjdCAhPSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXRoID0gXCJzcGluZS9cIiArIHNraW5fY29uZmlnLnNob3dfZWZmZWN0ICsgXCIvYWN0aW9uLmF0bGFzXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3NrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cblxuICAgICAgICB9IGVsc2UgaWYgKHVuaXRfdHlwZSA9PSBCYXNlUm9sZS50eXBlLnVuaXQpIHtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBVdGlscy5nZXRVbml0Q29uZmlnKGJpZG9yZGF0YSk7XG4gICAgICAgICAgICBpZiAoUGF0aFRvb2wuc3BlY2lhbEJTTW9kZWwoTnVtYmVyKGJpZG9yZGF0YSkpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYmF0dGxlX3N0YW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYW5pbWFfcGF0aCA9IGNjLmpzLmZvcm1hdFN0cihcInNwaW5lLyVzLyVzLmF0bGFzXCIsIGNvbmZpZy5ib2R5X2lkLCBhY3Rpb25fbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdF90eXBlID09IEJhc2VSb2xlLnR5cGUuc2tpbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoYmlkb3JkYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgLy/mmL7npLrnmq7ogqTlpJbop4JcbiAgICAgICAgICAgICAgICBsZXQgc2tpbl9pZCA9IGJpZG9yZGF0YVxuICAgICAgICAgICAgICAgIGxldCBza2luX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3NraW5faW5mb1tza2luX2lkXVxuICAgICAgICAgICAgICAgIGlmIChza2luX2NvbmZpZyAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gbnVsbCAmJiBza2luX2NvbmZpZy5yZXNfaWQgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBhbmltYV9wYXRoID0gXCJzcGluZS9cIiArIHNraW5fY29uZmlnLnJlc19pZCArIFwiL3Nob3cuYXRsYXNcIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2tpbl9jb25maWcgJiYgc2tpbl9jb25maWcuc2hvd19lZmZlY3QgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGF0aCA9IFwic3BpbmUvXCIgKyBza2luX2NvbmZpZy5zaG93X2VmZmVjdCArIFwiL2FjdGlvbi5hdGxhc1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhbmltYV9wYXRoKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmFuaW1hX3BhdGggJiYgdGhpcy5hbmltYV9wYXRoICE9IGFuaW1hX3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXModGhpcy5hbmltYV9wYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9wYXRoICYmIHRoaXMuZWZmZWN0X3BhdGggIT0gZWZmZWN0X3BhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuZWZmZWN0X3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoYW5pbWFfcGF0aCwgKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNwaW5lLnNrZWxldG9uRGF0YSA9IHJlcztcbiAgICAgICAgICAgIHRoaXMuaXNfbG9hZF9maW5pc2ggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRBbmltYXRpb25BY3QoYWN0aW9uX25hbWUsIGxvb3ApO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBpZiAoZWZmZWN0X3BhdGgpIHtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGVmZmVjdF9wYXRoLCBmdW5jdGlvbiAoZWZmZWN0X3NkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2suc2tlbGV0b25EYXRhID0gZWZmZWN0X3NkO1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWZmZWN0X3BhdGggPSBlZmZlY3RfcGF0aDtcbiAgICAgICAgdGhpcy5hbmltYV9wYXRoID0gYW5pbWFfcGF0aDtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5Yqo5L2cLOWmguaenOaYr+WKoOi9veWujOaIkOS5i+WQjizpgqPkuYjnm7TmjqXmkq3mlL4s5ZCm5YiZ562J5Yqg6L295LmL5ZCO5pKt5pS+XG4gICAgc2V0QW5pbWF0aW9uOiBmdW5jdGlvbiAoYWN0aW9uX25hbWUsIGxvb3ApIHtcbiAgICAgICAgYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZSA/IGFjdGlvbl9uYW1lIDogUGxheWVyQWN0aW9uLnNob3c7XG4gICAgICAgIGlmIChsb29wID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzX2xvYWRfZmluaXNoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFuaW1hdGlvbkFjdChhY3Rpb25fbmFtZSwgbG9vcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbl9kYXRhID0geyBhY3Rpb25fbmFtZTogYWN0aW9uX25hbWUsIGxvb3A6IGxvb3AgfTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmkq3mlL7liqjkvZznmoTlhbfkvZPnu4boioJcbiAgICBzZXRBbmltYXRpb25BY3Q6IGZ1bmN0aW9uIChhY3Rpb25fbmFtZSwgbG9vcCkge1xuICAgICAgICBpZiAodGhpcy5zcGluZS5za2VsZXRvbkRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUuc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBsb29wKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRQb3NpdGlvbjogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlLnNldFBvc2l0aW9uKHgsIHkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzaG93U2hhZG93VUk6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG5ldyBjYy5Ob2RlKClcbiAgICAgICAgICAgICAgICB0aGlzLnNyaXB0X3BhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiY29tbW9uXCIsIFwiY29tbW9uXzkwMDk1XCIpXG4gICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXModGhpcy5zcmlwdF9wYXRoLCAoZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkQ29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUuYWRkQ2hpbGQobm9kZSwgLTIpXG4gICAgICAgICAgICAgICAgbm9kZS5zZXRQb3NpdGlvbigwLCAtMjEwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93ID0gbm9kZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvdy5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93LmFjdGl2ZSA9IChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8g56e76Zmk5a+56LGhLOW5tuS4lOenu+mZpOaOieWKoOi9vei1hOa6kFxuICAgIGRlbGV0ZU1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hX3BhdGgpXG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyh0aGlzLmFuaW1hX3BhdGgpO1xuICAgICAgICBpZiAodGhpcy5lZmZlY3RfcGF0aClcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKHRoaXMuZWZmZWN0X3BhdGgpO1xuICAgICAgICBpZiAodGhpcy5zcmlwdF9wYXRoKVxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXModGhpcy5zcmlwdF9wYXRoKTtcbiAgICAgICAgdGhpcy5ub2RlLmRlc3Ryb3koKTtcbiAgICB9LFxufSk7XG5cbi8vIOexu+Wei1xuQmFzZVJvbGUudHlwZSA9XG4gICAge1xuICAgICAgICByb2xlOiAwLCAgICAvL+inkuiJsuWkluingueahCAgICAgICBcbiAgICAgICAgcGFydG5lcjogMSwgLy/kvJnkvLTnmoQg5ZyocGFydG5lcl9kYXRh6KGo6YeM6Z2i55qEXG4gICAgICAgIHVuaXQ6IDIsXG4gICAgICAgIHNraW46IDMsICAgIC8v5pi+56S655qu6IKk5aSW6KeCXG4gICAgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VSb2xlO1xuIl19