difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/chat/chat_controller.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, 'bfba6w+qEdKqbSx0rq3BbHq', 'chat_controller');
// Scripts/mod/chat/chat_controller.js
 
"use strict";
 
var ChatConst = require("chat_const");
 
var ChatController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {
    var ChatModel = require("chat_model");
 
    this.model = new ChatModel(this);
    this.model.initConfig();
    this.chat_time = {};
  },
  registerEvents: function registerEvents() {
    this.init_role_event = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
      gcore.GlobalEvent.unbind(this.init_role_event);
      this.model.initPrivatreTargets();
    }.bind(this));
  },
  openChatPanel: function openChatPanel(channel, form, data) {
    var open_parame = {};
 
    if (!this.chat_window) {
      var ChatWindow = require("chat_window");
 
      this.chat_window = new ChatWindow();
    }
 
    open_parame.channel = form;
 
    if (form == "friend") {
      this.model.addPrivateTarget(data);
      open_parame.channel = ChatConst.Channel.Friend;
      open_parame.friend_data = data;
    }
 
    if (!this.chat_window.getVisible()) {
      this.chat_window.setVisible(true, open_parame);
    } else {
      this.chat_window.open(open_parame);
    }
  },
  closeChatPanel: function closeChatPanel() {
    if (this.chat_window) {
      var PromptController = require("prompt_controller");
 
      var PromptTypeConst = require("prompt_type_const");
 
      PromptController.getInstance().getModel().removePromptDataByTpye(PromptTypeConst.Private_chat);
      PromptController.getInstance().getModel().removePromptDataByTpye(PromptTypeConst.At_notice); // this.chat_window.close();
      // this.chat_window = null;
 
      this.chat_window.setVisible(false);
 
      var MainUIController = require("mainui_controller");
 
      MainUIController.getInstance().showChatBtn(true);
    }
  },
  initData: function initData() {},
  getModel: function getModel() {
    return this.model;
  },
  initConfig: function initConfig() {
    var ChatModel = require("chat_model");
 
    this.model = new ChatModel();
    this.model.initConfig();
    this.is_first = true;
    this.pro_12766 = true;
    this.stack_id = 0;
  },
  registerProtocals: function registerProtocals() {
    this.RegisterProtocal(12720, this.handle12720); // 私聊
 
    this.RegisterProtocal(12721, this.handle12721); // 推送私聊消息
 
    this.RegisterProtocal(12722, this.handle12722); // 登陆推送私聊信息
 
    this.RegisterProtocal(12725, this.handle12725); // 语音信息
 
    this.RegisterProtocal(12726, this.handle12726); // 下载语音信息
 
    this.RegisterProtocal(12741, this.handle12741); // 提示
 
    this.RegisterProtocal(12743, this.handle12743); // 系统提示&聊天提示
 
    this.RegisterProtocal(12799, this.handle12799); // 消息发送
 
    this.RegisterProtocal(12761, this.handle12761); // 接受通用聊天
 
    this.RegisterProtocal(12762, this.handle12762); // 发送通用聊天
 
    this.RegisterProtocal(12763, this.handle12763); // 服务端分发翻译
 
    this.RegisterProtocal(12766, this.handle12766); // 登录聊天记录
 
    this.RegisterProtocal(12771, this.handle12771); // 聊天玩家队伍id
 
    this.RegisterProtocal(12767, this.handle12767); // 聊天@
 
    this.RegisterProtocal(12768, this.handle12768); // 已查看
  },
  isChatOpen: function isChatOpen() {
    if (this.chat_window) {
      return this.chat_window.getVisible();
    }
 
    return false;
  },
 
  /**
   * 发送翻译后的文字消息
   * @author zhanghuxing 2019-01-03
   * @param  {[type]} msg       [description]
   * @param  {[type]} channel   [description]
   * @param  {[type]} taken_obj [description]
   * @return {[type]}           [description]
   */
  sendVoidMsg: function sendVoidMsg(msg, channel, taken_obj) {
    if (channel == ChatConst.Channel.Friend) {
      this.sender12720();
    } else {
      this.sender12762();
    }
  },
 
  /**
   * 发送文字信息
   * @author zhanghuxing 2019-01-03
   * @param  {[type]} msg       [description]
   * @param  {[type]} channel   频道
   * @param  {[type]} taken_obj [description]
   * @param  {[type]} len       [description]
   * @return {[type]}           [description]
   */
  sendMessage: function sendMessage(channel, msg, len, to_srv_id, to_rid, name) {
    cc.log("chat__________", msg, channel, len, to_srv_id, to_rid);
 
    if (channel == ChatConst.Channel.Friend) {
      this.sender12720(to_srv_id, to_rid, msg, len, name);
    } else {
      this.sender12762(channel, msg, len);
    }
  },
  sender12720: function sender12720(to_srv_id, to_rid, msg, len, name) {
    // 发起私聊
    var msg_data = {};
    msg_data.to_srv_id = to_srv_id;
    msg_data.to_rid = to_rid;
    msg_data.msg = msg;
    msg_data.len = len;
    this.SendProtocal(12720, msg_data); // cc.log("sl---------------",to_rid.split("_"))
    //爱微游渠道聊天监控
 
    if (window.CHANNEL == "AIWEIYOU_PID") {
      var rid = null;
      to_rid = String(to_rid);
      var arr = to_rid.split("_");
      rid = arr[1];
      sdk.chatMonitor({
        to_srv_id: to_srv_id,
        to_rid: rid,
        type: 1,
        //1表示私聊
        name: name,
        msg: msg
      });
    }
  },
  handle12720: function handle12720(data) {
    // 私聊失败提示
    cc.log("私聊失败");
    cc.log(data);
 
    if (data.code == 0) {
      message(data.msg);
    }
  },
  handle12721: function handle12721(data) {
    // 收到私聊消息
    cc.log("私聊消息");
    cc.log(data);
    if (data) this.model.addPrivateMsg(data);
  },
  handle12722: function handle12722(msg_datas) {
    // 登陆推送离线私聊信息
    cc.log("离线私聊消息");
    cc.log(msg_datas);
 
    if (msg_datas && msg_datas.offline_list.length > 0) {
      var offline_Info = null;
 
      for (var offline_i = 0; offline_i < msg_datas.offline_list.length; offline_i++) {
        offline_Info = msg_datas.offline_list[offline_i];
 
        if (offline_Info.msg_list && offline_Info.msg_list) {
          for (var msg_i = 0; msg_i < offline_Info.msg_list.length; msg_i++) {
            var msg_info = Utils.deepCopy(offline_Info);
            delete msg_info.msg_list;
            msg_info.msg = offline_Info.msg_list[msg_i].msg;
            msg_info.len = offline_Info.msg_list[msg_i].len;
            msg_info.tick = offline_Info.msg_list[msg_i].tick;
            msg_info.offline = true;
            msg_info.flag = 2;
            this.model.addOutlinePrivateMsg(msg_info);
          }
        }
      }
    }
  },
  // 通知服务端已读消息
  sender12723: function sender12723(srv_id, rid) {
    if (srv_id === null || rid === null) return;
    var protocal = {};
    protocal.rid = rid;
    protocal.srv_id = srv_id;
    this.SendProtocal(12723, protocal);
  },
  handle12725: function handle12725(data) {// 语音信息
  },
  handle12726: function handle12726(data) {// 下载语音信息
  },
  handle12741: function handle12741(data) {
    // 提示
    // 消耗<assets=3/><div fontcolor=#ef3a3a>1600</div>,获得<div fontcolor=#c26706>荣光符石</div>
    // 消耗,获得<div fontcolor=#c26706>魔力符石</div>
    message(data.msg);
  },
  handle12743: function handle12743(data) {
    // 系统提示&聊天提示(在聊天框显示)
    message(data.msg);
    var sys_msg = {};
    sys_msg.len = 0;
    sys_msg.channel = ChatConst.Channel.System;
    sys_msg.role_list = {};
    sys_msg.msg = data.msg;
    this.handle12761(sys_msg, true);
  },
  handle12799: function handle12799(data) {// 消息发送
  },
  handle12761: function handle12761(data) {
    // 接受通用聊天
    if (!data) return;
    if (this.pro_12766 && !this.is_first) this.pro_12766 = false;
    this.is_first = false;
    this.model.addNormalChatMsg(data.channel, data);
    this.handle12761__(data);
  },
  handle12761__: function handle12761__(data) {
    var channel = data.channel;
 
    if (channel == ChatConst.Channel.System || channel == ChatConst.Channel.NoticeTop || channel == ChatConst.Channel.System1 || channel == ChatConst.Channel.SystemTop) {
      var msg = data.msg;
      msg = StringUtil.parseStr(msg).string;
      GlobalMessageMgr.getInstance().showMoveHorizontal(msg, new cc.Color(255, 255, 255));
    }
  },
  sender12762: function sender12762(channel, msg, len) {
    // 发起通用聊天
    if (!channel || !msg || !len) return;
    var sender_data = {};
    sender_data.channel = channel;
    sender_data.msg = msg;
    sender_data.len = len; // 判断时间
 
    var canSend = this.canSend(channel);
 
    if (canSend) {
      this.SendProtocal(12762, sender_data);
      this.saveChatTime(channel);
    } else {
      var cur_time = gcore.SmartSocket.getTime();
      var last_time = this.chat_time["sec_" + channel];
      var time_index = ChatConst.ChatTimeIndex[channel];
      var time_info = SayConfig[time_index];
 
      if (time_info) {
        var time = time_info.val + last_time - cur_time;
        time = time || 1;
        message(Utils.TI18N("距离下次发言还剩下" + time + "秒"));
      }
    }
  },
  canSend: function canSend(channel) {
    if (!this.chat_time["sec_" + channel]) return true;
    var last_time = this.chat_time["sec_" + channel];
    var cur_time = gcore.SmartSocket.getTime();
    var time_index = ChatConst.ChatTimeIndex[channel];
    var time_info = SayConfig[time_index];
 
    if (time_info) {
      if (time_info.val + last_time < cur_time) return true;
    }
 
    return false;
  },
  saveChatTime: function saveChatTime(channel) {
    var cur_time = gcore.SmartSocket.getTime();
    var chat_index = "sec_" + channel; // if (!this.chat_time[chat_index])
 
    this.chat_time[chat_index] = cur_time;
  },
  handle12762: function handle12762(data) {
    // 发送通用聊天结果
    cc.log("发送通用聊天结果");
    cc.log(data);
    if (data.code == 0) message(data.msg);
  },
  handle12763: function handle12763(data) {// 服务端分发翻译
  },
  handle12766: function handle12766(data) {
    // 登录聊天记录
    if (this.pro_12766) {
      this.pro_12766 = false;
 
      for (var msg_i in data.msg_list) {
        this.handle12761(data.msg_list[msg_i]);
      }
 
      this.pro_12766 = true;
    }
  },
  handle12771: function handle12771(data) {// 聊天玩家队伍id
  },
  handle12767: function handle12767(data) {
    // 聊天@
    this.model.setAtData(data);
 
    if (this.chat_window) {
      this.chat_window.showAtNotice(true, data);
    }
  },
  // 已查看艾特信息
  sender12768: function sender12768(rid, srv_id, channel, msg) {
    var protocal = {};
    protocal.rid = rid;
    protocal.srv_id = srv_id;
    protocal.channel = channel;
    protocal.msg = msg;
    this.SendProtocal(12768, protocal);
  },
  handle12768: function handle12768(data) {// 已查看@
  },
  // 聊天记录唯一ID
  getUniqueId: function getUniqueId() {
    if (this.stack_id == null) {
      this.stack_id = 0;
    }
 
    this.stack_id = this.stack_id + 1;
    return this.stack_id;
  },
  // 打开好友信息界面
  openFriendInfo: function openFriendInfo(data) {
    var FriendController = require("friend_controller");
 
    FriendController.getInstance().openFriendCheckPanel(true, data);
  },
  // 返回聊天的输入组件
  getChatInput: function getChatInput() {
    if (this.chat_window) {
      if (this.chat_window.chat_input_panel) {
        return this.chat_window.chat_input_panel;
      }
    }
  },
  //  @人
  chatAtPeople: function chatAtPeople(name, srv_id) {
    var chatInput = this.getChatInput();
 
    if (chatInput) {
      chatInput.setInputText("@" + name + " ", srv_id);
    }
  },
  // 返回信息的id
  getId: function getId(channel, srv_id, rid, name, msg) {
    var list = this.model.getChannelMsgs(channel);
    var id = 1;
 
    for (var i = 0, l = list.length; i < l; i++) {
      if (list[i].role_list && list[i].role_list[0]) {
        var v = list[i].role_list[0];
 
        if (srv_id == v.srv_id && rid == v.rid && name == v.name && msg == list[i].msg) {
          id = list[i].id;
        }
      }
    }
 
    return id;
  }
});
module.exports = ChatController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFxjaGF0X2NvbnRyb2xsZXIuanMiXSwibmFtZXMiOlsiQ2hhdENvbnN0IiwicmVxdWlyZSIsIkNoYXRDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsIkNoYXRNb2RlbCIsIm1vZGVsIiwiaW5pdENvbmZpZyIsImNoYXRfdGltZSIsInJlZ2lzdGVyRXZlbnRzIiwiaW5pdF9yb2xlX2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJ1bmJpbmQiLCJpbml0UHJpdmF0cmVUYXJnZXRzIiwib3BlbkNoYXRQYW5lbCIsImNoYW5uZWwiLCJmb3JtIiwiZGF0YSIsIm9wZW5fcGFyYW1lIiwiY2hhdF93aW5kb3ciLCJDaGF0V2luZG93IiwiYWRkUHJpdmF0ZVRhcmdldCIsIkNoYW5uZWwiLCJGcmllbmQiLCJmcmllbmRfZGF0YSIsImdldFZpc2libGUiLCJzZXRWaXNpYmxlIiwib3BlbiIsImNsb3NlQ2hhdFBhbmVsIiwiUHJvbXB0Q29udHJvbGxlciIsIlByb21wdFR5cGVDb25zdCIsImdldEluc3RhbmNlIiwiZ2V0TW9kZWwiLCJyZW1vdmVQcm9tcHREYXRhQnlUcHllIiwiUHJpdmF0ZV9jaGF0IiwiQXRfbm90aWNlIiwiTWFpblVJQ29udHJvbGxlciIsInNob3dDaGF0QnRuIiwiaW5pdERhdGEiLCJpc19maXJzdCIsInByb18xMjc2NiIsInN0YWNrX2lkIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMTI3MjAiLCJoYW5kbGUxMjcyMSIsImhhbmRsZTEyNzIyIiwiaGFuZGxlMTI3MjUiLCJoYW5kbGUxMjcyNiIsImhhbmRsZTEyNzQxIiwiaGFuZGxlMTI3NDMiLCJoYW5kbGUxMjc5OSIsImhhbmRsZTEyNzYxIiwiaGFuZGxlMTI3NjIiLCJoYW5kbGUxMjc2MyIsImhhbmRsZTEyNzY2IiwiaGFuZGxlMTI3NzEiLCJoYW5kbGUxMjc2NyIsImhhbmRsZTEyNzY4IiwiaXNDaGF0T3BlbiIsInNlbmRWb2lkTXNnIiwibXNnIiwidGFrZW5fb2JqIiwic2VuZGVyMTI3MjAiLCJzZW5kZXIxMjc2MiIsInNlbmRNZXNzYWdlIiwibGVuIiwidG9fc3J2X2lkIiwidG9fcmlkIiwibmFtZSIsImxvZyIsIm1zZ19kYXRhIiwiU2VuZFByb3RvY2FsIiwid2luZG93IiwiQ0hBTk5FTCIsInJpZCIsIlN0cmluZyIsImFyciIsInNwbGl0Iiwic2RrIiwiY2hhdE1vbml0b3IiLCJ0eXBlIiwiY29kZSIsIm1lc3NhZ2UiLCJhZGRQcml2YXRlTXNnIiwibXNnX2RhdGFzIiwib2ZmbGluZV9saXN0IiwibGVuZ3RoIiwib2ZmbGluZV9JbmZvIiwib2ZmbGluZV9pIiwibXNnX2xpc3QiLCJtc2dfaSIsIm1zZ19pbmZvIiwiVXRpbHMiLCJkZWVwQ29weSIsInRpY2siLCJvZmZsaW5lIiwiZmxhZyIsImFkZE91dGxpbmVQcml2YXRlTXNnIiwic2VuZGVyMTI3MjMiLCJzcnZfaWQiLCJwcm90b2NhbCIsInN5c19tc2ciLCJTeXN0ZW0iLCJyb2xlX2xpc3QiLCJhZGROb3JtYWxDaGF0TXNnIiwiaGFuZGxlMTI3NjFfXyIsIk5vdGljZVRvcCIsIlN5c3RlbTEiLCJTeXN0ZW1Ub3AiLCJTdHJpbmdVdGlsIiwicGFyc2VTdHIiLCJzdHJpbmciLCJHbG9iYWxNZXNzYWdlTWdyIiwic2hvd01vdmVIb3Jpem9udGFsIiwiQ29sb3IiLCJzZW5kZXJfZGF0YSIsImNhblNlbmQiLCJzYXZlQ2hhdFRpbWUiLCJjdXJfdGltZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImxhc3RfdGltZSIsInRpbWVfaW5kZXgiLCJDaGF0VGltZUluZGV4IiwidGltZV9pbmZvIiwiU2F5Q29uZmlnIiwidGltZSIsInZhbCIsIlRJMThOIiwiY2hhdF9pbmRleCIsInNldEF0RGF0YSIsInNob3dBdE5vdGljZSIsInNlbmRlcjEyNzY4IiwiZ2V0VW5pcXVlSWQiLCJvcGVuRnJpZW5kSW5mbyIsIkZyaWVuZENvbnRyb2xsZXIiLCJvcGVuRnJpZW5kQ2hlY2tQYW5lbCIsImdldENoYXRJbnB1dCIsImNoYXRfaW5wdXRfcGFuZWwiLCJjaGF0QXRQZW9wbGUiLCJjaGF0SW5wdXQiLCJzZXRJbnB1dFRleHQiLCJnZXRJZCIsImxpc3QiLCJnZXRDaGFubmVsTXNncyIsImlkIiwiaSIsImwiLCJ2IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUdBLElBQUlDLGNBQWMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDMUIsYUFBU0MsY0FEaUI7QUFHMUJDLEVBQUFBLElBQUksRUFBRSxnQkFBVztBQUNoQixRQUFJQyxTQUFTLEdBQUdOLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLFNBQUtPLEtBQUwsR0FBYSxJQUFJRCxTQUFKLENBQWMsSUFBZCxDQUFiO0FBQ0csU0FBS0MsS0FBTCxDQUFXQyxVQUFYO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixFQUFqQjtBQUNILEdBUnlCO0FBVTFCQyxFQUFBQSxjQUFjLEVBQUUsMEJBQVc7QUFDdkIsU0FBS0MsZUFBTCxHQUF1QkMsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QkMsT0FBTyxDQUFDQyx1QkFBL0IsRUFBd0QsWUFBVztBQUN0RkosTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCSSxNQUFsQixDQUF5QixLQUFLTixlQUE5QjtBQUNBLFdBQUtKLEtBQUwsQ0FBV1csbUJBQVg7QUFDSCxLQUg4RSxDQUc3RUosSUFINkUsQ0FHeEUsSUFId0UsQ0FBeEQsQ0FBdkI7QUFJSCxHQWZ5QjtBQWlCMUJLLEVBQUFBLGFBQWEsRUFBRSx1QkFBU0MsT0FBVCxFQUFrQkMsSUFBbEIsRUFBd0JDLElBQXhCLEVBQThCO0FBQ3pDLFFBQUlDLFdBQVcsR0FB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QTFCLEVBQStCTixJQUEvQixFQUFxQ1IsR0FBckMsRUFBMEM7QUFDN0MsUUFBSW1GLElBQUksR0FBRyxLQUFLOUksS0FBTCxDQUFXK0ksY0FBWCxDQUEwQmxJLE9BQTFCLENBQVg7QUFFQSxRQUFJbUksRUFBRSxHQUFHLENBQVQ7O0FBQ0EsU0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBUixFQUFVQyxDQUFDLEdBQUdKLElBQUksQ0FBQ3pELE1BQXhCLEVBQStCNEQsQ0FBQyxHQUFDQyxDQUFqQyxFQUFtQ0QsQ0FBQyxFQUFwQyxFQUF3QztBQUNwQyxVQUFJSCxJQUFJLENBQUNHLENBQUQsQ0FBSixDQUFRM0MsU0FBUixJQUFxQndDLElBQUksQ0FBQ0csQ0FBRCxDQUFKLENBQVEzQyxTQUFSLENBQWtCLENBQWxCLENBQXpCLEVBQStDO0FBQzNDLFlBQUk2QyxDQUFDLEdBQUdMLElBQUksQ0FBQ0csQ0FBRCxDQUFKLENBQVEzQyxTQUFSLENBQWtCLENBQWxCLENBQVI7O0FBQ0EsWUFBSUosTUFBTSxJQUFJaUQsQ0FBQyxDQUFDakQsTUFBWixJQUFzQnpCLEdBQUcsSUFBSTBFLENBQUMsQ0FBQzFFLEdBQS9CLElBQXNDTixJQUFJLElBQUlnRixDQUFDLENBQUNoRixJQUFoRCxJQUF3RFIsR0FBRyxJQUFJbUYsSUFBSSxDQUFDRyxDQUFELENBQUosQ0FBUXRGLEdBQTNFLEVBQWdGO0FBQzVFcUYsVUFBQUEsRUFBRSxHQUFHRixJQUFJLENBQUNHLENBQUQsQ0FBSixDQUFRRCxFQUFiO0FBQ0g7QUFDSjtBQUNKOztBQUNELFdBQU9BLEVBQVA7QUFDSDtBQTFZeUIsQ0FBVCxDQUFyQjtBQTZZQUksTUFBTSxDQUFDQyxPQUFQLEdBQWlCM0osY0FBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbInZhciBDaGF0Q29uc3QgPSByZXF1aXJlKFwiY2hhdF9jb25zdFwiKTtcclxuXHJcblxyXG52YXIgQ2hhdENvbnRyb2xsZXIgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcclxuXHJcbiAgICBjdG9yOiBmdW5jdGlvbigpIHtcclxuICAgIFx0dmFyIENoYXRNb2RlbCA9IHJlcXVpcmUoXCJjaGF0X21vZGVsXCIpO1xyXG4gICAgXHR0aGlzLm1vZGVsID0gbmV3IENoYXRNb2RlbCh0aGlzKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcclxuICAgICAgICB0aGlzLmNoYXRfdGltZSA9IHt9O1xyXG4gICAgfSxcclxuXHJcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5pbml0X3JvbGVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy5pbml0X3JvbGVfZXZlbnQpXHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuaW5pdFByaXZhdHJlVGFyZ2V0cygpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgIH0sXHJcblxyXG4gICAgb3BlbkNoYXRQYW5lbDogZnVuY3Rpb24oY2hhbm5lbCwgZm9ybSwgZGF0YSkge1xyXG4gICAgICAgIHZhciBvcGVuX3BhcmFtZSA9IHt9O1xyXG4gICAgICAgIGlmICghdGhpcy5jaGF0X3dpbmRvdykge1xyXG4gICAgICAgIFx0dmFyIENoYXRXaW5kb3cgPSByZXF1aXJlKFwiY2hhdF93aW5kb3dcIik7XHJcbiAgICAgICAgXHR0aGlzLmNoYXRfd2luZG93ID0gbmV3IENoYXRXaW5kb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3Blbl9wYXJhbWUuY2hhbm5lbCA9IGZvcm07XHJcbiAgICAgICAgaWYgKGZvcm0gPT0gXCJmcmllbmRcIikge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmFkZFByaXZhdGVUYXJnZXQoZGF0YSk7XHJcbiAgICAgICAgICAgIG9wZW5fcGFyYW1lLmNoYW5uZWwgPSBDaGF0Q29uc3QuQ2hhbm5lbC5GcmllbmQ7XHJcbiAgICAgICAgICAgIG9wZW5fcGFyYW1lLmZyaWVuZF9kYXRhID0gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXRfd2luZG93LmdldFZpc2libGUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRfd2luZG93LnNldFZpc2libGUodHJ1ZSxvcGVuX3BhcmFtZSk7ICAgICAgICBcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFx0dGhpcy5jaGF0X3dpbmRvdy5vcGVuKG9wZW5fcGFyYW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNsb3NlQ2hhdFBhbmVsOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGF0X3dpbmRvdykge1xyXG4gICAgICAgICAgICB2YXIgUHJvbXB0Q29udHJvbGxlciA9IHJlcXVpcmUoXCJwcm9tcHRfY29udHJvbGxlclwiKVxyXG4gICAgICAgICAgICB2YXIgUHJvbXB0VHlwZUNvbnN0ID0gcmVxdWlyZShcInByb21wdF90eXBlX2NvbnN0XCIpXHJcbiAgICAgICAgICAgIFByb21wdENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLnJlbW92ZVByb21wdERhdGFCeVRweWUoUHJvbXB0VHlwZUNvbnN0LlByaXZhdGVfY2hhdClcclxuICAgICAgICAgICAgUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkucmVtb3ZlUHJvbXB0RGF0YUJ5VHB5ZShQcm9tcHRUeXBlQ29uc3QuQXRfbm90aWNlKVxyXG4gICAgICAgICAgICAvLyB0aGlzLmNoYXRfd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY2hhdF93aW5kb3cgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRfd2luZG93LnNldFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICB2YXIgTWFpblVJQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgTWFpblVJQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dDaGF0QnRuKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICBpbml0RGF0YTogZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRNb2RlbDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24oKXtcclxuICAgICAgICB2YXIgQ2hhdE1vZGVsID0gcmVxdWlyZShcImNoYXRfbW9kZWxcIik7XHJcbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBDaGF0TW9kZWwoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcclxuICAgICAgICB0aGlzLmlzX2ZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByb18xMjc2NiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zdGFja19pZCA9IDA7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyUHJvdG9jYWxzOiBmdW5jdGlvbigpIHtcclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3MjAsIHRoaXMuaGFuZGxlMTI3MjApOyAgICAgICAgIC8vIOengeiBilxyXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMjcyMSwgdGhpcy5oYW5kbGUxMjcyMSk7ICAgICAgICAgLy8g5o6o6YCB56eB6IGK5raI5oGvXHJcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEyNzIyLCB0aGlzLmhhbmRsZTEyNzIyKTsgICAgICAgICAvLyDnmbvpmYbmjqjpgIHnp4HogYrkv6Hmga9cclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3MjUsIHRoaXMuaGFuZGxlMTI3MjUpOyAgICAgICAgIC8vIOivremfs+S/oeaBr1xyXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMjcyNiwgdGhpcy5oYW5kbGUxMjcyNik7ICAgICAgICAgLy8g5LiL6L296K+t6Z+z5L+h5oGvXHJcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEyNzQxLCB0aGlzLmhhbmRsZTEyNzQxKTsgICAgICAgICAvLyDmj5DnpLpcclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3NDMsIHRoaXMuaGFuZGxlMTI3NDMpOyAgICAgICAgIC8vIOezu+e7n+aPkOekuibogYrlpKnmj5DnpLpcclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3OTksIHRoaXMuaGFuZGxlMTI3OTkpOyAgICAgICAgIC8vIOa2iOaBr+WPkemAgVxyXG5cclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3NjEsIHRoaXMuaGFuZGxlMTI3NjEpOyAgICAgICAgIC8vIOaOpeWPl+mAmueUqOiBiuWkqVxyXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMjc2MiwgdGhpcy5oYW5kbGUxMjc2Mik7ICAgICAgICAgLy8g5Y+R6YCB6YCa55So6IGK5aSpXHJcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEyNzYzLCB0aGlzLmhhbmRsZTEyNzYzKTsgICAgICAgICAvLyDmnI3liqHnq6/liIblj5Hnv7vor5FcclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3NjYsIHRoaXMuaGFuZGxlMTI3NjYpOyAgICAgICAgIC8vIOeZu+W9leiBiuWkqeiusOW9lVxyXG5cclxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTI3NzEsIHRoaXMuaGFuZGxlMTI3NzEpOyAgICAgICAgIC8vIOiBiuWkqeeOqeWutumYn+S8jWlkXHJcblxyXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMjc2NywgdGhpcy5oYW5kbGUxMjc2Nyk7ICAgICAgICAgLy8g6IGK5aSpQFxyXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMjc2OCwgdGhpcy5oYW5kbGUxMjc2OCk7ICAgICAgICAgLy8g5bey5p+l55yLXHJcbiAgICB9LFxyXG4gICAgaXNDaGF0T3Blbigpe1xyXG4gICAgICAgIGlmKHRoaXMuY2hhdF93aW5kb3cpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGF0X3dpbmRvdy5nZXRWaXNpYmxlKClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Y+R6YCB57+76K+R5ZCO55qE5paH5a2X5raI5oGvXHJcbiAgICAgKiBAYXV0aG9yIHpoYW5naHV4aW5nIDIwMTktMDEtMDNcclxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gbXNnICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gY2hhbm5lbCAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gdGFrZW5fb2JqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgc2VuZFZvaWRNc2c6IGZ1bmN0aW9uKG1zZywgY2hhbm5lbCwgdGFrZW5fb2JqKSB7XHJcbiAgICAgICAgaWYgKGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZGVyMTI3MjAoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRlcjEyNzYyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWPkemAgeaWh+Wtl+S/oeaBr1xyXG4gICAgICogQGF1dGhvciB6aGFuZ2h1eGluZyAyMDE5LTAxLTAzXHJcbiAgICAgKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gIHtbdHlwZV19IGNoYW5uZWwgICDpopHpgZNcclxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gdGFrZW5fb2JqIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gbGVuICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICAqL1xyXG4gICAgc2VuZE1lc3NhZ2U6IGZ1bmN0aW9uKGNoYW5uZWwsIG1zZywgbGVuLCB0b19zcnZfaWQsIHRvX3JpZCxuYW1lKSB7XHJcbiAgICAgICAgY2MubG9nKFwiY2hhdF9fX19fX19fX19cIixtc2csY2hhbm5lbCwgbGVuLCB0b19zcnZfaWQsIHRvX3JpZClcclxuXHJcbiAgICAgICAgaWYgKGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuRnJpZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZGVyMTI3MjAodG9fc3J2X2lkLCB0b19yaWQsIG1zZywgbGVuLG5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZGVyMTI3NjIoY2hhbm5lbCwgbXNnLCBsZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG5cclxuXHRzZW5kZXIxMjcyMDogZnVuY3Rpb24odG9fc3J2X2lkLCB0b19yaWQsIG1zZywgbGVuLG5hbWUpIHsgICAgICAgIC8vIOWPkei1t+engeiBilxyXG4gICAgICAgIHZhciBtc2dfZGF0YSA9IHt9O1xyXG4gICAgICAgIG1zZ19kYXRhLnRvX3Nydl9pZCA9IHRvX3Nydl9pZDtcclxuICAgICAgICBtc2dfZGF0YS50b19yaWQgPSB0b19yaWQ7XHJcbiAgICAgICAgbXNnX2RhdGEubXNnID0gbXNnO1xyXG4gICAgICAgIG1zZ19kYXRhLmxlbiA9IGxlbjtcclxuXHJcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTI3MjAsIG1zZ19kYXRhKTtcclxuICAgICAgICAvLyBjYy5sb2coXCJzbC0tLS0tLS0tLS0tLS0tLVwiLHRvX3JpZC5zcGxpdChcIl9cIikpXHJcbiAgICAgICAgLy/niLHlvq7muLjmuKDpgZPogYrlpKnnm5HmjqdcclxuICAgICAgICBpZih3aW5kb3cuQ0hBTk5FTCA9PSBcIkFJV0VJWU9VX1BJRFwiKXtcclxuICAgICAgICAgICAgbGV0IHJpZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRvX3JpZCA9IFN0cmluZyh0b19yaWQpO1xyXG4gICAgICAgICAgICBsZXQgYXJyID0gdG9fcmlkLnNwbGl0KFwiX1wiKTtcclxuICAgICAgICAgICAgcmlkID0gYXJyWzFdO1xyXG4gICAgICAgICAgICBzZGsuY2hhdE1vbml0b3Ioe1xyXG4gICAgICAgICAgICAgICAgdG9fc3J2X2lkOnRvX3Nydl9pZCxcclxuICAgICAgICAgICAgICAgIHRvX3JpZDpyaWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOjEsLy8x6KGo56S656eB6IGKXHJcbiAgICAgICAgICAgICAgICBuYW1lOm5hbWUsXHJcbiAgICAgICAgICAgICAgICBtc2c6bXNnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cdH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG5cclxuXHRoYW5kbGUxMjcyMDogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnp4HogYrlpLHotKXmj5DnpLpcclxuICAgICAgICBjYy5sb2coXCLnp4HogYrlpLHotKVcIik7XHJcbiAgICAgICAgY2MubG9nKGRhdGEpO1xyXG4gICAgICAgIGlmKGRhdGEuY29kZSA9PSAwKXtcclxuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcclxuICAgICAgICB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGhhbmRsZTEyNzIxOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaUtuWIsOengeiBiua2iOaBr1xyXG4gICAgICAgIGNjLmxvZyhcIuengeiBiua2iOaBr1wiKTtcclxuICAgICAgICBjYy5sb2coZGF0YSk7XHJcbiAgICAgICAgaWYgKGRhdGEpXHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuYWRkUHJpdmF0ZU1zZyhkYXRhKTtcclxuXHR9LFxyXG5cclxuXHRoYW5kbGUxMjcyMjogZnVuY3Rpb24obXNnX2RhdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeZu+mZhuaOqOmAgeemu+e6v+engeiBiuS/oeaBr1xyXG4gICAgICAgIGNjLmxvZyhcIuemu+e6v+engeiBiua2iOaBr1wiKTtcclxuICAgICAgICBjYy5sb2cobXNnX2RhdGFzKTtcclxuXHJcbiAgICAgICAgaWYgKG1zZ19kYXRhcyAmJiBtc2dfZGF0YXMub2ZmbGluZV9saXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIG9mZmxpbmVfSW5mbyA9IG51bGw7XHJcbiAgICAgICAgICAgIGZvciAodmFyIG9mZmxpbmVfaSA9IDA7IG9mZmxpbmVfaSA8IG1zZ19kYXRhcy5vZmZsaW5lX2xpc3QubGVuZ3RoOyBvZmZsaW5lX2krKykge1xyXG4gICAgICAgICAgICAgICAgb2ZmbGluZV9JbmZvID0gbXNnX2RhdGFzLm9mZmxpbmVfbGlzdFtvZmZsaW5lX2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9mZmxpbmVfSW5mby5tc2dfbGlzdCAmJiBvZmZsaW5lX0luZm8ubXNnX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtc2dfaSA9IDA7ICBtc2dfaSA8IG9mZmxpbmVfSW5mby5tc2dfbGlzdC5sZW5ndGg7IG1zZ19pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZ19pbmZvID0gVXRpbHMuZGVlcENvcHkob2ZmbGluZV9JbmZvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1zZ19pbmZvLm1zZ19saXN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2dfaW5mby5tc2cgPSBvZmZsaW5lX0luZm8ubXNnX2xpc3RbbXNnX2ldLm1zZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2luZm8ubGVuID0gb2ZmbGluZV9JbmZvLm1zZ19saXN0W21zZ19pXS5sZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19pbmZvLnRpY2sgPSBvZmZsaW5lX0luZm8ubXNnX2xpc3RbbXNnX2ldLnRpY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19pbmZvLm9mZmxpbmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2dfaW5mby5mbGFnID0gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5hZGRPdXRsaW5lUHJpdmF0ZU1zZyhtc2dfaW5mbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cdH0sXHJcblxyXG4gICAgLy8g6YCa55+l5pyN5Yqh56uv5bey6K+75raI5oGvXHJcbiAgICBzZW5kZXIxMjcyMzogZnVuY3Rpb24oc3J2X2lkLCByaWQpIHtcclxuICAgICAgICBpZiAoc3J2X2lkID09PSBudWxsIHx8IHJpZCA9PT0gbnVsbCkgcmV0dXJuXHJcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XHJcbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkO1xyXG4gICAgICAgIHByb3RvY2FsLnNydl9pZCA9IHNydl9pZDtcclxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMjcyMywgcHJvdG9jYWwpO1xyXG4gICAgfSxcclxuXHJcblx0aGFuZGxlMTI3MjU6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6K+t6Z+z5L+h5oGvXHJcblxyXG5cdH0sXHJcblxyXG5cdGhhbmRsZTEyNzI2OiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veivremfs+S/oeaBr1xyXG5cclxuXHR9LFxyXG5cclxuICAgIGhhbmRsZTEyNzQxOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkOekulxyXG4gICAgICAgIC8vIOa2iOiAlzxhc3NldHM9My8+PGRpdiBmb250Y29sb3I9I2VmM2EzYT4xNjAwPC9kaXY+77yM6I635b6XPGRpdiBmb250Y29sb3I9I2MyNjcwNj7ojaPlhYnnrKbnn7M8L2Rpdj5cclxuICAgICAgICAvLyDmtojogJfvvIzojrflvpc8ZGl2IGZvbnRjb2xvcj0jYzI2NzA2PumtlOWKm+espuefszwvZGl2PlxyXG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xyXG5cdH0sXHJcblxyXG5cdGhhbmRsZTEyNzQzOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOezu+e7n+aPkOekuibogYrlpKnmj5DnpLrvvIjlnKjogYrlpKnmoYbmmL7npLrvvIlcclxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcclxuICAgICAgICB2YXIgc3lzX21zZyA9IHt9O1xyXG4gICAgICAgIHN5c19tc2cubGVuID0gMDtcclxuICAgICAgICBzeXNfbXNnLmNoYW5uZWwgPSBDaGF0Q29uc3QuQ2hhbm5lbC5TeXN0ZW07XHJcbiAgICAgICAgc3lzX21zZy5yb2xlX2xpc3QgPSB7fTtcclxuICAgICAgICBzeXNfbXNnLm1zZyA9IGRhdGEubXNnO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlMTI3NjEoc3lzX21zZyx0cnVlKTtcclxuXHR9LFxyXG5cclxuXHRoYW5kbGUxMjc5OTogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmtojmga/lj5HpgIFcclxuXHJcblx0fSxcclxuXHJcblx0aGFuZGxlMTI3NjE6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5o6l5Y+X6YCa55So6IGK5aSpXHJcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvXzEyNzY2ICYmICF0aGlzLmlzX2ZpcnN0KSBcclxuICAgICAgICAgICAgdGhpcy5wcm9fMTI3NjYgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5pc19maXJzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubW9kZWwuYWRkTm9ybWFsQ2hhdE1zZyhkYXRhLmNoYW5uZWwsIGRhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZTEyNzYxX18oZGF0YSlcclxuXHR9LFxyXG4gICAgaGFuZGxlMTI3NjFfXyhkYXRhKXtcclxuICAgICAgICBsZXQgY2hhbm5lbCA9IGRhdGEuY2hhbm5lbFxyXG4gICAgICAgIGlmKGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuU3lzdGVtIHx8IGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuTm90aWNlVG9wIHx8IGNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuU3lzdGVtMSB8fCBjaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLlN5c3RlbVRvcCl7XHJcbiAgICAgICAgICAgIGxldCBtc2cgPSBkYXRhLm1zZ1xyXG4gICAgICAgICAgICBtc2cgPSBTdHJpbmdVdGlsLnBhcnNlU3RyKG1zZykuc3RyaW5nXHJcbiAgICAgICAgICAgIEdsb2JhbE1lc3NhZ2VNZ3IuZ2V0SW5zdGFuY2UoKS5zaG93TW92ZUhvcml6b250YWwobXNnLG5ldyBjYy5Db2xvcigyNTUsMjU1LDI1NSkpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHRcclxuXHJcbiAgICBzZW5kZXIxMjc2MjogZnVuY3Rpb24oY2hhbm5lbCwgbXNnLCBsZW4pIHsgICAgICAgICAgICAgICAgICAvLyDlj5HotbfpgJrnlKjogYrlpKlcclxuICAgICAgICBpZiAoIWNoYW5uZWwgfHwgIW1zZyB8fCAhbGVuKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHNlbmRlcl9kYXRhID0ge307XHJcbiAgICAgICAgc2VuZGVyX2RhdGEuY2hhbm5lbCA9IGNoYW5uZWw7XHJcbiAgICAgICAgc2VuZGVyX2RhdGEubXNnID0gbXNnO1xyXG4gICAgICAgIHNlbmRlcl9kYXRhLmxlbiA9IGxlbjtcclxuXHJcbiAgICAgICAgLy8g5Yik5pat5pe26Ze0XHJcbiAgICAgICAgdmFyIGNhblNlbmQgPSB0aGlzLmNhblNlbmQoY2hhbm5lbCk7XHJcblxyXG4gICAgICAgIGlmIChjYW5TZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEyNzYyLCBzZW5kZXJfZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNoYXRUaW1lKGNoYW5uZWwpOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJfdGltZSA9IGdjb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKTsgXHJcbiAgICAgICAgICAgIHZhciBsYXN0X3RpbWUgPSB0aGlzLmNoYXRfdGltZVtcInNlY19cIiArIGNoYW5uZWxdO1xyXG4gICAgICAgICAgICB2YXIgdGltZV9pbmRleCA9IENoYXRDb25zdC5DaGF0VGltZUluZGV4W2NoYW5uZWxdO1xyXG4gICAgICAgICAgICB2YXIgdGltZV9pbmZvID0gU2F5Q29uZmlnW3RpbWVfaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAodGltZV9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGltZSA9IHRpbWVfaW5mby52YWwgKyBsYXN0X3RpbWUgLSBjdXJfdGltZVxyXG4gICAgICAgICAgICAgICAgdGltZSA9IHRpbWUgfHwgMVxyXG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIui3neemu+S4i+asoeWPkeiogOi/mOWJqeS4i1wiKyB0aW1lICsgXCLnp5JcIikpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY2FuU2VuZDogZnVuY3Rpb24oY2hhbm5lbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGF0X3RpbWVbXCJzZWNfXCIgKyBjaGFubmVsXSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHZhciBsYXN0X3RpbWUgPSB0aGlzLmNoYXRfdGltZVtcInNlY19cIiArIGNoYW5uZWxdO1xyXG4gICAgICAgIHZhciBjdXJfdGltZSA9IGdjb3JlLlNtYXJ0U29ja2V0LmdldFRpbWUoKTtcclxuICAgICAgICB2YXIgdGltZV9pbmRleCA9IENoYXRDb25zdC5DaGF0VGltZUluZGV4W2NoYW5uZWxdO1xyXG4gICAgICAgIHZhciB0aW1lX2luZm8gPSBTYXlDb25maWdbdGltZV9pbmRleF07XHJcblxyXG4gICAgICAgIGlmICh0aW1lX2luZm8pIHtcclxuICAgICAgICAgICAgaWYgKHRpbWVfaW5mby52YWwgKyBsYXN0X3RpbWUgPCBjdXJfdGltZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0sXHJcblxyXG4gICAgc2F2ZUNoYXRUaW1lOiBmdW5jdGlvbihjaGFubmVsKSB7XHJcbiAgICAgICAgdmFyIGN1cl90aW1lID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xyXG4gICAgICAgIHZhciBjaGF0X2luZGV4ID0gXCJzZWNfXCIgKyBjaGFubmVsO1xyXG4gICAgICAgIC8vIGlmICghdGhpcy5jaGF0X3RpbWVbY2hhdF9pbmRleF0pXHJcbiAgICAgICAgdGhpcy5jaGF0X3RpbWVbY2hhdF9pbmRleF0gPSBjdXJfdGltZTtcclxuICAgIH0sXHJcblxyXG5cdGhhbmRsZTEyNzYyOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWPkemAgemAmueUqOiBiuWkqee7k+aenFxyXG4gICAgICAgIGNjLmxvZyhcIuWPkemAgemAmueUqOiBiuWkqee7k+aenFwiKTtcclxuICAgICAgICBjYy5sb2coZGF0YSk7XHJcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAwKVxyXG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTsgICAgICAgICAgICBcclxuXHR9LFxyXG5cclxuXHRoYW5kbGUxMjc2MzogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnI3liqHnq6/liIblj5Hnv7vor5FcclxuXHJcblx0fSxcclxuXHJcblx0aGFuZGxlMTI3NjY6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g55m75b2V6IGK5aSp6K6w5b2VXHJcbiAgICAgICAgaWYgKHRoaXMucHJvXzEyNzY2KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvXzEyNzY2ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAodmFyIG1zZ19pIGluIGRhdGEubXNnX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlMTI3NjEoZGF0YS5tc2dfbGlzdFttc2dfaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvXzEyNzY2ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblx0fSxcclxuXHJcblx0aGFuZGxlMTI3NzE6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6IGK5aSp546p5a626Zif5LyNaWRcclxuXHJcblx0fSxcclxuXHJcblx0aGFuZGxlMTI3Njc6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6IGK5aSpQFxyXG4gICAgICAgIHRoaXMubW9kZWwuc2V0QXREYXRhKGRhdGEpO1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXRfd2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdF93aW5kb3cuc2hvd0F0Tm90aWNlKHRydWUsIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8g5bey5p+l55yL6Im+54m55L+h5oGvXHJcbiAgICBzZW5kZXIxMjc2ODogZnVuY3Rpb24ocmlkLCBzcnZfaWQsIGNoYW5uZWwsIG1zZykge1xyXG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xyXG4gICAgICAgIHByb3RvY2FsLnJpZCA9IHJpZDtcclxuICAgICAgICBwcm90b2NhbC5zcnZfaWQgPSBzcnZfaWQ7XHJcbiAgICAgICAgcHJvdG9jYWwuY2hhbm5lbCA9IGNoYW5uZWw7XHJcbiAgICAgICAgcHJvdG9jYWwubXNnID0gbXNnO1xyXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEyNzY4LCBwcm90b2NhbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGhhbmRsZTEyNzY4OiBmdW5jdGlvbihkYXRhKSB7Ly8g5bey5p+l55yLQFxyXG5cclxuXHR9LFxyXG5cclxuICAgIC8vIOiBiuWkqeiusOW9leWUr+S4gElEXHJcbiAgICBnZXRVbmlxdWVJZDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhY2tfaWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrX2lkID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFja19pZCA9IHRoaXMuc3RhY2tfaWQgKyAxO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrX2lkO1xyXG4gICAgfSxcclxuXHJcbiAgICAvLyDmiZPlvIDlpb3lj4vkv6Hmga/nlYzpnaJcclxuICAgIG9wZW5GcmllbmRJbmZvOiBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICAgICAgdmFyIEZyaWVuZENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZnJpZW5kX2NvbnRyb2xsZXJcIik7XHJcbiAgICAgICAgRnJpZW5kQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRDaGVja1BhbmVsKHRydWUsIGRhdGEpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy8g6L+U5Zue6IGK5aSp55qE6L6T5YWl57uE5Lu2XHJcbiAgICBnZXRDaGF0SW5wdXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXRfd2luZG93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXRfd2luZG93LmNoYXRfaW5wdXRfcGFuZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXRfd2luZG93LmNoYXRfaW5wdXRfcGFuZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vICBA5Lq6XHJcbiAgICBjaGF0QXRQZW9wbGU6IGZ1bmN0aW9uKG5hbWUsIHNydl9pZCkge1xyXG4gICAgICAgIHZhciBjaGF0SW5wdXQgPSB0aGlzLmdldENoYXRJbnB1dCgpO1xyXG4gICAgICAgIGlmIChjaGF0SW5wdXQpIHtcclxuICAgICAgICAgICAgY2hhdElucHV0LnNldElucHV0VGV4dChcIkBcIiArIG5hbWUgKyBcIiBcIiwgc3J2X2lkKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOi/lOWbnuS/oeaBr+eahGlkXHJcbiAgICBnZXRJZDogZnVuY3Rpb24oY2hhbm5lbCwgc3J2X2lkLCByaWQsIG5hbWUsIG1zZykge1xyXG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5tb2RlbC5nZXRDaGFubmVsTXNncyhjaGFubmVsKTtcclxuICAgICAgICBcclxuICAgICAgICB2YXIgaWQgPSAxO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLGwgPSBsaXN0Lmxlbmd0aDtpPGw7aSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W2ldLnJvbGVfbGlzdCAmJiBsaXN0W2ldLnJvbGVfbGlzdFswXSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBsaXN0W2ldLnJvbGVfbGlzdFswXTtcclxuICAgICAgICAgICAgICAgIGlmIChzcnZfaWQgPT0gdi5zcnZfaWQgJiYgcmlkID09IHYucmlkICYmIG5hbWUgPT0gdi5uYW1lICYmIG1zZyA9PSBsaXN0W2ldLm1zZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbGlzdFtpXS5pZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9XHJcblxyXG59KVxyXG5tb2R1bGUuZXhwb3J0cyA9IENoYXRDb250cm9sbGVyOyJdfQ==