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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/chat/view/chat_input.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, 'ea923y+uqlHmL0q5Enx7xlT', 'chat_input');
// Scripts/mod/chat/view/chat_input.js
 
"use strict";
 
var ChatEvent = require("chat_event");
 
var RoleController = require("role_controller");
 
var ChatItemController = require("chat_item_controller");
 
var ChatConst = require("chat_const");
 
var ChatInput = cc.Class({
  "extends": BasePanel,
  properties: {
    root_wnd: cc.Node,
    is_keyboard: true,
    // 是否是键盘输入状态
    send_cb: null,
    visible: true
  },
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("chat", "chat_input");
    this.chat_item_ctrl = ChatItemController.getInstance();
    this.ctrl = require("chat_controller").getInstance();
  },
  // 可以初始化声明一些变量的
  initConfig: function initConfig() {
    this.item_code_list = {}; // item eqip存储信息
 
    this.item_desc_list = {};
    this.select_face = [];
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initPanel: function initPanel() {
    var change_nd = this.seekChild("change_btn");
    var send_nd = this.seekChild("send_btn");
    this.chat_sound_nd = this.seekChild("chat_sound_icon");
    this.chat_keybord_nd = this.seekChild("chat_keybord_icon");
    this.keyboard_nd = this.seekChild("keybord");
    this.sound_nd = this.seekChild("song_btn");
    this.input_ed = this.seekChild("editbox", cc.EditBox);
    this.placholder_label = this.seekChild("PLACEHOLDER_LABEL", cc.Label);
    this.face_btn = this.seekChild("face_btn");
    change_nd.on(cc.Node.EventType.TOUCH_END, this.didClickChangeBtn, this);
    send_nd.on(cc.Node.EventType.TOUCH_END, this.didClickSendBtn, this);
    this.face_btn.on(cc.Node.EventType.TOUCH_END, this.onClickFaceBtn, this);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    this.addGlobalEvent(ChatEvent.CHAT_SELECT_ITEM, function (data) {
      this.onEditTextAddItem(data);
    }.bind(this));
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调可以设置一些数据了
  onShow: function onShow(params) {},
  // 面板设置不可见的回调,这里做一些不可见的屏蔽处理
  onHide: function onHide() {},
  // 当面板从主节点释放掉的调用接口,需要手动调用,而且也一定要调用
  onDelete: function onDelete() {
    if (this.chat_input_list) this.chat_input_list.deleteMe();
  },
  setSendCallback: function setSendCallback(send_cb) {
    this.send_cb = send_cb;
  },
  didClickChangeBtn: function didClickChangeBtn(event) {
    if (this.is_keyboard) {
      this.is_keyboard = false;
      this.chat_keybord_nd.active = true;
      this.sound_nd.active = true;
      this.chat_sound_nd.active = false;
      this.keyboard_nd.active = false;
    } else {
      this.is_keyboard = true;
      this.chat_keybord_nd.active = false;
      this.sound_nd.active = false;
      this.chat_sound_nd.active = true;
      this.keyboard_nd.active = true;
    }
  },
  repleaceAtPeopleText: function repleaceAtPeopleText(text, srv_id) {
    var num1 = text.search(/@/);
    var num2 = text.search(/ /);
    var len = text.length;
 
    if (num1 != -1 && num2 != -1) {
      var at = text.substring(num1, num2);
      var rep = cc.js.formatStr("<on click='handler' param='atpeople srvid=%s'><u>%s</u></on>", srv_id, at + " ");
      text = text.replace(at, rep);
    }
 
    return text;
  },
  setChannel: function setChannel(channel) {
    this.channel = channel;
  },
  didClickSendBtn: function didClickSendBtn() {
    var seedMesageArr = this.getInputText();
    if (!seedMesageArr) return;
    var seedMesage = seedMesageArr[0] || "";
    var srv_id = seedMesageArr[1] || "";
 
    if (seedMesage.length > 0 && this.send_cb) {
      // 替换表情
      var message = this.chat_item_ctrl.relapceFaceIconTag(seedMesage); // 替换表情
      // 替换teim
 
      for (var item_i in this.item_code_list) {
        var item_info = this.item_code_list[item_i];
        message = message.replace(new RegExp(item_info.key, 'i'), item_info.desc);
      }
 
      if (this.channel == ChatConst.Channel.World || this.channel == ChatConst.Channel.Cross || this.channel == ChatConst.Channel.Province || this.channel == ChatConst.Channel.Gang) {
        //世界聊天 跨服聊天 同省聊天 帮派聊天
        message = this.repleaceAtPeopleText(message, srv_id);
      }
 
      if (this.ctrl.canSend(this.channel)) {
        this.input_ed.string = "";
      }
 
      this.send_cb(message);
      if (this.chat_input_list) this.chat_input_list.setVisible(false);
    } else {}
  },
  onClickFaceBtn: function onClickFaceBtn(event) {
    if (!this.chat_input_list) {
      var ChatInputList = require("chat_input_list");
 
      var chat_input_list = this.chat_input_list = new ChatInputList();
      chat_input_list.setParent(this.root_wnd);
      chat_input_list.setSelectCB(this.onEditTextAddFace.bind(this));
      chat_input_list.show();
    } else {
      if (this.chat_input_list.isOpen()) {
        this.chat_input_list.setVisible(false);
      } else {
        this.chat_input_list.setVisible(true);
      }
    }
  },
  // 选中表情返回
  onEditTextAddFace: function onEditTextAddFace(face_txt) {
    if (face_txt) {
      if (this.select_face.length < 5) {
        this.select_face.push(face_txt);
        this.input_ed.string += face_txt;
      } else {
        message(Utils.TI18N("发言中不能超过5个表情"));
      }
    }
  },
  onEditTextAddItem: function onEditTextAddItem(data) {
    if (!data) return;
    var text = this.input_ed.string;
 
    if (text == "") {
      this.item_code_list = {};
      this.item_desc_list = {};
    }
 
    var base_id = data.base_id;
    var share_id = data.share_id;
    var count = data.count;
    var role_vo = RoleController.getInstance().getRoleVo();
    var item_config = Utils.getItemConfig(base_id);
    var code = data.code;
 
    if (item_config) {
      var key = cc.js.formatStr("{%s,%s}", share_id, item_config.name);
      var desc = this.chat_item_ctrl.buildItemMsg(base_id, role_vo.srv_id, share_id, count);
 
      if (this.item_code_list[code]) {
        var cur_object = this.item_code_list[code];
        var cur_key = cur_object.key;
        var cur_desc = cur_object.desc; // 获取原有的
 
        text = text.replace(cur_key, key);
      } else {
        text = text + key;
      }
 
      this.item_code_list[code] = {
        key: key,
        desc: desc
      };
      this.input_ed.string = text;
    }
  },
  setPlacholderLabel: function setPlacholderLabel(str) {
    if (this.placholder_label && str) {
      this.placholder_label.string = str;
    }
  },
  //  文本框内容
  getInputText: function getInputText() {
    return [this.input_ed.string, this.extend];
  },
  setInputText: function setInputText(str, extend) {
    this.extend = extend;
 
    if (this.input_ed) {
      if (!str) {
        str = "";
      }
 
      this.input_ed.string = str;
    }
  }
});
module.exports = ChatInput;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxjaGF0XFx2aWV3XFxjaGF0X2lucHV0LmpzIl0sIm5hbWVzIjpbIkNoYXRFdmVudCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkNoYXRJdGVtQ29udHJvbGxlciIsIkNoYXRDb25zdCIsIkNoYXRJbnB1dCIsImNjIiwiQ2xhc3MiLCJCYXNlUGFuZWwiLCJwcm9wZXJ0aWVzIiwicm9vdF93bmQiLCJOb2RlIiwiaXNfa2V5Ym9hcmQiLCJzZW5kX2NiIiwidmlzaWJsZSIsImN0b3IiLCJwcmVmYWJQYXRoIiwiUGF0aFRvb2wiLCJnZXRQcmVmYWJQYXRoIiwiY2hhdF9pdGVtX2N0cmwiLCJnZXRJbnN0YW5jZSIsImN0cmwiLCJpbml0Q29uZmlnIiwiaXRlbV9jb2RlX2xpc3QiLCJpdGVtX2Rlc2NfbGlzdCIsInNlbGVjdF9mYWNlIiwiaW5pdFBhbmVsIiwiY2hhbmdlX25kIiwic2Vla0NoaWxkIiwic2VuZF9uZCIsImNoYXRfc291bmRfbmQiLCJjaGF0X2tleWJvcmRfbmQiLCJrZXlib2FyZF9uZCIsInNvdW5kX25kIiwiaW5wdXRfZWQiLCJFZGl0Qm94IiwicGxhY2hvbGRlcl9sYWJlbCIsIkxhYmVsIiwiZmFjZV9idG4iLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImRpZENsaWNrQ2hhbmdlQnRuIiwiZGlkQ2xpY2tTZW5kQnRuIiwib25DbGlja0ZhY2VCdG4iLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJDSEFUX1NFTEVDVF9JVEVNIiwiZGF0YSIsIm9uRWRpdFRleHRBZGRJdGVtIiwiYmluZCIsIm9uU2hvdyIsInBhcmFtcyIsIm9uSGlkZSIsIm9uRGVsZXRlIiwiY2hhdF9pbnB1dF9saXN0IiwiZGVsZXRlTWUiLCJzZXRTZW5kQ2FsbGJhY2siLCJldmVudCIsImFjdGl2ZSIsInJlcGxlYWNlQXRQZW9wbGVUZXh0IiwidGV4dCIsInNydl9pZCIsIm51bTEiLCJzZWFyY2giLCJudW0yIiwibGVuIiwibGVuZ3RoIiwiYXQiLCJzdWJzdHJpbmciLCJyZXAiLCJqcyIsImZvcm1hdFN0ciIsInJlcGxhY2UiLCJzZXRDaGFubmVsIiwiY2hhbm5lbCIsInNlZWRNZXNhZ2VBcnIiLCJnZXRJbnB1dFRleHQiLCJzZWVkTWVzYWdlIiwibWVzc2FnZSIsInJlbGFwY2VGYWNlSWNvblRhZyIsIml0ZW1faSIsIml0ZW1faW5mbyIsIlJlZ0V4cCIsImtleSIsImRlc2MiLCJDaGFubmVsIiwiV29ybGQiLCJDcm9zcyIsIlByb3ZpbmNlIiwiR2FuZyIsImNhblNlbmQiLCJzdHJpbmciLCJzZXRWaXNpYmxlIiwiQ2hhdElucHV0TGlzdCIsInNldFBhcmVudCIsInNldFNlbGVjdENCIiwib25FZGl0VGV4dEFkZEZhY2UiLCJzaG93IiwiaXNPcGVuIiwiZmFjZV90eHQiLCJwdXNoIiwiVXRpbHMiLCJUSTE4TiIsImJhc2VfaWQiLCJzaGFyZV9pZCIsImNvdW50Iiwicm9sZV92byIsImdldFJvbGVWbyIsIml0ZW1fY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsImNvZGUiLCJuYW1lIiwiYnVpbGRJdGVtTXNnIiwiY3VyX29iamVjdCIsImN1cl9rZXkiLCJjdXJfZGVzYyIsInNldFBsYWNob2xkZXJMYWJlbCIsInN0ciIsImV4dGVuZCIsInNldElucHV0VGV4dCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsU0FBUyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxrQkFBa0IsR0FBR0YsT0FBTyxDQUFDLHNCQUFELENBQWhDOztBQUNBLElBQUlHLFNBQVMsR0FBR0gsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBRUEsSUFBSUksU0FBUyxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN4QixhQUFTQyxTQURlO0FBR3hCQyxFQUFBQSxVQUFVLEVB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QUF0QixHQUErQjBCLEdBQS9CO0FBQ0E7QUFDRCxHQXpNdUI7QUEyTXhCO0FBQ0F6QyxFQUFBQSxZQUFZLEVBQUMsd0JBQVU7QUFDdEIsV0FBTyxDQUFDLEtBQUszQyxRQUFMLENBQWMwRCxNQUFmLEVBQXNCLEtBQUsyQixNQUEzQixDQUFQO0FBQ0EsR0E5TXVCO0FBZ054QkMsRUFBQUEsWUFBWSxFQUFDLHNCQUFTRixHQUFULEVBQWNDLE1BQWQsRUFBcUI7QUFDakMsU0FBS0EsTUFBTCxHQUFjQSxNQUFkOztBQUNBLFFBQUcsS0FBS3JGLFFBQVIsRUFBaUI7QUFDaEIsVUFBRyxDQUFDb0YsR0FBSixFQUFRO0FBQ1BBLFFBQUFBLEdBQUcsR0FBQyxFQUFKO0FBQ0E7O0FBQ0QsV0FBS3BGLFFBQUwsQ0FBYzBELE1BQWQsR0FBdUIwQixHQUF2QjtBQUNBO0FBQ0Q7QUF4TnVCLENBQVQsQ0FBaEI7QUEyTkFHLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJILFNBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgQ2hhdEV2ZW50ID0gcmVxdWlyZShcImNoYXRfZXZlbnRcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDaGF0SXRlbUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiY2hhdF9pdGVtX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDaGF0Q29uc3QgPSByZXF1aXJlKFwiY2hhdF9jb25zdFwiKTtcclxuXHJcbnZhciBDaGF0SW5wdXQgPSBjYy5DbGFzcyh7XHJcblx0ZXh0ZW5kczogQmFzZVBhbmVsLFxyXG5cclxuXHRwcm9wZXJ0aWVzOiB7XHJcblx0XHRyb290X3duZDogY2MuTm9kZSxcclxuXHRcdGlzX2tleWJvYXJkOiB0cnVlLCAgICAgICAgICAgICAgLy8g5piv5ZCm5piv6ZSu55uY6L6T5YWl54q25oCBXHJcblx0XHRzZW5kX2NiOiBudWxsLFxyXG5cdFx0dmlzaWJsZTogdHJ1ZSxcclxuXHR9LCBcclxuXHJcblx0Y3RvcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImNoYXRcIiwgXCJjaGF0X2lucHV0XCIpO1xyXG5cdFx0dGhpcy5jaGF0X2l0ZW1fY3RybCA9IENoYXRJdGVtQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG5cdFx0dGhpcy5jdHJsID0gcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xyXG5cdH0sXHJcblxyXG5cclxuICAgIC8vIOWPr+S7peWIneWni+WMluWjsOaYjuS4gOS6m+WPmOmHj+eahFxyXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xyXG4gICAgXHR0aGlzLml0ZW1fY29kZV9saXN0ID0ge307ICAvLyBpdGVtIGVxaXDlrZjlgqjkv6Hmga9cclxuICAgIFx0dGhpcy5pdGVtX2Rlc2NfbGlzdCA9IHt9O1xyXG4gICAgXHR0aGlzLnNlbGVjdF9mYWNlID0gW107XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcclxuICAgIGluaXRQYW5lbDpmdW5jdGlvbigpe1xyXG5cdFx0dmFyIGNoYW5nZV9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNoYW5nZV9idG5cIik7XHJcblx0XHR2YXIgc2VuZF9uZCAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic2VuZF9idG5cIik7XHJcblx0XHR0aGlzLmNoYXRfc291bmRfbmQgICA9IHRoaXMuc2Vla0NoaWxkKFwiY2hhdF9zb3VuZF9pY29uXCIpO1xyXG5cdFx0dGhpcy5jaGF0X2tleWJvcmRfbmQgPSB0aGlzLnNlZWtDaGlsZChcImNoYXRfa2V5Ym9yZF9pY29uXCIpO1xyXG5cdFx0dGhpcy5rZXlib2FyZF9uZCAgICAgPSB0aGlzLnNlZWtDaGlsZChcImtleWJvcmRcIik7XHJcblx0XHR0aGlzLnNvdW5kX25kICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwic29uZ19idG5cIik7XHJcblx0XHR0aGlzLmlucHV0X2VkICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZWRpdGJveFwiLCBjYy5FZGl0Qm94KTtcclxuXHRcdHRoaXMucGxhY2hvbGRlcl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKFwiUExBQ0VIT0xERVJfTEFCRUxcIiwgY2MuTGFiZWwpO1xyXG5cdFx0XHJcblx0XHR0aGlzLmZhY2VfYnRuICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiZmFjZV9idG5cIik7XHJcblx0XHRcclxuXHRcdGNoYW5nZV9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tDaGFuZ2VCdG4sIHRoaXMpO1x0XHRcclxuXHRcdHNlbmRfbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLmRpZENsaWNrU2VuZEJ0biwgdGhpcyk7XHJcblx0XHR0aGlzLmZhY2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5vbkNsaWNrRmFjZUJ0biwgdGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcclxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcclxuICAgIFx0dGhpcy5hZGRHbG9iYWxFdmVudChDaGF0RXZlbnQuQ0hBVF9TRUxFQ1RfSVRFTSwgZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgXHRcdHRoaXMub25FZGl0VGV4dEFkZEl0ZW0oZGF0YSk7XHJcbiAgICBcdH0uYmluZCh0aGlzKSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIPlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcclxuICAgIG9uU2hvdzpmdW5jdGlvbihwYXJhbXMpe1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgLy8g6Z2i5p2/6K6+572u5LiN5Y+v6KeB55qE5Zue6LCDLOi/memHjOWBmuS4gOS6m+S4jeWPr+ingeeahOWxj+iUveWkhOeQhlxyXG4gICAgb25IaWRlOmZ1bmN0aW9uKCl7XHJcblxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlvZPpnaLmnb/ku47kuLvoioLngrnph4rmlL7mjonnmoTosIPnlKjmjqXlj6Ms6ZyA6KaB5omL5Yqo6LCD55SoLOiAjOS4lOS5n+S4gOWumuimgeiwg+eUqFxyXG4gICAgb25EZWxldGU6ZnVuY3Rpb24oKXtcclxuICAgIFx0aWYgKHRoaXMuY2hhdF9pbnB1dF9saXN0KVxyXG4gICAgXHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LmRlbGV0ZU1lKCk7XHJcbiAgICB9LFxyXG5cclxuXHJcblx0c2V0U2VuZENhbGxiYWNrOiBmdW5jdGlvbihzZW5kX2NiKSB7XHJcblx0XHR0aGlzLnNlbmRfY2IgPSBzZW5kX2NiO1xyXG5cdH0sXHJcblxyXG5cdGRpZENsaWNrQ2hhbmdlQnRuOiBmdW5jdGlvbihldmVudCkge1xyXG5cdFx0aWYgKHRoaXMuaXNfa2V5Ym9hcmQpIHtcclxuXHRcdFx0dGhpcy5pc19rZXlib2FyZCA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmNoYXRfa2V5Ym9yZF9uZC5hY3RpdmUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLnNvdW5kX25kLmFjdGl2ZSA9IHRydWU7XHJcblx0XHRcdHRoaXMuY2hhdF9zb3VuZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5rZXlib2FyZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuaXNfa2V5Ym9hcmQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmNoYXRfa2V5Ym9yZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5zb3VuZF9uZC5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5jaGF0X3NvdW5kX25kLmFjdGl2ZSA9IHRydWU7XHJcblx0XHRcdHRoaXMua2V5Ym9hcmRfbmQuYWN0aXZlID0gdHJ1ZTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZXBsZWFjZUF0UGVvcGxlVGV4dDpmdW5jdGlvbiggdGV4dCwgc3J2X2lkICl7XHJcblx0XHR2YXIgbnVtMSA9IHRleHQuc2VhcmNoKC9ALyk7XHJcblx0XHR2YXIgbnVtMiA9IHRleHQuc2VhcmNoKC8gLyk7XHJcblx0XHR2YXIgbGVuID0gdGV4dC5sZW5ndGg7XHJcblx0XHRpZihudW0xIT0tMSAmJiBudW0yIT0tMSl7XHJcblx0XHRcdHZhciBhdCA9IHRleHQuc3Vic3RyaW5nKG51bTEsbnVtMik7XHJcblx0XHRcdHZhciByZXAgPSBjYy5qcy5mb3JtYXRTdHIoXCI8b24gY2xpY2s9J2hhbmRsZXInIHBhcmFtPSdhdHBlb3BsZSBzcnZpZD0lcyc+PHU+JXM8L3U+PC9vbj5cIixzcnZfaWQsYXQrXCIgXCIpXHJcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoYXQscmVwKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0ZXh0O1xyXG5cdH0sXHJcblxyXG5cdHNldENoYW5uZWw6ZnVuY3Rpb24oY2hhbm5lbCl7XHJcblx0XHR0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xyXG5cdH0sXHJcblxyXG5cdGRpZENsaWNrU2VuZEJ0bjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgc2VlZE1lc2FnZUFyciA9IHRoaXMuZ2V0SW5wdXRUZXh0KCk7XHJcblx0XHRpZighc2VlZE1lc2FnZUFycilyZXR1cm47XHJcblxyXG5cdFx0dmFyIHNlZWRNZXNhZ2UgPSBzZWVkTWVzYWdlQXJyWzBdIHx8IFwiXCI7XHJcblx0XHR2YXIgc3J2X2lkID0gc2VlZE1lc2FnZUFyclsxXSB8fCBcIlwiO1xyXG5cdFx0XHJcblx0XHRpZiAoc2VlZE1lc2FnZS5sZW5ndGggPiAwICYm44CAdGhpcy5zZW5kX2NiKSB7XHJcblx0XHRcdC8vIOabv+aNouihqOaDhVxyXG5cdFx0XHR2YXIgbWVzc2FnZSA9IHRoaXMuY2hhdF9pdGVtX2N0cmwucmVsYXBjZUZhY2VJY29uVGFnKHNlZWRNZXNhZ2UpOyAvLyDmm7/mjaLooajmg4VcclxuXHRcdFx0Ly8g5pu/5o2idGVpbVxyXG5cdFx0XHRmb3IgKHZhciBpdGVtX2kgaW4gdGhpcy5pdGVtX2NvZGVfbGlzdCkge1xyXG5cdFx0XHRcdHZhciBpdGVtX2luZm8gPSB0aGlzLml0ZW1fY29kZV9saXN0W2l0ZW1faV07XHJcblx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShuZXcgUmVnRXhwKGl0ZW1faW5mby5rZXksICdpJyksIGl0ZW1faW5mby5kZXNjKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYodGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLldvcmxkIHx8IHRoaXMuY2hhbm5lbCA9PSBDaGF0Q29uc3QuQ2hhbm5lbC5Dcm9zcyB8fCB0aGlzLmNoYW5uZWwgPT0gQ2hhdENvbnN0LkNoYW5uZWwuUHJvdmluY2UgfHwgdGhpcy5jaGFubmVsID09IENoYXRDb25zdC5DaGFubmVsLkdhbmcpey8v5LiW55WM6IGK5aSpIOi3qOacjeiBiuWkqSDlkIznnIHogYrlpKkg5biu5rS+6IGK5aSpXHJcblx0XHRcdFx0bWVzc2FnZSA9IHRoaXMucmVwbGVhY2VBdFBlb3BsZVRleHQobWVzc2FnZSwgc3J2X2lkKTtcclxuXHRcdFx0fVxyXG5cdFx0XHJcblx0XHRcdGlmKHRoaXMuY3RybC5jYW5TZW5kKHRoaXMuY2hhbm5lbCkpe1xyXG5cdFx0XHRcdHRoaXMuaW5wdXRfZWQuc3RyaW5nID0gXCJcIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZW5kX2NiKG1lc3NhZ2UpO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYgKHRoaXMuY2hhdF9pbnB1dF9saXN0KVxyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUoZmFsc2UpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRvbkNsaWNrRmFjZUJ0bjogZnVuY3Rpb24oZXZlbnQpIHtcclxuXHRcdGlmICghdGhpcy5jaGF0X2lucHV0X2xpc3QpIHtcclxuXHRcdFx0dmFyIENoYXRJbnB1dExpc3QgPSByZXF1aXJlKFwiY2hhdF9pbnB1dF9saXN0XCIpO1xyXG5cdFx0XHR2YXIgY2hhdF9pbnB1dF9saXN0ID0gdGhpcy5jaGF0X2lucHV0X2xpc3QgPSBuZXcgQ2hhdElucHV0TGlzdCgpO1xyXG5cdFx0XHRjaGF0X2lucHV0X2xpc3Quc2V0UGFyZW50KHRoaXMucm9vdF93bmQpO1x0XHJcblx0XHRcdGNoYXRfaW5wdXRfbGlzdC5zZXRTZWxlY3RDQih0aGlzLm9uRWRpdFRleHRBZGRGYWNlLmJpbmQodGhpcykpO1x0XHRcclxuXHRcdFx0Y2hhdF9pbnB1dF9saXN0LnNob3coKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0aGlzLmNoYXRfaW5wdXRfbGlzdC5pc09wZW4oKSkge1xyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUoZmFsc2UpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuY2hhdF9pbnB1dF9saXN0LnNldFZpc2libGUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyDpgInkuK3ooajmg4Xov5Tlm55cclxuXHRvbkVkaXRUZXh0QWRkRmFjZTogZnVuY3Rpb24oZmFjZV90eHQpIHtcclxuXHRcdGlmIChmYWNlX3R4dCkge1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RfZmFjZS5sZW5ndGggPCA1KSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RfZmFjZS5wdXNoKGZhY2VfdHh0KTtcclxuXHRcdFx0XHR0aGlzLmlucHV0X2VkLnN0cmluZyArPSBmYWNlX3R4dDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdCAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWPkeiogOS4reS4jeiDvei2hei/hzXkuKrooajmg4VcIikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0b25FZGl0VGV4dEFkZEl0ZW06IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdGlmICghZGF0YSkgcmV0dXJuO1xyXG5cdFx0dmFyIHRleHQgPSB0aGlzLmlucHV0X2VkLnN0cmluZztcclxuXHRcclxuXHRcdGlmKHRleHQgPT0gXCJcIil7XHJcblx0XHRcdHRoaXMuaXRlbV9jb2RlX2xpc3QgPSB7fTtcclxuXHRcdFx0dGhpcy5pdGVtX2Rlc2NfbGlzdCA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBiYXNlX2lkICAgICA9IGRhdGEuYmFzZV9pZDtcclxuXHRcdHZhciBzaGFyZV9pZCAgICA9IGRhdGEuc2hhcmVfaWQ7XHJcblx0XHR2YXIgY291bnQgICAgICAgPSBkYXRhLmNvdW50O1xyXG5cdFx0dmFyIHJvbGVfdm8gICAgID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuXHRcdHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoYmFzZV9pZCk7XHJcblx0XHR2YXIgY29kZSAgICAgICAgPSBkYXRhLmNvZGU7XHJcblxyXG5cdCAgICBpZiAoaXRlbV9jb25maWcpIHtcclxuXHQgICAgICAgIHZhciBrZXkgPSBjYy5qcy5mb3JtYXRTdHIoXCJ7JXMsJXN9XCIsIHNoYXJlX2lkLCBpdGVtX2NvbmZpZy5uYW1lKTtcclxuXHQgICAgICAgIHZhciBkZXNjID0gdGhpcy5jaGF0X2l0ZW1fY3RybC5idWlsZEl0ZW1Nc2coYmFzZV9pZCwgcm9sZV92by5zcnZfaWQsIHNoYXJlX2lkLCBjb3VudCk7XHJcblxyXG5cdCAgICAgICAgaWYgKHRoaXMuaXRlbV9jb2RlX2xpc3RbY29kZV0pIHtcclxuXHQgICAgICAgICAgICB2YXIgY3VyX29iamVjdCA9IHRoaXMuaXRlbV9jb2RlX2xpc3RbY29kZV07XHJcblx0ICAgICAgICAgICAgdmFyIGN1cl9rZXkgPSBjdXJfb2JqZWN0LmtleTtcclxuXHQgICAgICAgICAgICB2YXIgY3VyX2Rlc2MgPSBjdXJfb2JqZWN0LmRlc2M7XHJcblx0ICAgICAgICAgICAgLy8g6I635Y+W5Y6f5pyJ55qEXHJcblx0ICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShjdXJfa2V5LCBrZXkpO1xyXG5cdCAgICAgICAgfSBlbHNlIHtcclxuXHQgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIGtleTtcclxuXHQgICAgICAgIH1cclxuXHJcblx0ICAgICAgICB0aGlzLml0ZW1fY29kZV9saXN0W2NvZGVdID0ge2tleTprZXksIGRlc2M6ZGVzY307XHJcblx0ICAgICAgICB0aGlzLmlucHV0X2VkLnN0cmluZyA9IHRleHQ7XHJcblx0ICAgIH0gXHJcblx0fSxcclxuXHJcblx0c2V0UGxhY2hvbGRlckxhYmVsOmZ1bmN0aW9uKHN0cil7XHJcblx0XHRpZih0aGlzLnBsYWNob2xkZXJfbGFiZWwgJiYgc3RyKXtcclxuXHRcdFx0dGhpcy5wbGFjaG9sZGVyX2xhYmVsLnN0cmluZyA9IHN0cjtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyAg5paH5pys5qGG5YaF5a65XHJcblx0Z2V0SW5wdXRUZXh0OmZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gW3RoaXMuaW5wdXRfZWQuc3RyaW5nLHRoaXMuZXh0ZW5kXTtcclxuXHR9LFxyXG5cclxuXHRzZXRJbnB1dFRleHQ6ZnVuY3Rpb24oc3RyLCBleHRlbmQpe1xyXG5cdFx0dGhpcy5leHRlbmQgPSBleHRlbmQ7XHJcblx0XHRpZih0aGlzLmlucHV0X2VkKXtcclxuXHRcdFx0aWYoIXN0cil7XHJcblx0XHRcdFx0c3RyPVwiXCI7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5pbnB1dF9lZC5zdHJpbmcgPSBzdHI7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcbn0pXHJcbm1vZHVsZS5leHBvcnRzID0gQ2hhdElucHV0O1xyXG4iXX0=