(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/friend/friend_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, '46debPOR8hE1ZazERYrrLAe', 'friend_model'); // Scripts/mod/friend/friend_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2018-12-24 16:41:34 // -------------------------------------------------------------------- var FriendController = require("friend_controller"); var FriendVo = require("friend_vo"); var FriendEvent = require("friend_event"); var FriendModel = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.ctrl = FriendController.getInstance(); this.initConfig(); }, properties: {}, initConfig: function initConfig() { this.list = {}; // 好友列表 this.apply = []; // 好友申请列表 this.plist = {}; this.onlinelist = {}; this.blacklist = []; // 黑名单列表 this.honey_list_count = 20; //最近联系人限制 this.last_select_group = 1; //最后选择的分组(默认选择第一个分组) this.last_select_friend_srv_id = null; this.last_select_friend_rid = null; this.present_count = 0; //当天可以赠送好友体力剩余次数 this.draw_count = 0; //当天可以领取好友体力剩余次数 this.draw_total_count = 0; //当天可以领取好友体力总次数 this.last_select_index = 1; //默认上次选中的序号 }, //添加数据 add: function add(val) { if (this.list[val.srv_id + "_" + val.rid] == null) this.list[val.srv_id + "_" + val.rid] = val; }, addPchat: function addPchat(val) { if (this.plist[val.srv_id + "_" + val.rid] == null) this.plist[val.srv_id + "_" + val.rid] = val; }, getOnlineFriendList: function getOnlineFriendList() { var online_list = []; for (var k in this.list) { var v = this.list[k]; if (v && v.is_online == 1) { //在线 online_list.push(v); } } return online_list; }, getFriendInfo: function getFriendInfo(srv_id, rid) { var friend_i = srv_id + "_" + rid; return this.list[friend_i]; }, //申请列表 setApplyList: function setApplyList(list) { var arr = []; for (var i in list) { var v = list[i]; if (v) { arr.push(v); } } this.apply = arr; gcore.Timer.set(function () { gcore.GlobalEvent.fire(FriendEvent.Update_Red_Point); }, 1000, -1); }, getApplyList: function getApplyList() { return this.apply || []; }, getApplyNum: function getApplyNum() { return this.apply.length; }, //删除数据 del: function del(srv_id, rid) { if (this.list[srv_id + "_" + rid] != null) this.list[srv_id + "_" + rid] = null; // this.list.splice(srv_id + "_" + rid,1) }, //更新单个数据 updateVo: function updateVo(srv_id, rid, key, value) { var vo = this.list[srv_id + "_" + rid]; if (vo != null) { vo.update(key, value); } return vo; }, //红点判断,要显示出可领取的数量,跟申请列表的数量 getAwardNum: function getAwardNum() { var num = 0; for (var i in this.list) { var v = this.list[i]; if (v && v.is_draw == 1) { num = num + 1; } } return num; }, updateSingleFriendData: function updateSingleFriendData(srv_id, rid, data) { var key = srv_id + "_" + rid; if (this.list[key]) this.list[key].setData(data); }, //获取单个数据 getVo: function getVo(srv_id, rid) { return this.list[srv_id + "_" + rid]; }, //转化为数组 getArray: function getArray() { var array = new Array(); for (var k in this.list) { if (this.list[k]) { array.push(this.list[k]); } } array.sort(Utils.tableUpperSorter(["is_online", "lev", "power"])); return array; }, //获取跨服/同服好友数据 getGroupList: function getGroupList(name) { var array = new Array(); for (var k in this.list) { var v = this.list[k]; if (v.is_cross == 1 && name == "cross") { array.push(v); } else if (v.is_cross == 0 && name == "alike") { array.push(v); } } array.sort(Utils.tableUpperSorter(["is_online", "lev"])); return array; }, //获取跨服/同服好友在线数和总数 getGroupOnlineAndTotal: function getGroupOnlineAndTotal(group_name) { var online_num = 0; var total_num = 0; var group_data = this.getGroupList(group_name); var len = group_data.GetSize(); total_num = len; for (var i = 1; i <= len; i++) { var friend_vo = group_data.Get(i - 1); if (friend_vo.srv_id && friend_vo.rid && friend_vo.is_online == 1) { online_num = online_num + 1; } } return { online_num: online_num, total_num: total_num }; }, //获取所有好友在线和总数量 getFriendOnlineAndTotal: function getFriendOnlineAndTotal() { var online_num = 0; var total_num = 0; if (this.list) { for (var k in this.list) { var friend_vo = this.list[k]; if (friend_vo && friend_vo.srv_id && friend_vo.rid && friend_vo.is_online == 1) { online_num = online_num + 1; } if (friend_vo) total_num = total_num + 1; } } return { online_num: online_num, total_num: total_num }; }, //获取最近联系人在线数和总数 getHoneyListOnlineAndTotal: function getHoneyListOnlineAndTotal(is_require) { var total_num = 0; var online_num = 0; var honeyList = this.getHoneyList(is_require); var len = honeyList.GetSize(); total_num = len; for (var i = 1; i <= len; i++) { var item = honeyList.Get(i - 1); if (item.srv_id && item.rid && item.is_online == 1) { online_num = online_num + 1; } } return { online_num: online_num, total_num: total_num }; }, //获取黑名单在线数和总数 getBlackListOnlineAndTotal: function getBlackListOnlineAndTotal() { var total_num = 0; var online_num = 0; for (var k in this.blacklist) { var v = this.blacklist[k]; if (v != null && v.is_online != null && v.is_online == 1) { online_num = online_num + 1; } total_num = total_num + 1; } return { online_num: online_num, total_num: total_num }; }, //获取索引 getIndex: function getIndex(srv_id, rid) { var array = this.getArray(); for (var i = 0; i < array.length; i++) { var vo = array[i]; if (vo.srv_id == srv_id && vo.rid == rid) { return i; } } return null; }, isFriend: function isFriend(srv_id, rid) { if (srv_id == null || rid == null) { return false; } var vo = this.list[srv_id + "_" + rid]; if (vo && vo.is_moshengren == 0) return true; return false; }, isFriend2: function isFriend2(key) { var vo = this.list[key]; if (vo && vo.is_moshengren == 0) return true; return false; }, //保存非好友联系人的在线数据 setOnlineData: function setOnlineData(key) { this.onlinelist = []; for (var i in list) { var vo = list[i]; var key = vo.srv_id + "+" + vo.id; this.onlinelist[key] = 1; } }, getOnlineData: function getOnlineData(key) { if (this.onlinelist[key]) return 1;else return 0; }, setOnlineKey: function setOnlineKey(key) { this.onlinelist[key] = 1; }, setFriendPresentCount: function setFriendPresentCount(count) { this.present_count = count; }, getFriendPresentCount: function getFriendPresentCount() { return this.present_count; }, setFriendDrawCount: function setFriendDrawCount(count) { this.draw_count = count; }, getFriendDrawCount: function getFriendDrawCount() { return this.draw_count; }, setFriendDrawTotalCount: function setFriendDrawTotalCount(total) { this.draw_total_count = total; }, getFriendDrawTotalCount: function getFriendDrawTotalCount() { return this.draw_total_count; }, //-------------------黑名单模块数据: //初始化 initBlackList: function initBlackList(list, is_add) { for (var k in list) { var vo = new FriendVo(); var v = list[k]; vo.setData(v); this.blacklist[v.rid + "_" + v.srv_id] = vo; } }, //移除黑名单 removeBlack: function removeBlack(rid, srv_id) { if (rid && srv_id) delete this.blacklist[rid + "_" + srv_id]; }, //黑名单数组 getBlackArray: function getBlackArray() { var array = new Array(); for (var k in this.blacklist) { array.push(this.blacklist[k]); } array.sort(Utils.tableUpperSorter(["is_online", "lev", "power"])); return array; }, //是否在黑名单里面 isBlack: function isBlack(rid, srv_id) { var isIn = false; if (rid && srv_id && this.blacklist[rid + "_" + srv_id]) { isIn = true; } return isIn; }, setLastSelectGroup: function setLastSelectGroup(value) { this.last_select_group = value; }, getLastSelectGroup: function getLastSelectGroup() { return this.last_select_group; }, setLastSelectFriend: function setLastSelectFriend(srv_id, rid) { this.last_select_friend_srv_id = srv_id; this.last_select_friend_rid = rid; }, setLastSelectFriendIndex: function setLastSelectFriendIndex(index) { this.last_select_index = index || 1; }, getLastSelectFriendIndex: function getLastSelectFriendIndex() { return this.last_select_index; }, getLastSelectFriend: function getLastSelectFriend() { return this.last_select_friend_srv_id, this.last_select_friend_rid; }, __delete: function __delete() {} }); module.exports = FriendModel; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxmcmllbmRcXGZyaWVuZF9tb2RlbC5qcyJdLCJuYW1lcyI6WyJGcmllbmRDb250cm9sbGVyIiwicmVxdWlyZSIsIkZyaWVuZFZvIiwiRnJpZW5kRXZlbnQiLCJGcmllbmRNb2RlbCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiY3RybCIsImdldEluc3RhbmNlIiwiaW5pdENvbmZpZyIsInByb3BlcnRpZXMiLCJsaXN0IiwiYXBwbHkiLCJwbGlzdCIsIm9ubGluZWxpc3QiLCJibGFja2xpc3QiLCJob25leV9saXN0X2NvdW50IiwibGFzdF9zZWxlY3RfZ3JvdXAiLCJsYXN0X3NlbGVjdF9mcmllbmRfc3J2X2lkIiwibGFzdF9zZWxlY3RfZnJpZW5kX3JpZCIsInByZXNlbnRfY291bnQiLCJkcmF3X2NvdW50IiwiZHJhd190b3RhbF9jb3VudCIsImxhc3Rfc2VsZWN0X2luZGV4IiwiYWRkIiwidmFsIiwic3J2X2lkIiwicmlkIiwiYWRkUGNoYXQiLCJnZXRPbmxpbmVGcmllbmRMaXN0Iiwib25saW5lX2xpc3QiLCJrIiwidiIsImlzX29ubGluZSIsInB1c2giLCJnZXRGcmllbmRJbmZvIiwiZnJpZW5kX2kiLCJzZXRBcHBseUxpc3QiLCJhcnIiLCJpIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZV9SZWRfUG9pbnQiLCJnZXRBcHBseUxpc3QiLCJnZXRBcHBseU51bSIsImxlbmd0aCIsImRlbCIsInVwZGF0ZVZvIiwia2V5IiwidmFsdWUiLCJ2byIsInVwZGF0ZSIsImdldEF3YXJkTnVtIiwibnVtIiwiaXNfZHJhdyIsInVwZGF0ZVNpbmdsZUZyaWVuZERhdGEiLCJkYXRhIiwic2V0RGF0YSIsImdldFZvIiwiZ2V0QXJyYXkiLCJhcnJheSIsIkFycmF5Iiwic29ydCIsIlV0aWxzIiwidGFibGVVcHBlclNvcnRlciIsImdldEdyb3VwTGlzdCIsIm5hbWUiLCJpc19jcm9zcyIsImdldEdyb3VwT25saW5lQW5kVG90YWwiLCJncm91cF9uYW1lIiwib25saW5lX251bSIsInRvdGFsX251bSIsImdyb3VwX2RhdGEiLCJsZW4iLCJHZXRTaXplIiwiZnJpZW5kX3ZvIiwiR2V0IiwiZ2V0RnJpZW5kT25saW5lQW5kVG90YWwiLCJnZXRIb25leUxpc3RPbmxpbmVBbmRUb3RhbCIsImlzX3JlcXVpcmUiLCJob25leUxpc3QiLCJnZXRIb25leUxpc3QiLCJpdGVtIiwiZ2V0QmxhY2tMaXN0T25saW5lQW5kVG90YWwiLCJnZXRJbmRleCIsImlzRnJpZW5kIiwiaXNfbW9zaGVuZ3JlbiIsImlzRnJpZW5kMiIsInNldE9ubGluZURhdGEiLCJpZCIsImdldE9ubGluZURhdGEiLCJzZXRPbmxpbmVLZXkiLCJzZXRGcmllbmRQcmVzZW50Q291bnQiLCJjb3VudCIsImdldEZyaWVuZFByZXNlbnRDb3VudCIsInNldEZyaWVuZERyYXdDb3VudCIsImdldEZyaWVuZERyYXdDb3VudCIsInNldEZyaWVuZERyYXdUb3RhbENvdW50IiwidG90YWwiLCJnZXRGcmllbmREcmF3VG90YWxDb3VudCIsImluaXRCbGFja0xpc3QiLCJpc19hZGQiLCJyZW1vdmVCbGFjayIsImdldEJsYWNrQXJyYXkiLCJpc0JsYWNrIiwiaXNJbiIsInNldExhc3RTZWxlY3RHcm91cCIsImdldExhc3RTZWxlY3RHcm91cCIsInNldExhc3RTZWxlY3RGcmllbmQiLCJzZXRMYXN0U2VsZWN0RnJpZW5kSW5kZXgiLCJpbmRleCIsImdldExhc3RTZWxlY3RGcmllbmRJbmRleCIsImdldExhc3RTZWxlY3RGcmllbmQiLCJfX2RlbGV0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsZ0JBQWdCLEdBQUdDLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxXQUFELENBQXRCOztBQUNBLElBQUlFLFdBQVcsR0FBR0YsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBRUEsSUFBSUcsV0FBVyxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN2QixhQUFTQyxTQURjO0FBRXZCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxJQUFMLEdBQVlULGdCQUFnQixDQUFDVSxXQUFqQixFQUFaO0FBQ0EsU0FBS0MsVUFBTDtBQUNILEdBTHNCO0FBT3ZCQyxFQUFBQSxVQUFVLEVBQUUsRUFQVztBQVV2QkQsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBRXBCLFNBQUtFLElBQUwsR0FBWSxFQUFaLENBRm9CLENBRVM7O0FBQzdCLFNBQUtDLEtBQUwsR0FBYSxFQUFiLENBSG9CLENBR1U7O0FBQzlCLFNBQUtDLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixFQUFsQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsRUFBakIsQ0FOb0IsQ0FNZ0I7O0FBQ3BDLFNBQUtDLGdCQUFMLEdBQXdCLEVBQXhCLENBUG9CLENBT2dCOztBQUNwQyxTQUFLQyxpQkFBTCxHQUF5QixDQUF6QixDQVJvQixDQVFnQjs7QUFDcEMsU0FBS0MseUJBQUwsR0FBaUMsSUFBakM7QUFDQSxTQUFLQyxzQkFBTCxHQUE4QixJQUE5QjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsQ0FBckIsQ0FYb0IsQ0FXZ0I7O0FBQ3BDLFNBQUtDLFVBQUwsR0FBa0IsQ0FBbEIsQ0Fab0IsQ0FZZ0I7O0FBQ3BDLFNBQUtDLGdCQUFMLEdBQXdCLENBQXhCLENBYm9CLENBYWdCOztBQUNwQyxTQUFLQyxpQkFBTCxHQUF5QixDQUF6QixDQWRvQixDQWNnQjtBQUN2QyxHQXpCc0I7QUEyQnZCO0FBQ0FDLEVBQUFBLEdBQUcsRUFBRSxhQUFVQyxHQUFWLEVBQWU7QUFDaEIsUUFBSSxLQUFLZCxJQUFMLENBQVVjLEdBQUcsQ0FBQ0MsTUFBSixHQUFhLEdBQWIsR0FBbUJELEdBQUcsQ0FBQ0UsR0FBakMsS0FBeUMsSUFBN0MsRUFDSSxLQUFLaEIsSUFBTCxDQUFVYyxHQUFHLENBQUNDLE1BQUosR0FBYSxHQUFiLEdBQW1CRCxHQUFHLENBQUNFLEdBQWpDLElBQXdDRixHQUF4QztBQUNQLEdBL0JzQjtBQWlDdkJHLEVBQUFBLFFBQVEsRUFBRSxrQkFBVUgsR0FBVixFQUFlO0FBQ3JCLFFBQUksS0FBS1osS0FBTCxDQUFXWSxHQUFHLENBQUNDLE1BQUosR0FBYSxHQUFiLEdBQW1CRCxHQUFHLENBQUNFLEdBQWxDLEtBQTBDLElBQTlDLEVBQ0ksS0FBS2QsS0FBTCxDQUFXWSxHQUFHLENBQUNDLE1BQUosR0FBYSxHQUFiLEdBQW1CRCxHQUFHLENBQUNFLEdBQWxDLElBQXlDRixHQUF6QztBQUNQLEdBcENzQjtBQXNDdkJJLEVBQUFBLG1CQUFtQixFQUFFLCtCQUFZO0FBQzdCLFFBQUlDLFdBQVcsR0FBRyxFQUFsQjs7QUFDQSxTQUFLLElBQUlDLENBQVQsSUFBYyxLQUFLcEIsSUFBbkIsRUFBeUI7QUFDckIsVUFBSXFCLENBQUMsR0FBRyxLQUFLckIsSUFBTCxDQUFVb0IsQ0FBVixDQUFSOztBQUNBLFVBQUlDLENBQUMsSUFBSUEsQ0FBQyxDQUFDQyxTQUFGLElBQWUsQ0FBeEIsRUFBMkI7QUFBRTtBQUN6QkgsUUFBQUEsV0FBVyxDQUFDSSxJQUFaLENBQWlCRixDQUFqQjtBQUNIO0FBQ0o7O0FBQ0QsV0FBT0YsV0FBUDtBQUNILEdBL0NzQjtBQWlEdkJLLEVBQUFBLGFBQWEsRUFBRSx1QkFBU1QsTUFBVCxFQUFpQkMsR0FBakIsRUFBc0I7QUFDakMsUUFBSVMsUUFBUSxHQUFHVixNQUFNLEdBQUcsR0FBVCxHQUFlQyxHQUE5QjtBQUNBLFdBQU8sS0FBS2hCLElBQUwsQ0FBVXlCLFFBQVYsQ0FBUDtBQUNILEdBcERzQjtBQXNEdkI7QUFDQUMsRUFBQUEsWUFBWSxFQUFFLHNCQUFVMUIsSUFBVixFQUFnQjtBQUMxQixRQUFJMkIsR0FBRyxHQUFHLEVBQVY7O0FBQ0EsU0FBSyxJQUFJQyxDQUFULElBQWM1QixJQUFkLEVBQW9CO0FBQ2hCLFVBQUlxQixDQUFDLEdBQUdyQixJQUFJLENBQUM0QixDQUFELENBQVo7O0FBQ0EsVUFBSVAsQ0FBSixFQUFPO0FBQ0hNLFFBQUFBLEdBQUcsQ0FBQ0osSUFBSixDQUFTRixDQUFUO0FBQ0g7QUFDSjs7QUFDRCxTQUFLcEIsS0FBTCxHQUFhMEIsR0FBYjtBQUVBRSxJQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsR0FBWixDQUFnQixZQUFZO0FBQ3hCRixNQUFBQSxLQUFLLENBQUNHLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCM0MsV0FBVyxDQUFDNEMsZ0JBQW5DO0FBQ0gsS0FGRCxFQUVHLElBRkgsRUFFUyxDQUFDLENBRlY7QUFHSCxHQXBFc0I7QUFzRXZCQyxFQUFBQSxZQUFZLEVBQUUsd0JBQVk7QUFDdEIsV0FBTyxLQUFLbEMsS0FBTCxJQUFjLEVBQXJCO0FBQ0gsR0F4RXNCO0FBMEV2Qm1DLEVBQUFBLFdBQVcsRUFBRSx1QkFBWTtBQUNyQixXQUFPLEtBQUtuQyxLQUFMLENBQVdvQyxNQUFsQjtBQUNILEdBNUVzQjtBQThFdkI7QUFDQUMsRUFBQUEsR0FBRyxFQUFFLGFBQVV2QixNQUFWLEVBQWtCQyxHQUFsQixFQUF1QjtBQUN4QixRQUFJLEtBQUtoQixJQUFMLENBQVVlLE1BQU0sR0FBRyxHQUFULEdBQWVDLEdBQXpCLEtBQWlDLElBQXJDLEVBQ0ksS0FBS2hCLElBQUwsQ0FBVWUsTUFBTSxHQUFHLEdBQVQsR0FBZUMsR0FBekIsSUFBZ0MsSUFBaEMsQ0FGb0IsQ0FHcEI7QUFDUCxHQW5Gc0I7QUFxRnZCO0FBQ0F1QixFQUFBQSxRQUFRLEVBQUUsa0JBQVV4QixNQUFWLEVBQWtCQyxHQUFsQixFQUF1QndCLEdBQXZCLEVBQTRCQyxLQUE1QixFQUFtQztBQUN6QyxRQUFJQyxFQUFFLEdBQUcsS0FBSzFDLElBQUwsQ0FBVWUsTUFBTSxHQUFHLEdBQVQsR0FBZUMsR0FBekIsQ0FBVDs7QUFDQSxRQUFJMEIsRUFBRSxJQUFJLElBQVYsRUFBZ0I7QUFDWkEsTUFBQUEsRUFBRSxDQUFDQyxNQUFILENBQVVILEdBQVYsRUFBZUMsS0FBZjtBQUNIOztBQUNELFdBQU9DLEVBQVA7QUFDSCxHQTVGc0I7QUE4RnZCO0FBQ0FFLEVBQUFBLFdBQVcsRUFBRSx1QkFBWTtBQUNyQixRQUFJQyxHQUFHLEdBQUcsQ0FBVjs7QUFDQSxTQUFLLElBQUlqQixDQUFULElBQWMsS0FBSzVCLElBQW5CLEVBQXlCO0FBQ3JCLFVBQUlxQixDQUFDLEdBQUcsS0FBS3JCLElBQUwsQ0FBVTRCLENBQVYsQ0FBUjs7QUFDQSxVQUFJUCxDQUFDLElBQUlBLENBQUMsQ0FBQ3lCLE9BQUYsSUFBYSxDQUF0QixFQUF5QjtBQUNyQkQsUUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUcsQ0FBWjtBQUNIO0FBQ0o7O0FBQ0QsV0FBT0EsR0FBUDtBQUNILEdBeEdzQjtBQTBHdkJFLEVBQUFBLHNCQUFzQixFQUFFLGdDQUFVaEMsTUFBVixFQUFrQkMsR0FBbEIsRUFBdUJnQyxJQUF2QixFQUE2QjtBQUNqRCxRQUFJUixHQUFHLEdBQUd6QixNQUFNLEdBQUcsR0FBVCxHQUFlQyxHQUF6QjtBQUNBLFFBQUksS0FBS2hCLElBQUwsQ0FBVXdDLEdBQVYsQ0FBSixFQUNJLEtBQUt4QyxJQUFMLENBQVV3QyxHQUFWLEVBQWVTLE9BQWYsQ0FBdUJELElBQXZCO0FBQ1AsR0E5R3NCO0FBZ0h2QjtBQUNBRSxFQUFBQSxLQUFLLEVBQUUsZUFBVW5DLE1BQVYsRUFBa0JDLEdBQWxCLEVBQXVCO0FBQzFCLFdBQU8sS0FBS2hCLElBQUwsQ0FBVWUsTUFBTSxHQUFHLEdBQVQsR0FBZUMsR0FBekIsQ0FBUDtBQUNILEdBbkhzQjtBQXFIdkI7QUFDQW1DLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixRQUFJQyxLQUFLLEdBQUcsSUFBSUMsS0FBSixFQUFaOztBQUNBLFNBQUssSUFBSWpDLENBQVQsSUFBYyxLQUFLcEIsSUFBbkIsRUFBeUI7QUFDckIsVUFBRyxLQUFLQSxJQUFMLENBQVVvQixDQUFWLENBQUgsRUFBZ0I7QUFDWmdDLFFBQUFBLEtBQUssQ0FBQzdCLElBQU4sQ0FBVyxLQUFLdkIsSUFBTCxDQUFVb0IsQ0FBVixDQUFYO0FBQ0g7QUFDSjs7QUFDRGdDLElBQUFBLEtBQUssQ0FBQ0UsSUFBTixDQUFXQyxLQUFLLENBQUNDLGdCQUFOLENBQXVCLENBQUMsV0FBRCxFQUFjLEtBQWQsRUFBcUIsT0FBckIsQ0FBdkIsQ0FBWDtBQUNBLFdBQU9KLEtBQVA7QUFDSCxHQS9Ic0I7QUFpSXZCO0FBQ0FLLEVBQUFBLFlBQVksRUFBRSxzQkFBVUMsSUFBVixFQUFnQjtBQUMxQixRQUFJTixLQUFLLEdBQUcsSUFBSUMsS0FBSixFQUFaOztBQUNBLFNBQUssSUFBSWpDLENBQVQsSUFBYyxLQUFLcEIsSUFBbkIsRUFBeUI7QUFDckIsVUFBSXFCLENBQUMsR0FBRyxLQUFLckIsSUFBTCxDQUFVb0IsQ0FBVixDQUFSOztBQUNBLFVBQUlDLENBQUMsQ0FBQ3NDLFFBQUYsSUFBYyxDQUFkLElBQW1CRCxJQUFJLElBQUksT0FBL0IsRUFBd0M7QUFDcENOLFFBQUFBLEtBQUssQ0FBQzdCLElBQU4sQ0FBV0YsQ0FBWDtBQUNILE9BRkQsTUFFTyxJQUFJQSxDQUFDLENBQUNzQyxRQUFGLElBQWMsQ0FBZCxJQUFtQkQsSUFBSSxJQUFJLE9BQS9CLEVBQXdDO0FBQzNDTixRQUFBQSxLQUFLLENBQUM3QixJQUFOLENBQVdGLENBQVg7QUFDSDtBQUNKOztBQUNEK0IsSUFBQUEsS0FBSyxDQUFDRSxJQUFOLENBQVdDLEtBQUssQ0FBQ0MsZ0JBQU4sQ0FBdUIsQ0FBQyxXQUFELEVBQWMsS0FBZCxDQUF2QixDQUFYO0FBQ0EsV0FBT0osS0FBUDtBQUNILEdBOUlzQjtBQWdKdkI7QUFDQVEsRUFBQUEsc0JBQXNCLEVBQUUsZ0NBQVVDLFVBQVYsRUFBc0I7QUFDMUMsUUFBSUMsVUFBVSxHQUFHLENBQWpCO0FBQ0EsUUFBSUMsU0FBUyxHQUFHLENBQWhCO0FBQ0EsUUFBSUMsVUFBVSxHQUFHLEtBQUtQLFlBQUwsQ0FBa0JJLFVBQWxCLENBQWpCO0FBQ0EsUUFBSUksR0FBRyxHQUFHRCxVQUFVLENBQUNFLE9BQVgsRUFBVjtBQUNBSCxJQUFBQSxTQUFTLEdBQUdFLEdBQVo7O0FBQ0EsU0FBSyxJQUFJckMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsSUFBSXFDLEdBQXJCLEVBQTBCckMsQ0FBQyxFQUEzQixFQUErQjtBQUMzQixVQUFJdUMsU0FBUyxHQUFHSCxVQUFVLENBQUNJLEdBQVgsQ0FBZXhDLENBQUMsR0FBRyxDQUFuQixDQUFoQjs7QUFDQSxVQUFJdUMsU0FBUyxDQUFDcEQsTUFBVixJQUFvQm9ELFNBQVMsQ0FBQ25ELEdBQTlCLElBQXFDbUQsU0FBUyxDQUFDN0MsU0FBVixJQUF1QixDQUFoRSxFQUFtRTtBQUMvRHdDLFFBQUFBLFVBQVUsR0FBR0EsVUFBVSxHQUFHLENBQTFCO0FBQ0g7QUFDSjs7QUFDRCxXQUFPO0FBQUVBLE1BQUFBLFVBQVUsRUFBRUEsVUFBZDtBQUEwQkMsTUFBQUEsU0FBUyxFQUFFQTtBQUFyQyxLQUFQO0FBQ0gsR0E5SnNCO0FBZ0t2QjtBQUNBTSxFQUFBQSx1QkFBdUIsRUFBRSxtQ0FBWTtBQUNqQyxRQUFJUCxVQUFVLEdBQUcsQ0FBakI7QUFDQSxRQUFJQyxTQUFTLEdBQUcsQ0FBaEI7O0FBQ0EsUUFBSSxLQUFLL0QsSUFBVCxFQUFlO0FBQ1gsV0FBSyxJQUFJb0IsQ0FBVCxJQUFjLEtBQUtwQixJQUFuQixFQUF5QjtBQUNyQixZQUFJbUUsU0FBUyxHQUFHLEtBQUtuRSxJQUFMLENBQVVvQixDQUFWLENBQWhCOztBQUNBLFlBQUkrQyxTQUFTLElBQUlBLFNBQVMsQ0FBQ3BELE1BQXZCLElBQWlDb0QsU0FBUyxDQUFDbkQsR0FBM0MsSUFBa0RtRCxTQUFTLENBQUM3QyxTQUFWLElBQXVCLENBQTdFLEVBQWdGO0FBQzVFd0MsVUFBQUEsVUFBVSxHQUFHQSxVQUFVLEdBQUcsQ0FBMUI7QUFDSDs7QUFDRCxZQUFJSyxTQUFKLEVBQ0lKLFNBQVMsR0FBR0EsU0FBUyxHQUFHLENBQXhCO0FBQ1A7QUFDSjs7QUFDRCxXQUFPO0FBQUVELE1BQUFBLFVBQVUsRUFBRUEsVUFBZDtBQUEwQkMsTUFBQUEsU0FBUyxFQUFFQTtBQUFyQyxLQUFQO0FBQ0gsR0EvS3NCO0FBaUx2QjtBQUNBTyxFQUFBQSwwQkFBMEIsRUFBRSxvQ0FBVUMsVUFBVixFQUFzQjtBQUM5QyxRQUFJUixTQUFTLEdBQUcsQ0FBaEI7QUFDQSxRQUFJRCxVQUFVLEdBQUcsQ0FBakI7QUFDQSxRQUFJVSxTQUFTLEdBQUcsS0FBS0MsWUFBTCxDQUFrQkYsVUFBbEIsQ0FBaEI7QUFDQSxRQUFJTixHQUFHLEdBQUdPLFNBQVMsQ0FBQ04sT0FBVixFQUFWO0FBQ0FILElBQUFBLFNBQVMsR0FBR0UsR0FBWjs7QUFDQSxTQUFLLElBQUlyQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxJQUFJcUMsR0FBckIsRUFBMEJyQyxDQUFDLEVBQTNCLEVBQStCO0FBQzNCLFVBQUk4QyxJQUFJLEdBQUdGLFNBQVMsQ0FBQ0osR0FBVixDQUFjeEMsQ0FBQyxHQUFHLENBQWxCLENBQVg7O0FBQ0EsVUFBSThDLElBQUksQ0FBQzNELE1BQUwsSUFBZTJELElBQUksQ0FBQzFELEdBQXBCLElBQTJCMEQsSUFBSSxDQUFDcEQsU0FBTCxJQUFrQixDQUFqRCxFQUFvRDtBQUNoRHdDLFFBQUFBLFVBQVUsR0FBR0EsVUFBVSxHQUFHLENBQTFCO0FBQ0g7QUFDSjs7QUFDRCxXQUFPO0FBQUVBLE1BQUFBLFVBQVUsRUFBRUEsVUFBZDtBQUEwQkMsTUFBQUEsU0FBUyxFQUFFQTtBQUFyQyxLQUFQO0FBQ0gsR0EvTHNCO0FBaU12QjtBQUNBWSxFQUFBQSwwQkFBMEIsRUFBRSxzQ0FBWTtBQUNwQyxRQUFJWixTQUFTLEdBQUcsQ0FBaEI7QUFDQSxRQUFJRCxVQUFVLEdBQUcsQ0FBakI7O0FBQ0EsU0FBSyxJQUFJMUMsQ0FBVCxJQUFjLEtBQUtoQixTQUFuQixFQUE4QjtBQUMxQixVQUFJaUIsQ0FBQyxHQUFHLEtBQUtqQixTQUFMLENBQWVnQixDQUFmLENBQVI7O0FBQ0EsVUFBSUMsQ0FBQyxJQUFJLElBQUwsSUFBYUEsQ0FBQyxDQUFDQyxTQUFGLElBQWUsSUFBNUIsSUFBb0NELENBQUMsQ0FBQ0MsU0FBRixJQUFlLENBQXZELEVBQTBEO0FBQ3REd0MsUUFBQUEsVUFBVSxHQUFHQSxVQUFVLEdBQUcsQ0FBMUI7QUFDSDs7QUFDREMsTUFBQUEsU0FBUyxHQUFHQSxTQUFTLEdBQUcsQ0FBeEI7QUFDSDs7QUFDRCxXQUFPO0FBQUVELE1BQUFBLFVBQVUsRUFBRUEsVUFBZDtBQUEwQkMsTUFBQUEsU0FBUyxFQUFFQTtBQUFyQyxLQUFQO0FBQ0gsR0E3TXNCO0FBK012QjtBQUNBYSxFQUFBQSxRQUFRLEVBQUUsa0JBQVU3RCxNQUFWLEVBQWtCQyxHQUFsQixFQUF1QjtBQUM3QixRQUFJb0MsS0FBSyxHQUFHLEtBQUtELFFBQUwsRUFBWjs7QUFDQSxTQUFLLElBQUl2QixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHd0IsS0FBSyxDQUFDZixNQUExQixFQUFrQ1QsQ0FBQyxFQUFuQyxFQUF1QztBQUNuQyxVQUFJYyxFQUFFLEdBQUdVLEtBQUssQ0FBQ3hCLENBQUQsQ0FBZDs7QUFDQSxVQUFJYyxFQUFFLENBQUMzQixNQUFILElBQWFBLE1BQWIsSUFBdUIyQixFQUFFLENBQUMxQixHQUFILElBQVVBLEdBQXJDLEVBQTBDO0FBQ3RDLGVBQU9ZLENBQVA7QUFDSDtBQUNKOztBQUNELFdBQU8sSUFBUDtBQUNILEdBek5zQjtBQTJOdkJpRCxFQUFBQSxRQUFRLEVBQUUsa0JBQVU5RCxNQUFWLEVBQWtCQyxHQUFsQixFQUF1QjtBQUM3QixRQUFJRCxNQUFNLElBQUksSUFBVixJQUFrQkMsR0FBRyxJQUFJLElBQTdCLEVBQW1DO0FBQy9CLGFBQU8sS0FBUDtBQUNIOztBQUNELFFBQUkwQixFQUFFLEdBQUcsS0FBSzFDLElBQUwsQ0FBVWUsTUFBTSxHQUFHLEdBQVQsR0FBZUMsR0FBekIsQ0FBVDtBQUNBLFFBQUkwQixFQUFFLElBQUlBLEVBQUUsQ0FBQ29DLGFBQUgsSUFBb0IsQ0FBOUIsRUFDSSxPQUFPLElBQVA7QUFDSixXQUFPLEtBQVA7QUFDSCxHQW5Pc0I7QUFxT3ZCQyxFQUFBQSxTQUFTLEVBQUUsbUJBQVV2QyxHQUFWLEVBQWU7QUFDdEIsUUFBSUUsRUFBRSxHQUFHLEtBQUsxQyxJQUFMLENBQVV3QyxHQUFWLENBQVQ7QUFDQSxRQUFJRSxFQUFFLElBQUlBLEVBQUUsQ0FBQ29DLGFBQUgsSUFBb0IsQ0FBOUIsRUFDSSxPQUFPLElBQVA7QUFDSixXQUFPLEtBQVA7QUFDSCxHQTFPc0I7QUE0T3ZCO0FBQ0FFLEVBQUFBLGFBQWEsRUFBRSx1QkFBVXhDLEdBQVYsRUFBZTtBQUMxQixTQUFLckMsVUFBTCxHQUFrQixFQUFsQjs7QUFDQSxTQUFLLElBQUl5QixDQUFULElBQWM1QixJQUFkLEVBQW9CO0FBQ2hCLFVBQUkwQyxFQUFFLEdBQUcxQyxJQUFJLENBQUM0QixDQUFELENBQWI7QUFDQSxVQUFJWSxHQUFHLEdBQUdFLEVBQUUsQ0FBQzNCLE1BQUgsR0FBWSxHQUFaLEdBQWtCMkIsRUFBRSxDQUFDdUMsRUFBL0I7QUFDQSxXQUFLOUUsVUFBTCxDQUFnQnFDLEdBQWhCLElBQXVCLENBQXZCO0FBQ0g7QUFDSixHQXBQc0I7QUFzUHZCMEMsRUFBQUEsYUFBYSxFQUFFLHVCQUFVMUMsR0FBVixFQUFlO0FBQzFCLFFBQUksS0FBS3JDLFVBQUwsQ0FBZ0JxQyxHQUFoQixDQUFKLEVBQ0ksT0FBTyxDQUFQLENBREosS0FHSSxPQUFPLENBQVA7QUFDUCxHQTNQc0I7QUE2UHZCMkMsRUFBQUEsWUFBWSxFQUFFLHNCQUFVM0MsR0FBVixFQUFlO0FBQ3pCLFNBQUtyQyxVQUFMLENBQWdCcUMsR0FBaEIsSUFBdUIsQ0FBdkI7QUFDSCxHQS9Qc0I7QUFpUXZCNEMsRUFBQUEscUJBQXFCLEVBQUUsK0JBQVVDLEtBQVYsRUFBaUI7QUFDcEMsU0FBSzVFLGFBQUwsR0FBcUI0RSxLQUFyQjtBQUNILEdBblFzQjtBQXFRdkJDLEVBQUFBLHFCQUFxQixFQUFFLGlDQUFZO0FBQy9CLFdBQU8sS0FBSzdFLGFBQVo7QUFDSCxHQXZRc0I7QUF5UXZCOEUsRUFBQUEsa0JBQWtCLEVBQUUsNEJBQVVGLEtBQVYsRUFBaUI7QUFDakMsU0FBSzNFLFVBQUwsR0FBa0IyRSxLQUFsQjtBQUNILEdBM1FzQjtBQTZRdkJHLEVBQUFBLGtCQUFrQixFQUFFLDhCQUFZO0FBQzVCLFdBQU8sS0FBSzlFLFVBQVo7QUFDSCxHQS9Rc0I7QUFpUnZCK0UsRUFBQUEsdUJBQXVCLEVBQUUsaUNBQVVDLEtBQVYsRUFBaUI7QUFDdEMsU0FBSy9FLGdCQUFMLEdBQXdCK0UsS0FBeEI7QUFDSCxHQW5Sc0I7QUFxUnZCQyxFQUFBQSx1QkFBdUIsRUFBRSxtQ0FBWTtBQUNqQyxXQUFPLEtBQUtoRixnQkFBWjtBQUNILEdBdlJzQjtBQXlSdkI7QUFFQTtBQUNBaUYsRUFBQUEsYUFBYSxFQUFFLHVCQUFVNUYsSUFBVixFQUFnQjZGLE1BQWhCLEVBQXdCO0FBQ25DLFNBQUssSUFBSXpFLENBQVQsSUFBY3BCLElBQWQsRUFBb0I7QUFDaEIsVUFBSTBDLEVBQUUsR0FBRyxJQUFJckQsUUFBSixFQUFUO0FBQ0EsVUFBSWdDLENBQUMsR0FBR3JCLElBQUksQ0FBQ29CLENBQUQsQ0FBWjtBQUNBc0IsTUFBQUEsRUFBRSxDQUFDTyxPQUFILENBQVc1QixDQUFYO0FBQ0EsV0FBS2pCLFNBQUwsQ0FBZWlCLENBQUMsQ0FBQ0wsR0FBRixHQUFRLEdBQVIsR0FBY0ssQ0FBQyxDQUFDTixNQUEvQixJQUF5QzJCLEVBQXpDO0FBQ0g7QUFDSixHQW5Tc0I7QUFxU3ZCO0FBQ0FvRCxFQUFBQSxXQUFXLEVBQUUscUJBQVU5RSxHQUFWLEVBQWVELE1BQWYsRUFBdUI7QUFDaEMsUUFBSUMsR0FBRyxJQUFJRCxNQUFYLEVBQ0ksT0FBTyxLQUFLWCxTQUFMLENBQWVZLEdBQUcsR0FBRyxHQUFOLEdBQVlELE1BQTNCLENBQVA7QUFDUCxHQXpTc0I7QUEyU3ZCO0FBQ0FnRixFQUFBQSxhQUFhLEVBQUUseUJBQVk7QUFDdkIsUUFBSTNDLEtBQUssR0FBRyxJQUFJQyxLQUFKLEVBQVo7O0FBQ0EsU0FBSyxJQUFJakMsQ0FBVCxJQUFjLEtBQUtoQixTQUFuQixFQUE4QjtBQUMxQmdELE1BQUFBLEtBQUssQ0FBQzdCLElBQU4sQ0FBVyxLQUFLbkIsU0FBTCxDQUFlZ0IsQ0FBZixDQUFYO0FBQ0g7O0FBQ0RnQyxJQUFBQSxLQUFLLENBQUNFLElBQU4sQ0FBV0MsS0FBSyxDQUFDQyxnQkFBTixDQUF1QixDQUFDLFdBQUQsRUFBYyxLQUFkLEVBQXFCLE9BQXJCLENBQXZCLENBQVg7QUFDQSxXQUFPSixLQUFQO0FBQ0gsR0FuVHNCO0FBcVR2QjtBQUNBNEMsRUFBQUEsT0FBTyxFQUFFLGlCQUFVaEYsR0FBVixFQUFlRCxNQUFmLEVBQXVCO0FBQzVCLFFBQUlrRixJQUFJLEdBQUcsS0FBWDs7QUFDQSxRQUFJakYsR0FBRyxJQUFJRCxNQUFQLElBQWlCLEtBQUtYLFNBQUwsQ0FBZVksR0FBRyxHQUFHLEdBQU4sR0FBWUQsTUFBM0IsQ0FBckIsRUFBeUQ7QUFDckRrRixNQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNIOztBQUNELFdBQU9BLElBQVA7QUFDSCxHQTVUc0I7QUE4VHZCQyxFQUFBQSxrQkFBa0IsRUFBRSw0QkFBVXpELEtBQVYsRUFBaUI7QUFDakMsU0FBS25DLGlCQUFMLEdBQXlCbUMsS0FBekI7QUFDSCxHQWhVc0I7QUFrVXZCMEQsRUFBQUEsa0JBQWtCLEVBQUUsOEJBQVk7QUFDNUIsV0FBTyxLQUFLN0YsaUJBQVo7QUFDSCxHQXBVc0I7QUFzVXZCOEYsRUFBQUEsbUJBQW1CLEVBQUUsNkJBQVVyRixNQUFWLEVBQWtCQyxHQUFsQixFQUF1QjtBQUN4QyxTQUFLVCx5QkFBTCxHQUFpQ1EsTUFBakM7QUFDQSxTQUFLUCxzQkFBTCxHQUE4QlEsR0FBOUI7QUFDSCxHQXpVc0I7QUEyVXZCcUYsRUFBQUEsd0JBQXdCLEVBQUUsa0NBQVVDLEtBQVYsRUFBaUI7QUFDdkMsU0FBSzFGLGlCQUFMLEdBQXlCMEYsS0FBSyxJQUFJLENBQWxDO0FBQ0gsR0E3VXNCO0FBK1V2QkMsRUFBQUEsd0JBQXdCLEVBQUUsb0NBQVk7QUFDbEMsV0FBTyxLQUFLM0YsaUJBQVo7QUFDSCxHQWpWc0I7QUFtVnZCNEYsRUFBQUEsbUJBQW1CLEVBQUUsK0JBQVk7QUFDN0IsV0FBTyxLQUFLakcseUJBQUwsRUFBZ0MsS0FBS0Msc0JBQTVDO0FBQ0gsR0FyVnNCO0FBdVZ2QmlHLEVBQUFBLFFBQVEsRUFBRSxvQkFBWSxDQUVyQjtBQXpWc0IsQ0FBVCxDQUFsQjtBQTRWQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCcEgsV0FBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IDIwMTgtMTItMjQgMTY6NDE6MzRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBGcmllbmRDb250cm9sbGVyID0gcmVxdWlyZShcImZyaWVuZF9jb250cm9sbGVyXCIpO1xudmFyIEZyaWVuZFZvID0gcmVxdWlyZShcImZyaWVuZF92b1wiKTtcbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIilcblxudmFyIEZyaWVuZE1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IEZyaWVuZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHRoaXMubGlzdCA9IHt9XHRcdFx0ICAgICAgICAgICAgLy8g5aW95Y+L5YiX6KGoXG4gICAgICAgIHRoaXMuYXBwbHkgPSBbXVx0XHRcdCAgICAgICAgICAgIC8vIOWlveWPi+eUs+ivt+WIl+ihqFxuICAgICAgICB0aGlzLnBsaXN0ID0ge31cbiAgICAgICAgdGhpcy5vbmxpbmVsaXN0ID0ge31cbiAgICAgICAgdGhpcy5ibGFja2xpc3QgPSBbXSAgICAgICAgICAgICAgICAgLy8g6buR5ZCN5Y2V5YiX6KGoXG4gICAgICAgIHRoaXMuaG9uZXlfbGlzdF9jb3VudCA9IDIwICAgICAgICAgIC8v5pyA6L+R6IGU57O75Lq66ZmQ5Yi2XG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfZ3JvdXAgPSAxICAgICAgICAgIC8v5pyA5ZCO6YCJ5oup55qE5YiG57uEKOm7mOiupOmAieaLqeesrOS4gOS4quWIhue7hClcbiAgICAgICAgdGhpcy5sYXN0X3NlbGVjdF9mcmllbmRfc3J2X2lkID0gbnVsbFxuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2ZyaWVuZF9yaWQgPSBudWxsXG4gICAgICAgIHRoaXMucHJlc2VudF9jb3VudCA9IDAgICAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6LWg6YCB5aW95Y+L5L2T5Yqb5Ymp5L2Z5qyh5pWwXG4gICAgICAgIHRoaXMuZHJhd19jb3VudCA9IDAgICAgICAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6aKG5Y+W5aW95Y+L5L2T5Yqb5Ymp5L2Z5qyh5pWwXG4gICAgICAgIHRoaXMuZHJhd190b3RhbF9jb3VudCA9IDAgICAgICAgICAgIC8v5b2T5aSp5Y+v5Lul6aKG5Y+W5aW95Y+L5L2T5Yqb5oC75qyh5pWwXG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfaW5kZXggPSAxICAgICAgICAgIC8v6buY6K6k5LiK5qyh6YCJ5Lit55qE5bqP5Y+3XG4gICAgfSxcblxuICAgIC8v5re75Yqg5pWw5o2uXG4gICAgYWRkOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubGlzdFt2YWwuc3J2X2lkICsgXCJfXCIgKyB2YWwucmlkXSA9IHZhbDtcbiAgICB9LFxuXG4gICAgYWRkUGNoYXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMucGxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMucGxpc3RbdmFsLnNydl9pZCArIFwiX1wiICsgdmFsLnJpZF0gPSB2YWw7XG4gICAgfSxcblxuICAgIGdldE9ubGluZUZyaWVuZExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ubGluZV9saXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGlzdFtrXVxuICAgICAgICAgICAgaWYgKHYgJiYgdi5pc19vbmxpbmUgPT0gMSkgeyAvL+WcqOe6v1xuICAgICAgICAgICAgICAgIG9ubGluZV9saXN0LnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ubGluZV9saXN0XG4gICAgfSxcblxuICAgIGdldEZyaWVuZEluZm86IGZ1bmN0aW9uKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHZhciBmcmllbmRfaSA9IHNydl9pZCArIFwiX1wiICsgcmlkO1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0W2ZyaWVuZF9pXTtcbiAgICB9LFxuXG4gICAgLy/nlLPor7fliJfooahcbiAgICBzZXRBcHBseUxpc3Q6IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IGxpc3RbaV07XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKHYpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseSA9IGFycjtcblxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShGcmllbmRFdmVudC5VcGRhdGVfUmVkX1BvaW50KTtcbiAgICAgICAgfSwgMTAwMCwgLTEpO1xuICAgIH0sXG5cbiAgICBnZXRBcHBseUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkgfHwgW107XG4gICAgfSxcblxuICAgIGdldEFwcGx5TnVtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Lmxlbmd0aFxuICAgIH0sXG5cbiAgICAvL+WIoOmZpOaVsOaNrlxuICAgIGRlbDogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdICE9IG51bGwpXG4gICAgICAgICAgICB0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdID0gbnVsbDtcbiAgICAgICAgICAgIC8vIHRoaXMubGlzdC5zcGxpY2Uoc3J2X2lkICsgXCJfXCIgKyByaWQsMSlcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDljZXkuKrmlbDmja5cbiAgICB1cGRhdGVWbzogZnVuY3Rpb24gKHNydl9pZCwgcmlkLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtzcnZfaWQgKyBcIl9cIiArIHJpZF07XG4gICAgICAgIGlmICh2byAhPSBudWxsKSB7XG4gICAgICAgICAgICB2by51cGRhdGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvXG4gICAgfSxcblxuICAgIC8v57qi54K55Yik5pat77yM6KaB5pi+56S65Ye65Y+v6aKG5Y+W55qE5pWw6YeP77yM6Lef55Sz6K+35YiX6KGo55qE5pWw6YePXG4gICAgZ2V0QXdhcmROdW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGlzdFtpXVxuICAgICAgICAgICAgaWYgKHYgJiYgdi5pc19kcmF3ID09IDEpIHtcbiAgICAgICAgICAgICAgICBudW0gPSBudW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1cbiAgICB9LFxuXG4gICAgdXBkYXRlU2luZ2xlRnJpZW5kRGF0YTogZnVuY3Rpb24gKHNydl9pZCwgcmlkLCBkYXRhKSB7XG4gICAgICAgIHZhciBrZXkgPSBzcnZfaWQgKyBcIl9cIiArIHJpZDtcbiAgICAgICAgaWYgKHRoaXMubGlzdFtrZXldKVxuICAgICAgICAgICAgdGhpcy5saXN0W2tleV0uc2V0RGF0YShkYXRhKTtcbiAgICB9LFxuXG4gICAgLy/ojrflj5bljZXkuKrmlbDmja5cbiAgICBnZXRWbzogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Rbc3J2X2lkICsgXCJfXCIgKyByaWRdO1xuICAgIH0sXG5cbiAgICAvL+i9rOWMluS4uuaVsOe7hFxuICAgIGdldEFycmF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgaWYodGhpcy5saXN0W2tdKXtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHRoaXMubGlzdFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkuc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcImlzX29ubGluZVwiLCBcImxldlwiLCBcInBvd2VyXCJdKSk7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgIH0sXG5cbiAgICAvL+iOt+WPlui3qOacjS/lkIzmnI3lpb3lj4vmlbDmja5cbiAgICBnZXRHcm91cExpc3Q6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmxpc3Rba11cbiAgICAgICAgICAgIGlmICh2LmlzX2Nyb3NzID09IDEgJiYgbmFtZSA9PSBcImNyb3NzXCIpIHtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2LmlzX2Nyb3NzID09IDAgJiYgbmFtZSA9PSBcImFsaWtlXCIpIHtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFycmF5LnNvcnQoVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJpc19vbmxpbmVcIiwgXCJsZXZcIl0pKTtcbiAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgfSxcblxuICAgIC8v6I635Y+W6Leo5pyNL+WQjOacjeWlveWPi+WcqOe6v+aVsOWSjOaAu+aVsFxuICAgIGdldEdyb3VwT25saW5lQW5kVG90YWw6IGZ1bmN0aW9uIChncm91cF9uYW1lKSB7XG4gICAgICAgIHZhciBvbmxpbmVfbnVtID0gMDtcbiAgICAgICAgdmFyIHRvdGFsX251bSA9IDA7XG4gICAgICAgIHZhciBncm91cF9kYXRhID0gdGhpcy5nZXRHcm91cExpc3QoZ3JvdXBfbmFtZSk7XG4gICAgICAgIHZhciBsZW4gPSBncm91cF9kYXRhLkdldFNpemUoKTtcbiAgICAgICAgdG90YWxfbnVtID0gbGVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGZyaWVuZF92byA9IGdyb3VwX2RhdGEuR2V0KGkgLSAxKTtcbiAgICAgICAgICAgIGlmIChmcmllbmRfdm8uc3J2X2lkICYmIGZyaWVuZF92by5yaWQgJiYgZnJpZW5kX3ZvLmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgb25saW5lX251bSA9IG9ubGluZV9udW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG9ubGluZV9udW06IG9ubGluZV9udW0sIHRvdGFsX251bTogdG90YWxfbnVtIH1cbiAgICB9LFxuXG4gICAgLy/ojrflj5bmiYDmnInlpb3lj4vlnKjnur/lkozmgLvmlbDph49cbiAgICBnZXRGcmllbmRPbmxpbmVBbmRUb3RhbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb25saW5lX251bSA9IDA7XG4gICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBmcmllbmRfdm8gPSB0aGlzLmxpc3Rba107XG4gICAgICAgICAgICAgICAgaWYgKGZyaWVuZF92byAmJiBmcmllbmRfdm8uc3J2X2lkICYmIGZyaWVuZF92by5yaWQgJiYgZnJpZW5kX3ZvLmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ubGluZV9udW0gPSBvbmxpbmVfbnVtICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyaWVuZF92bylcbiAgICAgICAgICAgICAgICAgICAgdG90YWxfbnVtID0gdG90YWxfbnVtICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W5pyA6L+R6IGU57O75Lq65Zyo57q/5pWw5ZKM5oC75pWwXG4gICAgZ2V0SG9uZXlMaXN0T25saW5lQW5kVG90YWw6IGZ1bmN0aW9uIChpc19yZXF1aXJlKSB7XG4gICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICB2YXIgb25saW5lX251bSA9IDA7XG4gICAgICAgIHZhciBob25leUxpc3QgPSB0aGlzLmdldEhvbmV5TGlzdChpc19yZXF1aXJlKTtcbiAgICAgICAgdmFyIGxlbiA9IGhvbmV5TGlzdC5HZXRTaXplKCk7XG4gICAgICAgIHRvdGFsX251bSA9IGxlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaG9uZXlMaXN0LkdldChpIC0gMSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcnZfaWQgJiYgaXRlbS5yaWQgJiYgaXRlbS5pc19vbmxpbmUgPT0gMSkge1xuICAgICAgICAgICAgICAgIG9ubGluZV9udW0gPSBvbmxpbmVfbnVtICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W6buR5ZCN5Y2V5Zyo57q/5pWw5ZKM5oC75pWwXG4gICAgZ2V0QmxhY2tMaXN0T25saW5lQW5kVG90YWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvdGFsX251bSA9IDA7XG4gICAgICAgIHZhciBvbmxpbmVfbnVtID0gMDtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmJsYWNrbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmJsYWNrbGlzdFtrXTtcbiAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5pc19vbmxpbmUgIT0gbnVsbCAmJiB2LmlzX29ubGluZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgb25saW5lX251bSA9IG9ubGluZV9udW0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG90YWxfbnVtID0gdG90YWxfbnVtICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBvbmxpbmVfbnVtOiBvbmxpbmVfbnVtLCB0b3RhbF9udW06IHRvdGFsX251bSB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57Si5byVXG4gICAgZ2V0SW5kZXg6IGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmdldEFycmF5KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2byA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKHZvLnNydl9pZCA9PSBzcnZfaWQgJiYgdm8ucmlkID09IHJpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgaXNGcmllbmQ6IGZ1bmN0aW9uIChzcnZfaWQsIHJpZCkge1xuICAgICAgICBpZiAoc3J2X2lkID09IG51bGwgfHwgcmlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtzcnZfaWQgKyBcIl9cIiArIHJpZF07XG4gICAgICAgIGlmICh2byAmJiB2by5pc19tb3NoZW5ncmVuID09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNGcmllbmQyOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2byA9IHRoaXMubGlzdFtrZXldO1xuICAgICAgICBpZiAodm8gJiYgdm8uaXNfbW9zaGVuZ3JlbiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIC8v5L+d5a2Y6Z2e5aW95Y+L6IGU57O75Lq655qE5Zyo57q/5pWw5o2uXG4gICAgc2V0T25saW5lRGF0YTogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0aGlzLm9ubGluZWxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdm8gPSBsaXN0W2ldO1xuICAgICAgICAgICAgdmFyIGtleSA9IHZvLnNydl9pZCArIFwiK1wiICsgdm8uaWQ7XG4gICAgICAgICAgICB0aGlzLm9ubGluZWxpc3Rba2V5XSA9IDE7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0T25saW5lRGF0YTogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAodGhpcy5vbmxpbmVsaXN0W2tleV0pXG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICBzZXRPbmxpbmVLZXk6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGhpcy5vbmxpbmVsaXN0W2tleV0gPSAxO1xuICAgIH0sXG5cbiAgICBzZXRGcmllbmRQcmVzZW50Q291bnQ6IGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICB0aGlzLnByZXNlbnRfY291bnQgPSBjb3VudFxuICAgIH0sXG5cbiAgICBnZXRGcmllbmRQcmVzZW50Q291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlc2VudF9jb3VudFxuICAgIH0sXG5cbiAgICBzZXRGcmllbmREcmF3Q291bnQ6IGZ1bmN0aW9uIChjb3VudCkge1xuICAgICAgICB0aGlzLmRyYXdfY291bnQgPSBjb3VudDtcbiAgICB9LFxuXG4gICAgZ2V0RnJpZW5kRHJhd0NvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdfY291bnRcbiAgICB9LFxuXG4gICAgc2V0RnJpZW5kRHJhd1RvdGFsQ291bnQ6IGZ1bmN0aW9uICh0b3RhbCkge1xuICAgICAgICB0aGlzLmRyYXdfdG90YWxfY291bnQgPSB0b3RhbDtcbiAgICB9LFxuXG4gICAgZ2V0RnJpZW5kRHJhd1RvdGFsQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd190b3RhbF9jb3VudDtcbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0t6buR5ZCN5Y2V5qih5Z2X5pWw5o2u77yaXG5cbiAgICAvL+WIneWni+WMllxuICAgIGluaXRCbGFja0xpc3Q6IGZ1bmN0aW9uIChsaXN0LCBpc19hZGQpIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiBsaXN0KSB7XG4gICAgICAgICAgICB2YXIgdm8gPSBuZXcgRnJpZW5kVm8oKTtcbiAgICAgICAgICAgIHZhciB2ID0gbGlzdFtrXTtcbiAgICAgICAgICAgIHZvLnNldERhdGEodik7XG4gICAgICAgICAgICB0aGlzLmJsYWNrbGlzdFt2LnJpZCArIFwiX1wiICsgdi5zcnZfaWRdID0gdm87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/np7vpmaTpu5HlkI3ljZVcbiAgICByZW1vdmVCbGFjazogZnVuY3Rpb24gKHJpZCwgc3J2X2lkKSB7XG4gICAgICAgIGlmIChyaWQgJiYgc3J2X2lkKVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYmxhY2tsaXN0W3JpZCArIFwiX1wiICsgc3J2X2lkXSA7XG4gICAgfSxcblxuICAgIC8v6buR5ZCN5Y2V5pWw57uEXG4gICAgZ2V0QmxhY2tBcnJheTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmJsYWNrbGlzdCkge1xuICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmJsYWNrbGlzdFtrXSk7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXkuc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcImlzX29ubGluZVwiLCBcImxldlwiLCBcInBvd2VyXCJdKSk7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgIH0sXG5cbiAgICAvL+aYr+WQpuWcqOm7keWQjeWNlemHjOmdolxuICAgIGlzQmxhY2s6IGZ1bmN0aW9uIChyaWQsIHNydl9pZCkge1xuICAgICAgICB2YXIgaXNJbiA9IGZhbHNlO1xuICAgICAgICBpZiAocmlkICYmIHNydl9pZCAmJiB0aGlzLmJsYWNrbGlzdFtyaWQgKyBcIl9cIiArIHNydl9pZF0pIHtcbiAgICAgICAgICAgIGlzSW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0luO1xuICAgIH0sXG5cbiAgICBzZXRMYXN0U2VsZWN0R3JvdXA6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2dyb3VwID0gdmFsdWU7XG4gICAgfSxcblxuICAgIGdldExhc3RTZWxlY3RHcm91cDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0X3NlbGVjdF9ncm91cDtcbiAgICB9LFxuXG4gICAgc2V0TGFzdFNlbGVjdEZyaWVuZDogZnVuY3Rpb24gKHNydl9pZCwgcmlkKSB7XG4gICAgICAgIHRoaXMubGFzdF9zZWxlY3RfZnJpZW5kX3Nydl9pZCA9IHNydl9pZDtcbiAgICAgICAgdGhpcy5sYXN0X3NlbGVjdF9mcmllbmRfcmlkID0gcmlkO1xuICAgIH0sXG5cbiAgICBzZXRMYXN0U2VsZWN0RnJpZW5kSW5kZXg6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLmxhc3Rfc2VsZWN0X2luZGV4ID0gaW5kZXggfHwgMTtcbiAgICB9LFxuXG4gICAgZ2V0TGFzdFNlbGVjdEZyaWVuZEluZGV4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3Rfc2VsZWN0X2luZGV4O1xuICAgIH0sXG5cbiAgICBnZXRMYXN0U2VsZWN0RnJpZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3Rfc2VsZWN0X2ZyaWVuZF9zcnZfaWQsIHRoaXMubGFzdF9zZWxlY3RfZnJpZW5kX3JpZDtcbiAgICB9LFxuXG4gICAgX19kZWxldGU6IGZ1bmN0aW9uICgpIHtcblxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyaWVuZE1vZGVsOyJdfQ==