(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/utils/UICommon.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, '603e7qjJ8lOYLwo6eTwrI3Q', 'UICommon'); // script/utils/UICommon.ts "use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.uiCommon = exports.PopTipsCache = exports.BezierData = void 0; var gameCfg_1 = require("../common/gameCfg"); var gameMethod_1 = require("../common/gameMethod"); var Config_1 = require("../Config"); var TypeConst_1 = require("../data/const/TypeConst"); var GameDataCenter_1 = require("../data/GameDataCenter"); var RollLabel_1 = require("../frameWork/compment/RollLabel"); var UIHelp_1 = require("../logic/ui/UIHelp"); var Formula_1 = require("./Formula"); var GameMath_1 = require("./GameMath"); var I18nUtil_1 = require("./I18nUtil"); var Load_1 = require("./Load"); var BezierData = /** @class */ (function () { function BezierData() { } return BezierData; }()); exports.BezierData = BezierData; var UICommon = /** @class */ (function () { function UICommon() { } // 初始化 UICommon.prototype.init = function () { }; UICommon.prototype.setIconByKindItem = function (node, item, cb) { }; // 给特定的节点加新增一个图片节点 UICommon.prototype.setNodeChild = function (node, url, x, y, scale) { if (x === void 0) { x = 0; } if (y === void 0) { y = 0; } if (scale === void 0) { scale = 1; } if (node.getChildByName("newImgTemp")) { node.getChildByName("newImgTemp").active = true; return; } var child = new cc.Node(); child.parent = node; child.name = "newImgTemp"; child.x = x; child.y = y; child.scale = scale; Load_1.default.loadTexture(child, url); }; /**设置label或富文本的文字 */ UICommon.prototype.setLabel = function (node, value) { if (typeof value === 'number') { value = value.toString(); } else if (value == undefined) { value = ""; } // 文本和富文本只能二选一 if (node.getComponent(cc.RichText)) { var defaultColor = "#9F90A9"; //node.color.toHEX('#rrggbb'); node.getComponent(cc.RichText).string = "" + value + ""; } else { node.getComponent(cc.Label).string = value; } }; UICommon.prototype.setLibaoLabel = function (node, orderinfo) { this.setLabel(node, orderinfo === null || orderinfo === void 0 ? void 0 : orderinfo.desc); }; //获取价格标题 UICommon.prototype.getLibaoLabel = function (orderinfo) { return orderinfo === null || orderinfo === void 0 ? void 0 : orderinfo.desc; }; UICommon.prototype.setI18nLangLabel = function (node, key) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } var str = I18nUtil_1.I18n.getI18nLang.apply(I18nUtil_1.I18n, __spreadArrays([key], args)); this.setLabel(node, str); }; UICommon.prototype.setI18nTextLabel = function (node, key) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } var str = I18nUtil_1.I18n.getI18nText.apply(I18nUtil_1.I18n, __spreadArrays([key], args)); this.setLabel(node, str); }; /**设置图片富文本,仅支持道具,传入itemList为道具ID,如 [1,2] */ UICommon.prototype.getImageStr = function (str, itemList) { if (itemList.length == 0) { return str; } // itemList.forEach((element, itemIndex) => { // let itemCfg = GameDataCenter.item.getItemCfgBase(element) // if (itemCfg) { // str = str.replace(`{${itemIndex}}`, ``) // } // }); return str; }; // /**设置图片富文本,仅支持道具,传入imageList为图片资源ID,如 [1,2] @TODO 是否能够修改图片尺寸*/ // setImageRt(node: cc.Node, str: string, imageList: number[] | string[]) { // if (imageList.length == 0) { // this.setLabel(node, str) // return // } // let index = 0 // imageList.forEach(element => { // Load.getTexture(`item/${element}`, (succ: boolean, asset: cc.SpriteFrame) => { // index++ // console.log("erqasdasasdasd", index, asset) // if (succ) { // node.getComponent(cc.RichText).imageAtlas["_spriteFrames"][element] = asset // } // if (index == imageList.length) { // console.log("erqasdasasdasd33") // imageList.forEach((element, imgIndex) => { // // // str = str.replace(`{${imgIndex}}`, ``) // }); // node.getComponent(cc.RichText).string = str // } // }) // }); // } /**图片、文字 去色,0原色 1去色,递归 */ UICommon.prototype.setState = function (node, state, all) { if (all === void 0) { all = false; } var url = state == 0 ? "2d-sprite" : "2d-gray-sprite"; if (all) { var sprites = node.getComponentsInChildren(cc.Sprite); var labels = node.getComponentsInChildren(cc.Label); sprites.forEach(function (sprite) { sprite.setMaterial(0, cc.Material.getBuiltinMaterial(url)); }); labels.forEach(function (label) { label.setMaterial(0, cc.Material.getBuiltinMaterial(url)); }); } else { if (node.getComponent(cc.Sprite) != null) { node.getComponent(cc.Sprite).setMaterial(0, cc.Material.getBuiltinMaterial(url)); } if (node.getComponent(cc.Label) != null) { node.getComponent(cc.Label).setMaterial(0, cc.Material.getBuiltinMaterial(url)); } } }; /** spine动画置灰 */ UICommon.prototype.setSpineState = function (node, isGrayed) { if (node.getComponent(sp.Skeleton) != null) { if (isGrayed) { cc.assetManager.loadBundle('materials', function (err, bundle) { bundle.load('gray-spine', cc.Material, function (err, asset) { node.getComponent(sp.Skeleton).setMaterial(0, asset); }); }); } else { node.getComponent(sp.Skeleton).setMaterial(0, cc.Material.getBuiltinMaterial("2d-spine")); } } ; }; /**按钮灰化,只有注册click事件,才会真正被禁用 */ UICommon.prototype.setBtnGrayState = function (node, isGray) { var button = node.getComponent(cc.Button); if (!button) { return; } button.interactable = !isGray; button.enableAutoGrayEffect = isGray; }; /**判断按钮是否为失效状态 */ UICommon.prototype.isBtnGray = function (node) { var button = node.getComponent(cc.Button); if (!button) { return false; } return !button.interactable; }; /**节点注册事件 */ UICommon.prototype.onRegisterEvent = function (node, callback, target, params, audio) { if (params === void 0) { params = []; } if (audio === void 0) { audio = TypeConst_1.AudioConst.effect_click; } if (!node) { return; } var cb = callback; if (callback == null) { return; } callback = function (event) { // 判断下是否有按钮组件,有的话,如果按钮是未激活状态,则不执行回调方法 var btn = node.getComponent(cc.Button); if (btn && btn.interactable == false) { return; } cb.bind(target)(event, params); GameDataCenter_1.default.audio.playEffect(audio); event.stopPropagation(); }; node.on(cc.Node.EventType.TOUCH_END, callback, target); }; /**节点取消注册事件 */ UICommon.prototype.unRegisterEvent = function (node) { if (!node) { return; } node.off(cc.Node.EventType.TOUCH_END); }; /**获取节点的世界坐标 */ UICommon.prototype.getWorldPos = function (node) { return node.convertToWorldSpaceAR(cc.Vec2.ZERO); }; UICommon.prototype.getWorldPosCenter = function (node) { var vec = new cc.Vec2(node.width * (0.5 - node.anchorX), node.height * (0.5 - node.anchorY)); return node.convertToWorldSpaceAR(vec); }; /**设置节点在世界坐标系下的相对坐标 */ UICommon.prototype.setWorldPos = function (node, pos) { var _pos = node.parent.convertToNodeSpaceAR(pos); node.x = _pos.x; node.y = _pos.y; }; /**获取node位于target的坐标相对坐标 */ UICommon.prototype.getPositionInView = function (node, target) { var worldPos = node.parent.convertToWorldSpaceAR(node.position); var viewPos = target.convertToNodeSpaceAR(worldPos); return viewPos; }; /**通过name从根节点递归获取node */ UICommon.prototype.getTargetNodeByName = function (root, name) { if (root.name == name) { return root; } for (var i = 0; i < root.children.length; i++) { var child = root.children[i]; var targetNode = this.getTargetNodeByName(child, name); if (targetNode != null) { return targetNode; } } return null; }; // 递归所有子节点并且更新节点分组 UICommon.prototype.setNodeAllGroups = function (node, group) { // 定义一个回调函数,这个函数将对每个节点执行操作 var myCallback = function (node) { // 在这里处理节点 node.group = group; }; // 开始递归遍历 this.recursiveTraverseChildren(node, myCallback); }; // 递归遍历所有子节点 UICommon.prototype.recursiveTraverseChildren = function (node, callback) { // 对当前节点执行回调函数 callback(node); // 遍历当前节点的所有子节点 for (var i = 0; i < node.children.length; i++) { // 递归遍历子节点 this.recursiveTraverseChildren(node.children[i], callback); } }; // 安卓设备的适配在主activity中执行 // ios设备,需要在游戏中修改widget // 返回是否为刘海,以及刘海高度 UICommon.prototype.isLiuhai = function () { var isLiuhai = false; var height = this.getLiuhaiHeight(); if (cc.sys.os == cc.sys.OS_IOS) { var _isLiuhai = jsb.reflection.callStaticMethod('SDKWrapper', 'isLiuhai:', ''); isLiuhai = _isLiuhai == "1"; } else if (cc.sys.os == cc.sys.OS_ANDROID) { var _isLiuhai = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getIsLiuhai", "()Ljava/lang/String;"); isLiuhai = _isLiuhai == "1"; } return [isLiuhai, height]; }; /**获取屏幕高度 */ UICommon.prototype.getWinHeight = function () { return cc.winSize.height; //- this.getLiuhaiHeight() }; UICommon.prototype.getLiuhaiHeight = function () { var height = 0; try { if (cc.sys.os == cc.sys.OS_IOS) { var _height = jsb.reflection.callStaticMethod('SDKWrapper', 'getLiuhaiHeight:', ''); height = Number(_height); } else if (cc.sys.os == cc.sys.OS_ANDROID) { height = jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "getLiuhaiHeight", "()I"); } // return height } catch (error) { // return height } return height; }; /**获取适配scale */ UICommon.prototype.getWidghtScale = function (height) { if (height === void 0) { height = cc.winSize.height; } var defaultBili = 1920 / 1080; var realBili = height / cc.winSize.width; //高宽比 return 1 + (realBili - defaultBili); }; // //将字符转为表情 // TransformationStr(text) { // let richText = ""; // var arr = text.split("#"); // for (var i = 0; i < arr.length; i++) { // if (i >= 1) { // let str = arr[i].slice(0, 5) // let str1 = arr[i].slice(5) // if (gameMethod.isEmpty(Load.getEmoji(str))) { // richText += `#${str + str1}` // } else { // richText += `${str1}` // } // } else { // richText += arr[i] // } // } // return richText // } /**原表富文本模式转换成前端富文本模式*/ UICommon.prototype.getConversionStr = function (text) { var tempStr = ''; var str = ''; var arr = text.split(''); var isColor = false; var isValue = true; for (var i = 0; i < arr.length; i++) { if (arr[i] == '<') { tempStr = ''; isColor = true; isValue = false; } if (isColor) { tempStr += arr[i]; } if (isValue) { str += arr[i]; } if (tempStr == '
') { tempStr = ''; str += tempStr; isColor = false; isValue = true; } } return str; }; /**原表成前端*/ UICommon.prototype.getTypeStr = function (text) { var str = text.replace(/
/g, ''); return str; }; // getEpsStrArr(eps: XyS.Eps | EpsPet) { // let bak: { // ek: string, // num: number, // ekShow: string, //名称 // numShow: number, //展示数值 // suffix: string, //后缀 // }[] = [] // //遍历配置 // for (const key in eps) { // let arrt = gameCfg.attr.pool[`${key}_`] // if (!gameMethod.isEmpty(arrt)) { // switch (arrt.tip) { // case 'atk'://攻击 角色的物理攻击能力 // case 'def_p'://物防 角色抵抗物理攻击的能力 // case 'def_s'://法防 角色抵抗法术攻击的能力 // case 'hp_max'://生命 角色的生命上限值 // case 'hp'://生命 角色当前的生命值 // case 'speed'://速度 决定单位在战斗中的出手频率 // case 'def'://防御 角色抵抗物理和法术攻击的能力 // //数值直接展示 // bak.push({ // ek: arrt.tip, // num: eps[arrt.tip], // ekShow: arrt.name, //名称 // numShow: eps[arrt.tip], //展示数值 // suffix: '%', //后缀 // }) // break; // case 'hit_rate'://命中 成功造成伤害的概率 // case 'dodge_rate'://闪躲 躲避伤害的概率 // case 'crit_rate'://暴击率 攻击方产生暴击的概率 // case 'crit_ratio'://暴伤 暴击产生时,伤害的变化比例 // case 'hit_magic'://控制 增强技能效果命中的比例 // case 'dodge_magic'://抗控 抵抗技能效果命中的比例 // case 'tenacity'://抗暴 受击方被暴击概率降低 // case 'atk_per'://攻击 百分比增加单位的攻击力 // case 'def_per'://防御 百分比增加单位的物理防御和法术防御 // case 'hp_max_per'://生命 百分比增加单位的生命上限 // case 'dam'://伤害加成 千分比增加造成的伤害 // case 'res'://免伤 千分比减少受到的伤害 // case 'cure'://治疗 千分比增减治疗别人的效果 // case 'be_cure'://受疗 千分比增减受到的治疗效果 // case 'dam_p'://物伤 千分比增加造成的物理伤害 // case 'dam_s'://法伤 千分比增加造成的法术伤害 // case 'res_p'://物免 千分比减少受到的物理伤害 // case 'res_s'://法免 千分比减少受到的法术伤害 // case 'speed_per'://速度 决定单位在战斗中的出手频率 // case 'def_p_per'://物防 千分比增加单位的物理防御 // case 'def_s_per'://法防 千分比增加单位的法术防御 // case 'toughness'://韧性 千分比减免持续伤害类负面效果带来的伤害 // //数值百分比加成 // bak.push({ // ek: arrt.tip, // num: eps[arrt.tip], // ekShow: arrt.name, //名称 // numShow: eps[arrt.tip] / 10, //展示数值 // suffix: '%', //后缀 // }) // break; // } // } // } // return bak // } /** 打字效果 */ UICommon.prototype.typingAni = function (label, text, time, cb) { if (time === void 0) { time = 1 / 60; } if (cb === void 0) { cb = function () { }; } if (!text || text.length <= 0) { cb(); return; } var html = ''; var tempStr = ''; var tempColorStr = ''; var str = []; var arr = text.split(''); var len = arr.length; var step = 0; var isColor = false; var isValue = false; if (label instanceof cc.RichText) { for (var i = 0; i < len; i++) { if (arr[i] == '<') { tempColorStr = ''; isValue = false; } if (isValue) { tempStr = "" + tempColorStr + arr[i] + ""; str.push(tempStr); tempStr = ''; } if (arr[i] == '#') { isColor = true; } if (arr[i] == '>' && tempColorStr != '') { isColor = false; isValue = true; tempColorStr = ""; } if (isColor) { tempColorStr += arr[i]; } } arr = str; len = str.length; } var typingFunc = function () { if (step >= len) { label.unschedule(typingFunc); cb && cb(); } else { html += arr[step]; label.string = html; } step++; }; label.schedule(typingFunc, time, len); }; /** 富文本打字效果 */ UICommon.prototype.typingRich = function (label, text, wordsNum, time, cb) { if (time === void 0) { time = 1 / 60; } if (cb === void 0) { cb = function () { }; } if (!text || text.length <= 0) { cb(); return; } var str = text; var charArr = str.replace(/<.+?\/?>/g, '').split(''); var tempStrArr = [str], curstr = str; for (var i = charArr.length; i > 1; i--) { var lastIdx = curstr.lastIndexOf(charArr[i - 1]); var prevstr = curstr.slice(0, lastIdx); var nextstr = curstr.slice(lastIdx + 1, curstr.length); if ((i - 1) % wordsNum == 0) tempStrArr.push(prevstr + nextstr); curstr = prevstr + nextstr; } var step = 0, len = tempStrArr.length; var typingFunc = function () { if (step >= len) { label.unschedule(typingFunc); cb && cb(); } else { label.string = tempStrArr.pop(); } step++; }; label.schedule(typingFunc, time, len); typingFunc(); }; // /** // * @description:给需要点击回调的RichText添加回调脚本 // * @param {type} node 包含RichText组件的Node // * @param {type} component 需要处理点击事件的脚本 // * @return {type} // */ // createRichTextCallback(node, component) { // if (gameMethod.isEmpty(node)) { // console.log("node must be cc.Node!!!"); // return; // } // let richText = node.getComponent(cc.RichText); // if (gameMethod.isEmpty(richText)) { // console.log("node must have RichText component!!!"); // return; // } // let st = node.addComponent(RichTextEvent); // st.setObject(component); // } // /** // * @description:获取技能buff描述 // * @param {type} buffId 需要处理点击事件的脚本 // * @return {type} // */ // getBuffDesc(buffId: string, withTitle: boolean = true): string { // let conf = gameCfg.skill_all_buff.getItem(buffId) // if (conf == null) { // console.log(" buff info is not exist!!!"); // return "" // } // if (withTitle) { // return `[${conf.name}]\n${conf.desc}` // } // return conf.desc // } //给 spine 重新拷贝一份 skeletonData 数据,让他们不重复 UICommon.prototype.copySpine = function (skeleton) { var date = new Date(); // 记录当前播放的动画 var animation = skeleton.animation; var spdata = skeleton.skeletonData; var copy = new sp.SkeletonData(); cc.js.mixin(copy, spdata); // @ts-ignore copy._uuid = spdata._uuid + "_" + date.getTime() + "_copy"; var old = copy.name; var newName = copy.name + "_copy"; copy.name = newName; copy.atlasText = copy.atlasText.replace(old, newName); // @ts-ignore copy.textureNames[0] = newName + ".png"; // @ts-ignore copy.init && copy.init(); skeleton.skeletonData = copy; // 继续播放的动画,不然会停止 skeleton.setAnimation(0, animation, true); }; /** * 用外部图片局部换装 * @param skeleton 骨骼动画 * @param slotName 需要替换的插槽名称 * @param texture 外部图片 */ UICommon.prototype.changeSlot = function (skeleton, slotName, texture) { if (cc.sys.isBrowser) { var slot = skeleton.findSlot(slotName); var attachment = slot.getAttachment(); if (!slot || !attachment) { cc.error('updatePartialSkin'); return; } // @ts-ignore var skeletonTexture = new sp.SkeletonTexture({}); skeletonTexture.setRealTexture(texture); var region = attachment.region; region.u = 0; region.v = 0; region.u2 = 1; region.v2 = 1; region.width = texture.width * 5; region.height = texture.height * 5; region.originalWidth = texture.width * 5; region.originalHeight = texture.height * 5; region.rotate = false; region.texture = skeletonTexture; attachment.width = texture.width * 5; attachment.height = texture.height * 5; attachment.region = region; attachment.setRegion && attachment.setRegion(region); attachment.updateOffset && attachment.updateOffset(); // attachment.updateUVs && attachment.updateUVs(attachment); slot.setAttachment(attachment); } else { // @ts-ignore var jsbTex = new middleware.Texture2D(); jsbTex.setPixelsHigh(texture.height * 5); jsbTex.setPixelsWide(texture.width * 5); jsbTex.setNativeTexture(texture.getImpl()); // @ts-ignore skeleton.updateRegion(slotName, jsbTex); } // skeleton 如果使用了缓存模式则需要刷新缓存 skeleton.invalidAnimationCache(); }; // 移除所有子节点 UICommon.prototype.destoryAllChildren = function (node) { node.children.forEach(function (child) { child.destroy(); }); }; // 根据品质获取颜色 UICommon.prototype.getColorByPz = function (pinzhi) { // 品质1·8的,9瑶光的自己拼 switch (Number(pinzhi)) { case 1: return '#B3B3B3'; case 2: return '#81B58B'; case 3: return '#7CACCF'; case 4: return '#A77CC5'; case 5: return '#E6A76A'; case 6: return '#E7C45A'; case 7: return '#D45F59'; case 8: return '#76DEE4'; case 9: return '#EB91F0'; case 10: return '#FF66D9'; case 11: return '#98F22E'; case 12: return '#FFCC19'; default: return '#FFFFFF'; } }; // // 根据品质获取颜色 // setColorTxtByPz(txt:string,pinzhi: number | string) { // let color = this.getColorByPz(pinzhi); // let str = `[color=${color}]` // } // 根据品质获取名称 UICommon.prototype.getNameByPz = function (pinzhi) { return I18nUtil_1.I18n.getI18nLang("zhenfa_pinzhi_name_" + pinzhi); }; UICommon.prototype.getEnoughColor = function (isenough) { return isenough ? "6fdf89" : "E45849"; }; // 修正文字布局 UICommon.prototype.fixName = function (msg) { // if (msg.length >= 4) { // return msg // } // let out = "" // for (let index = 0; index < msg.length; index++) { // out += msg[index] // // 添加空格 // if (index + 1 == msg.length) { // break // } // if (msg.length == 2) { // out += " " // } else if (msg.length == 3) { // out += " " // } // } // return out; return msg; }; // cocos画布的节点位置信息转化为微信画布位置信息 UICommon.prototype.getWxBtnPos = function (node) { var visibleSize = cc.view.getVisibleSize(); // console.log("==visibleSize==", visibleSize.width, visibleSize.height) // console.log("==position==", node.node.position) // let worldPos = FormulaCom.getWorldPos(node.node) var worldPos = fgui.GRoot.inst.localToGlobal(node.x, node.y); // console.log("==fgui worldPos==", fgui.GRoot.inst.localToGlobal(node.x, node.y)) // console.log("==cc worldPos==", FormulaCom.getWorldPos(node.node)) //获取系统信息 var wx_size = wx === null || wx === void 0 ? void 0 : wx.getSystemInfoSync(); // console.log("==wx_size==", wx_size.screenWidth, wx_size.screenHeight) //计算实际大小和可见区域尺寸的比例(这里以宽度为准) var size_scale_width = wx_size.screenWidth / visibleSize.width; var size_scale_height = wx_size.screenHeight / Config_1.default.realHeight; //计算创建用户信息按钮需要的属性,考虑锚点 var offsetX = node.width * node.scaleX * (node.node.anchorX / 1); var offsetY = node.height * node.scaleY * ((1 - node.node.anchorY) / 1); // console.log("==anchorX==", node.node.anchorX) // console.log("==anchorY==", node.node.anchorY) // console.log("==offsetX==", offsetX) // console.log("==offsetY==", offsetY) var left = (worldPos.x - offsetX) * size_scale_width; // (this.ui.btnUser.x + visibleSize.width / 2 - this.ui.btnUser.width / 2) * size_scale_width; var top = (worldPos.y + node.height / 2) * size_scale_height; //fgui // let top = wx_size.screenHeight - (worldPos.y - offsetY - Config.safeAreaRect.y / 2 - node.height / 2) * size_scale_height //cc var width = node.width * size_scale_width * node.scaleX; var height = node.height * size_scale_height * node.scaleY; // let y = (Math.abs(this.ui.btnUser.y) - this.ui.btnUser.height / 2) * size_scale_width; // let width = this.ui.btnUser.width * size_scale_width; // let height = this.ui.btnUser.height * size_scale_width; // console.log("==left==", left) // console.log("==top==", top) // console.log("==width==", width) // console.log("==height==", height) return { left: left, top: top, width: width, height: height }; }; UICommon.prototype.btnShake = function (node) { var tween = cc.tween(node) .delay(2) .to(0.05, { angle: -15 }) .to(0.1, { angle: 15 }) .to(0.1, { angle: -15 }) .to(0.1, { angle: 15 }) .to(0.05, { angle: 0 }); cc.tween(node).repeatForever(tween).start(); }; /** * 抛物线飞行 //开始坐标 //中间坐标(高度) //结束坐标 * p0是起始点 * p1是中点 * p2是终点 * p1通过p2和p0的Xaxis相减获得 * height是p0加上的高度 * t 的取值范围是0-1(整个过程的归一化 */ UICommon.prototype.paowuxian = function (parm) { //中间点 var mv2 = cc.v2(parm.s.x + (parm.e.x - parm.s.x) / 2, (parm.s.y + parm.e.y) / 2 + parm.h); //设置时间 var time = Math.sqrt(Math.abs(mv2.y - parm.s.y)) + Math.sqrt(Math.abs(mv2.y - parm.e.y)); time /= 50; if (parm.tadd != null) { time = (time * parm.tadd) / 100; } //起始点 parm.node.x = parm.s.x; parm.node.y = parm.s.y; cc.tween(parm.node) .bezierTo(time, mv2, mv2, cc.v2(parm.e.x, parm.e.y)) .call(function () { if (parm.cbk != null) { parm.cbk(); } }) .start(); }; //抛物线 + 落地弹弹弹 UICommon.prototype.paowuxian_tan = function (parm, t //当前第几次弹 初次是0 不算弹的 ) { var _this = this; //跳 this.paowuxian({ node: parm.node, s: parm.s, e: parm.e, h: parm.h, tadd: parm.tadd, cbk: function () { //第几次弹 if (t == null) { t = 0; } t += 1; //当前衰减比例 var pers = Math.pow(parm.jian / 100, t); if (pers < 0.1) { //不再弹了 if (parm.cbk != null) { parm.cbk(); return; } } //目标 var _h = parm.h * pers; //跳的高度 衰减 var _e = { x: parm.e.x + (parm.e.x - parm.s.x) * pers, y: parm.e.y, }; //调用自己 _this.paowuxian_tan({ node: parm.node, s: parm.e, e: _e, h: _h, jian: parm.jian, tadd: parm.tadd, cbk: parm.cbk, }, t); }, }); }; // 引擎自带的贝塞尔曲线运动 UICommon.prototype.runBezierAct = function (actNode, duration, bezierDatas) { if (bezierDatas.length <= 0) return; var tw = cc.tween(); for (var i = 0; i < bezierDatas.length; ++i) { tw.bezierTo(duration, bezierDatas[i].c1, bezierDatas[i].c2, bezierDatas[i].endPos); } actNode.setPosition(bezierDatas[0].startPos); tw.clone(actNode).start(); }; // 匀速贝塞尔曲线运动 UICommon.prototype.runUniformBezierAct = function (actNode, duration, bezierDatas, onComplete) { if (bezierDatas.length <= 0) return; var tw = cc.tween(); var allBezierPos = []; for (var i = 0; i < bezierDatas.length; ++i) { var posArr = [bezierDatas[i].startPos, bezierDatas[i].c1, bezierDatas[i].c2, bezierDatas[i].endPos]; allBezierPos = allBezierPos.concat(this._caculateBezierPoint(posArr)); } var totalLineLen = this._caculateBezierLength(allBezierPos); var speed = totalLineLen / duration; var isCanBezier = false; var _loop_1 = function (i) { var dis = cc.v2(allBezierPos[i].x - allBezierPos[i - 1].x, allBezierPos[i].y - allBezierPos[i - 1].y).len(); if (dis > 0) { // 这里过滤掉两段贝塞尔曲线首位连接的点 var t = dis / speed; tw.to(t, { position: allBezierPos[i] }) .call(function () { var angle = Formula_1.FormulaCom.getAngleByPos(allBezierPos[i - 1].x, allBezierPos[i - 1].y, allBezierPos[i].x, allBezierPos[i].y); // let angle = FormulaCom.getAngle(allBezierPos[i - 1],allBezierPos[i]) // console.log("angle = ",angle) actNode.angle = angle; }); isCanBezier = true; } }; for (var i = 1; i < allBezierPos.length; ++i) { _loop_1(i); } if (!isCanBezier) { console.error("allBezierPos.length == 0"); return; } actNode.setPosition(allBezierPos[0]); tw.clone(actNode).call(function () { onComplete && onComplete(); }).start(); }; // 计算所有贝塞尔曲线的点 UICommon.prototype._caculateBezierPoint = function (posArr) { var allBezierPos = []; var allDis = cc.Vec2.distance(posArr[0], posArr[3]); var gapCount = Math.ceil(allDis / 10); //距离5像素为一点 var gap = 1 / gapCount; // 每次迭代步长,这个值越小越精细,但是效率越低,这里迭代300次已经够了 for (var i = 0; i <= 1; i += gap) { var pos = this._caculateBezierP(posArr, i); allBezierPos.push(pos); } return allBezierPos; }; // 计算贝塞尔曲线的长度 UICommon.prototype._caculateBezierLength = function (allBezierPos) { var totalLineLen = 0; for (var i = 1; i < allBezierPos.length; ++i) { var dis = cc.v2(allBezierPos[i].x - allBezierPos[i - 1].x, allBezierPos[i].y - allBezierPos[i - 1].y).len(); totalLineLen += dis; } return totalLineLen; }; /** * 计算三阶贝塞尔在 t时刻 的位置 * @param p 三阶贝塞尔的四个点,数组对应为 0起点,1起点控制点,2终点控制点,3终点 * @param t 传入0-1的值,一个时间的迭代过程 * @returns */ UICommon.prototype._caculateBezierP = function (p, t) { // 三阶贝塞尔运算 var bezierP = cc.v2(); bezierP.x = Math.floor(Math.pow(1 - t, 3) * p[0].x + 3 * t * Math.pow(1 - t, 2) * p[1].x + 3 * Math.pow(t, 2) * (1 - t) * p[2].x + Math.pow(t, 3) * p[3].x); bezierP.y = Math.floor(Math.pow(1 - t, 3) * p[0].y + 3 * t * Math.pow(1 - t, 2) * p[1].y + 3 * Math.pow(t, 2) * (1 - t) * p[2].y + Math.pow(t, 3) * p[3].y); return bezierP; }; /** 判断隐藏礼包是否开启 * @param ycgift 隐藏礼包数据 * @param dc 档次 * @param buyNum 购买次数 * @param buyCons 购买金额 */ UICommon.prototype.checkYcGiftOpen = function (tiaojian, buyNum, buyCons) { var _a, _b, _c; if (gameMethod_1.gameMethod.isEmpty(tiaojian)) return false; //有配置全局充值金额并且全局充值大于固定金额显示 if (!gameMethod_1.gameMethod.isEmpty(tiaojian[2]) && ((_c = (_b = (_a = GameDataCenter_1.default.sevBack) === null || _a === void 0 ? void 0 : _a.userInfo) === null || _b === void 0 ? void 0 : _b.a) === null || _c === void 0 ? void 0 : _c.iscz) >= tiaojian[2]) { return true; } // 隐藏礼包条件判断 if (tiaojian[0] > 0 && tiaojian[1] <= 0) { // 第一种 只判断次数 if (buyNum >= tiaojian[0]) { return true; } } else if (tiaojian[0] <= 0 && tiaojian[1] > 0) { // 第二种 只判断金额 if (buyCons >= tiaojian[1]) { return true; } } else if (tiaojian[0] > 0 && tiaojian[1] > 0) { // 第三种 判断次数和金额 满足一种 if (buyNum >= tiaojian[0] || buyCons >= tiaojian[1]) { return true; } } return false; }; // 获取属性名跟值 *传入值 "atk":10 返回 [攻击, 10] UICommon.prototype.getEpsNameValue = function (key, value) { var epsCfg = gameCfg_1.default.userEp.getItem(key); value = value ? value : 0; if (gameMethod_1.gameMethod.isEmpty(epsCfg)) { // console.log('配置错误===', key) return [key, value + ""]; } // return [this.fixName(epsCfg.name), (epsCfg.isPer ? `${value / 100}%` : value + "") || "0"]; return [this.fixName(I18nUtil_1.I18n.getUserEpName(epsCfg.key)), epsCfg.isPer ? value / 100 + "%" : value + ""]; }; /** * UI节点转换到目标节点下的坐标 * @param node 节点 * @param targetNode 目标节点 * @returns {转换后的坐标的点|Point} */ UICommon.prototype.transPos = function (node, targetNode) { //转世界坐标 var endGlobalPos = this.getWorldPos(node); if (!endGlobalPos) return null; //再转局部坐标 var endPos = targetNode.convertToNodeSpaceAR(endGlobalPos); return endPos; }; // 剪贴板复制功能 UICommon.prototype.webCopyString = function (str) { // console.log('复制ing'); var input = str + ''; var el = document.createElement('textarea'); el.value = input; el.setAttribute('readonly', ''); // el.style.contain = 'strict'; el.style.position = 'absolute'; el.style.left = '-9999px'; el.style.fontSize = '12pt'; // Prevent zooming on iOS var selection = getSelection(); var originalRange = null; if (selection.rangeCount > 0) { originalRange = selection.getRangeAt(0); } document.body.appendChild(el); el.select(); el.selectionStart = 0; el.selectionEnd = input.length; var success = false; try { success = document.execCommand('copy'); } catch (err) { } document.body.removeChild(el); if (originalRange) { selection.removeAllRanges(); selection.addRange(originalRange); } if (success) { UIHelp_1.default.ShowTips(I18nUtil_1.I18n.getI18nText('common_copy_sucess')); } else { UIHelp_1.default.ShowTips(I18nUtil_1.I18n.getI18nText('common_copy_fail')); } return success; }; /** * 设置滚动变化的数字文本,不要再任何虚拟列表内使用 * @param obj 需要控制的文本组件 * @param num 变化的目标数字 * @param cb 实时变化的数字值,自己在内部写需要执行和改变的文本(如果不传则直接对obj.text或这obj.title赋值 * @param param 参数 */ UICommon.prototype.SetLabelRoll = function (obj, num, cb, param) { if (cb === void 0) { cb = null; } if (param === void 0) { param = null; } var rolllabel = obj.node.getComponent(RollLabel_1.default); if (rolllabel == null) { rolllabel = obj.node.addComponent(RollLabel_1.default); rolllabel.obj = obj; } rolllabel.setData(num, cb, param); }; /** * 上漂文本 * @param func 改变文本图标的方法 * @param node 位置节点定位用 * @param view 挂载上漂节点用的页面 * @param cache 缓存 * @param randomX * @param randomY * @param pac * @param popItem */ UICommon.prototype.PopTips = function (func, node, view, cache, randomX, randomY, pac, popItem) { if (randomX === void 0) { randomX = null; } if (randomY === void 0) { randomY = null; } if (pac === void 0) { pac = "Common"; } if (popItem === void 0) { popItem = "PopTips"; } var data = null; for (var _i = 0, cache_1 = cache; _i < cache_1.length; _i++) { var i = cache_1[_i]; if (i.obj.visible == false) { data = i; break; } } if (data == null) { var obj = fgui.UIPackage.createObject(pac, popItem); view.addChild(obj); data = new PopTipsCache(obj); cache.push(data); } if (typeof randomX == "number") { data.obj.x = node.x + randomX; } else if (randomX) { var left = randomX[0]; var right = randomX[1]; var randomposx = GameMath_1.default.getRandomNum(left, right); data.obj.x = node.x + randomposx; } else { data.obj.x = node.x; } if (typeof randomY == "number") { data.obj.y = node.y + randomY; } else if (randomY) { var left = randomY[0]; var right = randomY[1]; var randomposy = GameMath_1.default.getRandomNum(left, right); data.obj.y = node.y + randomposy; } else { data.obj.y = node.y; } func(data.obj); data.startTween(); }; /** 数字转中文 */ UICommon.prototype.NumToChinese = function (num) { if (num < 0 || num > 100) { return "输入的数字必须在0到100之间"; } var units = ['', '十', '百', '千']; // 可以根据需要扩展 var chineseNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; var str = ''; var digit; // 处理个位数 digit = num % 10; if (digit !== 0) { str = chineseNums[digit]; } // 处理十位数 num = Math.floor(num / 10); if (num !== 0) { if (num == 1) { str = '十' + str; } else { str = chineseNums[num] + '十' + str; } } // 如果需要处理更大的数字,可以继续添加逻辑 // 移除开头的'零' str = str.replace(/^零+/, ''); if (str === '') { str = '零'; } return str; }; /** 圆上指定角度一点 */ UICommon.prototype.GetPointOnCircle = function (radius, degree, center) { var angle = this.DegreeToAngle(degree); // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = center.x + radius * Math.cos(angle); var y = center.y + radius * Math.sin(angle); // 返回该点的坐标 return cc.v2(x, y); }; /** 圆上任意一点 */ UICommon.prototype.GetRandomPointOnCircle = function (radius, centerX, centerY) { if (centerX === void 0) { centerX = 0; } if (centerY === void 0) { centerY = 0; } // 生成一个0到2π之间的随机角度(弧度) var angle = Math.random() * 2 * Math.PI; // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = centerX + radius * Math.cos(angle); var y = centerY + radius * Math.sin(angle); // 返回该点的坐标 return cc.v2(x, y); }; /** 圆上角度范围一点 */ UICommon.prototype.GetRandomPointOnAngle = function (radius, rangeAngle, center, point) { // 生成一个0到2π之间的随机角度(弧度) // const angle = Math.random() * 2 * Math.PI; var dx = point.x - center.x; var dy = point.y - center.y; var angleRadians = Math.atan2(dy, dx); var angle = this.AngleToDegree(angleRadians); var newAngle = GameMath_1.default.getRandomNum(rangeAngle, rangeAngle * 2) - rangeAngle; angle += newAngle; var degree = this.DegreeToAngle(angle); // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = center.x + radius * Math.cos(degree); var y = center.y + radius * Math.sin(degree); // 返回该点的坐标 return cc.v2(x, y); }; /** 圆上指定角度一点 */ UICommon.prototype.GetCirclePointOnAngle = function (radius, diffAngle, center, point) { // 生成一个0到2π之间的随机角度(弧度) // const angle = Math.random() * 2 * Math.PI; var dx = point.x - center.x; var dy = point.y - center.y; var angleRadians = Math.atan2(dy, dx); var angle = this.AngleToDegree(angleRadians); var degree = angle + diffAngle; var newAngle = this.DegreeToAngle(degree); // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = center.x + radius * Math.cos(newAngle); var y = center.y + radius * Math.sin(newAngle); // 返回该点的坐标 return cc.v2(x, y); }; /** 圆上分割角度后的坐标点 */ UICommon.prototype.GetCirclePointDivideAngle = function (radius, divideCount, center) { // 生成一个0到2π之间的随机角度(弧度) var per = divideCount / divideCount; var posArr = []; for (var i = 0; i < divideCount; i++) { var degree = per * i; // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = center.x + radius * Math.cos(degree); var y = center.y + radius * Math.sin(degree); posArr.push(cc.v2(x, y)); } return posArr; }; /** 圆上指定弧长的点 */ UICommon.prototype.GetCircleAngleLenPoint = function (radius, len, center, point, index) { var dx = point.x - center.x; var dy = point.y - center.y; var angleRadians = Math.atan2(dy, dx); var degree = this.AngleToDegree(angleRadians); var totalLen = 2 * Math.PI * radius; var needDegree = len / totalLen * 360; //弧长对应角度 var newDegree = degree + index * needDegree; var newAngle = this.DegreeToAngle(newDegree); // 使用三角函数计算圆上该角度对应的点的x和y坐标 var x = center.x + radius * Math.cos(newAngle); var y = center.y + radius * Math.sin(newAngle); // 返回该点的坐标 return cc.v2(x, y); }; /** 弧度转角度 */ UICommon.prototype.AngleToDegree = function (angleRadians) { var angleDegrees = angleRadians * (180 / Math.PI); return angleDegrees; }; /** 角度转弧度 */ UICommon.prototype.DegreeToAngle = function (degree) { var angle = degree / (180 / Math.PI); return angle; }; /** 获取两点角度 */ UICommon.prototype.GetTwoPointAngle = function (center, point) { var dx = point.x - center.x; var dy = point.y - center.y; var angleRadians = Math.atan2(dy, dx); var angle = this.AngleToDegree(angleRadians); return angle; }; /** 求多个点的中心点 */ UICommon.prototype.CalculateCentroid = function (points) { // 初始化x和y的总和 var sumX = 0; var sumY = 0; // 遍历所有点,累加x和y的坐标 points.forEach(function (point) { sumX += point.x; sumY += point.y; }); // 计算平均x和y坐标 var centroidX = sumX / points.length; var centroidY = sumY / points.length; // 返回中心点坐标 return cc.v2(centroidX, centroidY); }; return UICommon; }()); var PopTipsCache = /** @class */ (function () { function PopTipsCache(obj) { this.obj = obj; } PopTipsCache.prototype.startTween = function () { var _this = this; this.obj.alpha = 0; this.obj.visible = true; var y = this.obj.y - 120; this.tween1 = cc.tween(this.obj).to(1, { y: y, }).call(function () { _this.obj.visible = false; }); this.tween2 = cc.tween(this.obj).to(0.2, { alpha: 1, }).delay(0.6).to(0.2, { alpha: 0, }); this.tween1.start(); this.tween2.start(); }; PopTipsCache.prototype.clearTween = function () { var _a, _b; (_a = this.tween1) === null || _a === void 0 ? void 0 : _a.stop(); (_b = this.tween2) === null || _b === void 0 ? void 0 : _b.stop(); this.obj.visible = false; }; return PopTipsCache; }()); exports.PopTipsCache = PopTipsCache; exports.uiCommon = new UICommon(); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvVUlDb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUF3QztBQUN4QyxtREFBa0Q7QUFFbEQsb0NBQStCO0FBRS9CLHFEQUFxRDtBQUNyRCx5REFBb0Q7QUFDcEQsNkRBQTRFO0FBQzVFLDZDQUF3QztBQUN4QyxxQ0FBdUM7QUFDdkMsdUNBQWtDO0FBQ2xDLHVDQUFrQztBQUVsQywrQkFBMEI7QUFFMUI7SUFBQTtJQUtBLENBQUM7SUFBRCxpQkFBQztBQUFELENBTEEsQUFLQyxJQUFBO0FBTFksZ0NBQVU7QUFPdkI7SUFBQTtJQXF1Q0EsQ0FBQztJQXB1Q0csTUFBTTtJQUNOLHVCQUFJLEdBQUosY0FBUyxDQUFDO0lBQ1Ysb0NBQWlCLEdBQWpCLFVBQWtCLElBQWEsRUFBRSxJQUFjLEVBQUUsRUFBOEI7SUFFL0UsQ0FBQztJQUNELGtCQUFrQjtJQUNsQiwrQkFBWSxHQUFaLFVBQWEsSUFBYSxFQUFFLEdBQVcsRUFBRSxDQUFhLEVBQUUsQ0FBYSxFQUFFLEtBQWlCO1FBQS9DLGtCQUFBLEVBQUEsS0FBYTtRQUFFLGtCQUFBLEVBQUEsS0FBYTtRQUFFLHNCQUFBLEVBQUEsU0FBaUI7UUFDcEYsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtZQUMvQyxPQUFNO1NBQ1Q7UUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN6QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtRQUNuQixLQUFLLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQTtRQUN6QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNYLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ1gs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Q0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCw0QkFBUyxHQUFULFVBQVUsSUFPVDtRQUNHLEtBQUs7UUFDTCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTTtRQUNOLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNYLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDbkIsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDbkM7UUFDRCxLQUFLO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2Qs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S0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFTCxtQkFBQztBQUFELENBbkNBLEFBbUNDLElBQUE7QUFuQ1ksb0NBQVk7QUFxQ2QsUUFBQSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQSIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHYW1lY2ZnIGZyb20gXCIuLi9jb21tb24vZ2FtZUNmZ1wiO1xuaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgS2luZEl0ZW0sIE9yZGVyTGlzdCB9IGZyb20gXCIuLi9jb21tb24vWHlzXCI7XG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuLi9Db25maWdcIjtcbmltcG9ydCB7IENoYXRFdmVudCB9IGZyb20gXCIuLi9kYXRhL2NvbnN0L0V2ZW50Q29uc3RcIjtcbmltcG9ydCB7IEF1ZGlvQ29uc3QgfSBmcm9tIFwiLi4vZGF0YS9jb25zdC9UeXBlQ29uc3RcIjtcbmltcG9ydCBHYW1lRGF0YUNlbnRlciBmcm9tIFwiLi4vZGF0YS9HYW1lRGF0YUNlbnRlclwiO1xuaW1wb3J0IFJvbGxMYWJlbCwgeyBSb2xsTGFiZWxQYXJhbSB9IGZyb20gXCIuLi9mcmFtZVdvcmsvY29tcG1lbnQvUm9sbExhYmVsXCI7XG5pbXBvcnQgVUlIZWxwIGZyb20gXCIuLi9sb2dpYy91aS9VSUhlbHBcIjtcbmltcG9ydCB7IEZvcm11bGFDb20gfSBmcm9tIFwiLi9Gb3JtdWxhXCI7XG5pbXBvcnQgR2FtZU1hdGggZnJvbSBcIi4vR2FtZU1hdGhcIjtcbmltcG9ydCB7IEkxOG4gfSBmcm9tIFwiLi9JMThuVXRpbFwiO1xuaW1wb3J0IENvbG9yQXNzZW1ibGVyMkQgZnJvbSBcIi4vTGFiZWxDb2xvclwiO1xuaW1wb3J0IExvYWQgZnJvbSBcIi4vTG9hZFwiO1xuXG5leHBvcnQgY2xhc3MgQmV6aWVyRGF0YSB7XG4gICAgc3RhcnRQb3M6IGNjLlZlYzI7XG4gICAgYzE6IGNjLlZlYzI7ICAvLyDotbfngrnnmoTmjqfliLbngrlcbiAgICBjMjogY2MuVmVjMjsgIC8v57uI54K555qE5o6n5Yi254K5XG4gICAgZW5kUG9zOiBjYy5WZWMyO1xufVxuXG5jbGFzcyBVSUNvbW1vbiB7XG4gICAgLy8g5Yid5aeL5YyWXG4gICAgaW5pdCgpIHsgfVxuICAgIHNldEljb25CeUtpbmRJdGVtKG5vZGU6IGNjLk5vZGUsIGl0ZW06IG51bWJlcltdLCBjYj86IChpc1N1Y2M6IGJvb2xlYW4pID0+IHZvaWQpIHtcblxuICAgIH1cbiAgICAvLyDnu5nnibnlrprnmoToioLngrnliqDmlrDlop7kuIDkuKrlm77niYfoioLngrlcbiAgICBzZXROb2RlQ2hpbGQobm9kZTogY2MuTm9kZSwgdXJsOiBzdHJpbmcsIHg6IG51bWJlciA9IDAsIHk6IG51bWJlciA9IDAsIHNjYWxlOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIGlmIChub2RlLmdldENoaWxkQnlOYW1lKFwibmV3SW1nVGVtcFwiKSkge1xuICAgICAgICAgICAgbm9kZS5nZXRDaGlsZEJ5TmFtZShcIm5ld0ltZ1RlbXBcIikuYWN0aXZlID0gdHJ1ZVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNoaWxkID0gbmV3IGNjLk5vZGUoKVxuICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlXG4gICAgICAgIGNoaWxkLm5hbWUgPSBcIm5ld0ltZ1RlbXBcIlxuICAgICAgICBjaGlsZC54ID0geFxuICAgICAgICBjaGlsZC55ID0geVxuICAgICAgICBjaGlsZC5zY2FsZSA9IHNjYWxlXG4gICAgICAgIExvYWQubG9hZFRleHR1cmUoY2hpbGQsIHVybClcbiAgICB9XG4gICAgLyoq6K6+572ubGFiZWzmiJblr4zmlofmnKznmoTmloflrZcgKi9cbiAgICBzZXRMYWJlbChub2RlOiBjYy5Ob2RlLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5paH5pys5ZKM5a+M5paH5pys5Y+q6IO95LqM6YCJ5LiAXG4gICAgICAgIGlmIChub2RlLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCkpIHtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0Q29sb3IgPSBcIiM5RjkwQTlcIi8vbm9kZS5jb2xvci50b0hFWCgnI3JyZ2diYicpO1xuICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoY2MuUmljaFRleHQpLnN0cmluZyA9IGA8Y29sb3I9JHtkZWZhdWx0Q29sb3J9PiR7dmFsdWV9PC9jPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChjYy5MYWJlbCkuc3RyaW5nID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMaWJhb0xhYmVsKG5vZGU6IGNjLk5vZGUsIG9yZGVyaW5mbzogT3JkZXJMaXN0KSB7XG4gICAgICAgIHRoaXMuc2V0TGFiZWwobm9kZSwgb3JkZXJpbmZvPy5kZXNjKVxuICAgIH1cblxuICAgIC8v6I635Y+W5Lu35qC85qCH6aKYXG4gICAgZ2V0TGliYW9MYWJlbChvcmRlcmluZm86IE9yZGVyTGlzdCkge1xuICAgICAgICByZXR1cm4gb3JkZXJpbmZvPy5kZXNjXG4gICAgfVxuXG4gICAgc2V0STE4bkxhbmdMYWJlbChub2RlOiBjYy5Ob2RlLCBrZXk6IHN0cmluZywgLi4uYXJncykge1xuICAgICAgICBsZXQgc3RyID0gSTE4bi5nZXRJMThuTGFuZyhrZXksIC4uLmFyZ3MpXG4gICAgICAgIHRoaXMuc2V0TGFiZWwobm9kZSwgc3RyKVxuICAgIH1cblxuICAgIHNldEkxOG5UZXh0TGFiZWwobm9kZTogY2MuTm9kZSwga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgIGxldCBzdHIgPSBJMThuLmdldEkxOG5UZXh0KGtleSwgLi4uYXJncylcbiAgICAgICAgdGhpcy5zZXRMYWJlbChub2RlLCBzdHIpXG4gICAgfVxuXG4gICAgLyoq6K6+572u5Zu+54mH5a+M5paH5pysLOS7heaUr+aMgemBk+WFtyzkvKDlhaVpdGVtTGlzdOS4uumBk+WFt0lELOWmgiBbMSwyXSAqL1xuICAgIGdldEltYWdlU3RyKHN0cjogc3RyaW5nLCBpdGVtTGlzdDogS2luZEl0ZW1bXSB8IGFueVtdW10pOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbUxpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJcbiAgICAgICAgfVxuICAgICAgICAvLyBpdGVtTGlzdC5mb3JFYWNoKChlbGVtZW50LCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgLy8gICAgIGxldCBpdGVtQ2ZnID0gR2FtZURhdGFDZW50ZXIuaXRlbS5nZXRJdGVtQ2ZnQmFzZShlbGVtZW50KVxuICAgICAgICAvLyAgICAgaWYgKGl0ZW1DZmcpIHtcbiAgICAgICAgLy8gICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShgeyR7aXRlbUluZGV4fX1gLCBgPGltZyBzcmM9JyR7aXRlbUNmZy5pY29ufScvPmApXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICByZXR1cm4gc3RyXG4gICAgfVxuXG4gICAgLy8gLyoq6K6+572u5Zu+54mH5a+M5paH5pysLOS7heaUr+aMgemBk+WFtyzkvKDlhaVpbWFnZUxpc3TkuLrlm77niYfotYTmupBJRCzlpoIgWzEsMl0gIEBUT0RPIOaYr+WQpuiDveWkn+S/ruaUueWbvueJh+WwuuWvuCovXG4gICAgLy8gc2V0SW1hZ2VSdChub2RlOiBjYy5Ob2RlLCBzdHI6IHN0cmluZywgaW1hZ2VMaXN0OiBudW1iZXJbXSB8IHN0cmluZ1tdKSB7XG4gICAgLy8gICAgIGlmIChpbWFnZUxpc3QubGVuZ3RoID09IDApIHtcbiAgICAvLyAgICAgICAgIHRoaXMuc2V0TGFiZWwobm9kZSwgc3RyKVxuICAgIC8vICAgICAgICAgcmV0dXJuXG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgbGV0IGluZGV4ID0gMFxuICAgIC8vICAgICBpbWFnZUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAvLyAgICAgICAgIExvYWQuZ2V0VGV4dHVyZShgaXRlbS8ke2VsZW1lbnR9YCwgKHN1Y2M6IGJvb2xlYW4sIGFzc2V0OiBjYy5TcHJpdGVGcmFtZSkgPT4ge1xuICAgIC8vICAgICAgICAgICAgIGluZGV4KytcbiAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycWFzZGFzYXNkYXNkXCIsIGluZGV4LCBhc3NldClcbiAgICAvLyAgICAgICAgICAgICBpZiAoc3VjYykge1xuICAgIC8vICAgICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCkuaW1hZ2VBdGxhc1tcIl9zcHJpdGVGcmFtZXNcIl1bZWxlbWVudF0gPSBhc3NldFxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICBpZiAoaW5kZXggPT0gaW1hZ2VMaXN0Lmxlbmd0aCkge1xuICAgIC8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycWFzZGFzYXNkYXNkMzNcIilcbiAgICAvLyAgICAgICAgICAgICAgICAgaW1hZ2VMaXN0LmZvckVhY2goKGVsZW1lbnQsIGltZ0luZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyA8aW1nIHNyYz0nZW1vamkxJy8+XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShgeyR7aW1nSW5kZXh9fWAsIGA8aW1nIHNyYz0nJHtlbGVtZW50fScvPmApXG4gICAgLy8gICAgICAgICAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCkuc3RyaW5nID0gc3RyXG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfSlcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxuICAgIC8qKuWbvueJh+OAgeaWh+WtlyDljrvoibIsMOWOn+iJsiAx5Y676ImyLOmAkuW9kiAqL1xuICAgIHNldFN0YXRlKG5vZGU6IGNjLk5vZGUsIHN0YXRlOiAwIHwgMSwgYWxsOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHVybCA9IHN0YXRlID09IDAgPyBcIjJkLXNwcml0ZVwiIDogXCIyZC1ncmF5LXNwcml0ZVwiXG4gICAgICAgIGlmIChhbGwpIHtcbiAgICAgICAgICAgIGxldCBzcHJpdGVzID0gbm9kZS5nZXRDb21wb25lbnRzSW5DaGlsZHJlbihjYy5TcHJpdGUpXG4gICAgICAgICAgICBsZXQgbGFiZWxzID0gbm9kZS5nZXRDb21wb25lbnRzSW5DaGlsZHJlbihjYy5MYWJlbClcbiAgICAgICAgICAgIHNwcml0ZXMuZm9yRWFjaChzcHJpdGUgPT4ge1xuICAgICAgICAgICAgICAgIHNwcml0ZS5zZXRNYXRlcmlhbCgwLCBjYy5NYXRlcmlhbC5nZXRCdWlsdGluTWF0ZXJpYWwodXJsKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgICAgICAgICAgICAgbGFiZWwuc2V0TWF0ZXJpYWwoMCwgY2MuTWF0ZXJpYWwuZ2V0QnVpbHRpbk1hdGVyaWFsKHVybCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc2V0TWF0ZXJpYWwoMCwgY2MuTWF0ZXJpYWwuZ2V0QnVpbHRpbk1hdGVyaWFsKHVybCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5nZXRDb21wb25lbnQoY2MuTGFiZWwpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBub2RlLmdldENvbXBvbmVudChjYy5MYWJlbCkuc2V0TWF0ZXJpYWwoMCwgY2MuTWF0ZXJpYWwuZ2V0QnVpbHRpbk1hdGVyaWFsKHVybCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogc3BpbmXliqjnlLvnva7ngbAgKi9cbiAgICBzZXRTcGluZVN0YXRlKG5vZGU6IGNjLk5vZGUsIGlzR3JheWVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChub2RlLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbikgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzR3JheWVkKSB7XG4gICAgICAgICAgICAgICAgY2MuYXNzZXRNYW5hZ2VyLmxvYWRCdW5kbGUoJ21hdGVyaWFscycsIChlcnIsIGJ1bmRsZTogY2MuQXNzZXRNYW5hZ2VyLkJ1bmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidW5kbGUubG9hZCgnZ3JheS1zcGluZScsIGNjLk1hdGVyaWFsLCAoZXJyLCBhc3NldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pLnNldE1hdGVyaWFsKDAsIGFzc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKS5zZXRNYXRlcmlhbCgwLCBjYy5NYXRlcmlhbC5nZXRCdWlsdGluTWF0ZXJpYWwoXCIyZC1zcGluZVwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoq5oyJ6ZKu54Gw5YyW77yM5Y+q5pyJ5rOo5YaMY2xpY2vkuovku7bvvIzmiY3kvJrnnJ/mraPooqvnpoHnlKggKi9cbiAgICBzZXRCdG5HcmF5U3RhdGUobm9kZTogY2MuTm9kZSwgaXNHcmF5OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBidXR0b24gPSBub2RlLmdldENvbXBvbmVudChjYy5CdXR0b24pO1xuICAgICAgICBpZiAoIWJ1dHRvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJ1dHRvbi5pbnRlcmFjdGFibGUgPSAhaXNHcmF5O1xuICAgICAgICBidXR0b24uZW5hYmxlQXV0b0dyYXlFZmZlY3QgPSBpc0dyYXk7XG4gICAgfVxuICAgIC8qKuWIpOaWreaMiemSruaYr+WQpuS4uuWkseaViOeKtuaAgSAqL1xuICAgIGlzQnRuR3JheShub2RlOiBjYy5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBidXR0b24gPSBub2RlLmdldENvbXBvbmVudChjYy5CdXR0b24pO1xuICAgICAgICBpZiAoIWJ1dHRvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhYnV0dG9uLmludGVyYWN0YWJsZTtcbiAgICB9XG4gICAgLyoq6IqC54K55rOo5YaM5LqL5Lu2ICovXG4gICAgb25SZWdpc3RlckV2ZW50KG5vZGU6IGNjLk5vZGUsIGNhbGxiYWNrLCB0YXJnZXQsIHBhcmFtczogYW55ID0gW10sIGF1ZGlvOiBBdWRpb0NvbnN0ID0gQXVkaW9Db25zdC5lZmZlY3RfY2xpY2spIHtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsgcmV0dXJuIH1cbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQ6IGNjLkV2ZW50LkV2ZW50VG91Y2gpIHtcbiAgICAgICAgICAgIC8vIOWIpOaWreS4i+aYr+WQpuacieaMiemSrue7hOS7tizmnInnmoTor50s5aaC5p6c5oyJ6ZKu5piv5pyq5r+A5rS754q25oCBLOWImeS4jeaJp+ihjOWbnuiwg+aWueazlVxuICAgICAgICAgICAgbGV0IGJ0biA9IG5vZGUuZ2V0Q29tcG9uZW50KGNjLkJ1dHRvbilcbiAgICAgICAgICAgIGlmIChidG4gJiYgYnRuLmludGVyYWN0YWJsZSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2IuYmluZCh0YXJnZXQpKGV2ZW50LCBwYXJhbXMpXG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5hdWRpby5wbGF5RWZmZWN0KGF1ZGlvKVxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgfVxuICAgICAgICBub2RlLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgY2FsbGJhY2ssIHRhcmdldClcbiAgICB9XG5cbiAgICAvKiroioLngrnlj5bmtojms6jlhozkuovku7YgKi9cbiAgICB1blJlZ2lzdGVyRXZlbnQobm9kZTogY2MuTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuIH1cbiAgICAgICAgbm9kZS5vZmYoY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5EKTtcbiAgICB9XG4gICAgLyoq6I635Y+W6IqC54K555qE5LiW55WM5Z2Q5qCHICovXG4gICAgZ2V0V29ybGRQb3Mobm9kZTogY2MuTm9kZSk6IGNjLlZlYzIge1xuICAgICAgICByZXR1cm4gbm9kZS5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MuVmVjMi5aRVJPKVxuICAgIH1cbiAgICBnZXRXb3JsZFBvc0NlbnRlcihub2RlOiBjYy5Ob2RlKTogY2MuVmVjMiB7XG4gICAgICAgIGxldCB2ZWMgPSBuZXcgY2MuVmVjMihub2RlLndpZHRoICogKDAuNSAtIG5vZGUuYW5jaG9yWCksIG5vZGUuaGVpZ2h0ICogKDAuNSAtIG5vZGUuYW5jaG9yWSkpXG4gICAgICAgIHJldHVybiBub2RlLmNvbnZlcnRUb1dvcmxkU3BhY2VBUih2ZWMpXG4gICAgfVxuICAgIC8qKuiuvue9ruiKgueCueWcqOS4lueVjOWdkOagh+ezu+S4i+eahOebuOWvueWdkOaghyAqL1xuICAgIHNldFdvcmxkUG9zKG5vZGU6IGNjLk5vZGUsIHBvczogY2MuVmVjMikge1xuICAgICAgICBsZXQgX3BvcyA9IG5vZGUucGFyZW50LmNvbnZlcnRUb05vZGVTcGFjZUFSKHBvcylcbiAgICAgICAgbm9kZS54ID0gX3Bvcy54XG4gICAgICAgIG5vZGUueSA9IF9wb3MueVxuICAgIH1cbiAgICAvKirojrflj5Zub2Rl5L2N5LqOdGFyZ2V055qE5Z2Q5qCH55u45a+55Z2Q5qCHICovXG4gICAgZ2V0UG9zaXRpb25JblZpZXcobm9kZTogY2MuTm9kZSwgdGFyZ2V0OiBjYy5Ob2RlKTogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9IHtcbiAgICAgICAgbGV0IHdvcmxkUG9zID0gbm9kZS5wYXJlbnQuY29udmVydFRvV29ybGRTcGFjZUFSKG5vZGUucG9zaXRpb24pO1xuICAgICAgICBsZXQgdmlld1BvcyA9IHRhcmdldC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZFBvcyk7XG4gICAgICAgIHJldHVybiB2aWV3UG9zO1xuICAgIH1cbiAgICAvKirpgJrov4duYW1l5LuO5qC56IqC54K56YCS5b2S6I635Y+Wbm9kZSAqL1xuICAgIGdldFRhcmdldE5vZGVCeU5hbWUocm9vdDogY2MuTm9kZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChyb290Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3RcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcm9vdC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGxldCB0YXJnZXROb2RlID0gdGhpcy5nZXRUYXJnZXROb2RlQnlOYW1lKGNoaWxkLCBuYW1lKVxuICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXROb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgLy8g6YCS5b2S5omA5pyJ5a2Q6IqC54K55bm25LiU5pu05paw6IqC54K55YiG57uEXG4gICAgc2V0Tm9kZUFsbEdyb3Vwcyhub2RlOiBjYy5Ob2RlLCBncm91cDogc3RyaW5nKSB7XG4gICAgICAgIC8vIOWumuS5ieS4gOS4quWbnuiwg+WHveaVsO+8jOi/meS4quWHveaVsOWwhuWvueavj+S4quiKgueCueaJp+ihjOaTjeS9nFxuICAgICAgICBsZXQgbXlDYWxsYmFjayA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyDlnKjov5nph4zlpITnkIboioLngrlcbiAgICAgICAgICAgIG5vZGUuZ3JvdXAgPSBncm91cFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOW8gOWni+mAkuW9kumBjeWOhlxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZVRyYXZlcnNlQ2hpbGRyZW4obm9kZSwgbXlDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLy8g6YCS5b2S6YGN5Y6G5omA5pyJ5a2Q6IqC54K5XG4gICAgcmVjdXJzaXZlVHJhdmVyc2VDaGlsZHJlbihub2RlOiBjYy5Ob2RlLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgLy8g5a+55b2T5YmN6IqC54K55omn6KGM5Zue6LCD5Ye95pWwXG4gICAgICAgIGNhbGxiYWNrKG5vZGUpO1xuXG4gICAgICAgIC8vIOmBjeWOhuW9k+WJjeiKgueCueeahOaJgOacieWtkOiKgueCuVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIOmAkuW9kumBjeWOhuWtkOiKgueCuVxuICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVUcmF2ZXJzZUNoaWxkcmVuKG5vZGUuY2hpbGRyZW5baV0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDlronljZPorr7lpIfnmoTpgILphY3lnKjkuLthY3Rpdml0eeS4reaJp+ihjFxuICAgIC8vIGlvc+iuvuWkhyzpnIDopoHlnKjmuLjmiI/kuK3kv67mlLl3aWRnZXRcbiAgICAvLyDov5Tlm57mmK/lkKbkuLrliJjmtbcs5Lul5Y+K5YiY5rW36auY5bqmXG4gICAgaXNMaXVoYWkoKTogW2Jvb2xlYW4sIG51bWJlcl0ge1xuICAgICAgICBsZXQgaXNMaXVoYWkgPSBmYWxzZVxuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5nZXRMaXVoYWlIZWlnaHQoKVxuICAgICAgICBpZiAoY2Muc3lzLm9zID09IGNjLnN5cy5PU19JT1MpIHtcbiAgICAgICAgICAgIGxldCBfaXNMaXVoYWkgPSBqc2IucmVmbGVjdGlvbi5jYWxsU3RhdGljTWV0aG9kKCdTREtXcmFwcGVyJywgJ2lzTGl1aGFpOicsICcnKVxuICAgICAgICAgICAgaXNMaXVoYWkgPSBfaXNMaXVoYWkgPT0gXCIxXCJcbiAgICAgICAgfSBlbHNlIGlmIChjYy5zeXMub3MgPT0gY2Muc3lzLk9TX0FORFJPSUQpIHtcbiAgICAgICAgICAgIGxldCBfaXNMaXVoYWkgPSBqc2IucmVmbGVjdGlvbi5jYWxsU3RhdGljTWV0aG9kKFwib3JnL2NvY29zMmR4L2phdmFzY3JpcHQvQXBwQWN0aXZpdHlcIiwgXCJnZXRJc0xpdWhhaVwiLCBcIigpTGphdmEvbGFuZy9TdHJpbmc7XCIpO1xuICAgICAgICAgICAgaXNMaXVoYWkgPSBfaXNMaXVoYWkgPT0gXCIxXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2lzTGl1aGFpLCBoZWlnaHRdXG4gICAgfVxuICAgIC8qKuiOt+WPluWxj+W5lemrmOW6piAqL1xuICAgIGdldFdpbkhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIGNjLndpblNpemUuaGVpZ2h0IC8vLSB0aGlzLmdldExpdWhhaUhlaWdodCgpXG4gICAgfVxuICAgIGdldExpdWhhaUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfSU9TKSB7XG4gICAgICAgICAgICAgICAgbGV0IF9oZWlnaHQgPSBqc2IucmVmbGVjdGlvbi5jYWxsU3RhdGljTWV0aG9kKCdTREtXcmFwcGVyJywgJ2dldExpdWhhaUhlaWdodDonLCAnJyk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gTnVtYmVyKF9oZWlnaHQpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNjLnN5cy5vcyA9PSBjYy5zeXMuT1NfQU5EUk9JRCkge1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGpzYi5yZWZsZWN0aW9uLmNhbGxTdGF0aWNNZXRob2QoXCJvcmcvY29jb3MyZHgvamF2YXNjcmlwdC9BcHBBY3Rpdml0eVwiLCBcImdldExpdWhhaUhlaWdodFwiLCBcIigpSVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBoZWlnaHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBoZWlnaHRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0XG4gICAgfVxuICAgIC8qKuiOt+WPlumAgumFjXNjYWxlICovXG4gICAgZ2V0V2lkZ2h0U2NhbGUoaGVpZ2h0OiBudW1iZXIgPSBjYy53aW5TaXplLmhlaWdodCk6IG51bWJlciB7XG4gICAgICAgIGxldCBkZWZhdWx0QmlsaSA9IDE5MjAgLyAxMDgwXG4gICAgICAgIGxldCByZWFsQmlsaSA9IGhlaWdodCAvIGNjLndpblNpemUud2lkdGggLy/pq5jlrr3mr5RcbiAgICAgICAgcmV0dXJuIDEgKyAocmVhbEJpbGkgLSBkZWZhdWx0QmlsaSlcbiAgICB9XG5cbiAgICAvLyAvL+WwhuWtl+espui9rOS4uuihqOaDhVxuICAgIC8vIFRyYW5zZm9ybWF0aW9uU3RyKHRleHQpIHtcbiAgICAvLyAgICAgbGV0IHJpY2hUZXh0ID0gXCJcIjtcbiAgICAvLyAgICAgdmFyIGFyciA9IHRleHQuc3BsaXQoXCIjXCIpO1xuICAgIC8vICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgaWYgKGkgPj0gMSkge1xuICAgIC8vICAgICAgICAgICAgIGxldCBzdHIgPSBhcnJbaV0uc2xpY2UoMCwgNSlcbiAgICAvLyAgICAgICAgICAgICBsZXQgc3RyMSA9IGFycltpXS5zbGljZSg1KVxuICAgIC8vICAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoTG9hZC5nZXRFbW9qaShzdHIpKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICByaWNoVGV4dCArPSBgIyR7c3RyICsgc3RyMX1gXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgcmljaFRleHQgKz0gYDxpbWcgc3JjPScke3N0cn0nLz4ke3N0cjF9YFxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgcmljaFRleHQgKz0gYXJyW2ldXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHJpY2hUZXh0XG4gICAgLy8gfVxuXG4gICAgLyoq5Y6f6KGo5a+M5paH5pys5qih5byP6L2s5o2i5oiQ5YmN56uv5a+M5paH5pys5qih5byPKi9cbiAgICBnZXRDb252ZXJzaW9uU3RyKHRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgdGVtcFN0ciA9ICcnXG4gICAgICAgIGxldCBzdHIgPSAnJ1xuICAgICAgICBsZXQgYXJyID0gdGV4dC5zcGxpdCgnJyk7XG4gICAgICAgIGxldCBpc0NvbG9yOiBib29sZWFuID0gZmFsc2VcbiAgICAgICAgbGV0IGlzVmFsdWU6IGJvb2xlYW4gPSB0cnVlXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnJbaV0gPT0gJzwnKSB7XG4gICAgICAgICAgICAgICAgdGVtcFN0ciA9ICcnXG4gICAgICAgICAgICAgICAgaXNDb2xvciA9IHRydWVcbiAgICAgICAgICAgICAgICBpc1ZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGVtcFN0ciArPSBhcnJbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFycltpXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbXBTdHIgPT0gJzxkaXYgZm9udGNvbG9yPScpIHtcbiAgICAgICAgICAgICAgICB0ZW1wU3RyID0gJzxjb2xvcj0jJ1xuICAgICAgICAgICAgICAgIHN0ciArPSB0ZW1wU3RyXG4gICAgICAgICAgICAgICAgaXNDb2xvciA9IGZhbHNlXG4gICAgICAgICAgICAgICAgaXNWYWx1ZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZW1wU3RyID09ICc8L2Rpdj4nKSB7XG4gICAgICAgICAgICAgICAgdGVtcFN0ciA9ICc8L2NvbG9yPidcbiAgICAgICAgICAgICAgICBzdHIgKz0gdGVtcFN0clxuICAgICAgICAgICAgICAgIGlzQ29sb3IgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGlzVmFsdWUgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyXG4gICAgfVxuICAgIC8qKuWOn+ihqOaIkOWJjeerryovXG4gICAgZ2V0VHlwZVN0cih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHN0ciA9IHRleHQucmVwbGFjZSgvPGRpdiBmb250Y29sb3I9Iy9nLCAnPGNvbG9yPSMnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzxkaXYgZm9udGNvbG9yPS9nLCAnPGNvbG9yPSMnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzxcXC9kaXY+L2csICc8L2NvbG9yPicpXG4gICAgICAgIHJldHVybiBzdHJcbiAgICB9XG5cbiAgICAvLyBnZXRFcHNTdHJBcnIoZXBzOiBYeVMuRXBzIHwgRXBzUGV0KSB7XG4gICAgLy8gICAgIGxldCBiYWs6IHtcbiAgICAvLyAgICAgICAgIGVrOiBzdHJpbmcsXG4gICAgLy8gICAgICAgICBudW06IG51bWJlcixcblxuICAgIC8vICAgICAgICAgZWtTaG93OiBzdHJpbmcsIC8v5ZCN56ewXG4gICAgLy8gICAgICAgICBudW1TaG93OiBudW1iZXIsIC8v5bGV56S65pWw5YC8XG4gICAgLy8gICAgICAgICBzdWZmaXg6IHN0cmluZywgLy/lkI7nvIBcbiAgICAvLyAgICAgfVtdID0gW11cblxuICAgIC8vICAgICAvL+mBjeWOhumFjee9rlxuICAgIC8vICAgICBmb3IgKGNvbnN0IGtleSBpbiBlcHMpIHtcbiAgICAvLyAgICAgICAgIGxldCBhcnJ0ID0gZ2FtZUNmZy5hdHRyLnBvb2xbYCR7a2V5fV9gXVxuICAgIC8vICAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkoYXJydCkpIHtcbiAgICAvLyAgICAgICAgICAgICBzd2l0Y2ggKGFycnQudGlwKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2F0ayc6Ly/mlLvlh7tcdOinkuiJsueahOeJqeeQhuaUu+WHu+iDveWKm1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkZWZfcCc6Ly/nianpmLJcdOinkuiJsuaKteaKl+eJqeeQhuaUu+WHu+eahOiDveWKm1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkZWZfcyc6Ly/ms5XpmLJcdOinkuiJsuaKteaKl+azleacr+aUu+WHu+eahOiDveWKm1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdocF9tYXgnOi8v55Sf5ZG9XHTop5LoibLnmoTnlJ/lkb3kuIrpmZDlgLxcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnaHAnOi8v55Sf5ZG9XHTop5LoibLlvZPliY3nmoTnlJ/lkb3lgLxcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnc3BlZWQnOi8v6YCf5bqmXHTlhrPlrprljZXkvY3lnKjmiJjmlpfkuK3nmoTlh7rmiYvpopHnjodcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnZGVmJzovL+mYsuW+oVx06KeS6Imy5oq15oqX54mp55CG5ZKM5rOV5pyv5pS75Ye755qE6IO95YqbXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvL+aVsOWAvOebtOaOpeWxleekulxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgYmFrLnB1c2goe1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGVrOiBhcnJ0LnRpcCxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBudW06IGVwc1thcnJ0LnRpcF0sXG5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBla1Nob3c6IGFycnQubmFtZSwgLy/lkI3np7BcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBudW1TaG93OiBlcHNbYXJydC50aXBdLCAvL+WxleekuuaVsOWAvFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeDogJyUnLCAvL+WQjue8gFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdoaXRfcmF0ZSc6Ly/lkb3kuK1cdOaIkOWKn+mAoOaIkOS8pOWus+eahOamgueOh1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkb2RnZV9yYXRlJzovL+mXqui6slx06Lqy6YG/5Lyk5a6z55qE5qaC546HXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2NyaXRfcmF0ZSc6Ly/mmrTlh7vnjodcdOaUu+WHu+aWueS6p+eUn+aatOWHu+eahOamgueOh1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdjcml0X3JhdGlvJzovL+aatOS8pFx05pq05Ye75Lqn55Sf5pe277yM5Lyk5a6z55qE5Y+Y5YyW5q+U5L6LXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2hpdF9tYWdpYyc6Ly/mjqfliLZcdOWinuW8uuaKgOiDveaViOaenOWRveS4reeahOavlOS+i1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkb2RnZV9tYWdpYyc6Ly/mipfmjqdcdOaKteaKl+aKgOiDveaViOaenOWRveS4reeahOavlOS+i1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICd0ZW5hY2l0eSc6Ly/mipfmmrRcdOWPl+WHu+aWueiiq+aatOWHu+amgueOh+mZjeS9jlxuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdhdGtfcGVyJzovL+aUu+WHu1x055m+5YiG5q+U5aKe5Yqg5Y2V5L2N55qE5pS75Ye75YqbXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2RlZl9wZXInOi8v6Ziy5b6hXHTnmb7liIbmr5Tlop7liqDljZXkvY3nmoTniannkIbpmLLlvqHlkozms5XmnK/pmLLlvqFcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnaHBfbWF4X3Blcic6Ly/nlJ/lkb1cdOeZvuWIhuavlOWinuWKoOWNleS9jeeahOeUn+WRveS4iumZkFxuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkYW0nOi8v5Lyk5a6z5Yqg5oiQXHTljYPliIbmr5Tlop7liqDpgKDmiJDnmoTkvKTlrrNcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAncmVzJzovL+WFjeS8pFx05Y2D5YiG5q+U5YeP5bCR5Y+X5Yiw55qE5Lyk5a6zXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2N1cmUnOi8v5rK755aXXHTljYPliIbmr5Tlop7lh4/msrvnlpfliKvkurrnmoTmlYjmnpxcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnYmVfY3VyZSc6Ly/lj5fnlpdcdOWNg+WIhuavlOWinuWHj+WPl+WIsOeahOayu+eWl+aViOaenFxuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkYW1fcCc6Ly/niankvKRcdOWNg+WIhuavlOWinuWKoOmAoOaIkOeahOeJqeeQhuS8pOWus1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdkYW1fcyc6Ly/ms5XkvKRcdOWNg+WIhuavlOWinuWKoOmAoOaIkOeahOazleacr+S8pOWus1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdyZXNfcCc6Ly/nianlhY1cdOWNg+WIhuavlOWHj+WwkeWPl+WIsOeahOeJqeeQhuS8pOWus1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdyZXNfcyc6Ly/ms5XlhY1cdOWNg+WIhuavlOWHj+WwkeWPl+WIsOeahOazleacr+S8pOWus1xuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdzcGVlZF9wZXInOi8v6YCf5bqmXHTlhrPlrprljZXkvY3lnKjmiJjmlpfkuK3nmoTlh7rmiYvpopHnjodcbiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnZGVmX3BfcGVyJzovL+eJqemYslx05Y2D5YiG5q+U5aKe5Yqg5Y2V5L2N55qE54mp55CG6Ziy5b6hXG4gICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2RlZl9zX3Blcic6Ly/ms5XpmLJcdOWNg+WIhuavlOWinuWKoOWNleS9jeeahOazleacr+mYsuW+oVxuICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICd0b3VnaG5lc3MnOi8v6Z+n5oCnXHTljYPliIbmr5Tlh4/lhY3mjIHnu63kvKTlrrPnsbvotJ/pnaLmlYjmnpzluKbmnaXnmoTkvKTlrrNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8v5pWw5YC855m+5YiG5q+U5Yqg5oiQXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBiYWsucHVzaCh7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgZWs6IGFycnQudGlwLFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG51bTogZXBzW2FycnQudGlwXSxcblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGVrU2hvdzogYXJydC5uYW1lLCAvL+WQjeensFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNob3c6IGVwc1thcnJ0LnRpcF0gLyAxMCwgLy/lsZXnpLrmlbDlgLxcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg6ICclJywgLy/lkI7nvIBcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gYmFrXG4gICAgLy8gfVxuXG4gICAgLyoqIOaJk+Wtl+aViOaenCAqL1xuICAgIHR5cGluZ0FuaShsYWJlbDogY2MuTGFiZWwgfCBjYy5SaWNoVGV4dCwgdGV4dDogc3RyaW5nLCB0aW1lOiBudW1iZXIgPSAxIC8gNjAsIGNiOiBGdW5jdGlvbiA9ICgpID0+IHsgfSkge1xuICAgICAgICBpZiAoIXRleHQgfHwgdGV4dC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgICBsZXQgdGVtcFN0ciA9ICcnXG4gICAgICAgIGxldCB0ZW1wQ29sb3JTdHIgPSAnJ1xuICAgICAgICBsZXQgc3RyOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGxldCBhcnIgPSB0ZXh0LnNwbGl0KCcnKTtcbiAgICAgICAgbGV0IGxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIGxldCBzdGVwID0gMDtcbiAgICAgICAgbGV0IGlzQ29sb3I6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICBsZXQgaXNWYWx1ZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICAgICAgaWYgKGxhYmVsIGluc3RhbmNlb2YgY2MuUmljaFRleHQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldID09ICc8Jykge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29sb3JTdHIgPSAnJ1xuICAgICAgICAgICAgICAgICAgICBpc1ZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyID0gYCR7dGVtcENvbG9yU3RyfSR7YXJyW2ldfTwvY29sb3I+YFxuICAgICAgICAgICAgICAgICAgICBzdHIucHVzaCh0ZW1wU3RyKVxuICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyID0gJydcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldID09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICBpc0NvbG9yID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhcnJbaV0gPT0gJz4nICYmIHRlbXBDb2xvclN0ciAhPSAnJykge1xuICAgICAgICAgICAgICAgICAgICBpc0NvbG9yID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgaXNWYWx1ZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbG9yU3RyID0gYDxjb2xvcj0ke3RlbXBDb2xvclN0cn0+YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29sb3JTdHIgKz0gYXJyW2ldXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhcnIgPSBzdHJcbiAgICAgICAgICAgIGxlbiA9IHN0ci5sZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0eXBpbmdGdW5jID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0ZXAgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwudW5zY2hlZHVsZSh0eXBpbmdGdW5jKTtcbiAgICAgICAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBodG1sICs9IGFycltzdGVwXTtcbiAgICAgICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSBodG1sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGVwKytcbiAgICAgICAgfVxuICAgICAgICBsYWJlbC5zY2hlZHVsZSh0eXBpbmdGdW5jLCB0aW1lLCBsZW4pXG4gICAgfVxuICAgIC8qKiDlr4zmlofmnKzmiZPlrZfmlYjmnpwgKi9cbiAgICB0eXBpbmdSaWNoKGxhYmVsOiBjYy5SaWNoVGV4dCwgdGV4dDogc3RyaW5nLCB3b3Jkc051bTogbnVtYmVyLCB0aW1lOiBudW1iZXIgPSAxIC8gNjAsIGNiOiBGdW5jdGlvbiA9ICgpID0+IHsgfSkge1xuICAgICAgICBpZiAoIXRleHQgfHwgdGV4dC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0ciA9IHRleHQ7XG4gICAgICAgIGxldCBjaGFyQXJyID0gc3RyLnJlcGxhY2UoLzwuKz9cXC8/Pi9nLCAnJykuc3BsaXQoJycpO1xuICAgICAgICBsZXQgdGVtcFN0ckFyciA9IFtzdHJdLFxuICAgICAgICAgICAgY3Vyc3RyID0gc3RyO1xuICAgICAgICBmb3IgKGxldCBpID0gY2hhckFyci5sZW5ndGg7IGkgPiAxOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBsYXN0SWR4ID0gY3Vyc3RyLmxhc3RJbmRleE9mKGNoYXJBcnJbaSAtIDFdKTtcbiAgICAgICAgICAgIGxldCBwcmV2c3RyID0gY3Vyc3RyLnNsaWNlKDAsIGxhc3RJZHgpO1xuICAgICAgICAgICAgbGV0IG5leHRzdHIgPSBjdXJzdHIuc2xpY2UobGFzdElkeCArIDEsIGN1cnN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKChpIC0gMSkgJSB3b3Jkc051bSA9PSAwKSB0ZW1wU3RyQXJyLnB1c2gocHJldnN0ciArIG5leHRzdHIpO1xuICAgICAgICAgICAgY3Vyc3RyID0gcHJldnN0ciArIG5leHRzdHJcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RlcCA9IDAsXG4gICAgICAgICAgICBsZW4gPSB0ZW1wU3RyQXJyLmxlbmd0aDtcbiAgICAgICAgbGV0IHR5cGluZ0Z1bmMgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RlcCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICBsYWJlbC51bnNjaGVkdWxlKHR5cGluZ0Z1bmMpO1xuICAgICAgICAgICAgICAgIGNiICYmIGNiKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhYmVsLnN0cmluZyA9IHRlbXBTdHJBcnIucG9wKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXArK1xuICAgICAgICB9XG4gICAgICAgIGxhYmVsLnNjaGVkdWxlKHR5cGluZ0Z1bmMsIHRpbWUsIGxlbilcbiAgICAgICAgdHlwaW5nRnVuYygpXG4gICAgfVxuICAgIC8vIC8qKiBcbiAgICAvLyAgKiBAZGVzY3JpcHRpb24657uZ6ZyA6KaB54K55Ye75Zue6LCD55qEUmljaFRleHTmt7vliqDlm57osIPohJrmnKxcbiAgICAvLyAgKiBAcGFyYW0ge3R5cGV9IG5vZGUg5YyF5ZCrUmljaFRleHTnu4Tku7bnmoROb2RlXG4gICAgLy8gICogQHBhcmFtIHt0eXBlfSBjb21wb25lbnQg6ZyA6KaB5aSE55CG54K55Ye75LqL5Lu255qE6ISa5pysXG4gICAgLy8gICogQHJldHVybiB7dHlwZX1cbiAgICAvLyAgKi9cbiAgICAvLyBjcmVhdGVSaWNoVGV4dENhbGxiYWNrKG5vZGUsIGNvbXBvbmVudCkge1xuICAgIC8vICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KG5vZGUpKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcIm5vZGUgbXVzdCBiZSBjYy5Ob2RlISEhXCIpO1xuICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGxldCByaWNoVGV4dCA9IG5vZGUuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAvLyAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShyaWNoVGV4dCkpIHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwibm9kZSBtdXN0IGhhdmUgUmljaFRleHQgY29tcG9uZW50ISEhXCIpO1xuICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGxldCBzdCA9IG5vZGUuYWRkQ29tcG9uZW50KFJpY2hUZXh0RXZlbnQpO1xuICAgIC8vICAgICBzdC5zZXRPYmplY3QoY29tcG9uZW50KTtcbiAgICAvLyB9XG4gICAgLy8gLyoqIFxuICAgIC8vICAqIEBkZXNjcmlwdGlvbjrojrflj5bmioDog71idWZm5o+P6L+wXG4gICAgLy8gICogQHBhcmFtIHt0eXBlfSBidWZmSWQg6ZyA6KaB5aSE55CG54K55Ye75LqL5Lu255qE6ISa5pysXG4gICAgLy8gICogQHJldHVybiB7dHlwZX1cbiAgICAvLyAgKi9cbiAgICAvLyBnZXRCdWZmRGVzYyhidWZmSWQ6IHN0cmluZywgd2l0aFRpdGxlOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgLy8gICAgIGxldCBjb25mID0gZ2FtZUNmZy5za2lsbF9hbGxfYnVmZi5nZXRJdGVtKGJ1ZmZJZClcbiAgICAvLyAgICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCIgYnVmZiBpbmZvIGlzIG5vdCBleGlzdCEhIVwiKTtcbiAgICAvLyAgICAgICAgIHJldHVybiBcIlwiXG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgaWYgKHdpdGhUaXRsZSkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIGA8Y29sb3I9IzI0QjZDQj5bJHtjb25mLm5hbWV9XTwvYz5cXG4ke2NvbmYuZGVzY31gXG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGNvbmYuZGVzY1xuICAgIC8vIH1cblxuICAgIC8v57uZIHNwaW5lwqDph43mlrDmi7fotJ3kuIDku73CoHNrZWxldG9uRGF0YcKg5pWw5o2u77yM6K6p5LuW5Lus5LiN6YeN5aSNXG4gICAgcHVibGljIGNvcHlTcGluZShza2VsZXRvbjogc3AuU2tlbGV0b24pIHtcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAvLyDorrDlvZXlvZPliY3mkq3mlL7nmoTliqjnlLtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gc2tlbGV0b24uYW5pbWF0aW9uXG4gICAgICAgIGNvbnN0IHNwZGF0YSA9IHNrZWxldG9uLnNrZWxldG9uRGF0YTtcbiAgICAgICAgbGV0IGNvcHkgPSBuZXcgc3AuU2tlbGV0b25EYXRhKCk7XG4gICAgICAgIGNjLmpzLm1peGluKGNvcHksIHNwZGF0YSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29weS5fdXVpZCA9IHNwZGF0YS5fdXVpZCArIFwiX1wiICsgZGF0ZS5nZXRUaW1lKCkgKyBcIl9jb3B5XCI7XG4gICAgICAgIGxldCBvbGQgPSBjb3B5Lm5hbWU7XG4gICAgICAgIGxldCBuZXdOYW1lID0gY29weS5uYW1lICsgXCJfY29weVwiO1xuICAgICAgICBjb3B5Lm5hbWUgPSBuZXdOYW1lO1xuICAgICAgICBjb3B5LmF0bGFzVGV4dCA9IGNvcHkuYXRsYXNUZXh0LnJlcGxhY2Uob2xkLCBuZXdOYW1lKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb3B5LnRleHR1cmVOYW1lc1swXSA9IG5ld05hbWUgKyBcIi5wbmdcIjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb3B5LmluaXQgJiYgY29weS5pbml0KCk7XG4gICAgICAgIHNrZWxldG9uLnNrZWxldG9uRGF0YSA9IGNvcHk7XG4gICAgICAgIC8vIOe7p+e7reaSreaUvueahOWKqOeUu++8jOS4jeeEtuS8muWBnOatolxuICAgICAgICBza2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYW5pbWF0aW9uLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICog55So5aSW6YOo5Zu+54mH5bGA6YOo5o2i6KOFXG4gICAgICAgICAqIEBwYXJhbSBza2VsZXRvbiAgIOmqqOmqvOWKqOeUu1xuICAgICAgICAgKiBAcGFyYW0gc2xvdE5hbWUgIOmcgOimgeabv+aNoueahOaPkuanveWQjeensFxuICAgICAgICAgKiBAcGFyYW0gdGV4dHVyZSAgIOWklumDqOWbvueJh1xuICAgICAgICAgKi9cbiAgICBwdWJsaWMgY2hhbmdlU2xvdChza2VsZXRvbjogc3AuU2tlbGV0b24sIHNsb3ROYW1lOiBzdHJpbmcsIHRleHR1cmU6IGNjLlRleHR1cmUyRCkge1xuICAgICAgICBpZiAoY2Muc3lzLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgY29uc3Qgc2xvdDogc3Auc3BpbmUuU2xvdCA9IHNrZWxldG9uLmZpbmRTbG90KHNsb3ROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQ6IHNwLnNwaW5lLlJlZ2lvbkF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKSBhcyBzcC5zcGluZS5SZWdpb25BdHRhY2htZW50O1xuICAgICAgICAgICAgaWYgKCFzbG90IHx8ICFhdHRhY2htZW50KSB7XG4gICAgICAgICAgICAgICAgY2MuZXJyb3IoJ3VwZGF0ZVBhcnRpYWxTa2luJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBza2VsZXRvblRleHR1cmUgPSBuZXcgc3AuU2tlbGV0b25UZXh0dXJlKHt9KTtcbiAgICAgICAgICAgIHNrZWxldG9uVGV4dHVyZS5zZXRSZWFsVGV4dHVyZSh0ZXh0dXJlKTtcblxuICAgICAgICAgICAgbGV0IHJlZ2lvbjogc3Auc3BpbmUuVGV4dHVyZUF0bGFzUmVnaW9uID0gYXR0YWNobWVudC5yZWdpb24gYXMgc3Auc3BpbmUuVGV4dHVyZUF0bGFzUmVnaW9uO1xuICAgICAgICAgICAgcmVnaW9uLnUgPSAwO1xuICAgICAgICAgICAgcmVnaW9uLnYgPSAwO1xuICAgICAgICAgICAgcmVnaW9uLnUyID0gMTtcbiAgICAgICAgICAgIHJlZ2lvbi52MiA9IDE7XG4gICAgICAgICAgICByZWdpb24ud2lkdGggPSB0ZXh0dXJlLndpZHRoICogNTtcbiAgICAgICAgICAgIHJlZ2lvbi5oZWlnaHQgPSB0ZXh0dXJlLmhlaWdodCAqIDU7XG4gICAgICAgICAgICByZWdpb24ub3JpZ2luYWxXaWR0aCA9IHRleHR1cmUud2lkdGggKiA1O1xuICAgICAgICAgICAgcmVnaW9uLm9yaWdpbmFsSGVpZ2h0ID0gdGV4dHVyZS5oZWlnaHQgKiA1O1xuICAgICAgICAgICAgcmVnaW9uLnJvdGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVnaW9uLnRleHR1cmUgPSBza2VsZXRvblRleHR1cmU7XG5cbiAgICAgICAgICAgIGF0dGFjaG1lbnQud2lkdGggPSB0ZXh0dXJlLndpZHRoICogNTtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuaGVpZ2h0ID0gdGV4dHVyZS5oZWlnaHQgKiA1O1xuICAgICAgICAgICAgYXR0YWNobWVudC5yZWdpb24gPSByZWdpb247XG4gICAgICAgICAgICBhdHRhY2htZW50LnNldFJlZ2lvbiAmJiBhdHRhY2htZW50LnNldFJlZ2lvbihyZWdpb24pXG4gICAgICAgICAgICBhdHRhY2htZW50LnVwZGF0ZU9mZnNldCAmJiBhdHRhY2htZW50LnVwZGF0ZU9mZnNldCgpO1xuXG4gICAgICAgICAgICAvLyBhdHRhY2htZW50LnVwZGF0ZVVWcyAmJiBhdHRhY2htZW50LnVwZGF0ZVVWcyhhdHRhY2htZW50KTtcblxuICAgICAgICAgICAgc2xvdC5zZXRBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBqc2JUZXggPSBuZXcgbWlkZGxld2FyZS5UZXh0dXJlMkQoKTtcbiAgICAgICAgICAgIGpzYlRleC5zZXRQaXhlbHNIaWdoKHRleHR1cmUuaGVpZ2h0ICogNSk7XG4gICAgICAgICAgICBqc2JUZXguc2V0UGl4ZWxzV2lkZSh0ZXh0dXJlLndpZHRoICogNSk7XG4gICAgICAgICAgICBqc2JUZXguc2V0TmF0aXZlVGV4dHVyZSh0ZXh0dXJlLmdldEltcGwoKSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBza2VsZXRvbi51cGRhdGVSZWdpb24oc2xvdE5hbWUsIGpzYlRleCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gIHNrZWxldG9uIOWmguaenOS9v+eUqOS6hue8k+WtmOaooeW8j+WImemcgOimgeWIt+aWsOe8k+WtmFxuICAgICAgICBza2VsZXRvbi5pbnZhbGlkQW5pbWF0aW9uQ2FjaGUoKTtcbiAgICB9XG5cbiAgICAvLyDnp7vpmaTmiYDmnInlrZDoioLngrlcbiAgICBkZXN0b3J5QWxsQ2hpbGRyZW4obm9kZTogY2MuTm9kZSkge1xuICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8g5qC55o2u5ZOB6LSo6I635Y+W6aKc6ImyXG4gICAgZ2V0Q29sb3JCeVB6KHBpbnpoaTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIC8vIOWTgei0qDHCtzjnmoTvvIw555G25YWJ55qE6Ieq5bex5ou8XG4gICAgICAgIHN3aXRjaCAoTnVtYmVyKHBpbnpoaSkpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyNCM0IzQjMnXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcjODFCNThCJ1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiAnIzdDQUNDRidcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyNBNzdDQzUnXG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcjRTZBNzZBJ1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHJldHVybiAnI0U3QzQ1QSdcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyNENDVGNTknXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcjNzZERUU0J1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHJldHVybiAnI0VCOTFGMCdcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcjRkY2NkQ5J1xuICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyM5OEYyMkUnXG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnI0ZGQ0MxOSdcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcjRkZGRkZGJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIC8vIOagueaNruWTgei0qOiOt+WPluminOiJslxuICAgIC8vICBzZXRDb2xvclR4dEJ5UHoodHh0OnN0cmluZyxwaW56aGk6IG51bWJlciB8IHN0cmluZykge1xuICAgIC8vICAgICBsZXQgY29sb3IgPSB0aGlzLmdldENvbG9yQnlQeihwaW56aGkpO1xuICAgIC8vICAgICBsZXQgc3RyID0gYFtjb2xvcj0ke2NvbG9yfV1gXG4gICAgLy8gfVxuXG4gICAgLy8g5qC55o2u5ZOB6LSo6I635Y+W5ZCN56ewXG4gICAgZ2V0TmFtZUJ5UHoocGluemhpOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIEkxOG4uZ2V0STE4bkxhbmcoYHpoZW5mYV9waW56aGlfbmFtZV8ke3BpbnpoaX1gKTtcbiAgICB9XG5cbiAgICBnZXRFbm91Z2hDb2xvcihpc2Vub3VnaDogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gaXNlbm91Z2ggPyBcIjZmZGY4OVwiIDogXCJFNDU4NDlcIlxuICAgIH1cblxuICAgIC8vIOS/ruato+aWh+Wtl+W4g+WxgFxuICAgIGZpeE5hbWUobXNnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBpZiAobXNnLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgIC8vICAgICByZXR1cm4gbXNnXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gbGV0IG91dCA9IFwiXCJcbiAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1zZy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgLy8gICAgIG91dCArPSBtc2dbaW5kZXhdXG4gICAgICAgIC8vICAgICAvLyDmt7vliqDnqbrmoLxcbiAgICAgICAgLy8gICAgIGlmIChpbmRleCArIDEgPT0gbXNnLmxlbmd0aCkge1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBpZiAobXNnLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIC8vICAgICAgICAgb3V0ICs9IFwiICAgICAgIFwiXG4gICAgICAgIC8vICAgICB9IGVsc2UgaWYgKG1zZy5sZW5ndGggPT0gMykge1xuICAgICAgICAvLyAgICAgICAgIG91dCArPSBcIiAgXCJcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIHJldHVybiBvdXQ7XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuXG4gICAgLy8gY29jb3PnlLvluIPnmoToioLngrnkvY3nva7kv6Hmga/ovazljJbkuLrlvq7kv6HnlLvluIPkvY3nva7kv6Hmga9cbiAgICBnZXRXeEJ0blBvcyhub2RlOiBmZ3VpLkdPYmplY3QpOiB7IGxlZnQ6IG51bWJlciwgdG9wOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgdmlzaWJsZVNpemUgPSBjYy52aWV3LmdldFZpc2libGVTaXplKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT12aXNpYmxlU2l6ZT09XCIsIHZpc2libGVTaXplLndpZHRoLCB2aXNpYmxlU2l6ZS5oZWlnaHQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT1wb3NpdGlvbj09XCIsIG5vZGUubm9kZS5wb3NpdGlvbilcbiAgICAgICAgLy8gbGV0IHdvcmxkUG9zID0gRm9ybXVsYUNvbS5nZXRXb3JsZFBvcyhub2RlLm5vZGUpXG4gICAgICAgIGxldCB3b3JsZFBvcyA9IGZndWkuR1Jvb3QuaW5zdC5sb2NhbFRvR2xvYmFsKG5vZGUueCwgbm9kZS55KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj09Zmd1aSB3b3JsZFBvcz09XCIsIGZndWkuR1Jvb3QuaW5zdC5sb2NhbFRvR2xvYmFsKG5vZGUueCwgbm9kZS55KSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCI9PWNjIHdvcmxkUG9zPT1cIiwgRm9ybXVsYUNvbS5nZXRXb3JsZFBvcyhub2RlLm5vZGUpKVxuICAgICAgICAvL+iOt+WPluezu+e7n+S/oeaBr1xuICAgICAgICBsZXQgd3hfc2l6ZSA9IHd4Py5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj09d3hfc2l6ZT09XCIsIHd4X3NpemUuc2NyZWVuV2lkdGgsIHd4X3NpemUuc2NyZWVuSGVpZ2h0KVxuICAgICAgICAvL+iuoeeul+WunumZheWkp+Wwj+WSjOWPr+ingeWMuuWfn+WwuuWvuOeahOavlOS+i++8iOi/memHjOS7peWuveW6puS4uuWHhu+8iVxuICAgICAgICBsZXQgc2l6ZV9zY2FsZV93aWR0aCA9IHd4X3NpemUuc2NyZWVuV2lkdGggLyB2aXNpYmxlU2l6ZS53aWR0aDtcbiAgICAgICAgbGV0IHNpemVfc2NhbGVfaGVpZ2h0ID0gd3hfc2l6ZS5zY3JlZW5IZWlnaHQgLyBDb25maWcucmVhbEhlaWdodDtcbiAgICAgICAgLy/orqHnrpfliJvlu7rnlKjmiLfkv6Hmga/mjInpkq7pnIDopoHnmoTlsZ7mgKcs6ICD6JmR6ZSa54K5ICBcbiAgICAgICAgbGV0IG9mZnNldFggPSBub2RlLndpZHRoICogbm9kZS5zY2FsZVggKiAobm9kZS5ub2RlLmFuY2hvclggLyAxKVxuICAgICAgICBsZXQgb2Zmc2V0WSA9IG5vZGUuaGVpZ2h0ICogbm9kZS5zY2FsZVkgKiAoKDEgLSBub2RlLm5vZGUuYW5jaG9yWSkgLyAxKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj09YW5jaG9yWD09XCIsIG5vZGUubm9kZS5hbmNob3JYKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj09YW5jaG9yWT09XCIsIG5vZGUubm9kZS5hbmNob3JZKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj09b2Zmc2V0WD09XCIsIG9mZnNldFgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT1vZmZzZXRZPT1cIiwgb2Zmc2V0WSlcbiAgICAgICAgbGV0IGxlZnQgPSAod29ybGRQb3MueCAtIG9mZnNldFgpICogc2l6ZV9zY2FsZV93aWR0aCAgLy8gKHRoaXMudWkuYnRuVXNlci54ICsgdmlzaWJsZVNpemUud2lkdGggLyAyIC0gdGhpcy51aS5idG5Vc2VyLndpZHRoIC8gMikgKiBzaXplX3NjYWxlX3dpZHRoO1xuICAgICAgICBsZXQgdG9wID0gKHdvcmxkUG9zLnkgKyBub2RlLmhlaWdodCAvIDIpICogc2l6ZV9zY2FsZV9oZWlnaHQgIC8vZmd1aVxuICAgICAgICAvLyBsZXQgdG9wID0gd3hfc2l6ZS5zY3JlZW5IZWlnaHQgLSAod29ybGRQb3MueSAtIG9mZnNldFkgLSBDb25maWcuc2FmZUFyZWFSZWN0LnkgLyAyIC0gbm9kZS5oZWlnaHQgLyAyKSAqIHNpemVfc2NhbGVfaGVpZ2h0ICAvL2NjXG4gICAgICAgIGxldCB3aWR0aCA9IG5vZGUud2lkdGggKiBzaXplX3NjYWxlX3dpZHRoICogbm9kZS5zY2FsZVhcbiAgICAgICAgbGV0IGhlaWdodCA9IG5vZGUuaGVpZ2h0ICogc2l6ZV9zY2FsZV9oZWlnaHQgKiBub2RlLnNjYWxlWVxuICAgICAgICAvLyBsZXQgeSA9IChNYXRoLmFicyh0aGlzLnVpLmJ0blVzZXIueSkgLSB0aGlzLnVpLmJ0blVzZXIuaGVpZ2h0IC8gMikgKiBzaXplX3NjYWxlX3dpZHRoO1xuICAgICAgICAvLyBsZXQgd2lkdGggPSB0aGlzLnVpLmJ0blVzZXIud2lkdGggKiBzaXplX3NjYWxlX3dpZHRoO1xuICAgICAgICAvLyBsZXQgaGVpZ2h0ID0gdGhpcy51aS5idG5Vc2VyLmhlaWdodCAqIHNpemVfc2NhbGVfd2lkdGg7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT1sZWZ0PT1cIiwgbGVmdClcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCI9PXRvcD09XCIsIHRvcClcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCI9PXdpZHRoPT1cIiwgd2lkdGgpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiPT1oZWlnaHQ9PVwiLCBoZWlnaHQpXG4gICAgICAgIHJldHVybiB7IGxlZnQ6IGxlZnQsIHRvcDogdG9wLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH1cbiAgICB9XG5cbiAgICBidG5TaGFrZShub2RlOiBjYy5Ob2RlKSB7XG4gICAgICAgIGxldCB0d2VlbiA9IGNjLnR3ZWVuKG5vZGUpXG4gICAgICAgICAgICAuZGVsYXkoMilcbiAgICAgICAgICAgIC50bygwLjA1LCB7IGFuZ2xlOiAtMTUgfSlcbiAgICAgICAgICAgIC50bygwLjEsIHsgYW5nbGU6IDE1IH0pXG4gICAgICAgICAgICAudG8oMC4xLCB7IGFuZ2xlOiAtMTUgfSlcbiAgICAgICAgICAgIC50bygwLjEsIHsgYW5nbGU6IDE1IH0pXG4gICAgICAgICAgICAudG8oMC4wNSwgeyBhbmdsZTogMCB9KVxuICAgICAgICBjYy50d2Vlbihub2RlKS5yZXBlYXRGb3JldmVyKHR3ZWVuKS5zdGFydCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5oqb54mp57q/6aOe6KGMIC8v5byA5aeL5Z2Q5qCHIC8v5Lit6Ze05Z2Q5qCHKOmrmOW6pikgLy/nu5PmnZ/lnZDmoIdcbiAgICAgKiBwMOaYr+i1t+Wni+eCuVxuICAgICAqIHAx5piv5Lit54K5XG4gICAgICogcDLmmK/nu4jngrlcbiAgICAgKiBwMemAmui/h3Ay5ZKMcDDnmoRYYXhpc+ebuOWHj+iOt+W+l1xuICAgICAqIGhlaWdodOaYr3Aw5Yqg5LiK55qE6auY5bqmXG4gICAgICogdCDnmoTlj5blgLzojIPlm7TmmK8wLTHvvIjmlbTkuKrov4fnqIvnmoTlvZLkuIDljJZcbiAgICAgKi9cbiAgICBwYW93dXhpYW4ocGFybToge1xuICAgICAgICBub2RlOiBjYy5Ob2RlO1xuICAgICAgICBzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgICAgIGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICAgICAgaDogbnVtYmVyO1xuICAgICAgICB0YWRkPzogbnVtYmVyOyAvL+aXtumXtOWKoOWHj+mAn+avlOS+iyDpu5jorqQxMDBcbiAgICAgICAgY2JrPzogRnVuY3Rpb247XG4gICAgfSkge1xuICAgICAgICAvL+S4remXtOeCuVxuICAgICAgICBsZXQgbXYyID0gY2MudjIocGFybS5zLnggKyAocGFybS5lLnggLSBwYXJtLnMueCkgLyAyLCAocGFybS5zLnkgKyBwYXJtLmUueSkgLyAyICsgcGFybS5oKTtcbiAgICAgICAgLy/orr7nva7ml7bpl7RcbiAgICAgICAgbGV0IHRpbWUgPSBNYXRoLnNxcnQoTWF0aC5hYnMobXYyLnkgLSBwYXJtLnMueSkpICsgTWF0aC5zcXJ0KE1hdGguYWJzKG12Mi55IC0gcGFybS5lLnkpKTtcbiAgICAgICAgdGltZSAvPSA1MDtcbiAgICAgICAgaWYgKHBhcm0udGFkZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aW1lID0gKHRpbWUgKiBwYXJtLnRhZGQpIC8gMTAwO1xuICAgICAgICB9XG4gICAgICAgIC8v6LW35aeL54K5XG4gICAgICAgIHBhcm0ubm9kZS54ID0gcGFybS5zLng7XG4gICAgICAgIHBhcm0ubm9kZS55ID0gcGFybS5zLnk7XG4gICAgICAgIGNjLnR3ZWVuKHBhcm0ubm9kZSlcbiAgICAgICAgICAgIC5iZXppZXJUbyh0aW1lLCBtdjIsIG12MiwgY2MudjIocGFybS5lLngsIHBhcm0uZS55KSlcbiAgICAgICAgICAgIC5jYWxsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFybS5jYmsgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJtLmNiaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3RhcnQoKTtcbiAgICB9XG5cbiAgICAvL+aKm+eJqee6vyArIOiQveWcsOW8ueW8ueW8uVxuICAgIHBhb3d1eGlhbl90YW4oXG4gICAgICAgIHBhcm06IHtcbiAgICAgICAgICAgIG5vZGU6IGNjLk5vZGU7XG4gICAgICAgICAgICBzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgICAgICAgICBlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgICAgICAgICBoOiBudW1iZXI7XG4gICAgICAgICAgICBqaWFuOiBudW1iZXI7IC8v5by555qE6KGw5YeP5q+U5L6LIDEwMCDkuI3oobDlh49cbiAgICAgICAgICAgIHRhZGQ/OiBudW1iZXI7IC8v5pe26Ze05Yqg5YeP6YCf5q+U5L6LIOm7mOiupDEwMFxuICAgICAgICAgICAgY2JrPzogRnVuY3Rpb247XG4gICAgICAgIH0sXG4gICAgICAgIHQ/OiBudW1iZXIgLy/lvZPliY3nrKzlh6DmrKHlvLkg5Yid5qyh5pivMCDkuI3nrpflvLnnmoRcbiAgICApIHtcbiAgICAgICAgLy/ot7NcbiAgICAgICAgdGhpcy5wYW93dXhpYW4oe1xuICAgICAgICAgICAgbm9kZTogcGFybS5ub2RlLFxuICAgICAgICAgICAgczogcGFybS5zLFxuICAgICAgICAgICAgZTogcGFybS5lLFxuICAgICAgICAgICAgaDogcGFybS5oLFxuICAgICAgICAgICAgdGFkZDogcGFybS50YWRkLFxuICAgICAgICAgICAgY2JrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy/nrKzlh6DmrKHlvLlcbiAgICAgICAgICAgICAgICBpZiAodCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ICs9IDE7XG4gICAgICAgICAgICAgICAgLy/lvZPliY3oobDlh4/mr5TkvotcbiAgICAgICAgICAgICAgICBsZXQgcGVycyA9IE1hdGgucG93KHBhcm0uamlhbiAvIDEwMCwgdCk7XG4gICAgICAgICAgICAgICAgaWYgKHBlcnMgPCAwLjEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy/kuI3lho3lvLnkuoZcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcm0uY2JrICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcm0uY2JrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/nm67moIdcbiAgICAgICAgICAgICAgICBsZXQgX2ggPSBwYXJtLmggKiBwZXJzOyAvL+i3s+eahOmrmOW6piDoobDlh49cbiAgICAgICAgICAgICAgICBsZXQgX2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHBhcm0uZS54ICsgKHBhcm0uZS54IC0gcGFybS5zLngpICogcGVycywgLy/ot7PnmoTlrr3luqYg6KGw5YePXG4gICAgICAgICAgICAgICAgICAgIHk6IHBhcm0uZS55LCAvL+awtOW5s+WdkOagh+S4jeWPmFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy/osIPnlKjoh6rlt7FcbiAgICAgICAgICAgICAgICB0aGlzLnBhb3d1eGlhbl90YW4oXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHBhcm0ubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHBhcm0uZSwgLy/lvIDlp4sgPSDkuIrkuIDmrKHnmoTnu5PmnZ9cbiAgICAgICAgICAgICAgICAgICAgICAgIGU6IF9lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaDogX2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBqaWFuOiBwYXJtLmppYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWRkOiBwYXJtLnRhZGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYms6IHBhcm0uY2JrLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIOW8leaTjuiHquW4pueahOi0neWhnuWwlOabsue6v+i/kOWKqFxuICAgIHJ1bkJlemllckFjdChhY3ROb2RlOiBjYy5Ob2RlLCBkdXJhdGlvbjogbnVtYmVyLCBiZXppZXJEYXRhczogQmV6aWVyRGF0YVtdKSB7XG4gICAgICAgIGlmIChiZXppZXJEYXRhcy5sZW5ndGggPD0gMCkgcmV0dXJuXG4gICAgICAgIGxldCB0dyA9IGNjLnR3ZWVuKClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZXppZXJEYXRhcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHcuYmV6aWVyVG8oZHVyYXRpb24sIGJlemllckRhdGFzW2ldLmMxLCBiZXppZXJEYXRhc1tpXS5jMiwgYmV6aWVyRGF0YXNbaV0uZW5kUG9zKVxuICAgICAgICB9XG4gICAgICAgIGFjdE5vZGUuc2V0UG9zaXRpb24oYmV6aWVyRGF0YXNbMF0uc3RhcnRQb3MpXG4gICAgICAgIHR3LmNsb25lKGFjdE5vZGUpLnN0YXJ0KClcbiAgICB9XG5cbiAgICAvLyDljIDpgJ/otJ3loZ7lsJTmm7Lnur/ov5DliqhcbiAgICBydW5Vbmlmb3JtQmV6aWVyQWN0KGFjdE5vZGU6IGNjLk5vZGUsIGR1cmF0aW9uOiBudW1iZXIsIGJlemllckRhdGFzOiBCZXppZXJEYXRhW10sIG9uQ29tcGxldGU/OiBGdW5jdGlvbikge1xuICAgICAgICBpZiAoYmV6aWVyRGF0YXMubGVuZ3RoIDw9IDApIHJldHVyblxuXG4gICAgICAgIGxldCB0dyA9IGNjLnR3ZWVuKClcbiAgICAgICAgbGV0IGFsbEJlemllclBvczogY2MuVmVjMltdID0gW11cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZXppZXJEYXRhcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHBvc0FyciA9IFtiZXppZXJEYXRhc1tpXS5zdGFydFBvcywgYmV6aWVyRGF0YXNbaV0uYzEsIGJlemllckRhdGFzW2ldLmMyLCBiZXppZXJEYXRhc1tpXS5lbmRQb3NdXG4gICAgICAgICAgICBhbGxCZXppZXJQb3MgPSBhbGxCZXppZXJQb3MuY29uY2F0KHRoaXMuX2NhY3VsYXRlQmV6aWVyUG9pbnQocG9zQXJyKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b3RhbExpbmVMZW4gPSB0aGlzLl9jYWN1bGF0ZUJlemllckxlbmd0aChhbGxCZXppZXJQb3MpXG4gICAgICAgIGxldCBzcGVlZCA9IHRvdGFsTGluZUxlbiAvIGR1cmF0aW9uXG4gICAgICAgIGxldCBpc0NhbkJlemllciA9IGZhbHNlXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsQmV6aWVyUG9zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgZGlzID0gY2MudjIoYWxsQmV6aWVyUG9zW2ldLnggLSBhbGxCZXppZXJQb3NbaSAtIDFdLngsIGFsbEJlemllclBvc1tpXS55IC0gYWxsQmV6aWVyUG9zW2kgLSAxXS55KS5sZW4oKVxuICAgICAgICAgICAgaWYgKGRpcyA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyDov5nph4zov4fmu6TmjonkuKTmrrXotJ3loZ7lsJTmm7Lnur/pppbkvY3ov57mjqXnmoTngrlcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGRpcyAvIHNwZWVkXG4gICAgICAgICAgICAgICAgdHcudG8odCwgeyBwb3NpdGlvbjogYWxsQmV6aWVyUG9zW2ldIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYWxsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IEZvcm11bGFDb20uZ2V0QW5nbGVCeVBvcyhhbGxCZXppZXJQb3NbaSAtIDFdLngsIGFsbEJlemllclBvc1tpIC0gMV0ueSwgYWxsQmV6aWVyUG9zW2ldLngsIGFsbEJlemllclBvc1tpXS55KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFuZ2xlID0gRm9ybXVsYUNvbS5nZXRBbmdsZShhbGxCZXppZXJQb3NbaSAtIDFdLGFsbEJlemllclBvc1tpXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYW5nbGUgPSBcIixhbmdsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdE5vZGUuYW5nbGUgPSBhbmdsZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGlzQ2FuQmV6aWVyID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNDYW5CZXppZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJhbGxCZXppZXJQb3MubGVuZ3RoID09IDBcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGFjdE5vZGUuc2V0UG9zaXRpb24oYWxsQmV6aWVyUG9zWzBdKVxuICAgICAgICB0dy5jbG9uZShhY3ROb2RlKS5jYWxsKCgpID0+IHtcbiAgICAgICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZSgpO1xuICAgICAgICB9KS5zdGFydCgpXG4gICAgfVxuXG4gICAgLy8g6K6h566X5omA5pyJ6LSd5aGe5bCU5puy57q/55qE54K5XG4gICAgcHJpdmF0ZSBfY2FjdWxhdGVCZXppZXJQb2ludChwb3NBcnI6IGNjLlZlYzJbXSkge1xuICAgICAgICBsZXQgYWxsQmV6aWVyUG9zID0gW11cbiAgICAgICAgbGV0IGFsbERpcyA9IGNjLlZlYzIuZGlzdGFuY2UocG9zQXJyWzBdLCBwb3NBcnJbM10pXG4gICAgICAgIGxldCBnYXBDb3VudCA9IE1hdGguY2VpbChhbGxEaXMgLyAxMCkvL+i3neemuzXlg4/ntKDkuLrkuIDngrlcbiAgICAgICAgbGV0IGdhcCA9IDEgLyBnYXBDb3VudCAvLyDmr4/mrKHov63ku6PmraXplb8s6L+Z5Liq5YC86LaK5bCP6LaK57K+57uGLOS9huaYr+aViOeOh+i2iuS9jizov5nph4zov63ku6MzMDDmrKHlt7Lnu4/lpJ/kuoZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSArPSBnYXApIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB0aGlzLl9jYWN1bGF0ZUJlemllclAocG9zQXJyLCBpKVxuICAgICAgICAgICAgYWxsQmV6aWVyUG9zLnB1c2gocG9zKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFsbEJlemllclBvc1xuICAgIH1cblxuICAgIC8vIOiuoeeul+i0neWhnuWwlOabsue6v+eahOmVv+W6plxuICAgIHByaXZhdGUgX2NhY3VsYXRlQmV6aWVyTGVuZ3RoKGFsbEJlemllclBvczogY2MuVmVjMltdKSB7XG4gICAgICAgIGxldCB0b3RhbExpbmVMZW4gPSAwXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsQmV6aWVyUG9zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgZGlzID0gY2MudjIoYWxsQmV6aWVyUG9zW2ldLnggLSBhbGxCZXppZXJQb3NbaSAtIDFdLngsIGFsbEJlemllclBvc1tpXS55IC0gYWxsQmV6aWVyUG9zW2kgLSAxXS55KS5sZW4oKVxuICAgICAgICAgICAgdG90YWxMaW5lTGVuICs9IGRpc1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvdGFsTGluZUxlblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+S4iemYtui0neWhnuWwlOWcqCB05pe25Yi7IOeahOS9jee9rlxuICAgICAqIEBwYXJhbSBwIOS4iemYtui0neWhnuWwlOeahOWbm+S4queCuSzmlbDnu4Tlr7nlupTkuLogMOi1t+eCuSwx6LW354K55o6n5Yi254K5LDLnu4jngrnmjqfliLbngrksM+e7iOeCuVxuICAgICAqIEBwYXJhbSB0IOS8oOWFpTAtMeeahOWAvCzkuIDkuKrml7bpl7TnmoTov63ku6Pov4fnqItcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWN1bGF0ZUJlemllclAocDogY2MuVmVjMltdLCB0OiBudW1iZXIpOiBjYy5WZWMyIHtcbiAgICAgICAgLy8g5LiJ6Zi26LSd5aGe5bCU6L+Q566XXG4gICAgICAgIGxldCBiZXppZXJQOiBjYy5WZWMyID0gY2MudjIoKVxuICAgICAgICBiZXppZXJQLnggPSBNYXRoLmZsb29yKE1hdGgucG93KDEgLSB0LCAzKSAqIHBbMF0ueCArIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcFsxXS54ICsgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHBbMl0ueCArIE1hdGgucG93KHQsIDMpICogcFszXS54KTtcbiAgICAgICAgYmV6aWVyUC55ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxIC0gdCwgMykgKiBwWzBdLnkgKyAzICogdCAqIE1hdGgucG93KDEgLSB0LCAyKSAqIHBbMV0ueSArIDMgKiBNYXRoLnBvdyh0LCAyKSAqICgxIC0gdCkgKiBwWzJdLnkgKyBNYXRoLnBvdyh0LCAzKSAqIHBbM10ueSk7XG4gICAgICAgIHJldHVybiBiZXppZXJQO1xuICAgIH1cblxuICAgIC8qKiDliKTmlq3pmpDol4/npLzljIXmmK/lkKblvIDlkK9cbiAgICAgKiBAcGFyYW0geWNnaWZ0IOmakOiXj+ekvOWMheaVsOaNrlxuICAgICAqIEBwYXJhbSBkYyDmoaPmrKFcbiAgICAgKiBAcGFyYW0gYnV5TnVtIOi0reS5sOasoeaVsFxuICAgICAqIEBwYXJhbSBidXlDb25zIOi0reS5sOmHkeminVxuICAgICAqL1xuICAgIGNoZWNrWWNHaWZ0T3Blbih0aWFvamlhbjogbnVtYmVyW10sIGJ1eU51bTogbnVtYmVyLCBidXlDb25zOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eSh0aWFvamlhbikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy/mnInphY3nva7lhajlsYDlhYXlgLzph5Hpop3lubbkuJTlhajlsYDlhYXlgLzlpKfkuo7lm7rlrprph5Hpop3mmL7npLpcbiAgICAgICAgaWYgKCFnYW1lTWV0aG9kLmlzRW1wdHkodGlhb2ppYW5bMl0pICYmIEdhbWVEYXRhQ2VudGVyLnNldkJhY2s/LnVzZXJJbmZvPy5hPy5pc2N6ID49IHRpYW9qaWFuWzJdKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIC8vIOmakOiXj+ekvOWMheadoeS7tuWIpOaWrVxuICAgICAgICBpZiAodGlhb2ppYW5bMF0gPiAwICYmIHRpYW9qaWFuWzFdIDw9IDApIHtcbiAgICAgICAgICAgIC8vIOesrOS4gOenjSDlj6rliKTmlq3mrKHmlbBcbiAgICAgICAgICAgIGlmIChidXlOdW0gPj0gdGlhb2ppYW5bMF0pIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfSBlbHNlIGlmICh0aWFvamlhblswXSA8PSAwICYmIHRpYW9qaWFuWzFdID4gMCkge1xuICAgICAgICAgICAgLy8g56ys5LqM56eNIOWPquWIpOaWremHkeminVxuICAgICAgICAgICAgaWYgKGJ1eUNvbnMgPj0gdGlhb2ppYW5bMV0pIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfSBlbHNlIGlmICh0aWFvamlhblswXSA+IDAgJiYgdGlhb2ppYW5bMV0gPiAwKSB7XG4gICAgICAgICAgICAvLyDnrKzkuInnp40g5Yik5pat5qyh5pWw5ZKM6YeR6aKdIOa7oei2s+S4gOenjVxuICAgICAgICAgICAgaWYgKGJ1eU51bSA+PSB0aWFvamlhblswXSB8fCBidXlDb25zID49IHRpYW9qaWFuWzFdKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8g6I635Y+W5bGe5oCn5ZCN6Lef5YC8ICAgICAgICrkvKDlhaXlgLwgXCJhdGtcIjoxMCAg6L+U5ZueIFvmlLvlh7ssIDEwXVxuICAgIGdldEVwc05hbWVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IGVwc0NmZyA9IEdhbWVjZmcudXNlckVwLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShlcHNDZmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygn6YWN572u6ZSZ6K+vPT09Jywga2V5KVxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlICsgXCJcIl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIFt0aGlzLmZpeE5hbWUoZXBzQ2ZnLm5hbWUpLCAoZXBzQ2ZnLmlzUGVyID8gYCR7dmFsdWUgLyAxMDB9JWAgOiB2YWx1ZSArIFwiXCIpIHx8IFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmZpeE5hbWUoSTE4bi5nZXRVc2VyRXBOYW1lKGVwc0NmZy5rZXkpKSwgZXBzQ2ZnLmlzUGVyID8gYCR7dmFsdWUgLyAxMDB9JWAgOiB2YWx1ZSArIFwiXCJdXG5cbiAgICB9XG4gICAgLyoqXG4gICAgKiBVSeiKgueCuei9rOaNouWIsOebruagh+iKgueCueS4i+eahOWdkOagh1xuICAgICogQHBhcmFtIG5vZGUg6IqC54K5XG4gICAgKiBAcGFyYW0gdGFyZ2V0Tm9kZSDnm67moIfoioLngrlcbiAgICAqIEByZXR1cm5zIHvovazmjaLlkI7nmoTlnZDmoIfnmoTngrl8UG9pbnR9XG4gICAgKi9cbiAgICB0cmFuc1Bvcyhub2RlOiBjYy5Ob2RlLCB0YXJnZXROb2RlOiBjYy5Ob2RlKTogY2MuVmVjMiB7XG4gICAgICAgIC8v6L2s5LiW55WM5Z2Q5qCHXG4gICAgICAgIHZhciBlbmRHbG9iYWxQb3MgPSB0aGlzLmdldFdvcmxkUG9zKG5vZGUpO1xuICAgICAgICBpZiAoIWVuZEdsb2JhbFBvcykgcmV0dXJuIG51bGw7XG4gICAgICAgIC8v5YaN6L2s5bGA6YOo5Z2Q5qCHXG4gICAgICAgIHZhciBlbmRQb3MgPSB0YXJnZXROb2RlLmNvbnZlcnRUb05vZGVTcGFjZUFSKGVuZEdsb2JhbFBvcyk7XG4gICAgICAgIHJldHVybiBlbmRQb3M7XG4gICAgfVxuXG4gICAgLy8g5Ymq6LS05p2/5aSN5Yi25Yqf6IO9XG4gICAgcHVibGljIHdlYkNvcHlTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ+WkjeWItmluZycpO1xuXG4gICAgICAgIHZhciBpbnB1dCA9IHN0ciArICcnO1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgICAgIGVsLnZhbHVlID0gaW5wdXQ7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gICAgICAgIC8vIGVsLnN0eWxlLmNvbnRhaW4gPSAnc3RyaWN0JztcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBlbC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgICBlbC5zdHlsZS5mb250U2l6ZSA9ICcxMnB0JzsgLy8gUHJldmVudCB6b29taW5nIG9uIGlPU1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpO1xuICAgICAgICB2YXIgb3JpZ2luYWxSYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIG9yaWdpbmFsUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgZWwuc2VsZWN0KCk7XG4gICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gMDtcbiAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICAgIHZhciBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdWNjZXNzID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7IH1cblxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsKTtcblxuICAgICAgICBpZiAob3JpZ2luYWxSYW5nZSkge1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKG9yaWdpbmFsUmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoSTE4bi5nZXRJMThuVGV4dCgnY29tbW9uX2NvcHlfc3VjZXNzJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKEkxOG4uZ2V0STE4blRleHQoJ2NvbW1vbl9jb3B5X2ZhaWwnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5rua5Yqo5Y+Y5YyW55qE5pWw5a2X5paH5pysLOS4jeimgeWGjeS7u+S9leiZmuaLn+WIl+ihqOWGheS9v+eUqFxuICAgICAqIEBwYXJhbSBvYmog6ZyA6KaB5o6n5Yi255qE5paH5pys57uE5Lu2XG4gICAgICogQHBhcmFtIG51bSDlj5jljJbnmoTnm67moIfmlbDlrZdcbiAgICAgKiBAcGFyYW0gY2Ig5a6e5pe25Y+Y5YyW55qE5pWw5a2X5YC877yM6Ieq5bex5Zyo5YaF6YOo5YaZ6ZyA6KaB5omn6KGM5ZKM5pS55Y+Y55qE5paH5pys77yI5aaC5p6c5LiN5Lyg5YiZ55u05o6l5a+5b2JqLnRleHTmiJbov5lvYmoudGl0bGXotYvlgLxcbiAgICAgKiBAcGFyYW0gcGFyYW0g5Y+C5pWwXG4gICAgICovXG4gICAgU2V0TGFiZWxSb2xsKG9iajogZmFpcnlndWkuR1RleHRGaWVsZCB8IGZhaXJ5Z3VpLkdMYWJlbCB8IGZhaXJ5Z3VpLkdSaWNoVGV4dEZpZWxkLCBudW06IG51bWJlciwgY2I6ICh2YWw6IG51bWJlcikgPT4gdm9pZCA9IG51bGwsIHBhcmFtOiBSb2xsTGFiZWxQYXJhbSA9IG51bGwpIHtcbiAgICAgICAgbGV0IHJvbGxsYWJlbCA9IG9iai5ub2RlLmdldENvbXBvbmVudChSb2xsTGFiZWwpXG4gICAgICAgIGlmIChyb2xsbGFiZWwgPT0gbnVsbCkge1xuICAgICAgICAgICAgcm9sbGxhYmVsID0gb2JqLm5vZGUuYWRkQ29tcG9uZW50KFJvbGxMYWJlbClcbiAgICAgICAgICAgIHJvbGxsYWJlbC5vYmogPSBvYmpcbiAgICAgICAgfVxuICAgICAgICByb2xsbGFiZWwuc2V0RGF0YShudW0sIGNiLCBwYXJhbSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuIrmvILmlofmnKxcbiAgICAgKiBAcGFyYW0gZnVuYyDmlLnlj5jmlofmnKzlm77moIfnmoTmlrnms5UgXG4gICAgICogQHBhcmFtIG5vZGUg5L2N572u6IqC54K55a6a5L2N55SoXG4gICAgICogQHBhcmFtIHZpZXcg5oyC6L295LiK5ryC6IqC54K555So55qE6aG16Z2iXG4gICAgICogQHBhcmFtIGNhY2hlIOe8k+WtmFxuICAgICAqIEBwYXJhbSByYW5kb21YIFxuICAgICAqIEBwYXJhbSByYW5kb21ZIFxuICAgICAqIEBwYXJhbSBwYWMgXG4gICAgICogQHBhcmFtIHBvcEl0ZW0gXG4gICAgICovXG4gICAgUG9wVGlwcyhmdW5jOiAob2JqOiBmYWlyeWd1aS5HTGFiZWwpID0+IHZvaWQsIG5vZGU6IGZhaXJ5Z3VpLkdDb21wb25lbnQsIHZpZXc6IGZhaXJ5Z3VpLkdDb21wb25lbnQsIGNhY2hlOiBQb3BUaXBzQ2FjaGVbXSwgcmFuZG9tWDogbnVtYmVyW10gfCBudW1iZXIgPSBudWxsLCByYW5kb21ZOiBudW1iZXJbXSB8IG51bWJlciA9IG51bGwsIHBhYzogc3RyaW5nID0gXCJDb21tb25cIiwgcG9wSXRlbTogc3RyaW5nID0gXCJQb3BUaXBzXCIpIHtcbiAgICAgICAgbGV0IGRhdGE6IFBvcFRpcHNDYWNoZSA9IG51bGxcbiAgICAgICAgZm9yIChsZXQgaSBvZiBjYWNoZSkge1xuICAgICAgICAgICAgaWYgKGkub2JqLnZpc2libGUgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gaVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0gZmd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KHBhYywgcG9wSXRlbSkgYXMgZmFpcnlndWkuR0xhYmVsXG4gICAgICAgICAgICB2aWV3LmFkZENoaWxkKG9iailcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgUG9wVGlwc0NhY2hlKG9iailcbiAgICAgICAgICAgIGNhY2hlLnB1c2goZGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJhbmRvbVggPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZGF0YS5vYmoueCA9IG5vZGUueCArIHJhbmRvbVhcbiAgICAgICAgfSBlbHNlIGlmIChyYW5kb21YKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IHJhbmRvbVhbMF1cbiAgICAgICAgICAgIGxldCByaWdodCA9IHJhbmRvbVhbMV1cbiAgICAgICAgICAgIGxldCByYW5kb21wb3N4ID0gR2FtZU1hdGguZ2V0UmFuZG9tTnVtKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICAgZGF0YS5vYmoueCA9IG5vZGUueCArIHJhbmRvbXBvc3hcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEub2JqLnggPSBub2RlLnhcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJhbmRvbVkgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZGF0YS5vYmoueSA9IG5vZGUueSArIHJhbmRvbVlcbiAgICAgICAgfSBlbHNlIGlmIChyYW5kb21ZKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IHJhbmRvbVlbMF1cbiAgICAgICAgICAgIGxldCByaWdodCA9IHJhbmRvbVlbMV1cbiAgICAgICAgICAgIGxldCByYW5kb21wb3N5ID0gR2FtZU1hdGguZ2V0UmFuZG9tTnVtKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICAgZGF0YS5vYmoueSA9IG5vZGUueSArIHJhbmRvbXBvc3lcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEub2JqLnkgPSBub2RlLnlcbiAgICAgICAgfVxuICAgICAgICBmdW5jKGRhdGEub2JqKVxuICAgICAgICBkYXRhLnN0YXJ0VHdlZW4oKVxuICAgIH1cblxuICAgIC8qKiDmlbDlrZfovazkuK3mlocgKi9cbiAgICBOdW1Ub0NoaW5lc2UobnVtKSB7XG4gICAgICAgIGlmIChudW0gPCAwIHx8IG51bSA+IDEwMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwi6L6T5YWl55qE5pWw5a2X5b+F6aG75ZyoMOWIsDEwMOS5i+mXtFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pdHMgPSBbJycsICfljYEnLCAn55m+JywgJ+WNgyddOyAvLyDlj6/ku6XmoLnmja7pnIDopoHmianlsZUgIFxuICAgICAgICBjb25zdCBjaGluZXNlTnVtcyA9IFsn6Zu2JywgJ+S4gCcsICfkuownLCAn5LiJJywgJ+WbmycsICfkupQnLCAn5YWtJywgJ+S4gycsICflhasnLCAn5LmdJ107XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgbGV0IGRpZ2l0O1xuXG4gICAgICAgIC8vIOWkhOeQhuS4quS9jeaVsCAgXG4gICAgICAgIGRpZ2l0ID0gbnVtICUgMTA7XG4gICAgICAgIGlmIChkaWdpdCAhPT0gMCkge1xuICAgICAgICAgICAgc3RyID0gY2hpbmVzZU51bXNbZGlnaXRdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5aSE55CG5Y2B5L2N5pWwICBcbiAgICAgICAgbnVtID0gTWF0aC5mbG9vcihudW0gLyAxMCk7XG4gICAgICAgIGlmIChudW0gIT09IDApIHtcbiAgICAgICAgICAgIGlmIChudW0gPT0gMSkge1xuICAgICAgICAgICAgICAgIHN0ciA9ICfljYEnICsgc3RyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBjaGluZXNlTnVtc1tudW1dICsgJ+WNgScgKyBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlpoLmnpzpnIDopoHlpITnkIbmm7TlpKfnmoTmlbDlrZfvvIzlj6/ku6Xnu6fnu63mt7vliqDpgLvovpEgIFxuXG4gICAgICAgIC8vIOenu+mZpOW8gOWktOeahCfpm7YnICBcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL17pm7YrLywgJycpO1xuICAgICAgICBpZiAoc3RyID09PSAnJykge1xuICAgICAgICAgICAgc3RyID0gJ+mbtic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiDlnIbkuIrmjIflrprop5LluqbkuIDngrkgKi9cbiAgICBHZXRQb2ludE9uQ2lyY2xlKHJhZGl1czogbnVtYmVyLCBkZWdyZWU6IG51bWJlciwgY2VudGVyOiBjYy5WZWMyKTogY2MuVmVjMiB7XG4gICAgICAgIGxldCBhbmdsZSA9IHRoaXMuRGVncmVlVG9BbmdsZShkZWdyZWUpO1xuICAgICAgICAvLyDkvb/nlKjkuInop5Llh73mlbDorqHnrpflnIbkuIror6Xop5Lluqblr7nlupTnmoTngrnnmoR45ZKMeeWdkOaghyAgXG4gICAgICAgIGNvbnN0IHggPSBjZW50ZXIueCArIHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgY29uc3QgeSA9IGNlbnRlci55ICsgcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xuXG4gICAgICAgIC8vIOi/lOWbnuivpeeCueeahOWdkOaghyAgXG4gICAgICAgIHJldHVybiBjYy52Mih4LCB5KTtcbiAgICB9XG5cbiAgICAvKiog5ZyG5LiK5Lu75oSP5LiA54K5ICovXG4gICAgR2V0UmFuZG9tUG9pbnRPbkNpcmNsZShyYWRpdXM6IG51bWJlciwgY2VudGVyWCA9IDAsIGNlbnRlclkgPSAwKTogY2MuVmVjMiB7XG4gICAgICAgIC8vIOeUn+aIkOS4gOS4qjDliLAyz4DkuYvpl7TnmoTpmo/mnLrop5LluqbvvIjlvKfluqbvvIkgIFxuICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcblxuICAgICAgICAvLyDkvb/nlKjkuInop5Llh73mlbDorqHnrpflnIbkuIror6Xop5Lluqblr7nlupTnmoTngrnnmoR45ZKMeeWdkOaghyAgXG4gICAgICAgIGNvbnN0IHggPSBjZW50ZXJYICsgcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBjb25zdCB5ID0gY2VudGVyWSArIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTtcblxuICAgICAgICAvLyDov5Tlm57or6XngrnnmoTlnZDmoIcgIFxuICAgICAgICByZXR1cm4gY2MudjIoeCwgeSk7XG4gICAgfVxuXG4gICAgLyoqIOWchuS4iuinkuW6puiMg+WbtOS4gOeCuSAqL1xuICAgIEdldFJhbmRvbVBvaW50T25BbmdsZShyYWRpdXM6IG51bWJlciwgcmFuZ2VBbmdsZTogbnVtYmVyLCBjZW50ZXI6IGNjLlZlYzIsIHBvaW50OiBjYy5WZWMyKTogY2MuVmVjMiB7XG4gICAgICAgIC8vIOeUn+aIkOS4gOS4qjDliLAyz4DkuYvpl7TnmoTpmo/mnLrop5LluqbvvIjlvKfluqbvvIkgIFxuICAgICAgICAvLyBjb25zdCBhbmdsZSA9IE1hdGgucmFuZG9tKCkgKiAyICogTWF0aC5QSTtcblxuICAgICAgICBjb25zdCBkeCA9IHBvaW50LnggLSBjZW50ZXIueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludC55IC0gY2VudGVyLnk7XG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkaWFucyA9IE1hdGguYXRhbjIoZHksIGR4KTtcbiAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5BbmdsZVRvRGVncmVlKGFuZ2xlUmFkaWFucyk7XG4gICAgICAgIGxldCBuZXdBbmdsZSA9IEdhbWVNYXRoLmdldFJhbmRvbU51bShyYW5nZUFuZ2xlLCByYW5nZUFuZ2xlICogMikgLSByYW5nZUFuZ2xlO1xuICAgICAgICBhbmdsZSArPSBuZXdBbmdsZTtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IHRoaXMuRGVncmVlVG9BbmdsZShhbmdsZSk7XG4gICAgICAgIC8vIOS9v+eUqOS4ieinkuWHveaVsOiuoeeul+WchuS4iuivpeinkuW6puWvueW6lOeahOeCueeahHjlkox55Z2Q5qCHICBcbiAgICAgICAgY29uc3QgeCA9IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3MoZGVncmVlKTtcbiAgICAgICAgY29uc3QgeSA9IGNlbnRlci55ICsgcmFkaXVzICogTWF0aC5zaW4oZGVncmVlKTtcblxuICAgICAgICAvLyDov5Tlm57or6XngrnnmoTlnZDmoIcgIFxuICAgICAgICByZXR1cm4gY2MudjIoeCwgeSk7XG4gICAgfVxuXG4gICAgLyoqIOWchuS4iuaMh+WumuinkuW6puS4gOeCuSAqL1xuICAgIEdldENpcmNsZVBvaW50T25BbmdsZShyYWRpdXM6IG51bWJlciwgZGlmZkFuZ2xlOiBudW1iZXIsIGNlbnRlcjogY2MuVmVjMiwgcG9pbnQ6IGNjLlZlYzIpOiBjYy5WZWMyIHtcbiAgICAgICAgLy8g55Sf5oiQ5LiA5LiqMOWIsDLPgOS5i+mXtOeahOmaj+acuuinkuW6pu+8iOW8p+W6pu+8iSAgXG4gICAgICAgIC8vIGNvbnN0IGFuZ2xlID0gTWF0aC5yYW5kb20oKSAqIDIgKiBNYXRoLlBJO1xuXG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnQueCAtIGNlbnRlci54O1xuICAgICAgICBjb25zdCBkeSA9IHBvaW50LnkgLSBjZW50ZXIueTtcbiAgICAgICAgY29uc3QgYW5nbGVSYWRpYW5zID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuICAgICAgICBsZXQgYW5nbGUgPSB0aGlzLkFuZ2xlVG9EZWdyZWUoYW5nbGVSYWRpYW5zKTtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IGFuZ2xlICsgZGlmZkFuZ2xlO1xuICAgICAgICBsZXQgbmV3QW5nbGUgPSB0aGlzLkRlZ3JlZVRvQW5nbGUoZGVncmVlKTtcbiAgICAgICAgLy8g5L2/55So5LiJ6KeS5Ye95pWw6K6h566X5ZyG5LiK6K+l6KeS5bqm5a+55bqU55qE54K555qEeOWSjHnlnZDmoIcgIFxuICAgICAgICBjb25zdCB4ID0gY2VudGVyLnggKyByYWRpdXMgKiBNYXRoLmNvcyhuZXdBbmdsZSk7XG4gICAgICAgIGNvbnN0IHkgPSBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKG5ld0FuZ2xlKTtcblxuICAgICAgICAvLyDov5Tlm57or6XngrnnmoTlnZDmoIcgIFxuICAgICAgICByZXR1cm4gY2MudjIoeCwgeSk7XG4gICAgfVxuXG4gICAgLyoqIOWchuS4iuWIhuWJsuinkuW6puWQjueahOWdkOagh+eCuSAqL1xuICAgIEdldENpcmNsZVBvaW50RGl2aWRlQW5nbGUocmFkaXVzOiBudW1iZXIsIGRpdmlkZUNvdW50OiBudW1iZXIsIGNlbnRlcjogY2MuVmVjMik6IGNjLlZlYzJbXSB7XG4gICAgICAgIC8vIOeUn+aIkOS4gOS4qjDliLAyz4DkuYvpl7TnmoTpmo/mnLrop5LluqbvvIjlvKfluqbvvIkgIFxuICAgICAgICBsZXQgcGVyID0gZGl2aWRlQ291bnQgLyBkaXZpZGVDb3VudDtcbiAgICAgICAgbGV0IHBvc0FyciA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpdmlkZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkZWdyZWUgPSBwZXIgKiBpO1xuICAgICAgICAgICAgLy8g5L2/55So5LiJ6KeS5Ye95pWw6K6h566X5ZyG5LiK6K+l6KeS5bqm5a+55bqU55qE54K555qEeOWSjHnlnZDmoIcgIFxuICAgICAgICAgICAgY29uc3QgeCA9IGNlbnRlci54ICsgcmFkaXVzICogTWF0aC5jb3MoZGVncmVlKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKGRlZ3JlZSk7XG4gICAgICAgICAgICBwb3NBcnIucHVzaChjYy52Mih4LCB5KSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zQXJyO1xuICAgIH1cblxuICAgIC8qKiDlnIbkuIrmjIflrprlvKfplb/nmoTngrkgKi9cbiAgICBHZXRDaXJjbGVBbmdsZUxlblBvaW50KHJhZGl1czogbnVtYmVyLCBsZW46IG51bWJlciwgY2VudGVyOiBjYy5WZWMyLCBwb2ludDogY2MuVmVjMiwgaW5kZXg6IG51bWJlcik6IGNjLlZlYzIge1xuICAgICAgICBjb25zdCBkeCA9IHBvaW50LnggLSBjZW50ZXIueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludC55IC0gY2VudGVyLnk7XG4gICAgICAgIGNvbnN0IGFuZ2xlUmFkaWFucyA9IE1hdGguYXRhbjIoZHksIGR4KTtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IHRoaXMuQW5nbGVUb0RlZ3JlZShhbmdsZVJhZGlhbnMpO1xuICAgICAgICBsZXQgdG90YWxMZW4gPSAyICogTWF0aC5QSSAqIHJhZGl1cztcbiAgICAgICAgbGV0IG5lZWREZWdyZWUgPSBsZW4gLyB0b3RhbExlbiAqIDM2MDsvL+W8p+mVv+WvueW6lOinkuW6plxuICAgICAgICBsZXQgbmV3RGVncmVlID0gZGVncmVlICsgaW5kZXggKiBuZWVkRGVncmVlO1xuICAgICAgICBsZXQgbmV3QW5nbGUgPSB0aGlzLkRlZ3JlZVRvQW5nbGUobmV3RGVncmVlKTtcbiAgICAgICAgLy8g5L2/55So5LiJ6KeS5Ye95pWw6K6h566X5ZyG5LiK6K+l6KeS5bqm5a+55bqU55qE54K555qEeOWSjHnlnZDmoIcgIFxuICAgICAgICBjb25zdCB4ID0gY2VudGVyLnggKyByYWRpdXMgKiBNYXRoLmNvcyhuZXdBbmdsZSk7XG4gICAgICAgIGNvbnN0IHkgPSBjZW50ZXIueSArIHJhZGl1cyAqIE1hdGguc2luKG5ld0FuZ2xlKTtcbiAgICAgICAgLy8g6L+U5Zue6K+l54K555qE5Z2Q5qCHICBcbiAgICAgICAgcmV0dXJuIGNjLnYyKHgsIHkpO1xuICAgIH1cblxuICAgIC8qKiDlvKfluqbovazop5LluqYgKi9cbiAgICBwdWJsaWMgQW5nbGVUb0RlZ3JlZShhbmdsZVJhZGlhbnMpIHtcbiAgICAgICAgY29uc3QgYW5nbGVEZWdyZWVzID0gYW5nbGVSYWRpYW5zICogKDE4MCAvIE1hdGguUEkpO1xuICAgICAgICByZXR1cm4gYW5nbGVEZWdyZWVzXG4gICAgfVxuXG4gICAgLyoqIOinkuW6pui9rOW8p+W6piAqL1xuICAgIHB1YmxpYyBEZWdyZWVUb0FuZ2xlKGRlZ3JlZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gZGVncmVlIC8gKDE4MCAvIE1hdGguUEkpO1xuICAgICAgICByZXR1cm4gYW5nbGU7XG4gICAgfVxuXG4gICAgLyoqIOiOt+WPluS4pOeCueinkuW6piAqL1xuICAgIHB1YmxpYyBHZXRUd29Qb2ludEFuZ2xlKGNlbnRlcjogY2MuVmVjMiwgcG9pbnQ6IGNjLlZlYzIpIHtcbiAgICAgICAgY29uc3QgZHggPSBwb2ludC54IC0gY2VudGVyLng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnQueSAtIGNlbnRlci55O1xuICAgICAgICBjb25zdCBhbmdsZVJhZGlhbnMgPSBNYXRoLmF0YW4yKGR5LCBkeCk7XG4gICAgICAgIGxldCBhbmdsZSA9IHRoaXMuQW5nbGVUb0RlZ3JlZShhbmdsZVJhZGlhbnMpO1xuICAgICAgICByZXR1cm4gYW5nbGU7XG4gICAgfVxuXG4gICAgLyoqIOaxguWkmuS4queCueeahOS4reW/g+eCuSAqL1xuICAgIHB1YmxpYyBDYWxjdWxhdGVDZW50cm9pZChwb2ludHM6IGNjLlZlYzJbXSk6IGNjLlZlYzIge1xuICAgICAgICAvLyDliJ3lp4vljJZ45ZKMeeeahOaAu+WSjCAgXG4gICAgICAgIGxldCBzdW1YID0gMDtcbiAgICAgICAgbGV0IHN1bVkgPSAwO1xuXG4gICAgICAgIC8vIOmBjeWOhuaJgOacieeCue+8jOe0r+WKoHjlkox555qE5Z2Q5qCHICBcbiAgICAgICAgcG9pbnRzLmZvckVhY2gocG9pbnQgPT4ge1xuICAgICAgICAgICAgc3VtWCArPSBwb2ludC54O1xuICAgICAgICAgICAgc3VtWSArPSBwb2ludC55O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyDorqHnrpflubPlnYd45ZKMeeWdkOaghyAgXG4gICAgICAgIGxldCBjZW50cm9pZFggPSBzdW1YIC8gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgbGV0IGNlbnRyb2lkWSA9IHN1bVkgLyBwb2ludHMubGVuZ3RoO1xuXG4gICAgICAgIC8vIOi/lOWbnuS4reW/g+eCueWdkOaghyAgXG4gICAgICAgIHJldHVybiBjYy52MihjZW50cm9pZFgsIGNlbnRyb2lkWSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9wVGlwc0NhY2hlIHtcbiAgICBvYmo6IGZhaXJ5Z3VpLkdMYWJlbFxuICAgIHR3ZWVuMTogY2MuVHdlZW47XG4gICAgdHdlZW4yOiBjYy5Ud2VlbjtcblxuICAgIGNvbnN0cnVjdG9yKG9iajogZmFpcnlndWkuR0xhYmVsKSB7XG4gICAgICAgIHRoaXMub2JqID0gb2JqXG5cblxuICAgIH1cblxuICAgIHN0YXJ0VHdlZW4oKSB7XG4gICAgICAgIHRoaXMub2JqLmFscGhhID0gMFxuICAgICAgICB0aGlzLm9iai52aXNpYmxlID0gdHJ1ZVxuICAgICAgICBsZXQgeSA9IHRoaXMub2JqLnkgLSAxMjA7XG4gICAgICAgIHRoaXMudHdlZW4xID0gY2MudHdlZW4odGhpcy5vYmopLnRvKDEsIHtcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgIH0pLmNhbGwoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vYmoudmlzaWJsZSA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMudHdlZW4yID0gY2MudHdlZW4odGhpcy5vYmopLnRvKDAuMiwge1xuICAgICAgICAgICAgYWxwaGE6IDEsXG4gICAgICAgIH0pLmRlbGF5KDAuNikudG8oMC4yLCB7XG4gICAgICAgICAgICBhbHBoYTogMCxcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy50d2VlbjEuc3RhcnQoKVxuICAgICAgICB0aGlzLnR3ZWVuMi5zdGFydCgpXG4gICAgfVxuXG4gICAgY2xlYXJUd2VlbigpIHtcbiAgICAgICAgdGhpcy50d2VlbjE/LnN0b3AoKVxuICAgICAgICB0aGlzLnR3ZWVuMj8uc3RvcCgpXG4gICAgICAgIHRoaXMub2JqLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGxldCB1aUNvbW1vbiA9IG5ldyBVSUNvbW1vbigpIl19