(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/util/utils.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, 'f0aceSvUh9H3pEhpfGg4ahd', 'utils'); // Scripts/util/utils.js "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // 工具类的全局 var SoundManager = require("soundmanager"); window.Utils = { _effect_once_playing: false, _effect_once_last: null, _effect_once_list: null, keyfind: function keyfind(key, val, arr) { for (var i = 0, n = arr.length; i < n; i++) { if (arr[i][key] == val) { return arr[i]; } } return null; }, deepCopy: function deepCopy(source) { var sourceCopy = source instanceof Array ? [] : {}; for (var item in source) { sourceCopy[item] = _typeof(source[item]) === 'object' ? this.deepCopy(source[item]) : source[item]; } return sourceCopy; }, randomNum: function randomNum(min, max) { if (max > min) { return Math.round(Math.random() * (max - min)) + min; } else { return min; } }, randomStr: function randomStr(min, max, strRange) { var n = this.randomNum(min, max); strRange = strRange || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; var str = ""; var len = strRange.length; for (var i = 0; i < n; i++) { var pos = this.randomNum(1, len) - 1; str += strRange.charAt(pos); } return str; }, TI18N: function TI18N(str) { return str; }, // 获取单位配置 getUnitConfig: function getUnitConfig(id) { return gdata("unit_data", "data_unit1", id, false) || gdata("unit_data", "data_unit2", id, false) || gdata("unit_data", "data_unit3", id); }, // 获取物品配置数据 getItemConfig: function getItemConfig(id) { return gdata("item_data", "data_unit1", id, false) || gdata("item_data", "data_unit2", id, false) || gdata("item_data", "data_unit3", id, false) || gdata("item_data", "data_unit4", id, false) || gdata("item_data", "data_unit5", id, false); }, // 拼key getNorKey: function getNorKey() { var key = ""; for (var index = 0; index < arguments.length; index++) { var element = index < 0 || arguments.length <= index ? undefined : arguments[index]; if (key != "") { key = key + "_"; } key = key + element; } return key; }, // 关闭所有窗体 closeAllWindow: function closeAllWindow() { var temp_list = []; for (var index = 0; index < BaseView.winMap.length; index++) { var element = BaseView.winMap[index]; temp_list.push(element); } for (var _index = 0; _index < temp_list.length; _index++) { var _element = temp_list[_index]; if (_element.close) { _element.close({ close_win: true }); } } BaseView.winMap = []; }, // 进入战斗后,关闭所有的窗体 hideAllWindowForBattle: function hideAllWindowForBattle() { for (var index = 0; index < BaseView.winMap.length; index++) { var element = BaseView.winMap[index]; if (element && !element.is_before_battle) { element.enter_battle_status = element.getVisible(); element.is_before_battle = true; if (element.enter_battle_status == true) { element.setVisible(false); } } } }, // 退出战斗之后,打开进入战斗之前的界面 showAllWindowForBattle: function showAllWindowForBattle() { var need_show_scene = true; for (var index = 0; index < BaseView.winMap.length; index++) { var element = BaseView.winMap[index]; if (element) { if (element.enter_battle_status == null) { element.enter_battle_status = true; } element.setVisible(element.enter_battle_status); if (need_show_scene == true && element.win_type == WinType.Full && element.enter_battle_status == true) { need_show_scene = false; } element.is_before_battle = false; } } return need_show_scene; }, isEmpty: function isEmpty(obj) { for (var objIndex in obj) { return false; } return true; }, //返回数组或对象的下一个索引值 //(实际只能用来判断是否为空,不能用来循环获取索引值) next: function next(arr) { for (var k in arr) { if (arr[k] != null) { return true; } } return null; }, // 多元素小到大 tableLowerSorter: function tableLowerSorter(array) { return function (a, b) { if (a == null || b == null) { return 1; } for (var index = 0; index < array.length; index++) { var element = array[index]; if (a[element] == null || b[element] == null) { return 1; } if (a[element] != b[element]) { return a[element] - b[element]; } } return 1; }; }, // 多元素从大到小 tableUpperSorter: function tableUpperSorter(array) { return function (a, b) { if (a == null || b == null) { return -1; } for (var index = 0; index < array.length; index++) { var element = array[index]; if (a[element] == null || b[element] == null) { return -1; } if (a[element] != b[element]) { return b[element] - a[element]; } } return -1; }; }, /*按需排序 temp_tab 需要比较的表项中的多个key值,用于多参数的比较 temp_tab = {{"参数名字", true}, {"参数名字", false}...} --true 表示 大到小 false 表示 小到大 */ tableCommonSorter: function tableCommonSorter(temp_tab) { return function (a, b) { if (a == null || b == null) { return -1; } for (var i = 0; i < temp_tab.length; i++) { var element = temp_tab[i]; if (a[element[0]] == null || b[element[0]] == null) { return -1; } var is_sort = element[1] || false; if (is_sort) { if (a[element[0]] != b[element[0]]) { return b[element[0]] - a[element[0]]; } } else { if (a[element[0]] != b[element[0]]) { return a[element[0]] - b[element[0]]; } } } return -1; }; }, // 创建一个需要require的类 createClass: function createClass(window_name, any) { if (window_name == null || window_name == "") { cc.error("创建窗体失败,没有给具体名字 ========>>"); } var WindowClass = require(window_name); return new WindowClass(any); }, /** * 播放一次特效,临时创建一个节点数据,播放完特效之后移除 * @param {*} effect_name 特效资源名 * @param {*} x 坐标X * @param {*} y 坐标Y * @param {*} parent 父节点 * @param {*} finish_call 播放完的回调 * @param {*} action_name 播放动作,默认为action * @param {*} scale 缩放比,理论上不需要设置 */ playEffectOnce: function playEffectOnce(effect_name, x, y, parent, finish_call, action_name, scale) { if (parent == null) return; action_name = action_name || PlayerAction.action; scale = scale || 1; if (this._effect_once_playing == true) { if (this.effect_object && this.effect_object.node && this.effect_object.node.parent) { if (this._effect_once_last != effect_name) { if (this._effect_once_list == null) { this._effect_once_list = []; } this._effect_once_list.push({ effect_name: effect_name, x: x, y: y, parent: parent, finish_call: finish_call, action_name: action_name, scale: scale }); } } else { if (this.effect_object && this.effect_object.node) { this.effect_object.node.destroy(); LoaderManager.getInstance().releaseRes(this.effect_object.res_path); } this.effect_object = null; this._effect_once_last = null; this._effect_once_playing = false; if (this._effect_once_list == null) { this._effect_once_list = []; } this._effect_once_list.push({ effect_name: effect_name, x: x, y: y, parent: parent, finish_call: finish_call, action_name: action_name, scale: scale }); if (this._effect_once_list && this._effect_once_list.length > 0) { var object = this._effect_once_list.shift(); if (object) { this.playEffectOnce(object.effect_name, object.x, object.y, object.parent, object.finish_call, object.action_name, object.scale); } } } } else { this._effect_once_playing = true; this._effect_once_last = effect_name; var remove_fun = function () { if (finish_call) { finish_call(); } this._effect_once_playing = false; this._effect_once_last = null; if (this.effect_object) { //移除掉缓存的对象 if (this.effect_object.node) { this.effect_object.node.destroy(); } LoaderManager.getInstance().releaseRes(this.effect_object.res_path); this.effect_object = null; } if (this._effect_once_list && this._effect_once_list.length > 0) { var object = this._effect_once_list.shift(); if (object) { this.playEffectOnce(object.effect_name, object.x, object.y, object.parent, object.finish_call, object.action_name, object.scale); } } }.bind(this); // 节点对象 this.effect_object = { node: null, effect: null, res_path: null }; // 创建临时的节点 var node = new cc.Node("once_effect"); node.setAnchorPoint(0.5, 0.5); if (scale != 1) { node.scale = scale; } node.setPosition(x, y); parent.addChild(node); var effect_spine = node.addComponent(sp.Skeleton); var res_path = PathTool.getSpinePath(effect_name, "action"); // 储存数据 this.effect_object.node = node; this.effect_object.effect = effect_spine; this.effect_object.res_path = res_path; // 监听事件 effect_spine.setCompleteListener(function (trackEntry, loopCount) { var animationName = trackEntry.animation ? trackEntry.animation.name : ""; if (animationName == action_name) { remove_fun(); } }.bind(this)); // 加载资源 LoaderManager.getInstance().loadRes(res_path, function (res_object) { effect_spine.skeletonData = res_object; effect_spine.setAnimation(0, action_name, false); }.bind(this)); } }, //计算字符串长度,汉字算两个长度 //(如果汉字算一个长度,直接string.length可以获得) getByteLen: function getByteLen(val) { var len = 0; for (var i = 0; i < val.length; i++) { var a = val.charAt(i); if (a.match(/[^\x00-\xff]/ig) != null) { len += 2; } else { len += 1; } } return len; }, //按钮置灰,并关闭事件,btn:cc.Button, bool:true是变灰 setGreyButton: function setGreyButton(btn, bool) { if (bool == null) bool = true; if (btn) { btn.interactable = !bool; btn.enableAutoGrayEffect = bool; } }, getTimeInterval: function getTimeInterval(time_stamp) { if (!(time_stamp >= 0)) return; var srver_time = gcore.SmartSocket.getTime(); return time_stamp - srver_time; }, // 将秒转为标准时间, 参数:秒数, 是否加0 changeIntevalToDate: function changeIntevalToDate(secondNum, n_addo) { if (!(secondNum >= 0)) return; var daySecond = 24 * 60 * 60; var hourSecond = 60 * 60; var day = Math.floor(secondNum / daySecond); var remainSecondM = secondNum % daySecond; var hour = Math.floor(remainSecondM / hourSecond); var remainSecondS = remainSecondM % hourSecond; var minute = Math.floor(remainSecondS / 60); var second = Math.ceil(remainSecondS % 60); if (n_addo) { return { D: day, H: hour, M: minute, S: second }; } var add0 = function add0(m) { return m < 10 ? '0' + m : m; }; return { D: day, H: add0(hour), M: add0(minute), S: add0(second) }; }, //-----------------------moneytool---start-------------// //转换金钱格式 getMoneyString: function getMoneyString(value, is_symbol) { if (is_symbol == null) is_symbol = true; if (value == null) return 0; if (value < 100000) { if (is_symbol) return this.moneyFormat(value);else return value; } else if (value < 100000000) { value = Math.floor(value * 0.0001); if (is_symbol) return cc.js.formatStr(Utils.TI18N("%s万"), this.moneyFormat(value));else return cc.js.formatStr(Utils.TI18N("%s万"), value); } else { value = Math.floor(value * 0.00000001); if (is_symbol) return cc.js.formatStr(Utils.TI18N("%s亿"), this.moneyFormat(value));else return cc.js.formatStr(Utils.TI18N("%s亿"), value); } }, //价钱里面加上逗号 moneyFormat: function moneyFormat(value) { var sign = ""; if (value < 0) { sign = "-"; value = value * -1; } if (value < 1000) return String(value); var arr = this.moneySplit(String(value), ""); var n = arr.length; var i = n % 3; if (i == 0) { i = 4; } while (i < n) { arr.splice(i, 0, ","); i = i + 4; n = n + 1; } return sign + this.Join(arr, ""); }, moneySplit: function moneySplit(source_str, split_str) { if (split_str.length == 0) { var arr = []; for (var i = 0; i < source_str.length; i++) { arr.push(source_str.substring(i, i + 1)); } return arr; } else { return this.Split(source_str, split_str); } }, //-----------------------moneytool---end-------------// // 以某个分隔符为标准,分割字符串 // @param split_string 需要分割的字符串 // @param splitter 分隔符 // @return 用分隔符分隔好的table Split: function Split(split_string, splitter) { var split_result = {}; var search_pos_begin = 0; while (true) { var find_pos_begin = split_string.indexOf(splitter, search_pos_begin); var find_pos_end = splitter.length + find_pos_begin; if (find_pos_begin == -1) break; split_result[Object.keys(split_result).length + 1] = split_string.substring(search_pos_begin, find_pos_begin - 1); search_pos_begin = find_pos_end + 1; } if (search_pos_begin <= split_string.length) { split_result[Object.keys(split_result).length + 1] = split_string.substr(search_pos_begin); } return split_result; }, // 以某个连接符为标准,返回一个table所有字段连接结果 // @param join_table 连接table:array // @param joiner 连接符 // @param return 用连接符连接后的字符串 Join: function Join(join_table, joiner) { if (joiner == null) { return join_table.join(""); } else { return join_table.join(joiner); } }, //区分服务器名称 transformNameByServ: function transformNameByServ(name, srv_id) { var tmpName = name; if (srv_id == null || name == null) return tmpName; if (name) { if (tmpName.indexOf("【") != -1) { return tmpName; } } if (!require("role_controller").getInstance().isTheSameSvr(srv_id)) { var vo = require("role_controller").getInstance().getRoleVo(); if (vo) { var listOr = this.Split(srv_id, "_"); var listMe = this.Split(vo.srv_id, "_"); if (listOr[2] && listMe[1] && listOr[1] != listMe[1]) { tmpName = cc.js.formatStr(Utils.TI18N("[异域]%s"), tmpName); } else if (Object.keys(listOr).length > 1) { tmpName = cc.js.formatStr(Utils.TI18N("[S%s]%s"), listOr[Object.keys(listOr).length], tmpName); } if (srv_id == "robot_1") tmpName = name; } } return tmpName; }, // 配置格式装换 splitDataStr: function splitDataStr(content) { var result = content; while (result.indexOf("{") != -1) { var i = result.indexOf("{"); var n = result.indexOf("}"); var temp = result.substring(i, n + 1); var target = temp.substring(1, temp.length - 1); var list = this.Split(target, ":"); var str = cc.js.formatStr("%s", gdata("color_data", "data_color3", parseInt(list[1])), list[2]); result = result.replace(temp, str); } var RoleController = require("role_controller"); var role_vo = RoleController.getInstance().getRoleVo(); if (role_vo) { result = result.replace(/~n/g, role_vo.name); } return result; }, //desc:创建一个普通文本 createLabel: function createLabel(font_size, text_color, line_color, x, y, text_content, parent_wnd, line_num, anchorpoint, font) { font_size = font_size || 20; var node = new cc.Node(); node.setAnchorPoint(anchorpoint || cc.v2(0, 0)); var label = node.addComponent(cc.Label); label.fontSize = font_size; label.horizontalAlign = cc.macro.TextAlignment.CENTER; label.verticalAlign = cc.macro.TextAlignment.CENTER; if (text_color == null) text_color = new cc.Color(0xff, 0xff, 0xff, 0xff); node.color = text_color; if (line_color) { var line = node.addComponent(cc.LabelOutline); line.color = line_color; line.width = line_num || 1; } x = x || 0; y = y || 0; node.setPosition(x, y); if (text_content != null) label.string = text_content; if (parent_wnd) parent_wnd.addChild(node); return label; }, //desc:创建富文本 createRichLabel: function createRichLabel(fontsize, textcolor, ap, pos, lineHeight, max_width, parent_wnd, align) { var node = new cc.Node(); node.setAnchorPoint(ap || cc.v2(0, 0)); node.setPosition(pos || cc.v2(0, 0)); var label = node.addComponent(cc.RichText); if (textcolor == null) textcolor = new cc.Color(0xff, 0xff, 0xff, 0xff); label.fontSize = fontsize; label.horizontalAlign = cc.macro.TextAlignment.CENTER; label.verticalAlign = cc.macro.TextAlignment.CENTER; if (align == "left") { label.horizontalAlign = cc.macro.TextAlignment.LEFT; } else if (align == "right") { label.horizontalAlign = cc.macro.TextAlignment.RIGHT; } label.lineHeight = lineHeight || fontsize + 4; node.color = textcolor; label.maxWidth = max_width || 300; if (parent_wnd) parent_wnd.addChild(node); return label; }, //desc:创建image createImage: function createImage(parent, res, x, y, anchorPoint, usePlist, zorder, is_Scale9) { var node = new cc.Node(); var image = node.addComponent(cc.Sprite); if (res != null) { LoaderManager.getInstance().loadRes(res, function (image, res_object) { image.spriteFrame = res_object; }.bind(this, image)); } if (anchorPoint == null) { node.setAnchorPoint(cc.v2(0.5, 0.5)); } else { node.setAnchorPoint(anchorPoint); } if (is_Scale9 == true) { image.type = cc.Sprite.Type.SLICED; image.sizeMode = cc.Sprite.SizeMode.CUSTOM; } if (x != null && y != null) { node.setPosition(cc.v2(x, y)); } if (parent) { parent.addChild(node, zorder || 0); } return image; }, createEffectSpine: function createEffectSpine(effectName, pos, arPos, loop, action, call_back, pixelformal, not_play_action) { var node = new cc.Node(); node.setPosition(pos); node.setAnchorPoint(arPos); var effect = node.addComponent(sp.Skeleton); effectName = effectName || "E88888"; if (loop == null) { loop = true; } action = action || PlayerAction.action; var res = cc.js.formatStr("spine/%s/action.atlas", effectName); LoaderManager.getInstance().loadRes(res, function (res_object) { effect.skeletonData = res_object; if (not_play_action == null) { effect.setAnimation(0, action, loop); } else { effect.setAnimation(1, action, loop); } if (call_back) { call_back(); } }.bind(this)); return effect; }, // 给节点添加红点 // [[ // node:红点父节点 // status:是否显示 // offset_x:红点x轴偏移 // offset_y:红点y轴偏移 // zorder:红点层级 // ]] addRedPointToNodeByStatus: function addRedPointToNodeByStatus(node, status, offset_x, offset_y, zorder, red_type) { if (node) { if (status == true) { if (!node.red_point) { offset_x = offset_x || 0; offset_y = offset_y || 0; zorder = zorder || 10; var red_res = PathTool.getUIIconPath("mainui", "mainui_1009"); if (red_type && red_type == 2) { red_res = PathTool.getCommonIcomPath("common_1014"); } var node_size = node.getContentSize(); var pos_x = node_size.width / 2 + offset_x; var pos_y = node_size.height / 2 + offset_y; var red_point = this.createImage(node, null, pos_x, pos_y, cc.v2(1, 1), null, zorder); // 加载资源 LoaderManager.getInstance().loadRes(red_res, function (red_point, res_object) { red_point.spriteFrame = res_object; }.bind(this, red_point)); node.red_point = red_point; } node.red_point.node.active = true; } else if (node.red_point) { node.red_point.node.active = false; } } }, //获取数组或对象具有真实子类的长度 getArrTrueLen: function getArrTrueLen(obj) { var index = 0; for (var i in obj) { var v = obj[i]; if (v != null) { index = index + 1; } } return index; }, //获取数组或对象的长度 getArrLen: function getArrLen(obj) { if (obj instanceof Array) { return obj.length; } else { return Object.keys(obj).length; } }, // 延迟动作 delayRun: function delayRun(obj, delay_time, fun) { if (!fun) return; if (obj == null) { fun(); } var delay_fun = cc.delayTime(delay_time); var call_fun = cc.callFunc(function () { if (obj != null) { fun(); } }); obj.runAction(cc.sequence(delay_fun, call_fun)); }, /** * 统一处理点击事件,为了后面统一音效做处理 * @param {*} object 节点对象 * @param {*} clickback 点击回调 * @param {*} soundType 声音类型 1:普通音效 2:关闭音效 3.... */ onTouchEnd: function onTouchEnd(object, clickback, soundType) { if (!object) { if (clickback) { clickback(); } return; } object.on(cc.Node.EventType.TOUCH_END, function (event) { Utils.playButtonSound(soundType); if (clickback) { clickback(); } }); }, /** * 播放音效接口 * @param {*} type 1:普通按钮音效 2:关闭按钮音效 3:标签页音效 4..自定义音效id */ playButtonSound: function playButtonSound(type) { if (!type) return; var res_id = null; if (type == ButtonSound.Normal) { res_id = "c_button1"; } else if (type == ButtonSound.Close) { res_id = "c_close"; } else if (type == ButtonSound.Tab) { res_id = "c_002"; } else { res_id = type; } SoundManager.getInstance().playEffect(AUDIO_TYPE.COMMON, res_id); }, playEffectSound: function playEffectSound(type, res_id) { SoundManager.getInstance().playEffectOnce(type, res_id); }, playMusic: function playMusic(type, res_id, loop) { SoundManager.getInstance().playMusic(type, res_id, loop); }, //获取随机名字 getRandomSaveName: function getRandomSaveName() { var randomName = function (str) { var result = str; var a = String.fromCharCode(Math.random(65, 90)); var b = String.fromCharCode(Math.random(97, 122)); var c = String.fromCharCode(Math.random(48, 57)); if (Math.random(3) % 3 == 0) { result = result + a; } else if (Math.random(3) % 2 == 0) { result = result + b; } else { result = result + c; } if (this.getByteLen(result) < 12) { result = randomName(result); } return result; }.bind(this); var usr = randomName(""); return "sy" + usr; }, /*==============================-- --desc:获取服务器索引 --time:2018-07-22 10:54:30 --@str: --@return [index, is_var] --index == 0 表示 机器 或者 异域(就是无法知道是那个服的) --is_var : 表示是否本服 --==============================--*/ getServerIndex: function getServerIndex(srv_id) { if (srv_id == null) return [""]; if (srv_id == "robot_1" || srv_id == "robot") { //代表机器人 return [0]; } var RoleController = require("role_controller"); var vo = RoleController.getInstance().getRoleVo(); if (vo) { var listOr = srv_id.split("_"); var listMe = vo.srv_id.split("_"); if (listOr[1] && listMe[0] && listOr[0] != listMe[0]) { return [0]; } else if (listOr.length > 1) { if (srv_id == vo.srv_id) { return [listOr[listOr.length], true]; } else { return [listOr[listOr.length]]; } } } return [0]; }, // 通用显示单行道具列表 // @ item_scrollview scrollview 对象 // @ item_list BackPackItem的对象列表 (注意: 需要在那边手动移除) // @ data_list 数据列表 结构{{道具id, 数量},...} 就是策划填表的奖励道具结构 // @setting // @content // @isActionCallBack 是否调用ActionCallBack // @setting.scale 缩小参数 默认 1 // @setting.start_x 两边对应道具的间隔 // @setting.space_x 道具之间的间隔 // @setting.max_count item_scrollview最大能显示item数量..用于判断是否可以左右滑动 不填则可以移动 // @setting.is_center 是否不满就居中 max_count必须有值 // @setting.show_effect_id =特效id 显示对应特效 默认无 // @setting.is_tip 是否弹通用tips 默认nil commonShowSingleRowItemList: function commonShowSingleRowItemList(item_scrollview, item_list, data_list, setting, content, isActionCallBack) { if (!item_scrollview || !data_list) { return; } var item_list = item_list; if (item_list) { // 隐藏物品 for (var i in item_list) { item_list[i].setVisible(false); } } if (item_list == null) { item_list = []; } if (data_list.length == 0) { return; } // 道具列表 var setting = setting || {}; var scale = setting.scale || 1; var start_x = setting.start_x || 5; var space_x = setting.space_x || 5; var max_count = setting.max_count; var item_width = setting.item_width || 120; var lock = setting.lock || false; // 点击返回回调函数 var is_tip = setting.is_tip; var callback = setting.callback || false; var item_count = data_list.length; item_width = item_width * scale; var total_width = start_x * 2 + item_width * item_count + space_x * (item_count - 1); var item_scrollview_size = content.getContentSize(); var max_width = Math.max(item_scrollview_size.width, total_width); content.setContentSize(cc.size(max_width, item_scrollview_size.height)); if (max_count && item_count <= max_count) { item_scrollview.off(cc.Node.EventType.TOUCH_START, item_scrollview._onTouchBegan, item_scrollview, true); item_scrollview.off(cc.Node.EventType.TOUCH_MOVE, item_scrollview._onTouchMoved, item_scrollview, true); item_scrollview.off(cc.Node.EventType.TOUCH_END, item_scrollview._onTouchEnded, item_scrollview, true); item_scrollview.off(cc.Node.EventType.TOUCH_CANCEL, item_scrollview._onTouchCancelled, item_scrollview, true); if (setting.is_center) { start_x = (item_scrollview_size.width - total_width) * 0.5; if (start_x < 0) { start_x = 0; } } } else {// item_scrollview.on(cc.Node.EventType.TOUCH_START, item_scrollview._onTouchBegan, item_scrollview, true); // item_scrollview.on(cc.Node.EventType.TOUCH_MOVE, item_scrollview._onTouchMoved, item_scrollview, true); // item_scrollview.on(cc.Node.EventType.TOUCH_END, item_scrollview._onTouchEnded, item_scrollview, true); // item_scrollview.on(cc.Node.EventType.TOUCH_CANCEL, item_scrollview._onTouchCancelled, item_scrollview, true); } content.stopAllActions(); var _setItemData = function (item, v, i, is_tip) { item.setVisible(true); var _x = start_x + item_width / 2 + i * (item_width + space_x); item.setPosition(_x, item_scrollview_size.height * 0.5); item.setData({ bid: v[0], num: v[1] }); item.showOrderWarLock(lock); if (callback) { if (isActionCallBack) { item.addActionCallBack(function () { callback(); }.bind(this)); } else { item.addCallBack(function () { callback(); }.bind(this)); } } if (v[2]) { item.setExtendLabel(v[2], null, 24); } item.setDefaultTip(is_tip); if (setting.show_effect_id) { item.showItemEffect(true, setting.show_effect_id, PlayerAction.action_1, true, 1.1); } else { item.showItemEffect(false); } }.bind(this); var item = null; var size = item_list.length; for (var i in data_list) { item = item_list[i]; if (item) { _setItemData(item, data_list[i], i, is_tip); } else { var dealey = i - size; if (dealey <= 0) { dealey = 1; } Utils.delayRun(content, dealey / 60, function (i, v, item, is_tip) { if (!item_list[i]) { item = ItemsPool.getInstance().getItem("backpack_item"); item.initConfig(true, scale); // item.setAnchorPoint(0, 0.5) item.setParent(content); item.show(); item_list[i] = item; _setItemData(item, v, i, is_tip); } }.bind(this, i, data_list[i], item, is_tip)); } } return item_list; }, /*--通用显示空白 --@parent 父类 --@bool 显示状态 true 显示 , false 不显示 --@setting 配置信息 --setting.text 文本内容 默认: 暂无数据 --setting.pos icon显示位置 默认 父类的中心点 --setting.scale icon缩放大小 默认 1 --setting.offset_y 因图标缩放导致文本的位置需要调整 偏移量调整 默认是 -10 --setting.font_size 文本大小 默认 26 --setting.label_color 文本颜色 默认 Config.ColorData.data_color16[175]*/ commonShowEmptyIcon: function commonShowEmptyIcon(parent, bool, setting) { if (!parent) return; if (bool) { var setting = setting || {}; var text = setting.text || Utils.TI18N("暂无数据"); if (!parent.empty_con) { var parent_size = parent.getContentSize(); var pos = setting.pos || cc.v2(parent_size.width * 0.5, parent_size.width * 0.5, parent_size.height * 0.5 + 10); var scale = setting.scale || 1; var offset_y = setting.offset_y || -110; var label_color = setting.label_color || new cc.Color().fromHEX(Config.color_data.data_color16[175]); var font_size = setting.font_size || 26; var size = cc.size(200, 200); parent.empty_con = new cc.Node(); parent.empty_con.setContentSize(cc.size(120, 120)); parent.empty_con.setAnchorPoint(0.5, 0.5); parent.empty_con.setPosition(pos.x, pos.y); parent.addChild(parent.empty_con, 10); var bg = Utils.createImage(parent.empty_con, PathTool.getUIIconPath("bigbg", "bigbg_3"), 0, 0, cc.v2(0.5, 0.5), false); bg.node.scale = scale; parent.empty_label = Utils.createLabel(font_size, label_color, null, 0, offset_y, '', parent.empty_con, 0, cc.v2(0.5, 0.5)); } else { parent.empty_con.action = true; } parent.empty_label.string = text; } else { if (parent.empty_con) { parent.empty_con.action = false; } } }, getType: function getType(obj) { var str = Object.prototype.toString.call(obj); var map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object' }; // if(obj instanceof Element){ //判断是否是dom元素,如div等 // return "element"; // } return map[str]; }, deepCopy1: function deepCopy1(p) { var obj; var str = this.getType(p); if (str == 'array') { obj = []; for (var i = 0; i < p.length; i++) { obj.push(this.deepCopy1(p[i])); //回调自己 } } else if (str == 'object') { obj = {}; for (var i in p) { obj[i] = this.deepCopy1(p[i]); } } else { return p; } return obj; }, //通用设置倒计时 时间格式默认 TimeTool.GetTimeForFunction 此方法返回格式(需要其他的 在callback 自行处理) //注意: 关闭panel的时候记得 doStopAllActions(label) 否则会报错 //@label 倒计时对象 label //@less_time 剩余时间 //@setting 配置信息 //setting.label_type 文本类型(参考 CommonAlert.type.rich) ..注意:需要增加标题 和 时间颜色 才设置这个(否则没意义) //setitng.time_title 时间标题 eg: 剩余时间: //setitng.time_color 时间颜色 格式: #ffffff 富文本下 需要变的颜色..(在is_rich_label == true下 必填) //setting.callback 回调函数 如果_setTimeFormatString 不能满足需求 自己用回调函数处理 commonCountDownTime: function commonCountDownTime(label, less_time, setting) { if (!label) return; var setting = setting || {}; var callback = setting.callback; //回调函数 var label_type = setting.label_type; //文本类型 var time_title = null; var time_color = null; var TimeTool = require("timetool"); if (label_type && label_type == "rich") { time_title = setting.time_title || ""; time_color = setting.time_color; } var _setTimeFormatString = function _setTimeFormatString(time) { if (!label) return; if (callback) { callback(time); return; } if (label_type && label_type == "rich" && time_color) { if (time > 0) { label.string = cc.js.formatStr("%s %s", time_title, time_color, TimeTool.getTimeForFunction(time)); } else { label.node.stopAllActions(); label.string = cc.js.formatStr("%s 00:00:00", time_title, time_color); } } else { if (time > 0) { label.string = TimeTool.getTimeForFunction(time); } else { label.node.stopAllActions(); label.string = "00:00:00"; } } }; label.node.stopAllActions(); if (less_time > 0) { _setTimeFormatString(less_time); label.node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), cc.callFunc(function () { less_time = less_time - 1; _setTimeFormatString(less_time); }.bind(this))))); } else { _setTimeFormatString(less_time); } }, //设置精灵变灰,递归下去 setChildUnEnabled: function setChildUnEnabled(node, status) { var sp_status; if (status) { sp_status = cc.Sprite.State.GRAY; } else { sp_status = cc.Sprite.State.NORMAL; } var sprites = node.getComponentsInChildren(cc.Sprite); for (var i = 0; i < sprites.length; ++i) { sprites[i].setState(sp_status); } }, //--获取属性对应信息 // @attr_key 策划定义属性key 参考表attr_data.xml // @attr_val 对应值..如果是百分比 传过来的是千分比 //return 属性icon路径, 属性名字, 属性值 commonGetAttrInfoByKeyValue: function commonGetAttrInfoByKeyValue(attr_key, attr_val) { if (!attr_key || !attr_val) return; var attr_name = Config.attr_data.data_key_to_name[attr_key]; if (attr_name) { var icon = PathTool.getAttrIconByStr(attr_key); var PartnerCalculate = require("partner_calculate"); var is_per = PartnerCalculate.isShowPerByStr(attr_key); if (is_per == true) { attr_val = attr_val / 10 + "%"; } var res = PathTool.getUIIconPath("common", icon); return { res: res, attr_name: attr_name, attr_val: attr_val, icon: icon }; } } }; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcdXRpbFxcdXRpbHMuanMiXSwibmFtZXMiOlsiU291bmRNYW5hZ2VyIiwicmVxdWlyZSIsIndpbmRvdyIsIlV0aWxzIiwiX2VmZmVjdF9vbmNlX3BsYXlpbmciLCJfZWZmZWN0X29uY2VfbGFzdCIsIl9lZmZlY3Rfb25jZV9saXN0Iiwia2V5ZmluZCIsImtleSIsInZhbCIsImFyciIsImkiLCJuIiwibGVuZ3RoIiwiZGVlcENvcHkiLCJzb3VyY2UiLCJzb3VyY2VDb3B5IiwiQXJyYXkiLCJpdGVtIiwicmFuZG9tTnVtIiwibWluIiwibWF4IiwiTWF0aCIsInJvdW5kIiwicmFuZG9tIiwicmFuZG9tU3RyIiwic3RyUmFuZ2UiLCJzdHIiLCJsZW4iLCJwb3MiLCJjaGFyQXQiLCJUSTE4TiIsImdldFVuaXRDb25maWciLCJpZCIsImdkYXRhIiwiZ2V0SXRlbUNvbmZpZyIsImdldE5vcktleSIsImluZGV4IiwiZWxlbWVudCIsImNsb3NlQWxsV2luZG93IiwidGVtcF9saXN0IiwiQmFzZVZpZXciLCJ3aW5NYXAiLCJwdXNoIiwiY2xvc2UiLCJjbG9zZV93aW4iLCJoaWRlQWxsV2luZG93Rm9yQmF0dGxlIiwiaXNfYmVmb3JlX2JhdHRsZSIsImVudGVyX2JhdHRsZV9zdGF0dXMiLCJnZXRWaXNpYmxlIiwic2V0VmlzaWJsZSIsInNob3dBbGxXaW5kb3dGb3JCYXR0bGUiLCJuZWVkX3Nob3dfc2NlbmUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJGdWxsIiwiaXNFbXB0eSIsIm9iaiIsIm9iakluZGV4IiwibmV4dCIsImsiLCJ0YWJsZUxvd2VyU29ydGVyIiwiYXJyYXkiLCJhIiwiYiIsInRhYmxlVXBwZXJTb3J0ZXIiLCJ0YWJsZUNvbW1vblNvcnRlciIsInRlbXBfdGFiIiwiaXNfc29ydCIsImNyZWF0ZUNsYXNzIiwid2luZG93X25hbWUiLCJhbnkiLCJjYyIsImVycm9yIiwiV2luZG93Q2xhc3MiLCJwbGF5RWZmZWN0T25jZSIsImVmZmVjdF9uYW1lIiwieCIsInkiLCJwYXJlbnQiLCJmaW5pc2hfY2FsbCIsImFjdGlvbl9uYW1lIiwic2NhbGUiLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb24iLCJlZmZlY3Rfb2JqZWN0Iiwibm9kZSIsImRlc3Ryb3kiLCJMb2FkZXJNYW5hZ2VyIiwiZ2V0SW5zdGFuY2UiLCJyZWxlYXNlUmVzIiwicmVzX3BhdGgiLCJvYmplY3QiLCJzaGlmdCIsInJlbW92ZV9mdW4iLCJiaW5kIiwiZWZmZWN0IiwiTm9kZSIsInNldEFuY2hvclBvaW50Iiwic2V0UG9zaXRpb24iLCJhZGRDaGlsZCIsImVmZmVjdF9zcGluZSIsImFkZENvbXBvbmVudCIsInNwIiwiU2tlbGV0b24iLCJQYXRoVG9vbCIsImdldFNwaW5lUGF0aCIsInNldENvbXBsZXRlTGlzdGVuZXIiLCJ0cmFja0VudHJ5IiwibG9vcENvdW50IiwiYW5pbWF0aW9uTmFtZSIsImFuaW1hdGlvbiIsIm5hbWUiLCJsb2FkUmVzIiwicmVzX29iamVjdCIsInNrZWxldG9uRGF0YSIsInNldEFuaW1hdGlvbiIsImdldEJ5dGVMZW4iLCJtYXRjaCIsInNldEdyZXlCdXR0b24iLCJidG4iLCJib29sIiwiaW50ZXJhY3RhYmxlIiwiZW5hYmxlQXV0b0dyYXlFZmZlY3QiLCJnZXRUaW1lSW50ZXJ2YWwiLCJ0aW1lX3N0YW1wIiwic3J2ZXJfdGltZSIsImdjb3JlIiwiU21hcnRTb2NrZXQiLCJnZXRUaW1lIiwiY2hhbmdlSW50ZXZhbFRvRGF0ZSIsInNlY29uZE51bSIsIm5fYWRkbyIsImRheVNlY29uZCIsImhvdXJTZWNvbmQiLCJkYXkiLCJmbG9vciIsInJlbWFpblNlY29uZE0iLCJob3VyIiwicmVtYWluU2Vjb25kUyIsIm1pbnV0ZSIsInNlY29uZCIsImNlaWwiLCJEIiwiSCIsIk0iLCJTIiwiYWRkMCIsIm0iLCJnZXRNb25leVN0cmluZyIsInZhbHVlIiwiaXNfc3ltYm9sIiwibW9uZXlGb3JtYXQiLCJqcyIsImZvcm1hdFN0ciIsInNpZ24iLCJTdHJpbmciLCJtb25leVNwbGl0Iiwic3BsaWNlIiwiSm9pbiIsInNvdXJjZV9zdHIiLCJzcGxpdF9zdHIiLCJzdWJzdHJpbmciLCJTcGxpdCIsInNwbGl0X3N0cmluZyIsInNwbGl0dGVyIiwic3BsaXRfcmVzdWx0Iiwic2VhcmNoX3Bvc19iZWdpbiIsImZpbmRfcG9zX2JlZ2luIiwiaW5kZXhPZiIsImZpbmRfcG9zX2VuZCIsIk9iamVjdCIsImtleXMiLCJzdWJzdHIiLCJqb2luX3RhYmxlIiwiam9pbmVyIiwiam9pbiIsInRyYW5zZm9ybU5hbWVCeVNlcnYiLCJzcnZfaWQiLCJ0bXBOYW1lIiwiaXNUaGVTYW1lU3ZyIiwidm8iLCJnZXRSb2xlVm8iLCJsaXN0T3IiLCJsaXN0TWUiLCJzcGxpdERhdGFTdHIiLCJjb250ZW50IiwicmVzdWx0IiwidGVtcCIsInRhcmdldCIsImxpc3QiLCJwYXJzZUludCIsInJlcGxhY2UiLCJSb2xlQ29udHJvbGxlciIsInJvbGVfdm8iLCJjcmVhdGVMYWJlbCIsImZvbnRfc2l6ZSIsInRleHRfY29sb3IiLCJsaW5lX2NvbG9yIiwidGV4dF9jb250ZW50IiwicGFyZW50X3duZCIsImxpbmVfbnVtIiwiYW5jaG9ycG9pbnQiLCJmb250IiwidjIiLCJsYWJlbCIsIkxhYmVsIiwiZm9udFNpemUiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJDRU5URVIiLCJ2ZXJ0aWNhbEFsaWduIiwiQ29sb3IiLCJjb2xvciIsImxpbmUiLCJMYWJlbE91dGxpbmUiLCJ3aWR0aCIsInN0cmluZyIsImNyZWF0ZVJpY2hMYWJlbCIsImZvbnRzaXplIiwidGV4dGNvbG9yIiwiYXAiLCJsaW5lSGVpZ2h0IiwibWF4X3dpZHRoIiwiYWxpZ24iLCJSaWNoVGV4dCIsIkxFRlQiLCJSSUdIVCIsIm1heFdpZHRoIiwiY3JlYXRlSW1hZ2UiLCJyZXMiLCJhbmNob3JQb2ludCIsInVzZVBsaXN0Iiwiem9yZGVyIiwiaXNfU2NhbGU5IiwiaW1hZ2UiLCJTcHJpdGUiLCJzcHJpdGVGcmFtZSIsInR5cGUiLCJUeXBlIiwiU0xJQ0VEIiwic2l6ZU1vZGUiLCJTaXplTW9kZSIsIkNVU1RPTSIsImNyZWF0ZUVmZmVjdFNwaW5lIiwiZWZmZWN0TmFtZSIsImFyUG9zIiwibG9vcCIsImNhbGxfYmFjayIsInBpeGVsZm9ybWFsIiwibm90X3BsYXlfYWN0aW9uIiwiYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyIsInN0YXR1cyIsIm9mZnNldF94Iiwib2Zmc2V0X3kiLCJyZWRfdHlwZSIsInJlZF9wb2ludCIsInJlZF9yZXMiLCJnZXRVSUljb25QYXRoIiwiZ2V0Q29tbW9uSWNvbVBhdGgiLCJub2RlX3NpemUiLCJnZXRDb250ZW50U2l6ZSIsInBvc194IiwicG9zX3kiLCJoZWlnaHQiLCJhY3RpdmUiLCJnZXRBcnJUcnVlTGVuIiwidiIsImdldEFyckxlbiIsImRlbGF5UnVuIiwiZGVsYXlfdGltZSIsImZ1biIsImRlbGF5X2Z1biIsImRlbGF5VGltZSIsImNhbGxfZnVuIiwiY2FsbEZ1bmMiLCJydW5BY3Rpb24iLCJzZXF1ZW5jZSIsIm9uVG91Y2hFbmQiLCJjbGlja2JhY2siLCJzb3VuZFR5cGUiLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsImV2ZW50IiwicGxheUJ1dHRvblNvdW5kIiwicmVzX2lkIiwiQnV0dG9uU291bmQiLCJOb3JtYWwiLCJDbG9zZSIsIlRhYiIsInBsYXlFZmZlY3QiLCJBVURJT19UWVBFIiwiQ09NTU9OIiwicGxheUVmZmVjdFNvdW5kIiwicGxheU11c2ljIiwiZ2V0UmFuZG9tU2F2ZU5hbWUiLCJyYW5kb21OYW1lIiwiZnJvbUNoYXJDb2RlIiwiYyIsInVzciIsImdldFNlcnZlckluZGV4Iiwic3BsaXQiLCJjb21tb25TaG93U2luZ2xlUm93SXRlbUxpc3QiLCJpdGVtX3Njcm9sbHZpZXciLCJpdGVtX2xpc3QiLCJkYXRhX2xpc3QiLCJzZXR0aW5nIiwiaXNBY3Rpb25DYWxsQmFjayIsInN0YXJ0X3giLCJzcGFjZV94IiwibWF4X2NvdW50IiwiaXRlbV93aWR0aCIsImxvY2siLCJpc190aXAiLCJjYWxsYmFjayIsIml0ZW1fY291bnQiLCJ0b3RhbF93aWR0aCIsIml0ZW1fc2Nyb2xsdmlld19zaXplIiwic2V0Q29udGVudFNpemUiLCJzaXplIiwib2ZmIiwiVE9VQ0hfU1RBUlQiLCJfb25Ub3VjaEJlZ2FuIiwiVE9VQ0hfTU9WRSIsIl9vblRvdWNoTW92ZWQiLCJfb25Ub3VjaEVuZGVkIiwiVE9VQ0hfQ0FOQ0VMIiwiX29uVG91Y2hDYW5jZWxsZWQiLCJpc19jZW50ZXIiLCJzdG9wQWxsQWN0aW9ucyIsIl9zZXRJdGVtRGF0YSIsIl94Iiwic2V0RGF0YSIsImJpZCIsIm51bSIsInNob3dPcmRlcldhckxvY2siLCJhZGRBY3Rpb25DYWxsQmFjayIsImFkZENhbGxCYWNrIiwic2V0RXh0ZW5kTGFiZWwiLCJzZXREZWZhdWx0VGlwIiwic2hvd19lZmZlY3RfaWQiLCJzaG93SXRlbUVmZmVjdCIsImFjdGlvbl8xIiwiZGVhbGV5IiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsImluaXRDb25maWciLCJzZXRQYXJlbnQiLCJzaG93IiwiY29tbW9uU2hvd0VtcHR5SWNvbiIsInRleHQiLCJlbXB0eV9jb24iLCJwYXJlbnRfc2l6ZSIsImxhYmVsX2NvbG9yIiwiZnJvbUhFWCIsIkNvbmZpZyIsImNvbG9yX2RhdGEiLCJkYXRhX2NvbG9yMTYiLCJiZyIsImVtcHR5X2xhYmVsIiwiZ2V0VHlwZSIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsIm1hcCIsImRlZXBDb3B5MSIsInAiLCJjb21tb25Db3VudERvd25UaW1lIiwibGVzc190aW1lIiwibGFiZWxfdHlwZSIsInRpbWVfdGl0bGUiLCJ0aW1lX2NvbG9yIiwiVGltZVRvb2wiLCJfc2V0VGltZUZvcm1hdFN0cmluZyIsInRpbWUiLCJnZXRUaW1lRm9yRnVuY3Rpb24iLCJyZXBlYXRGb3JldmVyIiwic2V0Q2hpbGRVbkVuYWJsZWQiLCJzcF9zdGF0dXMiLCJTdGF0ZSIsIkdSQVkiLCJOT1JNQUwiLCJzcHJpdGVzIiwiZ2V0Q29tcG9uZW50c0luQ2hpbGRyZW4iLCJzZXRTdGF0ZSIsImNvbW1vbkdldEF0dHJJbmZvQnlLZXlWYWx1ZSIsImF0dHJfa2V5IiwiYXR0cl92YWwiLCJhdHRyX25hbWUiLCJhdHRyX2RhdGEiLCJkYXRhX2tleV90b19uYW1lIiwiaWNvbiIsImdldEF0dHJJY29uQnlTdHIiLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiaXNfcGVyIiwiaXNTaG93UGVyQnlTdHIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBLElBQUlBLFlBQVksR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBMUI7O0FBRUFDLE1BQU0sQ0FBQ0MsS0FBUCxHQUFlO0FBQ1hDLEVBQUFBLG9CQUFvQixFQUFFLEtBRFg7QUFFWEMsRUFBQUEsaUJBQWlCLEVBQUUsSUFGUjtBQUdYQyxFQUFBQSxpQkFBaUIsRUFBRSxJQUhSO0FBS1hDLEVBQUFBLE9BQU8sRUFBRSxpQkFBVUMsR0FBVixFQUFlQyxHQUFmLEVBQW9CQyxHQUFwQixFQUF5QjtBQUM5QixTQUFLLElBQUlDLENBQUMsR0FBRyxDQUFSLEVBQVdDLENBQUMsR0FBR0YsR0FBRyxDQUFDRyxNQUF4QixFQUFnQ0YsQ0FBQyxHQUFHQyxDQUFwQyxFQUF1Q0QsQ0FBQyxFQUF4QyxFQUE0QztBQUN4QyxVQUFJRCxHQUFHLENBQUNDLENBQUQsQ0FBSCxDQUFPSCxHQUFQLEtBQWVDLEdBQW5CLEVBQXdCO0FBQ3BCLGVBQU9DLEdBQUcsQ0FBQ0MsQ0FBRCxDQUFWO0FBQ0g7QUFDSjs7QUFDRCxXQUFPLElBQVA7QUFDSCxHQVpVO0FBY1hHLEVBQUFBLFFBQVEsRUFBRSxrQkFBVUMsTUFBVixFQUFrQjtBQUN4QixRQUFJQyxVQUFVLEdBQUdELE1BQU0sWUFBWUUsS0FBbEIsR0FBMEIsRUFBMUIsR0FBK0IsRUFBaEQ7O0FBQ0EsU0FBSyxJQUFJQyxJQUFULElBQWlCSCxNQUFqQixFQUF5QjtBQUNyQkMsTUFBQUEsVUFBVSxDQUFDRSxJQUFELENBQVYsR0FBbUIsUUFBT0gsTUFB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Q0FBQ25YLE1BQTVCLEVBQW9DLEVBQUVGLENBQXRDLEVBQXlDO0FBQ3JDcVgsTUFBQUEsT0FBTyxDQUFDclgsQ0FBRCxDQUFQLENBQVd1WCxRQUFYLENBQW9CTixTQUFwQjtBQUNIO0FBQ0osR0E5aUNVO0FBZ2pDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBTyxFQUFBQSwyQkFBMkIsRUFBRSxxQ0FBVUMsUUFBVixFQUFvQkMsUUFBcEIsRUFBOEI7QUFDdkQsUUFBSSxDQUFDRCxRQUFELElBQWEsQ0FBQ0MsUUFBbEIsRUFBNEI7QUFDNUIsUUFBSUMsU0FBUyxHQUFHakMsTUFBTSxDQUFDa0MsU0FBUCxDQUFpQkMsZ0JBQWpCLENBQWtDSixRQUFsQyxDQUFoQjs7QUFDQSxRQUFJRSxTQUFKLEVBQWU7QUFDWCxVQUFJRyxJQUFJLEdBQUdoUyxRQUFRLENBQUNpUyxnQkFBVCxDQUEwQk4sUUFBMUIsQ0FBWDs7QUFDQSxVQUFJTyxnQkFBZ0IsR0FBRzFZLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxVQUFJMlksTUFBTSxHQUFHRCxnQkFBZ0IsQ0FBQ0UsY0FBakIsQ0FBZ0NULFFBQWhDLENBQWI7O0FBQ0EsVUFBSVEsTUFBTSxJQUFJLElBQWQsRUFBb0I7QUFDaEJQLFFBQUFBLFFBQVEsR0FBSUEsUUFBUSxHQUFHLEVBQVosR0FBa0IsR0FBN0I7QUFDSDs7QUFDRCxVQUFJOUosR0FBRyxHQUFHOUgsUUFBUSxDQUFDMEosYUFBVCxDQUF1QixRQUF2QixFQUFpQ3NJLElBQWpDLENBQVY7QUFFQSxhQUFPO0FBQUVsSyxRQUFBQSxHQUFHLEVBQUVBLEdBQVA7QUFBWStKLFFBQUFBLFNBQVMsRUFBRUEsU0FBdkI7QUFBa0NELFFBQUFBLFFBQVEsRUFBRUEsUUFBNUM7QUFBc0RJLFFBQUFBLElBQUksRUFBRUE7QUFBNUQsT0FBUDtBQUNIO0FBQ0o7QUFsa0NVLENBQWYiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIOW3peWFt+exu+eahOWFqOWxgFxyXG52YXIgU291bmRNYW5hZ2VyID0gcmVxdWlyZShcInNvdW5kbWFuYWdlclwiKTtcclxuXHJcbndpbmRvdy5VdGlscyA9IHtcclxuICAgIF9lZmZlY3Rfb25jZV9wbGF5aW5nOiBmYWxzZSxcclxuICAgIF9lZmZlY3Rfb25jZV9sYXN0OiBudWxsLFxyXG4gICAgX2VmZmVjdF9vbmNlX2xpc3Q6IG51bGwsXHJcblxyXG4gICAga2V5ZmluZDogZnVuY3Rpb24gKGtleSwgdmFsLCBhcnIpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyci5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFycltpXVtrZXldID09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycltpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgZGVlcENvcHk6IGZ1bmN0aW9uIChzb3VyY2UpIHtcclxuICAgICAgICB2YXIgc291cmNlQ29weSA9IHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiB7fTtcclxuICAgICAgICBmb3IgKHZhciBpdGVtIGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICBzb3VyY2VDb3B5W2l0ZW1dID0gdHlwZW9mIHNvdXJjZVtpdGVtXSA9PT0gJ29iamVjdCcgPyB0aGlzLmRlZXBDb3B5KHNvdXJjZVtpdGVtXSkgOiBzb3VyY2VbaXRlbV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb3VyY2VDb3B5O1xyXG4gICAgfSxcclxuXHJcbiAgICByYW5kb21OdW06IGZ1bmN0aW9uIChtaW4sIG1heCkge1xyXG4gICAgICAgIGlmIChtYXggPiBtaW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbWluO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgcmFuZG9tU3RyOiBmdW5jdGlvbiAobWluLCBtYXgsIHN0clJhbmdlKSB7XHJcbiAgICAgICAgdmFyIG4gPSB0aGlzLnJhbmRvbU51bShtaW4sIG1heCk7XHJcbiAgICAgICAgc3RyUmFuZ2UgPSBzdHJSYW5nZSB8fCAnMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonO1xyXG4gICAgICAgIHZhciBzdHIgPSBcIlwiO1xyXG4gICAgICAgIHZhciBsZW4gPSBzdHJSYW5nZS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucmFuZG9tTnVtKDEsIGxlbikgLSAxO1xyXG4gICAgICAgICAgICBzdHIgKz0gc3RyUmFuZ2UuY2hhckF0KHBvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9LFxyXG5cclxuICAgIFRJMThOOiBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH0sXHJcblxyXG4gICAgLy8g6I635Y+W5Y2V5L2N6YWN572uXHJcbiAgICBnZXRVbml0Q29uZmlnOiBmdW5jdGlvbiAoaWQpIHtcclxuICAgICAgICByZXR1cm4gZ2RhdGEoXCJ1bml0X2RhdGFcIiwgXCJkYXRhX3VuaXQxXCIsIGlkLCBmYWxzZSkgfHwgZ2RhdGEoXCJ1bml0X2RhdGFcIiwgXCJkYXRhX3VuaXQyXCIsIGlkLCBmYWxzZSkgfHwgZ2RhdGEoXCJ1bml0X2RhdGFcIiwgXCJkYXRhX3VuaXQzXCIsIGlkKVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDojrflj5bnianlk4HphY3nva7mlbDmja5cclxuICAgIGdldEl0ZW1Db25maWc6IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgICAgIHJldHVybiBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDFcIiwgaWQsIGZhbHNlKSB8fCBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDJcIiwgaWQsIGZhbHNlKSB8fCBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDNcIiwgaWQsIGZhbHNlKSB8fCBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDRcIiwgaWQsIGZhbHNlKSB8fCBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfdW5pdDVcIiwgaWQsIGZhbHNlKVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDmi7xrZXlcclxuICAgIGdldE5vcktleTogZnVuY3Rpb24gKC4uLnZhbHVlKSB7XHJcbiAgICAgICAgdmFyIGtleSA9IFwiXCJcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB2YWx1ZVtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAga2V5ID0ga2V5ICsgXCJfXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAga2V5ID0ga2V5ICsgZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGtleVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlhbPpl63miYDmnInnqpfkvZNcclxuICAgIGNsb3NlQWxsV2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHRlbXBfbGlzdCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBCYXNlVmlldy53aW5NYXAubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCYXNlVmlldy53aW5NYXBbaW5kZXhdO1xyXG4gICAgICAgICAgICB0ZW1wX2xpc3QucHVzaChlbGVtZW50KVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGVtcF9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGVtcF9saXN0W2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xvc2UpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xvc2UoeyBjbG9zZV93aW46IHRydWUgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBCYXNlVmlldy53aW5NYXAgPSBbXTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8g6L+b5YWl5oiY5paX5ZCOLOWFs+mXreaJgOacieeahOeql+S9k1xyXG4gICAgaGlkZUFsbFdpbmRvd0ZvckJhdHRsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBCYXNlVmlldy53aW5NYXAubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCYXNlVmlldy53aW5NYXBbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCAmJiAhZWxlbWVudC5pc19iZWZvcmVfYmF0dGxlKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmVudGVyX2JhdHRsZV9zdGF0dXMgPSBlbGVtZW50LmdldFZpc2libGUoKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNfYmVmb3JlX2JhdHRsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5lbnRlcl9iYXR0bGVfc3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDpgIDlh7rmiJjmlpfkuYvlkI4s5omT5byA6L+b5YWl5oiY5paX5LmL5YmN55qE55WM6Z2iXHJcbiAgICBzaG93QWxsV2luZG93Rm9yQmF0dGxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIG5lZWRfc2hvd19zY2VuZSA9IHRydWU7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IEJhc2VWaWV3Lndpbk1hcC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJhc2VWaWV3Lndpbk1hcFtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5lbnRlcl9iYXR0bGVfc3RhdHVzID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmVudGVyX2JhdHRsZV9zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRWaXNpYmxlKGVsZW1lbnQuZW50ZXJfYmF0dGxlX3N0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAobmVlZF9zaG93X3NjZW5lID09IHRydWUgJiYgZWxlbWVudC53aW5fdHlwZSA9PSBXaW5UeXBlLkZ1bGwgJiYgZWxlbWVudC5lbnRlcl9iYXR0bGVfc3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZWVkX3Nob3dfc2NlbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNfYmVmb3JlX2JhdHRsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZWVkX3Nob3dfc2NlbmU7XHJcbiAgICB9LFxyXG5cclxuICAgIGlzRW1wdHk6IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICBmb3IgKHZhciBvYmpJbmRleCBpbiBvYmopIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/ov5Tlm57mlbDnu4TmiJblr7nosaHnmoTkuIvkuIDkuKrntKLlvJXlgLxcclxuICAgIC8vKOWunumZheWPquiDveeUqOadpeWIpOaWreaYr+WQpuS4uuepuu+8jOS4jeiDveeUqOadpeW+queOr+iOt+WPlue0ouW8leWAvClcclxuICAgIG5leHQ6IGZ1bmN0aW9uIChhcnIpIHtcclxuICAgICAgICBmb3IgKHZhciBrIGluIGFycikge1xyXG4gICAgICAgICAgICBpZiAoYXJyW2tdICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH0sXHJcblxyXG4gICAgLy8g5aSa5YWD57Sg5bCP5Yiw5aSnXHJcbiAgICB0YWJsZUxvd2VyU29ydGVyOiBmdW5jdGlvbiAoYXJyYXkpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChhW2VsZW1lbnRdID09IG51bGwgfHwgYltlbGVtZW50XSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChhW2VsZW1lbnRdICE9IGJbZWxlbWVudF0pIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVtlbGVtZW50XSAtIGJbZWxlbWVudF1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gMVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8g5aSa5YWD57Sg5LuO5aSn5Yiw5bCPXHJcbiAgICB0YWJsZVVwcGVyU29ydGVyOiBmdW5jdGlvbiAoYXJyYXkpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoYVtlbGVtZW50XSA9PSBudWxsIHx8IGJbZWxlbWVudF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGFbZWxlbWVudF0gIT0gYltlbGVtZW50XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiW2VsZW1lbnRdIC0gYVtlbGVtZW50XVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAtMVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyrmjInpnIDmjpLluo9cclxuICAgIHRlbXBfdGFiIOmcgOimgeavlOi+g+eahOihqOmhueS4reeahOWkmuS4qmtleeWAvO+8jOeUqOS6juWkmuWPguaVsOeahOavlOi+g1xyXG4gICAgdGVtcF90YWIgPSB7e1wi5Y+C5pWw5ZCN5a2XXCIsIHRydWV9LCB7XCLlj4LmlbDlkI3lrZdcIiwgZmFsc2V9Li4ufVxyXG4gICAgLS10cnVlICDooajnpLog5aSn5Yiw5bCPICBmYWxzZSDooajnpLog5bCP5Yiw5aSnICovXHJcbiAgICB0YWJsZUNvbW1vblNvcnRlcjogZnVuY3Rpb24gKHRlbXBfdGFiKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlbXBfdGFiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGVtcF90YWJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoYVtlbGVtZW50WzBdXSA9PSBudWxsIHx8IGJbZWxlbWVudFswXV0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGlzX3NvcnQgPSBlbGVtZW50WzFdIHx8IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzX3NvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYVtlbGVtZW50WzBdXSAhPSBiW2VsZW1lbnRbMF1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiW2VsZW1lbnRbMF1dIC0gYVtlbGVtZW50WzBdXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFbZWxlbWVudFswXV0gIT0gYltlbGVtZW50WzBdXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVtlbGVtZW50WzBdXSAtIGJbZWxlbWVudFswXV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0xXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDliJvlu7rkuIDkuKrpnIDopoFyZXF1aXJl55qE57G7XHJcbiAgICBjcmVhdGVDbGFzczogZnVuY3Rpb24gKHdpbmRvd19uYW1lLCBhbnkpIHtcclxuICAgICAgICBpZiAod2luZG93X25hbWUgPT0gbnVsbCB8fCB3aW5kb3dfbmFtZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjLmVycm9yKFwi5Yib5bu656qX5L2T5aSx6LSlLOayoeaciee7meWFt+S9k+WQjeWtlyA9PT09PT09PT4+XCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBXaW5kb3dDbGFzcyA9IHJlcXVpcmUod2luZG93X25hbWUpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dDbGFzcyhhbnkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaSreaUvuS4gOasoeeJueaViCzkuLTml7bliJvlu7rkuIDkuKroioLngrnmlbDmja4s5pKt5pS+5a6M54m55pWI5LmL5ZCO56e76ZmkXHJcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9uYW1lIOeJueaViOi1hOa6kOWQjVxyXG4gICAgICogQHBhcmFtIHsqfSB4IOWdkOagh1hcclxuICAgICAqIEBwYXJhbSB7Kn0geSDlnZDmoIdZXHJcbiAgICAgKiBAcGFyYW0geyp9IHBhcmVudCDniLboioLngrlcclxuICAgICAqIEBwYXJhbSB7Kn0gZmluaXNoX2NhbGwg5pKt5pS+5a6M55qE5Zue6LCDXHJcbiAgICAgKiBAcGFyYW0geyp9IGFjdGlvbl9uYW1lIOaSreaUvuWKqOS9nCzpu5jorqTkuLphY3Rpb25cclxuICAgICAqIEBwYXJhbSB7Kn0gc2NhbGUg57yp5pS+5q+ULOeQhuiuuuS4iuS4jemcgOimgeiuvue9rlxyXG4gICAgICovXHJcbiAgICBwbGF5RWZmZWN0T25jZTogZnVuY3Rpb24gKGVmZmVjdF9uYW1lLCB4LCB5LCBwYXJlbnQsIGZpbmlzaF9jYWxsLCBhY3Rpb25fbmFtZSwgc2NhbGUpIHtcclxuICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHJldHVybjtcclxuICAgICAgICBhY3Rpb25fbmFtZSA9IGFjdGlvbl9uYW1lIHx8IFBsYXllckFjdGlvbi5hY3Rpb25cclxuICAgICAgICBzY2FsZSA9IHNjYWxlIHx8IDFcclxuICAgICAgICBpZiAodGhpcy5fZWZmZWN0X29uY2VfcGxheWluZyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9vYmplY3QgJiYgdGhpcy5lZmZlY3Rfb2JqZWN0Lm5vZGUgJiYgdGhpcy5lZmZlY3Rfb2JqZWN0Lm5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWZmZWN0X29uY2VfbGFzdCAhPSBlZmZlY3RfbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lZmZlY3Rfb25jZV9saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWZmZWN0X29uY2VfbGlzdCA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX2xpc3QucHVzaCh7IGVmZmVjdF9uYW1lOiBlZmZlY3RfbmFtZSwgeDogeCwgeTogeSwgcGFyZW50OiBwYXJlbnQsIGZpbmlzaF9jYWxsOiBmaW5pc2hfY2FsbCwgYWN0aW9uX25hbWU6IGFjdGlvbl9uYW1lLCBzY2FsZTogc2NhbGUgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9vYmplY3QgJiYgdGhpcy5lZmZlY3Rfb2JqZWN0Lm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdF9vYmplY3Qubm9kZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXModGhpcy5lZmZlY3Rfb2JqZWN0LnJlc19wYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X29iamVjdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lZmZlY3Rfb25jZV9sYXN0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX3BsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lZmZlY3Rfb25jZV9saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZmZlY3Rfb25jZV9saXN0ID0gW11cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX2xpc3QucHVzaCh7IGVmZmVjdF9uYW1lOiBlZmZlY3RfbmFtZSwgeDogeCwgeTogeSwgcGFyZW50OiBwYXJlbnQsIGZpbmlzaF9jYWxsOiBmaW5pc2hfY2FsbCwgYWN0aW9uX25hbWU6IGFjdGlvbl9uYW1lLCBzY2FsZTogc2NhbGUgfSlcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWZmZWN0X29uY2VfbGlzdCAmJiB0aGlzLl9lZmZlY3Rfb25jZV9saXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5fZWZmZWN0X29uY2VfbGlzdC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlFZmZlY3RPbmNlKG9iamVjdC5lZmZlY3RfbmFtZSwgb2JqZWN0LngsIG9iamVjdC55LCBvYmplY3QucGFyZW50LCBvYmplY3QuZmluaXNoX2NhbGwsIG9iamVjdC5hY3Rpb25fbmFtZSwgb2JqZWN0LnNjYWxlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX3BsYXlpbmcgPSB0cnVlXHJcbiAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX2xhc3QgPSBlZmZlY3RfbmFtZVxyXG4gICAgICAgICAgICB2YXIgcmVtb3ZlX2Z1biA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaW5pc2hfY2FsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaF9jYWxsKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2VmZmVjdF9vbmNlX3BsYXlpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWZmZWN0X29uY2VfbGFzdCA9IG51bGxcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVmZmVjdF9vYmplY3QpIHsgICAgLy/np7vpmaTmjonnvJPlrZjnmoTlr7nosaFcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZmZlY3Rfb2JqZWN0Lm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZmZlY3Rfb2JqZWN0Lm5vZGUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyh0aGlzLmVmZmVjdF9vYmplY3QucmVzX3BhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X29iamVjdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWZmZWN0X29uY2VfbGlzdCAmJiB0aGlzLl9lZmZlY3Rfb25jZV9saXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5fZWZmZWN0X29uY2VfbGlzdC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlFZmZlY3RPbmNlKG9iamVjdC5lZmZlY3RfbmFtZSwgb2JqZWN0LngsIG9iamVjdC55LCBvYmplY3QucGFyZW50LCBvYmplY3QuZmluaXNoX2NhbGwsIG9iamVjdC5hY3Rpb25fbmFtZSwgb2JqZWN0LnNjYWxlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcblxyXG4gICAgICAgICAgICAvLyDoioLngrnlr7nosaFcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3Rfb2JqZWN0ID0geyBub2RlOiBudWxsLCBlZmZlY3Q6IG51bGwsIHJlc19wYXRoOiBudWxsIH07XHJcblxyXG5cclxuICAgICAgICAgICAgLy8g5Yib5bu65Li05pe255qE6IqC54K5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gbmV3IGNjLk5vZGUoXCJvbmNlX2VmZmVjdFwiKTtcclxuICAgICAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSk7XHJcbiAgICAgICAgICAgIGlmIChzY2FsZSAhPSAxKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnNjYWxlID0gc2NhbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbm9kZS5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB2YXIgZWZmZWN0X3NwaW5lID0gbm9kZS5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xyXG4gICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoZWZmZWN0X25hbWUsIFwiYWN0aW9uXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8g5YKo5a2Y5pWw5o2uXHJcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X29iamVjdC5ub2RlID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3Rfb2JqZWN0LmVmZmVjdCA9IGVmZmVjdF9zcGluZTtcclxuICAgICAgICAgICAgdGhpcy5lZmZlY3Rfb2JqZWN0LnJlc19wYXRoID0gcmVzX3BhdGg7XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIOebkeWQrOS6i+S7tlxyXG4gICAgICAgICAgICBlZmZlY3Rfc3BpbmUuc2V0Q29tcGxldGVMaXN0ZW5lcigoZnVuY3Rpb24gKHRyYWNrRW50cnksIGxvb3BDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFuaW1hdGlvbk5hbWUgPSB0cmFja0VudHJ5LmFuaW1hdGlvbiA/IHRyYWNrRW50cnkuYW5pbWF0aW9uLm5hbWUgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbk5hbWUgPT0gYWN0aW9uX25hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXHJcblxyXG5cclxuICAgICAgICAgICAgLy8g5Yqg6L296LWE5rqQXHJcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHJlc19wYXRoLCAoZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdF9zcGluZS5za2VsZXRvbkRhdGEgPSByZXNfb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBlZmZlY3Rfc3BpbmUuc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+iuoeeul+Wtl+espuS4sumVv+W6pu+8jOaxieWtl+eul+S4pOS4qumVv+W6plxyXG4gICAgLy/vvIjlpoLmnpzmsYnlrZfnrpfkuIDkuKrplb/luqYs55u05o6lc3RyaW5nLmxlbmd0aOWPr+S7peiOt+W+l++8iVxyXG4gICAgZ2V0Qnl0ZUxlbjogZnVuY3Rpb24gKHZhbCkge1xyXG4gICAgICAgIHZhciBsZW4gPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBhID0gdmFsLmNoYXJBdChpKTtcclxuICAgICAgICAgICAgaWYgKGEubWF0Y2goL1teXFx4MDAtXFx4ZmZdL2lnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZW4gKz0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxlbiArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsZW47XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5oyJ6ZKu572u54Gw77yM5bm25YWz6Zet5LqL5Lu277yMYnRuOmNjLkJ1dHRvbiwgIGJvb2w6dHJ1ZeaYr+WPmOeBsFxyXG4gICAgc2V0R3JleUJ1dHRvbjogZnVuY3Rpb24gKGJ0biwgYm9vbCkge1xyXG4gICAgICAgIGlmIChib29sID09IG51bGwpXHJcbiAgICAgICAgICAgIGJvb2wgPSB0cnVlXHJcbiAgICAgICAgaWYgKGJ0bikge1xyXG4gICAgICAgICAgICBidG4uaW50ZXJhY3RhYmxlID0gIWJvb2w7XHJcbiAgICAgICAgICAgIGJ0bi5lbmFibGVBdXRvR3JheUVmZmVjdCA9IGJvb2w7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBnZXRUaW1lSW50ZXJ2YWw6IGZ1bmN0aW9uICh0aW1lX3N0YW1wKSB7XHJcbiAgICAgICAgaWYgKCEodGltZV9zdGFtcCA+PSAwKSkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBzcnZlcl90aW1lID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xyXG4gICAgICAgIHJldHVybiB0aW1lX3N0YW1wIC0gc3J2ZXJfdGltZTtcclxuICAgIH0sXHJcblxyXG4gICAgLy8g5bCG56eS6L2s5Li65qCH5YeG5pe26Ze0LCDlj4LmlbA656eS5pWwLCDmmK/lkKbliqAwIFxyXG4gICAgY2hhbmdlSW50ZXZhbFRvRGF0ZTogZnVuY3Rpb24gKHNlY29uZE51bSwgbl9hZGRvKSB7XHJcbiAgICAgICAgaWYgKCEoc2Vjb25kTnVtID49IDApKSByZXR1cm47XHJcbiAgICAgICAgdmFyIGRheVNlY29uZCA9IDI0ICogNjAgKiA2MDtcclxuICAgICAgICB2YXIgaG91clNlY29uZCA9IDYwICogNjA7XHJcbiAgICAgICAgdmFyIGRheSA9IE1hdGguZmxvb3Ioc2Vjb25kTnVtIC8gZGF5U2Vjb25kKTtcclxuICAgICAgICB2YXIgcmVtYWluU2Vjb25kTSA9IHNlY29uZE51bSAlIGRheVNlY29uZDtcclxuICAgICAgICB2YXIgaG91ciA9IE1hdGguZmxvb3IocmVtYWluU2Vjb25kTSAvIGhvdXJTZWNvbmQpO1xyXG4gICAgICAgIHZhciByZW1haW5TZWNvbmRTID0gcmVtYWluU2Vjb25kTSAlIGhvdXJTZWNvbmQ7XHJcbiAgICAgICAgdmFyIG1pbnV0ZSA9IE1hdGguZmxvb3IocmVtYWluU2Vjb25kUyAvIDYwKTtcclxuICAgICAgICB2YXIgc2Vjb25kID0gTWF0aC5jZWlsKHJlbWFpblNlY29uZFMgJSA2MCk7XHJcbiAgICAgICAgaWYgKG5fYWRkbykge1xyXG4gICAgICAgICAgICByZXR1cm4geyBEOiBkYXksIEg6IGhvdXIsIE06IG1pbnV0ZSwgUzogc2Vjb25kIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhZGQwID0gZnVuY3Rpb24gKG0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG0gPCAxMCA/ICgnMCcgKyBtKSA6IG07XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4geyBEOiBkYXksIEg6IGFkZDAoaG91ciksIE06IGFkZDAobWludXRlKSwgUzogYWRkMChzZWNvbmQpIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1tb25leXRvb2wtLS1zdGFydC0tLS0tLS0tLS0tLS0vL1xyXG4gICAgLy/ovazmjaLph5HpkrHmoLzlvI9cclxuICAgIGdldE1vbmV5U3RyaW5nOiBmdW5jdGlvbiAodmFsdWUsIGlzX3N5bWJvbCkge1xyXG4gICAgICAgIGlmIChpc19zeW1ib2wgPT0gbnVsbClcclxuICAgICAgICAgICAgaXNfc3ltYm9sID0gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICBpZiAodmFsdWUgPCAxMDAwMDApIHtcclxuICAgICAgICAgICAgaWYgKGlzX3N5bWJvbClcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1vbmV5Rm9ybWF0KHZhbHVlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCAxMDAwMDAwMDApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlICogMC4wMDAxKTtcclxuICAgICAgICAgICAgaWYgKGlzX3N5bWJvbClcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+S4h1wiKSwgdGhpcy5tb25leUZvcm1hdCh2YWx1ZSkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiJXPkuIdcIiksIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUgKiAwLjAwMDAwMDAxKTtcclxuICAgICAgICAgICAgaWYgKGlzX3N5bWJvbClcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+S6v1wiKSwgdGhpcy5tb25leUZvcm1hdCh2YWx1ZSkpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiJXPkur9cIiksIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Lu36ZKx6YeM6Z2i5Yqg5LiK6YCX5Y+3XHJcbiAgICBtb25leUZvcm1hdDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHNpZ24gPSBcIlwiO1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgc2lnbiA9IFwiLVwiO1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogKC0xKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMTAwMClcclxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgdmFyIGFyciA9IHRoaXMubW9uZXlTcGxpdChTdHJpbmcodmFsdWUpLCBcIlwiKTtcclxuICAgICAgICB2YXIgbiA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGkgPSBuICUgMztcclxuICAgICAgICBpZiAoaSA9PSAwKSB7XHJcbiAgICAgICAgICAgIGkgPSA0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoaSA8IG4pIHtcclxuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAwLCBcIixcIilcclxuICAgICAgICAgICAgaSA9IGkgKyA0O1xyXG4gICAgICAgICAgICBuID0gbiArIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaWduICsgdGhpcy5Kb2luKGFyciwgXCJcIik7XHJcbiAgICB9LFxyXG5cclxuICAgIG1vbmV5U3BsaXQ6IGZ1bmN0aW9uIChzb3VyY2Vfc3RyLCBzcGxpdF9zdHIpIHtcclxuICAgICAgICBpZiAoc3BsaXRfc3RyLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnIgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2Vfc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzb3VyY2Vfc3RyLnN1YnN0cmluZyhpLCBpICsgMSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnJcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5TcGxpdChzb3VyY2Vfc3RyLCBzcGxpdF9zdHIpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW9uZXl0b29sLS0tZW5kLS0tLS0tLS0tLS0tLS8vXHJcblxyXG4gICAgLy8g5Lul5p+Q5Liq5YiG6ZqU56ym5Li65qCH5YeG77yM5YiG5Ymy5a2X56ym5LiyXHJcbiAgICAvLyBAcGFyYW0gc3BsaXRfc3RyaW5nIOmcgOimgeWIhuWJsueahOWtl+espuS4slxyXG4gICAgLy8gQHBhcmFtIHNwbGl0dGVyIOWIhumalOesplxyXG4gICAgLy8gQHJldHVybiDnlKjliIbpmpTnrKbliIbpmpTlpb3nmoR0YWJsZVxyXG4gICAgU3BsaXQ6IGZ1bmN0aW9uIChzcGxpdF9zdHJpbmcsIHNwbGl0dGVyKSB7XHJcbiAgICAgICAgdmFyIHNwbGl0X3Jlc3VsdCA9IHt9O1xyXG4gICAgICAgIHZhciBzZWFyY2hfcG9zX2JlZ2luID0gMDtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICB2YXIgZmluZF9wb3NfYmVnaW4gPSBzcGxpdF9zdHJpbmcuaW5kZXhPZihzcGxpdHRlciwgc2VhcmNoX3Bvc19iZWdpbik7XHJcbiAgICAgICAgICAgIHZhciBmaW5kX3Bvc19lbmQgPSBzcGxpdHRlci5sZW5ndGggKyBmaW5kX3Bvc19iZWdpbjtcclxuICAgICAgICAgICAgaWYgKGZpbmRfcG9zX2JlZ2luID09IC0xKSBicmVha1xyXG5cclxuICAgICAgICAgICAgc3BsaXRfcmVzdWx0W09iamVjdC5rZXlzKHNwbGl0X3Jlc3VsdCkubGVuZ3RoICsgMV0gPSBzcGxpdF9zdHJpbmcuc3Vic3RyaW5nKHNlYXJjaF9wb3NfYmVnaW4sIGZpbmRfcG9zX2JlZ2luIC0gMSk7XHJcbiAgICAgICAgICAgIHNlYXJjaF9wb3NfYmVnaW4gPSBmaW5kX3Bvc19lbmQgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VhcmNoX3Bvc19iZWdpbiA8PSBzcGxpdF9zdHJpbmcubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHNwbGl0X3Jlc3VsdFtPYmplY3Qua2V5cyhzcGxpdF9yZXN1bHQpLmxlbmd0aCArIDFdID0gc3BsaXRfc3RyaW5nLnN1YnN0cihzZWFyY2hfcG9zX2JlZ2luKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNwbGl0X3Jlc3VsdFxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDku6Xmn5DkuKrov57mjqXnrKbkuLrmoIflh4bvvIzov5Tlm57kuIDkuKp0YWJsZeaJgOacieWtl+autei/nuaOpee7k+aenFxyXG4gICAgLy8gQHBhcmFtIGpvaW5fdGFibGUg6L+e5o6ldGFibGXvvJphcnJheVxyXG4gICAgLy8gQHBhcmFtIGpvaW5lciDov57mjqXnrKZcclxuICAgIC8vIEBwYXJhbSByZXR1cm4g55So6L+e5o6l56ym6L+e5o6l5ZCO55qE5a2X56ym5LiyXHJcbiAgICBKb2luOiBmdW5jdGlvbiAoam9pbl90YWJsZSwgam9pbmVyKSB7XHJcbiAgICAgICAgaWYgKGpvaW5lciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBqb2luX3RhYmxlLmpvaW4oXCJcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGpvaW5fdGFibGUuam9pbihqb2luZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/ljLrliIbmnI3liqHlmajlkI3np7BcclxuICAgIHRyYW5zZm9ybU5hbWVCeVNlcnY6IGZ1bmN0aW9uIChuYW1lLCBzcnZfaWQpIHtcclxuICAgICAgICB2YXIgdG1wTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgaWYgKHNydl9pZCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIHRtcE5hbWVcclxuICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICBpZiAodG1wTmFtZS5pbmRleE9mKFwi44CQXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdG1wTmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmlzVGhlU2FtZVN2cihzcnZfaWQpKSB7XHJcbiAgICAgICAgICAgIHZhciB2byA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICAgICAgaWYgKHZvKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGlzdE9yID0gdGhpcy5TcGxpdChzcnZfaWQsIFwiX1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBsaXN0TWUgPSB0aGlzLlNwbGl0KHZvLnNydl9pZCwgXCJfXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RPclsyXSAmJiBsaXN0TWVbMV0gJiYgbGlzdE9yWzFdICE9IGxpc3RNZVsxXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRtcE5hbWUgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCJb5byC5Z+fXSVzXCIpLCB0bXBOYW1lKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmtleXMobGlzdE9yKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG1wTmFtZSA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIltTJXNdJXNcIiksIGxpc3RPcltPYmplY3Qua2V5cyhsaXN0T3IpLmxlbmd0aF0sIHRtcE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNydl9pZCA9PSBcInJvYm90XzFcIilcclxuICAgICAgICAgICAgICAgICAgICB0bXBOYW1lID0gbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG1wTmFtZVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDphY3nva7moLzlvI/oo4XmjaJcclxuICAgIHNwbGl0RGF0YVN0cjogZnVuY3Rpb24gKGNvbnRlbnQpIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gY29udGVudDtcclxuICAgICAgICB3aGlsZSAocmVzdWx0LmluZGV4T2YoXCJ7XCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHZhciBpID0gcmVzdWx0LmluZGV4T2YoXCJ7XCIpO1xyXG4gICAgICAgICAgICB2YXIgbiA9IHJlc3VsdC5pbmRleE9mKFwifVwiKTtcclxuICAgICAgICAgICAgdmFyIHRlbXAgPSByZXN1bHQuc3Vic3RyaW5nKGksIG4gKyAxKTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRlbXAuc3Vic3RyaW5nKDEsIHRlbXAubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gdGhpcy5TcGxpdCh0YXJnZXQsIFwiOlwiKVxyXG4gICAgICAgICAgICB2YXIgc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiPGNvbG9yPSVzPiVzPC9jb2xvcj5cIiwgZ2RhdGEoXCJjb2xvcl9kYXRhXCIsIFwiZGF0YV9jb2xvcjNcIiwgcGFyc2VJbnQobGlzdFsxXSkpLCBsaXN0WzJdKVxyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSh0ZW1wLCBzdHIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbiAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgIGlmIChyb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9+bi9nLCByb2xlX3ZvLm5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8vZGVzYzrliJvlu7rkuIDkuKrmma7pgJrmlofmnKxcclxuICAgIGNyZWF0ZUxhYmVsOiBmdW5jdGlvbiAoZm9udF9zaXplLCB0ZXh0X2NvbG9yLCBsaW5lX2NvbG9yLCB4LCB5LCB0ZXh0X2NvbnRlbnQsIHBhcmVudF93bmQsIGxpbmVfbnVtLCBhbmNob3Jwb2ludCwgZm9udCkge1xyXG4gICAgICAgIGZvbnRfc2l6ZSA9IGZvbnRfc2l6ZSB8fCAyMDtcclxuICAgICAgICB2YXIgbm9kZSA9IG5ldyBjYy5Ob2RlKCk7XHJcbiAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludChhbmNob3Jwb2ludCB8fCBjYy52MigwLCAwKSk7XHJcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5hZGRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgIGxhYmVsLmZvbnRTaXplID0gZm9udF9zaXplO1xyXG4gICAgICAgIGxhYmVsLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuQ0VOVEVSO1xyXG4gICAgICAgIGxhYmVsLnZlcnRpY2FsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkNFTlRFUjtcclxuICAgICAgICBpZiAodGV4dF9jb2xvciA9PSBudWxsKSB0ZXh0X2NvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpO1xyXG4gICAgICAgIG5vZGUuY29sb3IgPSB0ZXh0X2NvbG9yO1xyXG4gICAgICAgIGlmIChsaW5lX2NvbG9yKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gbm9kZS5hZGRDb21wb25lbnQoY2MuTGFiZWxPdXRsaW5lKTtcclxuICAgICAgICAgICAgbGluZS5jb2xvciA9IGxpbmVfY29sb3I7XHJcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX251bSB8fCAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB4ID0geCB8fCAwO1xyXG4gICAgICAgIHkgPSB5IHx8IDA7XHJcbiAgICAgICAgbm9kZS5zZXRQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICBpZiAodGV4dF9jb250ZW50ICE9IG51bGwpXHJcbiAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IHRleHRfY29udGVudDtcclxuICAgICAgICBpZiAocGFyZW50X3duZClcclxuICAgICAgICAgICAgcGFyZW50X3duZC5hZGRDaGlsZChub2RlKTtcclxuICAgICAgICByZXR1cm4gbGFiZWxcclxuICAgIH0sXHJcblxyXG4gICAgLy9kZXNjOuWIm+W7uuWvjOaWh+acrFxyXG4gICAgY3JlYXRlUmljaExhYmVsOiBmdW5jdGlvbiAoZm9udHNpemUsIHRleHRjb2xvciwgYXAsIHBvcywgbGluZUhlaWdodCwgbWF4X3dpZHRoLCBwYXJlbnRfd25kLCBhbGlnbikge1xyXG4gICAgICAgIHZhciBub2RlID0gbmV3IGNjLk5vZGUoKTtcclxuICAgICAgICBub2RlLnNldEFuY2hvclBvaW50KGFwIHx8IGNjLnYyKDAsIDApKTtcclxuICAgICAgICBub2RlLnNldFBvc2l0aW9uKHBvcyB8fCBjYy52MigwLCAwKSk7XHJcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5hZGRDb21wb25lbnQoY2MuUmljaFRleHQpO1xyXG4gICAgICAgIGlmICh0ZXh0Y29sb3IgPT0gbnVsbCkgdGV4dGNvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpO1xyXG4gICAgICAgIGxhYmVsLmZvbnRTaXplID0gZm9udHNpemU7XHJcbiAgICAgICAgbGFiZWwuaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5DRU5URVI7XHJcbiAgICAgICAgbGFiZWwudmVydGljYWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuQ0VOVEVSO1xyXG4gICAgICAgIGlmIChhbGlnbiA9PSBcImxlZnRcIikge1xyXG4gICAgICAgICAgICBsYWJlbC5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PSBcInJpZ2h0XCIpIHtcclxuICAgICAgICAgICAgbGFiZWwuaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5SSUdIVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGFiZWwubGluZUhlaWdodCA9IGxpbmVIZWlnaHQgfHwgKGZvbnRzaXplICsgNCk7XHJcbiAgICAgICAgbm9kZS5jb2xvciA9IHRleHRjb2xvcjtcclxuICAgICAgICBsYWJlbC5tYXhXaWR0aCA9IG1heF93aWR0aCB8fCAzMDA7XHJcbiAgICAgICAgaWYgKHBhcmVudF93bmQpXHJcbiAgICAgICAgICAgIHBhcmVudF93bmQuYWRkQ2hpbGQobm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsXHJcbiAgICB9LFxyXG5cclxuICAgIC8vZGVzYzrliJvlu7ppbWFnZVxyXG4gICAgY3JlYXRlSW1hZ2U6IGZ1bmN0aW9uIChwYXJlbnQsIHJlcywgeCwgeSwgYW5jaG9yUG9pbnQsIHVzZVBsaXN0LCB6b3JkZXIsIGlzX1NjYWxlOSkge1xyXG4gICAgICAgIHZhciBub2RlID0gbmV3IGNjLk5vZGUoKTtcclxuICAgICAgICB2YXIgaW1hZ2UgPSBub2RlLmFkZENvbXBvbmVudChjYy5TcHJpdGUpO1xyXG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhyZXMsIChmdW5jdGlvbiAoaW1hZ2UsIHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGltYWdlLnNwcml0ZUZyYW1lID0gcmVzX29iamVjdFxyXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMsIGltYWdlKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFuY2hvclBvaW50ID09IG51bGwpIHtcclxuICAgICAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludChjYy52MigwLjUsIDAuNSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0QW5jaG9yUG9pbnQoYW5jaG9yUG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNfU2NhbGU5ID09IHRydWUpIHtcclxuICAgICAgICAgICAgaW1hZ2UudHlwZSA9IGNjLlNwcml0ZS5UeXBlLlNMSUNFRDtcclxuICAgICAgICAgICAgaW1hZ2Uuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoeCAhPSBudWxsICYmIHkgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBub2RlLnNldFBvc2l0aW9uKGNjLnYyKHgsIHkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQobm9kZSwgem9yZGVyIHx8IDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW1hZ2VcclxuICAgIH0sXHJcblxyXG4gICAgY3JlYXRlRWZmZWN0U3BpbmU6IGZ1bmN0aW9uIChlZmZlY3ROYW1lLCBwb3MsIGFyUG9zLCBsb29wLCBhY3Rpb24sIGNhbGxfYmFjaywgcGl4ZWxmb3JtYWwsIG5vdF9wbGF5X2FjdGlvbikge1xyXG4gICAgICAgIGxldCBub2RlID0gbmV3IGNjLk5vZGUoKTtcclxuICAgICAgICBub2RlLnNldFBvc2l0aW9uKHBvcyk7XHJcbiAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludChhclBvcyk7XHJcbiAgICAgICAgbGV0IGVmZmVjdCA9IG5vZGUuYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKTtcclxuICAgICAgICBlZmZlY3ROYW1lID0gZWZmZWN0TmFtZSB8fCBcIkU4ODg4OFwiO1xyXG4gICAgICAgIGlmIChsb29wID09IG51bGwpIHtcclxuICAgICAgICAgICAgbG9vcCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBQbGF5ZXJBY3Rpb24uYWN0aW9uO1xyXG5cclxuICAgICAgICB2YXIgcmVzID0gY2MuanMuZm9ybWF0U3RyKFwic3BpbmUvJXMvYWN0aW9uLmF0bGFzXCIsIGVmZmVjdE5hbWUpXHJcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xyXG4gICAgICAgICAgICBlZmZlY3Quc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcclxuICAgICAgICAgICAgaWYgKG5vdF9wbGF5X2FjdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlZmZlY3Quc2V0QW5pbWF0aW9uKDAsIGFjdGlvbiwgbG9vcClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRBbmltYXRpb24oMSwgYWN0aW9uLCBsb29wKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjYWxsX2JhY2spIHtcclxuICAgICAgICAgICAgICAgIGNhbGxfYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgIHJldHVybiBlZmZlY3RcclxuICAgIH0sXHJcblxyXG4gICAgLy8gIOe7meiKgueCuea3u+WKoOe6oueCuVxyXG4gICAgLy8gW1tcclxuICAgIC8vICAgICBub2RlOue6oueCueeItuiKgueCuVxyXG4gICAgLy8gICAgIHN0YXR1czrmmK/lkKbmmL7npLpcclxuICAgIC8vICAgICBvZmZzZXRfeDrnuqLngrl46L205YGP56e7XHJcbiAgICAvLyAgICAgb2Zmc2V0X3k657qi54K5eei9tOWBj+enu1xyXG4gICAgLy8gICAgIHpvcmRlcjrnuqLngrnlsYLnuqdcclxuICAgIC8vIF1dXHJcbiAgICBhZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzOiBmdW5jdGlvbiAobm9kZSwgc3RhdHVzLCBvZmZzZXRfeCwgb2Zmc2V0X3ksIHpvcmRlciwgcmVkX3R5cGUpIHtcclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZS5yZWRfcG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRfeCA9IG9mZnNldF94IHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3kgPSBvZmZzZXRfeSB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHpvcmRlciA9IHpvcmRlciB8fCAxMDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVkX3JlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJtYWludWlcIiwgXCJtYWludWlfMTAwOVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVkX3R5cGUgJiYgcmVkX3R5cGUgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWRfcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAxNFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBub2RlX3NpemUgPSBub2RlLmdldENvbnRlbnRTaXplKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc194ID0gbm9kZV9zaXplLndpZHRoIC8gMiArIG9mZnNldF94XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc195ID0gbm9kZV9zaXplLmhlaWdodCAvIDIgKyBvZmZzZXRfeVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWRfcG9pbnQgPSB0aGlzLmNyZWF0ZUltYWdlKG5vZGUsIG51bGwsIHBvc194LCBwb3NfeSwgY2MudjIoMSwgMSksIG51bGwsIHpvcmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yqg6L296LWE5rqQXHJcbiAgICAgICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocmVkX3JlcywgKGZ1bmN0aW9uIChyZWRfcG9pbnQsIHJlc19vYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX3BvaW50LnNwcml0ZUZyYW1lID0gcmVzX29iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcywgcmVkX3BvaW50KSlcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnJlZF9wb2ludCA9IHJlZF9wb2ludFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWRfcG9pbnQubm9kZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUucmVkX3BvaW50KSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLnJlZF9wb2ludC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPluaVsOe7hOaIluWvueixoeWFt+acieecn+WunuWtkOexu+eahOmVv+W6plxyXG4gICAgZ2V0QXJyVHJ1ZUxlbjogZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBvYmpbaV07XHJcbiAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbmRleFxyXG4gICAgfSxcclxuXHJcbiAgICAvL+iOt+WPluaVsOe7hOaIluWvueixoeeahOmVv+W6plxyXG4gICAgZ2V0QXJyTGVuOiBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmoubGVuZ3RoXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDlu7bov5/liqjkvZxcclxuICAgIGRlbGF5UnVuOiBmdW5jdGlvbiAob2JqLCBkZWxheV90aW1lLCBmdW4pIHtcclxuICAgICAgICBpZiAoIWZ1bikgcmV0dXJuO1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmdW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRlbGF5X2Z1biA9IGNjLmRlbGF5VGltZShkZWxheV90aW1lKTtcclxuICAgICAgICB2YXIgY2FsbF9mdW4gPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZnVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBvYmoucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGRlbGF5X2Z1biwgY2FsbF9mdW4pKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5/kuIDlpITnkIbngrnlh7vkuovku7Ys5Li65LqG5ZCO6Z2i57uf5LiA6Z+z5pWI5YGa5aSE55CGXHJcbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCDoioLngrnlr7nosaFcclxuICAgICAqIEBwYXJhbSB7Kn0gY2xpY2tiYWNrIOeCueWHu+Wbnuiwg1xyXG4gICAgICogQHBhcmFtIHsqfSBzb3VuZFR5cGUg5aOw6Z+z57G75Z6LIDE65pmu6YCa6Z+z5pWIIDI65YWz6Zet6Z+z5pWIIDMuLi4uXHJcbiAgICAgKi9cclxuICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIChvYmplY3QsIGNsaWNrYmFjaywgc291bmRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKGNsaWNrYmFjaykge1xyXG4gICAgICAgICAgICAgICAgY2xpY2tiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmplY3Qub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKHNvdW5kVHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChjbGlja2JhY2spIHtcclxuICAgICAgICAgICAgICAgIGNsaWNrYmFjaygpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYjmjqXlj6NcclxuICAgICAqIEBwYXJhbSB7Kn0gdHlwZSAxOuaZrumAmuaMiemSrumfs+aViCAyOuWFs+mXreaMiemSrumfs+aViCAzOuagh+etvumhtemfs+aViCA0Li7oh6rlrprkuYnpn7PmlYhpZFxyXG4gICAgICovXHJcbiAgICBwbGF5QnV0dG9uU291bmQ6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgaWYgKCF0eXBlKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHJlc19pZCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHR5cGUgPT0gQnV0dG9uU291bmQuTm9ybWFsKSB7XHJcbiAgICAgICAgICAgIHJlc19pZCA9IFwiY19idXR0b24xXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEJ1dHRvblNvdW5kLkNsb3NlKSB7XHJcbiAgICAgICAgICAgIHJlc19pZCA9IFwiY19jbG9zZVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCdXR0b25Tb3VuZC5UYWIpIHtcclxuICAgICAgICAgICAgcmVzX2lkID0gXCJjXzAwMlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc19pZCA9IHR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFNvdW5kTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlFZmZlY3QoQVVESU9fVFlQRS5DT01NT04sIHJlc19pZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIHBsYXlFZmZlY3RTb3VuZDogZnVuY3Rpb24gKHR5cGUsIHJlc19pZCkge1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlFZmZlY3RPbmNlKHR5cGUsIHJlc19pZCk7XHJcbiAgICB9LFxyXG5cclxuICAgIHBsYXlNdXNpYzogZnVuY3Rpb24gKHR5cGUsIHJlc19pZCwgbG9vcCkge1xyXG4gICAgICAgIFNvdW5kTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlNdXNpYyh0eXBlLCByZXNfaWQsIGxvb3ApO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy/ojrflj5bpmo/mnLrlkI3lrZdcclxuICAgIGdldFJhbmRvbVNhdmVOYW1lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHJhbmRvbU5hbWUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBzdHI7XHJcbiAgICAgICAgICAgIHZhciBhID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLnJhbmRvbSg2NSwgOTApKTtcclxuICAgICAgICAgICAgdmFyIGIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKE1hdGgucmFuZG9tKDk3LCAxMjIpKTtcclxuICAgICAgICAgICAgdmFyIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKE1hdGgucmFuZG9tKDQ4LCA1NykpO1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oMykgJSAzID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5yYW5kb20oMykgJSAyID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBjO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEJ5dGVMZW4ocmVzdWx0KSA8IDEyKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByYW5kb21OYW1lKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgIHZhciB1c3IgPSByYW5kb21OYW1lKFwiXCIpO1xyXG4gICAgICAgIHJldHVybiBcInN5XCIgKyB1c3JcclxuICAgIH0sXHJcblxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxyXG4gICAgLS1kZXNjOuiOt+WPluacjeWKoeWZqOe0ouW8lVxyXG4gICAgLS10aW1lOjIwMTgtMDctMjIgMTA6NTQ6MzBcclxuICAgIC0tQHN0cjpcclxuICAgIC0tQHJldHVybiBbaW5kZXgsIGlzX3Zhcl1cclxuICAgIC0taW5kZXggPT0gMCDooajnpLog5py65ZmoIOaIluiAhSDlvILln58o5bCx5piv5peg5rOV55+l6YGT5piv6YKj5Liq5pyN55qEKVxyXG4gICAgLS1pc192YXIgOiDooajnpLrmmK/lkKbmnKzmnI1cclxuICAgIC0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0qL1xyXG4gICAgZ2V0U2VydmVySW5kZXg6IGZ1bmN0aW9uIChzcnZfaWQpIHtcclxuICAgICAgICBpZiAoc3J2X2lkID09IG51bGwpIHJldHVybiBbXCJcIl1cclxuICAgICAgICBpZiAoc3J2X2lkID09IFwicm9ib3RfMVwiIHx8IHNydl9pZCA9PSBcInJvYm90XCIpIHsgICAvL+S7o+ihqOacuuWZqOS6ulxyXG4gICAgICAgICAgICByZXR1cm4gWzBdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbiAgICAgICAgbGV0IHZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICBpZiAodm8pIHtcclxuICAgICAgICAgICAgbGV0IGxpc3RPciA9IHNydl9pZC5zcGxpdChcIl9cIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0TWUgPSB2by5zcnZfaWQuc3BsaXQoXCJfXCIpO1xyXG4gICAgICAgICAgICBpZiAobGlzdE9yWzFdICYmIGxpc3RNZVswXSAmJiBsaXN0T3JbMF0gIT0gbGlzdE1lWzBdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gWzBdXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdE9yLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzcnZfaWQgPT0gdm8uc3J2X2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtsaXN0T3JbbGlzdE9yLmxlbmd0aF0sIHRydWVdXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbGlzdE9yW2xpc3RPci5sZW5ndGhdXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbMF1cclxuICAgIH0sXHJcblxyXG4gICAgLy8g6YCa55So5pi+56S65Y2V6KGM6YGT5YW35YiX6KGoXHJcbiAgICAvLyBAIGl0ZW1fc2Nyb2xsdmlldyBzY3JvbGx2aWV3IOWvueixoVxyXG4gICAgLy8gQCBpdGVtX2xpc3QgQmFja1BhY2tJdGVt55qE5a+56LGh5YiX6KGoICjms6jmhI86IOmcgOimgeWcqOmCo+i+ueaJi+WKqOenu+mZpClcclxuICAgIC8vIEAgZGF0YV9saXN0IOaVsOaNruWIl+ihqCDnu5PmnoR7e+mBk+WFt2lkLCDmlbDph499LC4uLn0g5bCx5piv562W5YiS5aGr6KGo55qE5aWW5Yqx6YGT5YW357uT5p6EXHJcbiAgICAvLyBAc2V0dGluZyBcclxuICAgIC8vIEBjb250ZW50XHJcbiAgICAvLyBAaXNBY3Rpb25DYWxsQmFjayDmmK/lkKbosIPnlKhBY3Rpb25DYWxsQmFja1xyXG4gICAgLy8gQHNldHRpbmcuc2NhbGUg57yp5bCP5Y+C5pWwIOm7mOiupCAxIFxyXG4gICAgLy8gQHNldHRpbmcuc3RhcnRfeCDkuKTovrnlr7nlupTpgZPlhbfnmoTpl7TpmpRcclxuICAgIC8vIEBzZXR0aW5nLnNwYWNlX3gg6YGT5YW35LmL6Ze055qE6Ze06ZqUXHJcbiAgICAvLyBAc2V0dGluZy5tYXhfY291bnQgaXRlbV9zY3JvbGx2aWV35pyA5aSn6IO95pi+56S6aXRlbeaVsOmHjy4u55So5LqO5Yik5pat5piv5ZCm5Y+v5Lul5bem5Y+z5ruR5YqoICDkuI3loavliJnlj6/ku6Xnp7vliqhcclxuICAgIC8vIEBzZXR0aW5nLmlzX2NlbnRlciDmmK/lkKbkuI3mu6HlsLHlsYXkuK0gbWF4X2NvdW505b+F6aG75pyJ5YC8XHJcbiAgICAvLyBAc2V0dGluZy5zaG93X2VmZmVjdF9pZCA954m55pWIaWQg5pi+56S65a+55bqU54m55pWIIOm7mOiupOaXoFxyXG4gICAgLy8gQHNldHRpbmcuaXNfdGlwIOaYr+WQpuW8uemAmueUqHRpcHMg6buY6K6kbmlsXHJcbiAgICBjb21tb25TaG93U2luZ2xlUm93SXRlbUxpc3Q6IGZ1bmN0aW9uIChpdGVtX3Njcm9sbHZpZXcsIGl0ZW1fbGlzdCwgZGF0YV9saXN0LCBzZXR0aW5nLCBjb250ZW50LCBpc0FjdGlvbkNhbGxCYWNrKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtX3Njcm9sbHZpZXcgfHwgIWRhdGFfbGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpdGVtX2xpc3QgPSBpdGVtX2xpc3Q7XHJcbiAgICAgICAgaWYgKGl0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICAvLyDpmpDol4/nianlk4FcclxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBpdGVtX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1fbGlzdFtpXS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbV9saXN0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgaXRlbV9saXN0ID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YV9saXN0Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8g6YGT5YW35YiX6KGoXHJcbiAgICAgICAgdmFyIHNldHRpbmcgPSBzZXR0aW5nIHx8IHt9O1xyXG4gICAgICAgIHZhciBzY2FsZSA9IHNldHRpbmcuc2NhbGUgfHwgMTtcclxuICAgICAgICB2YXIgc3RhcnRfeCA9IHNldHRpbmcuc3RhcnRfeCB8fCA1O1xyXG4gICAgICAgIHZhciBzcGFjZV94ID0gc2V0dGluZy5zcGFjZV94IHx8IDU7XHJcbiAgICAgICAgdmFyIG1heF9jb3VudCA9IHNldHRpbmcubWF4X2NvdW50O1xyXG4gICAgICAgIHZhciBpdGVtX3dpZHRoID0gc2V0dGluZy5pdGVtX3dpZHRoIHx8IDEyMDtcclxuICAgICAgICB2YXIgbG9jayA9IHNldHRpbmcubG9jayB8fCBmYWxzZTtcclxuICAgICAgICAvLyDngrnlh7vov5Tlm57lm57osIPlh73mlbBcclxuICAgICAgICB2YXIgaXNfdGlwID0gc2V0dGluZy5pc190aXA7XHJcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gc2V0dGluZy5jYWxsYmFjayB8fCBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIGl0ZW1fY291bnQgPSBkYXRhX2xpc3QubGVuZ3RoO1xyXG4gICAgICAgIGl0ZW1fd2lkdGggPSBpdGVtX3dpZHRoICogc2NhbGU7XHJcblxyXG4gICAgICAgIHZhciB0b3RhbF93aWR0aCA9IHN0YXJ0X3ggKiAyICsgaXRlbV93aWR0aCAqIGl0ZW1fY291bnQgKyBzcGFjZV94ICogKGl0ZW1fY291bnQgLSAxKTtcclxuICAgICAgICB2YXIgaXRlbV9zY3JvbGx2aWV3X3NpemUgPSBjb250ZW50LmdldENvbnRlbnRTaXplKCk7XHJcbiAgICAgICAgdmFyIG1heF93aWR0aCA9IE1hdGgubWF4KGl0ZW1fc2Nyb2xsdmlld19zaXplLndpZHRoLCB0b3RhbF93aWR0aCk7XHJcbiAgICAgICAgY29udGVudC5zZXRDb250ZW50U2l6ZShjYy5zaXplKG1heF93aWR0aCwgaXRlbV9zY3JvbGx2aWV3X3NpemUuaGVpZ2h0KSk7XHJcbiAgICAgICAgaWYgKG1heF9jb3VudCAmJiBpdGVtX2NvdW50IDw9IG1heF9jb3VudCkge1xyXG4gICAgICAgICAgICBpdGVtX3Njcm9sbHZpZXcub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCBpdGVtX3Njcm9sbHZpZXcuX29uVG91Y2hCZWdhbiwgaXRlbV9zY3JvbGx2aWV3LCB0cnVlKTtcclxuICAgICAgICAgICAgaXRlbV9zY3JvbGx2aWV3Lm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCBpdGVtX3Njcm9sbHZpZXcuX29uVG91Y2hNb3ZlZCwgaXRlbV9zY3JvbGx2aWV3LCB0cnVlKTtcclxuICAgICAgICAgICAgaXRlbV9zY3JvbGx2aWV3Lm9mZihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGl0ZW1fc2Nyb2xsdmlldy5fb25Ub3VjaEVuZGVkLCBpdGVtX3Njcm9sbHZpZXcsIHRydWUpO1xyXG4gICAgICAgICAgICBpdGVtX3Njcm9sbHZpZXcub2ZmKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0NBTkNFTCwgaXRlbV9zY3JvbGx2aWV3Ll9vblRvdWNoQ2FuY2VsbGVkLCBpdGVtX3Njcm9sbHZpZXcsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5pc19jZW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0X3ggPSAoaXRlbV9zY3JvbGx2aWV3X3NpemUud2lkdGggLSB0b3RhbF93aWR0aCkgKiAwLjU7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRfeCA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydF94ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZW1fc2Nyb2xsdmlldy5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9TVEFSVCwgaXRlbV9zY3JvbGx2aWV3Ll9vblRvdWNoQmVnYW4sIGl0ZW1fc2Nyb2xsdmlldywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIGl0ZW1fc2Nyb2xsdmlldy5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCBpdGVtX3Njcm9sbHZpZXcuX29uVG91Y2hNb3ZlZCwgaXRlbV9zY3JvbGx2aWV3LCB0cnVlKTtcclxuICAgICAgICAgICAgLy8gaXRlbV9zY3JvbGx2aWV3Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgaXRlbV9zY3JvbGx2aWV3Ll9vblRvdWNoRW5kZWQsIGl0ZW1fc2Nyb2xsdmlldywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIGl0ZW1fc2Nyb2xsdmlldy5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9DQU5DRUwsIGl0ZW1fc2Nyb2xsdmlldy5fb25Ub3VjaENhbmNlbGxlZCwgaXRlbV9zY3JvbGx2aWV3LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29udGVudC5zdG9wQWxsQWN0aW9ucygpO1xyXG5cclxuICAgICAgICB2YXIgX3NldEl0ZW1EYXRhID0gZnVuY3Rpb24gKGl0ZW0sIHYsIGksIGlzX3RpcCkge1xyXG4gICAgICAgICAgICBpdGVtLnNldFZpc2libGUodHJ1ZSk7XHJcbiAgICAgICAgICAgIHZhciBfeCA9IHN0YXJ0X3ggKyBpdGVtX3dpZHRoIC8gMiArIGkgKiAoaXRlbV93aWR0aCArIHNwYWNlX3gpO1xyXG5cclxuICAgICAgICAgICAgaXRlbS5zZXRQb3NpdGlvbihfeCwgaXRlbV9zY3JvbGx2aWV3X3NpemUuaGVpZ2h0ICogMC41KTtcclxuICAgICAgICAgICAgaXRlbS5zZXREYXRhKHsgYmlkOiB2WzBdLCBudW06IHZbMV0gfSk7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd09yZGVyV2FyTG9jayhsb2NrKTtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNBY3Rpb25DYWxsQmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkQWN0aW9uQ2FsbEJhY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkQ2FsbEJhY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZbMl0pIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0RXh0ZW5kTGFiZWwodlsyXSwgbnVsbCwgMjQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW0uc2V0RGVmYXVsdFRpcChpc190aXApO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5zaG93X2VmZmVjdF9pZCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zaG93SXRlbUVmZmVjdCh0cnVlLCBzZXR0aW5nLnNob3dfZWZmZWN0X2lkLCBQbGF5ZXJBY3Rpb24uYWN0aW9uXzEsIHRydWUsIDEuMSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvd0l0ZW1FZmZlY3QoZmFsc2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHZhciBpdGVtID0gbnVsbDtcclxuICAgICAgICB2YXIgc2l6ZSA9IGl0ZW1fbGlzdC5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhX2xpc3QpIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW1fbGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIF9zZXRJdGVtRGF0YShpdGVtLCBkYXRhX2xpc3RbaV0sIGksIGlzX3RpcCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGVhbGV5ID0gaSAtIHNpemU7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVhbGV5IDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWFsZXkgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgVXRpbHMuZGVsYXlSdW4oY29udGVudCwgZGVhbGV5IC8gNjAsIGZ1bmN0aW9uIChpLCB2LCBpdGVtLCBpc190aXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1fbGlzdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gSXRlbXNQb29sLmdldEluc3RhbmNlKCkuZ2V0SXRlbShcImJhY2twYWNrX2l0ZW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uaW5pdENvbmZpZyh0cnVlLCBzY2FsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0uc2V0QW5jaG9yUG9pbnQoMCwgMC41KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFBhcmVudChjb250ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fbGlzdFtpXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zZXRJdGVtRGF0YShpdGVtLCB2LCBpLCBpc190aXApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGksIGRhdGFfbGlzdFtpXSwgaXRlbSwgaXNfdGlwKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1fbGlzdDtcclxuICAgIH0sXHJcblxyXG5cclxuXHJcbiAgICAvKi0t6YCa55So5pi+56S656m655m9XHJcbiAgICAtLUBwYXJlbnQg54i257G7XHJcbiAgICAtLUBib29sIOaYvuekuueKtuaAgSB0cnVlIOaYvuekuiAsIGZhbHNlIOS4jeaYvuekulxyXG4gICAgLS1Ac2V0dGluZyDphY3nva7kv6Hmga9cclxuICAgIC0tc2V0dGluZy50ZXh0ICDmlofmnKzlhoXlrrkg6buY6K6kOiDmmoLml6DmlbDmja5cclxuICAgIC0tc2V0dGluZy5wb3MgIGljb27mmL7npLrkvY3nva4gIOm7mOiupCDniLbnsbvnmoTkuK3lv4PngrlcclxuICAgIC0tc2V0dGluZy5zY2FsZSAgaWNvbue8qeaUvuWkp+WwjyAg6buY6K6kIDFcclxuICAgIC0tc2V0dGluZy5vZmZzZXRfeSDlm6Dlm77moIfnvKnmlL7lr7zoh7TmlofmnKznmoTkvY3nva7pnIDopoHosIPmlbQg5YGP56e76YeP6LCD5pW0IOm7mOiupOaYryAtMTBcclxuICAgIC0tc2V0dGluZy5mb250X3NpemUg5paH5pys5aSn5bCPIOm7mOiupCAyNlxyXG4gICAgLS1zZXR0aW5nLmxhYmVsX2NvbG9yIOaWh+acrOminOiJsiDpu5jorqQgQ29uZmlnLkNvbG9yRGF0YS5kYXRhX2NvbG9yMTZbMTc1XSovXHJcbiAgICBjb21tb25TaG93RW1wdHlJY29uOiBmdW5jdGlvbiAocGFyZW50LCBib29sLCBzZXR0aW5nKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybjtcclxuICAgICAgICBpZiAoYm9vbCkge1xyXG4gICAgICAgICAgICB2YXIgc2V0dGluZyA9IHNldHRpbmcgfHwge31cclxuICAgICAgICAgICAgdmFyIHRleHQgPSBzZXR0aW5nLnRleHQgfHwgVXRpbHMuVEkxOE4oXCLmmoLml6DmlbDmja5cIik7XHJcbiAgICAgICAgICAgIGlmICghcGFyZW50LmVtcHR5X2Nvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudF9zaXplID0gcGFyZW50LmdldENvbnRlbnRTaXplKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9zID0gc2V0dGluZy5wb3MgfHwgY2MudjIocGFyZW50X3NpemUud2lkdGggKiAwLjUsIHBhcmVudF9zaXplLndpZHRoICogMC41LCBwYXJlbnRfc2l6ZS5oZWlnaHQgKiAwLjUgKyAxMCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBzZXR0aW5nLnNjYWxlIHx8IDE7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X3kgPSBzZXR0aW5nLm9mZnNldF95IHx8IC0xMTA7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFiZWxfY29sb3IgPSBzZXR0aW5nLmxhYmVsX2NvbG9yIHx8IG5ldyBjYy5Db2xvcigpLmZyb21IRVgoQ29uZmlnLmNvbG9yX2RhdGEuZGF0YV9jb2xvcjE2WzE3NV0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvbnRfc2l6ZSA9IHNldHRpbmcuZm9udF9zaXplIHx8IDI2O1xyXG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSBjYy5zaXplKDIwMCwgMjAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuZW1wdHlfY29uID0gbmV3IGNjLk5vZGUoKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5lbXB0eV9jb24uc2V0Q29udGVudFNpemUoY2Muc2l6ZSgxMjAsIDEyMCkpXHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuZW1wdHlfY29uLnNldEFuY2hvclBvaW50KDAuNSwgMC41KTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5lbXB0eV9jb24uc2V0UG9zaXRpb24ocG9zLngsIHBvcy55KTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChwYXJlbnQuZW1wdHlfY29uLCAxMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGJnID0gVXRpbHMuY3JlYXRlSW1hZ2UocGFyZW50LmVtcHR5X2NvbiwgUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImJpZ2JnXCIsIFwiYmlnYmdfM1wiKSwgMCwgMCwgY2MudjIoMC41LCAwLjUpLCBmYWxzZSlcclxuICAgICAgICAgICAgICAgIGJnLm5vZGUuc2NhbGUgPSBzY2FsZTtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5lbXB0eV9sYWJlbCA9IFV0aWxzLmNyZWF0ZUxhYmVsKGZvbnRfc2l6ZSwgbGFiZWxfY29sb3IsIG51bGwsIDAsIG9mZnNldF95LCAnJywgcGFyZW50LmVtcHR5X2NvbiwgMCwgY2MudjIoMC41LCAwLjUpKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuZW1wdHlfY29uLmFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50LmVtcHR5X2xhYmVsLnN0cmluZyA9IHRleHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudC5lbXB0eV9jb24pIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudC5lbXB0eV9jb24uYWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgZ2V0VHlwZTogZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgIHZhciBzdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcclxuICAgICAgICB2YXIgbWFwID0ge1xyXG4gICAgICAgICAgICAnW29iamVjdCBCb29sZWFuXSc6ICdib29sZWFuJyxcclxuICAgICAgICAgICAgJ1tvYmplY3QgTnVtYmVyXSc6ICdudW1iZXInLFxyXG4gICAgICAgICAgICAnW29iamVjdCBTdHJpbmddJzogJ3N0cmluZycsXHJcbiAgICAgICAgICAgICdbb2JqZWN0IEZ1bmN0aW9uXSc6ICdmdW5jdGlvbicsXHJcbiAgICAgICAgICAgICdbb2JqZWN0IEFycmF5XSc6ICdhcnJheScsXHJcbiAgICAgICAgICAgICdbb2JqZWN0IERhdGVdJzogJ2RhdGUnLFxyXG4gICAgICAgICAgICAnW29iamVjdCBSZWdFeHBdJzogJ3JlZ0V4cCcsXHJcbiAgICAgICAgICAgICdbb2JqZWN0IFVuZGVmaW5lZF0nOiAndW5kZWZpbmVkJyxcclxuICAgICAgICAgICAgJ1tvYmplY3QgTnVsbF0nOiAnbnVsbCcsXHJcbiAgICAgICAgICAgICdbb2JqZWN0IE9iamVjdF0nOiAnb2JqZWN0J1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZihvYmogaW5zdGFuY2VvZiBFbGVtZW50KXsgLy/liKTmlq3mmK/lkKbmmK9kb23lhYPntKDvvIzlpoJkaXbnrYlcclxuICAgICAgICAvLyAgICAgcmV0dXJuIFwiZWxlbWVudFwiO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICByZXR1cm4gbWFwW3N0cl07XHJcbiAgICB9LFxyXG4gICAgZGVlcENvcHkxOiBmdW5jdGlvbiAocCkge1xyXG4gICAgICAgIHZhciBvYmo7XHJcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuZ2V0VHlwZShwKTtcclxuICAgICAgICBpZiAoc3RyID09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgb2JqID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb2JqLnB1c2godGhpcy5kZWVwQ29weTEocFtpXSkpOyAgLy/lm57osIPoh6rlt7FcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIG9iaiA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHApIHtcclxuICAgICAgICAgICAgICAgIG9ialtpXSA9IHRoaXMuZGVlcENvcHkxKHBbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6YCa55So6K6+572u5YCS6K6h5pe2IOaXtumXtOagvOW8j+m7mOiupCAgIFRpbWVUb29sLkdldFRpbWVGb3JGdW5jdGlvbiDmraTmlrnms5Xov5Tlm57moLzlvI8o6ZyA6KaB5YW25LuW55qEIOWcqGNhbGxiYWNrIOiHquihjOWkhOeQhilcclxuICAgIC8v5rOo5oSPOiDlhbPpl61wYW5lbOeahOaXtuWAmeiusOW+lyBkb1N0b3BBbGxBY3Rpb25zKGxhYmVsKSDlkKbliJnkvJrmiqXplJlcclxuICAgIC8vQGxhYmVsIOWAkuiuoeaXtuWvueixoSBsYWJlbCBcclxuICAgIC8vQGxlc3NfdGltZSDliankvZnml7bpl7QgXHJcbiAgICAvL0BzZXR0aW5nIOmFjee9ruS/oeaBr1xyXG4gICAgLy9zZXR0aW5nLmxhYmVsX3R5cGUgIOaWh+acrOexu+Weiyjlj4LogIMgQ29tbW9uQWxlcnQudHlwZS5yaWNoKSAuLuazqOaEjzrpnIDopoHlop7liqDmoIfpopgg5ZKMIOaXtumXtOminOiJsiDmiY3orr7nva7ov5nkuKoo5ZCm5YiZ5rKh5oSP5LmJKVxyXG4gICAgLy9zZXRpdG5nLnRpbWVfdGl0bGUgIOaXtumXtOagh+mimCAgZWc6IOWJqeS9meaXtumXtDpcclxuICAgIC8vc2V0aXRuZy50aW1lX2NvbG9yICDml7bpl7TpopzoibIg5qC85byPOiAjZmZmZmZmIOWvjOaWh+acrOS4iyDpnIDopoHlj5jnmoTpopzoibIuLijlnKhpc19yaWNoX2xhYmVsID09IHRydWXkuIsg5b+F5aGrKVxyXG4gICAgLy9zZXR0aW5nLmNhbGxiYWNrIOWbnuiwg+WHveaVsCAg5aaC5p6cX3NldFRpbWVGb3JtYXRTdHJpbmcg5LiN6IO95ruh6Laz6ZyA5rGCIOiHquW3seeUqOWbnuiwg+WHveaVsOWkhOeQhlxyXG4gICAgY29tbW9uQ291bnREb3duVGltZTogZnVuY3Rpb24gKGxhYmVsLCBsZXNzX3RpbWUsIHNldHRpbmcpIHtcclxuICAgICAgICBpZiAoIWxhYmVsKSByZXR1cm5cclxuICAgICAgICB2YXIgc2V0dGluZyA9IHNldHRpbmcgfHwge307XHJcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gc2V0dGluZy5jYWxsYmFjazsgICAgLy/lm57osIPlh73mlbBcclxuICAgICAgICB2YXIgbGFiZWxfdHlwZSA9IHNldHRpbmcubGFiZWxfdHlwZTsvL+aWh+acrOexu+Wei1xyXG4gICAgICAgIHZhciB0aW1lX3RpdGxlID0gbnVsbDtcclxuICAgICAgICB2YXIgdGltZV9jb2xvciA9IG51bGw7XHJcbiAgICAgICAgdmFyIFRpbWVUb29sID0gcmVxdWlyZShcInRpbWV0b29sXCIpO1xyXG5cclxuICAgICAgICBpZiAobGFiZWxfdHlwZSAmJiBsYWJlbF90eXBlID09IFwicmljaFwiKSB7XHJcbiAgICAgICAgICAgIHRpbWVfdGl0bGUgPSBzZXR0aW5nLnRpbWVfdGl0bGUgfHwgXCJcIjtcclxuICAgICAgICAgICAgdGltZV9jb2xvciA9IHNldHRpbmcudGltZV9jb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBfc2V0VGltZUZvcm1hdFN0cmluZyA9IGZ1bmN0aW9uICh0aW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghbGFiZWwpIHJldHVyblxyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRpbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxhYmVsX3R5cGUgJiYgbGFiZWxfdHlwZSA9PSBcInJpY2hcIiAmJiB0aW1lX2NvbG9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGltZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCIlcyA8Y29sb3I9JXM+JXM8L2M+XCIsIHRpbWVfdGl0bGUsIHRpbWVfY29sb3IsIFRpbWVUb29sLmdldFRpbWVGb3JGdW5jdGlvbih0aW1lKSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiVzIDxjb2xvcj0lcz4wMDowMDowMDwvYz5cIiwgdGltZV90aXRsZSwgdGltZV9jb2xvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aW1lID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IFRpbWVUb29sLmdldFRpbWVGb3JGdW5jdGlvbih0aW1lKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IFwiMDA6MDA6MDBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsYWJlbC5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XHJcbiAgICAgICAgaWYgKGxlc3NfdGltZSA+IDApIHtcclxuICAgICAgICAgICAgX3NldFRpbWVGb3JtYXRTdHJpbmcobGVzc190aW1lKTtcclxuICAgICAgICAgICAgbGFiZWwubm9kZS5ydW5BY3Rpb24oY2MucmVwZWF0Rm9yZXZlcihjYy5zZXF1ZW5jZShjYy5kZWxheVRpbWUoMSksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxlc3NfdGltZSA9IGxlc3NfdGltZSAtIDE7XHJcbiAgICAgICAgICAgICAgICBfc2V0VGltZUZvcm1hdFN0cmluZyhsZXNzX3RpbWUpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpKSkpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX3NldFRpbWVGb3JtYXRTdHJpbmcobGVzc190aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u57K+54G15Y+Y54GwLOmAkuW9kuS4i+WOu1xyXG4gICAgc2V0Q2hpbGRVbkVuYWJsZWQ6IGZ1bmN0aW9uIChub2RlLCBzdGF0dXMpIHtcclxuICAgICAgICB2YXIgc3Bfc3RhdHVzXHJcbiAgICAgICAgaWYgKHN0YXR1cykge1xyXG4gICAgICAgICAgICBzcF9zdGF0dXMgPSBjYy5TcHJpdGUuU3RhdGUuR1JBWTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzcF9zdGF0dXMgPSBjYy5TcHJpdGUuU3RhdGUuTk9STUFMO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3ByaXRlcyA9IG5vZGUuZ2V0Q29tcG9uZW50c0luQ2hpbGRyZW4oY2MuU3ByaXRlKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ByaXRlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICBzcHJpdGVzW2ldLnNldFN0YXRlKHNwX3N0YXR1cylcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vLS3ojrflj5blsZ7mgKflr7nlupTkv6Hmga8gXHJcbiAgICAvLyBAYXR0cl9rZXkgIOetluWIkuWumuS5ieWxnuaAp2tleSDlj4LogIPooahhdHRyX2RhdGEueG1sXHJcbiAgICAvLyBAYXR0cl92YWwgIOWvueW6lOWAvC4u5aaC5p6c5piv55m+5YiG5q+UIOS8oOi/h+adpeeahOaYr+WNg+WIhuavlFxyXG4gICAgLy9yZXR1cm4g5bGe5oCnaWNvbui3r+W+hCwg5bGe5oCn5ZCN5a2XLCDlsZ7mgKflgLxcclxuICAgIGNvbW1vbkdldEF0dHJJbmZvQnlLZXlWYWx1ZTogZnVuY3Rpb24gKGF0dHJfa2V5LCBhdHRyX3ZhbCkge1xyXG4gICAgICAgIGlmICghYXR0cl9rZXkgfHwgIWF0dHJfdmFsKSByZXR1cm5cclxuICAgICAgICBsZXQgYXR0cl9uYW1lID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2tleV90b19uYW1lW2F0dHJfa2V5XTtcclxuICAgICAgICBpZiAoYXR0cl9uYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBpY29uID0gUGF0aFRvb2wuZ2V0QXR0ckljb25CeVN0cihhdHRyX2tleSk7XHJcbiAgICAgICAgICAgIHZhciBQYXJ0bmVyQ2FsY3VsYXRlID0gcmVxdWlyZShcInBhcnRuZXJfY2FsY3VsYXRlXCIpO1xyXG4gICAgICAgICAgICBsZXQgaXNfcGVyID0gUGFydG5lckNhbGN1bGF0ZS5pc1Nob3dQZXJCeVN0cihhdHRyX2tleSk7XHJcbiAgICAgICAgICAgIGlmIChpc19wZXIgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgYXR0cl92YWwgPSAoYXR0cl92YWwgLyAxMCkgKyBcIiVcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBpY29uKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7IHJlczogcmVzLCBhdHRyX25hbWU6IGF0dHJfbmFtZSwgYXR0cl92YWw6IGF0dHJfdmFsLCBpY29uOiBpY29uIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG59OyJdfQ==