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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/welfare/welfare_model.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, '59603epoM5B0qWPofuy3wHr', 'welfare_model');
// Scripts/mod/welfare/welfare_model.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2018-12-19 10:57:29
// --------------------------------------------------------------------
var RoleController = require("role_controller");
 
var WelfareConst = require("welfare_const");
 
var PartnersummonController = require("partnersummon_controller");
 
var ActionController = require("action_controller");
 
var VipController = require("vip_controller");
 
var WelfareModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {},
  initConfig: function initConfig() {
    this.daily_award_status = 1; //每日礼状态
  },
  //保存下月卡信息
  setYueka: function setYueka(data) {
    this.yueka_data = data;
  },
  getYueka: function getYueka() {
    return this.yueka_data;
  },
  //保存下今日充值次数
  setRechargeCount: function setRechargeCount(count) {
    this.recharge_num = count;
  },
  checkWelfareSubIsOpen: function checkWelfareSubIsOpen(id) {
    var config = gdata("holiday_client_data", "data_info", [id]);
 
    if (config) {
      var role_vo = RoleController.getInstance().getRoleVo();
 
      if (IS_SHOW_CHARGE || IS_SHOW_CHARGE == false && config.is_verifyios == 1) {
        if (role_vo.lev >= config.open_lev) {
          return true;
        }
      }
    }
 
    return false;
  },
  //判断月卡状态
  getYuekaStatus: function getYuekaStatus() {
    var can_charge = true;
 
    if (!this.checkWelfareSubIsOpen(WelfareConst.WelfareIcon.yueka)) {
      can_charge = false;
    } else {
      if (this.yueka_data == null) {
        can_charge = true;
      } else {
        var cur_time = gcore.SmartSocket.getTime();
 
        if (this.yueka_data.card1_end_time && this.yueka_data.card2_end_time) {
          can_charge = this.yueka_data.card1_end_time < cur_time || this.yueka_data.card2_end_time < cur_time;
        }
      }
    }
 
    return can_charge;
  },
  getRechargeCount: function getRechargeCount() {
    return this.recharge_num || 0;
  },
 
  /*[[
      {"钻石召唤", 0}, --常驻类型
      {"月耀召唤", 200},
      {"神圣召唤", 300},
      {"天辉召唤", 400}
  ]]*/
  //逆向排序
  reverseTable: function reverseTable(tab) {
    // var tmp = {};
    // for (var i = 1; i <= Utils.getArrLen(tab); i++) {
    //     var key = Utils.getArrLen(tab);
    //     // tmp[i] = 
    // }
    return tab.reverse();
  },
  getPartnerSummonData: function getPartnerSummonData() {
    var config = Config.recruit_award_data.data_huoli;
    var list1 = {};
    var list2 = {};
    var list3 = {};
    var list4 = {}; //本地数据分类
 
    for (var i in config) {
      var v = config[i];
 
      if (v.type == 0) {
        list1.push(v);
      } else if (v.type == 200) {
        list2.push(v);
      } else if (v.type == 300) {
        list3.push(v);
      } else if (v.type == 400) {
        list4.push(v);
      }
    } //获取开启的卡库
 
 
    var list = PartnersummonController.getInstance().getModel().getOpenSummonData(); //开启的
 
    var data = [];
 
    for (var i in list) {
      var v = list[i];
 
      if (v == 200) {
        for (var k in list2) {
          data.push(list2[k]);
        }
      } else if (v == 300) {
        for (var k in list3) {
          data.push(list3[k]);
        }
      } else if (v == 400) {
        for (var k in list4) {
          data.push(list4[k]);
        }
      }
    }
 
    data = this.reverseTable(data);
 
    for (var i in data) {
      list1.push(data[i]);
    }
 
    list1 = this.reverseTable(list1);
    return list1;
  },
  //接收服务端的数据  返回: 服务端的数据,本地配置表的数据
  getServeData: function getServeData(data1) {
    var list = [];
    var data2 = this.getPartnerSummonData(); //抽取出开启的状态
 
    var open_data = [];
 
    for (var i in data1) {
      var v = data1[i];
 
      for (var k in data2) {
        var m = data2[k];
 
        if (v.id == m.id) {
          open_data.push(v);
        }
      }
    }
 
    var model = ActionController.getInstance().getModel();
    open_data = model.getReawardSortList(open_data);
 
    for (var i in open_data) {
      var v = open_data[i];
 
      for (var k in data2) {
        var val = data2[k];
 
        if (v.id == val.id) {
          list.push(val);
        }
      }
    }
 
    this.setPartnerWelfarCallRedPoint(open_data);
    return {
      open_data: open_data,
      list: list
    };
  },
  setPartnerWelfarCallRedPoint: function setPartnerWelfarCallRedPoint(data) {
    this.callPartnerData = data;
  },
  getPartnerWelfarCallRedPoint: function getPartnerWelfarCallRedPoint() {
    if (this.callPartnerData && Utils.next(this.callPartnerData) != null) {
      var bool = false;
 
      for (var i in this.callPartnerData) {
        var v = this.callPartnerData[i];
 
        if (v.status == 1) {
          bool = true;
          break;
        }
      }
 
      return bool;
    }
  },
  //召唤界面是否显示入口
  setPartnerSunmonWelfarData: function setPartnerSunmonWelfarData(bool) {
    this.summonWelfarBool = bool;
  },
  getPartnerSunmonWelfarData: function getPartnerSunmonWelfarData() {
    var bool = false;
 
    if (this.summonWelfarBool == 1) {
      bool = true;
    }
 
    return bool;
  },
  //问卷调查
  setQuestOpenData: function setQuestOpenData(data) {
    this.questOpenData = data;
  },
  getQuestOpenData: function getQuestOpenData() {
    return this.questOpenData;
  },
 
  /*周、月循环礼包
  --[[
  {"周循环", 1}
  {"月循环", 2}
  ]]*/
  setWeekMonthSortData: function setWeekMonthSortData() {
    var data = Config.misc_data.data_cycle_gift_info;
    this.weekGiftData = [];
    this.monthGiftData = [];
 
    for (var i in data) {
      var v = data[i];
 
      if (v) {
        for (var k in v) {
          var obj = v[k];
 
          if (obj.gift_type == 1) {
            this.weekGiftData.push(obj);
          } else if (obj.gift_type == 2) {
            this.monthGiftData.push(obj);
          }
        }
      }
    }
 
    this.weekGiftData.sort(Utils.tableLowerSorter(["charge_id"]));
    this.monthGiftData.sort(Utils.tableLowerSorter(["charge_id"]));
  },
  getWeekMonthSortData: function getWeekMonthSortData(index) {
    if (!this.weekGiftData || !this.monthGiftData) return;
 
    if (index == 1) {
      return this.weekGiftData || [];
    } else if (index == 2) {
      return this.monthGiftData || [];
    }
  },
  //每日礼领取状态
  setDailyAwardStatus: function setDailyAwardStatus(status) {
    this.daily_award_status = status;
 
    if (status == 0) {
      VipController.getInstance().setTipsVIPStstus(VIPREDPOINT.DAILY_AWARD, true);
    } else {
      VipController.getInstance().setTipsVIPStstus(VIPREDPOINT.DAILY_AWARD, false);
    }
  },
  getDailyAwardStatus: function getDailyAwardStatus() {
    return this.daily_award_status;
  },
  //shrh------
  setShareAward: function setShareAward(data) {
    this.share_award = data;
  },
  getShareAward: function getShareAward() {
    return this.share_award || [];
  },
  setShareAwardStatus: function setShareAwardStatus(status) {
    this.share_award_status = status;
  },
  getShareAwardStatus: function getShareAwardStatus() {
    return this.share_award_status || 0;
  },
  setSubscriptionAward: function setSubscriptionAward(data) {
    this.subscription_award = data;
  },
  //设置关注奖励领取状态,1是领取了
  setSubscriptionAwardStatus: function setSubscriptionAwardStatus(status) {
    this.subscription_award_status = status;
  },
  getSubscriptionAwardStatus: function getSubscriptionAwardStatus() {
    return this.subscription_award_status || 0;
  },
  getSubscriptionAward: function getSubscriptionAward() {
    return this.subscription_award || [];
  },
  //shwx-----
  setCollectAward: function setCollectAward(data) {
    this.collect_award = data;
  },
  getCollectAward: function getCollectAward() {
    return this.collect_award || [];
  },
  setCollectAwardStatus: function setCollectAwardStatus(status) {
    this.collect_award_status = status;
  },
  getCollectAwardStatus: function getCollectAwardStatus() {
    return this.collect_award_status || 0;
  }
});
module.exports = WelfareModel;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx3ZWxmYXJlXFx3ZWxmYXJlX21vZGVsLmpzIl0sIm5hbWVzIjpbIlJvbGVDb250cm9sbGVyIiwicmVxdWlyZSIsIldlbGZhcmVDb25zdCIsIlBhcnRuZXJzdW1tb25Db250cm9sbGVyIiwiQWN0aW9uQ29udHJvbGxlciIsIlZpcENvbnRyb2xsZXIiLCJXZWxmYXJlTW9kZWwiLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsImluaXRDb25maWciLCJkYWlseV9hd2FyZF9zdGF0dXMiLCJzZXRZdWVrYSIsImRhdGEiLCJ5dWVrYV9kYXRhIiwiZ2V0WXVla2EiLCJzZXRSZWNoYXJnZUNvdW50IiwiY291bnQiLCJyZWNoYXJnZV9udW0iLCJjaGVja1dlbGZhcmVTdWJJc09wZW4iLCJpZCIsImNvbmZpZyIsImdkYXRhIiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwiSVNfU0hPV19DSEFSR0UiLCJpc192ZXJpZnlpb3MiLCJsZXYiLCJvcGVuX2xldiIsImdldFl1ZWthU3RhdHVzIiwiY2FuX2NoYXJnZSIsIldlbGZhcmVJY29uIiwieXVla2EiLCJjdXJfdGltZSIsImdjb3JlIiwiU21hcnRTb2NrZXQiLCJnZXRUaW1lIiwiY2FyZDFfZW5kX3RpbWUiLCJjYXJkMl9lbmRfdGltZSIsImdldFJlY2hhcmdlQ291bnQiLCJyZXZlcnNlVGFibGUiLCJ0YWIiLCJyZXZlcnNlIiwiZ2V0UGFydG5lclN1bW1vbkRhdGEiLCJDb25maWciLCJyZWNydWl0X2F3YXJkX2RhdGEiLCJkYXRhX2h1b2xpIiwibGlzdDEiLCJsaXN0MiIsImxpc3QzIiwibGlzdDQiLCJpIiwidiIsInR5cGUiLCJwdXNoIiwibGlzdCIsImdldE1vZGVsIiwiZ2V0T3BlblN1bW1vbkRhdGEiLCJrIiwiZ2V0U2VydmVEYXRhIiwiZGF0YTEiLCJkYXRhMiIsIm9wZW5fZGF0YSIsIm0iLCJtb2RlbCIsImdldFJlYXdhcmRTb3J0TGlzdCIsInZhbCIsInNldFBhcnRuZXJXZWxmYXJDYWxsUmVkUG9pbnQiLCJjYWxsUGFydG5lckRhdGEiLCJnZXRQYXJ0bmVyV2VsZmFyQ2FsbFJlZFBvaW50IiwiVXRpbHMiLCJuZXh0IiwiYm9vbCIsInN0YXR1cyIsInNldFBhcnRuZXJTdW5tb25XZWxmYXJEYXRhIiwic3VtbW9uV2VsZmFyQm9vbCIsImdldFBhcnRuZXJTdW5tb25XZWxmYXJEYXRhIiwic2V0UXVlc3RPcGVuRGF0YSIsInF1ZXN0T3BlbkRhdGEiLCJnZXRRdWVzdE9wZW5EYXRhIiwic2V0V2Vla01vbnRoU29ydERhdGEiLCJtaXNjX2RhdGEiLCJkYXRhX2N5Y2xlX2dpZnRfaW5mbyIsIndlZWtHaWZ0RGF0YSIsIm1vbnRoR2lmdERhdGEiLCJvYmoiLCJnaWZ0X3R5cGUiLCJzb3J0IiwidGFibGVMb3dlclNvcnRlciIsImdldFdlZWtNb250aFNvcnREYXRhIiwiaW5kZXgiLCJzZXREYWlseUF3YXJkU3RhdHVzIiwic2V0VGlwc1ZJUFN0c3R1cyIsIlZJUFJFRFBPSU5UIiwiREFJTFlfQVdBUkQiLCJnZXREYWlseUF3YXJkU3RhdHVzIiwic2V0U2hhcmVBd2FyZCIsInNoYXJlX2F3YXJkIiwiZ2V0U2hhcmVBd2FyZCIsInNldFNoYXJlQXdhcmRTdGF0dXMiLCJzaGFyZV9hd2FyZF9zdGF0dXMiLCJnZXRTaGFyZUF3YXJkU3RhdHVzIiwic2V0U3Vic2NyaXB0aW9uQXdhcmQiLCJzdWJzY3JpcHRpb25fYXdhcmQiLCJzZXRTdWJzY3JpcHRpb25Bd2FyZFN0YXR1cyIsInN1YnNjcmlwdGlvbl9hd2FyZF9zdGF0dXMiLCJnZXRTdWJzY3JpcHRpb25Bd2FyZFN0YXR1cyIsImdldFN1YnNjcmlwdGlvbkF3YXJkIiwic2V0Q29sbGVjdEF3YXJkIiwiY29sbGVjdF9hd2FyZCIsImdldENvbGxlY3RBd2FyZCIsInNldENvbGxlY3RBd2FyZFN0YXR1cyIsImNvbGxlY3RfYXdhcmRfc3RhdHVzIiwiZ2V0Q29sbGVjdEF3YXJkU3RhdHVzIiwibW9kdWxlIiwi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LHlCQUFMLElBQWtDLENBQXpDO0FBQ0gsR0FqUnVCO0FBbVJ4QkUsRUFBQUEsb0JBQW9CLEVBQUUsZ0NBQVk7QUFDOUIsV0FBTyxLQUFLSixrQkFBTCxJQUEyQixFQUFsQztBQUNILEdBclJ1QjtBQXVSeEI7QUFDQUssRUFBQUEsZUFBZSxFQUFFLHlCQUFVaEcsSUFBVixFQUFnQjtBQUM3QixTQUFLaUcsYUFBTCxHQUFxQmpHLElBQXJCO0FBQ0gsR0ExUnVCO0FBNFJ4QmtHLEVBQUFBLGVBQWUsRUFBRSwyQkFBWTtBQUN6QixXQUFPLEtBQUtELGFBQUwsSUFBc0IsRUFBN0I7QUFDSCxHQTlSdUI7QUFnU3hCRSxFQUFBQSxxQkFBcUIsRUFBRSwrQkFBVXRDLE1BQVYsRUFBa0I7QUFDckMsU0FBS3VDLG9CQUFMLEdBQTRCdkMsTUFBNUI7QUFDSCxHQWxTdUI7QUFvU3hCd0MsRUFBQUEscUJBQXFCLEVBQUMsaUNBQVU7QUFDNUIsV0FBTyxLQUFLRCxvQkFBTCxJQUE2QixDQUFwQztBQUNIO0FBdFN1QixDQUFULENBQW5CO0FBeVNBRSxNQUFNLENBQUNDLE9BQVAsR0FBaUIvRyxZQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOC0xMi0xOSAxMDo1NzoyOVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgV2VsZmFyZUNvbnN0ID0gcmVxdWlyZShcIndlbGZhcmVfY29uc3RcIik7XG52YXIgUGFydG5lcnN1bW1vbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwicGFydG5lcnN1bW1vbl9jb250cm9sbGVyXCIpO1xudmFyIEFjdGlvbkNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIik7XG52YXIgVmlwQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ2aXBfY29udHJvbGxlclwiKTtcblxudmFyIFdlbGZhcmVNb2RlbCA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGFpbHlfYXdhcmRfc3RhdHVzID0gMS8v5q+P5pel56S854q25oCBXG4gICAgfSxcblxuICAgIC8v5L+d5a2Y5LiL5pyI5Y2h5L+h5oGvXG4gICAgc2V0WXVla2E6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMueXVla2FfZGF0YSA9IGRhdGE7XG4gICAgfSxcblxuICAgIGdldFl1ZWthOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnl1ZWthX2RhdGE7XG4gICAgfSxcblxuICAgIC8v5L+d5a2Y5LiL5LuK5pel5YWF5YC85qyh5pWwXG4gICAgc2V0UmVjaGFyZ2VDb3VudDogZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgIHRoaXMucmVjaGFyZ2VfbnVtID0gY291bnQ7XG4gICAgfSxcblxuICAgIGNoZWNrV2VsZmFyZVN1YklzT3BlbjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImhvbGlkYXlfY2xpZW50X2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW2lkXSk7XG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIGlmIChJU19TSE9XX0NIQVJHRSB8fCAoSVNfU0hPV19DSEFSR0UgPT0gZmFsc2UgJiYgY29uZmlnLmlzX3ZlcmlmeWlvcyA9PSAxKSkge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvLmxldiA+PSBjb25maWcub3Blbl9sZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIC8v5Yik5pat5pyI5Y2h54q25oCBXG4gICAgZ2V0WXVla2FTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbl9jaGFyZ2UgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tXZWxmYXJlU3ViSXNPcGVuKFdlbGZhcmVDb25zdC5XZWxmYXJlSWNvbi55dWVrYSkpIHtcbiAgICAgICAgICAgIGNhbl9jaGFyZ2UgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnl1ZWthX2RhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbl9jaGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VyX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMueXVla2FfZGF0YS5jYXJkMV9lbmRfdGltZSAmJiB0aGlzLnl1ZWthX2RhdGEuY2FyZDJfZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuX2NoYXJnZSA9ICh0aGlzLnl1ZWthX2RhdGEuY2FyZDFfZW5kX3RpbWUgPCBjdXJfdGltZSkgfHwgKHRoaXMueXVla2FfZGF0YS5jYXJkMl9lbmRfdGltZSA8IGN1cl90aW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbl9jaGFyZ2VcbiAgICB9LFxuXG4gICAgZ2V0UmVjaGFyZ2VDb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNoYXJnZV9udW0gfHwgMFxuICAgIH0sXG5cbiAgICAvKltbXG4gICAgICAgIHtcIumSu+efs+WPrOWUpFwiLCAwfSwgLS3luLjpqbvnsbvlnotcbiAgICAgICAge1wi5pyI6ICA5Y+s5ZSkXCIsIDIwMH0sXG4gICAgICAgIHtcIuelnuWco+WPrOWUpFwiLCAzMDB9LFxuICAgICAgICB7XCLlpKnovonlj6zllKRcIiwgNDAwfVxuICAgIF1dKi9cblxuICAgIC8v6YCG5ZCR5o6S5bqPXG4gICAgcmV2ZXJzZVRhYmxlOiBmdW5jdGlvbiAodGFiKSB7XG4gICAgICAgIC8vIHZhciB0bXAgPSB7fTtcbiAgICAgICAgLy8gZm9yICh2YXIgaSA9IDE7IGkgPD0gVXRpbHMuZ2V0QXJyTGVuKHRhYik7IGkrKykge1xuICAgICAgICAvLyAgICAgdmFyIGtleSA9IFV0aWxzLmdldEFyckxlbih0YWIpO1xuICAgICAgICAvLyAgICAgLy8gdG1wW2ldID0gXG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHRhYi5yZXZlcnNlKClcbiAgICB9LFxuXG4gICAgZ2V0UGFydG5lclN1bW1vbkRhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5yZWNydWl0X2F3YXJkX2RhdGEuZGF0YV9odW9saTtcbiAgICAgICAgdmFyIGxpc3QxID0ge307XG4gICAgICAgIHZhciBsaXN0MiA9IHt9O1xuICAgICAgICB2YXIgbGlzdDMgPSB7fTtcbiAgICAgICAgdmFyIGxpc3Q0ID0ge307XG4gICAgICAgIC8v5pys5Zyw5pWw5o2u5YiG57G7XG4gICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgdiA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgIGlmICh2LnR5cGUgPT0gMCkge1xuICAgICAgICAgICAgICAgIGxpc3QxLnB1c2godik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYudHlwZSA9PSAyMDApIHtcbiAgICAgICAgICAgICAgICBsaXN0Mi5wdXNoKHYpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2LnR5cGUgPT0gMzAwKSB7XG4gICAgICAgICAgICAgICAgbGlzdDMucHVzaCh2KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi50eXBlID09IDQwMCkge1xuICAgICAgICAgICAgICAgIGxpc3Q0LnB1c2godilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+iOt+WPluW8gOWQr+eahOWNoeW6k1xuICAgICAgICB2YXIgbGlzdCA9IFBhcnRuZXJzdW1tb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRPcGVuU3VtbW9uRGF0YSgpO1xuICAgICAgICAvL+W8gOWQr+eahFxuICAgICAgICB2YXIgZGF0YSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gbGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ID09IDIwMCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbGlzdDIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKGxpc3QyW2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gMzAwKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBsaXN0Mykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2gobGlzdDNba10pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IDQwMCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbGlzdDQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKGxpc3Q0W2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhID0gdGhpcy5yZXZlcnNlVGFibGUoZGF0YSk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkge1xuICAgICAgICAgICAgbGlzdDEucHVzaChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBsaXN0MSA9IHRoaXMucmV2ZXJzZVRhYmxlKGxpc3QxKTtcbiAgICAgICAgcmV0dXJuIGxpc3QxXG4gICAgfSxcblxuICAgIC8v5o6l5pS25pyN5Yqh56uv55qE5pWw5o2uICDov5Tlm57vvJog5pyN5Yqh56uv55qE5pWw5o2u77yM5pys5Zyw6YWN572u6KGo55qE5pWw5o2uXG4gICAgZ2V0U2VydmVEYXRhOiBmdW5jdGlvbiAoZGF0YTEpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgdmFyIGRhdGEyID0gdGhpcy5nZXRQYXJ0bmVyU3VtbW9uRGF0YSgpO1xuICAgICAgICAvL+aKveWPluWHuuW8gOWQr+eahOeKtuaAgVxuICAgICAgICB2YXIgb3Blbl9kYXRhID0gW107XG4gICAgICAgIGZvciAodmFyIGkgaW4gZGF0YTEpIHtcbiAgICAgICAgICAgIHZhciB2ID0gZGF0YTFbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIGRhdGEyKSB7XG4gICAgICAgICAgICAgICAgdmFyIG0gPSBkYXRhMltrXTtcbiAgICAgICAgICAgICAgICBpZiAodi5pZCA9PSBtLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5fZGF0YS5wdXNoKHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtb2RlbCA9IEFjdGlvbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpO1xuICAgICAgICBvcGVuX2RhdGEgPSBtb2RlbC5nZXRSZWF3YXJkU29ydExpc3Qob3Blbl9kYXRhKTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBvcGVuX2RhdGEpIHtcbiAgICAgICAgICAgIHZhciB2ID0gb3Blbl9kYXRhW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhMikge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBkYXRhMltrXTtcbiAgICAgICAgICAgICAgICBpZiAodi5pZCA9PSB2YWwuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHZhbClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQYXJ0bmVyV2VsZmFyQ2FsbFJlZFBvaW50KG9wZW5fZGF0YSk7XG4gICAgICAgIHJldHVybiB7IG9wZW5fZGF0YTogb3Blbl9kYXRhLCBsaXN0OiBsaXN0IH1cbiAgICB9LFxuXG4gICAgc2V0UGFydG5lcldlbGZhckNhbGxSZWRQb2ludDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jYWxsUGFydG5lckRhdGEgPSBkYXRhO1xuICAgIH0sXG5cbiAgICBnZXRQYXJ0bmVyV2VsZmFyQ2FsbFJlZFBvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxQYXJ0bmVyRGF0YSAmJiBVdGlscy5uZXh0KHRoaXMuY2FsbFBhcnRuZXJEYXRhKSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgYm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmNhbGxQYXJ0bmVyRGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5jYWxsUGFydG5lckRhdGFbaV07XG4gICAgICAgICAgICAgICAgaWYgKHYuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJvb2xcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WPrOWUpOeVjOmdouaYr+WQpuaYvuekuuWFpeWPo1xuICAgIHNldFBhcnRuZXJTdW5tb25XZWxmYXJEYXRhOiBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICB0aGlzLnN1bW1vbldlbGZhckJvb2wgPSBib29sO1xuICAgIH0sXG5cbiAgICBnZXRQYXJ0bmVyU3VubW9uV2VsZmFyRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYm9vbCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdW1tb25XZWxmYXJCb29sID09IDEpIHtcbiAgICAgICAgICAgIGJvb2wgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib29sXG4gICAgfSxcblxuICAgIC8v6Zeu5Y236LCD5p+lXG4gICAgc2V0UXVlc3RPcGVuRGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5xdWVzdE9wZW5EYXRhID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0UXVlc3RPcGVuRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdE9wZW5EYXRhO1xuICAgIH0sXG5cbiAgICAvKuWRqOOAgeaciOW+queOr+ekvOWMhVxuICAgIC0tW1tcbiAgICB7XCLlkajlvqrnjq9cIiwgMX1cbiAgICB7XCLmnIjlvqrnjq9cIiwgMn1cbiAgICBdXSovXG4gICAgc2V0V2Vla01vbnRoU29ydERhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBDb25maWcubWlzY19kYXRhLmRhdGFfY3ljbGVfZ2lmdF9pbmZvO1xuICAgICAgICB0aGlzLndlZWtHaWZ0RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLm1vbnRoR2lmdERhdGEgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gdltrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5naWZ0X3R5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrR2lmdERhdGEucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iai5naWZ0X3R5cGUgPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aEdpZnREYXRhLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtHaWZ0RGF0YS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiY2hhcmdlX2lkXCJdKSk7XG4gICAgICAgIHRoaXMubW9udGhHaWZ0RGF0YS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiY2hhcmdlX2lkXCJdKSk7XG4gICAgfSxcblxuICAgIGdldFdlZWtNb250aFNvcnREYXRhOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLndlZWtHaWZ0RGF0YSB8fCAhdGhpcy5tb250aEdpZnREYXRhKSByZXR1cm5cbiAgICAgICAgaWYgKGluZGV4ID09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlZWtHaWZ0RGF0YSB8fCBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb250aEdpZnREYXRhIHx8IFtdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5q+P5pel56S86aKG5Y+W54q25oCBXG4gICAgc2V0RGFpbHlBd2FyZFN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICB0aGlzLmRhaWx5X2F3YXJkX3N0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7XG4gICAgICAgICAgICBWaXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0VGlwc1ZJUFN0c3R1cyhWSVBSRURQT0lOVC5EQUlMWV9BV0FSRCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBWaXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0VGlwc1ZJUFN0c3R1cyhWSVBSRURQT0lOVC5EQUlMWV9BV0FSRCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldERhaWx5QXdhcmRTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGFpbHlfYXdhcmRfc3RhdHVzO1xuICAgIH0sXG5cblxuICAgIC8vc2hyaC0tLS0tLVxuICAgIHNldFNoYXJlQXdhcmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuc2hhcmVfYXdhcmQgPSBkYXRhO1xuICAgIH0sXG5cbiAgICBnZXRTaGFyZUF3YXJkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlX2F3YXJkIHx8IFtdO1xuICAgIH0sXG5cbiAgICBzZXRTaGFyZUF3YXJkU3RhdHVzOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuc2hhcmVfYXdhcmRfc3RhdHVzID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICBnZXRTaGFyZUF3YXJkU3RhdHVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlX2F3YXJkX3N0YXR1cyB8fCAwO1xuICAgIH0sXG5cbiAgICBzZXRTdWJzY3JpcHRpb25Bd2FyZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25fYXdhcmQgPSBkYXRhXG4gICAgfSxcblxuICAgIC8v6K6+572u5YWz5rOo5aWW5Yqx6aKG5Y+W54q25oCBLDHmmK/pooblj5bkuoZcbiAgICBzZXRTdWJzY3JpcHRpb25Bd2FyZFN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbl9hd2FyZF9zdGF0dXMgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFN1YnNjcmlwdGlvbkF3YXJkU3RhdHVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbl9hd2FyZF9zdGF0dXMgfHwgMDtcbiAgICB9LFxuXG4gICAgZ2V0U3Vic2NyaXB0aW9uQXdhcmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uX2F3YXJkIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvL3Nod3gtLS0tLVxuICAgIHNldENvbGxlY3RBd2FyZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0X2F3YXJkID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0Q29sbGVjdEF3YXJkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RfYXdhcmQgfHwgW107XG4gICAgfSxcblxuICAgIHNldENvbGxlY3RBd2FyZFN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICB0aGlzLmNvbGxlY3RfYXdhcmRfc3RhdHVzID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICBnZXRDb2xsZWN0QXdhcmRTdGF0dXM6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdF9hd2FyZF9zdGF0dXMgfHwgMDtcbiAgICB9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2VsZmFyZU1vZGVsOyJdfQ==