var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0) { if (!this._isforcehide) { this.img_0.visible = true; } var i = this.img_0.rotation; i += 10; if (i > 360) i = i % 360; this.img_0.rotation = i; } else { this.img_0.visible = false; } } }; GlobalWaiting.prototype.hideimg = function () { this._isforcehide = true; if (this.img_0) { this.img_0.visible = false; } }; GlobalWaiting.prototype.onRemoveFromStage = function () { Laya.timer.clear(this, this.onTimer); }; return GlobalWaiting; }(fairygui.GComponent)); exports.default = GlobalWaiting; },{}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("./Global"); var Stage = Laya.Stage; var PathConfig_1 = require("./configs/gameConfigs/PathConfig"); var GameContents_1 = require("./GameContents"); var Sdk_1 = require("./platform/wxminigame/WXSDK/Sdk"); var Main = /** @class */ (function () { function Main() { //根据IDE设置初始化引擎 // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]); Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight); Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH; Laya.stage.alignH = Stage.ALIGN_CENTER; Laya.stage.alignV = Stage.ALIGN_TOP; Laya.stage.screenMode = Stage.SCREEN_VERTICAL; Laya.stage.bgColor = "#54B9F6"; // Laya.Stat.show(); Laya.alertGlobalError = true; window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128); if (Laya.Browser.onWeiXin) { Sdk_1.WxApi.WxInit(); Sdk_1.WxApi.CheckWXUpdate(); } Laya.stage.on("resize", this, this.onResize); } Main.prototype.onResize = function () { Laya.stage.off("resize", this, this.onResize); Global_1.Global.setVars(); PathConfig_1.PathConfig.init(); fairygui.UIConfig.packageFileExtension = "bin"; fairygui.UIConfig.textureLinearSampling = true; fairygui.UIConfig.defaultFont = "黑体"; fairygui.UIConfig.versions = Global_1.Global.versions; var gameContent = new GameContents_1.GameContents(); gameContent.initGame(); }; return Main; }()); //激活启动类 new Main(); },{"./GameContents":1,"./Global":2,"./configs/gameConfigs/PathConfig":10,"./platform/wxminigame/WXSDK/Sdk":75}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:build.xlsx。 //------------------------------------------------------------------------------ var BuildCFG = /** @class */ (function () { function BuildCFG() { } BuildCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (BuildCFG.dict[singleArr[0]]) continue; var item = new BuildCFG(); item.name = singleArr[0]; item.buffx = Number(singleArr[1]); item.buffy = Number(singleArr[2]); item.buffz = Number(singleArr[3]); item.time = Number(singleArr[4]); BuildCFG.dict[item.name] = item; BuildCFG.vec.push(item); } }; BuildCFG.dict = {}; BuildCFG.vec = []; return BuildCFG; }()); exports.default = BuildCFG; },{}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:game.xlsx。 //------------------------------------------------------------------------------ var GameCFG = /** @class */ (function () { function GameCFG() { } GameCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (GameCFG.dict[singleArr[0]]) continue; var item = new GameCFG(); item.id = Number(singleArr[0]); item.value = singleArr[1]; GameCFG.dict[item.id] = item; GameCFG.vec.push(item); } }; GameCFG.dict = {}; GameCFG.vec = []; return GameCFG; }()); exports.default = GameCFG; },{}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:level.xlsx。 //------------------------------------------------------------------------------ var LevelCFG = /** @class */ (function () { function LevelCFG() { } LevelCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (LevelCFG.dict[singleArr[0]]) continue; var item = new LevelCFG(); item.id = Number(singleArr[0]); item.road = singleArr[1]; item.roleinitpos = JSON.parse(singleArr[2]); item.npc = JSON.parse(singleArr[3]); item.firstScenepos = singleArr[4]; item.winGold = Number(singleArr[5]); item.failGod = singleArr[6]; LevelCFG.dict[item.id] = item; LevelCFG.vec.push(item); } }; LevelCFG.dict = {}; LevelCFG.vec = []; return LevelCFG; }()); exports.default = LevelCFG; },{}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:npc.xlsx。 //------------------------------------------------------------------------------ var NpcCFG = /** @class */ (function () { function NpcCFG() { } NpcCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (NpcCFG.dict[singleArr[0]]) continue; var item = new NpcCFG(); item.id = Number(singleArr[0]); item.name = singleArr[1]; item.speed = Number(singleArr[2]); item.frontjump = JSON.parse(singleArr[3]); item.leftjump = JSON.parse(singleArr[4]); item.rightjump = JSON.parse(singleArr[5]); item.upclimb = Number(singleArr[6]); item.slideclimb = JSON.parse(singleArr[7]); item.jump_left = Number(singleArr[8]); item.jump_right = Number(singleArr[9]); item.start_ahead = Number(singleArr[10]); item.distance = Number(singleArr[11]); NpcCFG.dict[item.id] = item; NpcCFG.vec.push(item); } }; NpcCFG.dict = {}; NpcCFG.vec = []; return NpcCFG; }()); exports.default = NpcCFG; },{}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //------------------------------------------------------------------------------ //工具生成,请勿修改。 //配置文件名称:role.xlsx。 //------------------------------------------------------------------------------ var RoleCFG = /** @class */ (function () { function RoleCFG() { } RoleCFG.initCfg = function (str) { var i = 0; var arr = str.split("\n"); var i = 0; for (i = 0; i < arr.length; i++) { var singleStr = arr[i]; var singleArr = singleStr.split("&"); if (RoleCFG.dict[singleArr[0]]) continue; var item = new RoleCFG(); item.id = Number(singleArr[0]); item.name = singleArr[1]; item.speed = Number(singleArr[2]); item.frontjump = JSON.parse(singleArr[3]); item.leftjump = JSON.parse(singleArr[4]); item.rightjump = JSON.parse(singleArr[5]); item.upclimb = Number(singleArr[6]); item.slideclimb = JSON.parse(singleArr[7]); item.getState = Number(singleArr[8]); item.need = Number(singleArr[9]); item.icon = singleArr[10]; RoleCFG.dict[item.id] = item; RoleCFG.vec.push(item); } }; RoleCFG.dict = {}; RoleCFG.vec = []; return RoleCFG; }()); exports.default = RoleCFG; },{}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../../Global"); /* * name; */ var PathConfig; (function (PathConfig) { PathConfig.res = "res/"; PathConfig.wxlocal = "wxlocal/"; PathConfig.configs = "configs/"; PathConfig.ui = "ui/"; PathConfig.sounds = "sound/"; PathConfig.versionrandom = ""; PathConfig.icon = "icon/"; PathConfig.scene = "scenes/"; function init() { PathConfig.versionrandom = "?v=" + Math.random(); } PathConfig.init = init; function getsound(id) { return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.sounds + id + ".mp3"); } PathConfig.getsound = getsound; function getResConfig() { return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.configs + "resConfig.json"); } PathConfig.getResConfig = getResConfig; function getConfig(configname) { return Global_1.Global.getUrl(PathConfig.wxlocal + PathConfig.configs + configname + ".bin"); } PathConfig.getConfig = getConfig; function get3Dscene(name) { return Global_1.Global.getUrl(PathConfig.res + PathConfig.scene + "Conventional/" + name + ".ls"); } PathConfig.get3Dscene = get3Dscene; function get3DModel(name) { return Global_1.Global.getUrl(PathConfig.res + PathConfig.scene + "Conventional/" + name + ".lh"); } PathConfig.get3DModel = get3DModel; function get3DRoleModel(name) { return Global_1.Global.getUrl(PathConfig.res + "role/Conventional/" + name + ".lh"); } PathConfig.get3DRoleModel = get3DRoleModel; function getroleicon(id) { return Global_1.Global.getUrl(PathConfig.res + PathConfig.icon + "roleicon/" + id + ".png"); } PathConfig.getroleicon = getroleicon; function getVerisonurl() { if (Global_1.Global.isdebug) { return Global_1.Global.getUrl(PathConfig.res + "version.json") + PathConfig.versionrandom; } return Global_1.Global.getUrl(PathConfig.res + "version" + Global_1.Global.resconfigVersion + ".json"); } PathConfig.getVerisonurl = getVerisonurl; function getGameVersion() { return Global_1.Global.getUrl("gameversion.json"); } PathConfig.getGameVersion = getGameVersion; })(PathConfig = exports.PathConfig || (exports.PathConfig = {})); },{"../../Global":2}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PathConfig_1 = require("./PathConfig"); var Global_1 = require("../../Global"); /* * name; */ var RecConfigs = /** @class */ (function (_super) { __extends(RecConfigs, _super); function RecConfigs() { return _super.call(this) || this; } RecConfigs.getInstance = function () { if (null == this.instance) { this.instance = new RecConfigs(); } return this.instance; }; RecConfigs.prototype.init = function () { this.groupdict = {}; }; RecConfigs.prototype.initRec = function (dict) { if (dict != null && !RecConfigs.ishasinit) { RecConfigs.ishasinit = true; var groupsArr = dict.groups; var resourcesArr = dict.resources; var resourcesDict = {}; for (var item in resourcesArr) { var child = resourcesArr[item]; switch (child.type) { case "bin": child.type = Laya.Loader.BUFFER; break; case "ls": child.type = Laya.Scene; break; case "lh": child.type = Laya.Sprite3D; break; case "lm": child.type = Laya.MeshSprite3D; break; } resourcesDict[child.name] = child; } for (var grouptype in groupsArr) { var groupchild = groupsArr[grouptype]; var arr = groupchild.keys.split(","); var childArr = []; var chidstr; for (chidstr in arr) { var strChild = arr[chidstr]; if (strChild != "") { var urls = resourcesDict[strChild].url; urls = urls.replace("res/", PathConfig_1.PathConfig.res); childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type }); } } this.groupdict[groupchild.name] = childArr; } Laya.loader.clearRes(PathConfig_1.PathConfig.getResConfig()); } }; /** * 是否已经初始化 */ RecConfigs.ishasinit = false; return RecConfigs; }(Laya.EventDispatcher)); exports.default = RecConfigs; },{"../../Global":2,"./PathConfig":10}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var Debuger = /** @class */ (function () { function Debuger() { } Debuger.log = function (msg) { var optionalParams = []; for (var _i = 1; _i < arguments.length; _i++) { optionalParams[_i - 1] = arguments[_i]; } // if (Debuger.isprint&& Global.isdebug ) { // if(optionalParams&&optionalParams.length>0){ // console.log(msg,optionalParams); // }else{ // console.log(msg); // } // } if (Debuger.isprint) { if (optionalParams && optionalParams.length > 0) { console.log(msg, optionalParams); } else { console.log(msg); } } }; Debuger.error = function (msg) { var optionalParams = []; for (var _i = 1; _i < arguments.length; _i++) { optionalParams[_i - 1] = arguments[_i]; } if (Debuger.isprint) { console.error(msg, optionalParams); } }; /** * 是否打印 */ Debuger.isprint = true; return Debuger; }()); exports.default = Debuger; },{}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var TimerService = /** @class */ (function (_super) { __extends(TimerService, _super); function TimerService() { var _this = _super.call(this) || this; _this._timeScale = 1; _this._unscalableList = []; return _this; } TimerService.getInastance = function () { if (null == this.instance) { this.instance = new TimerService(); } return this.instance; }; TimerService.prototype.init = function () { Laya.timer.frameLoop(1, this, this.onTimer); }; TimerService.prototype.initEvent = function () { }; TimerService.prototype.stop = function () { Laya.timer.clear(this, this.onTimer); }; TimerService.prototype.recover = function () { this.stop(); Laya.timer.frameLoop(1, this, this.onTimer); }; TimerService.prototype.onTimer = function () { var i = 0; for (i = 0; i < this._unscalableList.length; i++) { this._unscalableList[i].update(Laya.timer.delta * this._timeScale); } }; TimerService.prototype.hasUpdataTarget = function (updateTarget) { var index; index = this._unscalableList.indexOf(updateTarget); if (index != -1) { return true; } return false; }; TimerService.prototype.addUpdateTarget = function (updateTarget) { var index; index = this._unscalableList.indexOf(updateTarget); if (index == -1) { this._unscalableList.push(updateTarget); } }; TimerService.prototype.removeUpdateTarget = function (updateTarget) { var index = this._unscalableList.indexOf(updateTarget); if (index != -1) { this._unscalableList.splice(index, 1); } }; Object.defineProperty(TimerService.prototype, "timeScale", { get: function () { return this._timeScale; }, /** * @private */ set: function (value) { if (value < 0 || isNaN(value)) { value = 1; } this._timeScale = value; }, enumerable: true, configurable: true }); return TimerService; }(Laya.EventDispatcher)); exports.default = TimerService; },{}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserCacheType_1 = require("../gamemodule/userinfo/events/UserCacheType"); var CacheManager_1 = require("../managers/CacheManager"); var TongjiHttps_1 = require("./net/TongjiHttps"); var TimesTamper = /** @class */ (function () { function TimesTamper() { this.lastgameTime = 0; /** * 同步服务器时间(秒) */ this._serverTime = 0; this.iscan = false; this._onlinedistime = 0; this._time = 0; this._onlinetime = 0; } TimesTamper.getInstance = function () { if (!this.instance) { this.instance = new TimesTamper(); } return this.instance; }; TimesTamper.prototype.init = function () { this.lastgameTime = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.lasttime); Laya.timer.frameLoop(1, this, this.update); }; TimesTamper.prototype.updateServiceTime = function (serverTime) { this._serverTime = Number(serverTime); this.iscan = true; this._onlinedistime = this._serverTime; CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lasttime, this._serverTime.toString()); }; TimesTamper.prototype.update = function () { if (this.iscan) { this._time += Laya.timer.delta; this._onlinetime += Laya.timer.delta; this._serverTime += Laya.timer.delta / 1000; if (this._time >= 30000) { this._time = 0; CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lasttime, this._serverTime.toString()); } if (this._onlinetime >= 90000) { this._onlinetime = 0; this.sendonlineTongji(); } } }; TimesTamper.prototype.sendonlineTongji = function () { var distime = this.serverTime - this._onlinedistime; if (distime > 0) { this._onlinedistime = this.serverTime; TongjiHttps_1.default.getInstance().tongjiData("Online", "", distime); } }; Object.defineProperty(TimesTamper.prototype, "serverTime", { /** * 服务器时间 ( 秒 ) * @return * */ get: function () { return this._serverTime; }, enumerable: true, configurable: true }); return TimesTamper; }()); exports.TimesTamper = TimesTamper; },{"../gamemodule/userinfo/events/UserCacheType":55,"../managers/CacheManager":59,"./net/TongjiHttps":28}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool_1 = require("../mvc/ObjectPool"); var ComEventVO = /** @class */ (function () { function ComEventVO() { } ComEventVO.prototype.clear = function () { this.target = null; this.type = null; this.thisObject = null; this.listener = null; ObjectPool_1.default.clearObj(ComEventVO.poolkey, this); }; ComEventVO.poolkey = "ComEventVO"; return ComEventVO; }()); exports.default = ComEventVO; },{"../mvc/ObjectPool":23}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LEvent_1 = require("./LEvent"); var LListener_1 = require("./LListener"); /* * name; */ var EventUtils; (function (EventUtils) { function init() { LListener_1.default.getInstance(); } EventUtils.init = init; //新建事件 function Event(type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } return new LEvent_1.default(type, obj, bubbles, cancelable); } EventUtils.Event = Event; //派发事件 function dispatchEvent(type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } LListener_1.default._instance.dispatchEvent(type, obj); } EventUtils.dispatchEvent = dispatchEvent; //监听事件 function addEventListener(type, thisObject, listener, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } LListener_1.default._instance.addEventListener(type, listener, thisObject, useCapture, priority); } EventUtils.addEventListener = addEventListener; function hasEventListener(type) { return LListener_1.default._instance.hasEventListener(type); } EventUtils.hasEventListener = hasEventListener; function removeEventListener(type, thisObject, listener, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } LListener_1.default._instance.removeEventListener(type, listener, thisObject); } EventUtils.removeEventListener = removeEventListener; })(EventUtils = exports.EventUtils || (exports.EventUtils = {})); },{"./LEvent":17,"./LListener":18}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LEvent = /** @class */ (function (_super) { __extends(LEvent, _super); function LEvent(type, obj, bubbles, cancelable) { if (obj === void 0) { obj = null; } if (bubbles === void 0) { bubbles = false; } if (cancelable === void 0) { cancelable = false; } var _this = _super.call(this) || this; _this.CLASS_NAME = "LEvent"; if (obj) { _this._obj = obj; } return _this; } LEvent.prototype.clone = function (obj) { return new LEvent(this.type, obj ? obj : this._obj); }; LEvent.prototype.toString = function () { console.log(this.CLASS_NAME, "type", "bubbles", "cancelable"); }; Object.defineProperty(LEvent.prototype, "param", { /** * 传参获取 * @returns {any} */ get: function () { return this._obj; }, enumerable: true, configurable: true }); return LEvent; }(Laya.Event)); exports.default = LEvent; },{}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 全局侦听类及消息处理 */ var LListener = /** @class */ (function (_super) { __extends(LListener, _super); function LListener() { var _this = _super.call(this) || this; _this.isInit = false; if (_this.isInit) { } if (_this._dispatcher == null) { _this._dispatcher = new Laya.EventDispatcher(); _this.isInit = true; } return _this; } LListener.getInstance = function () { if (this._instance == null) this._instance = new LListener(); return this._instance; }; LListener.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) { if (useCapture === void 0) { useCapture = false; } if (priority === void 0) { priority = 0; } this._dispatcher.on(type, thisObject, listener); }; LListener.prototype.removeEventListener = function (type, listener, thisObject, useCapture) { if (useCapture === void 0) { useCapture = false; } this._dispatcher.off(type, thisObject, listener); }; LListener.prototype.hasEventListener = function (type) { return this._dispatcher.hasListener(type); }; LListener.prototype.dispatchEvent = function (type, data) { return this._dispatcher.event(type, data); }; return LListener; }(Laya.EventDispatcher)); exports.default = LListener; },{}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MVCObjectPool_1 = require("./MVCObjectPool"); var EventUtils_1 = require("../events/EventUtils"); var Singleton_1 = require("./Singleton"); var GameSocket_1 = require("../net/GameSocket"); var RoleVO_1 = require("../../gamemodule/userinfo/vo/RoleVO"); /* * name; */ var BaseProxys = /** @class */ (function (_super) { __extends(BaseProxys, _super); function BaseProxys() { var _this = _super.call(this) || this; _this._objectPool = MVCObjectPool_1.default.getInstance(); _this.initProxy(); return _this; } BaseProxys.prototype.initProxy = function () { }; /** * 注册全局侦听事件 * */ BaseProxys.prototype.addDataEvent = function (type, callbackobj, callbackHandler) { EventUtils_1.EventUtils.addEventListener(type, callbackobj, callbackHandler); }; /** * 抛出全局事件 */ BaseProxys.prototype.dispacheDataEvent = function (type, data) { if (data === void 0) { data = null; } EventUtils_1.EventUtils.dispatchEvent(type, data); }; /** * 移除全局侦听事件 */ BaseProxys.prototype.removeDataEvent = function (type, callbackobj, callbackHandler) { EventUtils_1.EventUtils.removeEventListener(type, callbackobj, callbackHandler); }; BaseProxys.prototype.getProxy = function (ref) { return this._objectPool.getProxy(ref); }; BaseProxys.prototype.sendMessage = function (act, data, isShowWait) { if (data === void 0) { data = null; } if (isShowWait === void 0) { isShowWait = true; } GameSocket_1.default.getInstance().sendMessage(act, data, isShowWait); }; Object.defineProperty(BaseProxys.prototype, "roleVO", { get: function () { if (!this._roleVo) { this._roleVo = RoleVO_1.default.getInstance(); } return this._roleVo; }, enumerable: true, configurable: true }); return BaseProxys; }(Singleton_1.default)); exports.default = BaseProxys; },{"../../gamemodule/userinfo/vo/RoleVO":57,"../events/EventUtils":16,"../net/GameSocket":27,"./MVCObjectPool":22,"./Singleton":24}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResDataManager_1 = require("../../managers/ResDataManager"); var ResourceManager_1 = require("../../managers/ResourceManager"); var EventUtils_1 = require("../events/EventUtils"); var MVCObjectPool_1 = require("./MVCObjectPool"); var WindowAnmoType_1 = require("./WindowAnmoType"); var UiManager_1 = require("../../managers/UiManager"); var ComEventVO_1 = require("../events/ComEventVO"); var ObjectPool_1 = require("./ObjectPool"); /* * name; */ var BaseView = /** @class */ (function (_super) { __extends(BaseView, _super); /** * 界面初始化 * @param pkgName 包名 * @param resName 界面名 * @param isAddpackage 是否添加包 * @param windowAnmoType 界面打开动画类型 * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件 * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 ) */ function BaseView(pkgName, resName, isAddpackage, windowAnmoType, clickBgIsColse, iscache) { if (pkgName === void 0) { pkgName = ""; } if (resName === void 0) { resName = ""; } if (isAddpackage === void 0) { isAddpackage = false; } if (windowAnmoType === void 0) { windowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none; } if (clickBgIsColse === void 0) { clickBgIsColse = 0; } if (iscache === void 0) { iscache = true; } var _this = _super.call(this) || this; _this.isguideing = false; _this._pkgName = ""; _this._resName = ""; _this._iscache = true; _this._WindowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none; _this._clickBgIsColse = 0; /** * 事件容器 */ _this._eventdict = {}; /** * 全局事件容器 */ _this._globalEventdict = {}; _this._iscache = iscache; _this._pkgName = pkgName; _this._resName = resName; _this._isAddpackage = isAddpackage; _this._WindowAnmoType = windowAnmoType; _this._clickBgIsColse = clickBgIsColse; _this.showModalWait(); return _this; } BaseView.prototype.setclickBgIsColse = function () { if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) { if (!this._clickBg && BaseView.viewbgUrl != "") { this._clickBg = new fairygui.GLoader(); this._clickBg.touchable = true; this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); this._clickBg.url = BaseView.viewbgUrl; this._clickBg.fill = fairygui.LoaderFillType.ScaleFree; this._clickBg.alpha = 0; this.contentPane.addChildAt(this._clickBg, 0); } } }; /** * 加载ui * @param groupName 组名 * @param target 作用域 * @param onLoadedHandler 加载完成回调函数 */ BaseView.prototype.loadUi = function (groupName, target, onLoadedHandler) { this._loadTarget = target; this._onLoadedHandler = onLoadedHandler; ResourceManager_1.default.getInstance().loadGroup(groupName, this, this.loadsucceed); }; /** * 加载资源数组 * @param urls 资源数组 * @param target 作用域 * @param onLoadedHandler 加载完成回调函数 */ BaseView.prototype.loadUibyArr = function (urls, target, onLoadedHandler) { // this.showModalWait(); this._loadTarget = target; this._onLoadedHandler = onLoadedHandler; ResourceManager_1.default.getInstance().Loaders(urls, this, this.loadsucceed); }; BaseView.prototype.loadsucceed = function () { if (this._loadTarget && this._onLoadedHandler) { this._onLoadedHandler.call(this._loadTarget); } }; BaseView.prototype.removeEffectPackage = function (packageName) { ResDataManager_1.default.instance.removePackage(packageName, true); }; BaseView.prototype.getpanelController = function (name) { if (this.item_panel) { return this.item_panel.getController(name); } return null; }; BaseView.prototype.getpanelTransition = function (name) { if (this.item_panel) { return this.item_panel.getTransition(name); } return null; }; BaseView.prototype.getChildformContentPanel = function (name) { if (this.contentPane) { return this.contentPane.getChild(name); } return null; }; /*界面初始化*/ BaseView.prototype.onInit = function () { _super.prototype.onInit.call(this); if (this._pkgName != "" && this._resName != "") { this.parseUi(this._pkgName, this._resName, this._isAddpackage, this._WindowAnmoType, this._clickBgIsColse, this._iscache); } }; //解析ui BaseView.prototype.parseUi = function (pkgname, resname, isaddpackage, windowAnmoType, clickBgIsColse, iscache) { if (windowAnmoType === void 0) { windowAnmoType = WindowAnmoType_1.default.WindowAnmoType_none; } if (clickBgIsColse === void 0) { clickBgIsColse = 0; } if (iscache === void 0) { iscache = true; } this._pkgName = pkgname; this._resName = resname; this._WindowAnmoType = windowAnmoType; this._clickBgIsColse = clickBgIsColse; ResDataManager_1.default.instance.adduiPackage(pkgname, isaddpackage, iscache); this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom; for (var str in this.contentPane._children) { var item = this.contentPane._children[str]; if (item.name == "item_panel") { var itempanel = item; if (itempanel) { for (var str1 in itempanel._children) { var itempanelItem = itempanel._children[str1]; this[itempanelItem.name] = itempanelItem; } } // this[item.name] = item; this.item_panel = item; } else { this[item.name] = item; } } this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height); this.contentPane.setPivot(0.5, 0.5); this.setPivot(0.5, 0.5); this.setclickBgIsColse(); this.initView(); this.initEvent(); this.do1ShowAnimation(); }; BaseView.prototype.initView = function () { }; BaseView.prototype.initEvent = function () { }; BaseView.prototype.do1ShowAnimation = function () { switch (this._WindowAnmoType) { case WindowAnmoType_1.default.WindowAnmoType_none: this.windowanmoend(); break; case WindowAnmoType_1.default.WindowAnmoType_addmoveToMiddle: this.contentPane.x = fairygui.GRoot.inst.width; Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; case WindowAnmoType_1.default.WindowAnmoType_addmoveFromBottom: this.contentPane.y = fairygui.GRoot.inst.height; Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; case WindowAnmoType_1.default.WindowAnmoType_addscaleMinToMax: this.contentPane.scaleX = this.contentPane.scaleY = 0.01; Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend)); break; } }; BaseView.prototype.windowanmoend = function () { Laya.timer.callLater(this, this.onShowView); }; BaseView.prototype.onShowView = function () { this.closeModalWait(); this.showClickBg(); }; BaseView.prototype.showClickBg = function () { if (this._clickBg) { this._clickBg.alpha = 0.55; if (this._clickBgIsColse == 2 && !this.hasClickListener()) { this._clickBg.onClick(this, this.closebgClick); } } }; BaseView.prototype.closebgClick = function () { UiManager_1.UiManager.instance.close(this.viewKey, true); }; /** * 界面关闭事件 */ BaseView.prototype.onCloseView = function (windowAnmoType) { if (windowAnmoType === void 0) { windowAnmoType = ""; } if (this._clickBg) { this._clickBg.visible = false; } if (windowAnmoType == "") { switch (this._WindowAnmoType) { case WindowAnmoType_1.default.WindowAnmoType_none: this.destory(); break; case WindowAnmoType_1.default.WindowAnmoType_addmoveToMiddle: Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case WindowAnmoType_1.default.WindowAnmoType_addmoveFromBottom: Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case WindowAnmoType_1.default.WindowAnmoType_addscaleMinToMax: Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; } } else { switch (windowAnmoType) { case WindowAnmoType_1.default.WindowAnmoType_none: this.destory(); break; case WindowAnmoType_1.default.WindowAnmoType_removescaleMaxToMin: Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; case WindowAnmoType_1.default.WindowAnmoType_removemoveToRight: Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory)); break; } } }; BaseView.prototype.getComById = function (id) { return this.contentPane.getChild(id).asCom; }; BaseView.prototype.getControllerByBame = function (id) { return this.contentPane.getController(id); }; BaseView.prototype.getTransitionByName = function (id) { return this.contentPane.getTransition(id); }; /*获取管理数据模块*/ BaseView.prototype.getProxy = function (d) { return MVCObjectPool_1.default.getInstance().getProxy(d); }; BaseView.prototype.dispacheDataEvent = function (type, data) { if (data === void 0) { data = null; } EventUtils_1.EventUtils.dispatchEvent(type, data); }; /** * 注册全局事件 * @param type * @param thisObject * @param listener */ BaseView.prototype.addDataEvent = function (type, thisObject, listener) { if (!this._globalEventdict.hasOwnProperty(type)) { var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey); this._globalEventdict[type] = vo; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; EventUtils_1.EventUtils.addEventListener(type, thisObject, listener); } }; /** * 移除全局事件 * @param type * @param thisObject * @param listener */ BaseView.prototype.removeDataEvent = function (type, thisObject, listener) { if (this._globalEventdict[type]) { var vo = this._globalEventdict[type]; EventUtils_1.EventUtils.removeEventListener(type, thisObject, listener); vo.clear(); delete this._globalEventdict[type]; } }; /** * 注册组件事件,调用此方法,界面关闭会自动移除 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ BaseView.prototype.addListener = function (target, type, thisObject, listener, args) { if (args === void 0) { args = null; } if (target) { if (target.name == null || target.name == "") { throw "baseview addListener target.name is null"; } var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey); vo.target = target; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; if (!this._eventdict.hasOwnProperty(target.name)) { this._eventdict[target.name] = []; } var bo = this.hasListener(target, type); if (!bo) { target.on(type, thisObject, listener, args); this._eventdict[target.name].push(vo); } } }; BaseView.prototype.hasListener = function (target, type) { var eventArr; eventArr = this._eventdict[target.name]; var childvo; for (var s in eventArr) { childvo = eventArr[s]; if (childvo && childvo.type == type) { return true; } } return false; }; /** * 移除组件事件 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ BaseView.prototype.removesListener = function (target, type, thisObject, listener) { if (target && this._eventdict[target.name]) { var arr = this._eventdict[target.name]; var i = 0; var nums = arr.length; var vo; for (i; i < nums; i++) { vo = arr[i]; if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) { target.off(type, thisObject, listener); vo.clear(); arr.splice(i, 1); break; } } } }; /** * 移除所有全局事件 */ BaseView.prototype.removeAllGlobalEvent = function () { if (this._globalEventdict) { var s; var dict = this._globalEventdict; for (s in dict) { var vo = dict[s]; if (vo) { this.removeDataEvent(vo.type, vo.thisObject, vo.listener); } } } this._globalEventdict = {}; }; /** * 移除所有组件事件 */ BaseView.prototype.removeAllComEvent = function () { if (this._eventdict) { var s; var dict = this._eventdict; var arr; var i; var nums = 0; var vo; for (s in dict) { arr = dict[s]; if (arr && arr.length > 0) { i = 0; nums = arr.length; for (i = nums - 1; i >= 0; i--) { vo = arr[i]; if (vo) { if (vo.target) { vo.target.off(vo.type, vo.thisObject, vo.listener); } vo.clear(); } arr.splice(i, 1); } } delete this._eventdict[s]; } } this._eventdict = {}; }; BaseView.prototype.clearEvent = function () { }; /* 销毁*/ BaseView.prototype.destory = function () { this.clearEvent(); this.closeModalWait(); this.removeAllGlobalEvent(); this.removeAllComEvent(); this._loadTarget = null; this._onLoadedHandler = null; Laya.Tween.clearTween(this); ResDataManager_1.default.instance.removePackage(this._pkgName, false); this._pkgName = null; this._resName = null; if (this._clickBg) { this._clickBg.offClick(this, this.closebgClick); this._clickBg.dispose(); this._clickBg = null; } this.viewKey = null; this.dispose(); }; BaseView.viewbgUrl = ""; return BaseView; }(fairygui.Window)); exports.default = BaseView; },{"../../managers/ResDataManager":62,"../../managers/ResourceManager":63,"../../managers/UiManager":66,"../events/ComEventVO":15,"../events/EventUtils":16,"./MVCObjectPool":22,"./ObjectPool":23,"./WindowAnmoType":25}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventUtils_1 = require("../events/EventUtils"); var MVCObjectPool_1 = require("./MVCObjectPool"); var ComEventVO_1 = require("../events/ComEventVO"); var ObjectPool_1 = require("./ObjectPool"); var ChildBaseView = /** @class */ (function (_super) { __extends(ChildBaseView, _super); function ChildBaseView() { var _this = _super.call(this) || this; _this.isguideing = false; /** * 事件容器 */ _this._eventdict = {}; /** * 全局事件容器 */ _this._globalEventdict = {}; return _this; } ChildBaseView.prototype.constructFromXML = function (xml) { _super.prototype.constructFromXML.call(this, xml); for (var str in this._children) { var item = this._children[str]; this[item.name] = item; } this.onInit(); }; ChildBaseView.prototype.onInit = function () { }; /*获取管理数据模块*/ ChildBaseView.prototype.getProxy = function (d) { return MVCObjectPool_1.default.getInstance().getProxy(d); }; ChildBaseView.prototype.dispacheDataEvent = function (type, data) { if (data === void 0) { data = null; } EventUtils_1.EventUtils.dispatchEvent(type, data); }; ChildBaseView.prototype.hasDataEvent = function (type) { return EventUtils_1.EventUtils.hasEventListener(type); }; /** * 注册全局事件 * @param type * @param thisObject * @param listener */ ChildBaseView.prototype.addDataEvent = function (type, thisObject, listener) { if (!this._globalEventdict.hasOwnProperty(type)) { var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey); this._globalEventdict[type] = vo; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; EventUtils_1.EventUtils.addEventListener(type, thisObject, listener); } }; /** * 移除全局事件 * @param type * @param thisObject * @param listener */ ChildBaseView.prototype.removeDataEvent = function (type, thisObject, listener) { if (this._globalEventdict[type]) { var vo = this._globalEventdict[type]; EventUtils_1.EventUtils.removeEventListener(type, thisObject, listener); vo.clear(); delete this._globalEventdict[type]; } }; /** * 注册组件事件,调用此方法,界面关闭会自动移除 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ ChildBaseView.prototype.addListener = function (target, type, thisObject, listener, args) { if (args === void 0) { args = null; } if (target) { if (target.name == null || target.name == "") { throw "childbaseview addListener target.name is null"; } var vo = ObjectPool_1.default.getObj(ComEventVO_1.default.poolkey); vo.target = target; vo.type = type; vo.thisObject = thisObject; vo.listener = listener; if (!this._eventdict.hasOwnProperty(target.name)) { this._eventdict[target.name] = []; } var bo = this.hasListener(target, type); if (!bo) { target.on(type, thisObject, listener, args); this._eventdict[target.name].push(vo); } } }; ChildBaseView.prototype.hasListener = function (target, type) { var eventArr; eventArr = this._eventdict[target.name]; var childvo; for (var s in eventArr) { childvo = eventArr[s]; if (childvo && childvo.type == type) { return true; } } return false; }; /** * 移除组件事件 * @param type 时间类型 * @param callbackobj 作用域 * @param callbackHandler 事件回调 */ ChildBaseView.prototype.removesListener = function (target, type, thisObject, listener) { if (target && this._eventdict[target.name]) { var arr = this._eventdict[target.name]; var i = 0; var nums = arr.length; var vo; for (i; i < nums; i++) { vo = arr[i]; if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) { target.off(type, thisObject, listener); vo.clear(); arr.splice(i, 1); break; } } } }; /** * 移除所有全局事件 */ ChildBaseView.prototype.removeAllGlobalEvent = function () { if (this._globalEventdict) { var s; var dict = this._globalEventdict; for (s in dict) { var vo = dict[s]; if (vo) { this.removeDataEvent(vo.type, vo.thisObject, vo.listener); } } } this._globalEventdict = {}; }; /** * 移除所有组件事件 */ ChildBaseView.prototype.removeAllComEvent = function () { if (this._eventdict) { var s; var dict = this._eventdict; var arr; var i; var nums = 0; var vo; for (s in dict) { arr = dict[s]; if (arr && arr.length > 0) { i = 0; nums = arr.length; for (i = nums - 1; i >= 0; i--) { vo = arr[i]; if (vo) { if (vo.target) { vo.target.off(vo.type, vo.thisObject, vo.listener); } vo.clear(); } arr.splice(i, 1); } } delete this._eventdict[s]; } } this._eventdict = {}; }; ChildBaseView.prototype.dispose = function () { this.removeAllGlobalEvent(); this.removeAllComEvent(); _super.prototype.dispose.call(this); }; return ChildBaseView; }(fairygui.GComponent)); exports.default = ChildBaseView; },{"../events/ComEventVO":15,"../events/EventUtils":16,"./MVCObjectPool":22,"./ObjectPool":23}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Singleton_1 = require("./Singleton"); /* * name; */ var MVCObjectPool = /** @class */ (function (_super) { __extends(MVCObjectPool, _super); function MVCObjectPool() { return _super.call(this) || this; } MVCObjectPool.getInstance = function () { if (this._instance == null) { this._instance = new MVCObjectPool(); } return this._instance; }; MVCObjectPool.prototype.addProxy = function (ref) { Singleton_1.default.create(ref); }; MVCObjectPool.prototype.getProxy = function (ref) { return Singleton_1.default.getInstance(ref); }; MVCObjectPool.prototype.removeProxy = function (ref) { Singleton_1.default.remove(ref); }; MVCObjectPool.prototype.mapView = function (viewkey, ref) { if (!MVCObjectPool._mapviewDict[viewkey]) { MVCObjectPool._mapviewDict[viewkey] = ref; ref.key = viewkey; } }; MVCObjectPool.getView = function (viewkey) { if (!MVCObjectPool._mapviewDict[viewkey]) { throw "err0 未绑定的viewkey:" + viewkey; } return MVCObjectPool._mapviewDict[viewkey]; }; MVCObjectPool._mapviewDict = {}; return MVCObjectPool; }(Laya.EventDispatcher)); exports.default = MVCObjectPool; },{"./Singleton":24}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * 对象池类 */ var ObjectPool = /** @class */ (function (_super) { __extends(ObjectPool, _super); function ObjectPool() { return _super.call(this) || this; } ObjectPool.register = function (key, classarg) { ObjectPool._classargDict[key] = classarg; ObjectPool._content[key] = []; }; ObjectPool.getObj = function (key) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (ObjectPool._content[key]) { var arr = ObjectPool._content[key]; if (arr.length == 0) { var calssobj = ObjectPool._classargDict[key]; var vo = new calssobj(); return vo; } return ObjectPool._content[key].shift(); } else { console.log("此key值对应的类未被注册"); return null; } }; ObjectPool.getObjByfgui = function (url) { if (!ObjectPool._content[url]) { ObjectPool._content[url] = []; } var arr = ObjectPool._content[url]; if (arr.length == 0) { var vo = fairygui.UIPackage.createObjectFromURL(url); return vo; } return ObjectPool._content[url].shift(); }; ObjectPool.clearObj = function (key, obj) { if (ObjectPool._content[key]) { var index = ObjectPool._content[key].indexOf(obj); if (index == -1) { ObjectPool._content[key].push(obj); } } }; ObjectPool._classargDict = {}; ObjectPool._content = {}; return ObjectPool; }(Laya.EventDispatcher)); exports.default = ObjectPool; },{}],24:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var Singleton = /** @class */ (function (_super) { __extends(Singleton, _super); function Singleton() { return _super.call(this) || this; } /** * 获取单例类,若不存在则返回空 * @param ref 继承自Singleton的类 * @return * */ Singleton.getInstance = function (ref) { if (ref.key == null) { throw new Error("getinstance erro"); } return this._dict[ref.key]; }; /** * 获取单例类,若不存在则创建 * @param ref 继承自Singleton的类 * @return * */ Singleton.getInstanceOrCreate = function (ref) { if (ref.key == null) { throw new Error("getInstanceOrCreate erro"); } this.create(ref); return this._dict[ref.key]; }; /** * 创建单例类 * @param ref 继承自Singleton的类 * @return void */ Singleton.create = function (ref) { if (ref.key == null) { throw new Error("create erro"); } if (this._dict[ref.key] == null) { this._dict[ref.key] = new ref(); } return this._dict[ref.key]; }; /** * 删除单例类 * @param ref 继承自Singleton的类 * @return void */ Singleton.remove = function (ref) { var key = ref.key; if (this._dict[key] != null) { this._dict[key].destory(); } }; /** * 销毁方法 */ Singleton.prototype.destory = function () { }; Singleton._dict = {}; return Singleton; }(Laya.EventDispatcher)); exports.default = Singleton; },{}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 继承baseView界面的打开关闭动效类型 */ var WindowAnmoType = /** @class */ (function () { function WindowAnmoType() { } /** * 没有动效 */ WindowAnmoType.WindowAnmoType_none = "WindowAnmoType_none"; /** * 从右边移动到中央 */ WindowAnmoType.WindowAnmoType_addmoveToMiddle = "WindowAnmoType_addmoveToMiddle"; /** * 从最右边移出 */ WindowAnmoType.WindowAnmoType_removemoveToRight = "WindowAnmoType_removemoveToRight"; /** * 从底部向上移动 */ WindowAnmoType.WindowAnmoType_addmoveFromBottom = "WindowAnmoType_addmoveFromBottom"; /** * 从上向底部移动 */ WindowAnmoType.WindowAnmoType_addmoveFromup = "WindowAnmoType_addmoveFromup"; /** * 从小变大 */ WindowAnmoType.WindowAnmoType_addscaleMinToMax = "WindowAnmoType_addscaleMinToMax"; /** * 从大变小移出 */ WindowAnmoType.WindowAnmoType_removescaleMaxToMin = "WindowAnmoType_removescaleMaxToMin"; return WindowAnmoType; }()); exports.default = WindowAnmoType; },{}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Debuger_1 = require("../Debuger"); var Global_1 = require("../../Global"); /* * name; */ var GameHttps = /** @class */ (function (_super) { __extends(GameHttps, _super); function GameHttps() { var _this = _super.call(this) || this; _this._isrequesting = false; _this.init(); return _this; } GameHttps.getInstance = function () { if (null == this._instance) { this._instance = new GameHttps(); } return this._instance; }; GameHttps.prototype.init = function () { this._callbackList = []; this.hr = new Laya.HttpRequest(); // if(this.hr.http) // { // this.hr.http.timeout = 5000;//设置超时时间; // } this.hr.on(Laya.Event.PROGRESS, this, this.onHttpRequestProgress); this.hr.on(Laya.Event.COMPLETE, this, this.onHttpRequestComplete); this.hr.on(Laya.Event.ERROR, this, this.onHttpRequestError); }; GameHttps.prototype.sendPost = function (act, data, callback, callbackobj, isShowWait) { if (isShowWait === void 0) { isShowWait = false; } var itemdata = {}; itemdata.act = act; itemdata.data = data; itemdata.callback = callback; itemdata.callbackobj = callbackobj; itemdata.isShowWait = isShowWait; itemdata.sendtype = "post"; itemdata.httpurl = Global_1.Global.httpurl; this._callbackList.push(itemdata); this.sendByPost(act, data, callback, callbackobj, isShowWait); }; GameHttps.prototype.sendbyHttpurl = function (url, act, data, callback, callbackobj, isShowWait) { if (isShowWait === void 0) { isShowWait = false; } var itemdata = {}; itemdata.act = act; itemdata.data = data; itemdata.callback = callback; itemdata.callbackobj = callbackobj; itemdata.isShowWait = isShowWait; itemdata.sendtype = "get"; itemdata.httpurl = url; this._callbackList.push(itemdata); this.sendbyget(act, data, callback, callbackobj, isShowWait); }; GameHttps.prototype.sendByPost = function (act, data, callbackobj, callback, isShowWait) { if (isShowWait === void 0) { isShowWait = false; } if (this._isrequesting) { return; } this._isrequesting = true; if (isShowWait) { fairygui.GRoot.inst.showModalWait(); } Debuger_1.default.log("http:" + Global_1.Global.httpurl + act, data); this.hr.send(Global_1.Global.httpurl + act, data, "post", "json", ["Content-Type", "application/json"]); }; GameHttps.prototype.sendGet = function (act, data, callbackobj, callback, isShowWait) { if (act === void 0) { act = null; } if (data === void 0) { data = null; } if (callbackobj === void 0) { callbackobj = null; } if (callback === void 0) { callback = null; } if (isShowWait === void 0) { isShowWait = true; } var itemdata = {}; itemdata.act = act; itemdata.data = data; itemdata.callback = callback; itemdata.callbackobj = callbackobj; itemdata.isShowWait = isShowWait; itemdata.sendtype = "get"; itemdata.httpurl = Global_1.Global.httpurl; this._callbackList.push(itemdata); this.sendbyget(act, data, callback, callbackobj, isShowWait); }; GameHttps.prototype.sendbyget = function (act, data, callback, callbackobj, isShowWait) { if (act === void 0) { act = null; } if (data === void 0) { data = null; } if (callback === void 0) { callback = null; } if (callbackobj === void 0) { callbackobj = null; } if (isShowWait === void 0) { isShowWait = false; } if (this._isrequesting) { return; } if (isShowWait) { fairygui.GRoot.inst.showModalWait(); } var itemData = this._callbackList[0]; var sendurl = ""; if (data) { data.ACTION = act; sendurl = itemData.httpurl + "request?json=" + JSON.stringify(data); } else { sendurl = itemData.httpurl; } Debuger_1.default.log("GameHttp:send:", sendurl); this.hr.send(sendurl, null, "get", "text"); }; GameHttps.prototype.onHttpRequestError = function (e) { Debuger_1.default.log("********onHttpRequestError********"); if (e) { Debuger_1.default.log(e); } fairygui.GRoot.inst.closeModalWait(); this._isrequesting = false; }; GameHttps.prototype.onHttpRequestProgress = function (e) { }; GameHttps.prototype.onHttpRequestComplete = function (e) { fairygui.GRoot.inst.closeModalWait(); Debuger_1.default.log("httpReceive:", this.hr.data); this._isrequesting = false; if (this._callbackList.length > 0) { var itemData = this._callbackList.shift(); this.checkMessage(); var callback = itemData.callback; var callbackobj = itemData.callbackobj; var data = JSON.parse(this.hr.data); if (this.hr.data != "") { if (data.hasOwnProperty("ACTIONCOM")) { if (data.ACTIONCOM == 0) //succeed { if (callback && callbackobj) { callback.call(callbackobj, data.JSDATA); } } else //faild { } } } } }; GameHttps.prototype.checkMessage = function () { if (this._callbackList.length > 0) { var nextItemData = this._callbackList[0]; if (nextItemData.sendtype == "post") { this.sendByPost(nextItemData.act, nextItemData.data, nextItemData.callback, nextItemData.callbackobj, nextItemData.isShowWait); } else { this.sendbyget(nextItemData.act, nextItemData.data, nextItemData.callback, nextItemData.callbackobj, nextItemData.isShowWait); } } }; return GameHttps; }(Laya.EventDispatcher)); exports.default = GameHttps; },{"../../Global":2,"../Debuger":12}],27:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventUtils_1 = require("../events/EventUtils"); var Debuger_1 = require("../Debuger"); var SocketNofify_1 = require("../notification/SocketNofify"); var GameSocket = /** @class */ (function () { function GameSocket() { /** * 1:自动断线,2:主动断线 */ this._offlinestate = 0; /** * 断线重连次数 */ this._connetNums = 0; /** * socket连接中 */ this._socketconneting = false; } GameSocket.getInstance = function () { if (this._instance == null) { this._instance = new GameSocket(); } return this._instance; }; //连接服务器 GameSocket.prototype.connectServer = function (gameHost) { this._socketconneting = true; this.removeSocket(); if (!this.sock || !this.sock.connected) { this.openwaitpanel(); if (!this.sock) { this.sock = new Laya.Socket(); this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen); this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage); this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose); this.sock.on(Laya.Event.ERROR, this, this.ioErro); } Debuger_1.default.log("开始连接socket:" + gameHost); this.sock.connectByUrl(gameHost); } }; GameSocket.prototype.isConnect = function () { if (this.sock && this.sock.connected) { return true; } return false; }; GameSocket.prototype.ioErro = function (e) { if (e === void 0) { e = null; } Debuger_1.default.log("gamesocketIOErrorEvent:" + e.type); this._socketconneting = false; this._connetNums++; this.closewaitpanel(); this.removeSocket(); this._offlinestate = 1; }; GameSocket.prototype.removeSocket = function () { this._socketconneting = false; if (this.sock) { this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen); this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage); this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose); this.sock.off(Laya.Event.ERROR, this, this.ioErro); this.sock.cleanSocket(); this.sock.close(); this.sock = null; } }; /** * 手动关闭游戏socket */ GameSocket.prototype.colseSocket = function (offlinestate) { if (offlinestate === void 0) { offlinestate = 1; } if (this.isConnect()) { this.closewaitpanel(); this.removeSocket(); if (offlinestate != -1) { this._offlinestate = offlinestate; } EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CLOSE); } }; GameSocket.prototype.onSocketClose = function (e) { if (e === void 0) { e = null; } this._socketconneting = false; Debuger_1.default.log("socket 关闭"); this.closewaitpanel(); this._offlinestate = 1; EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CLOSE); }; GameSocket.prototype.closewaitpanel = function () { fairygui.GRoot.inst.closeModalWait(); }; GameSocket.prototype.openwaitpanel = function () { fairygui.GRoot.inst.showModalWait(); }; //连接成功返回 GameSocket.prototype.onSocketOpen = function (event) { if (event === void 0) { event = null; } this._connetNums = 0; this.closewaitpanel(); Debuger_1.default.log("socket 连接成功"); this._offlinestate = 0; EventUtils_1.EventUtils.dispatchEvent(SocketNofify_1.default.SOCKET_CONNECT_SUCCEED, null, false); }; //向服务端发送消息 GameSocket.prototype.sendMessage = function (act, data, isShowWait) { if (isShowWait === void 0) { isShowWait = true; } if (this.sock && this.sock.connected) { if (isShowWait) { this.openwaitpanel(); } if (!data) { data = {}; } data.ACTION = act; this.sock.send(JSON.stringify(data)); Debuger_1.default.log("socket send:" + JSON.stringify(data)); } else { Debuger_1.default.log("当前socket未连接"); } }; //消息返回后,会广播出去 //Global.addEventListener("你发送的cmd名称",监听方法,this) GameSocket.prototype.onReceiveMessage = function (msg) { if (msg === void 0) { msg = null; } var socketdata = JSON.parse(msg); Debuger_1.default.log("socket receive:", socketdata); }; return GameSocket; }()); exports.default = GameSocket; },{"../Debuger":12,"../events/EventUtils":16,"../notification/SocketNofify":30}],28:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Debuger_1 = require("../Debuger"); var Global_1 = require("../../Global"); var PlatfromType_1 = require("../../platform/PlatfromType"); var PlatformEvent_1 = require("../../platform/events/PlatformEvent"); /* * name; */ var TongjiHttps = /** @class */ (function (_super) { __extends(TongjiHttps, _super); function TongjiHttps() { var _this = _super.call(this) || this; _this._iscanSend = true; _this.init(); return _this; } TongjiHttps.getInstance = function () { if (null == this._instance) { this._instance = new TongjiHttps(); } return this._instance; }; TongjiHttps.prototype.init = function () { this.hr = new Laya.HttpRequest(); }; TongjiHttps.prototype.send = function (act, data) { if (data === void 0) { data = null; } if (this._iscanSend) { this.sendbyget(act, data); } }; TongjiHttps.prototype.tongjiData = function (TID2, TID3, Num, Total, Datas) { if (TID3 === void 0) { TID3 = ""; } if (Num === void 0) { Num = 0; } if (Total === void 0) { Total = 0; } if (Datas === void 0) { Datas = ""; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: this.sendTongjiData(PlatformEvent_1.default.message_9891002, TID2, TID3, Num, Total, Datas); break; } }; TongjiHttps.prototype.sendTongjiData = function (act, TID2, TID3, Num, Total, Datas) { if (Num === void 0) { Num = 0; } var itemd = {}; itemd.TID2 = TID2; itemd.TID3 = TID3; itemd.Num = Math.floor(Num); itemd.Total = Total; itemd.Datas = Datas; itemd.MEMBERID = Global_1.Global.MemberID; itemd.AppKeyID = Global_1.Global.AppKeyID; this.sendbyget(act, itemd); }; TongjiHttps.prototype.sendbyget = function (act, data) { if (data === void 0) { data = null; } if (data) { var sendurl = ""; data.ACTION = act; sendurl = Global_1.Global.httpurl + "request?json=" + JSON.stringify(data); Debuger_1.default.log("***sendtongji***:", sendurl); this.hr.send(sendurl, null, "get", "text"); } }; return TongjiHttps; }(Laya.EventDispatcher)); exports.default = TongjiHttps; },{"../../Global":2,"../../platform/PlatfromType":68,"../../platform/events/PlatformEvent":69,"../Debuger":12}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * * @author * */ var LayerNotify; (function (LayerNotify) { /** * 背景层 */ LayerNotify.LAYER_BACKGROUND = "LAYER_BACKGROUND"; /** * ui层 */ LayerNotify.LAYER_UILAYER = "LAYER_UILAYER"; /** * ui层上层 */ LayerNotify.LAYER_UPUILAYER = "LAYER_UPUILAYER"; /** * tips层 */ LayerNotify.LAYER_TIPSLAYER = "LAYER_TIPSLAYER"; /** * 新手引导层 */ LayerNotify.LAYER_GUIDELAYER = "LAYER_GUIDELAYER"; })(LayerNotify = exports.LayerNotify || (exports.LayerNotify = {})); },{}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SocketNofify = /** @class */ (function () { function SocketNofify() { } /** * socket连接成功 */ SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED"; /** * socket关闭 */ SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE"; /** * 游戏重新连接 */ SocketNofify.Game_againConnetSocket = "Game_againConnetSocket"; return SocketNofify; }()); exports.default = SocketNofify; },{}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var BaseVO = /** @class */ (function (_super) { __extends(BaseVO, _super); function BaseVO() { return _super.call(this) || this; } BaseVO.prototype.setInfo = function (data) { if (data) { for (var s in data) { var itemd = this[s]; if (itemd != null) { this[s] = data[s]; } // else // { // Debuger.log( "VO:未定义属性-" + s ); // } } } }; BaseVO.prototype.dispatchEvent = function (type, data) { this.event(type, data); }; return BaseVO; }(Laya.EventDispatcher)); exports.BaseVO = BaseVO; },{}],32:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool_1 = require("../mvc/ObjectPool"); /* * name; */ var CacheVO = /** @class */ (function (_super) { __extends(CacheVO, _super); function CacheVO() { var _this = _super !== null && _super.apply(this, arguments) || this; /** * 引用次数 */ _this.ref = 0; /** * 最后一次被引用的时间 */ _this.time = 0; /** * 包名 */ _this.packageName = ""; return _this; } CacheVO.prototype.clear = function () { this.ref = 0; this.time = 0; this.packageName = ""; ObjectPool_1.default.clearObj(CacheVO.poolkey, this); }; CacheVO.poolkey = "CacheVO"; return CacheVO; }(Laya.EventDispatcher)); exports.default = CacheVO; },{"../mvc/ObjectPool":23}],33:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var JoystickModule = /** @class */ (function (_super) { __extends(JoystickModule, _super); function JoystickModule(clickpanel) { var _this = _super.call(this) || this; _this.dis = 0; _this.degree = 0; _this.angle = 0; _this.offx = 0; _this._iscanCBack = false; _this._iacanCallback = false; _this._clickpanel = clickpanel; _this._button = new Laya.Point(); _this.touchId = -1; _this.radius = 400; _this._curPos = new Laya.Point(); _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown); return _this; } JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) { this._callobj = callobj; this._downCallback = downCallback; this._movecallback = movecallback; this._updatecallback = upcallback; }; JoystickModule.prototype.Trigger = function (evt) { this.onTouchDown(evt); }; JoystickModule.prototype.onTouchDown = function (evt) { if (this.touchId == -1) { //First touch this.touchId = evt.touchId; this.offx = 0; this._iscanCBack = false; fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos); var bx = this._curPos.x; var by = this._curPos.y; this._lastStageX = bx; this._lastStageY = by; this._startStageX = bx; this._startStageY = by; this._button.x = bx; this._button.y = by; if (this._callobj && this._downCallback) { this._downCallback.call(this._callobj); } this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove); this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp); this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp); } }; JoystickModule.prototype.OnTouchUp = function (evt) { if (evt === void 0) { evt = null; } if (this.touchId != -1 && evt.touchId == this.touchId) { this.touchup(); if (this._callobj && this._updatecallback) { this._updatecallback.call(this._callobj); } } }; JoystickModule.prototype.touchup = function () { this._iscanCBack = false; this.touchId = -1; this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove); this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp); this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp); this._iacanCallback = false; this.degree = 0; }; JoystickModule.prototype.OnTouchMove = function (evt) { if (this.touchId != -1 && evt.touchId == this.touchId) { var bx = Laya.stage.mouseX; var by = Laya.stage.mouseY; var moveX = bx - this._lastStageX; var moveY = by - this._lastStageY; this._lastStageX = bx; this._lastStageY = by; var buttonX = this._button.x + moveX; var buttonY = this._button.y + moveY; var offsetX = buttonX - this._startStageX; var offsetY = buttonY - this._startStageY; var disX = 0; if (moveX >= 2 || moveX <= -2) { this._iscanCBack = true; } else { this._iscanCBack = false; } this.offx = moveX; if (offsetX == 0 && offsetY == 0) { return; } if (offsetX > 0) { if (offsetX > this.radius) { disX = this.radius; this.angle = 90; } else { disX = this.radius - offsetX; this.angle = 90 - disX / this.radius * 90; } } else if (offsetX == 0) { this.angle = 0; } else { if (-offsetX > this.radius) { disX = this.radius; this.angle = -90; } else { disX = this.radius + offsetX; this.angle = -(90 - disX / this.radius * 90); } } var rad = Math.atan2(offsetY, offsetX); this.degree = rad; var maxX = this.radius * Math.cos(rad); var maxY = this.radius * Math.sin(rad); if (Math.abs(offsetX) > Math.abs(maxX)) offsetX = maxX; if (Math.abs(offsetY) > Math.abs(maxY)) offsetY = maxY; buttonX = this._startStageX + offsetX; buttonY = this._startStageY + offsetY; if (buttonX < 0) buttonX = 0; if (buttonY > fairygui.GRoot.inst.height) buttonY = fairygui.GRoot.inst.height; this._button.x = buttonX; this._button.y = buttonY; this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY); this._iacanCallback = true; if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) { this._movecallback.call(this._callobj, this.offx); } } }; JoystickModule.prototype.dispose = function () { this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown); }; // private _center:fairygui.GImage; JoystickModule.JoystickMoving = "JoystickMoving"; JoystickModule.JoystickUp = "JoystickUp"; return JoystickModule; }(Laya.EventDispatcher)); exports.JoystickModule = JoystickModule; },{}],34:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UiManager_1 = require("../../../managers/UiManager"); var LoadingView_1 = require("../view/LoadingView"); var Debuger_1 = require("../../../frameworks/Debuger"); var PathConfig_1 = require("../../../configs/gameConfigs/PathConfig"); var ResourceManager_1 = require("../../../managers/ResourceManager"); var ResDataManager_1 = require("../../../managers/ResDataManager"); var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy"); var PlatformEvent_1 = require("../../../platform/events/PlatformEvent"); var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys"); var MainProxy_1 = require("../../main/proxys/MainProxy"); var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG"); var LevelCFG_1 = require("../../../configs/dataConfigs/LevelCFG"); var BuildCFG_1 = require("../../../configs/dataConfigs/BuildCFG"); var NpcCFG_1 = require("../../../configs/dataConfigs/NpcCFG"); var GameCFG_1 = require("../../../configs/dataConfigs/GameCFG"); var SkinProxy_1 = require("../../skins/proxys/SkinProxy"); var Sdk_1 = require("../../../platform/wxminigame/WXSDK/Sdk"); var YQSdk_1 = require("../../../platform/wxminigame/WXSDK/YQSdk"); var PlayerAccount_1 = require("../../../platform/wxminigame/WXSDK/PlayerAccount"); var NetworkManager_1 = require("../../../platform/wxminigame/NetworkManager"); var Global_1 = require("../../../Global"); var LoginProxy = /** @class */ (function (_super) { __extends(LoginProxy, _super); function LoginProxy() { return _super.call(this) || this; } LoginProxy.prototype.initProxy = function () { this.addDataEvent(PlatformEvent_1.default.PlatformEvent_loginSucceed, this, this.loginsucceed); }; LoginProxy.prototype.startLogin = function () { UiManager_1.UiManager.instance.add(LoadingView_1.default); this.loginprogress(0); if (Laya.Browser.onWeiXin) { this.LoginYQ(); } else { // this.loginsucceed(); this.LoginLocalSever(); } // PlatformTool.getInstance().login( ); }; LoginProxy.prototype.LoginYQ = function () { var _this = this; Sdk_1.WxApi.recordAldEvent("开始微信登录"); Sdk_1.WxApi.WXLogin(function (res) { if (res != "error") { Sdk_1.WxApi.recordAldEvent("微信登录成功"); console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId); YQSdk_1.YQSdk.login(res.code, Sdk_1.WxApi.querychannel, Sdk_1.WxApi.referrerInfoappId, function () { Laya.Browser.window.wx.onHide(function () { YQSdk_1.YQSdk.exposure(); }); _this.LoginLocal(); }); } else { Sdk_1.WxApi.recordAldEvent("微信登录失败"); _this.LoginYQ(); } }); }; LoginProxy.prototype.LoginLocal = function () { var _this = this; Sdk_1.WxApi.recordAldEvent("开始登录"); Sdk_1.WxApi.WXLogin(function (res) { if (res != "error") { Sdk_1.WxApi.recordAldEvent("微信登录成功2"); _this.LoginLocalSever(res); } else { Sdk_1.WxApi.recordAldEvent("微信登录失败"); _this.LoginLocal(); } }); }; LoginProxy.prototype.LoginLocalSever = function (res) { if (res === void 0) { res = null; } Sdk_1.WxApi.recordAldEvent("开始本地登录"); if (res) { new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion); } NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.OnLoginLocalComplete), Laya.Handler.create(this, this.OnLoginError)); //this.LoadSbp(); }; LoginProxy.prototype.OnLoginLocalComplete = function () { Sdk_1.WxApi.recordAldEvent("本地服务器登录完成..."); Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid); this.loginsucceed(); }; LoginProxy.prototype.OnLoginError = function (e) { console.log(e); }; LoginProxy.prototype.loginprogress = function (value) { var loadingview = UiManager_1.UiManager.instance.getView(LoadingView_1.default); if (loadingview) { loadingview.showWord(value); } }; LoginProxy.prototype.loginsucceed = function () { Debuger_1.default.log("登录成功"); // this.loadconfig(); if (Laya.Browser.onWeiXin) { this.parseConfig1(); this.initData(); this.enterMain(); } else { this.loadconfig(); // this.parseConfig1( ); // this.initData(); // this.enterMain(); } }; /** * 解析配置数据 */ LoginProxy.prototype.parseConfig1 = function () { var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config; Debuger_1.default.log("配置表数据:", byteData); if (byteData && byteData != "") { var arr = byteData.split("%file%"); var i; var nums = arr.length; for (i = 0; i < nums; i++) { var itemarr = arr[i].split("%cfg%"); var cla = LoginProxy.configClass[itemarr[0]]; if (cla) { cla.initCfg(itemarr[1]); } else { Debuger_1.default.log("没有注册此类" + itemarr[0]); } } return true; } return false; }; LoginProxy.prototype.loadconfig = function () { var pathArr = []; pathArr.push({ url: PathConfig_1.PathConfig.getConfig("gameConfig"), type: Laya.Loader.TEXT }); ResourceManager_1.default.getInstance().Loaders(pathArr, this, this.configComplete, this.loginprogress, false); }; LoginProxy.prototype.configComplete = function () { this.parseConfig(); this.initData(); this.enterMain(); }; /** * 初始化游戏数据 */ LoginProxy.prototype.initData = function () { this.getProxy(UserInfoProxy_1.default).init(); this.getProxy(SkinProxy_1.default).init(); }; LoginProxy.prototype.enterMain = function () { console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length); this.getProxy(MainProxy_1.default).enterMain(); }; /** * 解析配置数据 */ LoginProxy.prototype.parseConfig = function () { var byteData = ResDataManager_1.default.getInastance().getResByurl(PathConfig_1.PathConfig.getConfig("gameConfig")); if (byteData && byteData != "") { var arr = byteData.split("%file%"); var i; var nums = arr.length; for (i = 0; i < nums; i++) { var itemarr = arr[i].split("%cfg%"); var cla = LoginProxy.configClass[itemarr[0]]; if (cla) { cla.initCfg(itemarr[1]); } else { Debuger_1.default.log("没有注册此类" + itemarr[0]); } } return true; } return false; }; LoginProxy.key = "LoginProxy"; LoginProxy.configClass = { RoleCFG: RoleCFG_1.default, LevelCFG: LevelCFG_1.default, BuildCFG: BuildCFG_1.default, NpcCFG: NpcCFG_1.default, GameCFG: GameCFG_1.default }; return LoginProxy; }(BaseProxys_1.default)); exports.default = LoginProxy; },{"../../../Global":2,"../../../configs/dataConfigs/BuildCFG":5,"../../../configs/dataConfigs/GameCFG":6,"../../../configs/dataConfigs/LevelCFG":7,"../../../configs/dataConfigs/NpcCFG":8,"../../../configs/dataConfigs/RoleCFG":9,"../../../configs/gameConfigs/PathConfig":10,"../../../frameworks/Debuger":12,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/ResDataManager":62,"../../../managers/ResourceManager":63,"../../../managers/UiManager":66,"../../../platform/events/PlatformEvent":69,"../../../platform/wxminigame/NetworkManager":71,"../../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../../platform/wxminigame/WXSDK/Sdk":75,"../../../platform/wxminigame/WXSDK/YQSdk":77,"../../main/proxys/MainProxy":40,"../../skins/proxys/SkinProxy":51,"../../userinfo/UserInfoProxy":53,"../view/LoadingView":35}],35:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../../frameworks/mvc/BaseView"); var LoadingView = /** @class */ (function (_super) { __extends(LoadingView, _super); function LoadingView() { return _super.call(this, "loading", "loading") || this; } LoadingView.prototype.onInit = function () { _super.prototype.onInit.call(this); }; LoadingView.prototype.initView = function () { }; LoadingView.prototype.initEvent = function () { }; LoadingView.prototype.showWord = function (value) { this.pro_bar.value = value; }; LoadingView.prototype.clearEvent = function () { }; LoadingView.prototype.destory = function () { this.clearEvent(); _super.prototype.destory.call(this); }; LoadingView.key = "LoadingView"; return LoadingView; }(BaseView_1.default)); exports.default = LoadingView; },{"../../../frameworks/mvc/BaseView":20}],36:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var WordTipsView_1 = require("./WordTipsView"); var GameLayerManager_1 = require("../../../managers/GameLayerManager"); var LayerNotify_1 = require("../../../frameworks/notification/LayerNotify"); var EventUtils_1 = require("../../../frameworks/events/EventUtils"); var GameEvent_1 = require("../../userinfo/events/GameEvent"); /* * name; */ var WordTipsUtils = /** @class */ (function () { function WordTipsUtils() { } WordTipsUtils.getInstance = function () { if (!this._instance) { this._instance = new WordTipsUtils(); } return this._instance; }; WordTipsUtils.prototype.initEvent = function () { WordTipsUtils.isEvent = true; EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.removeselect, this, this.addwordList); }; WordTipsUtils.prototype.showWordTips = function (word) { if (!WordTipsUtils.isEvent) { WordTipsUtils.getInstance().initEvent(); } if (WordTipsUtils.showWordList.length > 0) { var lastword = WordTipsUtils.showWordList[WordTipsUtils.showWordList.length - 1].nowword; // if( lastword == word ) // { // return; // } } if (WordTipsUtils.wordList.length > 0) { var item = WordTipsUtils.wordList.shift(); GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(item, LayerNotify_1.LayerNotify.LAYER_TIPSLAYER); WordTipsUtils.showWordList.push(item); item.showWord(word); } else { if (WordTipsUtils.showWordList.length < 10) { var item1 = new WordTipsView_1.WordTipsView(); GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(item1, LayerNotify_1.LayerNotify.LAYER_TIPSLAYER); WordTipsUtils.showWordList.push(item1); item1.showWord(word); } else { var item1 = WordTipsUtils.showWordList.shift(); item1.showWord(word); WordTipsUtils.showWordList.push(item1); } } }; WordTipsUtils.prototype.addwordList = function (item) { if (item) { item.removeFromParent(); var index = WordTipsUtils.showWordList.indexOf(item); if (index != -1) { WordTipsUtils.showWordList.splice(index, 1); } GameLayerManager_1.GameLayerManager.getInstance().removeformLayer(LayerNotify_1.LayerNotify.LAYER_TIPSLAYER); WordTipsUtils.wordList.push(item); } }; WordTipsUtils.wordList = []; WordTipsUtils.showWordList = []; WordTipsUtils.maxNum = 10; WordTipsUtils.isEvent = false; return WordTipsUtils; }()); exports.WordTipsUtils = WordTipsUtils; },{"../../../frameworks/events/EventUtils":16,"../../../frameworks/notification/LayerNotify":29,"../../../managers/GameLayerManager":61,"../../userinfo/events/GameEvent":54,"./WordTipsView":37}],37:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../../frameworks/mvc/BaseView"); var EventUtils_1 = require("../../../frameworks/events/EventUtils"); var GameEvent_1 = require("../../userinfo/events/GameEvent"); /* * name; */ var WordTipsView = /** @class */ (function (_super) { __extends(WordTipsView, _super); function WordTipsView() { var _this = _super.call(this, "loading", "wordTips") || this; _this.nowword = ""; return _this; } WordTipsView.prototype.onInit = function () { _super.prototype.onInit.call(this); this.t1 = this.getpanelTransition("t1"); }; WordTipsView.prototype.showWord = function (word) { this.nowword = word; this.text_word.text = word; this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1); }; WordTipsView.prototype.playEndCallback = function () { EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.removeselect, this); }; WordTipsView.key = "WordTipsView"; return WordTipsView; }(BaseView_1.default)); exports.WordTipsView = WordTipsView; },{"../../../frameworks/events/EventUtils":16,"../../../frameworks/mvc/BaseView":20,"../../userinfo/events/GameEvent":54}],38:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var JoystickModule_1 = require("../joystick/JoystickModule"); var EventUtils_1 = require("../../frameworks/events/EventUtils"); var GameEvent_1 = require("../userinfo/events/GameEvent"); var Scene3DManager_1 = require("../../managers/Scene3DManager"); var Scene3dObject_1 = require("../scene3ds/Scene3dObject"); var TimerService_1 = require("../../frameworks/TimerService"); var GameCFG_1 = require("../../configs/dataConfigs/GameCFG"); var SoundssManager_1 = require("../../managers/SoundssManager"); var Sdk_1 = require("../../platform/wxminigame/WXSDK/Sdk"); var GameStateManager = /** @class */ (function () { function GameStateManager() { /** * 0:未开始,1:游戏中,2:暂停中 */ this.nowGameState = 0; this._zhuanxiangbeishu = 0; this._huadongSpeedX = 0; this._huadongClimbSpeedX = 0; this.endGamePlayerArr = []; this._isneedShunyiX = false; this._nowTime = 0; this._lastAngle = 0; this._time = 0; this.nowMingCi = 0; this._nums = 0; this._all = 0; } GameStateManager.getInstance = function () { if (!this._instance) { this._instance = new GameStateManager(); } return this._instance; }; GameStateManager.prototype.init = function () { this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value); this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value); if (GameCFG_1.default.dict[7]) { this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value); } else { this._zhuanxiangbeishu = 2; } this.initEvent(); }; GameStateManager.prototype.initEvent = function () { EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.endGame, this, this.endGame); EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.npcendGame, this, this.npcendGameHandler); }; GameStateManager.prototype.npcendGameHandler = function (str) { this.endGamePlayerArr.push(str); }; GameStateManager.prototype.setClickPanel = function (panel) { this._joystickModule = new JoystickModule_1.JoystickModule(panel); this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun); }; GameStateManager.prototype.ondownfun = function () { this._lastAngle = 0; this._nowTime = Laya.Browser.now() / 1000; }; GameStateManager.prototype.onmovefun = function (offsetX) { if (this.nowGameState == 1) { var disAngle = this._joystickModule.angle - this._lastAngle; this._lastAngle = this._joystickModule.angle; if (Scene3dObject_1.default.iscarmanpc) { Scene3dObject_1.default.npcscriptDict["npc_0"].joyStickCHange(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu); } else { Scene3DManager_1.default.getInstance().mainRoleScript.joyStickCHange(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu); } } }; GameStateManager.prototype.onupfun = function () { if (Scene3dObject_1.default.iscarmanpc) { Scene3dObject_1.default.npcscriptDict["npc_0"].joyStickCHange(0, 0); } else { if (this.nowGameState == 1) { Scene3DManager_1.default.getInstance().mainRoleScript.joyStickCHange(0, 0, 0); // if( Laya.Browser.now()/1000 - this._nowTime < 0.2 ) // { // if( this._joystickModule.offx > 4 ) // { // Scene3DManager.getInstance().mainRoleScript.xshunyi( 1 ); // } // else if( this._joystickModule.offx < -4 ) // { // Scene3DManager.getInstance().mainRoleScript.xshunyi( -1 ); // } // } } } }; GameStateManager.prototype.update = function (dt) { if (this.nowGameState == 1) { this._time = 0; var npcdict = Scene3dObject_1.default.npcscriptDict; this._nums = 0; this._all = 0; var s; var npcsp; for (s in npcdict) { npcsp = npcdict[s]; if (npcsp.getNowstate() == 1) { if (Scene3dObject_1.default.mainRole.transform.position.z < npcsp.getPostion().z) { this._nums++; } this._all++; } } this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums); Scene3dObject_1.default.txt_mingci.text = "第" + this.nowMingCi + "名"; } }; GameStateManager.prototype.startGame = function () { this.nowMingCi = 0; this.endGamePlayerArr.length = 0; this.nowGameState = 1; TimerService_1.default.instance.addUpdateTarget(this); this.update(500); EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.startGame); SoundssManager_1.default.getInstance().playbgSound("bgm"); Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏..."); }; GameStateManager.prototype.stopGame = function () { this.nowGameState = 2; this.onupfun(); }; GameStateManager.prototype.endGame = function () { this.nowGameState = 0; TimerService_1.default.instance.removeUpdateTarget(this); var npcdict = Scene3dObject_1.default.npcscriptDict; if (npcdict) { for (var s in npcdict) { npcdict[s].stop(); } } this.onupfun(); SoundssManager_1.default.getInstance().stopbgSound(); }; return GameStateManager; }()); exports.default = GameStateManager; },{"../../configs/dataConfigs/GameCFG":6,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../managers/Scene3DManager":64,"../../managers/SoundssManager":65,"../../platform/wxminigame/WXSDK/Sdk":75,"../joystick/JoystickModule":33,"../scene3ds/Scene3dObject":48,"../userinfo/events/GameEvent":54}],39:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys"); var GameEvent_1 = require("../../userinfo/events/GameEvent"); var UiManager_1 = require("../../../managers/UiManager"); var GameResultView_1 = require("../../result/GameResultView"); var GameStateManager_1 = require("../GameStateManager"); var GameUtils_1 = require("../../../utils/GameUtils"); var Scene3DManager_1 = require("../../../managers/Scene3DManager"); var Scene3dObject_1 = require("../../scene3ds/Scene3dObject"); var Sdk_1 = require("../../../platform/wxminigame/WXSDK/Sdk"); var GameProxy = /** @class */ (function (_super) { __extends(GameProxy, _super); function GameProxy() { return _super.call(this) || this; } GameProxy.prototype.initProxy = function () { this.addDataEvent(GameEvent_1.default.endGame, this, this.endgameHandler); }; GameProxy.prototype.endgameHandler = function () { Laya.timer.once(1000, this, this.startEndView); }; GameProxy.prototype.startEndView = function () { var nowmingcvi = GameStateManager_1.default.getInstance().nowMingCi; var getGold = 0; if (GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0) { getGold = this.roleVO.levelcfg.winGold; Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)"); } else { var arr = GameUtils_1.GameUtils.cutstrtoArr(this.roleVO.levelcfg.failGod); getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1])); Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)"); } UiManager_1.UiManager.instance.add(GameResultView_1.default, getGold); }; GameProxy.prototype.returnmainview = function () { Scene3dObject_1.default.getInstance().closeengamlizi(); UiManager_1.UiManager.instance.close(GameResultView_1.default); this.dispacheDataEvent(GameEvent_1.default.returnMainView); Scene3DManager_1.default.getInstance().showScene(); }; GameProxy.prototype.startGame = function () { GameStateManager_1.default.getInstance().startGame(); }; GameProxy.key = "GameProxy"; return GameProxy; }(BaseProxys_1.default)); exports.default = GameProxy; },{"../../../frameworks/mvc/BaseProxys":19,"../../../managers/Scene3DManager":64,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXSDK/Sdk":75,"../../../utils/GameUtils":87,"../../result/GameResultView":45,"../../scene3ds/Scene3dObject":48,"../../userinfo/events/GameEvent":54,"../GameStateManager":38}],40:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys"); var ResourceManager_1 = require("../../../managers/ResourceManager"); var LoadingView_1 = require("../../loading/view/LoadingView"); var UiManager_1 = require("../../../managers/UiManager"); var ResDataManager_1 = require("../../../managers/ResDataManager"); var MainView_1 = require("../view/MainView"); var Scene3DManager_1 = require("../../../managers/Scene3DManager"); var PathConfig_1 = require("../../../configs/gameConfigs/PathConfig"); var GameStateManager_1 = require("../GameStateManager"); var WXGamePlatform_1 = require("../../../platform/wxminigame/WXGamePlatform"); var NpcCFG_1 = require("../../../configs/dataConfigs/NpcCFG"); var YQSdk_1 = require("../../../platform/wxminigame/WXSDK/YQSdk"); var MainProxy = /** @class */ (function (_super) { __extends(MainProxy, _super); function MainProxy() { var _this = _super.call(this) || this; _this._loadjd = 0; _this._alljd = 0; return _this; } MainProxy.prototype.initProxy = function () { }; MainProxy.prototype.enterMain = function () { this._loadjd = 0; this._alljd = 20; WXGamePlatform_1.default.getInstance().loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null); }; MainProxy.prototype.sub1complete = function () { this._loadjd = 20; this._alljd = 30; WXGamePlatform_1.default.getInstance().loadSubpackage("subpackage1", this, this.subcomplete, this.loadprogress, null); }; MainProxy.prototype.subcomplete = function () { this._loadjd = 50; this._alljd = 40; var pathArr = []; var urlArr = []; urlArr.push(PathConfig_1.PathConfig.get3DModel("startPlane")); urlArr.push(PathConfig_1.PathConfig.get3DModel("endPlane")); urlArr.push(PathConfig_1.PathConfig.get3DModel("jiasulizi")); urlArr.push(PathConfig_1.PathConfig.get3DModel("tanse_bai")); urlArr.push(PathConfig_1.PathConfig.get3DModel("tanse_huang")); urlArr.push(PathConfig_1.PathConfig.get3DModel("win_xian")); urlArr.push(PathConfig_1.PathConfig.get3DModel("yanhua")); urlArr.push(PathConfig_1.PathConfig.get3DModel("DirectionalLight")); // urlArr.push( PathConfig.get3DModel( "distantview" ) ); urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(this.roleVO.roleCfg.name)); var arr = this.roleVO.levelmapArr; var i = 0; for (i = 0; i < arr.length; i++) { if (urlArr.indexOf(PathConfig_1.PathConfig.get3DModel(arr[i])) == -1) { urlArr.push(PathConfig_1.PathConfig.get3DModel(arr[i])); } } var npcArr = this.roleVO.levelcfg.npc; for (i = 0; i < npcArr.length; i++) { if (urlArr.indexOf(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) { urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)); } } for (i = 0; i < urlArr.length; i++) { pathArr.push({ url: urlArr[i] }); } ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.load3Dcomplete, this.loadprogress); }; MainProxy.prototype.load3Dcomplete = function () { this._loadjd = 90; this._alljd = 10; ResourceManager_1.default.getInstance().loadGroup("main", this, this.loadcomplete, this.loadprogress, false); }; MainProxy.prototype.loadprogress = function (value) { var loadingview = UiManager_1.UiManager.instance.getView(LoadingView_1.default); if (loadingview) { value = this._loadjd + Math.ceil(value / 100 * this._alljd); loadingview.showWord(value); } }; MainProxy.prototype.loadcomplete = function () { fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26"; GameStateManager_1.default.getInstance().init(); ResDataManager_1.default.getInastance().adduiPackage("main"); UiManager_1.UiManager.instance.close(LoadingView_1.default); UiManager_1.UiManager.instance.add(MainView_1.default); Scene3DManager_1.default.getInstance().initGame(); // SoundssManager.getInstance().playbgSound( "gamebg" ); // CacheManager.getInstance().clearAll(); YQSdk_1.YQSdk.pullAdPosition(); }; MainProxy.prototype.ceshi = function () { }; MainProxy.key = "MainProxy"; return MainProxy; }(BaseProxys_1.default)); exports.default = MainProxy; },{"../../../configs/dataConfigs/NpcCFG":8,"../../../configs/gameConfigs/PathConfig":10,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/ResDataManager":62,"../../../managers/ResourceManager":63,"../../../managers/Scene3DManager":64,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXGamePlatform":72,"../../../platform/wxminigame/WXSDK/YQSdk":77,"../../loading/view/LoadingView":35,"../GameStateManager":38,"../view/MainView":41}],41:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../../frameworks/mvc/BaseView"); var GameStateManager_1 = require("../GameStateManager"); var GameEvent_1 = require("../../userinfo/events/GameEvent"); var Scene3dObject_1 = require("../../scene3ds/Scene3dObject"); var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy"); var UserInfoEvent_1 = require("../../userinfo/events/UserInfoEvent"); var SkinProxy_1 = require("../../skins/proxys/SkinProxy"); var GameProxy_1 = require("../proxys/GameProxy"); var UiManager_1 = require("../../../managers/UiManager"); var ChoutiPanView_1 = require("../../../platform/wxminigame/WXSDK/cpa/ChoutiPanView"); var TuijianView_1 = require("../../../platform/wxminigame/WXSDK/cpa/TuijianView"); var MainView = /** @class */ (function (_super) { __extends(MainView, _super); function MainView() { return _super.call(this, "main", "mainview") || this; } MainView.prototype.onInit = function () { _super.prototype.onInit.call(this); }; MainView.prototype.initView = function () { this._userinfoProxy = this.getProxy(UserInfoProxy_1.default); Scene3dObject_1.default.pro_jindu = this.pro_dis; Scene3dObject_1.default.txt_mingci = this.txt_mingci; this.c_state = this.getControllerByBame("c_state"); GameStateManager_1.default.getInstance().setClickPanel(this.load_clickpanel); this.returnmainHandler(); this.updateUserDataHandler(); }; MainView.prototype.initEvent = function () { this.addListener(this.load_start, Laya.Event.CLICK, this, this.btnclick); this.addListener(this.btn_skin, Laya.Event.CLICK, this, this.skinclick); this.addListener(this.btn_more, Laya.Event.CLICK, this, this.moreclick); this.addListener(this.btn_tuijian, Laya.Event.CLICK, this, this.tuijianclick); this.addDataEvent(GameEvent_1.default.returnMainView, this, this.returnmainHandler); this.addDataEvent(UserInfoEvent_1.default.UserInfoEvent_updateUserData, this, this.updateUserDataHandler); }; MainView.prototype.tuijianclick = function () { UiManager_1.UiManager.instance.add(TuijianView_1.default); }; MainView.prototype.skinclick = function () { this.getProxy(SkinProxy_1.default).openview(); }; MainView.prototype.moreclick = function () { UiManager_1.UiManager.instance.add(ChoutiPanView_1.default); }; MainView.prototype.updateUserDataHandler = function () { this.txt_gold.text = this._userinfoProxy.roleVO.Gold.toString(); }; MainView.prototype.returnmainHandler = function () { var rolevo = this._userinfoProxy.roleVO; if (rolevo.nowlevel <= 2) { this.c_state.selectedIndex = 0; } else { this.c_state.selectedIndex = 1; } }; MainView.prototype.btnclick = function () { this.c_state.selectedIndex = 2; this.txt_lv.text = this._userinfoProxy.roleVO.getNowServerLevel().toString(); this.getProxy(GameProxy_1.default).startGame(); }; MainView.key = "MainView"; return MainView; }(BaseView_1.default)); exports.default = MainView; },{"../../../frameworks/mvc/BaseView":20,"../../../managers/UiManager":66,"../../../platform/wxminigame/WXSDK/cpa/ChoutiPanView":79,"../../../platform/wxminigame/WXSDK/cpa/TuijianView":84,"../../scene3ds/Scene3dObject":48,"../../skins/proxys/SkinProxy":51,"../../userinfo/UserInfoProxy":53,"../../userinfo/events/GameEvent":54,"../../userinfo/events/UserInfoEvent":56,"../GameStateManager":38,"../proxys/GameProxy":39}],42:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Scene3dObject_1 = require("../scene3ds/Scene3dObject"); var GameUtils_1 = require("../../utils/GameUtils"); var GameCFG_1 = require("../../configs/dataConfigs/GameCFG"); var CamerasScript = /** @class */ (function (_super) { __extends(CamerasScript, _super); function CamerasScript() { var _this = _super.call(this) || this; _this.iscanfollow = false; _this._upvec = new Laya.Vector3(0, 1, 0); _this._index = 0; _this._slerpValue = 8; _this._lookatVec = new Laya.Vector3; return _this; } CamerasScript.prototype.onAwake = function () { //获取脚本所属对象 this.camera = this.owner; this._toVec = new Laya.Vector3(); this.camera.fieldOfView = 90; }; CamerasScript.prototype.initPos = function (vec) { var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value); this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2])); Laya.Vector3.add(vec, this._disVector, this._toVec); this.camera.transform.position = this._toVec; this.camera.transform.position.x = vec.x; // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) ); }; CamerasScript.prototype.onStart = function () { this._transform = this.camera.transform; //旋转摄像机角度 this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false); // this.camera.clearColor = null; }; CamerasScript.prototype.onUpdate = function () { if (this.iscanfollow) { if (Scene3dObject_1.default.iscarmanpc) { if (Scene3dObject_1.default.npcDict["npc_0"]) { Laya.Vector3.add(Scene3dObject_1.default.npcDict["npc_0"].transform.position, this._disVector, this._toVec); this._transform.position = this._toVec; this._transform.position.x = Scene3dObject_1.default.npcDict["npc_0"].transform.position.x; this._transform.lookAt(Scene3dObject_1.default.npcDict["npc_0"].transform.position, this._upvec); } } else { if (Scene3dObject_1.default.mainRole) { Laya.Vector3.add(Scene3dObject_1.default.mainRole.transform.position, this._disVector, this._toVec); // this._toVec.x = Scene3dObject.mainRole.transform.position.x; // this._transform.position = this._toVec; // this._transform.lookAt( Scene3dObject.mainRole.transform.position,this._upvec ); Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec); // this._toVec.z = Scene3dObject.mainRole.transform.position.z+this._disVector.z; // this._toVec.y = Scene3dObject.mainRole.transform.position.y + this._disVector.y; this._transform.position = this._toVec; this._lookatVec.x = this._toVec.x; this._lookatVec.y = Scene3dObject_1.default.mainRole.transform.position.y; this._lookatVec.z = Scene3dObject_1.default.mainRole.transform.position.z; this._transform.lookAt(this._lookatVec, this._upvec); } } } }; CamerasScript.prototype.MyRotateAround = function (targetPos, speed) { this.iscanfollow = false; this._transform.translate(speed, false); this._transform.lookAt(targetPos, this._upvec); }; return CamerasScript; }(Laya.Script3D)); exports.default = CamerasScript; },{"../../configs/dataConfigs/GameCFG":6,"../../utils/GameUtils":87,"../scene3ds/Scene3dObject":48}],43:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Debuger_1 = require("../../frameworks/Debuger"); var TimerService_1 = require("../../frameworks/TimerService"); var Scene3dObject_1 = require("../scene3ds/Scene3dObject"); var RoleActions_1 = require("../scene3ds/RoleActions"); var MVCObjectPool_1 = require("../../frameworks/mvc/MVCObjectPool"); var UserInfoProxy_1 = require("../userinfo/UserInfoProxy"); var BuildCFG_1 = require("../../configs/dataConfigs/BuildCFG"); var CamerasScript_1 = require("./CamerasScript"); var EventUtils_1 = require("../../frameworks/events/EventUtils"); var GameEvent_1 = require("../userinfo/events/GameEvent"); var GameUtils_1 = require("../../utils/GameUtils"); var GameStateManager_1 = require("../main/GameStateManager"); var SoundssManager_1 = require("../../managers/SoundssManager"); var WXGamePlatform_1 = require("../../platform/wxminigame/WXGamePlatform"); var MainRAoleScript = /** @class */ (function (_super) { __extends(MainRAoleScript, _super); function MainRAoleScript() { var _this = _super.call(this) || this; /** * RoleAction */ _this._nowState = ""; _this.resouseName = ""; _this._isColling = false; _this._nowCollTargetName = ""; _this._normalizeVec = new Laya.Vector3; _this._nowbuildname = ""; _this._nowscenename = ""; /** * 0:未锁,1:锁左边,2:锁右边 */ _this._lockxstate = 0; _this._lockbyBuildname = ""; /** * 0:未被锁,1:锁定左边,2:锁定右边, */ _this._lockstate = 0; _this._shangpaVec = new Laya.Vector3; _this._lastState = ""; _this._moveTime = 0; _this._isActionNums = false; _this._isneedactionnum = 0; _this._needactiontime = 0; /** * 加速buffvec */ _this._lastjiasuState = ""; _this._jiasubuffTime = 0; _this.iscanzhendong = false; _this.zhendongtime = 0; _this._isShuangbeijiasu = false; _this._beishuVec = new Laya.Vector3(1, 1, 1); _this._moveVec = new Laya.Vector3; _this.isPengzhuang = false; _this.jumpSpeed = new Laya.Vector3; _this.jumpHight = 0; _this._disy = 0; _this.g = 10; //重力加速度 _this._ending = false; _this._endAnmoSpeed = new Laya.Vector3(); _this._endanmotime = 1; _this._endAnmoSpeed1 = new Laya.Vector3; _this._changeMoveX = 0; _this.isforceJump = false; _this.quaternion = new Laya.Quaternion; return _this; } MainRAoleScript.prototype.onAwake = function () { this._animator = this.owner.getComponent(Laya.Animator); Scene3dObject_1.default.setAnimator(this._animator); this._speedMoveV3 = new Laya.Vector3(0, 0, 0); var sp = this.owner; this._transform = sp.transform; this._roleVO = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default).roleVO; sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001; this._lefttrail = sp.getChildByName("lefttrail"); this._righttrail = sp.getChildByName("righttrail"); }; MainRAoleScript.prototype.onEnable = function () { }; MainRAoleScript.prototype.onStart = function () { }; MainRAoleScript.prototype.startRun = function () { // this.pzdict = {}; // this.pzarr = []; this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = 1; this._jiasubuffTime = 0; this._isShuangbeijiasu = false; this._lastjiasuState = ""; this._ending = false; this._changeMoveX = 0; this._initPosVec = this._transform.position.clone(); this._nowbuildname = ""; this._nowscenename = ""; this.nowState = RoleActions_1.default.run; this._speedMoveV3.x = 0; this._speedMoveV3.y = 0; this._speedMoveV3.z = -this._roleVO.movespeed; Debuger_1.default.log("开始跑"); this._iscanMove = true; TimerService_1.default.instance.addUpdateTarget(this); }; // private pzdict:any = {}; // private pzarr:Array = []; /** * 开始碰撞时执行 */ MainRAoleScript.prototype.onCollisionEnter = function (collision) { if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.jisuanCollision(contactPoint.normal, collision.other.owner, contactPoint.positionOnB); } }; MainRAoleScript.prototype.setnowSelectVec = function (pos) { this._nowselectVec = pos; }; MainRAoleScript.prototype.jisuanCollision = function (normal, target, collpoint) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) { return; } this._nowCollTargetName = target.name; var n = new Laya.Vector3; Laya.Vector3.normalize(normal, this._normalizeVec); Debuger_1.default.log("开始碰撞", this._normalizeVec, target.name); if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } if (this._normalizeVec.z == -1) //上爬 { if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) { this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); this.nowState = RoleActions_1.default.run; } else { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); // this.pzdict[this._nowCollTargetName] = RoleActions.Climb; // this.pzarr.push( this._nowCollTargetName ); } } else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) { this.nowState = RoleActions_1.default.run; } else if (this._normalizeVec.x == -1) { if (this.nowState == RoleActions_1.default.run) { this._lockxstate = 1; } else if (this.nowState == RoleActions_1.default.Climb) { this._lockxstate = 1; } else { this.nowState = RoleActions_1.default.left_climb; } } else if (this._normalizeVec.x == 1) { if (this.nowState == RoleActions_1.default.run) { this._lockxstate = 2; } else if (this.nowState == RoleActions_1.default.Climb) { this._lockxstate = 2; } else { this.nowState = RoleActions_1.default.right_climb; } } else { if (this._normalizeVec.z != 1) { this.nowState = RoleActions_1.default.lockclimb; this._shangpaVec = this._nowselectVec.clone(); } } } else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃 { this.nowState = RoleActions_1.default.jiasuJump; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) { this.nowState = RoleActions_1.default.downSlide; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowState != RoleActions_1.default.downSlide) { if (this._normalizeVec.z == -1) //上爬 { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) { this.nowState = RoleActions_1.default.slidejiasu; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) { this.nowState = RoleActions_1.default.surmount; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("irongauze") != -1) { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); } }; /** * 持续碰撞时执行 */ MainRAoleScript.prototype.onCollisionStay = function (collision) { // Debuger.log( "碰撞中" ); if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { this._isColling = true; var contactPoint = collision.contacts[0]; var target = collision.other.owner; var targetname = target.name; if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) { this._nowCollTargetName = targetname; } if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } } } }; /** * 结束碰撞时执行 */ MainRAoleScript.prototype.onCollisionExit = function (collision) { this._isColling = false; if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.checkendColl(contactPoint.normal, collision.other.owner); } }; MainRAoleScript.prototype.checkendColl = function (normal, target) { Debuger_1.default.log("结束碰撞", target.name); if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) { return; } if (this.isforceJump) { this.isforceJump = false; return; } if (this._lockxstate) { this._lockxstate = 0; return; } if (this._nowCollTargetName != target.name) { return; } if (target.name.indexOf("panel_jump") != -1) { return; } Debuger_1.default.log("计算碰撞完成状态"); switch (this.nowState) { case RoleActions_1.default.Climb: case RoleActions_1.default.lockclimb: if (this._nowCollTargetName.indexOf("box_Board") != -1) { this.setJumpState(this._changeMoveX); } else { // var istoTop:boolean = Scene3dObject.checkisClimbTop( target.parent.parent.name,target.name,this._transform.position ); // if( istoTop ) // { // Debuger.log( "播放爬楼完成动作" ); // this.nowState = RoleActions.playPalouAction; // this.playAnmo(""); // } // else // { // if( this._changeMoveX > 0 ) // { // this.nowState = RoleActions.right_jump; // // this.setJump( this.nowState ); // } // else if( this._changeMoveX < 0 ) // { // this.nowState = RoleActions.left_jump; // // this.setJump( this.nowState ); // } // } if (this._changeMoveX > 0) { this.nowState = RoleActions_1.default.right_jump; // this.setJump( this.nowState ); } else if (this._changeMoveX < 0) { this.nowState = RoleActions_1.default.left_jump; // this.setJump( this.nowState ); } } break; case RoleActions_1.default.right_climb: case RoleActions_1.default.left_climb: this.setJumpState(this._changeMoveX); break; case RoleActions_1.default.run: this.setJumpState(this._changeMoveX); break; case RoleActions_1.default.xshunyi: this.setJumpState(this._speedMoveV3.x); break; } }; MainRAoleScript.prototype.setJumpState = function (value) { if (value > 0) { this.nowState = RoleActions_1.default.right_jump; // this.setJump( this.nowState ); } else if (value < 0) { this.nowState = RoleActions_1.default.left_jump; // this.setJump( this.nowState ); } else { this.nowState = RoleActions_1.default.jump; // this.setJump( this.nowState ); } }; MainRAoleScript.prototype.playAnmo = function (actinName) { this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.climbend); }; MainRAoleScript.prototype.actionCompelte = function () { this.nowState = RoleActions_1.default.run; }; Object.defineProperty(MainRAoleScript.prototype, "nowState", { get: function () { return this._nowState; }, set: function (value) { if (this._nowState != value || this._lastState == RoleActions_1.default.jiasuJump || this._nowState == RoleActions_1.default.jiasuJump) { this._lastState = this._nowState; this._nowState = value; this._moveTime = 0; this.iscanzhendong = false; this.changtrailState(true); switch (this._nowState) { case RoleActions_1.default.stand: this._isActionNums = false; this.setAction(RoleActions_1.default.stand); break; case RoleActions_1.default.run: if (this._lastState == RoleActions_1.default.jump || this._lastState == RoleActions_1.default.left_jump || this._lastState == RoleActions_1.default.right_jump) { this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.setAction(RoleActions_1.default.luodi1); } else { this.setAction(RoleActions_1.default.luodi2); } } else { this._isActionNums = false; this.setAction(RoleActions_1.default.run); } break; case RoleActions_1.default.jump: this.setAction(RoleActions_1.default.jump); Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position); this._isActionNums = true; this._isneedactionnum = 1; this.jumpSpeed.x = this._roleVO.frontjump.x; this.jumpSpeed.y = this._roleVO.frontjump.y; this.jumpSpeed.z = this._roleVO.frontjump.z; SoundssManager_1.default.getInstance().playGameSound("jump"); WXGamePlatform_1.default.getInstance().vibrateShort(); break; case RoleActions_1.default.left_jump: Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position); this.jumpSpeed.x = this._roleVO.leftjump.x; this.jumpSpeed.y = this._roleVO.leftjump.y; this.jumpSpeed.z = this._roleVO.leftjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.leftjump); SoundssManager_1.default.getInstance().playGameSound("jump"); WXGamePlatform_1.default.getInstance().vibrateShort(); break; case RoleActions_1.default.right_jump: Scene3dObject_1.default.getInstance().setliziPlaytanse("tanse_bai", this._transform.position); this.jumpSpeed.x = this._roleVO.rightjump.x; this.jumpSpeed.y = this._roleVO.rightjump.y; this.jumpSpeed.z = this._roleVO.rightjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.rightjump); SoundssManager_1.default.getInstance().playGameSound("jump"); WXGamePlatform_1.default.getInstance().vibrateShort(); break; case RoleActions_1.default.jiasuJump: var buildcfg = BuildCFG_1.default.dict["panel_jump"]; if (this._jiasubuffTime > 0) { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz * buildcfg.buffz; this._isShuangbeijiasu = true; } else { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz; } this._jiasubuffTime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x; this.jumpSpeed.y = buildcfg.buffy; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z; this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.setAction(RoleActions_1.default.datiao1); } else { this.setAction(RoleActions_1.default.datiao2); } SoundssManager_1.default.getInstance().playGameSound("jump"); Laya.timer.clear(this, this.playspeedSound); Laya.timer.once(200, this, this.playspeedSound); WXGamePlatform_1.default.getInstance().vibrateShort(); break; case RoleActions_1.default.downSlide: var buildcfg = BuildCFG_1.default.dict["panel_downslip"]; if (this._jiasubuffTime > 0) { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz * buildcfg.buffz; this._isShuangbeijiasu = true; } else { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz; } this._jiasubuffTime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x; this.jumpSpeed.y = buildcfg.buffy * this._beishuVec.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.huachan); this.playspeedSound(); WXGamePlatform_1.default.getInstance().vibrateShort(); break; case RoleActions_1.default.slidejiasu: var buildcfg = BuildCFG_1.default.dict["box_sidejump"]; if (this._jiasubuffTime > 0) { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz * buildcfg.buffz; this._isShuangbeijiasu = true; } else { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz; } this._jiasubuffTime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x; this.jumpSpeed.y = buildcfg.buffy * this._beishuVec.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z; this._isActionNums = false; this.playspeedSound(); WXGamePlatform_1.default.getInstance().vibrateShort(); // this.setAction( RoleActions. ); break; case RoleActions_1.default.surmount: var buildcfg = BuildCFG_1.default.dict["box_Surmount"]; if (this._jiasubuffTime > 0) { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz * buildcfg.buffz; this._isShuangbeijiasu = true; } else { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = buildcfg.buffz; } this._jiasubuffTime = buildcfg.time; this.jumpSpeed.x = buildcfg.buffx * this._beishuVec.x; this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._beishuVec.y; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._beishuVec.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.kualan); break; case RoleActions_1.default.Climb: case RoleActions_1.default.lockclimb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._roleVO.upclimb; this.jumpSpeed.z = 0; this._isActionNums = false; this.setAction(RoleActions_1.default.paqiang); WXGamePlatform_1.default.getInstance().vibrateShort(); this.iscanzhendong = true; this.zhendongtime = 0; this.changtrailState(false); break; case RoleActions_1.default.left_climb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._roleVO.slideclimb.y; this.jumpSpeed.z = this._roleVO.slideclimb.z; this._isActionNums = false; this.setAction(RoleActions_1.default.paoqiangleft); this.changtrailState(false); break; case RoleActions_1.default.right_climb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this._roleVO.slideclimb.y; this.jumpSpeed.z = this._roleVO.slideclimb.z; this._isActionNums = false; this.setAction(RoleActions_1.default.paoqiangright); this.changtrailState(false); break; case RoleActions_1.default.playPalouAction: this._isActionNums = true; this._isneedactionnum = 0; this._needactiontime = 0.3; this._moveTime = 0; this.setAction(RoleActions_1.default.climbend); break; } } }, enumerable: true, configurable: true }); MainRAoleScript.prototype.playspeedSound = function () { SoundssManager_1.default.getInstance().playGameSound("speed"); }; MainRAoleScript.prototype.changtrailState = function (bo) { if (this._lefttrail && this._righttrail && this._lefttrail.active != bo) { this._lefttrail.active = bo; this._righttrail.active = bo; } }; MainRAoleScript.prototype.update = function (dt) { dt = 16; if (this._iscanMove) { var distime = dt / 1000; this._moveTime += distime; switch (this.nowState) { case RoleActions_1.default.run: //跑动 this._moveVec.y = 0; this._moveVec.z = distime * (this._speedMoveV3.z * this._beishuVec.z); if (this._lockxstate == 0) { this._moveVec.x = this._changeMoveX * distime; } else if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockxstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.Climb: //爬升 this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else { this._moveVec.x = this._changeMoveX * distime; } this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } else if (this._nowselectVec) { if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } break; case RoleActions_1.default.lockclimb: this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } else if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowState = RoleActions_1.default.playPalouAction; Debuger_1.default.log("爬墙动作结束播放"); } break; case RoleActions_1.default.jump: //跳跃 case RoleActions_1.default.left_jump: case RoleActions_1.default.right_jump: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.jiasuJump: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.left_climb: case RoleActions_1.default.right_climb: this._moveVec.z = distime * this.jumpSpeed.y; this._moveVec.y = this.jumpSpeed.y * distime; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.xshunyi: this._moveVec.z = distime * this._speedMoveV3.z; this._moveVec.x = this._speedMoveV3.x * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > 0.1) { this.nowState = RoleActions_1.default.run; } break; case RoleActions_1.default.downSlide: this._moveVec.y = this.jumpSpeed.x; this._moveVec.x = this.jumpSpeed.y; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.slidejiasu: this._moveVec.y = 0; this._moveVec.x = 0; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this._jiasubuffTime <= 0 && this._lastState == RoleActions_1.default.left_climb || this._lastState == RoleActions_1.default.right_climb) { this.nowState = this._lastState; } else { this.nowState = RoleActions_1.default.jump; // this.setJump( this.nowState ); } break; case RoleActions_1.default.surmount: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.playPalouAction: if (this._nowselectVec) { if (this._transform.position.y < this._nowselectVec.y) { this._moveVec.x = 0; this._moveVec.y = (1 / 0.3) * distime; this._moveVec.z = 0; this._transform.translate(this._moveVec, false); } } break; } if (this._nowselectVec && (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.downSlide) && !this._isColling) { if (this._transform.position.z <= this._nowselectVec.z) { if (this._changeMoveX > 0) { this.nowState = RoleActions_1.default.right_jump; } else if (this._changeMoveX < 0) { this.nowState = RoleActions_1.default.left_jump; } else { this.nowState = RoleActions_1.default.jump; } } } if (this._transform.position.y < Scene3dObject_1.default.diePosY) //角色死亡 { if (this._nowscenename == "" || this._nowbuildname == "") { this._transform.position = this._initPosVec.clone(); } else { this._transform.position = Scene3dObject_1.default.getPosVecbyScene(this._nowscenename, this._nowbuildname).clone(); } this.nowState = RoleActions_1.default.run; } if (this._transform.position.z < Scene3dObject_1.default.gamewinPosZ) { this.wingame(); } else { Scene3dObject_1.default.pro_jindu.value = this._transform.position.z / Scene3dObject_1.default.gamewinPosZ * 100; } if (this._isActionNums) { if (this._isneedactionnum > 0) { if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) { switch (this._nowActionName) { case RoleActions_1.default.jump: case RoleActions_1.default.leftjump: case RoleActions_1.default.rightjump: case RoleActions_1.default.datiao1: case RoleActions_1.default.datiao2: case RoleActions_1.default.kualan: this._isActionNums = false; this.setAction(RoleActions_1.default.kongzhong); break; case RoleActions_1.default.huachan: case RoleActions_1.default.climbend: this._isActionNums = false; this.setAction(RoleActions_1.default.run); this.nowState = RoleActions_1.default.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; case RoleActions_1.default.luodi1: case RoleActions_1.default.luodi2: this._isActionNums = false; this.setAction(RoleActions_1.default.run); break; case RoleActions_1.default.huachan: this.nowState = RoleActions_1.default.run; break; } } } else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) { switch (this._nowActionName) { case RoleActions_1.default.jump: case RoleActions_1.default.leftjump: case RoleActions_1.default.rightjump: case RoleActions_1.default.datiao1: case RoleActions_1.default.datiao2: this._isActionNums = false; this.setAction(RoleActions_1.default.kongzhong); this._changeMoveX = 0; break; case RoleActions_1.default.kualan: this._isActionNums = false; this.setAction(RoleActions_1.default.kongzhong); break; case RoleActions_1.default.huachan: case RoleActions_1.default.climbend: this._isActionNums = false; this.setAction(RoleActions_1.default.run); this.nowState = RoleActions_1.default.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; } } } if (this._jiasubuffTime > 0) { this._jiasubuffTime -= distime; Scene3dObject_1.default.getInstance().jiadulizi("jiasulizi", this._transform.position); if (this._isShuangbeijiasu) { Scene3dObject_1.default.getInstance().jiadulizi1("jiasulizi", this._transform.position); } } else { this._beishuVec.x = 1; this._beishuVec.y = 1; this._beishuVec.z = 1; this._isShuangbeijiasu = false; Scene3dObject_1.default.getInstance().closeJiasulizi(); Scene3dObject_1.default.getInstance().closeJiasulizi1(); } if (this.iscanzhendong) { this.zhendongtime += distime; if (this.zhendongtime >= 0.5) { this.zhendongtime = 0; WXGamePlatform_1.default.getInstance().vibrateShort(); } } } else { if (this._ending) { var distime = dt / 1000; this._moveTime += distime; if (this._moveTime >= this._endanmotime) { this.endGame(); } else { this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime; this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime; this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime; Scene3dObject_1.default.carma.getComponent(CamerasScript_1.default).MyRotateAround(this._transform.position, this._endAnmoSpeed1); } } } }; MainRAoleScript.prototype.endGame = function () { this._ending = false; TimerService_1.default.instance.removeUpdateTarget(this); }; MainRAoleScript.prototype.wingame = function () { SoundssManager_1.default.getInstance().playGameSound("complete"); EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.endGame); var carmaTrans = Scene3dObject_1.default.carma.transform; this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime; this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime; this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime; this._moveTime = 0; this._iscanMove = false; this._ending = true; this.setAction(RoleActions_1.default.kongzhong); Scene3dObject_1.default.getInstance().liziendgame("yanhua", this._transform.position, GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0 ? true : false); }; MainRAoleScript.prototype.joyStickCHange = function (value, value1, angle) { if (this.nowState == RoleActions_1.default.run) { this._changeMoveX = value; } else if (this.nowState == RoleActions_1.default.Climb || RoleActions_1.default.left_climb || RoleActions_1.default.right_climb) { this._changeMoveX = value1; } if (this.nowState == RoleActions_1.default.left_climb && this._changeMoveX > 0) //强制跳跃 { this.isforceJump = true; this.nowState = RoleActions_1.default.right_jump; } else if (this.nowState == RoleActions_1.default.right_climb && this._changeMoveX < 0) { this.isforceJump = true; this.nowState = RoleActions_1.default.left_jump; } if (this.nowState == RoleActions_1.default.jump || this.nowState == RoleActions_1.default.left_jump || this.nowState == RoleActions_1.default.right_jump || this.nowState == RoleActions_1.default.jiasuJump) { angle = -angle * Math.PI / 180; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion); var jumpz = this.jumpSpeed.z; Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed); this.jumpSpeed.z = jumpz; } }; MainRAoleScript.prototype.xshunyi = function (state) { if (this.nowState == RoleActions_1.default.run) { this._moveTime = 0; this._speedMoveV3.x = state * 20; this.nowState = RoleActions_1.default.xshunyi; } }; MainRAoleScript.prototype.setAction = function (actionName) { this._nowActionName = actionName; if (this._animator) { if (this._nowActionName == RoleActions_1.default.climbend || this._nowActionName == RoleActions_1.default.luodi1 || this._nowActionName == RoleActions_1.default.luodi2) { this._animator.speed = 1.5; } else { this._animator.speed = 1; } this._animator.play(actionName, 0, 0); } // if( actionName == RoleActions.stand ) // { // this._animator.play(actionName); // } // else // { // // this._animator.crossFade(actionName, 0.02, 0); // this._animator.play(actionName); // } }; MainRAoleScript.prototype.ceshitiaoyue = function () { this.nowState = RoleActions_1.default.jump; }; MainRAoleScript.prototype.onUpdate = function () { }; MainRAoleScript.prototype.onLateUpdate = function () { }; MainRAoleScript.prototype.dispose = function () { TimerService_1.default.instance.removeUpdateTarget(this); }; MainRAoleScript.prototype.destroy = function () { TimerService_1.default.instance.removeUpdateTarget(this); _super.prototype.destroy.call(this); }; return MainRAoleScript; }(Laya.Script3D)); exports.default = MainRAoleScript; },{"../../configs/dataConfigs/BuildCFG":5,"../../frameworks/Debuger":12,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../frameworks/mvc/MVCObjectPool":22,"../../managers/SoundssManager":65,"../../platform/wxminigame/WXGamePlatform":72,"../../utils/GameUtils":87,"../main/GameStateManager":38,"../scene3ds/RoleActions":46,"../scene3ds/Scene3dObject":48,"../userinfo/UserInfoProxy":53,"../userinfo/events/GameEvent":54,"./CamerasScript":42}],44:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TimerService_1 = require("../../frameworks/TimerService"); var Scene3dObject_1 = require("../scene3ds/Scene3dObject"); var RoleActions_1 = require("../scene3ds/RoleActions"); var BuildCFG_1 = require("../../configs/dataConfigs/BuildCFG"); var CamerasScript_1 = require("./CamerasScript"); var EventUtils_1 = require("../../frameworks/events/EventUtils"); var GameEvent_1 = require("../userinfo/events/GameEvent"); var GameUtils_1 = require("../../utils/GameUtils"); var NpcScript = /** @class */ (function (_super) { __extends(NpcScript, _super); function NpcScript() { var _this = _super.call(this) || this; /** * RoleAction */ _this._nowState = ""; _this.resouseName = ""; _this._shangpaVec = new Laya.Vector3; /** * 状态,0:等待状态,1:开始状态,2:完成状态 */ _this._nowRoleState = 0; _this.movespeed = 0; _this.frontjump = new Laya.Vector3; _this.leftjump = new Laya.Vector3; _this.rightjump = new Laya.Vector3; _this.upclimb = 0; _this.slideclimb = new Laya.Vector3; _this._isColling = false; _this._nowCollTargetName = ""; _this._normalizeVec = new Laya.Vector3; _this._nowbuildname = ""; _this._nowscenename = ""; /** * 0:未锁,1:锁左边,2:锁右边 */ _this._lockxstate = 0; _this._lockbyBuildname = ""; /** * 0:未被锁,1:锁定左边,2:锁定右边, */ _this._lockstate = 0; _this._lastState = ""; _this._moveTime = 0; _this._chixuTime = 0; _this._isActionNums = false; _this._isneedactionnum = 0; _this._needactiontime = 0; _this._moveVec = new Laya.Vector3; _this.isPengzhuang = false; _this.jumpSpeed = new Laya.Vector3; _this.jumpHight = 0; _this._disy = 0; _this.g = 10; //重力加速度 _this._checktime = 0; _this._ending = false; _this._endAnmoSpeed = new Laya.Vector3(); _this._endanmotime = 1; _this._endAnmoSpeed1 = new Laya.Vector3; _this._changeMoveX = 0; _this.isforceJump = false; _this.quaternion = new Laya.Quaternion; return _this; } NpcScript.prototype.onAwake = function () { this._animator = this.owner.getComponent(Laya.Animator); Scene3dObject_1.default.setAnimator(this._animator); }; NpcScript.prototype.onStart = function () { this._speedMoveV3 = new Laya.Vector3(0, 0, 0); this._transform = this.owner.transform; var sp = this.owner; sp.getChildByName("lefttrail").active = false; sp.getChildByName("righttrail").active = false; }; NpcScript.prototype.startRun = function () { this._checktime = 500; this._nowRoleState = 1; this._ending = false; this._changeMoveX = 0; this._initPosVec = this._transform.position.clone(); this._nowbuildname = ""; this._nowscenename = ""; this._nowState = RoleActions_1.default.stand; this.nowState = RoleActions_1.default.run; this._speedMoveV3.x = 0; this._speedMoveV3.y = 0; this._speedMoveV3.z = -this.movespeed; this._iscanMove = true; TimerService_1.default.instance.addUpdateTarget(this); }; NpcScript.prototype.setnpcCFG = function (cfg) { this._nowNpcCfg = cfg; this.movespeed = this._nowNpcCfg.speed; this.frontjump.x = Number(this._nowNpcCfg.frontjump.x); this.frontjump.y = Number(this._nowNpcCfg.frontjump.y); this.frontjump.z = Number(this._nowNpcCfg.frontjump.z); this.leftjump.x = Number(this._nowNpcCfg.leftjump.x); this.leftjump.y = Number(this._nowNpcCfg.leftjump.y); this.leftjump.z = Number(this._nowNpcCfg.leftjump.z); this.rightjump.x = Number(this._nowNpcCfg.rightjump.x); this.rightjump.y = Number(this._nowNpcCfg.rightjump.y); this.rightjump.z = Number(this._nowNpcCfg.rightjump.z); this.upclimb = Number(this._nowNpcCfg.upclimb); this.slideclimb.x = Number(this._nowNpcCfg.slideclimb.x); this.slideclimb.y = Number(this._nowNpcCfg.slideclimb.y); this.slideclimb.z = Number(this._nowNpcCfg.slideclimb.z); }; /** * 开始碰撞时执行 */ NpcScript.prototype.onCollisionEnter = function (collision) { if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.jisuanCollision(contactPoint.normal, collision.other.owner); } }; NpcScript.prototype.setnowSelectVec = function (pos) { this._nowselectVec = pos; }; NpcScript.prototype.jisuanCollision = function (normal, target) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) { return; } this._nowCollTargetName = target.name; var n = new Laya.Vector3; Laya.Vector3.normalize(normal, this._normalizeVec); if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } if (this._normalizeVec.z == -1) //上爬 { if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) { this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); this.nowState = RoleActions_1.default.run; } else { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) { this.nowState = RoleActions_1.default.run; } else if (this._normalizeVec.x == -1) { if (this.nowState == RoleActions_1.default.run) { this._lockxstate = 1; } else if (this.nowState == RoleActions_1.default.Climb) { this._lockxstate = 1; } else { this.nowState = RoleActions_1.default.left_climb; } } else if (this._normalizeVec.x == 1) { if (this.nowState == RoleActions_1.default.run) { this._lockxstate = 2; } else if (this.nowState == RoleActions_1.default.Climb) { this._lockxstate = 2; } else { this.nowState = RoleActions_1.default.right_climb; } } else { if (this._normalizeVec.z != 1) { this.nowState = RoleActions_1.default.lockclimb; this._shangpaVec = this._nowselectVec.clone(); } } } else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃 { this.nowState = RoleActions_1.default.jiasuJump; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) { this.nowState = RoleActions_1.default.downSlide; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowState != RoleActions_1.default.downSlide) { if (this._normalizeVec.z == -1) //上爬 { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); } } else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) { this.nowState = RoleActions_1.default.slidejiasu; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) { this.nowState = RoleActions_1.default.surmount; // this.setJump( this.nowState ); } else if (this._nowCollTargetName.indexOf("irongauze") != -1) { this.nowState = RoleActions_1.default.Climb; this._shangpaVec = this._nowselectVec.clone(); } }; /** * 持续碰撞时执行 */ NpcScript.prototype.onCollisionStay = function (collision) { // Debuger.log( "碰撞中" ); if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { this._isColling = true; var contactPoint = collision.contacts[0]; var target = collision.other.owner; var targetname = target.name; if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) { this._nowCollTargetName = targetname; } if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 || this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬 { if (this._nowCollTargetName.indexOf("build") != -1) { this._nowbuildname = this._nowCollTargetName; this._nowscenename = target.parent.parent.name; } if (this._nowCollTargetName.indexOf("irongauze") != -1) { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name); } else { this._nowselectVec = Scene3dObject_1.default.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName); } } } }; /** * 结束碰撞时执行 */ NpcScript.prototype.onCollisionExit = function (collision) { this._isColling = false; if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) { var contactPoint = collision.contacts[0]; this.checkendColl(contactPoint.normal, collision.other.owner); } }; NpcScript.prototype.checkendColl = function (normal, target) { if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) { return; } if (this.isforceJump) { this.isforceJump = false; return; } if (this._lockxstate) { this._lockxstate = 0; return; } if (this._nowCollTargetName != target.name) { return; } if (target.name.indexOf("panel_jump") != -1) { return; } switch (this.nowState) { case RoleActions_1.default.Climb: case RoleActions_1.default.lockclimb: if (this._nowCollTargetName.indexOf("box_Board") != -1) { this.setJumpState(this._changeMoveX); } else { // var istoTop:boolean = Scene3dObject.checkisClimbTop( target.parent.parent.name,target.name,this._transform.position ); // if( istoTop ) // { // Debuger.log( "播放爬楼完成动作" ); // this.nowState = RoleActions.playPalouAction; // this.playAnmo(""); // } // else // { // if( this._changeMoveX > 0 ) // { // this.nowState = RoleActions.right_jump; // // this.setJump( this.nowState ); // } // else if( this._changeMoveX < 0 ) // { // this.nowState = RoleActions.left_jump; // // this.setJump( this.nowState ); // } // } if (this._changeMoveX > 0) { this.nowState = RoleActions_1.default.right_jump; // this.setJump( this.nowState ); } else if (this._changeMoveX < 0) { this.nowState = RoleActions_1.default.left_jump; // this.setJump( this.nowState ); } } break; case RoleActions_1.default.right_climb: case RoleActions_1.default.left_climb: this.setJumpState(this._changeMoveX); break; case RoleActions_1.default.run: this.setJumpState(this._changeMoveX); break; case RoleActions_1.default.xshunyi: this.setJumpState(this._speedMoveV3.x); break; } }; NpcScript.prototype.setJumpState = function (value, isquanzhong) { if (isquanzhong === void 0) { isquanzhong = false; } if (value > 0) { this.nowState = RoleActions_1.default.right_jump; } else if (value < 0) { this.nowState = RoleActions_1.default.left_jump; } else { if (isquanzhong) { if (this._nowCollTargetName.indexOf("build") != -1) { var sort = GameUtils_1.GameUtils.randRangeint(0, 100); var allvalue = 0; var sort; var selectdir = ""; if (this._nowCollTargetName.indexOf("leftright") != -1) { allvalue = this._nowNpcCfg.jump_left + this._nowNpcCfg.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcCfg.jump_left) { selectdir = "left"; } else { selectdir = "right"; } } else if (this._nowCollTargetName.indexOf("frontright") != -1) { allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcCfg.start_ahead) { selectdir = "front"; } else { selectdir = "right"; } } else if (this._nowCollTargetName.indexOf("frontleft") != -1) { allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcCfg.start_ahead) { selectdir = "front"; } else { selectdir = "left"; } } else if (this._nowCollTargetName.indexOf("right") != -1) { selectdir = "right"; } else if (this._nowCollTargetName.indexOf("left") != -1) { selectdir = "left"; } else if (this._nowCollTargetName.indexOf("front") != -1) { selectdir = "front"; } else { allvalue = this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left + this._nowNpcCfg.jump_right; sort = GameUtils_1.GameUtils.randRangeint(0, allvalue); if (sort <= this._nowNpcCfg.start_ahead) { selectdir = "front"; } else if (sort <= this._nowNpcCfg.start_ahead + this._nowNpcCfg.jump_left) { selectdir = "left"; } else { selectdir = "right"; } } switch (selectdir) { case "left": this.nowState = RoleActions_1.default.left_jump; break; case "right": this.nowState = RoleActions_1.default.right_jump; break; case "front": this.nowState = RoleActions_1.default.jump; break; default: this.nowState = RoleActions_1.default.jump; break; } } else { this.nowState = RoleActions_1.default.jump; } } else { this.nowState = RoleActions_1.default.jump; } } }; NpcScript.prototype.playAnmo = function (actinName) { this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.climbend); }; NpcScript.prototype.actionCompelte = function () { this.nowState = RoleActions_1.default.run; }; Object.defineProperty(NpcScript.prototype, "nowState", { get: function () { return this._nowState; }, set: function (value) { if (this._nowRoleState == 1) { if (this._nowState != value || this._lastState == RoleActions_1.default.jiasuJump || this._lastState == RoleActions_1.default.right_jump) { this._lastState = this._nowState; this._nowState = value; this._moveTime = 0; switch (this._nowState) { case RoleActions_1.default.stand: this._isActionNums = false; this.setAction(RoleActions_1.default.stand); break; case RoleActions_1.default.run: if (this._lastState == RoleActions_1.default.jump || this._lastState == RoleActions_1.default.left_jump || this._lastState == RoleActions_1.default.right_jump) { this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.setAction(RoleActions_1.default.luodi1); } else { this.setAction(RoleActions_1.default.luodi2); } } else { this._isActionNums = false; this.setAction(RoleActions_1.default.run); } break; case RoleActions_1.default.jump: this.setAction(RoleActions_1.default.jump); this._isActionNums = true; this._isneedactionnum = 1; this.jumpSpeed.x = this.frontjump.x; this.jumpSpeed.y = this.frontjump.y; this.jumpSpeed.z = this.frontjump.z; break; case RoleActions_1.default.left_jump: this.jumpSpeed.x = this.leftjump.x; this.jumpSpeed.y = this.leftjump.y; this.jumpSpeed.z = this.leftjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.leftjump); break; case RoleActions_1.default.right_jump: this.jumpSpeed.x = this.rightjump.x; this.jumpSpeed.y = this.rightjump.y; this.jumpSpeed.z = this.rightjump.z; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.rightjump); break; case RoleActions_1.default.jiasuJump: var buildcfg = BuildCFG_1.default.dict["panel_jump"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy; if (this._lastState == RoleActions_1.default.jiasuJump) { this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz; } else { this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; } this._isActionNums = true; this._isneedactionnum = 1; var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort < 50) { this.setAction(RoleActions_1.default.datiao1); } else { this.setAction(RoleActions_1.default.datiao2); } break; case RoleActions_1.default.downSlide: var buildcfg = BuildCFG_1.default.dict["panel_downslip"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; this._chixuTime = buildcfg.time; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.huachan); break; // case RoleActions.slidejiasu: // var buildcfg:BuildCFG = BuildCFG.dict[ "box_sidejump" ]; // this.jumpSpeed.x = buildcfg.buffx; // this.jumpSpeed.y = buildcfg.buffy; // this.jumpSpeed.z = this._speedMoveV3.z*buildcfg.buffz; // this._chixuTime = buildcfg.time; // this._isActionNums = false; // // this.setAction( RoleActions. ); // break; case RoleActions_1.default.surmount: var buildcfg = BuildCFG_1.default.dict["box_Surmount"]; this.jumpSpeed.x = buildcfg.buffx; this.jumpSpeed.y = buildcfg.buffy + 0.5; this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz; this._chixuTime = buildcfg.time; this._isActionNums = true; this._isneedactionnum = 1; this.setAction(RoleActions_1.default.kualan); break; case RoleActions_1.default.Climb: case RoleActions_1.default.lockclimb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this.upclimb; this.jumpSpeed.z = 0; this._isActionNums = false; this.setAction(RoleActions_1.default.paqiang); break; case RoleActions_1.default.left_climb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this.slideclimb.y; this.jumpSpeed.z = this.slideclimb.z; this._isActionNums = false; this.setAction(RoleActions_1.default.paoqiangleft); break; case RoleActions_1.default.right_climb: this.jumpSpeed.x = 0; this.jumpSpeed.y = this.slideclimb.y; this.jumpSpeed.z = this.slideclimb.z; this._isActionNums = false; this.setAction(RoleActions_1.default.paoqiangright); break; case RoleActions_1.default.playPalouAction: this._isActionNums = true; this._isneedactionnum = 0; this._needactiontime = 0.3; this._moveTime = 0; this.setAction(RoleActions_1.default.climbend); break; } } } }, enumerable: true, configurable: true }); NpcScript.prototype.update = function (dt) { if (this._nowRoleState == 1) { dt = 16; this._checktime += dt; if (Scene3dObject_1.default.iscarmanpc) { } else { if (this._checktime >= 500) { this._checktime = 0; if (this._nowNpcCfg && Scene3dObject_1.default.mainRole) { if (this._transform.position.z + this._nowNpcCfg.distance < Scene3dObject_1.default.mainRole.transform.position.z) { this._iscanMove = false; } else { this._iscanMove = true; } } } } if (this._iscanMove) { var distime = dt / 1000; this._moveTime += distime; switch (this.nowState) { case RoleActions_1.default.run: //跑动 this._moveVec.y = 0; this._moveVec.z = distime * this._speedMoveV3.z; if (this._lockxstate == 0) { this._moveVec.x = this._changeMoveX * distime; } else if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockxstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.Climb: //爬升 this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; if (this._lockxstate == 1) { if (this._changeMoveX < 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else if (this._lockstate == 2) { if (this._changeMoveX > 0) { this._moveVec.x = 0; } else { this._moveVec.x = this._changeMoveX * distime; } } else { this._moveVec.x = this._changeMoveX * distime; } this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } else if (this._nowselectVec) { if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } break; case RoleActions_1.default.lockclimb: this._moveVec.z = 0; this._moveVec.y = distime * this.jumpSpeed.y; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); if (this._shangpaVec) { if (this._transform.position.y + 1 > this._shangpaVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } } else if (this._transform.position.y + 1 > this._nowselectVec.y) { this.nowState = RoleActions_1.default.playPalouAction; } break; case RoleActions_1.default.jump: //跳跃 case RoleActions_1.default.left_jump: case RoleActions_1.default.right_jump: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.jiasuJump: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.left_climb: case RoleActions_1.default.right_climb: this._moveVec.z = distime * this.jumpSpeed.y; this._moveVec.y = this.jumpSpeed.y * distime; this._moveVec.x = 0; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.xshunyi: this._moveVec.z = distime * this._speedMoveV3.z; this._moveVec.x = this._speedMoveV3.x * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > 0.1) { this.nowState = RoleActions_1.default.run; } break; case RoleActions_1.default.downSlide: this._moveVec.y = this.jumpSpeed.x; this._moveVec.x = this.jumpSpeed.y; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > this._chixuTime) { this.nowState = RoleActions_1.default.run; } break; case RoleActions_1.default.slidejiasu: this._moveVec.y = 0; this._moveVec.x = 0; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); if (this._moveTime > this._chixuTime && this._lastState == RoleActions_1.default.left_climb || this._lastState == RoleActions_1.default.right_climb) { this.nowState = this._lastState; } else { this.nowState = RoleActions_1.default.jump; // this.setJump( this.nowState ); } break; case RoleActions_1.default.surmount: this._disy = this.jumpSpeed.y - this.g * distime; this.jumpSpeed.y = this._disy; this._moveVec.x = this.jumpSpeed.x * distime; this._moveVec.y = this._disy * distime; this._moveVec.z = this.jumpSpeed.z * distime; this._transform.translate(this._moveVec, false); break; case RoleActions_1.default.playPalouAction: if (this._nowselectVec) { if (this._transform.position.y < this._nowselectVec.y) { this._moveVec.x = 0; this._moveVec.y = (1 / 0.3) * distime; this._moveVec.z = 0; this._transform.translate(this._moveVec, false); } } break; } if (this._nowselectVec && (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.downSlide) && !this._isColling) { if (this._transform.position.z <= this._nowselectVec.z) { if (this._changeMoveX > 0) { this.nowState = RoleActions_1.default.right_jump; } else if (this._changeMoveX < 0) { this.nowState = RoleActions_1.default.left_jump; } else { this.nowState = RoleActions_1.default.jump; } } } if (this._transform.position.y < Scene3dObject_1.default.diePosY) //角色死亡 { if (this._nowscenename == "" || this._nowbuildname == "") { this._transform.position = this._initPosVec.clone(); } else { this._transform.position = Scene3dObject_1.default.getPosVecbyScene(this._nowscenename, this._nowbuildname).clone(); } this.nowState = RoleActions_1.default.run; } if (this._transform.position.z < Scene3dObject_1.default.gamewinPosZ) { this.wingame(); } if (this._isActionNums) { //如果当前播放state已经播放完了一次 if (this._isneedactionnum > 0) { if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) { switch (this._nowActionName) { case RoleActions_1.default.jump: case RoleActions_1.default.leftjump: case RoleActions_1.default.rightjump: case RoleActions_1.default.datiao1: case RoleActions_1.default.datiao2: case RoleActions_1.default.kualan: this._isActionNums = false; this.setAction(RoleActions_1.default.kongzhong); break; case RoleActions_1.default.huachan: case RoleActions_1.default.climbend: this._isActionNums = false; this.setAction(RoleActions_1.default.run); this.nowState = RoleActions_1.default.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; case RoleActions_1.default.luodi1: case RoleActions_1.default.luodi2: this._isActionNums = false; this.setAction(RoleActions_1.default.run); break; } } } else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) { switch (this._nowActionName) { case RoleActions_1.default.jump: case RoleActions_1.default.leftjump: case RoleActions_1.default.rightjump: case RoleActions_1.default.datiao1: case RoleActions_1.default.datiao2: case RoleActions_1.default.kualan: this._isActionNums = false; this.setAction(RoleActions_1.default.kongzhong); break; case RoleActions_1.default.huachan: case RoleActions_1.default.climbend: this._isActionNums = false; this.setAction(RoleActions_1.default.run); this.nowState = RoleActions_1.default.run; this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z); break; } } } } else { if (this._ending) { var distime = dt / 1000; this._moveTime += distime; if (this._moveTime >= this._endanmotime) { this.endGame(); } else { this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime; this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime; this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime; Scene3dObject_1.default.carma.getComponent(CamerasScript_1.default).MyRotateAround(this._transform.position, this._endAnmoSpeed1); } } } } }; NpcScript.prototype.endGame = function () { this._ending = false; TimerService_1.default.instance.removeUpdateTarget(this); EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.endGame); }; NpcScript.prototype.wingame = function () { TimerService_1.default.instance.removeUpdateTarget(this); this._nowRoleState = 2; this.setAction(RoleActions_1.default.kongzhong); EventUtils_1.EventUtils.dispatchEvent(GameEvent_1.default.npcendGame, this.owner.name); }; NpcScript.prototype.joyStickCHange = function (value, angle) { if (this.nowState == RoleActions_1.default.run || this.nowState == RoleActions_1.default.Climb || RoleActions_1.default.left_climb || RoleActions_1.default.right_climb) { this._changeMoveX = value; } if (this.nowState == RoleActions_1.default.left_climb && this._changeMoveX > 0) //强制跳跃 { this.isforceJump = true; this.nowState = RoleActions_1.default.right_jump; } else if (this.nowState == RoleActions_1.default.right_climb && this._changeMoveX < 0) { this.isforceJump = true; this.nowState = RoleActions_1.default.left_jump; } if (this.nowState == RoleActions_1.default.jump || this.nowState == RoleActions_1.default.left_jump || this.nowState == RoleActions_1.default.right_jump || this.nowState == RoleActions_1.default.jiasuJump) angle = -angle * Math.PI / 180; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion); Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed); }; NpcScript.prototype.xshunyi = function (state) { if (this.nowState == RoleActions_1.default.run) { this._moveTime = 0; this._speedMoveV3.x = state * 30; this.nowState = RoleActions_1.default.xshunyi; } }; NpcScript.prototype.setAction = function (actionName) { this._nowActionName = actionName; if (this._animator) { if (this._nowActionName == RoleActions_1.default.climbend) { this._animator.speed = 1.5; } else { this._animator.speed = 1; } this._animator.play(actionName, 0, 0); } }; NpcScript.prototype.ceshitiaoyue = function () { this.nowState = RoleActions_1.default.jump; }; NpcScript.prototype.onUpdate = function () { }; NpcScript.prototype.onLateUpdate = function () { }; NpcScript.prototype.getPostion = function () { return this._transform.position; }; NpcScript.prototype.getNowstate = function () { return this._nowRoleState; }; NpcScript.prototype.stop = function () { TimerService_1.default.instance.removeUpdateTarget(this); }; NpcScript.prototype.destroy = function () { TimerService_1.default.instance.removeUpdateTarget(this); _super.prototype.destroy.call(this); }; return NpcScript; }(Laya.Script3D)); exports.default = NpcScript; },{"../../configs/dataConfigs/BuildCFG":5,"../../frameworks/TimerService":13,"../../frameworks/events/EventUtils":16,"../../utils/GameUtils":87,"../scene3ds/RoleActions":46,"../scene3ds/Scene3dObject":48,"../userinfo/events/GameEvent":54,"./CamerasScript":42}],45:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../frameworks/mvc/BaseView"); var WindowAnmoType_1 = require("../../frameworks/mvc/WindowAnmoType"); var GameStateManager_1 = require("../main/GameStateManager"); var WordTipsUtils_1 = require("../loading/view/WordTipsUtils"); var UserInfoProxy_1 = require("../userinfo/UserInfoProxy"); var GameProxy_1 = require("../main/proxys/GameProxy"); var PlayerAccount_1 = require("../../platform/wxminigame/WXSDK/PlayerAccount"); var Debuger_1 = require("../../frameworks/Debuger"); var NetworkManager_1 = require("../../platform/wxminigame/NetworkManager"); var UiManager_1 = require("../../managers/UiManager"); var ChoutiPanView_1 = require("../../platform/wxminigame/WXSDK/cpa/ChoutiPanView"); var GameResultView = /** @class */ (function (_super) { __extends(GameResultView, _super); function GameResultView(gold) { var _this = _super.call(this, "main", "gameresult", false, WindowAnmoType_1.default.WindowAnmoType_none, 1) || this; _this.getgold = 0; _this.getgold = gold; return _this; } GameResultView.prototype.initView = function () { this._gameProxy = this.getProxy(GameProxy_1.default); this.c_state = this.getControllerByBame("c_state"); this.txt_gold.text = this.getgold.toString(); if (GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0) { this.c_state.selectedIndex = 0; } else { this.c_state.selectedIndex = 1; } }; GameResultView.prototype.initEvent = function () { this.addListener(this.btn_0, Laya.Event.CLICK, this, this.btn0click); this.addListener(this.btn_1, Laya.Event.CLICK, this, this.btn1click); }; GameResultView.prototype.btn0click = function () { if (this.c_state.selectedIndex == 0) { WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放"); } else { this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold); this._gameProxy.returnmainview(); } }; GameResultView.prototype.btn1click = function () { var _this = this; if (this.c_state.selectedIndex == 0) { this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold); this.getProxy(UserInfoProxy_1.default).addLevel(); this._gameProxy.returnmainview(); } else { this.getProxy(UserInfoProxy_1.default).changeGold(this.getgold); this._gameProxy.returnmainview(); } var wins = GameStateManager_1.default.getInstance().endGamePlayerArr.length == 0 ? 1 : 0; var userid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.user_id); var agrs = [{ "t": PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime.toString() }, { "play_id": userid }, { "money": "0" }, { "win": wins.toString() }]; Debuger_1.default.log("上传:", agrs); NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.end, agrs, new Laya.Handler(this, function (_data) { _this.getProxy(UserInfoProxy_1.default).sendGoldSync(); }), new Laya.Handler(this, function (_data) { console.log("游戏结果err"); })); }; GameResultView.prototype.destory = function () { _super.prototype.destory.call(this); UiManager_1.UiManager.instance.add(ChoutiPanView_1.default); }; GameResultView.key = "GameResultView"; return GameResultView; }(BaseView_1.default)); exports.default = GameResultView; },{"../../frameworks/Debuger":12,"../../frameworks/mvc/BaseView":20,"../../frameworks/mvc/WindowAnmoType":25,"../../managers/UiManager":66,"../../platform/wxminigame/NetworkManager":71,"../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../platform/wxminigame/WXSDK/cpa/ChoutiPanView":79,"../loading/view/WordTipsUtils":36,"../main/GameStateManager":38,"../main/proxys/GameProxy":39,"../userinfo/UserInfoProxy":53}],46:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RoleActions = /** @class */ (function () { function RoleActions() { } RoleActions.stand = "stand"; RoleActions.kongzhong = "kongzhong"; RoleActions.luodi1 = "luodi1"; RoleActions.luodi2 = "luodi2"; RoleActions.datiao1 = "datiao1"; RoleActions.datiao2 = "datiao2"; RoleActions.huachan = "huachan"; RoleActions.kualan = "kualan"; RoleActions.cefan1 = "cefan1"; RoleActions.cefan2 = "cefan2"; RoleActions.paoqiangleft = "paoqiangleft"; RoleActions.rightjump = "rightjump"; RoleActions.paoqiangright = "paoqiangright"; RoleActions.leftjump = "leftjump"; RoleActions.paqiang = "paqiang"; RoleActions.climbend = "climbend"; /** * 跑动 */ RoleActions.run = "run"; /** * 跳跃 */ RoleActions.jump = "jump"; /** * 爬升 */ RoleActions.Climb = "Climb"; /** * 自由落体 */ RoleActions.Freefalling = "Freefalling"; RoleActions.left_climb = "left_climb"; RoleActions.right_climb = "right_climb"; RoleActions.right_jump = "right_jump"; RoleActions.left_jump = "left_jump"; RoleActions.playPalouAction = "playPalouAction"; /** * 加速板跳跃 */ RoleActions.jiasuJump = "jiasuJump"; /** * x方向瞬移 */ RoleActions.xshunyi = "xshunyi"; /** * 下滑位移 */ RoleActions.downSlide = "downSlide"; /** * 侧面加速 */ RoleActions.slidejiasu = "slidejiasu"; /** * 翻越 */ RoleActions.surmount = "surmount"; /** * 锁定爬升 */ RoleActions.lockclimb = "lockclimb"; return RoleActions; }()); exports.default = RoleActions; },{}],47:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PathConfig_1 = require("../../configs/gameConfigs/PathConfig"); var RolesPool = /** @class */ (function () { function RolesPool() { } RolesPool.addRoleByName = function (resouceName, clas, parent) { var skinnedmesh; var arr = RolesPool.roledict[resouceName]; if (arr && arr.length > 0) { skinnedmesh = arr.shift(); skinnedmesh.active = true; parent.addChild(skinnedmesh); } else { var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DRoleModel(resouceName)); skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0)); } if (clas) { var cla = skinnedmesh.addComponent(clas); cla.resouseName = resouceName; } var _out = new Laya.Quaternion; Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out); skinnedmesh.transform.rotation = _out; return skinnedmesh; }; RolesPool.removeRole = function (sp, resouceName, cla) { if (!RolesPool.roledict[resouceName]) { RolesPool.roledict[resouceName] = []; } if (cla) { cla.destroy(); } sp.active = false; sp.removeSelf(); RolesPool.roledict[resouceName].push(sp); }; RolesPool.roledict = {}; return RolesPool; }()); exports.default = RolesPool; },{"../../configs/gameConfigs/PathConfig":10}],48:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PathConfig_1 = require("../../configs/gameConfigs/PathConfig"); var GameUtils_1 = require("../../utils/GameUtils"); var Scene3dObject = /** @class */ (function () { function Scene3dObject() { this._outQUaternion4 = new Laya.Quaternion; this._outQUaternion = new Laya.Quaternion; } Scene3dObject.getInstance = function () { if (!this._instance) { this._instance = new Scene3dObject; } return this._instance; }; Scene3dObject.getPosVecbyScene = function (sceneName, buildname) { if (Scene3dObject.patternDict[sceneName]) { return Scene3dObject.patternDict[sceneName][buildname]; } return null; }; /** * 判断是否爬到顶端 */ Scene3dObject.checkisClimbTop = function (sceneName, buildname, pos) { var vec = Scene3dObject.getPosVecbyScene(sceneName, buildname); if (vec && Math.abs(vec.y - pos.y) < 1.5) { return true; } return false; }; /** * @param animator * @param animatorDict */ Scene3dObject.setAnimator = function (animator) { var chiddict; for (var s in Scene3dObject.actionDict) { if (!animator.getControllerLayer().getAnimatorState(s)) { chiddict = Scene3dObject.actionDict[s]; //创建一个动画动作状态 var state1 = new Laya.AnimatorState(); //设置动作状态的名称 state1.name = s; //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长 state1.clipStart = chiddict.s / Scene3dObject.actionnums; //设置动作状态播放的结束时间 state1.clipEnd = chiddict.e / Scene3dObject.actionnums; //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画) state1.clip = animator.getDefaultState().clip; //动画播放是否循环 state1.clip.islooping = chiddict.islooping; //添加动画状态到动画组件里 animator.addState(state1); } } }; Scene3dObject.prototype.initlizi = function () { var lizi = Scene3dObject.getlizibyName("jiasulizi"); lizi.particleSystem.play(); lizi.active = false; var lizi = Scene3dObject.getlizibyName("tanse_bai"); lizi.particleSystem.play(); lizi.active = false; var lizi = Scene3dObject.getlizibyName("tanse_huang"); lizi.particleSystem.play(); lizi.active = false; // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( "win_xian" ); // lizi.particleSystem.play(); // lizi.active = false; // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( "yanhua" ); // lizi.particleSystem.play(); // lizi.active = false; }; Scene3dObject.prototype.setliziPlaytanse = function (name, pos) { var closetime = 0; Laya.timer.clear(this, this.liziend); this.liziendtanse(); if (name == "tanse_bai") { var sort = GameUtils_1.GameUtils.randRangeint(0, 100); if (sort > 50) { name = "tanse_huang"; } } closetime = 500; this._tanselizi = Scene3dObject.getlizibyName(name); this._tanselizi.transform.position = pos; this._tanselizi.particleSystem.play(); if (closetime != 0) { Laya.timer.once(closetime, this, this.liziendtanse); } }; Scene3dObject.prototype.liziendtanse = function () { if (this._tanselizi) { this._tanselizi.particleSystem.stop(); this._tanselizi.active = false; } }; Scene3dObject.prototype.jiadulizi1 = function (name, pos) { if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) { this._engamelizi4 = Scene3dObject.getlizibyName("jiasulizi"); this._engamelizi4.particleSystem.looping = true; this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4); this._engamelizi4.transform.rotation = this._outQUaternion4; this._engamelizi4.particleSystem.play(); } var lzpos = pos.clone(); lzpos.y += 5; lzpos.z -= 10; this._engamelizi4.transform.position = lzpos; }; Scene3dObject.prototype.closeJiasulizi1 = function () { if (this._engamelizi4 && this._engamelizi4.active) { this._engamelizi4.active = false; } }; Scene3dObject.prototype.jiadulizi = function (name, pos) { if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) { this._engamelizi3 = Scene3dObject.getlizibyName("jiasulizi"); this._engamelizi3.particleSystem.looping = true; this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion); this._engamelizi3.transform.rotation = this._outQUaternion; this._engamelizi3.particleSystem.play(); } var lzpos = pos.clone(); lzpos.y += 5; this._engamelizi3.transform.position = lzpos; }; Scene3dObject.prototype.closeJiasulizi = function () { if (this._engamelizi3 && this._engamelizi3.active) { this._engamelizi3.active = false; } }; Scene3dObject.prototype.liziendgame = function (name, pos, iswin) { this._engamelizi1 = Scene3dObject.getlizibyName("yanhua"); this._engamelizi1.transform.position = pos; this._engamelizi1.particleSystem.play(); if (iswin) { this._engamelizi2 = Scene3dObject.getlizibyName("win_xian"); this._engamelizi2.transform.position = pos; this._engamelizi2.particleSystem.play(); } }; Scene3dObject.prototype.closeengamlizi = function () { if (this._engamelizi1) { this._engamelizi1.particleSystem.stop(); this._engamelizi1.active = false; } if (this._engamelizi2) { this._engamelizi2.particleSystem.stop(); this._engamelizi2.active = false; } }; // public setliziPlay( name:string,pos:Laya.Vector3 ):void // { // var closetime:number = 0; // Laya.timer.clear( this,this.liziend ); // switch( name ) // { // case "tanse_bai": // if( name == "tanse_bai" ) // { // var sort:number = GameUtils.randRangeint( 0,100 ); // if( sort > 50 ) // { // name = "tanse_huang"; // } // } // closetime = 500; // break; // case "jiasulizi": // break; // case "win_xian": // closetime = 0; // break; // case "yanhua": // closetime = 0; // break; // } // var lizi:Laya.ShuriKenParticle3D = Scene3dObject.getlizibyName( name ); // lizi.transform.position = pos; // lizi.particleSystem.play(); // if( closetime != 0 ) // { // Laya.timer.once( closetime,this,this.liziend,[lizi] ); // } // } Scene3dObject.prototype.liziend = function (lizi) { if (lizi) { lizi.particleSystem.stop(); lizi.active = false; } }; Scene3dObject.getlizibyName = function (name) { var lizisp; if (Scene3dObject.liziDict[name]) { lizisp = Scene3dObject.liziDict[name]; } else { lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel(name))); Scene3dObject.liziDict[name] = lizisp; Scene3dObject.scene3D.addChild(lizisp); } lizisp.active = true; return lizisp; }; Scene3dObject.nowmapDict = {}; Scene3dObject.diePosY = 0; Scene3dObject.gamewinPosZ = 0; Scene3dObject.patternDict = {}; Scene3dObject.npcDict = {}; Scene3dObject.npcscriptDict = {}; Scene3dObject.npcnum = 0; Scene3dObject.iscarmanpc = false; Scene3dObject.liziDict = {}; Scene3dObject.actionnums = 575; Scene3dObject.actionDict = { "climbend": { s: 550, e: 575, islooping: false }, "stand": { s: 0, e: 80, islooping: true }, "run": { s: 90, e: 106, islooping: true }, "jump": { s: 110, e: 132, islooping: true }, "kongzhong": { s: 132, e: 145, islooping: true }, "luodi1": { s: 145, e: 160, islooping: true }, "luodi2": { s: 170, e: 202, islooping: true }, "datiao1": { s: 210, e: 235, islooping: true }, "datiao2": { s: 240, e: 273, islooping: true }, "huachan": { s: 280, e: 310, islooping: true }, "kualan": { s: 310, e: 346, islooping: true }, "cefan1": { s: 350, e: 391, islooping: true }, "cefan2": { s: 400, e: 434, islooping: true }, "paoqiangleft": { s: 440, islooping: true, e: 456 }, "rightjump": { s: 460, e: 477, islooping: true }, "paoqiangright": { s: 480, e: 496, islooping: true }, "leftjump": { s: 500, e: 517, islooping: true }, "paqiang": { s: 520, e: 542, islooping: true } }; return Scene3dObject; }()); exports.default = Scene3dObject; },{"../../configs/gameConfigs/PathConfig":10,"../../utils/GameUtils":87}],49:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var SkinProxy_1 = require("./proxys/SkinProxy"); var MVCObjectPool_1 = require("../../frameworks/mvc/MVCObjectPool"); var WordTipsUtils_1 = require("../loading/view/WordTipsUtils"); var PathConfig_1 = require("../../configs/gameConfigs/PathConfig"); var PifuItem = /** @class */ (function (_super) { __extends(PifuItem, _super); function PifuItem() { return _super.call(this) || this; } PifuItem.prototype.constructFromXML = function (xml) { _super.prototype.constructFromXML.call(this, xml); for (var str in this._children) { var item = this._children[str]; this[item.name] = item; } this.onInit(); }; PifuItem.prototype.onInit = function () { this.initView(); this.initEvent(); }; PifuItem.prototype.initView = function () { this._skinProxy = MVCObjectPool_1.default.getInstance().getProxy(SkinProxy_1.default); this.c_state = this.getController("c_state"); }; PifuItem.prototype.initEvent = function () { this.on(Laya.Event.CLICK, this, this.btnclick); }; PifuItem.prototype.btnclick = function () { if (this.pifuvo) { switch (this.c_state.selectedIndex) { case 0: break; case 1: //拥有 this._skinProxy.getSkin(this.pifuvo); break; case 2: //活动获取 WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放"); break; case 3: //看视频获取 WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("暂未开放"); break; case 4: //金币购买 this._skinProxy.getSkin(this.pifuvo); break; } } }; PifuItem.prototype.showData = function (vo) { this.pifuvo = vo; if (this.pifuvo) { this.load_icon.icon = PathConfig_1.PathConfig.getroleicon(this.pifuvo.roleCFG.icon); if (this._skinProxy.roleVO.roleid == this.pifuvo.roleCFG.id) { this.c_state.selectedIndex = 0; } else if (this.pifuvo.state == 1) { this.c_state.selectedIndex = 1; } else { switch (this.pifuvo.roleCFG.getState) { case 1: this.c_state.selectedIndex = 3; this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need; break; case 2: this.c_state.selectedIndex = 4; this.txt_need.text = this.pifuvo.roleCFG.need.toString(); break; case 3: this.c_state.selectedIndex = 2; break; } } } }; PifuItem.prototype.dispose = function () { this.off(Laya.Event.CLICK, this, this.btnclick); _super.prototype.dispose.call(this); }; return PifuItem; }(fairygui.GButton)); exports.default = PifuItem; },{"../../configs/gameConfigs/PathConfig":10,"../../frameworks/mvc/MVCObjectPool":22,"../loading/view/WordTipsUtils":36,"./proxys/SkinProxy":51}],50:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../frameworks/mvc/BaseView"); var WindowAnmoType_1 = require("../../frameworks/mvc/WindowAnmoType"); var SkinProxy_1 = require("./proxys/SkinProxy"); var GameEvent_1 = require("../userinfo/events/GameEvent"); var UserInfoEvent_1 = require("../userinfo/events/UserInfoEvent"); var ResourceManager_1 = require("../../managers/ResourceManager"); var PathConfig_1 = require("../../configs/gameConfigs/PathConfig"); var RoleActions_1 = require("../scene3ds/RoleActions"); var UiManager_1 = require("../../managers/UiManager"); var RolesPool_1 = require("../scene3ds/RolesPool"); var MainRoleScript_1 = require("../modelScripts/MainRoleScript"); var SkinView = /** @class */ (function (_super) { __extends(SkinView, _super); function SkinView() { var _this = _super.call(this, "main", "skinview", false, WindowAnmoType_1.default.WindowAnmoType_none, 0) || this; _this._isdestorys = false; _this._out = new Laya.Quaternion; return _this; } SkinView.prototype.initView = function () { this._isdestorys = false; this.c_title = this.getControllerByBame("c_title"); this._skinProxy = this.getProxy(SkinProxy_1.default); this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false); this.c_title.selectedIndex = 0; this.onchange(); //添加3D场景 this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0); //添加照相机 this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80))); // this._uicarma3D.clearColor = null; this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height); this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false); // //添加方向光 // this._uilight = Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6); // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); this.updateroleHandler(); }; SkinView.prototype.initEvent = function () { this.addListener(this.btn_close, Laya.Event.CLICK, this, this.onclosefun); this.addListener(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange); this.addDataEvent(GameEvent_1.default.updateSKinView, this, this.onchange); this.addDataEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid, this, this.updateroleHandler); }; SkinView.prototype.updateroleHandler = function () { var roleVO = this._skinProxy.roleVO; this.removeRole(); var pathArr = []; pathArr.push({ url: PathConfig_1.PathConfig.get3DRoleModel(roleVO.roleCfg.name) }); ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.loadcomplete, null, true, roleVO.roleCfg.name); }; SkinView.prototype.loadcomplete = function (resousename) { var roleVO = this._skinProxy.roleVO; if (!this._isdestorys && this._ui3DScene && resousename == roleVO.roleCfg.name) { this._rolemo = RolesPool_1.default.addRoleByName(resousename, MainRoleScript_1.default, this._ui3DScene); this._rolemo.transform.position = new Laya.Vector3(0, 2, 0); Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out); this._rolemo.transform.rotation = this._out; this._rolemo.getComponent(MainRoleScript_1.default).setAction(RoleActions_1.default.stand); } }; SkinView.prototype.removeRole = function () { if (this._rolemo) { var script = this._rolemo.getComponent(MainRoleScript_1.default); RolesPool_1.default.removeRole(this._rolemo, script.resouseName, script); this._rolemo = null; } }; SkinView.prototype.onchange = function () { if (this.c_title.selectedIndex == 0) { this.list_0.numItems = this._skinProxy.pifuArr.length; } else { this.list_0.numItems = 0; } }; SkinView.prototype.itemlistrender = function (index, item) { if (this.c_title.selectedIndex == 0) { if (index < this._skinProxy.pifuArr.length) { item.showData(this._skinProxy.pifuArr[index]); } } }; SkinView.prototype.onclosefun = function () { UiManager_1.UiManager.instance.close(SkinView); }; SkinView.prototype.destory = function () { this._isdestorys = true; this.removeRole(); if (this._uicarma3D) { this._uicarma3D.destroy(); this._uicarma3D = null; } if (this._ui3DScene) { this._ui3DScene.destroy(); this._ui3DScene = null; } _super.prototype.destory.call(this); }; SkinView.key = "SkinView"; return SkinView; }(BaseView_1.default)); exports.default = SkinView; },{"../../configs/gameConfigs/PathConfig":10,"../../frameworks/mvc/BaseView":20,"../../frameworks/mvc/WindowAnmoType":25,"../../managers/ResourceManager":63,"../../managers/UiManager":66,"../modelScripts/MainRoleScript":43,"../scene3ds/RoleActions":46,"../scene3ds/RolesPool":47,"../userinfo/events/GameEvent":54,"../userinfo/events/UserInfoEvent":56,"./proxys/SkinProxy":51}],51:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseProxys_1 = require("../../../frameworks/mvc/BaseProxys"); var CacheManager_1 = require("../../../managers/CacheManager"); var UserCacheType_1 = require("../../userinfo/events/UserCacheType"); var PiFuVO_1 = require("../vo/PiFuVO"); var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG"); var UiManager_1 = require("../../../managers/UiManager"); var SkinView_1 = require("../SkinView"); var WordTipsUtils_1 = require("../../loading/view/WordTipsUtils"); var GameEvent_1 = require("../../userinfo/events/GameEvent"); var UserInfoProxy_1 = require("../../userinfo/UserInfoProxy"); var SkinProxy = /** @class */ (function (_super) { __extends(SkinProxy, _super); function SkinProxy() { return _super.call(this) || this; } SkinProxy.prototype.initProxy = function () { }; SkinProxy.prototype.init = function () { this.cachedata = CacheManager_1.default.getInstance().getCacheObj(UserCacheType_1.default.skin); var pifuData; if (!this.cachedata.hasOwnProperty("pifu")) { this.cachedata["pifu"] = {}; } pifuData = this.cachedata["pifu"]; this.pifuArr = []; this.pifuDict = {}; var i = 0; var nums = RoleCFG_1.default.vec.length; for (i = 0; i < nums; i++) { var pifuvo = new PiFuVO_1.default; var cfg = RoleCFG_1.default.vec[i]; pifuvo.roleCFG = cfg; var d = pifuData[cfg.id]; if (d) { pifuvo.state = Number(d.state); pifuvo.hasnum = Number(d.hasnum); } else { pifuvo.state = 0; pifuvo.hasnum = 0; } if (cfg.getState == 0) { pifuvo.state = 1; } this.pifuArr.push(pifuvo); this.pifuDict[pifuvo.roleCFG.id] = pifuvo; } }; SkinProxy.prototype.openview = function () { UiManager_1.UiManager.instance.add(SkinView_1.default); }; SkinProxy.prototype.getSkin = function (pifu) { if (pifu.state == 1) { this.roleVO.roleid = pifu.roleCFG.id; this.dispacheDataEvent(GameEvent_1.default.updateSKinView); } else { switch (pifu.roleCFG.getState) { case 1: //视频获取 break; case 2: //金币购买 if (this.roleVO.Gold >= pifu.roleCFG.need) { this.roleVO.roleid = pifu.roleCFG.id; this.roleVO.Gold -= pifu.roleCFG.need; pifu.state = 1; this.addskinCache(pifu.roleCFG.id, pifu.state, pifu.hasnum); this.dispacheDataEvent(GameEvent_1.default.updateSKinView); WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("购买成功"); this.getProxy(UserInfoProxy_1.default).sendGoldSync(); } else { WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("金币不足"); } break; case 3: //活动获取 break; } } }; SkinProxy.prototype.addskinCache = function (id, state, hasnum) { this.cachedata["pifu"][id] = {}; this.cachedata["pifu"][id]["state"] = state; this.cachedata["pifu"][id]["hasnum"] = hasnum; CacheManager_1.default.getInstance().addCacheObj(UserCacheType_1.default.skin, this.cachedata); }; SkinProxy.key = "SkinProxy"; return SkinProxy; }(BaseProxys_1.default)); exports.default = SkinProxy; },{"../../../configs/dataConfigs/RoleCFG":9,"../../../frameworks/mvc/BaseProxys":19,"../../../managers/CacheManager":59,"../../../managers/UiManager":66,"../../loading/view/WordTipsUtils":36,"../../userinfo/UserInfoProxy":53,"../../userinfo/events/GameEvent":54,"../../userinfo/events/UserCacheType":55,"../SkinView":50,"../vo/PiFuVO":52}],52:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PiFuVO = /** @class */ (function () { function PiFuVO() { /** * 0:未拥有,1:已经拥有 */ this.state = 0; this.hasnum = 0; } return PiFuVO; }()); exports.default = PiFuVO; },{}],53:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlatformEvent_1 = require("../../platform/events/PlatformEvent"); var BaseProxys_1 = require("../../frameworks/mvc/BaseProxys"); var PlayerAccount_1 = require("../../platform/wxminigame/WXSDK/PlayerAccount"); var Debuger_1 = require("../../frameworks/Debuger"); var NetworkManager_1 = require("../../platform/wxminigame/NetworkManager"); var UserInfoProxy = /** @class */ (function (_super) { __extends(UserInfoProxy, _super); function UserInfoProxy() { var _this = _super.call(this) || this; _this.hastilitime = 0; _this.isenterMainGame = false; return _this; } UserInfoProxy.prototype.initProxy = function () { this.addDataEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd, this, this.audioInterruptionEnd); }; UserInfoProxy.prototype.audioInterruptionEnd = function () { if (this.isenterMainGame) { // SoundssManager.getInstance().playbgSound( "gamebg" ); } }; UserInfoProxy.prototype.init = function () { this.roleVO.init(); }; UserInfoProxy.prototype.addLevel = function () { this.roleVO.addLevel(); }; UserInfoProxy.prototype.changeGold = function (value) { this.roleVO.Gold += value; }; UserInfoProxy.prototype.sendGoldSync = function () { var agrs = [{ "t": PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime.toString() }, { "vmoney": this.roleVO.Gold.toString() }]; Debuger_1.default.log("金币同步:", agrs); NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.usersync, agrs, new Laya.Handler(this, function (_data) { }), new Laya.Handler(this, function (_data) { console.log("游戏结果err"); })); }; UserInfoProxy.key = "UserInfoProxy"; return UserInfoProxy; }(BaseProxys_1.default)); exports.default = UserInfoProxy; },{"../../frameworks/Debuger":12,"../../frameworks/mvc/BaseProxys":19,"../../platform/events/PlatformEvent":69,"../../platform/wxminigame/NetworkManager":71,"../../platform/wxminigame/WXSDK/PlayerAccount":74}],54:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameEvent = /** @class */ (function () { function GameEvent() { } GameEvent.removeselect = "GameEvent_removeselect"; /** * 开始游戏 */ GameEvent.startGame = "GameEvent_startGame"; /** * 结束游戏 */ GameEvent.endGame = "GameEvent_endGame"; GameEvent.npcendGame = "GameEvent_npcendGame"; /** * 暂停游戏 */ GameEvent.stopGame = "GameEvent_stopGame"; /** * 通关成功 */ GameEvent.winGame = "GameEvent_winGame"; /** * 通关失败 */ GameEvent.failGame = "GameEvent_failGame"; GameEvent.jumpgame = "GameEvent_jumpgame"; /** * 回到主界面 */ GameEvent.returnMainView = "returnMainView"; GameEvent.updateSKinView = "GameEvent_updateSKinView"; return GameEvent; }()); exports.default = GameEvent; },{}],55:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserCacheType = /** @class */ (function () { function UserCacheType() { } /******************************************************** */ UserCacheType.lastDay = "lastDay"; UserCacheType.nowdayShare = "dayshare"; UserCacheType.nowdayVideo = "dayvideo"; /** * 记录上次离开时间 */ UserCacheType.lasttime = "lasttime"; UserCacheType.caplastflushtime = "captime"; UserCacheType.capstorageappids = "capappids"; UserCacheType.hasgetappids = "hasgetappids"; /** * 角色信息 */ UserCacheType.roleData = "roleData"; /********************************************************************** */ UserCacheType.gold = "gold"; UserCacheType.roleid = "roleid"; UserCacheType.levelid = "levelid"; /** * 皮肤 */ UserCacheType.skin = "skin"; return UserCacheType; }()); exports.default = UserCacheType; },{}],56:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var UserInfoEvent = /** @class */ (function () { function UserInfoEvent() { } UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData"; UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid"; UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid"; return UserInfoEvent; }()); exports.default = UserInfoEvent; },{}],57:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseVO_1 = require("../../../frameworks/vo/BaseVO"); var EventUtils_1 = require("../../../frameworks/events/EventUtils"); var UserInfoEvent_1 = require("../events/UserInfoEvent"); var CacheManager_1 = require("../../../managers/CacheManager"); var UserCacheType_1 = require("../events/UserCacheType"); var RoleCFG_1 = require("../../../configs/dataConfigs/RoleCFG"); var LevelCFG_1 = require("../../../configs/dataConfigs/LevelCFG"); var GameUtils_1 = require("../../../utils/GameUtils"); var PlayerAccount_1 = require("../../../platform/wxminigame/WXSDK/PlayerAccount"); var RoleVO = /** @class */ (function (_super) { __extends(RoleVO, _super); function RoleVO() { var _this = _super.call(this) || this; /** * 金币 */ _this._Gold = 0; _this._roleid = 0; _this._leveid = 0; _this._serverLevel = 0; _this.movespeed = 0; _this.frontjump = new Laya.Vector3; _this.leftjump = new Laya.Vector3; _this.rightjump = new Laya.Vector3; _this.upclimb = 0; _this.slideclimb = new Laya.Vector3; return _this; } RoleVO.getInstance = function () { if (!RoleVO._instance) { RoleVO._instance = new RoleVO; } return RoleVO._instance; }; RoleVO.prototype.init = function () { var cachemanager = CacheManager_1.default.getInstance(); var nowGold = Number(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.vmoney)); this.Gold = nowGold; //cachemanager.getnum( UserCacheType.gold ); this._roleid = cachemanager.getnum(UserCacheType_1.default.roleid); if (this.roleid == 0) { this.roleid = 1; } else { this.setRoleCFG(); } // this._leveid = cachemanager.getnum( UserCacheType.levelid ); this._serverLevel = Number(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetUser(PlayerAccount_1.AccountUser.stage)); // this._serverLevel = 9; this.updateLevel(); }; Object.defineProperty(RoleVO.prototype, "nowlevel", { get: function () { return this._leveid; }, enumerable: true, configurable: true }); RoleVO.prototype.getNowServerLevel = function () { return this._serverLevel + 1; }; RoleVO.prototype.addLevel = function () { this._serverLevel++; this.updateLevel(); }; RoleVO.prototype.updateLevel = function () { var lv = this._serverLevel + 1; var allnums = LevelCFG_1.default.vec.length; if (lv > allnums) { var value = (lv - allnums) % (allnums - 2); if (value == 0) { this._leveid = allnums; } else { this._leveid = value + 2; } } else { this._leveid = lv; } this.levelcfg = LevelCFG_1.default.dict[this._leveid]; this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road); EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid); }; RoleVO.prototype.setRoleCFG = function () { this.roleCfg = RoleCFG_1.default.dict[this._roleid]; this.movespeed = this.roleCfg.speed; this.frontjump.x = Number(this.roleCfg.frontjump.x); this.frontjump.y = Number(this.roleCfg.frontjump.y); this.frontjump.z = Number(this.roleCfg.frontjump.z); this.leftjump.x = Number(this.roleCfg.leftjump.x); this.leftjump.y = Number(this.roleCfg.leftjump.y); this.leftjump.z = Number(this.roleCfg.leftjump.z); this.rightjump.x = Number(this.roleCfg.rightjump.x); this.rightjump.y = Number(this.roleCfg.rightjump.y); this.rightjump.z = Number(this.roleCfg.rightjump.z); this.upclimb = Number(this.roleCfg.upclimb); this.slideclimb.x = Number(this.roleCfg.slideclimb.x); this.slideclimb.y = Number(this.roleCfg.slideclimb.y); this.slideclimb.z = Number(this.roleCfg.slideclimb.z); }; Object.defineProperty(RoleVO.prototype, "roleid", { get: function () { return this._roleid; }, // public set leveid( value:number ) // { // if( this._leveid != value ) // { // this._leveid = value; // this.levelcfg = LevelCFG.dict[ this._leveid ]; // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road); // CacheManager.getInstance().addstr( UserCacheType.levelid,this._leveid.toString() ); // EventUtils.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid ); // } // } // public get leveid():number // { // return this._leveid; // } set: function (value) { if (this._roleid != value) { this._roleid = value; this.setRoleCFG(); CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.roleid, this._roleid.toString()); EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.userinfoEvent_updateroleid); } }, enumerable: true, configurable: true }); Object.defineProperty(RoleVO.prototype, "Gold", { get: function () { return this._Gold; }, set: function (value) { if (this._Gold != value) { this._Gold = value; CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.gold, this._Gold.toString()); EventUtils_1.EventUtils.dispatchEvent(UserInfoEvent_1.default.UserInfoEvent_updateUserData); } }, enumerable: true, configurable: true }); return RoleVO; }(BaseVO_1.BaseVO)); exports.default = RoleVO; },{"../../../configs/dataConfigs/LevelCFG":7,"../../../configs/dataConfigs/RoleCFG":9,"../../../frameworks/events/EventUtils":16,"../../../frameworks/vo/BaseVO":31,"../../../managers/CacheManager":59,"../../../platform/wxminigame/WXSDK/PlayerAccount":74,"../../../utils/GameUtils":87,"../events/UserCacheType":55,"../events/UserInfoEvent":56}],58:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceManager_1 = require("./ResourceManager"); var PifuItem_1 = require("../gamemodule/skins/PifuItem"); var CpaDownsView_1 = require("../platform/wxminigame/WXSDK/cpa/CpaDownsView"); var CpaItem_1 = require("../platform/wxminigame/WXSDK/cpa/item/CpaItem"); var BaoKuanGameView_1 = require("../platform/wxminigame/WXSDK/cpa/BaoKuanGameView"); var ShiwantuijianView_1 = require("../platform/wxminigame/WXSDK/cpa/ShiwantuijianView"); /* * name; */ var BinderManager = /** @class */ (function (_super) { __extends(BinderManager, _super); function BinderManager() { return _super.call(this) || this; } /** * 数据绑定 */ BinderManager.binderAll = function () { this.binderFairygui(); this.binderGComponent(); }; /** * ui框架的绑定 */ BinderManager.binderFairygui = function () { fairygui.UIConfig.gameLoaderManager = ResourceManager_1.default.getInstance(); //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1" fairygui.UIConfig.gameEffectDict = {}; }; /** * 组件绑定 */ BinderManager.binderGComponent = function () { //main fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", PifuItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default); fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default); }; return BinderManager; }(Laya.EventDispatcher)); exports.BinderManager = BinderManager; },{"../gamemodule/skins/PifuItem":49,"../platform/wxminigame/WXSDK/cpa/BaoKuanGameView":78,"../platform/wxminigame/WXSDK/cpa/CpaDownsView":80,"../platform/wxminigame/WXSDK/cpa/ShiwantuijianView":83,"../platform/wxminigame/WXSDK/cpa/item/CpaItem":85,"./ResourceManager":63}],59:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../Global"); var PlatfromType_1 = require("../platform/PlatfromType"); /* * 本地数据缓存管理器 */ var CacheManager = /** @class */ (function (_super) { __extends(CacheManager, _super); function CacheManager() { return _super.call(this) || this; } CacheManager.getInstance = function () { if (!this.instance) { this.instance = new CacheManager(); } return this.instance; }; CacheManager.prototype.init = function () { }; /** * 添加本地缓存数据 object * @param key * @param value */ CacheManager.prototype.addObj = function (key, value) { this.addCacheObj(key, value); }; /** * 获取本地缓存数据 object * @param key */ CacheManager.prototype.getObj = function (key) { return this.getCacheObj(key); }; /** * 添加本地缓存数据 string * @param key * @param value */ CacheManager.prototype.addstr = function (key, value) { this.addCacheStr(key, value); }; CacheManager.prototype.addnum = function (key, value) { this.addCacheStr(key, value.toString()); }; /** * 获取本地缓存数据 string * @param key */ CacheManager.prototype.getstr = function (key) { return this.getCachestr(key); }; /** * 获取本地缓存数据 number * @param key */ CacheManager.prototype.getnum = function (key) { return Number(this.getCachestr(key)); }; /** * 清理指定本地缓存数据 * @param key */ CacheManager.prototype.removeCache = function (key) { this.removeselectCache(key); }; /** * 清理所有本地缓存数据 */ CacheManager.prototype.clearAll = function () { this.clearAllCache(); }; CacheManager.prototype.addCacheObj = function (key, value) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: this.setStorageSyncWX(key, value); break; default: Laya.LocalStorage.setJSON(key, value); break; } }; CacheManager.prototype.getCacheObj = function (key) { var obj; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: obj = this.getStorageSyncWX(key); break; default: obj = Laya.LocalStorage.getJSON(key); break; } if (!obj) { obj = {}; } return obj; }; CacheManager.prototype.addCacheStr = function (key, value) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: this.setStorageSyncWX(key, value); break; default: Laya.LocalStorage.setItem(key, value); break; } }; CacheManager.prototype.getCachestr = function (key) { var str = "0"; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: str = this.getStorageSyncWX(key); break; default: str = Laya.LocalStorage.getItem(key); break; } if (str == null || str == "") { str = "0"; } return str; }; CacheManager.prototype.removeselectCache = function (key) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: this.removeStorageWX(key); break; default: Laya.LocalStorage.removeItem(key); break; } }; CacheManager.prototype.clearAllCache = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: this.clearStorageWX(); break; default: Laya.LocalStorage.clear(); break; } }; /** * 本地存储 * @param key * @param data */ CacheManager.prototype.setStorageSyncWX = function (key, data) { var wx = Laya.Browser.window.wx; if (wx) { wx.setStorageSync(key, data); } }; /** * 获取本地存储 * @param key */ CacheManager.prototype.getStorageSyncWX = function (key) { var wx = Laya.Browser.window.wx; if (wx) { return wx.getStorageSync(key); } return null; }; /** * 从本地缓存中移除指定 key * @param key */ CacheManager.prototype.removeStorageWX = function (key) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.removeStorage(key); } }; /** * 清理存储数据 */ CacheManager.prototype.clearStorageWX = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.clearStorageSync(); } }; return CacheManager; }(Laya.EventDispatcher)); exports.default = CacheManager; },{"../Global":2,"../platform/PlatfromType":68}],60:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CacheManager_1 = require("./CacheManager"); var TimeUtils_1 = require("../utils/TimeUtils"); var UserCacheType_1 = require("../gamemodule/userinfo/events/UserCacheType"); var TimesTamper_1 = require("../frameworks/TimesTamper"); var DayManager = /** @class */ (function () { function DayManager() { } DayManager.getInstance = function () { if (!this._instance) { this._instance = new DayManager(); } return this._instance; }; DayManager.prototype.init = function () { var lastday = CacheManager_1.default.getInstance().getstr(UserCacheType_1.default.lastDay); var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.getInstance().serverTime); if (lastday != nowday) { CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.lastDay, nowday); DayManager.isNewDay = true; } else { DayManager.isNewDay = false; } }; return DayManager; }()); exports.default = DayManager; },{"../frameworks/TimesTamper":14,"../gamemodule/userinfo/events/UserCacheType":55,"../utils/TimeUtils":88,"./CacheManager":59}],61:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Global_1 = require("../Global"); var LayerNotify_1 = require("../frameworks/notification/LayerNotify"); /* * name; */ var GameLayerManager = /** @class */ (function (_super) { __extends(GameLayerManager, _super); function GameLayerManager() { var _this = _super.call(this) || this; /** * 背景层( 或者3D场景层 ) */ _this.background = new fairygui.GComponent(); /** * ui层 */ _this.uiLayer = new fairygui.GComponent(); /** * 最定层 */ _this.topLayer = new fairygui.GComponent(); _this._uilayerZorder = 0; _this._upuilayerZorder = 200; _this._tipslayerZorder = 1000; _this._guidelayerZorder = 600; return _this; } GameLayerManager.getInstance = function () { if (!this._instance) { this._instance = new GameLayerManager(); } return this._instance; }; //初始化层级 GameLayerManager.prototype.initlayer = function () { Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject); fairygui.GRoot.inst.addChild(this.background); fairygui.GRoot.inst.addChild(this.uiLayer); fairygui.GRoot.inst.addChild(this.topLayer); }; GameLayerManager.prototype.addtoLayer = function (itemview, layer) { if (layer == LayerNotify_1.LayerNotify.LAYER_BACKGROUND) { GameLayerManager.getInstance().background.addChild(itemview); } else if (layer == LayerNotify_1.LayerNotify.LAYER_UILAYER) { this._uilayerZorder++; GameLayerManager.getInstance().uiLayer.addChild(itemview); itemview.sortingOrder = this._uilayerZorder; } else if (layer == LayerNotify_1.LayerNotify.LAYER_UPUILAYER) { this._upuilayerZorder++; GameLayerManager.getInstance().uiLayer.addChild(itemview); itemview.sortingOrder = this._upuilayerZorder; } else if (layer == LayerNotify_1.LayerNotify.LAYER_TIPSLAYER) { // GameLayerManager.getInstance().tipsLayer.addChild(itemview); this._tipslayerZorder++; GameLayerManager.getInstance().uiLayer.addChild(itemview); itemview.sortingOrder = this._tipslayerZorder; } else if (layer == LayerNotify_1.LayerNotify.LAYER_GUIDELAYER) { this._guidelayerZorder++; GameLayerManager.getInstance().uiLayer.addChild(itemview); itemview.sortingOrder = this._guidelayerZorder; } }; GameLayerManager.prototype.removeformLayer = function (layer) { switch (layer) { case LayerNotify_1.LayerNotify.LAYER_UILAYER: this._uilayerZorder--; if (this._uilayerZorder < 0) { this._uilayerZorder = 0; } break; case LayerNotify_1.LayerNotify.LAYER_UPUILAYER: this._upuilayerZorder--; if (this._upuilayerZorder < 200) { this._upuilayerZorder = 200; } break; case LayerNotify_1.LayerNotify.LAYER_TIPSLAYER: this._tipslayerZorder--; if (this._tipslayerZorder < 1000) { this._tipslayerZorder = 1000; } break; case LayerNotify_1.LayerNotify.LAYER_GUIDELAYER: this._tipslayerZorder--; if (this._tipslayerZorder < 600) { this._tipslayerZorder = 600; } break; } }; return GameLayerManager; }(Laya.EventDispatcher)); exports.GameLayerManager = GameLayerManager; },{"../Global":2,"../frameworks/notification/LayerNotify":29}],62:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ResourceManager_1 = require("./ResourceManager"); var Debuger_1 = require("../frameworks/Debuger"); var CacheVO_1 = require("../frameworks/vo/CacheVO"); var ObjectPool_1 = require("../frameworks/mvc/ObjectPool"); var PathConfig_1 = require("../configs/gameConfigs/PathConfig"); var TimerService_1 = require("../frameworks/TimerService"); /* * 资源管理器; */ var ResDataManager = /** @class */ (function () { function ResDataManager() { /** * 超过X分钟未被引用的资源,清理掉 */ this._clearTime = 60000; this._disUpdateTime = 30000; this._time = 0; } ResDataManager.getInastance = function () { if (null == this.instance) { this.instance = new ResDataManager(); } return this.instance; }; ResDataManager.prototype.init = function () { ObjectPool_1.default.register(CacheVO_1.default.poolkey, CacheVO_1.default); this._resourceurlPool = {}; this._pkgPool = {}; this.nocacheDict = { "loading": true, "main": true, "uicomponent": true }; TimerService_1.default.getInastance().addUpdateTarget(this); }; ResDataManager.prototype.update = function (dt) { this._time += dt; if (this._time > this._disUpdateTime) //1分钟检查一次 { if (ResourceManager_1.default.instance.running) //如果当前在加载中,延时1秒检测 { this._time -= 1000; return; } this.updateGroupPool(); this._time = 0; } }; ResDataManager.prototype.updateGroupPool = function () { var nowTime = Laya.Browser.now(); var s; if (this._pkgPool) { var vo; for (s in this._pkgPool) { vo = this._pkgPool[s]; if (vo.ref <= 0 && (nowTime - vo.time) > this._clearTime) { this.removePackage(vo.packageName, true); this.clearCacheVO(vo.packageName); } } } //清理图片缓存 if (this._resourceurlPool) { var resourceurlPool = this._resourceurlPool; for (s in resourceurlPool) { if (resourceurlPool[s] <= 0) { this.clearResByUrl(s, true); } } } }; ResDataManager.prototype.addCacheVO = function (pkgname, isCache) { if (isCache && !this.nocacheDict.hasOwnProperty(pkgname)) { var vo; if (!this._pkgPool.hasOwnProperty(pkgname)) { vo = ObjectPool_1.default.getObj(CacheVO_1.default.poolkey); vo.packageName = pkgname; this._pkgPool[pkgname] = vo; } else { vo = this._pkgPool[pkgname]; } vo.ref++; vo.time = Laya.Browser.now(); } }; ResDataManager.prototype.clearCacheVO = function (pkgName) { if (this._pkgPool[pkgName]) { var vo = this._pkgPool[pkgName]; vo.clear(); delete this._pkgPool[pkgName]; } }; /** * 添加ui包 * @param pkgname 包名 * @param isaddpackage 是否创建uipackage * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture ) */ ResDataManager.prototype.adduiPackage = function (pkgname, isaddpackage, isCache) { if (isaddpackage === void 0) { isaddpackage = true; } if (isCache === void 0) { isCache = true; } if (isaddpackage) { if (pkgname == "main") { fairygui.UIPackage.addPackage(PathConfig_1.PathConfig.res + PathConfig_1.PathConfig.ui + pkgname, pkgname); } else { fairygui.UIPackage.addPackage(PathConfig_1.PathConfig.wxlocal + PathConfig_1.PathConfig.ui + pkgname, pkgname); } } this.addCacheVO(pkgname, isCache); }; /** * 添加包 * @param path 路径( 事例:res/ui/ ) * @param pkgname 包名 * @param isaddpackage 是否添加 * @param isCache 是否缓存 */ ResDataManager.prototype.addPackage = function (path, pkgname, isaddpackage, isCache) { if (isaddpackage === void 0) { isaddpackage = true; } if (isCache === void 0) { isCache = true; } if (isaddpackage) { fairygui.UIPackage.addPackage(path + pkgname, pkgname); } this.addCacheVO(pkgname, isCache); }; /** * 移除包 * @param pkgname 包名 * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 ) */ ResDataManager.prototype.removePackage = function (pkgname, isclear) { if (isclear === void 0) { isclear = false; } if (pkgname == "" || pkgname == null) { return; } if (isclear) { Debuger_1.default.log("清理包资源缓存:" + pkgname); fairygui.UIPackage.removePackage(pkgname); if (this._pkgPool.hasOwnProperty(pkgname)) { delete this._pkgPool[pkgname]; } } else { if (this._pkgPool.hasOwnProperty(pkgname)) { var vo = this._pkgPool[pkgname]; if (vo) { vo.ref--; } } } }; ResDataManager.prototype.addeffectPackage = function (pkgname, isCache) { if (isCache === void 0) { isCache = true; } // Debuger.log("addeffectPackage:" + pkgname); // fairygui.UIPackage.addPackage(PathConfig.res + PathConfig.effects + pkgname,pkgname); // this.addCacheVO( pkgname,isCache ); }; ResDataManager.prototype.removeeffectpackage = function (pkgname, isclear) { if (isclear === void 0) { isclear = false; } Debuger_1.default.log("removeeffectpackage:" + pkgname); ResDataManager.getInastance().removePackage(pkgname, isclear); }; /** * 获取已经加载过的数据 * @param url 资源url * @param isCache 是否存储在缓存池中,默认为true */ ResDataManager.prototype.getResByurl = function (url, isCache) { if (isCache === void 0) { isCache = true; } if (isCache) { if (this._resourceurlPool[url] == null) { this._resourceurlPool[url] = 0; } this._resourceurlPool[url]++; } return Laya.loader.getRes(url); }; /** * 清理资源缓存(url) * @param url 要清理的资源url * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 ) */ ResDataManager.prototype.clearResByUrl = function (url, isClear) { if (isClear === void 0) { isClear = false; } if (this._resourceurlPool.hasOwnProperty(url)) { if (isClear) { Debuger_1.default.log("clearResByUrl:" + url); Laya.loader.clearRes(url); delete this._resourceurlPool[url]; } else { this._resourceurlPool[url]--; } } else { Laya.loader.clearRes(url); } }; /** * 清理资源缓存(Array) * @param urls 资源数组 * @param packageName 包名 */ ResDataManager.prototype.clearResByArrUrls = function (urls, packageName) { if (packageName === void 0) { packageName = ""; } if (packageName != "") { fairygui.UIPackage.removePackage(packageName); } for (var s in urls) { this.clearResByUrl(urls[s].url, true); } }; return ResDataManager; }()); exports.default = ResDataManager; },{"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12,"../frameworks/TimerService":13,"../frameworks/mvc/ObjectPool":23,"../frameworks/vo/CacheVO":32,"./ResourceManager":63}],63:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var Handler = Laya.Handler; var Debuger_1 = require("../frameworks/Debuger"); var EventUtils_1 = require("../frameworks/events/EventUtils"); var RecConfigs_1 = require("../configs/gameConfigs/RecConfigs"); var ResourceManager = /** @class */ (function (_super) { __extends(ResourceManager, _super); function ResourceManager() { var _this = _super.call(this) || this; _this._groupIndex = 0; _this.running = false; /** * 要加载的总数量 */ _this._loadNum = 0; /** * 已经加载的数量 */ _this._loadedNum = 0; _this._preloadNum = 0; _this._cut = 0; _this._nowLoadArr = null; return _this; } ResourceManager.getInstance = function () { if (this.instance == null) { this.instance = new ResourceManager(); } return this.instance; }; ResourceManager.prototype.init = function () { this._configs = new Array(); this._groups = {}; Laya.loader.retryNum = 4; Laya.loader.on(Laya.Event.ERROR, this, this.onError); Laya.loader.on("errorsMsg", this, this.errorsMsghandler); Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler); }; ResourceManager.prototype.onLoadConfigComplete = function () { if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) { this._onConfigComplete.call(this._onConfigCompleteTarget); } }; ResourceManager.prototype.errorsMsghandler = function (msg) { Debuger_1.default.log("errorsMsghandler", msg); EventUtils_1.EventUtils.dispatchEvent("loadfailEvent", msg); }; ResourceManager.prototype.gameerrorsMsghandler = function (msg) { EventUtils_1.EventUtils.dispatchEvent("gameserrosEvent", msg); }; /** * 加载资源组 * @param groupName 组名 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceManager.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } // Debuger.log(groupName); var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = RecConfigs_1.default.getInstance().groupdict[groupName]; data.isShow = isShow; data.args = args; data.type = "group"; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载单个资源 * @param url 资源url * @param type 资源类型 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceManager.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = [{ url: url, type: type }]; data.isShow = isShow; data.args = args; data.type = "single"; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载数组资源 * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceManager.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = isShow; data.type = "arr"; data.args = args; data.resouseType = "2D"; this._configs.push(data); this.loadStart(); }; /** * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 ) * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceManager.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (cut === void 0) { cut = 3; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = false; data.type = "loaderArr"; data.cut = cut; data.resouseType = "2D"; this._configs.push(data); this.startLoad1(); }; ResourceManager.prototype.startLoad1 = function () { if (!this.running && this._configs.length > 0) { this._nowLoadData = this._configs.shift(); this._nowLoadArr = this._nowLoadData.urls.concat().reverse(); this._loadNum = this._nowLoadArr.length; this._loadedNum = 0; this._preloadNum = this._loadedNum; this._cut = Number(this._nowLoadData.cut); this.loadStart1(); } }; ResourceManager.prototype.loadStart1 = function () { if (this.running) { return; } if (this._nowLoadArr && this._nowLoadArr.length > 0) { this.running = true; var needArr; if (this._nowLoadArr.length > this._cut) { needArr = this._nowLoadArr.splice(0, this._cut); } else { needArr = this._nowLoadArr.splice(0); } this._cut = needArr.length; this._preloadNum = this._loadedNum; this.onLoadingArr(0); var resouseType = this._nowLoadData.resouseType; if (resouseType == "2D" || resouseType == null) { Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false)); } else { Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false)); } } else { this._nowLoadData = null; this.startLoad1(); } }; ResourceManager.prototype.onLoadingArr = function (value) { this._loadedNum = this._preloadNum + value * this._cut; if (this._nowLoadData) { var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100); if (this._nowLoadData.progress != null) { this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100)); } } }; ResourceManager.prototype.onLoadCompleteArr = function () { this.onLoadingArr(1); this._loadedNum = this._preloadNum + this._cut; this.running = false; if (this._loadedNum == this._loadNum) { if (this._nowLoadData && this._nowLoadData.complete) { this._nowLoadData.complete.call(this._nowLoadData.completeTarget); } } Laya.timer.callLater(this, this.loadStart1); // this.loadStart1(); }; ResourceManager.prototype.loadStart = function () { if (this.running || this._configs.length == 0) { return; } this.running = true; this._nowLoadData = this._configs[0]; var arr = this._nowLoadData.urls; var isShow = this._nowLoadData.isShow; if (isShow) { fairygui.GRoot.inst.showModalWait(); } var resouseType = this._nowLoadData.resouseType; if (arr != null) { if (resouseType == "2D" || resouseType == null) { Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false)); } else { Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false)); } } }; // 加载进度侦听器 ResourceManager.prototype.onLoading = function (progress) { if (this._nowLoadData) { progress = Math.ceil(Number(progress * 100)); if (this._nowLoadData.progress != null) { this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress); } } }; ResourceManager.prototype.onLoadComplete = function (args) { if (args === void 0) { args = null; } fairygui.GRoot.inst.closeModalWait(); if (this._nowLoadData && this._nowLoadData.complete) { if (this._nowLoadData.args) { this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args); } else { this._nowLoadData.complete.call(this._nowLoadData.completeTarget); } } this.running = false; this._nowLoadData = null; this._configs.shift(); this.loadStart(); }; ResourceManager.prototype.onError = function (err) { fairygui.GRoot.inst.closeModalWait(); Debuger_1.default.log("加载失败: " + err); }; /** * 加载3D单个资源 * @param url 资源url * @param type 资源类型 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceManager.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = [{ url: url, type: type }]; data.isShow = isShow; data.type = "single"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载3D资源组 * @param groupName 组名 * @param onResourceLoadTarget 作用域 * @param ResourceLoadComplete 完成事件 * @param onResourceProgress 加载进度事件 * @param isShow 是否显示加载状态 */ ResourceManager.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isShow === void 0) { isShow = true; } if (args === void 0) { args = null; } Debuger_1.default.log(groupName); var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = RecConfigs_1.default.getInstance().groupdict[groupName]; data.isShow = isShow; data.args = args; data.type = "group"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 ) * @param urls * @param onResourceLoadTarget * @param ResourceLoadComplete * @param onResourceProgress * @param isShow */ ResourceManager.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) { if (onResourceProgress === void 0) { onResourceProgress = null; } if (isshow === void 0) { isshow = false; } if (args === void 0) { args = null; } var data = {}; data.complete = ResourceLoadComplete; data.completeTarget = onResourceLoadTarget; data.progress = onResourceProgress; data.urls = urls; data.isShow = isshow; data.args = args; data.type = "loaderArr"; data.resouseType = "3D"; this._configs.push(data); this.loadStart(); }; /** * 加载特效 * @param groupName * @param onResourceLoadTarget * @param ResourceLoadComplete * @param args */ ResourceManager.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) { if (args === void 0) { args = null; } var urls = RecConfigs_1.default.getInstance().groupdict[groupName]; if (urls && urls.length > 0) { Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args])); } }; return ResourceManager; }(Laya.EventDispatcher)); exports.default = ResourceManager; },{"../configs/gameConfigs/RecConfigs":11,"../frameworks/Debuger":12,"../frameworks/events/EventUtils":16}],64:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GameLayerManager_1 = require("./GameLayerManager"); var PathConfig_1 = require("../configs/gameConfigs/PathConfig"); var CamerasScript_1 = require("../gamemodule/modelScripts/CamerasScript"); var Scene3dObject_1 = require("../gamemodule/scene3ds/Scene3dObject"); var MainRoleScript_1 = require("../gamemodule/modelScripts/MainRoleScript"); var EventUtils_1 = require("../frameworks/events/EventUtils"); var GameEvent_1 = require("../gamemodule/userinfo/events/GameEvent"); var Debuger_1 = require("../frameworks/Debuger"); var UserInfoProxy_1 = require("../gamemodule/userinfo/UserInfoProxy"); var MVCObjectPool_1 = require("../frameworks/mvc/MVCObjectPool"); var GameUtils_1 = require("../utils/GameUtils"); var NpcCFG_1 = require("../configs/dataConfigs/NpcCFG"); var NpcScript_1 = require("../gamemodule/modelScripts/NpcScript"); var ResourceManager_1 = require("./ResourceManager"); var GameCFG_1 = require("../configs/dataConfigs/GameCFG"); var RoleActions_1 = require("../gamemodule/scene3ds/RoleActions"); var UserInfoEvent_1 = require("../gamemodule/userinfo/events/UserInfoEvent"); var RolesPool_1 = require("../gamemodule/scene3ds/RolesPool"); var Scene3DManager = /** @class */ (function () { function Scene3DManager() { this._initPosY = 1; } Scene3DManager.getInstance = function () { if (!this._instance) { this._instance = new Scene3DManager(); } return this._instance; }; Scene3DManager.prototype.initGame = function () { var backgroundParent = GameLayerManager_1.GameLayerManager.getInstance().background.displayObject; var scenebg = fairygui.UIPackage.createObject("main", "sky"); backgroundParent.addChild(scenebg.displayObject); scenebg.setScale(2.5, 2.5); scenebg.y = -200; var scenebg1 = fairygui.UIPackage.createObject("main", "sky_down"); backgroundParent.addChild(scenebg1.displayObject); scenebg1.setScale(2.5, 2.5); scenebg1.y = scenebg.y + 740; //添加3D场景 Scene3dObject_1.default.scene3D = backgroundParent.addChild(new Laya.Scene3D()); Scene3dObject_1.default.scene3D.physicsSimulation.continuousCollisionDetection = true; //添加照相机 Scene3dObject_1.default.carma = (Scene3dObject_1.default.scene3D.addChild(new Laya.Camera(0, 0.1, 70))); this.cameraScript = Scene3dObject_1.default.carma.addComponent(CamerasScript_1.default); Scene3dObject_1.default.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY; //添加方向光 var directionLight = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("DirectionalLight")); //Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; Scene3dObject_1.default.scene3D.addChild(directionLight); // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); // var directionLight: Laya.DirectionLight = Scene3dObject.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight; // directionLight.color = new Laya.Vector3(1,1,1); // directionLight.intensity = 0.5; // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0)); Scene3dObject_1.default.startPlane = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("startPlane")); Scene3dObject_1.default.scene3D.addChild(Scene3dObject_1.default.startPlane); Scene3dObject_1.default.endPlane = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel("endPlane")); Scene3dObject_1.default.scene3D.addChild(Scene3dObject_1.default.endPlane); // Scene3dObject.bgsprite3d = Laya.Loader.getRes(PathConfig.get3DModel("distantview")); // Scene3dObject.scene3D.addChild(Scene3dObject.bgsprite3d); //雾化代码 Scene3dObject_1.default.scene3D.enableFog = true; //设置雾化的颜色 var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value); if (GameCFG_1.default.dict[8]) { var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value); Scene3dObject_1.default.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2])); } else { Scene3dObject_1.default.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6); } //设置雾化的起始位置,相对于相机的距离 var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value); Scene3dObject_1.default.scene3D.fogStart = Number(valueArr[0]); //设置雾化最浓处的距离。 Scene3dObject_1.default.scene3D.fogRange = Number(valueArr[1]); this.showScene(); this.initEvent(); }; Scene3DManager.prototype.initLizi = function () { }; Scene3DManager.prototype.showScene = function () { var pathArr = []; var urlArr = []; this.cameraScript.iscanfollow = true; var roleVO = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default).roleVO; var arr = roleVO.levelmapArr; var i = 0; for (i = 0; i < arr.length; i++) { if (urlArr.indexOf(PathConfig_1.PathConfig.get3DModel(arr[i])) == -1) { urlArr.push(PathConfig_1.PathConfig.get3DModel(arr[i])); } } var npcArr = roleVO.levelcfg.npc; for (i = 0; i < npcArr.length; i++) { if (urlArr.indexOf(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) { urlArr.push(PathConfig_1.PathConfig.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)); } } for (i = 0; i < urlArr.length; i++) { pathArr.push({ url: urlArr[i] }); } ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.load3Dcomplete, null, true); }; Scene3DManager.prototype.load3Dcomplete = function () { this.updateMap(); this.createMainRole(); this.createNpc(); }; Scene3DManager.prototype.initEvent = function () { EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.startGame, this, this.startGameHandler); EventUtils_1.EventUtils.addEventListener(GameEvent_1.default.jumpgame, this, this.jumphandler); EventUtils_1.EventUtils.addEventListener(UserInfoEvent_1.default.userinfoEvent_updateroleid, this, this.updateroleModelHandler); }; Scene3DManager.prototype.updateroleModelHandler = function () { var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default); var rolevo = userinfoProxy.roleVO; var pathArr = []; pathArr.push({ url: PathConfig_1.PathConfig.get3DRoleModel(rolevo.roleCfg.name) }); ResourceManager_1.default.getInstance().loader3DArr(pathArr, this, this.loadrolecomplete, null, true, PathConfig_1.PathConfig.get3DModel(rolevo.roleCfg.name)); }; Scene3DManager.prototype.loadrolecomplete = function (url) { var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default); var rolevo = userinfoProxy.roleVO; if (PathConfig_1.PathConfig.get3DModel(rolevo.roleCfg.name) == url) { this.createMainRole(); } }; Scene3DManager.prototype.jumphandler = function () { this.mainRoleScript.ceshitiaoyue(); }; Scene3DManager.prototype.startGameHandler = function () { this.mainRoleScript.startRun(); var npcdict = Scene3dObject_1.default.npcscriptDict; for (var s in npcdict) { var npcscript = npcdict[s]; npcscript.startRun(); } }; Scene3DManager.prototype.removeNowRole = function () { if (Scene3dObject_1.default.mainRole && this.mainRoleScript) { RolesPool_1.default.removeRole(Scene3dObject_1.default.mainRole, this.mainRoleScript.resouseName, this.mainRoleScript); this.mainRoleScript = null; Scene3dObject_1.default.mainRole = null; } }; //创建主角 Scene3DManager.prototype.createMainRole = function () { var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default); var rolevo = userinfoProxy.roleVO; var iscreate = false; if (!Scene3dObject_1.default.mainRole) { iscreate = true; } else if (Scene3dObject_1.default.mainRole.name != "role_" + rolevo.roleCfg.name) { iscreate = true; this.removeNowRole(); } if (iscreate) { // var sp:Laya.Sprite3D = Laya.Loader.getRes(PathConfig.get3DRoleModel(rolevo.roleCfg.name)) as Laya.Sprite3D; // Scene3dObject.mainRole = Laya.Sprite3D.instantiate(sp, Scene3dObject.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D; Scene3dObject_1.default.mainRole = RolesPool_1.default.addRoleByName(rolevo.roleCfg.name, MainRoleScript_1.default, Scene3dObject_1.default.scene3D); Scene3dObject_1.default.mainRole.name = "role_" + rolevo.roleCfg.name; this.mainRoleScript = Scene3dObject_1.default.mainRole.getComponent(MainRoleScript_1.default); // this.mainRoleScript.resouseName = rolevo.roleCfg.name; // if( ) // this.mainRoleScript = Scene3dObject.mainRole.addComponent( MainRAoleScript ); } var info = rolevo.levelcfg.roleinitpos; var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos); var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2])); var posVec = new Laya.Vector3; var selectVec; if (info.initbuild == "startPlane") { posVec.x = Scene3dObject_1.default.startPlane.transform.position.x + offsetPos.x; posVec.y = Scene3dObject_1.default.startPlane.transform.position.y + offsetPos.y; posVec.z = Scene3dObject_1.default.startPlane.transform.position.z + offsetPos.z; selectVec = Scene3dObject_1.default.startPlane.getChildByName("child_pos").transform.position; } else { var childpos = Scene3dObject_1.default.getPosVecbyScene(rolevo.levelmapArr[0], info.initbuild); posVec.x = childpos.x + offsetPos.x; posVec.y = childpos.y + offsetPos.y; posVec.z = childpos.z + offsetPos.z; selectVec = childpos; } Scene3dObject_1.default.mainRole.transform.position = posVec; this.cameraScript.initPos(Scene3dObject_1.default.mainRole.transform.position); this.mainRoleScript.setnowSelectVec(selectVec); this.mainRoleScript.nowState = RoleActions_1.default.stand; this.mainRoleScript.setAction(RoleActions_1.default.stand); }; Scene3DManager.prototype.removeAllNpc = function () { var npcdict = Scene3dObject_1.default.npcDict; var s; for (s in npcdict) { var sp = npcdict[s]; var npcscript = Scene3dObject_1.default.npcscriptDict[s]; var resousename = npcscript.resouseName; RolesPool_1.default.removeRole(sp, resousename, npcscript); delete Scene3dObject_1.default.npcscriptDict[s]; delete npcdict[s]; } }; //创建npc Scene3DManager.prototype.createNpc = function () { this.removeAllNpc(); var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default); var rolevo = userinfoProxy.roleVO; var arr = rolevo.levelcfg.npc; var childdict; var index = 0; Scene3dObject_1.default.npcnum = arr.length; for (var s in arr) { childdict = arr[s]; var selectVec = null; var npccfg = NpcCFG_1.default.dict[childdict.id]; var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DRoleModel(npccfg.name)); var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos); var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2])); var posVec = new Laya.Vector3; if (childdict.scene == "startPlane") { posVec.x = Scene3dObject_1.default.startPlane.transform.position.x + offsetPos.x; posVec.y = Scene3dObject_1.default.startPlane.transform.position.y + 1 + offsetPos.y; posVec.z = Scene3dObject_1.default.startPlane.transform.position.z + offsetPos.z; selectVec = Scene3dObject_1.default.startPlane.getChildByName("child_pos").transform.position; } else { var childpos = Scene3dObject_1.default.getPosVecbyScene(childdict.scene, childdict.initbuild); posVec.x = childpos.x + offsetPos.x; posVec.y = childpos.y + offsetPos.y; posVec.z = childpos.z + offsetPos.z; selectVec = childpos; } var npcsp = RolesPool_1.default.addRoleByName(npccfg.name, NpcScript_1.default, Scene3dObject_1.default.scene3D); npcsp.name = "npc_" + index; npcsp.transform.position = posVec; var npcscript = npcsp.getComponent(NpcScript_1.default); npcscript.setnowSelectVec(selectVec); npcscript.setnpcCFG(npccfg); Scene3dObject_1.default.npcDict[npcsp.name] = npcsp; Scene3dObject_1.default.npcscriptDict[npcsp.name] = npcscript; npcscript.setAction(RoleActions_1.default.stand); index++; } }; Scene3DManager.prototype.updateMap = function () { var userinfoProxy = MVCObjectPool_1.default.getInstance().getProxy(UserInfoProxy_1.default); var rolevo = userinfoProxy.roleVO; var nowlevelcfg = rolevo.levelcfg; var mapArr = rolevo.levelmapArr; var mapSprite3D; var mapname; var _lastmapSprite3D; for (var s in Scene3dObject_1.default.nowmapDict) { Scene3dObject_1.default.nowmapDict[s].active = false; } for (var i = 0; i < mapArr.length; i++) { mapname = mapArr[i]; if (Scene3dObject_1.default.nowmapDict[mapname]) { mapSprite3D = Scene3dObject_1.default.nowmapDict[mapname]; mapSprite3D.active = true; } else { var sp = Laya.Loader.getRes(PathConfig_1.PathConfig.get3DModel(mapname)); mapSprite3D = Laya.Sprite3D.instantiate(sp, Scene3dObject_1.default.scene3D, false, null); Scene3dObject_1.default.nowmapDict[mapname] = mapSprite3D; } if (i == 0) { var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos); mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2])); } else { var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone(); endPos.x = 0; endPos.y = 0; mapSprite3D.transform.position = endPos; } this.addPatternChildPos(mapSprite3D); _lastmapSprite3D = mapSprite3D; var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone(); endPos1.z += Number(GameCFG_1.default.dict[6].value); Scene3dObject_1.default.endPlane.transform.position = endPos1; Scene3dObject_1.default.gamewinPosZ = endPos1.z; Scene3dObject_1.default.gamewinPosZ -= 2; // Scene3dObject.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 ); } }; Scene3DManager.prototype.addPatternChildPos = function (mapSprite3D) { if (Scene3dObject_1.default.patternDict[mapSprite3D.name]) { delete Scene3dObject_1.default.patternDict[mapSprite3D.name]; } Debuger_1.default.log("绑定MapPatternPos"); var BlocksSprite = mapSprite3D.getChildByName("Blocks"); var chiddict = {}; var chidsp; var buildSp; var index = 0; while (BlocksSprite.getChildByName("build_all_" + index)) { buildSp = BlocksSprite.getChildByName("build_all_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_all_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_front_" + index)) { buildSp = BlocksSprite.getChildByName("build_front_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_front_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_left_" + index)) { buildSp = BlocksSprite.getChildByName("build_left_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_left_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_right_" + index)) { buildSp = BlocksSprite.getChildByName("build_right_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_right_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_frontleft_" + index)) { buildSp = BlocksSprite.getChildByName("build_frontleft_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_frontleft_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_frontright_" + index)) { buildSp = BlocksSprite.getChildByName("build_frontright_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_frontright_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; while (BlocksSprite.getChildByName("build_leftright_" + index)) { buildSp = BlocksSprite.getChildByName("build_leftright_" + index); chidsp = buildSp.getChildByName("child_pos"); chiddict["build_leftright_" + index] = chidsp.transform.position; if (Scene3dObject_1.default.diePosY > buildSp.transform.position.y) { Scene3dObject_1.default.diePosY = buildSp.transform.position.y; } index++; } index = 0; var Props = mapSprite3D.getChildByName("Props"); while (Props.getChildByName("Scaffolding_" + index)) { chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos"); chiddict["Scaffolding_" + index] = chidsp.transform.position; index++; } index = 0; while (Props.getChildByName("grilling_" + index)) { chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos"); chiddict["grilling_" + index] = chidsp.transform.position; index++; } Scene3dObject_1.default.patternDict[mapSprite3D.name] = chiddict; }; return Scene3DManager; }()); exports.default = Scene3DManager; },{"../configs/dataConfigs/GameCFG":6,"../configs/dataConfigs/NpcCFG":8,"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12,"../frameworks/events/EventUtils":16,"../frameworks/mvc/MVCObjectPool":22,"../gamemodule/modelScripts/CamerasScript":42,"../gamemodule/modelScripts/MainRoleScript":43,"../gamemodule/modelScripts/NpcScript":44,"../gamemodule/scene3ds/RoleActions":46,"../gamemodule/scene3ds/RolesPool":47,"../gamemodule/scene3ds/Scene3dObject":48,"../gamemodule/userinfo/UserInfoProxy":53,"../gamemodule/userinfo/events/GameEvent":54,"../gamemodule/userinfo/events/UserInfoEvent":56,"../utils/GameUtils":87,"./GameLayerManager":61,"./ResourceManager":63}],65:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PathConfig_1 = require("../configs/gameConfigs/PathConfig"); var Debuger_1 = require("../frameworks/Debuger"); /* * name; */ var SoundssManager = /** @class */ (function (_super) { __extends(SoundssManager, _super); function SoundssManager() { var _this = _super.call(this) || this; _this._isbgOpen = true; _this._gamesoundOpen = true; _this._isAllOpen = true; _this._nowBgName = ""; _this._isPlaybging = false; /** * 声音开关引用索引 */ _this._soundIndex = 0; return _this; } SoundssManager.getInstance = function () { if (!this._instance) { this._instance = new SoundssManager(); } return this._instance; }; SoundssManager.prototype.init = function () { Laya.SoundManager.autoReleaseSound = false; Laya.SoundManager.autoStopMusic = true; }; Object.defineProperty(SoundssManager.prototype, "gamesoundOpen", { /** * 音效是否开启 */ get: function () { return this._gamesoundOpen; }, set: function (value) { this._gamesoundOpen = value; Laya.SoundManager.soundMuted = !value; if (value == true) { fairygui.UIConfig.buttonSoundVolumeScale = 1; } else { fairygui.UIConfig.buttonSoundVolumeScale = 0; } }, enumerable: true, configurable: true }); Object.defineProperty(SoundssManager.prototype, "isbgOpen", { /** * 背景音乐是否开启 */ get: function () { return this._isbgOpen; }, set: function (value) { this._isbgOpen = value; Laya.SoundManager.musicMuted = !value; }, enumerable: true, configurable: true }); Object.defineProperty(SoundssManager.prototype, "isAllOpen", { /** * 所有音乐是否开启 */ get: function () { return this._isAllOpen; }, set: function (value) { if (value) { this._soundIndex--; if (this._soundIndex < 0) { this._soundIndex = 0; } if (!this._isPlaybging && this._soundIndex == 0) { this._isAllOpen = true; this.setGameVolume(1); this.playbgSound(this._nowBgName); fairygui.UIConfig.buttonSoundVolumeScale = 1; } else { this._isAllOpen = false; } } else { this._isAllOpen = false; if (this._soundIndex < 0) { this._soundIndex = 0; } this._soundIndex++; if (this._isPlaybging) { this.stopbgSound(); } this.setGameVolume(0); fairygui.UIConfig.buttonSoundVolumeScale = 0; } }, enumerable: true, configurable: true }); Object.defineProperty(SoundssManager.prototype, "bgSoundVolume", { get: function () { return Laya.SoundManager.musicVolume; }, /** * 设置背景音乐音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ set: function (value) { Laya.SoundManager.setMusicVolume(value); }, enumerable: true, configurable: true }); Object.defineProperty(SoundssManager.prototype, "soundVolume", { get: function () { return Laya.SoundManager.soundVolume; }, /** * 设置背景音乐音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ set: function (value) { Laya.SoundManager.setSoundVolume(value); }, enumerable: true, configurable: true }); /** * 设置所有声音音量 * @param value 音量范围从 0(静音)至 1(最大音量)。 */ SoundssManager.prototype.setGameVolume = function (value) { this.bgSoundVolume = value; this.soundVolume = value; }; /** * 播放背景音乐 * @param soundName 声音名 */ SoundssManager.prototype.playbgSound = function (soundName) { this._nowBgName = soundName; if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) { this._isPlaybging = true; Debuger_1.default.log("playbgSound", PathConfig_1.PathConfig.getsound(this._nowBgName)); Laya.SoundManager.playMusic(PathConfig_1.PathConfig.getsound(this._nowBgName)); this.bgSoundVolume = 0.4; } }; /** * 停止背景音乐 */ SoundssManager.prototype.stopbgSound = function () { this._isPlaybging = false; Laya.SoundManager.stopMusic(); }; /** * 播放音效 * @param soundName 音效名 * @param loop 播放次数 */ SoundssManager.prototype.playGameSound = function (soundName, loop) { if (loop === void 0) { loop = 1; } if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) { Laya.SoundManager.playSound(PathConfig_1.PathConfig.getsound(soundName), loop); } }; /** * 停止播放音效 */ SoundssManager.prototype.stopGameSound = function () { Laya.SoundManager.stopAllSound(); }; /** * 停止所有声音 */ SoundssManager.prototype.stopAll = function () { this.stopGameSound(); this.stopbgSound(); }; return SoundssManager; }(Laya.EventDispatcher)); exports.default = SoundssManager; },{"../configs/gameConfigs/PathConfig":10,"../frameworks/Debuger":12}],66:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var LayerNotify_1 = require("../frameworks/notification/LayerNotify"); var GameLayerManager_1 = require("./GameLayerManager"); /** * * @author * */ var UiManager = /** @class */ (function (_super) { __extends(UiManager, _super); function UiManager() { return _super.call(this) || this; } UiManager.getInstance = function () { if (!this.instance) { this.instance = new UiManager(); } return this.instance; }; UiManager.prototype.init = function () { this._views = {}; this.initEvent(); }; UiManager.prototype.initEvent = function () { }; /** * view 视图对象类 * data 绑定数据 ( data 如果不为空,代表构造函数传参 ) * layer 层级 */ UiManager.prototype.add = function (view, data, layer) { if (data === void 0) { data = null; } if (layer === void 0) { layer = LayerNotify_1.LayerNotify.LAYER_UILAYER; } if (view.key == null) { throw new Error("view have no key"); } var type = view.key; if (this._views[type]) { var itemview = this._views[type]; return itemview; } var d; if (data != null) { d = new view(data); } else { d = new view(); } d.viewKey = view; d.gameLayer = layer; GameLayerManager_1.GameLayerManager.getInstance().addtoLayer(d, layer); this._views[type] = d; return d; }; /** * 关闭界面 * @param view 界面 * @param isbgclose 是否是点击背景关闭的状态 * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 ) */ UiManager.prototype.close = function (view, isbgclose, isplayAnmo) { if (isbgclose === void 0) { isbgclose = false; } if (isplayAnmo === void 0) { isplayAnmo = true; } var type = view.key; var item = this._views[type]; if (!item) { return; } GameLayerManager_1.GameLayerManager.getInstance().removeformLayer(item.gameLayer); if (isplayAnmo) { item.onCloseView(); } else { item.destory(); } delete this._views[type]; }; UiManager.prototype.onresize = function (w, h) { if (this._views != null) { var itemview; for (var item in this._views) { itemview = this._views[item]; itemview.setSize(w, h); } } }; UiManager.prototype.getView = function (view) { var type = view.key; return this._views[type]; }; return UiManager; }(Laya.EventDispatcher)); exports.UiManager = UiManager; },{"../frameworks/notification/LayerNotify":29,"./GameLayerManager":61}],67:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var WXGamePlatform_1 = require("./wxminigame/WXGamePlatform"); var PlatfromType_1 = require("./PlatfromType"); var PlatformEvent_1 = require("./events/PlatformEvent"); var Global_1 = require("../Global"); var Debuger_1 = require("../frameworks/Debuger"); var EventUtils_1 = require("../frameworks/events/EventUtils"); var TimesTamper_1 = require("../frameworks/TimesTamper"); var DayManager_1 = require("../managers/DayManager"); var SoundssManager_1 = require("../managers/SoundssManager"); /* * name; */ var PlatformTool = /** @class */ (function () { function PlatformTool() { this._isenable = false; } PlatformTool.getInstance = function () { if (!this._instance) { this._instance = new PlatformTool(); } return this._instance; }; /** * 初始化平台 */ PlatformTool.prototype.initPlatfrom = function () { if (Laya.Browser.window.tt) { Global_1.Global.nowplatfrom = PlatfromType_1.default.tt; } else if (Laya.Browser.window.wx) //微信小游戏 { Global_1.Global.nowplatfrom = PlatfromType_1.default.wx; } else { Global_1.Global.nowplatfrom = PlatfromType_1.default.pc; } }; PlatformTool.prototype.init = function () { this.initPlatfrom(); Debuger_1.default.log(Global_1.Global.nowplatfrom + "平台初始化"); // switch( Global.nowplatfrom ) // { // case PlatfromType.wx: // WXGamePlatform.getInstance().init(); // break; // case PlatfromType.qq: // break; // default: // break; // } // this.onShow( this,this.showcallback ); // this.onHide(this,this.hidecallback); }; PlatformTool.prototype.initData = function () { DayManager_1.default.getInstance().init(); switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().initData(); break; default: break; } }; /** * 合违规判断 true:合规,false:违规 */ PlatformTool.checkEnable = function () { if (PlatformTool.islegal == 1) { return true; } return false; }; PlatformTool.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (progressCallback === void 0) { progressCallback = null; } if (failcallback === void 0) { failcallback = null; } fairygui.GRoot.inst.showModalWait(); this._logincallobj = callobj; this._loginsucceedcallback = succeedcallback; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback); break; default: this.loginSucceed(null); break; } }; PlatformTool.prototype.loginprogressCallback = function (value) { }; PlatformTool.prototype.loginSucceed = function (data) { fairygui.GRoot.inst.closeModalWait(); // Debuger.log( "loginSucceed",data ); // switch( Global.nowplatfrom ) // { // case PlatfromType.wx: // var nowtime:number = data.NowTime; // TimesTamper.getInstance().updateServiceTime(nowtime); // PlatformTool.islegal = Number(data.Version); // var Member:any = data.Member; // var AppInfo:any = data.AppInfo; // var Client2:any = AppInfo.Client2; // Global.AppKeyID = Member.AppKeyID; // Global.MemberID = Member.MemberID; // WXGamePlatform.VideoTime = Number(Client2.VideoTime); // WXGamePlatform.VideoNum = Number(Client2.VideoNum); // WXGamePlatform.ShareTime = Number(Client2.ShareTime); // WXGamePlatform.jiliweitime = Number( Client2.ShareTime ); // WXGamePlatform.SharetoVideo = Number( Client2.SharetoVideo ); // WXGamePlatform.VideotoShare = Number( Client2.VideotoShare ); // WXGamePlatform.getInstance().initShareDian( Client2.Share ); // EventUtils.dispatchEvent( CPAEvent.CPAEvent_initCPAData,data ); // break; // default: // TimesTamper.getInstance().updateServiceTime(Laya.Browser.now()/1000); // var datas:any = JSON.parse('{"ACTION":9891001,"ACTIONCOM":0,"JSDATA":{"AppInfo":{"Client":[{"ID":"1","IsShow":true,"Param1":"30","Param2":""},{"ID":"2","IsShow":true,"Param1":"30","Param2":""},{"ID":"3","IsShow":true,"Param1":"30","Param2":""},{"ID":"4","IsShow":true,"Param1":"30","Param2":""},{"ID":"5","IsShow":true,"Param1":"30","Param2":""},{"ID":"6","IsShow":true,"Param1":"30","Param2":""},{"ID":"7","IsShow":true,"Param1":"30","Param2":""},{"ID":"8","IsShow":true,"Param1":"30","Param2":""}],"Client2":{"VideoTime":10,"VideoNum":"10","ShareTime":4,"Share":[{"key":"fuhuo","img":"bingduweiji/fuhuofx.png","tile":"来帮助我消灭病毒吧!"}],"jiliweitime":"600","VideotoShare":"1","SharetoVideo":"1"},"ReNum":100,"ReTime":259200},"Member":{"AppKeyID":3,"MemberID":100001,"UserName":""},"NowTime":1572251558,"Version":""}}'); // EventUtils.dispatchEvent( CPAEvent.CPAEvent_initCPAData,datas.JSDATA ); // break; // } // this.initData(); if (this._logincallobj && this._loginsucceedcallback) { this._loginsucceedcallback.call(this._logincallobj); } else { EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_loginSucceed); } }; PlatformTool.prototype.loginfailcallback = function () { }; PlatformTool.prototype.onShow = function (callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().onShow(callobj, succeedcallback, failCallback); break; case PlatfromType_1.default.qq: break; } }; PlatformTool.prototype.showcallback = function () { Laya.timer.clear(this, this.againplaybgSound); Laya.timer.once(500, this, this.againplaybgSound); EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onshow); EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus); var fromscene = PlatformTool.fromscene(); if (fromscene == 1089 || fromscene == 1131) { EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_fromscorfk); } }; PlatformTool.prototype.againplaybgSound = function () { EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd); }; PlatformTool.prototype.onHide = function (callobj, succeedcallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().onHide(callobj, succeedcallback); break; case PlatfromType_1.default.qq: break; } }; PlatformTool.prototype.hidecallback = function () { TimesTamper_1.TimesTamper.getInstance().sendonlineTongji(); SoundssManager_1.default.getInstance().stopAll(); EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onhide); EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_losefocus); }; Object.defineProperty(PlatformTool.prototype, "isshow", { /** * 当前游戏是否在显示中 */ get: function () { var bo = true; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: if (WXGamePlatform_1.default.isShowing) { bo = true; } bo = false; break; } return bo; }, enumerable: true, configurable: true }); /** * 分包加载 */ PlatformTool.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) { if (failcallback === void 0) { failcallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().loadSubpackage(typename, callobj, callback, callprogress, failcallback); break; default: if (callobj && callback) { callback.call(callobj); } break; } }; /** * 获取是否已经授权 * @param callobj * @param callback */ PlatformTool.prototype.isaccredit = function (callobj, accreditCallback) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().getaccredit(callobj, accreditCallback); break; case PlatfromType_1.default.qq: WXGamePlatform_1.default.getInstance().getaccredit(callobj, accreditCallback); break; default: if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } break; } }; /** * 拿角色信息授权 */ PlatformTool.prototype.createaccredit = function (callobj, callback, failcallback) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().createUserInfoButton(callobj, callback, failcallback); break; } }; PlatformTool.prototype.closeuserinfoButton = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().closeuserinfobUtton(); break; } }; /** * 退出游戏 */ PlatformTool.prototype.exitGame = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().exitGame(); break; } }; /** * 打开客服对话框 */ PlatformTool.prototype.openCustomerService = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().openCustomerService(); break; } }; /** * 短震动 */ PlatformTool.prototype.vibrateShort = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().vibrateShort(); break; default: break; } }; PlatformTool.isCanVideo = function () { var bo = false; if (PlatformTool.checkEnable()) { bo = true; } else { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: bo = WXGamePlatform_1.default.getInstance().isCanVideo(); break; default: bo = true; break; } } return bo; }; PlatformTool.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedCallback === void 0) { succeedCallback = null; } if (failCallback === void 0) { failCallback = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().startShareApp(key, callobj, succeedCallback, failCallback); break; default: if (callobj && succeedCallback) { succeedCallback.call(callobj); } break; } }; PlatformTool.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } if (istongjiNum === void 0) { istongjiNum = true; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: // WordTipsUtils.getInstance().showWordTips("暂未开放"); WXGamePlatform_1.default.getInstance().playVideo(key, callobj, succeedcallback, failCallback, istongjiNum); break; default: if (callobj && succeedcallback) { succeedcallback.call(callobj); } break; } }; PlatformTool.prototype.createBanner = function (bannertype, style) { if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().createBanner(bannertype, style); break; default: break; } }; PlatformTool.prototype.hideBanner = function (bannertype) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().hideBanner(bannertype); break; default: break; } }; /** * 数据上传(用于排行榜数据显示) * @param param1 上报数据1 * @param param2 上报数据2 */ PlatformTool.prototype.storeToCloud = function (param1, param2) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().storeToCloud(param1, param2); break; default: break; } }; /** * 打开好友排行榜 */ PlatformTool.prototype.openFriendRank = function (type, viewType, rect, parent, data) { if (parent === void 0) { parent = null; } if (data === void 0) { data = null; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().openFriendRank(type, viewType, rect, parent, data); break; default: break; } }; /** * 排行榜打开状态时候,切换显示类型 * @param type */ PlatformTool.prototype.changeFriendRank = function (type) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().changeFriendRank(type); break; default: break; } }; /** * 排行榜上一页 */ PlatformTool.prototype.prePageRank = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().prePageRank(); break; default: break; } }; /** * 排行榜下一页 */ PlatformTool.prototype.nextPageRank = function () { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().nextPageRank(); break; default: break; } }; /** * 关闭好友排行榜 */ PlatformTool.prototype.closeFriendRank = function (viewType) { switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().closeFriendRank(viewType); break; default: break; } }; PlatformTool.prototype.lockVideoLeftTime = function () { var time = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: time = WXGamePlatform_1.default.getInstance().lockVideoLeftTime(); break; default: break; } return time; }; PlatformTool.dayVideoNums = function () { var time = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: time = WXGamePlatform_1.default.dayVideoNum; break; default: break; } return time; }; /** * 1089:添加到我的小程序,1131:添加到浮窗 */ PlatformTool.fromscene = function () { var scene = 0; switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: scene = WXGamePlatform_1.default.fromscene; break; default: break; } return scene; }; PlatformTool.createGameClubButton = function (style, icon) { if (icon === void 0) { icon = "green"; } switch (Global_1.Global.nowplatfrom) { case PlatfromType_1.default.wx: WXGamePlatform_1.default.getInstance().createGameClubButton(style, icon); break; default: break; } }; /** * 是否合规 */ PlatformTool.islegal = 0; return PlatformTool; }()); exports.default = PlatformTool; },{"../Global":2,"../frameworks/Debuger":12,"../frameworks/TimesTamper":14,"../frameworks/events/EventUtils":16,"../managers/DayManager":60,"../managers/SoundssManager":65,"./PlatfromType":68,"./events/PlatformEvent":69,"./wxminigame/WXGamePlatform":72}],68:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlatfromType = /** @class */ (function () { function PlatfromType() { } /** * 电脑 */ PlatfromType.pc = "pc"; /** * 微信小游戏 */ PlatfromType.wx = "wx"; /** * qq小游戏 */ PlatfromType.qq = "qq"; /** * 抖音 */ PlatfromType.tt = "tt"; return PlatfromType; }()); exports.default = PlatfromType; },{}],69:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var PlatformEvent = /** @class */ (function () { function PlatformEvent() { } /** * 登录 */ PlatformEvent.message_9891001 = "9891001"; /** * 广告点击 */ PlatformEvent.message_9891102 = "9891102"; /** * 点击确定跳转到外部游戏 */ PlatformEvent.message_9891103 = "9891103"; /** * 用户打点 */ PlatformEvent.message_9891002 = "9891002"; /** * 获取后台数据 */ PlatformEvent.message_9891101 = "9891101"; PlatformEvent.PlatformEvent_loginSucceed = "PlatformEvent_loginSucceed"; /** * 游戏从后台恢复显示事件 */ PlatformEvent.PlatformEvent_onshow = "PlatformEvent_onshow"; /** * 游戏进入后台事件 */ PlatformEvent.PlatformEvent_onhide = "PlatformEvent_onhide"; PlatformEvent.PlatformEvent_onAudioInterruptionEnd = "PlatformEvent_onAudioInterruptionEnd"; PlatformEvent.PlatformEvent_losefocus = "PlatformEvent_losefocus"; PlatformEvent.PlatformEvent_getfocus = "PlatformEvent_getfocus"; PlatformEvent.PlatformEvent_updateVideoNums = "PlatformEvent_updateVideoNums"; /** * 从收藏或者浮窗进入游戏 */ PlatformEvent.PlatformEvent_fromscorfk = "PlatformEvent_fromscorfk"; return PlatformEvent; }()); exports.default = PlatformEvent; },{}],70:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var RankType; (function (RankType) { /** * 打开好友排行榜 */ RankType.openfriendrank = "openfriendrank"; /** * 关闭好友排行榜 */ RankType.closefriendrank = "closefriendrank"; /** * 下一页 */ RankType.nextpage = "nextpage"; /** * 上一页 */ RankType.prepage = "prepage"; /** * 超越好友(显示后一名) */ RankType.chaoyue = "chaoyue"; /** * 超越好友(显示前后一名) */ RankType.chaoyue1 = "chaoyue1"; })(RankType = exports.RankType || (exports.RankType = {})); },{}],71:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Event = Laya.Event; var HttpRequest = Laya.HttpRequest; var PlayerAccount_1 = require("./WXSDK/PlayerAccount"); var ShareUtil_1 = require("./WXSDK/ShareUtil"); var Sdk_1 = require("./WXSDK/Sdk"); var TimesTamper_1 = require("../../frameworks/TimesTamper"); var Debuger_1 = require("../../frameworks/Debuger"); var Global_1 = require("../../Global"); // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/"; var PROTOCOL_URL = "https://parkourraceapi.xwxgame.com/"; var PROTOCOLS = /** @class */ (function () { function PROTOCOLS() { } PROTOCOLS.Login = "user/login"; // not token PROTOCOLS.game = "game/start"; PROTOCOLS.end = "game/play"; PROTOCOLS.Sign = "sign/sign"; // public static EquipHero = "theme/equipHero"; // public static BuyHero = "theme/buyHero"; // public static EquipHat = "theme/equipHat"; // public static BuyHat = "theme/buyHat"; // public static BuyDance = "theme/buyDance"; // public static EquipDance = "theme/equipDance"; PROTOCOLS.Buy = "theme/buy"; PROTOCOLS.Equip = "theme/equip"; PROTOCOLS.share = "fission/share"; PROTOCOLS.vd = "fission/vd"; PROTOCOLS.revival = "game/revival"; PROTOCOLS.fission = "theme/fission"; PROTOCOLS.themefission = "theme/fission"; PROTOCOLS.treasure = "treasure/click"; PROTOCOLS.Config = "config/table"; PROTOCOLS.Lottery = "lottery/lottery"; PROTOCOLS.GetAchieve = "achievement/getRewards"; PROTOCOLS.usersync = "user/sync"; return PROTOCOLS; }()); exports.PROTOCOLS = PROTOCOLS; ; var NetworkManager = /** @class */ (function () { function NetworkManager() { NetworkManager.instance = this; } Object.defineProperty(NetworkManager, "Instance", { get: function () { if (NetworkManager.instance) { return NetworkManager.instance; } else { return new NetworkManager(); } }, enumerable: true, configurable: true }); //#region 登入 /******************************* login *****************************/ NetworkManager.prototype.login = function (progresscb, completecb, errorcb) { var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount; var ver = Global_1.Global.gameVersion; var args = "code=" + userInfor.Code + "&nickname=" + userInfor.NickName + "&avatar=" + userInfor.Avatar + "&gender=" + userInfor.Gender + "&country=" + userInfor.Country + "&province=" + userInfor.Province + "&city=" + userInfor.City + "& device=" + userInfor.Device + "$&share_id=" + userInfor.ShareId + "&scene=" + userInfor.Scene + "&v=" + ver; var httpRequest = new HttpRequest(); httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]); httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]); httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]); httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text"); }; NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) { if (progresscb) { console.log("HttpRequestProgress:..."); progresscb.run(); } }; NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) { //console.log("登录数据:", httpRequest.data); var data = JSON.parse(httpRequest.data); if (data["code"] != "0") { console.log("登录异常错误!错误信息:", httpRequest.data); Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat"); //completecb.runWith(data); return; } PlayerAccount_1.PlayerAccount.ServerTime = data["t"]; TimesTamper_1.TimesTamper.getInstance().updateServiceTime(Number(data["t"])); Sdk_1.WxApi.recordAldEvent("登录正式成功"); PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb); ShareUtil_1.ShareUtil.ShareMessage(); }; NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) { if (errorcb != null) { errorcb.runWith(httpRequest); } Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat"); Sdk_1.WxApi.ShowLoading("连接网络失败..."); Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); }); console.log("Error! Http request error..." + httpRequest.data); }; //#endregion /* * 通用Http Post协议发送 * protocol 对应“PROTOCOLS”字典中协议名称 * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合 * param 参数列表,key是字段名,val是值,值需要先转string * completecb 协议发送成功回调函数 * errorcb 协议发送失败回调函数 * return 返回值为void */ NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) { if (hasToken === void 0) { hasToken = true; } var args = ""; var url = PROTOCOL_URL + protocol; // chechk add token var account = PlayerAccount_1.PlayerAccount.CurrentAccount; var accountdata = account.CurAccountData; if (hasToken == true) { args = "token=" + accountdata.m_token + "&"; } Sdk_1.WxApi.ShowLoading("连接网络中..."); if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd || protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) { var str = "abcdefghijkimnopqrstuvwxyz0123456789"; var code = "{"; var mask = ""; for (var i = 0; i < 4; i++) { mask += str[Math.floor(Math.random() * 100) % str.length]; } for (var i = 0; i < param.length; i++) { for (var key in param[i]) { code += "\"" + key + "\":\"" + param[i][key] + "\""; } if (i < param.length - 1) { code += ","; } else { code += "}"; } } args += "_r=" + mask + this.base64Encode(code); } else { if (param != null) { for (var i = 0; i < param.length; i++) { for (var key in param[i]) { var val = param[i][key]; args += key + "=" + val; if (i < param.length - 1) { args += "&"; } } } } } var httpRequest = new HttpRequest(); httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]); httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]); httpRequest.send(url, args, "post", "text"); }; NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) { Sdk_1.WxApi.HideLoading(); var data = JSON.parse(httpRequest.data); if (data["code"] == 0) { PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null); //EventManager.Trigger(EventType.RefreshMonery); if (succeedcb != null) { //console.log("上传成功回调方法 " + httpRequest.data); succeedcb.runWith(data); Debuger_1.default.log("receive:", data); } } else { if (failurecb != null) { failurecb.runWith(data); } console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]); } }; NetworkManager.prototype.base64Encode = function (str) { var c1, c2, c3; var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var i = 0, len = str.length, string = ''; while (i < len) { c1 = str.charCodeAt(i++) & 0xff; if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt((c1 & 0x3) << 4); string += "=="; break; } c2 = str.charCodeAt(i++); if (i == len) { string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt((c2 & 0xF) << 2); string += "="; break; } c3 = str.charCodeAt(i++); string += base64EncodeChars.charAt(c1 >> 2); string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)); string += base64EncodeChars.charAt(c3 & 0x3F); } return string; }; return NetworkManager; }()); exports.NetworkManager = NetworkManager; },{"../../Global":2,"../../frameworks/Debuger":12,"../../frameworks/TimesTamper":14,"./WXSDK/PlayerAccount":74,"./WXSDK/Sdk":75,"./WXSDK/ShareUtil":76}],72:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TongjiHttps_1 = require("../../frameworks/net/TongjiHttps"); var Debuger_1 = require("../../frameworks/Debuger"); var GameUtils_1 = require("../../utils/GameUtils"); var GameHttps_1 = require("../../frameworks/net/GameHttps"); var PlatformEvent_1 = require("../events/PlatformEvent"); var Global_1 = require("../../Global"); var DayManager_1 = require("../../managers/DayManager"); var CacheManager_1 = require("../../managers/CacheManager"); var UserCacheType_1 = require("../../gamemodule/userinfo/events/UserCacheType"); var WordTipsUtils_1 = require("../../gamemodule/loading/view/WordTipsUtils"); var EventUtils_1 = require("../../frameworks/events/EventUtils"); var SoundssManager_1 = require("../../managers/SoundssManager"); var RankType_1 = require("../types/RankType"); /* * name; */ var WXGamePlatform = /** @class */ (function () { function WXGamePlatform() { this.isShareing = false; this.bannerRunTime = 0; this._bannerTypeList = []; this._screenwidth = 0; this.bannerheight = 0; this.bannerwidth = 0; this.isonResize = false; /** * 排行榜打开类型存储 */ this._openrankDict = {}; } WXGamePlatform.getInstance = function () { if (!this._instance) { this._instance = new WXGamePlatform(); } return this._instance; }; WXGamePlatform.prototype.init = function () { this.showShareMenu({ withShareTicket: true }); this.onAudioInterruptionBegin(); this.onAudioInterruptionEnd(); }; WXGamePlatform.prototype.initShareDian = function (data) { if (data && data.length > 0) { var itemd; for (var s in data) { itemd = data[s]; WXGamePlatform.ShareDict[itemd.key] = itemd; } var firstd = data[0]; this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img); } }; WXGamePlatform.prototype.initData = function () { if (DayManager_1.default.isNewDay) { WXGamePlatform.dayShareNum = 0; WXGamePlatform.dayVideoNum = 0; this.updateDayShareInfo(); this.updateDayVideoInfo(); } else { WXGamePlatform.dayShareNum = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.nowdayShare); WXGamePlatform.dayVideoNum = CacheManager_1.default.getInstance().getnum(UserCacheType_1.default.nowdayVideo); } Debuger_1.default.log("initDayShareNum", WXGamePlatform.dayShareNum, WXGamePlatform.dayVideoNum); }; /** * 存储当天分享的信息 */ WXGamePlatform.prototype.updateDayShareInfo = function () { CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.nowdayShare, WXGamePlatform.dayShareNum.toString()); Debuger_1.default.log("updateDayShareInfo", WXGamePlatform.dayShareNum); }; WXGamePlatform.prototype.updateDayVideoInfo = function () { CacheManager_1.default.getInstance().addstr(UserCacheType_1.default.nowdayVideo, WXGamePlatform.dayVideoNum.toString()); Debuger_1.default.log("updateDayVideoInfo", WXGamePlatform.dayVideoNum); }; WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) { if (progressCallback === void 0) { progressCallback = null; } if (failcallback === void 0) { failcallback = null; } WXGamePlatform.loginCallobj = callobj; WXGamePlatform.loginsucceedcallback = succeedcallback; WXGamePlatform.loginprogressCallback = progressCallback; var wx = Laya.Browser.window.wx; if (wx) { var login_info = WXGamePlatform.getInstance().getLaunchOptionsSync(); if (login_info) { Debuger_1.default.log("getLaunchOptionsSync:", login_info); var query = login_info.query; if (query && query.ChanID) { WXGamePlatform.QuDaoID = query.ChanID; Debuger_1.default.log('来源⼴告的广告id是' + WXGamePlatform.QuDaoID); } var referrerInfo = login_info.referrerInfo; if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) { WXGamePlatform.QuDaoID = referrerInfo.appId; Debuger_1.default.log('来源微信小游戏的appid是' + WXGamePlatform.QuDaoID); } if (login_info.scene) { WXGamePlatform.fromscene = Number(login_info.scene); } } var systemres = wx.getSystemInfoSync(); var version = systemres.SDKVersion; if (wx.getUpdateManager) { var updateManager = wx.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { // 请求完新版本信息的回调 Debuger_1.default.log("是否有新版本需要更新:" + res.hasUpdate); if (res.hasUpdate == true) { updateManager.onUpdateReady(function () { Laya.Browser.window.wx.showModal({ title: '更新提示', content: '新版本已经准备好,是否重启应用?', success: function (res) { if (res.confirm) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 updateManager.applyUpdate(); } else { WXGamePlatform.getInstance().exitGame(); } } }); }); updateManager.onUpdateFailed(function () { // 新版本下载失败 WXGamePlatform.getInstance().exitGame(); }); } else { // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback ) // { // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 ); // } var wxplatform = WXGamePlatform.getInstance(); wxplatform.login(callobj, succeedcallback, failcallback); } }); } else { // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback ) // { // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 ); // } var wxplatform = WXGamePlatform.getInstance(); wxplatform.login(callobj, succeedcallback, failcallback); } } }; WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) { this.userinfocallobj = callobj; this.userinfosuccallback = callback; this.userinfofailcallback = failcallback; var wx = Laya.Browser.window.wx; var res = wx.getSystemInfoSync(); if (res) { Debuger_1.default.log("getSystemInfoSync", res); var posx = (res.windowWidth - 151) / 2; var posy = res.windowHeight - 172 - 40; WXGamePlatform.getInstance().userinfobutton = wx.createUserInfoButton({ type: 'image', image: 'wxlocal/login.png', style: { left: posx, top: posy, width: 151, height: 72 } }); WXGamePlatform.getInstance().userinfobutton.onTap(WXGamePlatform.getInstance().userinfoButtonClick); } }; /** * 判断是否已经授权 */ WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) { if (WXGamePlatform.accreditstate == 0) { var wx = Laya.Browser.window.wx; if (wx) { wx.getSetting({ success: function (res) { var itemd = res.authSetting; if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过 { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, false); } } } }); } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } } else { if (accreditCallback && callobj) { accreditCallback.call(callobj, true); } } }; WXGamePlatform.prototype.userinfoButtonClick = function (res) { var wxplatform = WXGamePlatform.getInstance(); Debuger_1.default.log("userinfoButtonClick", res); if (res) { var errMsg = res.errMsg; if (errMsg == "getUserInfo:ok") { Debuger_1.default.log("同意授权"); WXGamePlatform.accreditstate = 1; wxplatform.closeuserinfobUtton(); wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback); } else { Debuger_1.default.log("点击拒绝授权"); if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) { wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj); } } } }; WXGamePlatform.prototype.closeuserinfobUtton = function () { var wxplatform = WXGamePlatform.getInstance(); if (wxplatform.userinfobutton) { wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick); wxplatform.userinfobutton.destroy(); wxplatform.userinfobutton = null; } }; WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) { fairygui.GRoot.inst.showModalWait(); var wxplatform = WXGamePlatform.getInstance(); var wx = Laya.Browser.window.wx; if (wx) { wx.getUserInfo({ success: function (res) { var userInfo = res.userInfo; WXGamePlatform.nickName = userInfo.nickName; if (islogin) { wxplatform.login(callobj, callback, failcallback); } else { if (callobj && callback) { callback.call(callobj, WXGamePlatform.nickName); } } } }); } }; /** * 登录 * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.login = function (callobj, callback, failcallback) { var wxplatform = WXGamePlatform.getInstance(); if (Laya.Browser.window.wx) { Laya.Browser.window.wx.login({ success: function (res) { Debuger_1.default.log("wx.login:", res); WXGamePlatform.code = res.code; var itemd = {}; if (WXGamePlatform.QuDaoID != "") { itemd.ChanID = WXGamePlatform.QuDaoID; } itemd.Code = WXGamePlatform.code; itemd.AppID = Global_1.Global.appid; itemd.Version = Global_1.Global.gameVersion; GameHttps_1.default.getInstance().sendGet(PlatformEvent_1.default.message_9891001, itemd, wxplatform, wxplatform.loginSucceedCallback); }, fail: function (res) { Debuger_1.default.log("微信登录失败,重新登录吧"); wxplatform.login(callobj, callback, failcallback); } }); } }; WXGamePlatform.prototype.loginSucceedCallback = function (data) { if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) { WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data); } }; WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) { if (Laya.Browser.window.wx) { this._subcallobj = subcallobj; this._subcallback = subcallback; this._updatecallback = updatecallback; this._subfailcallback = subfailcallback; var wx = Laya.Browser.window.wx; if (wx.loadSubpackage) { var loadTask = wx.loadSubpackage({ name: name, success: function (res) { // 分包加载成功后通过 success 回调 Debuger_1.default.log("分包加载成功"); var wxgamePlatform = WXGamePlatform.getInstance(); if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) { wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj); } }, fail: function (res) { // 分包加载失败通过 fail 回调 var wxgamePlatform = WXGamePlatform.getInstance(); if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) { wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj); } } }); if (loadTask.onProgressUpdate) { loadTask.onProgressUpdate(function (res) { var wxgamePlatform = WXGamePlatform.getInstance(); if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) { wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress); } Debuger_1.default.log('下载进度', res.progress); Debuger_1.default.log('已经下载的数据长度', res.totalBytesWritten); Debuger_1.default.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite); }); } } else { if (subcallobj && subcallback) { subcallback.call(subcallobj); } } } else { if (subcallobj && subcallback) { subcallback.call(subcallobj); } } }; /** * 获取转发详细信息 * @param obj * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) { if (failCallback === void 0) { failCallback = null; } if (Laya.Browser.window.wx) { Debuger_1.default.log("shareTicket:", obj.shareTicket); Laya.Browser.window.wx.getShareInfo({ shareTicket: obj.shareTicket, success: function (res) { Debuger_1.default.log("成功:", res); succeedcallback.call(callobj, res); } }); } }; /** * 监听用户点击右上角菜单的“转发”按钮时触发的事件 * @param title * @param imageUrl */ WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onShareAppMessage(function () { return { title: title, imageUrl: imageUrl }; }); } }; /** * 主动拉起转发,进入选择通讯录界面。 * @param title * @param imageUrl */ WXGamePlatform.prototype.shareAppMessage = function (d) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.shareAppMessage(d); } }; /** * 显示当前页面的转发按钮 * @param obj */ WXGamePlatform.prototype.showShareMenu = function (obj) { if (obj === void 0) { obj = null; } if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showShareMenu(obj); } }; /** * 更新转发属性 * @param obj */ WXGamePlatform.prototype.updateShareMenu = function (obj) { if (obj === void 0) { obj = null; } if (Laya.Browser.window.wx) { Laya.Browser.window.wx.updateShareMenu(obj); } }; /** * 显示当前页面的转发按钮 */ WXGamePlatform.prototype.showMenu = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showShareMenu(); } }; /** * 本地存储 * @param key * @param data */ WXGamePlatform.prototype.setStorageSync = function (key, data) { var wx = Laya.Browser.window.wx; if (wx) { wx.setStorageSync(key, data); } }; /** * 获取本地存储 * @param key */ WXGamePlatform.prototype.getStorageSync = function (key) { var wx = Laya.Browser.window.wx; if (wx) { return wx.getStorageSync(key); } return null; }; WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } var wx = Laya.Browser.window.wx; if (wx && wx.setUserCloudStorage) { Debuger_1.default.log("setUserCloudStorage", obj); wx.setUserCloudStorage({ KVDataList: obj, success: function (res) { if (succeedcallback) { succeedcallback.call(callobj, res); } Debuger_1.default.log("setUserCloudStorage", "上传成功"); }, fail: function (res) { if (failCallback) { failCallback.call(callobj); } Debuger_1.default.log("setUserCloudStorage", "上传失败"); } }); } }; /** * 显示消息提示框 * @param word */ WXGamePlatform.prototype.toast = function (word) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showToast({ title: word }); } }; /** * 向开放数据域发送消息 * @param obj */ WXGamePlatform.prototype.postMessage = function (str, data) { if (data === void 0) { data = null; } var wx = Laya.Browser.window.wx; if (wx) { Debuger_1.default.log("postMessage:", str); var context = wx.getOpenDataContext(); context.postMessage({ action: str, data: data }); } }; /** * 创建一个 InnerAudioContext 实例 */ WXGamePlatform.prototype.createInnerAudioContext = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.createInnerAudioContext(); } return null; }; /** * 获取系统信息 */ WXGamePlatform.prototype.getSystemInfoSync = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.getSystemInfoSync(); } return null; }; /** * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作 * @param obj */ WXGamePlatform.prototype.previewImage = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.previewImage(obj); } }; /** * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onHide(function (res) { WXGamePlatform.isShowing = false; if (succeedcallback && callobj) { succeedcallback.call(callobj, res); } }); } }; /** * 返回小程序启动参数 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.getLaunchOptionsSync = function () { if (Laya.Browser.window.wx) { return Laya.Browser.window.wx.getLaunchOptionsSync(); } return null; }; /** * 隐藏消息提示框 * @param obj */ WXGamePlatform.prototype.hideToast = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.hideToast(obj); } }; /** * 显示模态对话框 * @param obj */ WXGamePlatform.prototype.showModal = function (obj) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.showModal(obj); } }; /** * 清理存储数据 */ WXGamePlatform.prototype.clearStorage = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.clearStorageSync(); } }; /** * 使手机发生较短时间的振动(15 ms) * @param obj */ WXGamePlatform.prototype.vibrateShort = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.vibrateShort(); } }; /** * 从本地缓存中移除指定 key * @param key */ WXGamePlatform.prototype.removeStorage = function (key) { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.removeStorage(key); } }; WXGamePlatform.prototype.onAudioInterruptionBegin = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onAudioInterruptionBegin(function () { // SoundssManager.getInstance().playbgSound("bgm"); Debuger_1.default.log("onAudioInterruptionBegin"); SoundssManager_1.default.getInstance().stopAll(); }); } }; WXGamePlatform.prototype.onAudioInterruptionEnd = function () { if (Laya.Browser.window.wx) { Laya.Browser.window.wx.onAudioInterruptionEnd(function () { Debuger_1.default.log("onAudioInterruptionEnd"); var wxgameplatform = WXGamePlatform.getInstance(); Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback); Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback); }); } }; WXGamePlatform.prototype.onAudioEndCallback = function () { EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_onAudioInterruptionEnd); }; /** * 退出游戏 */ WXGamePlatform.prototype.exitGame = function () { var wx = Laya.Browser.window.wx; if (wx) { wx.exitMiniProgram(); } }; /** * 打开客服对话框 */ WXGamePlatform.prototype.openCustomerService = function () { var wx = Laya.Browser.window.wx; if (wx) { var version = wx.getSystemInfoSync().SDKVersion; if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) { wx.openCustomerServiceConversation({ showMessageCard: true, sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg" }); } else { // AlertUtils.showWordTips("当前微信版本不支持"); } } }; /** * 监听内存不足告警 */ WXGamePlatform.prototype.onMemoryWarning = function () { var wx = Laya.Browser.window.wx; if (wx && wx.onMemoryWarning) { wx.onMemoryWarning(function () { Debuger_1.default.log('onMemoryWarningReceive'); //收到警告,强制清理不必要的资源 }); } }; WXGamePlatform.prototype.onError = function () { var wx = Laya.Browser.window.wx; if (wx && wx.onError) { wx.onError(function (res) { console.log("*****onError", res); }); } }; /** * 开始分享 */ WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedCallback === void 0) { succeedCallback = null; } if (failCallback === void 0) { failCallback = null; } WXGamePlatform.nowShareindex = 0; if (WXGamePlatform.ShareDict[key]) { TongjiHttps_1.default.getInstance().tongjiData("share", key, 1); this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback); } }; WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) { this.nowshareObj = callobj; this.nowshareinfo = info; this.nowsharesucceedfun = success; this.nowsharefailfun = failCallback; this.startShareTime = Laya.Browser.now(); this.isShareing = true; WXGamePlatform.callbackfailstate = 0; this.shareAppMessage({ title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "", success: function (res) { }, fail: function (res) { WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("您取消了分享"); if (failCallback && callobj) { failCallback.call(callobj); } }, cancel: function (res) { WXGamePlatform.callbackfailstate = 1; } }); }; /** * 监听小游戏回到前台的事件 * @param callobj * @param succeedcallback * @param failCallback */ WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) { if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } this.showobj = callobj; this.showCallback = succeedcallback; var wx = Laya.Browser.window.wx; if (wx) { wx.onShow(function (res) { WXGamePlatform.isShowing = true; Debuger_1.default.log("onShow", res); if (res && res.scene) { WXGamePlatform.fromscene = Number(res.scene); } Laya.timer.frameOnce(1, WXGamePlatform.getInstance(), WXGamePlatform.getInstance().onShowSucceed); }); } }; WXGamePlatform.prototype.onShowSucceed = function () { var wxgameplatform = WXGamePlatform.getInstance(); if (wxgameplatform.showobj && wxgameplatform.showCallback) { wxgameplatform.showCallback.call(wxgameplatform.showobj); } if (wxgameplatform.isShareing) //如果是分享状态 { wxgameplatform.isShareing = false; var isShareSucceed = false; if (WXGamePlatform.callbackfailstate == 0) { var nowTime = Laya.Browser.now(); var disTime = (nowTime - wxgameplatform.startShareTime) / 1000; if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) { isShareSucceed = true; } } WXGamePlatform.callbackfailstate = 0; if (isShareSucceed) { if (wxgameplatform.nowshareinfo) { TongjiHttps_1.default.getInstance().tongjiData("shareend", wxgameplatform.nowshareinfo.key, 1); } WXGamePlatform.dayShareNum++; wxgameplatform.updateDayShareInfo(); if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) { wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj); } } else { WXGamePlatform.nowShareindex++; wxgameplatform.showModal({ title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定', success: function (res) { var wxplatform = WXGamePlatform.getInstance(); if (res.confirm) { WXGamePlatform.getInstance().shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun); } else { if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) { wxplatform.nowsharefailfun.call(wxplatform.nowshareObj); } } }, fail: function () { }, complete: function () { } }); } } }; /** * 看视频领奖励 * @param callobj * @param succeedcallback */ WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) { var _this = this; if (callobj === void 0) { callobj = null; } if (succeedcallback === void 0) { succeedcallback = null; } if (failCallback === void 0) { failCallback = null; } if (istongjiNum === void 0) { istongjiNum = true; } var wx = Laya.Browser.window.wx; if (wx && wx.createRewardedVideoAd) { if (!WXGamePlatform.videoplaying) { var time = this.lockVideoLeftTime(); if (time > 0) { WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("广告尚未准备好,请" + time + "秒后再试"); return; } EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_losefocus); WXGamePlatform.istongjiVideoNum = istongjiNum; this.nowvideokey = key; TongjiHttps_1.default.getInstance().tongjiData("Video", key, 1); WXGamePlatform.videoplaying = true; this.videocallobj = callobj; this.videosucceedCallback = succeedcallback; this.videofailCallback = failCallback; this.videoAd = wx.createRewardedVideoAd({ adUnitId: 'adunit-de007388d8f86f71' }); this.videoAd.onClose(this.closeAD); this.videoAd.onError(this.onerro); this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.getInstance().failVideo(); }); } } }; WXGamePlatform.prototype.lockVideoLeftTime = function () { var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000; time = WXGamePlatform.VideoTime - time; return Math.ceil(time); }; WXGamePlatform.prototype.onerro = function (res) { var wxgamePlatform = WXGamePlatform.getInstance(); WXGamePlatform.videoplaying = false; wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus); }; // 关闭广告 WXGamePlatform.prototype.closeAD = function (status) { WXGamePlatform.lastVideoTime = Laya.Browser.now(); var wxgamePlatform = WXGamePlatform.getInstance(); if (status && status.isEnded || status == undefined) { if (WXGamePlatform.istongjiVideoNum) { WXGamePlatform.dayVideoNum++; wxgamePlatform.updateDayVideoInfo(); EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_updateVideoNums); } TongjiHttps_1.default.getInstance().tongjiData("Videoend", wxgamePlatform.nowvideokey, 1); if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) { wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj); } } else { WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("未观看完整视频,无法获得奖励"); if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) { wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj); } } WXGamePlatform.videoplaying = false; wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus); }; // 广告失败 WXGamePlatform.prototype.failVideo = function () { WXGamePlatform.lastVideoTime = Laya.Browser.now(); WXGamePlatform.videoplaying = false; WordTipsUtils_1.WordTipsUtils.getInstance().showWordTips("广告加载失败,试试别的方式吧~"); var wxgamePlatform = WXGamePlatform.getInstance(); wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用 wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用 if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) { wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj); } EventUtils_1.EventUtils.dispatchEvent(PlatformEvent_1.default.PlatformEvent_getfocus); }; WXGamePlatform.prototype.isCanVideo = function () { if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) { if (WXGamePlatform.dayVideoNum == 0) { return true; } var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare); var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo); if (videobs > sharebs) { return false; } else if (videobs < sharebs) { return true; } else { var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare; if (videoyushu != 0) { return true; } var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo; if (shareyushu != 0) { return false; } return true; } } return false; }; WXGamePlatform.prototype.createBanner = function (bannertype, style) { if (bannertype === void 0) { bannertype = ""; } if (Laya.Browser.window.wx) { if (bannertype != "") { var bo = false; for (var i = 0; i < this._bannerTypeList.length; i++) { if (bannertype == this._bannerTypeList[i].type) { this._bannerTypeList[i].style = style; var arr = this._bannerTypeList.splice(i, 1); this._bannerTypeList.push(arr[0]); bo = true; break; } } if (!bo) { this._bannerTypeList.push({ type: bannertype, style: style }); } } else { if (this._bannerTypeList.length == 0) { return; } else { var item = this._bannerTypeList[this._bannerTypeList.length - 1]; style = item.style; } } if (this.bannerAd) { var now = Laya.Browser.now(); //超过3分钟刷新 if (now - this.bannerRunTime > 60000 * 3) { Debuger_1.default.log("先移除banner,再添加"); this.bannerAd.offError(this.bannerError); this.bannerAd.offResize(this.bannerResize); this.bannerAd.destory(); this.createNewBanner(style); } else { this.showBanner(style); } } else { this.createNewBanner(style); } } }; WXGamePlatform.prototype.createNewBanner = function (style) { var wx = Laya.Browser.window.wx; if (wx && wx.createBannerAd) { this.nowStype = style; this.bannerRunTime = Laya.Browser.now(); var info = this.getSystemInfoSync(); this._screenwidth = info.screenWidth; var scale = 1; if (style.hasOwnProperty("scale")) { scale = style.scale; } this.bannerAd = wx.createBannerAd({ adUnitId: 'adunit-6ec2688adfaf5a34', adIntervals: 30, style: { left: 0, top: info.screenHeight - 105, width: info.screenWidth * scale } }); if (this.bannerAd) { this.bannerAd.onError(this.bannerError); this.showBanner(style); } } }; WXGamePlatform.prototype.bannerResize = function (res) { Debuger_1.default.log("bannerResize", res); var self = WXGamePlatform.getInstance(); self.bannerAd.offResize(self.bannerResize); self.isonResize = false; var nowstype = self.nowStype; if (!nowstype) { return; } var info = self.getSystemInfoSync(); var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight; var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth; self.bannerwidth = res.width; self.bannerheight = res.height; if (nowstype.hasOwnProperty("x") && nowstype.x != 0) { self.bannerAd.style.left = nowstype.x * percentageW; } else { self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5; } if (nowstype.hasOwnProperty("y") && nowstype.y != 0) { self.bannerAd.style.top = nowstype.y * percentageH; } else { self.bannerAd.style.top = (info.windowHeight - res.height) - 15; } }; WXGamePlatform.prototype.bannerError = function (err) { Debuger_1.default.log(err); }; WXGamePlatform.prototype.showBanner = function (style) { if (this.bannerAd) { this.nowStype = style; var info = this.getSystemInfoSync(); Debuger_1.default.log("getSystemInfoSync:", info); var nowstype = this.nowStype; var scale = 1; if (nowstype.hasOwnProperty("scale")) { scale = nowstype.scale; } var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight; var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth; if (nowstype.hasOwnProperty("x") && nowstype.x != 0) { this.bannerAd.style.left = nowstype.x * percentageW; } else { this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5; } if (nowstype.hasOwnProperty("y") && nowstype.y != 0) { this.bannerAd.style.top = nowstype.y * percentageH; } else { this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15; } this.bannerAd.style.width = info.screenWidth * scale; if (!this.isonResize) { this.isonResize = true; this.bannerAd.onResize(this.bannerResize); } this.bannerAd.show(); } }; WXGamePlatform.prototype.hideBanner = function (type) { if (type === void 0) { type = ""; } if (this.bannerAd) { this.bannerAd.hide(); } if (type != "") { for (var i = 0; i < this._bannerTypeList.length; i++) { if (type == this._bannerTypeList[i].type) { this._bannerTypeList.splice(i, 1); break; } } if (this._bannerTypeList.length > 0) { var item = this._bannerTypeList[this._bannerTypeList.length - 1]; this.createBanner(item.type, item.style); } } }; // private _wxOpenDataViewer:WXOpenDataViewer; /** * 打开好友排行榜 */ WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) { if (parent === void 0) { parent = null; } if (data === void 0) { data = null; } this.closeziyuStage(); this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data }; this.initziyuStage(rect, parent); this.postMessage(type, data); }; /** * 排行榜打开状态时候,切换显示类型 * @param type */ WXGamePlatform.prototype.changeFriendRank = function (type) { this.postMessage(type); }; /** * 排行榜上一页 */ WXGamePlatform.prototype.prePageRank = function () { this.postMessage(RankType_1.RankType.prepage); }; /** * 排行榜下一页 */ WXGamePlatform.prototype.nextPageRank = function () { this.postMessage(RankType_1.RankType.nextpage); }; /** * 关闭好友排行榜 */ WXGamePlatform.prototype.closeFriendRank = function (viewType) { this.postMessage(RankType_1.RankType.closefriendrank); this.closeziyuStage(); if (this._openrankDict[viewType]) { delete this._openrankDict[viewType]; } for (var s in this._openrankDict) { var itemd = this._openrankDict[s]; this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data); break; } }; /** * 初始化子域 * @param rect * @param parent */ WXGamePlatform.prototype.initziyuStage = function (rect, parent) { // if( !this._wxOpenDataViewer ) // { // this._wxOpenDataViewer = new WXOpenDataViewer(); // if( parent ) // { // parent.addChild( this._wxOpenDataViewer ); // } // else // { // GameLayerManager.getInstance().topLayer.displayObject.addChild( this._wxOpenDataViewer ); // } // } // this._wxOpenDataViewer.x = rect.x; // this._wxOpenDataViewer.y = rect.y; // this._wxOpenDataViewer.width = rect.width; // this._wxOpenDataViewer.height = rect.height; }; /** * 销毁子域 */ WXGamePlatform.prototype.closeziyuStage = function () { // if( this._wxOpenDataViewer ) // { // this._wxOpenDataViewer.destroy(); // this._wxOpenDataViewer.removeSelf(); // this._wxOpenDataViewer = null; // } }; /** * 数据上传(用于排行榜数据显示) * @param param1 上报数据 * @param param2 上报数据 */ WXGamePlatform.prototype.storeToCloud = function (param1, param2) { var cacheMager = CacheManager_1.default.getInstance(); var score1 = cacheMager.getnum("param1"); // var score2:number = cacheMager.getnum( "param2" ); param1 = Math.floor(param1); param2 = Math.floor(param2); var result1 = param1; var result2 = param2; if (result1 < score1) { result1 = score1; } else { cacheMager.addstr("param1", result1.toString()); } var arr = []; arr.push({ key: "param1", value: result1.toString() }); arr.push({ key: "param2", value: result2 + "" }); Debuger_1.default.log("storeToCloud", arr); this.setUserCloudStorage(arr); }; WXGamePlatform.prototype.createGameClubButton = function (style, icon) { if (icon === void 0) { icon = "green"; } var wx = Laya.Browser.window.wx; if (wx && style) { style.width = 40; style.height = 40; WXGamePlatform.gameclubButton = wx.createGameClubButton({ icon: icon, style: style }); if (WXGamePlatform.gameclubButton) { WXGamePlatform.gameclubButton.show(); } } }; WXGamePlatform.QuDaoID = ""; //微信广告ID WXGamePlatform.isShowing = true; /** * 授权状态 0:未判断,1:已授权 */ WXGamePlatform.accreditstate = 0; /** * 当天分享次数 */ WXGamePlatform.dayShareNum = 0; /** * 当天看视频次数 */ WXGamePlatform.dayVideoNum = 0; /** * 判断分享是否成功时间间隔 */ WXGamePlatform.ShareTime = 0; /** * 每日最大看视频次数(成功累加一次) */ WXGamePlatform.VideoNum = 0; /** * 看视频冷却时间 */ WXGamePlatform.VideoTime = 0; /** * 8好位cpa可弹出时间间隔(秒) */ WXGamePlatform.jiliweitime = 100; /** * 分享几次切换到视频 */ WXGamePlatform.SharetoVideo = 1; /** * 视频几次切换到分享 */ WXGamePlatform.VideotoShare = 1; /** * 分享数据容器 */ WXGamePlatform.ShareDict = {}; /** * 用户来源id */ WXGamePlatform.fromscene = 0; WXGamePlatform.nowShareindex = 0; WXGamePlatform.callbackfailstate = 0; WXGamePlatform.lastVideoTime = 0; /** * 视频是否在播放中 */ WXGamePlatform.videoplaying = false; WXGamePlatform.istongjiVideoNum = true; return WXGamePlatform; }()); exports.default = WXGamePlatform; },{"../../Global":2,"../../frameworks/Debuger":12,"../../frameworks/events/EventUtils":16,"../../frameworks/net/GameHttps":26,"../../frameworks/net/TongjiHttps":28,"../../gamemodule/loading/view/WordTipsUtils":36,"../../gamemodule/userinfo/events/UserCacheType":55,"../../managers/CacheManager":59,"../../managers/DayManager":60,"../../managers/SoundssManager":65,"../../utils/GameUtils":87,"../events/PlatformEvent":69,"../types/RankType":70}],73:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Sdk_1 = require("./Sdk"); var YQSdk_1 = require("./YQSdk"); var ShareUtil_1 = require("./ShareUtil"); var PlayerAccount_1 = require("./PlayerAccount"); var WxGameItem = /** @class */ (function () { function WxGameItem() { this.appNameHidden = false; this.color = "C93B3BFF"; this.size = 100; this.borderWidth = 50; this.borderColor = "A1A0A0FF"; } return WxGameItem; }()); exports.WxGameItem = WxGameItem; var GuangGao = /** @class */ (function () { function GuangGao() { } Object.defineProperty(GuangGao, "hasbanner", { get: function () { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) { return true; } else { return false; } }, enumerable: true, configurable: true }); Object.defineProperty(GuangGao, "hasvideo", { get: function () { if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) { var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe; return true; } else { return false; } }, enumerable: true, configurable: true }); //预先加载视屏广告 GuangGao.InitVideo = function () { var _this = this; if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) return; console.log(this.bannerAdUnitId); //vedio this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId }); this.fsaasfafssfa.onLoad(function () { console.log('激励视频 广告加载成功'); _this.asfasfsaffsa = true; }); this.fsaasfafssfa.onError(function (err) { console.log("激励视屏加载失败:" + err); _this.asfasfsaffsa = false; }); this.afsfsaafsfsa = true; }; //看视频 GuangGao.ShowVideo = function (callback) { var _this = this; if (this.hasvideo) { if (this.asfasfsaffsa) { YQSdk_1.YQSdk.statistics1("video"); console.log("showVideoAd:" + this.asfasfsaffsa); this.SetVideoCallBack(callback); this.fsaasfafssfa.show().catch(function (err) { _this.fsaasfafssfa.load().then(function () { _this.SetVideoCallBack(callback); _this.fsaasfafssfa.show(); }); }); } else { ShareUtil_1.ShareUtil.shareImage("视频没有分享", callback, "1"); } } else { callback(false); ShareUtil_1.ShareUtil.shareImage("视频没有分享", callback, "1"); } }; GuangGao.SetVideoCallBack = function (callback) { var _this = this; this.fsaasfafssfa.offClose(); this.fsaasfafssfa.onClose(function (res) { console.log("激励视频关闭:" + res.isEnded); if (res && res.isEnded || res === undefined) { callback && callback(true); } else { callback && callback(false); } _this.fsaasfafssfa.offClose(); }); }; //打开banner GuangGao.OpenBanner = function (gap, callVack, iswait) { var _this = this; if (gap === void 0) { gap = 0; } if (callVack === void 0) { callVack = null; } if (iswait === void 0) { iswait = false; } if (!this.hasbanner) { callVack(null); return; } if (!Laya.Browser.onWeiXin) { callVack(null); return; } this.canshowbanner = true; var idd = this.bannerAdUnitId; console.log("adUnitId:" + idd); var newBanner = Laya.Browser.window.wx.createBannerAd({ adUnitId: idd, style: { left: 0, top: 0, width: 460 } }); newBanner.onError(function (err) { console.log(err); callVack(null); }); newBanner.onLoad(function () { if (_this.curbanner) _this.curbanner.destroy(); _this.curbanner = newBanner; var hight = _this.GetRealHight(gap); if (callVack != null) { callVack(hight); } if (_this.canshowbanner && !iswait) { _this.curbanner.show(); } else { _this.curbanner.hide(); } }); }; GuangGao.GetRealHight = function (gap) { if (this.curbanner) { var info = Laya.Browser.window.wx.getSystemInfoSync(); this.curbanner.style.width = info.windowWidth; this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap; return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight; } }; //clear GuangGao.Clear = function () { Laya.timer.clearAll(this); Laya.Tween.clearAll(this); this.canshowbanner = false; if (this.curbanner) this.curbanner.hide(); YQSdk_1.YQSdk.HideBannerImage(); // if (!Laya.Browser.onWeiXin) return; // if (this.curbanner) this.curbanner.hide(); }; GuangGao.hidebanner = function () { if (!Laya.Browser.onWeiXin) return; if (this.curbanner) this.curbanner.hide(); YQSdk_1.YQSdk.HideBannerImage(); }; GuangGao.showbanner = function () { if (!Laya.Browser.onWeiXin) return; if (this.curbanner) this.curbanner.show(); }; Object.defineProperty(GuangGao, "cancheat", { get: function () { if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) { console.log("cheat:false-> CurAccountData.cheat != 1"); return false; } var checkscence = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.checkscence; if (checkscence == false) { console.log("cheat:true-> " + Sdk_1.WxApi.sceneValue); return true; } if (Sdk_1.WxApi.sceneValue == "1037" || Sdk_1.WxApi.sceneValue == "1058" || Sdk_1.WxApi.sceneValue == "1067" || Sdk_1.WxApi.sceneValue == "1095") { console.log("cheat:true-> " + Sdk_1.WxApi.sceneValue); return true; } console.log("cheat:false-> " + Sdk_1.WxApi.sceneValue); return false; }, enumerable: true, configurable: true }); GuangGao.SetPosBanner = function (btn, complete) { var _this = this; if (Laya.Browser.onPC) { complete(false); return; } var info = Laya.Browser.window.wx.getSystemInfoSync(); //console.log(info); //console.log(btn); //console.log(btn.y,Laya.stage.height,info.windowHeight); var reshight = btn.y * info.windowHeight / Laya.stage.height; //console.log("reshight",reshight); var idd = this.bannerAdUnitId; console.log("adUnitId:" + idd); if (this.curbanner) this.curbanner.destroy(); var newBanner = Laya.Browser.window.wx.createBannerAd({ adUnitId: idd, style: { left: 0, top: 0, width: 720 } }); newBanner.onError(function (err) { console.log(err); complete(false); }); newBanner.onLoad(function () { _this.curbanner = newBanner; _this.curbanner.style.top = reshight; //console.log("top",this.asgagassga.style.top); if (_this.curbanner) { console.log("banner show"); _this.curbanner.show(); Laya.timer.once(2300, _this, function () { _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt; complete(true); }); } }); newBanner.onResize(function (res) { GuangGao.bannerhigt = res.height; _this.curbanner.style.width = info.windowWidth; _this.curbanner.style.top = reshight; }); }; //按钮误导 GuangGao.CheatBanner = function (btn, complete, gap) { var _this = this; if (complete === void 0) { complete = null; } if (gap === void 0) { gap = 0; } if (!GuangGao.cancheat) { console.log("ignorecheat"); GuangGao.OpenBanner(0, function (height) { if (height == null) { YQSdk_1.YQSdk.ShowBannerImag(function (hh) { var end = Laya.stage.height - hh - btn.height; btn.y = end; }); } }); } else { btn.y = Laya.stage.height - btn.height - 100; GuangGao.OpenBanner(gap, function (height) { // var random = Math.random(); if (height == null) { YQSdk_1.YQSdk.ShowBannerImag(function (hh) { var end = Laya.stage.height - hh - btn.height; btn.y = end; console.log(btn.y); }); } else { console.log("cheatstart", "bottom:100"); btn.mouseEnabled = false; var end = Laya.stage.height - height - btn.height - 20; console.log("y:" + end); Laya.timer.once(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheattime * 1000, _this, function () { btn.mouseEnabled = true; _this.showbanner(); Laya.Tween.to(btn, { y: end }, 500, null, Laya.Handler.create(_this, function () { if (complete != null) { complete(); } })); }); } }, true); } }; GuangGao.videlAdUnitId = "adunit-a9203b2080cbb5dd"; GuangGao.bannerAdUnitId = "adunit-41998ab40c864a45"; GuangGao.afsfsaafsfsa = false; //视屏广告是否加载成功 GuangGao.asfasfsaffsa = false; GuangGao.canshowbanner = true; // static get CanCreatWxBannerRe():boolean // { // if(!Main.WX)return false; // if(!Account.Instance.curplayerData.WxRe)return false; // let info = Laya.Browser.window.wx.getSystemInfoSync(); // if(!this.cpVersionGreaterOrEqual(info.SDKVersion,"2.7.5"))return false; // return true; // } // static get CanCreatWxGameRe():boolean // { // if(!Main.WX)return false; // if(!Account.Instance.curplayerData.WxRe)return false; // let info = Laya.Browser.window.wx.getSystemInfoSync(); // if(!this.cpVersionGreaterOrEqual(info.SDKVersion,"2.8.3"))return false; // return true; // } // static wxrebannerid = "PBgAA_2ABDZFRyYw"; // static wxbanner:any; // static ShowXWBanner() // { // if (!Main.WX) return; // var idd = this.wxrebannerid; // let newBanner = Laya.Browser.window.wx.createGameBanner({ // adUnitId: idd, // style: // { // left: 0, // top: 0, // } // }); // newBanner.onError(err => { // console.log(err); // }); // newBanner.onLoad(() => // { // if (this.wxbanner) this.wxbanner.destroy(); // this.wxbanner = newBanner; // this.wxbanner.show(); // }); // } // static wxregameid = "PBgAA_2ABDZKVIlM"; // static wxgame:any; // static ShowXWGame() // { // if (!Main.WX || !this.CanCreatWxGameRe) return; // var idd = this.wxregameid; // let info = Laya.Browser.window.wx.getSystemInfoSync(); // var game1 = new WxGameItem(); // game1.top = info.windowHeight * 0.3; // game1.left = info.windowWidth - 80; // var games = [game1]; // let newGame = Laya.Browser.window.wx.createGameIcon({ // adUnitId: idd, // count: 1, // style: games // },game1); // newGame.onError(err => { // console.log(err); // }); // newGame.onLoad(() => // { // if (this.wxgame) this.wxgame.destroy(); // this.wxgame = newGame; // this.wxgame.show(); // }); // } GuangGao.bannerhigt = 0; return GuangGao; }()); exports.default = GuangGao; },{"./PlayerAccount":74,"./Sdk":75,"./ShareUtil":76,"./YQSdk":77}],74:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Sdk_1 = require("../WXSDK/Sdk"); var GameUtils_1 = require("../../../utils/GameUtils"); var NetworkManager_1 = require("../NetworkManager"); var requiretype; (function (requiretype) { requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001"; requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70"; requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891"; requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB"; requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230"; requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8"; requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361"; requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646"; requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"; requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70"; })(requiretype = exports.requiretype || (exports.requiretype = {})); var AccountConfig; (function (AccountConfig) { AccountConfig[AccountConfig["crop"] = 0] = "crop"; AccountConfig[AccountConfig["things"] = 1] = "things"; AccountConfig[AccountConfig["land"] = 2] = "land"; AccountConfig[AccountConfig["global"] = 3] = "global"; AccountConfig[AccountConfig["entity"] = 4] = "entity"; AccountConfig[AccountConfig["sign"] = 5] = "sign"; AccountConfig[AccountConfig["rewards"] = 6] = "rewards"; AccountConfig[AccountConfig["achievement"] = 7] = "achievement"; AccountConfig[AccountConfig["invite"] = 8] = "invite"; AccountConfig[AccountConfig["mission"] = 9] = "mission"; AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click"; AccountConfig[AccountConfig["theme"] = 11] = "theme"; AccountConfig[AccountConfig["lottery"] = 12] = "lottery"; })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {})); var AccountUser; (function (AccountUser) { AccountUser[AccountUser["money"] = 0] = "money"; AccountUser[AccountUser["diamond"] = 1] = "diamond"; AccountUser[AccountUser["user_id"] = 2] = "user_id"; AccountUser[AccountUser["game_times"] = 3] = "game_times"; AccountUser[AccountUser["get_themes"] = 4] = "get_themes"; AccountUser[AccountUser["video_times"] = 5] = "video_times"; AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes"; AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time"; AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time"; AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes"; AccountUser[AccountUser["revival"] = 10] = "revival"; AccountUser[AccountUser["stage"] = 11] = "stage"; AccountUser[AccountUser["vmoney"] = 12] = "vmoney"; })(AccountUser = exports.AccountUser || (exports.AccountUser = {})); var heroAttr; (function (heroAttr) { heroAttr[heroAttr["id"] = 0] = "id"; heroAttr[heroAttr["name"] = 1] = "name"; heroAttr[heroAttr["quality"] = 2] = "quality"; heroAttr[heroAttr["icon"] = 3] = "icon"; heroAttr[heroAttr["prefab"] = 4] = "prefab"; heroAttr[heroAttr["require_num"] = 5] = "require_num"; heroAttr[heroAttr["require_type"] = 6] = "require_type"; })(heroAttr = exports.heroAttr || (exports.heroAttr = {})); var signdata; (function (signdata) { signdata[signdata["sign_days"] = 0] = "sign_days"; signdata[signdata["sign_time"] = 1] = "sign_time"; })(signdata = exports.signdata || (exports.signdata = {})); var entity; (function (entity) { entity[entity["id"] = 0] = "id"; entity[entity["name"] = 1] = "name"; entity[entity["entity_id"] = 2] = "entity_id"; entity[entity["icon"] = 3] = "icon"; })(entity = exports.entity || (exports.entity = {})); var skinattr; (function (skinattr) { skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1"; skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2"; skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3"; skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4"; })(skinattr = exports.skinattr || (exports.skinattr = {})); var AccountData = /** @class */ (function () { function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) { if (_useInvite === void 0) { _useInvite = null; } if (_user_stage === void 0) { _user_stage = null; } this.openid = ""; this.userId = ""; this.roadconfig = {}; this.m_RewardDic = {}; this.m_EntityDic = {}; this.m_AchievementDic = {}; this.m_token = _token; this.m_app_setting = _appSetting; this.m_user = _user; this.m_user_base = _userbase; this.m_sign = _user_sign; this.m_task = _user_achievement; this.lottery = _lottery; this.m_use_land_task = _use_land_task; this.m_user_video = _user_video; this.userId = this.m_user["user_id"]; this.openid = this.m_user_base["openid"]; console.log("user_id:" + this.userId); //console.log("open_id:"+this.openid); } Object.defineProperty(AccountData.prototype, "lotterytime", { // public m_skinDic:Dictionary = new Dictionary(); get: function () { return Number(this.lottery["day_video_times"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "share", { get: function () { return this.m_app_setting["share"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "sharecontent", { get: function () { return this.m_app_setting["sharecontent"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ShareImage", { get: function () { return this.m_app_setting["ShareImage"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "cheattime", { get: function () { return Number(this.m_app_setting["cheattime"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "banner", { get: function () { return this.m_app_setting["banner"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "video", { get: function () { return this.m_app_setting["video"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "BtnCanMove", { get: function () { return this.m_app_setting["BtnCanMove"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "checkscence", { get: function () { return this.m_app_setting["checkscence"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "banner_dis", { get: function () { return Number(this.m_app_setting["banner_dis"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerMoveTime", { get: function () { return Number(this.m_app_setting["bannerMoveTime"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "createBannerTimes", { get: function () { return Number(this.m_app_setting["createBannerTimes"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerMoveProp", { get: function () { return Number(this.m_app_setting["bannerMoveProp"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "isShareThenVideo", { get: function () { return this.m_app_setting["isShareThenVideo"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "isShowHuiTui", { get: function () { return this.m_app_setting["isShowHuiTui"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "start_sprint", { get: function () { return Number(this.m_app_setting["start_sprint"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "IsVideoModel", { get: function () { return this.m_app_setting["IsVideoModel"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "videoModelNum", { get: function () { return Number(this.m_app_setting["videoModelNum"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "VideoModelTitle", { get: function () { return this.m_app_setting["VideoModelTitle"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "failcount", { get: function () { return Number(this.m_app_setting["failcount"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "spminspeed", { get: function () { return Number(this.m_app_setting["spminspeed"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bgm", { get: function () { return this.m_app_setting["bgm"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "camerahight", { get: function () { return Number(this.m_app_setting["camerahight"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "ctnfilename", { get: function () { return this.m_app_setting["ctnfilename"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "cheat", { get: function () { return this.m_app_setting["cheat"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "shakestage", { get: function () { return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "stageconfigcdn", { get: function () { return this.m_app_setting["stageconfigcdn"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "playerspeed", { get: function () { return Number(this.m_app_setting["playerspeed"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "videlAdUnitId", { get: function () { return this.m_app_setting["videlAdUnitId"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "bannerAdUnitId", { get: function () { return this.m_app_setting["bannerAdUnitId"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "tri", { get: function () { return this.m_app_setting["tri"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "recommend", { get: function () { return this.m_app_setting["recommend"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "recommendflg", { get: function () { return this.m_app_setting["recommendflg"]; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "egg", { get: function () { return this.m_app_setting["egg"] == "1"; }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "eggrate", { get: function () { return Number(this.m_app_setting["eggrate"]); }, enumerable: true, configurable: true }); Object.defineProperty(AccountData.prototype, "UseId", { get: function () { return this.userId; }, enumerable: true, configurable: true }); AccountData.prototype.GetConfig = function (_type) { var type = AccountConfig[_type]; return this.m_configs[type]; }; AccountData.prototype.GetUser = function (_type) { var type = AccountUser[_type]; return this.m_user[type]; }; Object.defineProperty(AccountData.prototype, "GetVideoTotal", { get: function () { return Number(this.m_user_video["total"]); }, enumerable: true, configurable: true }); AccountData.prototype.GetSign = function (_datatype) { var type = signdata[_datatype]; return this.m_sign[type]; }; AccountData.prototype.GetRewardConfig = function (_rewardid) { var reward = this.m_RewardDic[_rewardid]; return reward; }; AccountData.prototype.GetEntity = function (_id, attr) { if (!this.m_EntityDic[_id]) return null; return this.m_EntityDic[_id][entity[attr]]; }; AccountData.prototype.GetRewardDic = function () { var config = this.GetConfig(AccountConfig.rewards); for (var key in config) { this.m_RewardDic[config[key].id] = config[key]; } }; AccountData.prototype.GetEntityDic = function () { var config = this.GetConfig(AccountConfig.entity); for (var key in config) { this.m_EntityDic[config[key].entity_id] = config[key]; } }; AccountData.prototype.GetThemeById = function (_id) { var data = this.GetConfig(AccountConfig.theme); if (data) { for (var index = 0; index < data.length; index++) { var element = data[index]; if (element.id == _id) { return element; } } } }; AccountData.prototype.GetSkinAttr = function (_id) { var config = this.GetConfig(AccountConfig.theme); for (var i = 0; i < config.length; i++) { if (config[i].id == _id) { return config[i]; } } }; AccountData.prototype.GetAchievementData = function () { var data = this.GetConfig(AccountConfig.achievement); var dic = {}; for (var key1 in data) { var type1 = data[key1].type; //var obj = {}; if (dic[type1]) { continue; } var array = []; for (var key2 in data) { var type2 = data[key2].type; if (type1 == type2) { array.push(data[key2]); } } dic[type1] = array; } this.m_AchievementDic = dic; }; AccountData.prototype.HasTheme = function (_id) { var has = false; var getthemes = this.GetUser(AccountUser.get_themes); for (var i = 0; i < getthemes.length; i++) { if (getthemes[i] == _id) { has = true; } } return has; }; AccountData.prototype.GetSkinDic = function (_config) { }; AccountData.prototype.GetHeroProgress = function (_id) { var config = this.m_user["progress_heroes"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetHatProgress = function (_id) { var config = this.m_user["progress_hats"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetCbProgress = function (_id) { var config = this.m_user["progress_dances"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.HasMotor = function (_id) { var data = this.GetUser(AccountUser.get_themes); for (var i = 0; i < data.length; i++) { var hd = data[i]; if (_id == hd) { return true; } } return false; }; //获取皮肤的进度 AccountData.prototype.GetMotorProgress = function (_id) { var config = this.m_user["progress_themes"]; var progress = config[_id] ? config[_id] : 0; return progress; }; AccountData.prototype.GetSeverConfig = function (_config) { this.m_configs = _config; this.GetSkinDic(this.m_configs); this.GetRewardDic(); this.GetEntityDic(); // this.GetAchievementData(); var _globe = _config["global"]; for (var index = 0; index < _globe.length; index++) { var element = _globe[index]; if (element.key == "tilirec") { PlayerAccount.CurrentAccount.tilirec = Number(element.value); return; } } }; AccountData.prototype.UpdateSkinDic = function () { this.GetSkinDic(this.m_configs); }; AccountData.prototype.GetGlobe = function (_key) { var globe = this.GetConfig(AccountConfig.global); for (var key in globe) { var obj = globe[key]; var kkk = obj["key"]; if (kkk == _key) { var value = obj["value"]; return value; } } return null; }; return AccountData; }()); exports.AccountData = AccountData; var PlayerAccount = /** @class */ (function () { function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) { this.IsTest = false; this.localTime = Laya.timer.currTimer; this.Code = _code; this.NickName = _nickname; this.Avatar = _avatar; this.Gender = _gender; this.Country = _country; this.Province = _province; this.City = _city; this.Device = _device; this.ShareId = _shareid; this.Scene = _scence; this.ver = _ver; this.IsTest = false; PlayerAccount.instance = this; } Object.defineProperty(PlayerAccount, "CurrentAccount", { get: function () { if (PlayerAccount.instance == null) { console.log("生成本地测试账号..."); return PlayerAccount.TestAccount; } return PlayerAccount.instance; }, enumerable: true, configurable: true }); Object.defineProperty(PlayerAccount, "TestAccount", { get: function () { var code = Laya.LocalStorage.getItem("localcode"); if (!code) { var time = new Date().getTime().toString(); var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString(); code = "xj_" + time + random; Laya.LocalStorage.setItem("localcode", code); console.log(time, random); console.log("新用户", code); } else { console.log("老用户", code); } var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null); curaccount.IsTest = true; return curaccount; }, enumerable: true, configurable: true }); PlayerAccount.prototype.SetAccountData = function (data, completecb) { var _this = this; var token = data["token"]; var configs = data["configs"]; var app_setting = data["app_setting"]; var user = data["user"]; var user_base = data["user_base"]; var user_sign = data["user_sign"]; var user_achievement = data["user_achievement"]; var user_lottery = data["user_lottery"]; var user_land_task = data["user_land_task"]; var user_video = data["user_video"]; if (this.CurAccountData == null) { Sdk_1.WxApi.recordAldEvent("开始获取config数据"); this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video); this.CheckLocalConfig(data.table_version, function (_config) { _this.CurAccountData.GetSeverConfig(_config); _this.nowConfig = _config; if (completecb != null) { completecb.runWith(data); } }); } else { if (configs) { this.CurAccountData.m_configs = configs; } if (app_setting) { this.CurAccountData.m_app_setting = app_setting; } if (user) { this.CurAccountData.m_user = user; } if (user_base) { this.CurAccountData.m_user_base = user_base; } if (user_sign) { this.CurAccountData.m_sign = user_sign; } if (user_achievement) { this.CurAccountData.m_task = user_achievement; } if (user_lottery) { this.CurAccountData.lottery = user_lottery; } if (user_land_task) { this.CurAccountData.m_use_land_task = user_land_task; } if (user_video) { this.CurAccountData.m_user_video = user_video; } } }; PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) { var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey); if (curconfig) { //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey); if (curconfig.ver == _ver) { console.log("sever配置是最新的...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(curconfig); } else { NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) { data.configs.ver = _ver; Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs); console.log("sever配置更新完成...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(data.configs); }), Laya.Handler.create(this, function (data) { console.log("配置获取失败" + data); Sdk_1.WxApi.recordAldEvent("config接口获取失败"); })); } } else { NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) { data.configs.ver = _ver; Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs); console.log("sever保存配置完成...", _ver); Sdk_1.WxApi.recordAldEvent("config接口获取成功"); cb(data.configs); }), Laya.Handler.create(this, function (data) { console.log("配置获取失败" + data); Sdk_1.WxApi.recordAldEvent("config接口获取失败"); })); } }; Object.defineProperty(PlayerAccount.prototype, "ServerTime", { get: function () { var time = Laya.timer.currTimer; var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000); return stime; }, enumerable: true, configurable: true }); PlayerAccount.localcofigkey = "mconfig"; return PlayerAccount; }()); exports.PlayerAccount = PlayerAccount; },{"../../../utils/GameUtils":87,"../NetworkManager":71,"../WXSDK/Sdk":75}],75:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var systemtype; (function (systemtype) { systemtype[systemtype["ios"] = 0] = "ios"; systemtype[systemtype["android"] = 1] = "android"; systemtype[systemtype["other"] = 2] = "other"; })(systemtype = exports.systemtype || (exports.systemtype = {})); var WxApi = /** @class */ (function () { function WxApi() { } WxApi.recordAldEvent = function (key, value) { if (value === void 0) { value = ""; } if (Laya.Browser.window && Laya.Browser.window.wx) { Laya.Browser.window.wx.aldSendEvent(key, { key: value }); } console.log("事件: ", key); }; WxApi.WXLogin = function (cb) { var that = this; Laya.Browser.window.wx.login({ success: function (res) { if (res.code) { console.log("code:", res.code); cb(res); } else { console.log('获取用户登录态失败!' + res.errMsg); } }, fail: function (res) { console.log("wx.login: failed, res=" + res); } }); }; WxApi.WxInit = function () { var _this = this; if (!Laya.Browser.onWeiXin) return; Laya.Browser.window.wx.showShareMenu({ withShareTicket: true }); Laya.Browser.window.wx.onShow(function (option) { console.log(option); _this.shareOpenId = option.query.userId; _this.querychannel = option.query.channel; if (option.referrerInfo) { _this.referrerInfoappId = option.referrerInfo.appId; console.log("onShow appId is:", option.referrerInfo.appId); } _this.sceneValue = option.scene; var scene = Laya.LocalStorage.getItem("scene"); if (scene) { _this.sceneValue = scene; console.log("读取配置场景值:" + scene); } else { console.log("第一次拉取场景值:" + _this.sceneValue); Laya.LocalStorage.setItem("scene", _this.sceneValue); } }); }; WxApi.ShowLoading = function (title) { if (title === void 0) { title = "加载中..."; } if (this.isShowing) return; this.isShowing = true; (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true }); }; WxApi.HideLoading = function () { this.isShowing = false; (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading(); }; WxApi.aldSendOpenid = function (_openid) { if (Laya.Browser.onMiniGame) { console.log("aldSendOpenid", _openid); Laya.Browser.window.wx.aldSendOpenid(_openid); } }; //检测更新 WxApi.CheckWXUpdate = function () { var updateManager = Laya.Browser.window.wx.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { console.log("最新版本:" + res.hasUpdate); }); updateManager.onUpdateReady(function () { Laya.Browser.window.wx.showModal({ showCancel: false, title: '更新提示', content: '新版本已经准备好,是否重启应用?', success: function (res) { updateManager.applyUpdate(); }, fail: function (res) { updateManager.applyUpdate(); } }); }); }; WxApi.levelStart = function (stageId, stageName, userId) { console.log("开始记录关卡:" + stageId); if (Laya.Browser.window && Laya.Browser.window.wx) { Laya.Browser.window.wx.aldStage.onStart({ stageId: stageId, stageName: stageName, userId: userId //用户ID 可选 }); if (WxApi.newaccount) { Laya.Browser.window.wx.aldStage.onStart({ stageId: "新用户:" + stageId, stageName: stageName, userId: userId //用户ID 可选 }); } } }; WxApi.levelRunning = function (stageId, stageName, userId, userevive) { console.log("记录关卡中:" + stageId); if (Laya.Browser.window && Laya.Browser.window.wx) { Laya.Browser.window.wx.aldStage.onRunning({ stageId: stageId, stageName: stageName, userId: userId, event: "revive", params: { itemName: "使用复活", itemCount: 1, desc: userevive //使用道具描述 } }); if (WxApi.newaccount) { Laya.Browser.window.wx.aldStage.onRunning({ stageId: "新用户:" + stageId, stageName: stageName, userId: userId, event: "revive", params: { itemName: "使用复活", itemCount: 1, desc: userevive //使用道具描述 } }); } } }; WxApi.levelSuccess = function (stageId, stageName, userId) { console.log("记录关卡:完成" + stageId); if (Laya.Browser.window && Laya.Browser.window.wx) { Laya.Browser.window.wx.aldStage.onEnd({ stageId: stageId, stageName: stageName, userId: userId, event: "complete", params: { desc: "关卡完成" //描述 } }); if (WxApi.newaccount) { Laya.Browser.window.wx.aldStage.onEnd({ stageId: "新用户:" + stageId, stageName: stageName, userId: userId, event: "complete", params: { desc: "关卡完成" //描述 } }); } } }; WxApi.levelFail = function (stageId, stageName, userId, score, carname) { console.log("记录关卡:失败" + stageId); if (Laya.Browser.window && Laya.Browser.window.wx) { Laya.Browser.window.wx.aldStage.onEnd({ stageId: stageId, stageName: stageName, userId: userId, event: "fail", params: { desc: "失败", score: score, car: carname //描述 } }); if (WxApi.newaccount) { Laya.Browser.window.wx.aldStage.onEnd({ stageId: "新用户:" + stageId, stageName: stageName, userId: userId, event: "fail", params: { desc: "失败", score: score, car: carname //描述 } }); } } }; WxApi.shake = function () { Laya.Browser.window.wx.vibrateShort({}); }; WxApi.shakeLong = function () { Laya.Browser.window.wx.vibrateLong({}); }; WxApi.Shake = function (_short) { if (_short === void 0) { _short = true; } if (Laya.Browser.onWeiXin && WxApi.CanShake) { if (_short) { this.shake(); } else { this.shakeLong(); } } if (!_short) { this.stageShake(); } }; WxApi.stageShake = function (callBack, speed) { if (callBack === void 0) { callBack = null; } if (speed === void 0) { speed = 32; } if (this.isShake || !this.canshakestage) return; this.isShake = true; var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y); Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]); }; WxApi.shakeObject = function (_point, _callBack) { var count = (this.num++) % 4; this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset; Laya.stage.x = this.offsetArr[0] + _point.x; Laya.stage.y = this.offsetArr[1] + _point.y; if (this.num > (this.times * 4 + 1)) { Laya.stage.clearTimer(this, this.shakeObject); Laya.stage.pos(0, 0); this.num = 0; this.isShake = false; if (_callBack != null) { _callBack(); } } }; WxApi.ShowTxt = function (text) { if (Laya.Browser.onWeiXin) { Laya.Browser.window.wx.showToast({ title: text }); } else { console.log(text); } }; Object.defineProperty(WxApi, "SystemFrom", { get: function () { if (!Laya.Browser.onWeiXin) return systemtype.other; var info = Laya.Browser.window.wx.getSystemInfoSync(); var system = info.system; var IOS = system.indexOf("iOS") != -1; var Android = system.indexOf("Android") != -1; if (IOS) { return systemtype.ios; } else if (Android) { return systemtype.android; } else { return systemtype.other; } }, enumerable: true, configurable: true }); Object.defineProperty(WxApi, "IsLongScreenSystem", { get: function () { if (!Laya.Browser.onWeiXin) return false; var systemInfo = Laya.Browser.window.wx.getSystemInfoSync(); var platformModel = "ipx"; if (systemInfo != null) { var model = systemInfo.model; platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion; console.log("platformModel:" + platformModel); return !(model.indexOf("X") < 0) || ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) || systemInfo.statusBarHeight > 20 || (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) || ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0)); } }, enumerable: true, configurable: true }); WxApi.writeStage = function (stage) { var kvDataList = new Array(); var date = new Date().getTime(); var myValue = JSON.stringify({ "wxgame": { "stage": stage, "update_time": date.toString(), } }); kvDataList.push({ key: "stage", value: myValue }); if (Laya.Browser.window.wx) { Laya.Browser.window.wx.setUserCloudStorage({ KVDataList: kvDataList, success: function (r) { console.log("上传分数成功"); } }); } }; WxApi.cpVersionGreaterOrEqual = function (v1, v2) { console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2); var v1Arr = v1.split("."); var v2Arr = v2.split("."); var len = v1Arr.length; if (v2Arr.length < len) { len = v2Arr.length; } for (var i = 0; i < len; i++) { var ver1 = Number(v1Arr[i]); var ver2 = Number(v2Arr[i]); if (ver1 > ver2) { return true; } else if (ver1 < ver2) { return false; } } return v1Arr.length >= v2Arr.length; }; WxApi.newaccount = false; WxApi.sceneValue = ""; WxApi.shareOpenId = ""; WxApi.querychannel = ""; WxApi.referrerInfoappId = ""; //显示加载信息 WxApi.isShowing = false; WxApi.CanShake = true; WxApi.times = 1.3; WxApi.num = 0; WxApi.offsetArr = [0, 0]; WxApi.offset = 14; WxApi.canshakestage = false; return WxApi; }()); exports.WxApi = WxApi; },{}],76:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Sdk_1 = require("./Sdk"); var GameUtils_1 = require("../../../utils/GameUtils"); var PlayerAccount_1 = require("./PlayerAccount"); /* * name; */ var ShareUtil = /** @class */ (function () { function ShareUtil() { } ShareUtil.prototype.beginShare = function (callBack) { ShareUtil.beginShareTime = new Date().getTime(); console.log("分享点击时间=" + ShareUtil.beginShareTime); ShareUtil.isSharing = true; ShareUtil.callback = callBack; }; ShareUtil.prototype.onRegister = function () { if (Laya.Browser.window.wx == null) { return; } Laya.Browser.window.wx.onShow(function (option) { console.log("onshow share start"); if (ShareUtil.isSharing) { ShareUtil.isSharing = false; var time = new Date().getTime(); console.log("分享回到游戏时间" + time); var wait = (time - ShareUtil.beginShareTime) / 1000; console.log("分享停留时间为:" + wait); var shareSuccess = false; var realSuccess = false; if (wait < 3) { Laya.Browser.window.wx.showToast({ title: "请重试一次" }); ShareUtil.callback(false); } else { var random = Math.random(); if (random <= 0.3) { var message = ["你已分享过该群", "请重新换个群分享!", "请分享到30人大群中!"]; var curmes = message[GameUtils_1.GameUtils.randRangeint(0, 2)]; Laya.Browser.window.wx.showToast({ title: curmes }); ShareUtil.callback(false); } else { Laya.Browser.window.wx.showToast({ title: "分享成功!" }); ShareUtil.callback(true); } } // if(wait >= 2) // { // if(wait < 4) // { // shareSuccess = (Math.random() > 0.5)?false:true; // } // else // { // shareSuccess = true; // } // } // else{ // shareSuccess = false; // } // if(shareSuccess == false) // { // Laya.Browser.window.wx.showToast( {title:"请重试一次"} ); // ShareUtil.callback(false); // } // else{ // Laya.Browser.window.wx.showToast( {title:"分享成功"} ); // ShareUtil.callback(true); // } } }); }; ShareUtil.ShareMessage = function () { if (!Laya.Browser.onWeiXin) return; var t = PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime; var _title = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.sharecontent; _title = (_title == "" || !_title) ? "你能跟得上我的速度吗!?" : _title; var _image = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShareImage; _image = (_image == "" || !_image) ? "bg/share1.png" : _image; console.log("ShareMessage"); Laya.Browser.window.wx.onShareAppMessage(function () { return ({ title: _title, imageUrl: _image, query: "shareid=" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId + "_" + t + "_" + Math.floor(9999 * Math.random()).toString() }); }); }; ShareUtil.shareImage = function (channel, callback, shareType) { if (callback === void 0) { callback = null; } if (Laya.Browser.window.wx == null) { return; } if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.share) { Sdk_1.WxApi.ShowTxt("暂未开放"); return; } var t = PlayerAccount_1.PlayerAccount.CurrentAccount.ServerTime; var _title = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.sharecontent; _title = (_title == "" || !_title) ? "你能跟得上我的速度吗!?" : _title; var _image = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShareImage; _image = (_image == "" || !_image) ? "bg/share1.png" : _image; if (Sdk_1.WxApi.sceneValue == "1037" || Sdk_1.WxApi.sceneValue == "1058" || Sdk_1.WxApi.sceneValue == "1067" || Sdk_1.WxApi.sceneValue == "1095") { _title = "2020全新工资走势,你跟上节奏了吗?"; _image = "bg/share2.png"; } Laya.Browser.window.wx.aldShareAppMessage({ title: _title, imageUrl: _image, query: "userId=" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId + "_" + shareType + "_" + t + "_" + Math.floor(9999 * Math.random()).toString() // + "&shareTitle=" + _title, }); if (callback) { ShareUtil.Instance.beginShare(callback); } }; ShareUtil.Instance = new ShareUtil(); ShareUtil.shareSuccessTime = 0; ShareUtil.isSharing = false; return ShareUtil; }()); exports.ShareUtil = ShareUtil; },{"../../../utils/GameUtils":87,"./PlayerAccount":74,"./Sdk":75}],77:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GuangGao_1 = require("./GuangGao"); var Dictionary_1 = require("../../../utils/Dictionary"); var PlayerAccount_1 = require("./PlayerAccount"); var Sdk_1 = require("./Sdk"); var GameUtils_1 = require("../../../utils/GameUtils"); var RecommendView_1 = require("./cpa/RecommendView"); var YQSdk = /** @class */ (function () { function YQSdk() { } YQSdk.postbj = function (url, args, callback, header) { if (header === void 0) { header = null; } var httpRequest = new Laya.HttpRequest(); if (callback) { httpRequest.once(Laya.Event.PROGRESS, this, function () { callback.progress && callback.progress(httpRequest); }); httpRequest.once(Laya.Event.ERROR, this, function () { callback.error && callback.error(httpRequest); }); httpRequest.once(Laya.Event.COMPLETE, this, function () { callback.complete && callback.complete(httpRequest); }); } if (header) { httpRequest.send(url, args, "post", "json", ["Content-Type", "application/json"]); } else { httpRequest.send(url, args, "post", "json"); } }; //登录 YQSdk.login = function (code, _channel, _appid, cb) { if (cb === void 0) { cb = null; } var url1 = "https://api.yz061.com/auth?"; var url; var channel = _channel; var appid = _appid; if (!channel) channel = "own"; var args1 = { flg: this.flg, code: code, channel: channel }; if (appid) { url = url1 + "flg=" + args1.flg + "&code=" + args1.code + "&channel=" + args1.channel + "&appid=" + appid; } else { url = url1 + "flg=" + args1.flg + "&code=" + args1.code + "&channel=" + args1.channel; } this.postbj(url, null, { complete: function (request) { if (cb != null) cb(); console.log("HP_login complete" + JSON.stringify(request.data)); }, progress: function (request) { console.log("HP_login progress:" + JSON.stringify(request.data)); }, error: function (request) { console.log("HP_login error:" + JSON.stringify(request.data)); } }); console.log("登录参数:" + url); }; //获取广告(含分享)素材接口 YQSdk.pullAdPosition = function (cb) { if (cb === void 0) { cb = null; } //ad position this.postbj("https://api.yz061.com/game/" + this.flg, null, { complete: function (request) { if (request.data.status == 1) { console.log("allPosition :", request.data); YQSdk.adPosition = request.data.result; YQSdk.GetAdInfo(); YQSdk.getad = true; if (cb) cb(); } else { console.log("allPositionfailed:", request.data); } }, error: function (request) { console.log("allPosition failed:", request.data); } }); }; YQSdk.GetAdInfo = function () { var _this = this; for (var index = 0; index < this.adPosition.length; index++) { switch (this.adPosition[index].location_flg) { case "C": this.adPositionDic.add("C", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.cainixihuan = data; _this.getc = true; }); break; case "C2": this.adPositionDic.add("C2", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { //this.fuhuocainixihuan = data; }); break; case "B": this.adPositionDic.add("B", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.baokuanyouxi1 = data; _this.getb = true; //console.log(this.baokuanyouxi1); }); break; case "banner": this.adPositionDic.add("banner", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.banner_data = data; _this.getbanner = true; }); break; case "GDYX": this.adPositionDic.add("GDYX", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.gdyy = data; _this.getgdyx = true; }); break; case "JS": this.adPositionDic.add("JS", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.js = data; _this.getjs = true; }); break; case "TC": this.adPositionDic.add("TC", this.adPosition[index]); this.getAddetail(this.adPosition[index].url, function (data) { YQSdk.tc = data; _this.gettc = true; }); break; } } }; Object.defineProperty(YQSdk, "CheckGetDataComplete", { get: function () { var complete = false; if (this.getc && this.getgdyx && this.getb && this.getjs && this.getbanner) { complete = true; } return complete; }, enumerable: true, configurable: true }); //获取广告详细信息接口 YQSdk.getAddetail = function (url, callback) { var _this = this; var uid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid; this.postbj(url + "&uid=" + uid, null, { complete: function (request) { if (request.data.status == 1) { //console.log("pullAdPosition :", request.data); callback(request.data.result); if (_this.CheckGetDataComplete) { new RecommendView_1.Recommend(); } } else { console.log("pullAdPositionfailed:", request.data); } }, error: function (request) { console.log("pullAdPosition failed:", request.data); } }); }; YQSdk.GetShare = function (_cb) { if (_cb === void 0) { _cb = null; } var url1 = "https://api.yz061.com/matter/share?id=281&gflg= " + this.flg + " &lflg=F"; var uid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid; var url = url1 + "&uid=" + uid; this.postbj(url, null, { complete: function (request) { if (_cb != null) _cb(JSON.stringify(request.data)); var data = request.data; YQSdk.shares = data.result; }, progress: function (request) { //console.log("GetShare progress:" + JSON.stringify(request.data)); }, error: function (request) { //console.log("GetShare error:" + JSON.stringify(request.data)); } }); }; //广告点击上报接口 YQSdk.reportad = function (ad_id, location_id, issuccess) { if (issuccess === void 0) { issuccess = false; } var url = "https://api.yz061.com/reportad?"; var curuid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid; var channel = Sdk_1.WxApi.querychannel; if (!channel) channel = "own"; var rgs1 = { gflg: this.flg, uid: curuid, ad_id: ad_id, location_id: location_id, channel: channel }; if (issuccess) { var rgs = url + "gflg=" + rgs1.gflg + "&uid=" + rgs1.uid + "&ad_id=" + rgs1.ad_id + "&location_id=" + rgs1.location_id + "&channel=" + rgs1.channel + "&status=cb"; } else { var rgs = url + "gflg=" + rgs1.gflg + "&uid=" + rgs1.uid + "&ad_id=" + rgs1.ad_id + "&location_id=" + rgs1.location_id + "&channel=" + rgs1.channel; } console.log("上报的参数" + rgs); this.postbj(rgs, null, { complete: function (request) { if (request.data.status == 1) { console.log("上报成功 :", request.data); } else { console.log("上报失败:", request.data); } }, error: function (request) { console.log("错误消息:", request.data); } }); }; YQSdk.statistics1 = function (loc, _shareid) { if (_shareid === void 0) { _shareid = ""; } var url = "https://api.yz061.com/stat?"; var curuid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid; var channel = Sdk_1.WxApi.querychannel; if (!channel) channel = "own"; var sid = _shareid; if (!sid) sid = ""; var r = { flg: this.flg, uid: curuid, channel: channel, loc: loc, sid: sid }; var args = url + "&flg=" + r.flg + "&uid=" + r.uid + "&channel=" + r.channel + "&loc=" + r.loc + "&sid=" + r.sid; this.postbj(args, null, { complete: function (request) { if (request.data.status == 1) { console.log("统计完成 :", request.data); } else { console.log("统计失败:", request.data); } }, error: function (request) { console.log("错误消息:", request.data); } }); }; YQSdk.exposure = function () { var d = this.exposureData(); if (d.length == 0) return; var url = "https://api.yz061.com/exposure"; var channel = Sdk_1.WxApi.querychannel; if (!channel) channel = "own"; var r = { data: d, gflg: this.flg, channel: channel }; var args = JSON.stringify(r); this.postbj(url, args, { complete: function (request) { if (request.data.status == 1) { console.log("曝光成功 :", request.data); } else { console.log("曝光失败:", request.data); } }, error: function (request) { console.log("错误消息:", request); } }, true); this.CleraData(); }; YQSdk.exposureData = function () { var data = []; for (var i = 0; i < RecommendView_1.Recommend.cainixihuanData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["C"] || !RecommendView_1.Recommend.recommendDic["C"].location_id == undefined) continue; var c = { ad_id: RecommendView_1.Recommend.cainixihuanData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["C"].location_id.toString(), num: RecommendView_1.Recommend.cainixihuanData[i].shownum.toString() }; if (RecommendView_1.Recommend.cainixihuanData[i].shownum != 0) { data.push(c); } } for (var i = 0; i < RecommendView_1.Recommend.jiesuanData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["JS"] || !RecommendView_1.Recommend.recommendDic["JS"].location_id == undefined) continue; var c2 = { ad_id: RecommendView_1.Recommend.jiesuanData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["FH"].location_id.toString(), num: RecommendView_1.Recommend.jiesuanData[i].shownum.toString() }; if (RecommendView_1.Recommend.jiesuanData[i].shownum != 0) { data.push(c2); } } for (var i = 0; i < RecommendView_1.Recommend.gdyxData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["GDYX"] || !RecommendView_1.Recommend.recommendDic["GDYX"].location_id == undefined) continue; var s = { ad_id: RecommendView_1.Recommend.gdyxData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["GDYX"].location_id.toString(), num: RecommendView_1.Recommend.gdyxData[i].shownum.toString() }; if (RecommendView_1.Recommend.gdyxData[i].shownum != 0) { data.push(s); } } for (var i = 0; i < RecommendView_1.Recommend.baokuanyouxiData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["B"] || !RecommendView_1.Recommend.recommendDic["B"].location_id == undefined) continue; var s = { ad_id: RecommendView_1.Recommend.baokuanyouxiData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["B"].location_id.toString(), num: RecommendView_1.Recommend.baokuanyouxiData[i].shownum.toString() }; if (RecommendView_1.Recommend.baokuanyouxiData[i].shownum != 0) { data.push(s); } } return data; }; YQSdk.CleraData = function () { var data = []; for (var i = 0; i < RecommendView_1.Recommend.cainixihuanData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["C"] || !RecommendView_1.Recommend.recommendDic["C"].location_id == undefined) continue; RecommendView_1.Recommend.cainixihuanData[i].shownum = 0; } for (var i = 0; i < RecommendView_1.Recommend.jiesuanData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["JS"] || !RecommendView_1.Recommend.recommendDic["JS"].location_id == undefined) continue; RecommendView_1.Recommend.cainixihuanData[i].shownum = 0; } for (var i = 0; i < RecommendView_1.Recommend.gdyxData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["GDYX"] || !RecommendView_1.Recommend.recommendDic["GDYX"].location_id == undefined) continue; var s = { ad_id: RecommendView_1.Recommend.gdyxData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["GDYX"].location_id.toString(), num: RecommendView_1.Recommend.gdyxData[i].shownum.toString() }; RecommendView_1.Recommend.cainixihuanData[i].shownum = 0; } for (var i = 0; i < RecommendView_1.Recommend.baokuanyouxiData.length; i++) { if (!RecommendView_1.Recommend.recommendDic["B"] || !RecommendView_1.Recommend.recommendDic["B"].location_id == undefined) continue; var s = { ad_id: RecommendView_1.Recommend.baokuanyouxiData[i].ad_id.toString(), location_id: RecommendView_1.Recommend.recommendDic["B"].location_id.toString(), num: RecommendView_1.Recommend.baokuanyouxiData[i].shownum.toString() }; RecommendView_1.Recommend.baokuanyouxiData[i].shownum = 0; } }; YQSdk.prototype.showOpenHander = function () { }; YQSdk.ShowBannerImag = function (callback) { var _this = this; if (callback === void 0) { callback = null; } //960*334 console.log("ShowBannerImag"); if (!this.banner_data) return; if (this.bannerImag) { this.bannerindex += 1; if (this.bannerindex >= this.banner_data.length) this.bannerindex = 0; this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img; this.appId = this.banner_data[this.bannerindex].ad_appid; this.path = this.banner_data[this.bannerindex].ad_path; this.ad_id = this.banner_data[this.bannerindex].ad_id; // this.bannerImag.visible=true; } else { this.bannerImag = new Laya.Image(); console.log("new Laya.Image"); this.bannerImag.visible = false; Laya.stage.addChild(this.bannerImag); this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img; this.height = Laya.stage.width / 960 * 334; this.bannerImag.width = Laya.stage.width; this.bannerImag.height = this.height; console.log(" this.bannerImag.height:" + this.bannerImag.height); this.bannerImag.x = 0; this.bannerImag.y = Laya.stage.height - this.height; this.bannerImag.zOrder = 2; this.bannerImag.on(Laya.Event.CLICK, this, function () { var adPosition = YQSdk.adPositionDic.getValue("banner"); var location_id = adPosition.location_id; Laya.Browser.onWeiXin && Laya.Browser.window.wx.navigateToMiniProgram({ "appId": _this.appId, "path": _this.path, success: function (res) { console.log("上报操作成功!" + res); YQSdk.reportad(_this.ad_id, location_id, true); }, fail: function (res) { YQSdk.reportad(_this.ad_id, location_id); console.log("上报操作失败" + res); } }); }); } this.appId = this.banner_data[this.bannerindex].ad_appid; this.path = this.banner_data[this.bannerindex].ad_path; this.ad_id = this.banner_data[this.bannerindex].ad_id; this.Add_BannerData(this.ad_id.toString()); Laya.timer.once(500, this, function () { if (_this.bannerImag) { _this.bannerImag.visible = true; if (callback != null) { if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner && GuangGao_1.default.cancheat) { callback(_this.height); } else { callback(300); } } } else { callback(300); } }); Laya.timer.clear(this, this.BannerLoop); var looprate = GameUtils_1.GameUtils.randRangeint(7, 10) * 1000; Laya.timer.loop(looprate, this, this.BannerLoop); }; YQSdk.BannerLoop = function () { if (this.bannerImag) { this.bannerindex += 1; if (this.bannerindex >= this.banner_data.length) this.bannerindex = 0; this.bannerImag.skin = this.banner_data[this.bannerindex].ad_img; this.appId = this.banner_data[this.bannerindex].ad_appid; this.path = this.banner_data[this.bannerindex].ad_path; this.ad_id = this.banner_data[this.bannerindex].ad_id; } }; YQSdk.HideBannerImage = function () { if (this.bannerImag && this.bannerImag.visible) { this.bannerImag.visible = false; } }; YQSdk.Add_BannerData = function (ad_id) { for (var index = 0; index < this.banner_data.length; index++) { var element = this.banner_data[index]; if (element.ad_id == ad_id) { element.num = (Number(element.num) + 1).toString(); return; } } var d = { ad_id: ad_id, location_id: this.adPositionDic["banner"].location_id.toString(), num: "1" }; this.banner_data.push(d); }; YQSdk.flg = "sgpyp"; YQSdk.getad = false; YQSdk.getc = false; YQSdk.getgdyx = false; YQSdk.getbanner = false; YQSdk.getjs = false; YQSdk.getb = false; YQSdk.gettc = false; YQSdk.adPositionDic = new Dictionary_1.default(); YQSdk.bannerindex = 0; YQSdk.height = 0; return YQSdk; }()); exports.YQSdk = YQSdk; },{"../../../utils/Dictionary":86,"../../../utils/GameUtils":87,"./GuangGao":73,"./PlayerAccount":74,"./Sdk":75,"./cpa/RecommendView":82}],78:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView"); var CpaEvent_1 = require("./CpaEvent"); var PlayerAccount_1 = require("../PlayerAccount"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../../../../frameworks/TimerService"); var BaoKuanGameView = /** @class */ (function (_super) { __extends(BaoKuanGameView, _super); function BaoKuanGameView() { var _this = _super.call(this) || this; _this._time = 0; _this.key = 0; _this._istart = false; return _this; } BaoKuanGameView.prototype.onInit = function () { this.initView(); this.initEvent(); }; BaoKuanGameView.prototype.initView = function () { this.c_state = this.getController("c_state"); this.t0 = this.getTransition("t0"); this.c_state.selectedIndex = 0; }; BaoKuanGameView.prototype.initEvent = function () { this.addDataEvent(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler); }; BaoKuanGameView.prototype.yqhomedataHandler = function () { this.RefreshBKYX(); TimerService_1.default.instance.addUpdateTarget(this); }; BaoKuanGameView.prototype.update = function (dt) { if (this._istart) { this._time += dt; if (this._time >= 5000) { this._time = 0; this.RefreshBKYX(true); } } }; BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) { if (isanmo === void 0) { isanmo = false; } if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend) return; this.c_state.selectedIndex = 1; var datas = RecommendView_1.Recommend.gdyxData; var item; for (var i = 0; i < 4; i++) { if (this.key + i >= datas.length - 1) { this.key = 0; } var curdata = datas[this.key + i]; item = this["item_" + i]; item.showData(curdata); if (curdata == null) continue; curdata.shownum++; } this.key += 4; if (this.key >= datas.length - 1) { this.key = 0; } this._istart = true; if (isanmo) { this.t0.play(null, 1); } }; return BaoKuanGameView; }(ChildBaseView_1.default)); exports.default = BaoKuanGameView; },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"../PlayerAccount":74,"./CpaEvent":81,"./RecommendView":82}],79:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../../../frameworks/mvc/BaseView"); var RecommendView_1 = require("./RecommendView"); var UiManager_1 = require("../../../../managers/UiManager"); var TimerService_1 = require("../../../../frameworks/TimerService"); var ChoutiPanView = /** @class */ (function (_super) { __extends(ChoutiPanView, _super); function ChoutiPanView() { var _this = _super.call(this, "main", "choutipanView") || this; _this._iscanmove = false; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; return _this; } ChoutiPanView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this.list_1.setVirtual(); this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false); this._nowList0 = RecommendView_1.Recommend.gdyxData; this._nowList1 = RecommendView_1.Recommend.gdyxData; this.list_0.numItems = this._nowList0.length; this.list_1.numItems = this._nowList1.length; this._isStart = true; this._iscanmove = true; TimerService_1.default.instance.addUpdateTarget(this); }; ChoutiPanView.prototype.initEvent = function () { this.addListener(this.btn_return, Laya.Event.CLICK, this, this.onclosefun); this.addListener(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun); this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick); this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick); this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick); }; ChoutiPanView.prototype.itemrenderlist = function (index, item) { if (index < this._nowList0.length) { item.showData(this._nowList0[index]); } }; ChoutiPanView.prototype.itemrenderlist1 = function (index, item) { if (index < this._nowList1.length) { item.showData(this._nowList1[index]); } }; ChoutiPanView.prototype.downclick = function () { this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); }; ChoutiPanView.prototype.timeoutCallback = function () { this._iscanmove = true; }; ChoutiPanView.prototype.upclick = function () { if (this._isdown) { this._isdown = false; this._nowvalue = this.list_0.scrollPane.percX; Laya.timer.once(2000, this, this.timeoutCallback); } }; ChoutiPanView.prototype.update = function (dt) { if (this._isStart) { if (this.list_0.scrollPane && this._nowList0 && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_0.scrollPane.setPercX(this._nowvalue); } } }; ChoutiPanView.prototype.onclosefun = function () { UiManager_1.UiManager.instance.close(ChoutiPanView); }; ChoutiPanView.prototype.destory = function () { TimerService_1.default.instance.removeUpdateTarget(this); _super.prototype.destory.call(this); }; ChoutiPanView.key = "ChoutiPanView"; return ChoutiPanView; }(BaseView_1.default)); exports.default = ChoutiPanView; },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/BaseView":20,"../../../../managers/UiManager":66,"./RecommendView":82}],80:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView"); var CpaEvent_1 = require("./CpaEvent"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../../../../frameworks/TimerService"); var CpaDownsView = /** @class */ (function (_super) { __extends(CpaDownsView, _super); function CpaDownsView() { var _this = _super.call(this) || this; _this._iscanmove = false; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; return _this; } CpaDownsView.prototype.onInit = function () { this.c_state = this.getController("c_state"); this.c_state.selectedIndex = 0; this.initView(); this.initEvent(); }; CpaDownsView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this._isStart = false; }; CpaDownsView.prototype.initEvent = function () { this.addDataEvent(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler); this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick); this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick); this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick); }; CpaDownsView.prototype.downclick = function () { this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); }; CpaDownsView.prototype.timeoutCallback = function () { this._iscanmove = true; }; CpaDownsView.prototype.upclick = function () { if (this._isdown) { this._isdown = false; this._nowvalue = this.list_0.scrollPane.percX; Laya.timer.once(2000, this, this.timeoutCallback); } }; CpaDownsView.prototype.update = function (dt) { if (this._isStart) { if (this.list_0.scrollPane && this._nowList && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_0.scrollPane.setPercX(this._nowvalue); } } }; CpaDownsView.prototype.itemrenderlist = function (index, item) { if (index < this._nowList.length) { item.showData(this._nowList[index]); } }; CpaDownsView.prototype.yqhomedataHandler = function () { this.c_state.selectedIndex = 1; this._nowList = RecommendView_1.Recommend.cainixihuanData; this.list_0.numItems = this._nowList.length; for (var i = 0; i < this._nowList.length; i++) { this._nowList[i].shownum++; } this._isStart = true; this._iscanmove = true; TimerService_1.default.instance.addUpdateTarget(this); }; CpaDownsView.prototype.dispose = function () { TimerService_1.default.getInastance().removeUpdateTarget(this); _super.prototype.dispose.call(this); }; return CpaDownsView; }(ChildBaseView_1.default)); exports.default = CpaDownsView; },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"./CpaEvent":81,"./RecommendView":82}],81:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CpaEvent = /** @class */ (function () { function CpaEvent() { } CpaEvent.YQHomeData = "CpaEvent_YQHomeData"; return CpaEvent; }()); exports.default = CpaEvent; },{}],82:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var YQSdk_1 = require("../YQSdk"); var EventUtils_1 = require("../../../../frameworks/events/EventUtils"); var CpaEvent_1 = require("./CpaEvent"); var recommendPan = /** @class */ (function () { function recommendPan(data) { this.game_flg = data["game_flg"]; this.game_id = data["game_id"]; this.game_name = data["game_name"]; this.id = data["id"]; this.location_flg = data["location_flg"]; this.location_id = data["location_id"]; this.location_name = data["location_name"]; this.matter_type = data["matter_type"]; } return recommendPan; }()); exports.recommendPan = recommendPan; var Recommend = /** @class */ (function () { function Recommend() { Recommend.InitData(); } Recommend.InitData = function () { Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas(); Recommend.jiesuanData = Recommend.GetJIeSuanDatas(); Recommend.gdyxData = Recommend.GetGDYXDatas(); Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas(); Recommend.moreData = Recommend.GetMoreDatas(); for (var key in YQSdk_1.YQSdk.adPosition) { Recommend.recommendDic[YQSdk_1.YQSdk.adPosition[key].location_flg] = new recommendPan(YQSdk_1.YQSdk.adPosition[key]); } YQSdk_1.YQSdk.GetShare(); Recommend.getdata = true; EventUtils_1.EventUtils.dispatchEvent(CpaEvent_1.default.YQHomeData); }; Recommend.GetCaiNiXiaHuanDatas = function () { var items = []; if (!YQSdk_1.YQSdk.cainixihuan) return items; for (var i = 0; i < YQSdk_1.YQSdk.cainixihuan.length; i++) { items.push(new RecommendItem(YQSdk_1.YQSdk.cainixihuan[i])); items[i].shownum++; } return items; }; Recommend.GetMoreDatas = function () { var items = []; if (!YQSdk_1.YQSdk.tc) return items; for (var i = 0; i < YQSdk_1.YQSdk.tc.length; i++) { items.push(new RecommendItem(YQSdk_1.YQSdk.tc[i])); items[i].shownum++; } return items; }; Recommend.GetBaoKuanYouXiDatas = function () { var items = []; if (!YQSdk_1.YQSdk.baokuanyouxi1) return items; for (var i = 0; i < YQSdk_1.YQSdk.baokuanyouxi1.length; i++) { items.push(new RecommendItem(YQSdk_1.YQSdk.baokuanyouxi1[i])); items[i].shownum++; } return items; }; Recommend.GetJIeSuanDatas = function () { var items = []; if (!YQSdk_1.YQSdk.js) return items; for (var i = 0; i < YQSdk_1.YQSdk.js.length; i++) { items.push(new RecommendItem(YQSdk_1.YQSdk.js[i])); items[i].shownum++; } return items; }; Recommend.GetGDYXDatas = function () { var items = []; if (!YQSdk_1.YQSdk.gdyy) return items; for (var i = 0; i < YQSdk_1.YQSdk.gdyy.length; i++) { items.push(new RecommendItem(YQSdk_1.YQSdk.gdyy[i])); items[i].shownum++; } return items; }; Recommend.getdata = false; Recommend.recommendDic = {}; Recommend.cainixihuanData = []; Recommend.baokuanyouxiData = []; Recommend.gdyxData = []; Recommend.jiesuanData = []; Recommend.moreData = []; return Recommend; }()); exports.Recommend = Recommend; var RecommendItem = /** @class */ (function () { function RecommendItem(Data) { this.shownum = 0; this.ad_appid = Data["ad_appid"]; this.ad_count = Data["ad_count"]; this.ad_device = Data["ad_device"]; this.ad_dot = Data["ad_dot"]; this.ad_id = Data["ad_id"]; this.ad_img = Data["ad_img"]; this.ad_name = Data["ad_name"]; this.ad_path = Data["ad_path"]; } return RecommendItem; }()); exports.RecommendItem = RecommendItem; var RecommendView = /** @class */ (function () { function RecommendView() { } return RecommendView; }()); exports.default = RecommendView; },{"../../../../frameworks/events/EventUtils":16,"../YQSdk":77,"./CpaEvent":81}],83:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ChildBaseView_1 = require("../../../../frameworks/mvc/ChildBaseView"); var RecommendView_1 = require("./RecommendView"); var TimerService_1 = require("../../../../frameworks/TimerService"); var ShiwantuijianView = /** @class */ (function (_super) { __extends(ShiwantuijianView, _super); function ShiwantuijianView() { var _this = _super.call(this) || this; _this._iscanmove = false; _this._movetime = 0; _this._flushtime = 0; _this.dir = true; _this._nowvalue = 0; return _this; } ShiwantuijianView.prototype.onInit = function () { this.initView(); this.initEvent(); }; ShiwantuijianView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this._nowlist = RecommendView_1.Recommend.jiesuanData; if (this._nowlist.length > 0) { this.list_0.numItems = this._nowlist.length; this.visible = true; for (var i = 0; i < this._nowlist.length; i++) { this._nowlist[i].shownum++; } this._isStart = true; this._iscanmove = true; TimerService_1.default.instance.addUpdateTarget(this); } else { this.visible = false; } }; ShiwantuijianView.prototype.initEvent = function () { this.addListener(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick); this.addListener(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick); this.addListener(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick); }; ShiwantuijianView.prototype.downclick = function () { this._isdown = true; this._iscanmove = false; Laya.timer.clear(this, this.timeoutCallback); }; ShiwantuijianView.prototype.timeoutCallback = function () { this._iscanmove = true; }; ShiwantuijianView.prototype.upclick = function () { if (this._isdown) { this._isdown = false; this._nowvalue = this.list_0.scrollPane.percY; Laya.timer.once(2000, this, this.timeoutCallback); } }; ShiwantuijianView.prototype.itemrenderlist = function (index, item) { if (index < this._nowlist.length) { item.showData(this._nowlist[index], true); } }; ShiwantuijianView.prototype.update = function (dt) { if (this._isStart) { if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) { if (this.dir) { this._nowvalue += 0.001; if (this._nowvalue >= 1) { this._nowvalue = 1; this.dir = false; } } else { this._nowvalue -= 0.001; if (this._nowvalue <= 0) { this._nowvalue = 0; this.dir = true; } } this.list_0.scrollPane.setPercY(this._nowvalue); } } }; ShiwantuijianView.prototype.dispose = function () { this._iscanmove = false; TimerService_1.default.instance.removeUpdateTarget(this); _super.prototype.dispose.call(this); }; return ShiwantuijianView; }(ChildBaseView_1.default)); exports.default = ShiwantuijianView; },{"../../../../frameworks/TimerService":13,"../../../../frameworks/mvc/ChildBaseView":21,"./RecommendView":82}],84:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseView_1 = require("../../../../frameworks/mvc/BaseView"); var RecommendView_1 = require("./RecommendView"); var UiManager_1 = require("../../../../managers/UiManager"); var TuijianView = /** @class */ (function (_super) { __extends(TuijianView, _super); function TuijianView() { return _super.call(this, "main", "tuijianView") || this; } TuijianView.prototype.initView = function () { this.list_0.setVirtual(); this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false); this._nowlist = RecommendView_1.Recommend.gdyxData; this.list_0.numItems = this._nowlist.length; }; TuijianView.prototype.initEvent = function () { this.addListener(this.btn_close, Laya.Event.CLICK, this, this.onclosefun); }; TuijianView.prototype.itemrenderlist = function (index, item) { if (index < this._nowlist.length) { item.showData(this._nowlist[index]); } }; TuijianView.prototype.onclosefun = function () { UiManager_1.UiManager.instance.close(TuijianView); }; TuijianView.key = "TuijianView"; return TuijianView; }(BaseView_1.default)); exports.default = TuijianView; },{"../../../../frameworks/mvc/BaseView":20,"../../../../managers/UiManager":66,"./RecommendView":82}],85:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ChildBaseView_1 = require("../../../../../frameworks/mvc/ChildBaseView"); var RecommendView_1 = require("../RecommendView"); var Sdk_1 = require("../../Sdk"); var YQSdk_1 = require("../../YQSdk"); var GameUtils_1 = require("../../../../../utils/GameUtils"); var UiManager_1 = require("../../../../../managers/UiManager"); var ChoutiPanView_1 = require("../ChoutiPanView"); var CpaItem = /** @class */ (function (_super) { __extends(CpaItem, _super); function CpaItem() { var _this = _super.call(this) || this; _this.ispenchoutipan = false; return _this; } CpaItem.prototype.onInit = function () { this.name = "capItem"; this.addListener(this, Laya.Event.CLICK, this, this.onbtnclick); }; CpaItem.prototype.onbtnclick = function () { var _this = this; if (this._vo) { var data = this._vo; var appid = data.ad_appid; var path = data.ad_path; var param = { "appId": appid.toString(), "path": path.toString() }; if (Laya.Browser.onWeiXin) { Sdk_1.WxApi.recordAldEvent("点击跳转到游戏" + data.ad_name, "1"); Laya.Browser.window.wx.navigateToMiniProgram({ appId: appid.toString(), path: path.toString(), success: function (res) { Sdk_1.WxApi.recordAldEvent("跳转到游戏成功", "1"); var location_id = RecommendView_1.Recommend.recommendDic["C"].location_id; YQSdk_1.YQSdk.reportad(data.ad_id, location_id, true); }, fail: function (res) { Sdk_1.WxApi.recordAldEvent("跳转到游戏失败", "1"); var location_id = RecommendView_1.Recommend.recommendDic["C"].location_id; YQSdk_1.YQSdk.reportad(data.ad_id, location_id, false); if (_this.ispenchoutipan) { UiManager_1.UiManager.instance.add(ChoutiPanView_1.default); } // if(WindowManager.Instance.curOpenedView.name == "HomeWindow")this.OnOpenCtView(true); } }); } } }; CpaItem.prototype.showData = function (data, isopenchoutipan) { if (isopenchoutipan === void 0) { isopenchoutipan = false; } this.ispenchoutipan = isopenchoutipan; this._vo = data; if (data) { this.load_icon.url = data.ad_img; if (this.txt_word) { this.txt_word.text = data.ad_name; } if (this.img_tip) { this.img_tip.visible = data.ad_dot == 1 ? true : false; } if (this.txt_word1) { this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩"; } } }; return CpaItem; }(ChildBaseView_1.default)); exports.default = CpaItem; },{"../../../../../frameworks/mvc/ChildBaseView":21,"../../../../../managers/UiManager":66,"../../../../../utils/GameUtils":87,"../../Sdk":75,"../../YQSdk":77,"../ChoutiPanView":79,"../RecommendView":82}],86:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Dictionary = /** @class */ (function () { function Dictionary() { this.keys = new Array(); this.values = new Array(); } Object.defineProperty(Dictionary.prototype, "count", { get: function () { return this.keys.length; }, enumerable: true, configurable: true }); Dictionary.prototype.add = function (key, value) { var index = this.keys.indexOf(key); if (index == -1) { this.keys.push(key); this.values.push(value); } else { this.values[index] = value; } }; Dictionary.prototype.remove = function (key) { var index = this.keys.indexOf(key); if (index != -1) { this.keys.splice(index, 1); this.values.splice(index, 1); } }; Dictionary.prototype.getValue = function (key) { var index = this.keys.indexOf(key); if (index != -1) { return this.values[index]; } return null; }; Dictionary.prototype.containKey = function (key) { var index = this.keys.indexOf(key); if (index != -1) { return true; } return false; }; Dictionary.prototype.containValue = function (value) { var index = this.values.indexOf(value); if (index != -1) { return true; } return false; }; Dictionary.prototype.clear = function () { this.keys.length = 0; this.values.length = 0; }; return Dictionary; }()); exports.default = Dictionary; },{}],87:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * 公共接口 */ var GameUtils; (function (GameUtils) { /** * 随机函数(返回整型) */ function randRangeint(min, max) { var value = Math.floor(Math.random() * (max - min + 1)) + min; if (value > max) { value = max; } return value; } GameUtils.randRangeint = randRangeint; /** * 随机函数( 不取整 ) */ function randRangefloat(min, max) { var value = Math.random() * (max - min + 1) + min; if (value > max) { value = max; } return value; } GameUtils.randRangefloat = randRangefloat; function getTexbyPkgAndName(pkgname, texname) { var uipackage = fairygui.UIPackage.getByName(pkgname); if (uipackage) { return uipackage.getItemAssetByName(texname); } return null; } GameUtils.getTexbyPkgAndName = getTexbyPkgAndName; /** * 切割分号变成Point对象 * @param str */ function cutfenhaoPoint(str) { var arr = str.split(";"); return new Laya.Point(Number(arr[0]), Number(arr[1])); } GameUtils.cutfenhaoPoint = cutfenhaoPoint; /** * 切割分号变成数据(number) */ function cutfenhaotoArrnum(str) { var numArr = []; if (str == "") { return numArr; } var arr = str.split(";"); var i = 0; for (i; i < arr.length; i++) { numArr.push(Number(arr[i])); } return numArr; } GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum; /** * 切割分号变成数据(string) */ function cutfenhaotoArrstr(str) { return str.split(";"); } GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr; /** * 切割分号变成数据( { key:1,value:1 } ) */ function cutfenhaotoObj(str) { var obj = {}; var arr = str.split(";"); obj.key = arr[0]; obj.value = arr[1]; return obj; } GameUtils.cutfenhaotoObj = cutfenhaotoObj; /**切割str*/ function cutstrtoArr(str) { var arr = str.split("|"); return arr; } GameUtils.cutstrtoArr = cutstrtoArr; /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */ function cutstrtoArr1(str) { var reslutArr = []; var arr = str.split("|"); var i = 0; for (i = 0; i < arr.length; i++) { var itemarr = arr[i].split(";"); reslutArr.push({ key: itemarr[0], value: itemarr[1] }); } return reslutArr; } GameUtils.cutstrtoArr1 = cutstrtoArr1; function cutstrtoObj(str) { var resultobj = {}; var arr = str.split("|"); var i = 0; for (i = 0; i < arr.length; i++) { var itemarr = arr[i].split(";"); resultobj[itemarr[0]] = itemarr[1]; } return resultobj; } GameUtils.cutstrtoObj = cutstrtoObj; function compareVersion(v1, v2) { v1 = v1.split('.'); v2 = v2.split('.'); var len = Math.max(v1.length, v2.length); while (v1.length < len) { v1.push('0'); } while (v2.length < len) { v2.push('0'); } for (var i = 0; i < len; i++) { var num1 = parseInt(v1[i]); var num2 = parseInt(v2[i]); if (num1 > num2) { return 1; } else if (num1 < num2) { return -1; } } return 0; } GameUtils.compareVersion = compareVersion; })(GameUtils = exports.GameUtils || (exports.GameUtils = {})); },{}],88:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TimeUtils; (function (TimeUtils) { /** * 月/日 小时:分钟 * @param value */ function formatData(value) { var str = ""; var date = new Date(value * 1000); str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes()); return str; } TimeUtils.formatData = formatData; /** * 月/日 * @param value */ function formatData1(value) { var str = ""; var date = new Date(value * 1000); str = (date.getMonth() + 1) + "月" + date.getDate() + "日"; return str; } TimeUtils.formatData1 = formatData1; /** * 年月日 * @param value */ function formatYearMonthDate(value) { var str = ""; var date = new Date(value * 1000); str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate(); return str; } TimeUtils.formatYearMonthDate = formatYearMonthDate; /** * 年-月-日 * @param value */ function formatYearMonthDate1(value) { var str = ""; var date = new Date(value * 1000); var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1); var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate(); str = date.getFullYear() + "-" + month + "-" + dates; return str; } TimeUtils.formatYearMonthDate1 = formatYearMonthDate1; function LXandJXTimeType(value) { var str = ""; if (value < 0) { str = "0秒"; } else if (value < 60) { str = Math.floor(value) + "秒"; } else if (value < 60 * 60) { str = Math.floor(value / 60) + "分钟"; } else { var hour; hour = Math.floor(value / 60 / 60); str = hour + "小时"; str += Math.floor((value - hour * 60 * 60) / 60) + "分钟"; } return str; } TimeUtils.LXandJXTimeType = LXandJXTimeType; /** * 格式化时间 * @param time 秒 * @return 返回24:59:59 */ function formatTime(time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours >= 10 ? (hours + ":") : ("0" + hours + ":"); } var minutes = Math.floor((time % 3600) / 60); str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":"); var second = Math.floor(time % 60); str += second >= 10 ? (second + "") : ("0" + second); return str; } TimeUtils.formatTime = formatTime; /** * 格式化时间 * @param time 秒 * @return 返回24小时59分59秒 */ function formatTime1(time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); str += minutes + "分钟"; var second = Math.floor(time % 60); str += second + "秒"; return str; } TimeUtils.formatTime1 = formatTime1; /** * 格式化时间 * @param time 秒 * @return 返回1小时24分10秒 */ function formatTime5(time) { var str = ""; var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分"; } var second = Math.floor(time % 60); str += second + "秒"; return str; } TimeUtils.formatTime5 = formatTime5; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分59秒 */ function formatTime2(time) { var str = ""; var day = Math.floor(time / 86400); if (day > 0) { str += day + "天"; } var hours = Math.floor(time / 3600); if (hours > 0) { str += hours + "小时"; } var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分钟"; } var second = Math.ceil(time % 60); str += second + "秒"; return str; } TimeUtils.formatTime2 = formatTime2; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时( 只保留两个 ) */ function formatTime6(time) { var str = ""; var index = 0; var day = Math.floor(time / 86400); if (day > 0) { str += day + "天"; index++; } var hours = Math.floor((time % 86400) / 3600); if (hours > 0) { str += hours + "小时"; index++; } if (index < 2) { var minutes = Math.floor((time % 3600) / 60); if (minutes > 0) { str += minutes + "分"; index++; } } if (index < 2) { var second = Math.ceil(time % 60); str += second + "秒"; } return str; } TimeUtils.formatTime6 = formatTime6; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ function formatTime3(time) { var str = ""; var day = Math.floor(time / 86400); str += day + "天"; var hours = Math.floor(time % 86400 / 3600); str += hours + "小时"; var minutes = Math.floor((time % 86400 % 3600) / 60); str += minutes + "分"; return str; } TimeUtils.formatTime3 = formatTime3; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ function formatTime4(time) { var str = ""; if (time > 86400) { var day = Math.floor(time / 86400); str += day + "天"; } if (time > 3600) { var hours = Math.floor(time % 86400 / 3600); str += hours + "小时"; } if (time > 60) { var minutes = Math.floor((time % 86400 % 3600) / 60); str += minutes + "分钟"; } return str; } TimeUtils.formatTime4 = formatTime4; /** * 格式化时间 * @param time 秒 * @return 返回1天24小时59分 */ function formatTime4Arr(time) { var arrTime = []; var str = ""; // if (time >= 86400) { // var day: number = Math.floor(time / 86400); // arrTime.unshift(String(day)); // } if (time >= 3600) { var hours = Math.floor(time % 86400 / 3600); arrTime.unshift(String(hours)); } if (time >= 60) { var minutes = Math.floor((time % 86400 % 3600) / 60); arrTime.unshift(String(minutes)); } return arrTime; } TimeUtils.formatTime4Arr = formatTime4Arr; function getTwo(value) { var str = String(value); if (str.length < 2) { str = "0" + str; } return str; } TimeUtils.getTwo = getTwo; /** * 日期转时间戳 * @param str 2018-1-1 */ function datetoTime(str) { return Date.parse(str) / 1000; } TimeUtils.datetoTime = datetoTime; })(TimeUtils = exports.TimeUtils || (exports.TimeUtils = {})); },{}]},{},[4]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkQ6L0xheWFBaXJJREUyLjEuMS4xL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9HYW1lQ29udGVudHMudHMiLCJzcmMvR2xvYmFsLnRzIiwic3JjL0dsb2JhbFdhaXRpbmcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9jb25maWdzL2RhdGFDb25maWdzL0J1aWxkQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGRy50cyIsInNyYy9jb25maWdzL2RhdGFDb25maWdzL0xldmVsQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvTnBjQ0ZHLnRzIiwic3JjL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGRy50cyIsInNyYy9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWcudHMiLCJzcmMvY29uZmlncy9nYW1lQ29uZmlncy9SZWNDb25maWdzLnRzIiwic3JjL2ZyYW1ld29ya3MvRGVidWdlci50cyIsInNyYy9mcmFtZXdvcmtzL1RpbWVyU2VydmljZS50cyIsInNyYy9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyLnRzIiwic3JjL2ZyYW1ld29ya3MvZXZlbnRzL0NvbUV2ZW50Vk8udHMiLCJzcmMvZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlscy50cyIsInNyYy9mcmFtZXdvcmtzL2V2ZW50cy9MRXZlbnQudHMiLCJzcmMvZnJhbWV3b3Jrcy9ldmVudHMvTExpc3RlbmVyLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXMudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXcudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvQ2hpbGRCYXNlVmlldy50cyIsInNyYy9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL09iamVjdFBvb2wudHMiLCJzcmMvZnJhbWV3b3Jrcy9tdmMvU2luZ2xldG9uLnRzIiwic3JjL2ZyYW1ld29ya3MvbXZjL1dpbmRvd0FubW9UeXBlLnRzIiwic3JjL2ZyYW1ld29ya3MvbmV0L0dhbWVIdHRwcy50cyIsInNyYy9mcmFtZXdvcmtzL25ldC9HYW1lU29ja2V0LnRzIiwic3JjL2ZyYW1ld29ya3MvbmV0L1RvbmdqaUh0dHBzLnRzIiwic3JjL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5LnRzIiwic3JjL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL1NvY2tldE5vZmlmeS50cyIsInNyYy9mcmFtZXdvcmtzL3ZvL0Jhc2VWTy50cyIsInNyYy9mcmFtZXdvcmtzL3ZvL0NhY2hlVk8udHMiLCJzcmMvZ2FtZW1vZHVsZS9qb3lzdGljay9Kb3lzdGlja01vZHVsZS50cyIsInNyYy9nYW1lbW9kdWxlL2xvYWRpbmcvcHJveHlzL0xvZ2luUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9sb2FkaW5nL3ZpZXcvTG9hZGluZ1ZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlscy50cyIsInNyYy9nYW1lbW9kdWxlL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1ZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL0dhbWVTdGF0ZU1hbmFnZXIudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3Byb3h5cy9HYW1lUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3Byb3h5cy9NYWluUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS9tYWluL3ZpZXcvTWFpblZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9tb2RlbFNjcmlwdHMvQ2FtZXJhc1NjcmlwdC50cyIsInNyYy9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9NYWluUm9sZVNjcmlwdC50cyIsInNyYy9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9OcGNTY3JpcHQudHMiLCJzcmMvZ2FtZW1vZHVsZS9yZXN1bHQvR2FtZVJlc3VsdFZpZXcudHMiLCJzcmMvZ2FtZW1vZHVsZS9zY2VuZTNkcy9Sb2xlQWN0aW9ucy50cyIsInNyYy9nYW1lbW9kdWxlL3NjZW5lM2RzL1JvbGVzUG9vbC50cyIsInNyYy9nYW1lbW9kdWxlL3NjZW5lM2RzL1NjZW5lM2RPYmplY3QudHMiLCJzcmMvZ2FtZW1vZHVsZS9za2lucy9QaWZ1SXRlbS50cyIsInNyYy9nYW1lbW9kdWxlL3NraW5zL1NraW5WaWV3LnRzIiwic3JjL2dhbWVtb2R1bGUvc2tpbnMvcHJveHlzL1NraW5Qcm94eS50cyIsInNyYy9nYW1lbW9kdWxlL3NraW5zL3ZvL1BpRnVWTy50cyIsInNyYy9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHkudHMiLCJzcmMvZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50LnRzIiwic3JjL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJDYWNoZVR5cGUudHMiLCJzcmMvZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckluZm9FdmVudC50cyIsInNyYy9nYW1lbW9kdWxlL3VzZXJpbmZvL3ZvL1JvbGVWTy50cyIsInNyYy9tYW5hZ2Vycy9CaW5kZXJNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL0NhY2hlTWFuYWdlci50cyIsInNyYy9tYW5hZ2Vycy9EYXlNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL0dhbWVMYXllck1hbmFnZXIudHMiLCJzcmMvbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXIudHMiLCJzcmMvbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1NjZW5lM0RNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyLnRzIiwic3JjL21hbmFnZXJzL1VpTWFuYWdlci50cyIsInNyYy9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2wudHMiLCJzcmMvcGxhdGZvcm0vUGxhdGZyb21UeXBlLnRzIiwic3JjL3BsYXRmb3JtL2V2ZW50cy9QbGF0Zm9ybUV2ZW50LnRzIiwic3JjL3BsYXRmb3JtL3R5cGVzL1JhbmtUeXBlLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvTmV0d29ya01hbmFnZXIudHMiLCJzcmMvcGxhdGZvcm0vd3htaW5pZ2FtZS9XWEdhbWVQbGF0Zm9ybS50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL0d1YW5nR2FvLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1Nkay50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1NoYXJlVXRpbC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1lRU2RrLnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0Jhb0t1YW5HYW1lVmlldy50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DaG91dGlQYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0NwYURvd25zVmlldy50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DcGFFdmVudC50cyIsInNyYy9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9SZWNvbW1lbmRWaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL1NoaXdhbnR1aWppYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL1R1aWppYW5WaWV3LnRzIiwic3JjL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL2l0ZW0vQ3BhSXRlbS50cyIsInNyYy91dGlscy9EaWN0aW9uYXJ5LnRzIiwic3JjL3V0aWxzL0dhbWVVdGlscy50cyIsInNyYy91dGlscy9UaW1lVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsbUNBQWtDO0FBQ2xDLGdFQUEyRDtBQUMzRCxnREFBMkM7QUFDM0MsNkRBQTREO0FBRTVELDZEQUF3RDtBQUN4RCwrREFBMEQ7QUFDMUQsd0RBQXVEO0FBQ3ZELCtEQUE4RDtBQUM5RCwwREFBcUQ7QUFDckQsaURBQTRDO0FBQzVDLHNEQUFpRDtBQUNqRCwwREFBcUQ7QUFDckQsZ0VBQStEO0FBQy9ELGtEQUFpRDtBQUNqRCw4REFBeUQ7QUFDekQsNERBQXVEO0FBQ3ZELDREQUF1RDtBQUN2RCwwREFBeUQ7QUFDekQsd0RBQW1EO0FBQ25ELHFFQUFnRTtBQUNoRSxxRUFBZ0U7QUFDaEUsZ0VBQTJEO0FBQzNELGdFQUEyRDtBQUMzRCxpRUFBNEQ7QUFFNUQ7O0VBRUU7QUFDRjtJQUFrQyxnQ0FBb0I7SUFFbEQ7ZUFDSSxpQkFBTztJQUNYLENBQUM7SUFDRDs7T0FFRztJQUNJLCtCQUFRLEdBQWY7UUFFSSxvQkFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLHVCQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsc0JBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxtQ0FBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMzQyxxQkFBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLHlCQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsd0JBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLDZCQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUIseUJBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQyxzQkFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNLLHFDQUFjLEdBQXRCO1FBRUksb0JBQVUsQ0FBQyxRQUFRLENBQUUsb0JBQVUsQ0FBQyxPQUFPLEVBQUMsb0JBQVUsQ0FBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNLLGdDQUFTLEdBQWpCO1FBRUksSUFBSSxPQUFPLEdBQWlCLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEQsT0FBTyxDQUFDLFFBQVEsQ0FBRSxvQkFBVSxDQUFFLENBQUM7UUFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBRSx1QkFBYSxDQUFFLENBQUM7UUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBRSxtQkFBUyxDQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBRSxtQkFBUyxDQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBRSxtQkFBUyxDQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVPLGtDQUFXLEdBQW5CO1FBRUksSUFBSSxPQUFPLEdBQWlCLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEQsa0VBQWtFO0lBQ3RFLENBQUM7SUFFTyx1Q0FBZ0IsR0FBeEI7UUFFSSxJQUFJLE9BQU8sR0FBYyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBRSxFQUFFLEdBQUcsRUFBQyx1QkFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFFLENBQUM7UUFDMUUsT0FBTyxDQUFDLElBQUksQ0FBRSxFQUFFLEdBQUcsRUFBQyx1QkFBVSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFFLENBQUM7UUFDNUUseUJBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUUsT0FBTyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsZUFBZSxDQUFFLENBQUM7SUFDL0UsQ0FBQztJQUVPLHNDQUFlLEdBQXZCO1FBRUksSUFBSSxXQUFXLEdBQU8sd0JBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFFLHVCQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsS0FBSyxDQUFFLENBQUM7UUFDL0YsSUFBSSxXQUFXLEVBQ2Y7WUFDSSxlQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7U0FDNUM7YUFFRDtZQUNJLGVBQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1NBQ2hDO1FBQ0QsaUJBQU8sQ0FBQyxHQUFHLENBQUUsY0FBYyxHQUFHLGVBQU0sQ0FBQyxXQUFXLENBQUUsQ0FBQztRQUNuRCxJQUFJLFNBQVMsR0FBTyx3QkFBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUUsdUJBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBQyxLQUFLLENBQUUsQ0FBQztRQUMzRixvQkFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUUsU0FBUyxDQUFFLENBQUM7UUFDekMseUJBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBQyxJQUFJLENBQUMsYUFBYSxDQUFFLENBQUM7SUFDNUYsQ0FBQztJQUVPLG9DQUFhLEdBQXJCLFVBQXNCLEtBQVk7SUFHbEMsQ0FBQztJQUVPLGtDQUFXLEdBQW5CO1FBRUksd0JBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFFLFNBQVMsRUFBQyxJQUFJLEVBQUMsS0FBSyxDQUFFLENBQUM7UUFDN0QsSUFBSSxhQUFhLEdBQVUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BGLGtCQUFRLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUMxRSxRQUFRLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSx1QkFBYSxDQUFDLENBQUM7UUFDL0UsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7UUFDckQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxhQUFhLENBQUM7UUFDckQsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU0saUNBQVUsR0FBakI7UUFFSyx1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBRSxvQkFBVSxDQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BGLENBQUM7SUFDTCxtQkFBQztBQUFELENBcEdBLEFBb0dDLENBcEdpQyxJQUFJLENBQUMsZUFBZSxHQW9HckQ7QUFwR1ksb0NBQVk7Ozs7QUMzQnpCLElBQWMsTUFBTSxDQStFbkI7QUEvRUQsV0FBYyxNQUFNO0lBRUwsY0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLG9CQUFhLEdBQVUsRUFBRSxDQUFDO0lBRXhCLGFBQU0sR0FBVSw4QkFBOEIsQ0FBQztJQUU1RDs7T0FFRztJQUNRLGVBQVEsR0FBVSxFQUFFLENBQUMsQ0FBQSxhQUFhO0lBRWxDLGdCQUFTLEdBQVUsR0FBRyxDQUFDO0lBRXZCLGlCQUFVLEdBQVUsSUFBSSxDQUFDO0lBQ3BDOztPQUVHO0lBQ1EsdUJBQWdCLEdBQVUsRUFBRSxDQUFDO0lBQ3hDOztPQUVHO0lBQ1Esa0JBQVcsR0FBVSxFQUFFLENBQUM7SUFFbkM7O09BRUc7SUFDUSxZQUFLLEdBQVUsb0JBQW9CLENBQUM7SUFFL0M7O09BRUc7SUFDUSxrQkFBVyxHQUFVLE9BQU8sQ0FBQztJQUV4Qzs7T0FFRztJQUNVLGNBQU8sR0FBVyxLQUFLLENBQUM7SUFFMUIsZUFBUSxHQUFVLENBQUMsQ0FBQztJQUNwQixlQUFRLEdBQVUsQ0FBQyxDQUFDO0lBRy9CO1FBRUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBSGUsZ0JBQVMsWUFHeEIsQ0FBQTtJQUVEO1FBRUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBSGUsZUFBUSxXQUd2QixDQUFBO0lBRUQ7UUFFSSxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFKZSxjQUFPLFVBSXRCLENBQUE7SUFFRCxnQkFBd0IsR0FBVTtRQUU5QixJQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUUsQ0FBQyxDQUFDLEVBQzdCO1lBQ0ksT0FBTyxNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBUGUsYUFBTSxTQU9yQixDQUFBO0lBRUQ7UUFFSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQ2xCO1lBQ0ksTUFBTSxDQUFDLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQztTQUN0RDthQUVEO1lBQ0ksTUFBTSxDQUFDLE9BQU8sR0FBRywrQkFBK0IsQ0FBQztTQUNwRDtJQUNMLENBQUM7SUFWZSxpQkFBVSxhQVV6QixDQUFBO0FBQ0wsQ0FBQyxFQS9FYSxNQUFNLEdBQU4sY0FBTSxLQUFOLGNBQU0sUUErRW5COzs7O0FDaEZEO0lBQTJDLGlDQUFtQjtJQUsxRDtRQUFBLFlBQWdCLGlCQUFPLFNBQUc7UUFGbEIsa0JBQVksR0FBVyxLQUFLLENBQUM7UUFjN0IsZUFBUyxHQUFVLENBQUMsQ0FBQzs7SUFaSixDQUFDO0lBRWhCLHdDQUFnQixHQUExQixVQUEyQixHQUFPO1FBRTlCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLGlCQUFNLGdCQUFnQixZQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBR08sc0NBQWMsR0FBdEI7UUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLCtCQUFPLEdBQWY7UUFDSSxJQUFHLElBQUksQ0FBQyxLQUFLLEVBQ2I7WUFDSSxJQUFJLE9BQU8sR0FBVSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxHQUFVLE9BQU8sR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzVDLElBQUksT0FBTyxHQUFFLElBQUksSUFBSSxDQUFDLEVBQ3RCO2dCQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUN0QjtvQkFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQzdCO2dCQUNELElBQUksQ0FBQyxHQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNuQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNSLElBQUcsQ0FBQyxHQUFHLEdBQUc7b0JBQ04sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUMzQjtpQkFFRDtnQkFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDOUI7U0FDSjtJQUNMLENBQUM7SUFFTSwrQkFBTyxHQUFkO1FBRUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUNkO1lBQ0ksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVPLHlDQUFpQixHQUF6QjtRQUNJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNMLG9CQUFDO0FBQUQsQ0EzREEsQUEyREMsQ0EzRDBDLFFBQVEsQ0FBQyxVQUFVLEdBMkQ3RDs7Ozs7QUM1REQsbUNBQWtDO0FBQ2xDLElBQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDMUIsK0RBQThEO0FBQzlELCtDQUE4QztBQUM5Qyx1REFBd0Q7QUFDeEQ7SUFDQztRQUNDLGdCQUFnQjtRQUNWLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQU0sQ0FBQyxTQUFTLEVBQUUsZUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdEYsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFDeEI7WUFDSSxXQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixXQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sdUJBQVEsR0FBaEI7UUFFTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxlQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsdUJBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixRQUFRLENBQUMsUUFBUSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUMvQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUMvQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDckMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUMsZUFBTSxDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLFdBQVcsR0FBZ0IsSUFBSSwyQkFBWSxFQUFFLENBQUM7UUFDbEQsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRTNCLENBQUM7SUFDTCxXQUFDO0FBQUQsQ0FsQ0EsQUFrQ0MsSUFBQTtBQUNELE9BQU87QUFDUCxJQUFJLElBQUksRUFBRSxDQUFDOzs7O0FDekNYLGdGQUFnRjtBQUNoRixZQUFZO0FBQ1osb0JBQW9CO0FBQ3BCLGdGQUFnRjtBQUNoRjtJQUFBO0lBOEJBLENBQUM7SUFyQmMsZ0JBQU8sR0FBckIsVUFBc0IsR0FBVTtRQUUvQixJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixJQUFJLEdBQUcsR0FBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixLQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQzlCO1lBQ0MsSUFBSSxTQUFTLEdBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksU0FBUyxHQUFpQixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsU0FBUztZQUN4QyxJQUFJLElBQUksR0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFDLElBQUksQ0FBQztZQUM5QixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtJQUNGLENBQUM7SUFyQmEsYUFBSSxHQUFPLEVBQUUsQ0FBQztJQUNkLFlBQUcsR0FBbUIsRUFBRSxDQUFDO0lBc0J4QyxlQUFDO0NBOUJELEFBOEJDLElBQUE7a0JBOUJvQixRQUFROzs7O0FDSjdCLGdGQUFnRjtBQUNoRixZQUFZO0FBQ1osbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUNoRjtJQUFBO0lBd0JBLENBQUM7SUFsQmMsZUFBTyxHQUFyQixVQUFzQixHQUFVO1FBRS9CLElBQUksQ0FBQyxHQUFRLENBQUMsQ0FBQztRQUNmLElBQUksR0FBRyxHQUFpQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFRLENBQUMsQ0FBQztRQUNmLEtBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDOUI7WUFDQyxJQUFJLFNBQVMsR0FBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxTQUFTLEdBQWlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsSUFBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxTQUFTO1lBQ3ZDLElBQUksSUFBSSxHQUFVLElBQUksT0FBTyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLEVBQUUsR0FBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUMsSUFBSSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0YsQ0FBQztJQWxCYSxZQUFJLEdBQU8sRUFBRSxDQUFDO0lBQ2QsV0FBRyxHQUFrQixFQUFFLENBQUM7SUFtQnZDLGNBQUM7Q0F4QkQsQUF3QkMsSUFBQTtrQkF4Qm9CLE9BQU87Ozs7QUNKNUIsZ0ZBQWdGO0FBQ2hGLFlBQVk7QUFDWixvQkFBb0I7QUFDcEIsZ0ZBQWdGO0FBQ2hGO0lBQUE7SUFrQ0EsQ0FBQztJQXZCYyxnQkFBTyxHQUFyQixVQUFzQixHQUFVO1FBRS9CLElBQUksQ0FBQyxHQUFRLENBQUMsQ0FBQztRQUNmLElBQUksR0FBRyxHQUFpQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFRLENBQUMsQ0FBQztRQUNmLEtBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDOUI7WUFDQyxJQUFJLFNBQVMsR0FBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxTQUFTLEdBQWlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsSUFBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxTQUFTO1lBQ3hDLElBQUksSUFBSSxHQUFXLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLEVBQUUsR0FBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksR0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBQyxJQUFJLENBQUM7WUFDNUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7SUFDRixDQUFDO0lBdkJhLGFBQUksR0FBTyxFQUFFLENBQUM7SUFDZCxZQUFHLEdBQW1CLEVBQUUsQ0FBQztJQXdCeEMsZUFBQztDQWxDRCxBQWtDQyxJQUFBO2tCQWxDb0IsUUFBUTs7OztBQ0o3QixnRkFBZ0Y7QUFDaEYsWUFBWTtBQUNaLGtCQUFrQjtBQUNsQixnRkFBZ0Y7QUFDaEY7SUFBQTtJQTRDQSxDQUFDO0lBNUJjLGNBQU8sR0FBckIsVUFBc0IsR0FBVTtRQUUvQixJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixJQUFJLEdBQUcsR0FBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixLQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQzlCO1lBQ0MsSUFBSSxTQUFTLEdBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksU0FBUyxHQUFpQixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsU0FBUztZQUN0QyxJQUFJLElBQUksR0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxFQUFFLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBQyxJQUFJLENBQUM7WUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEI7SUFDRixDQUFDO0lBNUJhLFdBQUksR0FBTyxFQUFFLENBQUM7SUFDZCxVQUFHLEdBQWlCLEVBQUUsQ0FBQztJQTZCdEMsYUFBQztDQTVDRCxBQTRDQyxJQUFBO2tCQTVDb0IsTUFBTTs7OztBQ0ozQixnRkFBZ0Y7QUFDaEYsWUFBWTtBQUNaLG1CQUFtQjtBQUNuQixnRkFBZ0Y7QUFDaEY7SUFBQTtJQTBDQSxDQUFDO0lBM0JjLGVBQU8sR0FBckIsVUFBc0IsR0FBVTtRQUUvQixJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixJQUFJLEdBQUcsR0FBaUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBUSxDQUFDLENBQUM7UUFDZixLQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQzlCO1lBQ0MsSUFBSSxTQUFTLEdBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksU0FBUyxHQUFpQixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELElBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsU0FBUztZQUN2QyxJQUFJLElBQUksR0FBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxFQUFFLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBQyxJQUFJLENBQUM7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7SUFDRixDQUFDO0lBM0JhLFlBQUksR0FBTyxFQUFFLENBQUM7SUFDZCxXQUFHLEdBQWtCLEVBQUUsQ0FBQztJQTRCdkMsY0FBQztDQTFDRCxBQTBDQyxJQUFBO2tCQTFDb0IsT0FBTzs7OztBQ0o1Qix1Q0FBc0M7QUFHdEM7O0VBRUU7QUFDRixJQUFjLFVBQVUsQ0FrRXZCO0FBbEVELFdBQWMsVUFBVTtJQUVULGNBQUcsR0FBVyxNQUFNLENBQUM7SUFDckIsa0JBQU8sR0FBVSxVQUFVLENBQUM7SUFDNUIsa0JBQU8sR0FBVSxVQUFVLENBQUM7SUFDNUIsYUFBRSxHQUFVLEtBQUssQ0FBQztJQUNsQixpQkFBTSxHQUFVLFFBQVEsQ0FBQztJQUN6Qix3QkFBYSxHQUFVLEVBQUUsQ0FBQztJQUMxQixlQUFJLEdBQVUsT0FBTyxDQUFDO0lBQ3RCLGdCQUFLLEdBQVUsU0FBUyxDQUFBO0lBRW5DO1FBRUksVUFBVSxDQUFDLGFBQWEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFIZSxlQUFJLE9BR25CLENBQUE7SUFFRCxrQkFBMEIsRUFBUztRQUUvQixPQUFPLGVBQU0sQ0FBQyxNQUFNLENBQUUsVUFBVSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRSxNQUFNLENBQUUsQ0FBQztJQUNoRixDQUFDO0lBSGUsbUJBQVEsV0FHdkIsQ0FBQTtJQUVEO1FBRUksT0FBTyxlQUFNLENBQUMsTUFBTSxDQUFFLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sR0FBRSxnQkFBZ0IsQ0FBRSxDQUFDO0lBQ3RGLENBQUM7SUFIZSx1QkFBWSxlQUczQixDQUFBO0lBRUQsbUJBQTJCLFVBQWlCO1FBRXhDLE9BQU8sZUFBTSxDQUFDLE1BQU0sQ0FBRSxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxHQUFFLE1BQU0sQ0FBRSxDQUFDO0lBQ3pGLENBQUM7SUFIZSxvQkFBUyxZQUd4QixDQUFBO0lBRUQsb0JBQTRCLElBQVE7UUFFaEMsT0FBTyxlQUFNLENBQUMsTUFBTSxDQUFFLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxlQUFlLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBRSxDQUFDO0lBQy9GLENBQUM7SUFIZSxxQkFBVSxhQUd6QixDQUFBO0lBRUQsb0JBQTRCLElBQVE7UUFFaEMsT0FBTyxlQUFNLENBQUMsTUFBTSxDQUFFLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxlQUFlLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBRSxDQUFDO0lBQy9GLENBQUM7SUFIZSxxQkFBVSxhQUd6QixDQUFBO0lBRUQsd0JBQWdDLElBQVE7UUFFcEMsT0FBTyxlQUFNLENBQUMsTUFBTSxDQUFFLFVBQVUsQ0FBQyxHQUFHLEdBQUcsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBRSxDQUFDO0lBQ2pGLENBQUM7SUFIZSx5QkFBYyxpQkFHN0IsQ0FBQTtJQUVELHFCQUE2QixFQUFTO1FBRWxDLE9BQU8sZUFBTSxDQUFDLE1BQU0sQ0FBRSxVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsV0FBVyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUUsQ0FBQztJQUN6RixDQUFDO0lBSGUsc0JBQVcsY0FHMUIsQ0FBQTtJQUVEO1FBRUksSUFBSSxlQUFNLENBQUMsT0FBTyxFQUNsQjtZQUNJLE9BQU8sZUFBTSxDQUFDLE1BQU0sQ0FBRSxVQUFVLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBRSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDdEY7UUFDRCxPQUFPLGVBQU0sQ0FBQyxNQUFNLENBQUUsVUFBVSxDQUFDLEdBQUcsR0FBRyxTQUFTLEdBQUcsZUFBTSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBRSxDQUFDO0lBQzNGLENBQUM7SUFQZSx3QkFBYSxnQkFPNUIsQ0FBQTtJQUVEO1FBRUksT0FBTyxlQUFNLENBQUMsTUFBTSxDQUFFLGtCQUFrQixDQUFFLENBQUM7SUFDL0MsQ0FBQztJQUhlLHlCQUFjLGlCQUc3QixDQUFBO0FBR0wsQ0FBQyxFQWxFYSxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQWtFdkI7Ozs7QUN4RUQsMkNBQTBDO0FBQzFDLHVDQUFzQztBQUV0Qzs7RUFFRTtBQUNGO0lBQXdDLDhCQUFvQjtJQWtCeEQ7ZUFFSSxpQkFBTztJQUNYLENBQUM7SUFYYSxzQkFBVyxHQUF6QjtRQUVJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQ3pCO1lBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFNTSx5QkFBSSxHQUFYO1FBRUksSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLDRCQUFPLEdBQWQsVUFBZ0IsSUFBUTtRQUVyQixJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUN6QztZQUNLLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksU0FBUyxHQUFjLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkMsSUFBSSxZQUFZLEdBQWMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUM3QyxJQUFJLGFBQWEsR0FBTyxFQUFFLENBQUM7WUFDM0IsS0FBSyxJQUFJLElBQUksSUFBSSxZQUFZLEVBQzdCO2dCQUNJLElBQUksS0FBSyxHQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUNsQjtvQkFDSSxLQUFLLEtBQUs7d0JBQ04sS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDcEMsTUFBTTtvQkFDTixLQUFLLElBQUk7d0JBQ0wsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO3dCQUM1QixNQUFNO29CQUNOLEtBQUssSUFBSTt3QkFDTCxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQy9CLE1BQU07b0JBQ04sS0FBSyxJQUFJO3dCQUNMLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzt3QkFDbkMsTUFBTTtpQkFDVDtnQkFDRCxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNyQztZQUNELEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxFQUMvQjtnQkFDSSxJQUFJLFVBQVUsR0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFDLElBQUksR0FBRyxHQUFpQixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUUsQ0FBQztnQkFDckQsSUFBSSxRQUFRLEdBQWMsRUFBRSxDQUFDO2dCQUM3QixJQUFJLE9BQU8sQ0FBQztnQkFDWixLQUFLLE9BQU8sSUFBSSxHQUFHLEVBQ25CO29CQUNJLElBQUksUUFBUSxHQUFVLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxRQUFRLElBQUksRUFBRSxFQUNsQjt3QkFDSSxJQUFJLElBQUksR0FBVSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDO3dCQUM5QyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUMsdUJBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDM0MsUUFBUSxDQUFDLElBQUksQ0FBRSxFQUFFLEdBQUcsRUFBQyxlQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUUsQ0FBQztxQkFDbkY7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0osQ0FBQztJQXZFRDs7T0FFRztJQUNXLG9CQUFTLEdBQVcsS0FBSyxDQUFDO0lBcUU1QyxpQkFBQztDQTdFRCxBQTZFQyxDQTdFdUMsSUFBSSxDQUFDLGVBQWUsR0E2RTNEO2tCQTdFb0IsVUFBVTs7OztBQ0ovQjs7RUFFRTtBQUNGO0lBS0k7SUFFQSxDQUFDO0lBRWEsV0FBRyxHQUFqQixVQUFrQixHQUFRO1FBQUUsd0JBQXdCO2FBQXhCLFVBQXdCLEVBQXhCLHFCQUF3QixFQUF4QixJQUF3QjtZQUF4Qix1Q0FBd0I7O1FBQ2hELDJDQUEyQztRQUMzQyxtREFBbUQ7UUFDbkQsMkNBQTJDO1FBQzNDLGFBQWE7UUFDYiw0QkFBNEI7UUFDNUIsUUFBUTtRQUNSLElBQUk7UUFDSixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBRyxjQUFjLElBQUUsY0FBYyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ25DO2lCQUFJO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEI7U0FDSjtJQUNMLENBQUM7SUFFYSxhQUFLLEdBQW5CLFVBQW9CLEdBQVE7UUFBRSx3QkFBd0I7YUFBeEIsVUFBd0IsRUFBeEIscUJBQXdCLEVBQXhCLElBQXdCO1lBQXhCLHVDQUF3Qjs7UUFDbEQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQTdCRDs7T0FFRztJQUNXLGVBQU8sR0FBWSxJQUFJLENBQUM7SUEyQjFDLGNBQUM7Q0EvQkQsQUErQkMsSUFBQTtrQkEvQm9CLE9BQU87Ozs7QUNGNUI7O0VBRUU7QUFDRjtJQUEwQyxnQ0FBb0I7SUFNMUQ7UUFBQSxZQUNJLGlCQUFPLFNBQ1Y7UUFMTyxnQkFBVSxHQUFVLENBQUMsQ0FBQztRQUV0QixxQkFBZSxHQUFpQixFQUFFLENBQUM7O0lBRzNDLENBQUM7SUFFYSx5QkFBWSxHQUExQjtRQUVJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQ3pCO1lBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFTSwyQkFBSSxHQUFYO1FBRUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVPLGdDQUFTLEdBQWpCO0lBR0EsQ0FBQztJQUVNLDJCQUFJLEdBQVg7UUFFSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQzNDLENBQUM7SUFFTSw4QkFBTyxHQUFkO1FBRUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVPLDhCQUFPLEdBQWY7UUFFSSxJQUFJLENBQUMsR0FBVSxDQUFDLENBQUM7UUFDakIsS0FBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFDM0M7WUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEU7SUFDTCxDQUFDO0lBRU0sc0NBQWUsR0FBdEIsVUFBd0IsWUFBbUI7UUFFdkMsSUFBSSxLQUFZLENBQUM7UUFDakIsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUNmO1lBQ0ksT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxzQ0FBZSxHQUF0QixVQUF1QixZQUFtQjtRQUV0QyxJQUFJLEtBQVksQ0FBQztRQUNqQixLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsSUFBRyxLQUFLLElBQUUsQ0FBQyxDQUFDLEVBQ1o7WUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFTSx5Q0FBa0IsR0FBekIsVUFBMEIsWUFBbUI7UUFFekMsSUFBSSxLQUFLLEdBQVUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUQsSUFBRyxLQUFLLElBQUUsQ0FBQyxDQUFDLEVBQ1o7WUFDSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRUQsc0JBQVcsbUNBQVM7YUFBcEI7WUFFSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDM0IsQ0FBQztRQUNEOztXQUVHO2FBQ0gsVUFBcUIsS0FBWTtZQUU3QixJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUM3QjtnQkFDSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDOzs7T0FYQTtJQVlMLG1CQUFDO0FBQUQsQ0E5RkEsQUE4RkMsQ0E5RnlDLElBQUksQ0FBQyxlQUFlLEdBOEY3RDs7Ozs7QUNwR0QsNkVBQXdFO0FBQ3hFLHlEQUFvRDtBQUNwRCxpREFBNEM7QUFHNUM7SUFHQztRQURPLGlCQUFZLEdBQVUsQ0FBQyxDQUFDO1FBcUIvQjs7V0FFRztRQUNLLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBRXhCLFVBQUssR0FBVyxLQUFLLENBQUM7UUFDdEIsbUJBQWMsR0FBVSxDQUFDLENBQUM7UUFTMUIsVUFBSyxHQUFVLENBQUMsQ0FBQztRQUNqQixnQkFBVyxHQUFVLENBQUMsQ0FBQztJQWpDL0IsQ0FBQztJQUlhLHVCQUFXLEdBQXpCO1FBQ08sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRywwQkFBSSxHQUFYO1FBRUMsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBRSx1QkFBYSxDQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDO0lBQzdDLENBQUM7SUFVTSx1Q0FBaUIsR0FBeEIsVUFBeUIsVUFBa0I7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLHNCQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFFLHVCQUFhLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUUsQ0FBQztJQUN6RixDQUFDO0lBSU0sNEJBQU0sR0FBYjtRQUVDLElBQUksSUFBSSxDQUFDLEtBQUssRUFDZDtZQUNDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxFQUN2QjtnQkFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZixzQkFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBRSx1QkFBYSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFFLENBQUM7YUFDeEY7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxFQUM3QjtnQkFDQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFDeEI7U0FDRDtJQUNGLENBQUM7SUFFTSxzQ0FBZ0IsR0FBdkI7UUFFQyxJQUFJLE9BQU8sR0FBVSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUNmO1lBQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3RDLHFCQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFFLFFBQVEsRUFBQyxFQUFFLEVBQUMsT0FBTyxDQUFFLENBQUM7U0FDNUQ7SUFDRixDQUFDO0lBT0Qsc0JBQVcsbUNBQVU7UUFMckI7Ozs7V0FJRzthQUNIO1lBQ0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBRUYsa0JBQUM7QUFBRCxDQS9FQSxBQStFQyxJQUFBO0FBL0VZLGtDQUFXOzs7O0FDTHhCLGdEQUEyQztBQUUzQztJQUFBO0lBa0JBLENBQUM7SUFUVSwwQkFBSyxHQUFaO1FBRUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBQyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFDLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFDLElBQUksQ0FBQztRQUNuQixvQkFBVSxDQUFDLFFBQVEsQ0FBRSxVQUFVLENBQUMsT0FBTyxFQUFDLElBQUksQ0FBRSxDQUFDO0lBQ25ELENBQUM7SUFkTSxrQkFBTyxHQUFVLFlBQVksQ0FBQztJQWdCekMsaUJBQUM7Q0FsQkQsQUFrQkMsSUFBQTtrQkFsQm9CLFVBQVU7Ozs7QUNGL0IsbUNBQThCO0FBQzlCLHlDQUFvQztBQUVwQzs7RUFFRTtBQUNGLElBQWMsVUFBVSxDQTZCdkI7QUE3QkQsV0FBYyxVQUFVO0lBRXBCO1FBRUksbUJBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBSGUsZUFBSSxPQUduQixDQUFBO0lBRUQsTUFBTTtJQUNOLGVBQXNCLElBQVksRUFBRSxHQUFrQixFQUFFLE9BQXdCLEVBQUUsVUFBMkI7UUFBekUsb0JBQUEsRUFBQSxVQUFrQjtRQUFFLHdCQUFBLEVBQUEsZUFBd0I7UUFBRSwyQkFBQSxFQUFBLGtCQUEyQjtRQUN6RyxPQUFPLElBQUksZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRmUsZ0JBQUssUUFFcEIsQ0FBQTtJQUVELE1BQU07SUFDTix1QkFBOEIsSUFBWSxFQUFFLEdBQWtCLEVBQUUsT0FBd0IsRUFBRSxVQUEyQjtRQUF6RSxvQkFBQSxFQUFBLFVBQWtCO1FBQUUsd0JBQUEsRUFBQSxlQUF3QjtRQUFFLDJCQUFBLEVBQUEsa0JBQTJCO1FBQ2pILG1CQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUZlLHdCQUFhLGdCQUU1QixDQUFBO0lBRUQsTUFBTTtJQUNOLDBCQUFpQyxJQUFZLEVBQUUsVUFBZSxFQUFFLFFBQWtCLEVBQUUsVUFBMkIsRUFBRSxRQUFvQjtRQUFqRCwyQkFBQSxFQUFBLGtCQUEyQjtRQUFFLHlCQUFBLEVBQUEsWUFBb0I7UUFDakksbUJBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFGZSwyQkFBZ0IsbUJBRS9CLENBQUE7SUFFRCwwQkFBaUMsSUFBWTtRQUN6QyxPQUFPLG1CQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFGZSwyQkFBZ0IsbUJBRS9CLENBQUE7SUFFRCw2QkFBb0MsSUFBWSxFQUFFLFVBQWUsRUFBRSxRQUFrQixFQUFFLFVBQTJCLEVBQUUsUUFBb0I7UUFBakQsMkJBQUEsRUFBQSxrQkFBMkI7UUFBRSx5QkFBQSxFQUFBLFlBQW9CO1FBQ3BJLG1CQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUZlLDhCQUFtQixzQkFFbEMsQ0FBQTtBQUNMLENBQUMsRUE3QmEsVUFBVSxHQUFWLGtCQUFVLEtBQVYsa0JBQVUsUUE2QnZCOzs7O0FDbkNEO0lBQW9DLDBCQUFVO0lBSTFDLGdCQUFtQixJQUFXLEVBQUUsR0FBYyxFQUFFLE9BQXVCLEVBQUUsVUFBMEI7UUFBbkUsb0JBQUEsRUFBQSxVQUFjO1FBQUUsd0JBQUEsRUFBQSxlQUF1QjtRQUFFLDJCQUFBLEVBQUEsa0JBQTBCO1FBQW5HLFlBQ0ksaUJBQU8sU0FJVjtRQVBNLGdCQUFVLEdBQVUsUUFBUSxDQUFDO1FBSWhDLElBQUcsR0FBRyxFQUFDO1lBQ0gsS0FBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7U0FDbkI7O0lBQ0wsQ0FBQztJQUVNLHNCQUFLLEdBQVosVUFBYSxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUEsQ0FBQyxDQUFBLEdBQUcsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSx5QkFBUSxHQUFmO1FBQ0ksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQU1ELHNCQUFXLHlCQUFLO1FBSmhCOzs7V0FHRzthQUNIO1lBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUM7OztPQUFBO0lBRUwsYUFBQztBQUFELENBM0JBLEFBMkJDLENBM0JtQyxJQUFJLENBQUMsS0FBSyxHQTJCN0M7Ozs7O0FDM0JEOztHQUVHO0FBQ0g7SUFBdUMsNkJBQW9CO0lBS3ZEO1FBQUEsWUFDSSxpQkFBTyxTQU9WO1FBVE8sWUFBTSxHQUFXLEtBQUssQ0FBQztRQUczQixJQUFHLEtBQUksQ0FBQyxNQUFNLEVBQUM7U0FDZDtRQUNELElBQUcsS0FBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUM7WUFDeEIsS0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM5QyxLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUN0Qjs7SUFDTCxDQUFDO0lBRWEscUJBQVcsR0FBekI7UUFDSSxJQUFHLElBQUksQ0FBQyxTQUFTLElBQUUsSUFBSTtZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTSxvQ0FBZ0IsR0FBdkIsVUFBd0IsSUFBVyxFQUFDLFFBQWlCLEVBQUMsVUFBYyxFQUFDLFVBQXdCLEVBQUMsUUFBaUI7UUFBMUMsMkJBQUEsRUFBQSxrQkFBd0I7UUFBQyx5QkFBQSxFQUFBLFlBQWlCO1FBQzNHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFFLElBQUksRUFBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLHVDQUFtQixHQUExQixVQUEyQixJQUFXLEVBQUMsUUFBaUIsRUFBQyxVQUFjLEVBQUMsVUFBd0I7UUFBeEIsMkJBQUEsRUFBQSxrQkFBd0I7UUFDNUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUUsSUFBSSxFQUFDLFVBQVUsRUFBRSxRQUFRLENBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRU0sb0NBQWdCLEdBQXZCLFVBQXdCLElBQVc7UUFFL0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0saUNBQWEsR0FBcEIsVUFBcUIsSUFBVyxFQUFDLElBQVU7UUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNMLGdCQUFDO0FBQUQsQ0FyQ0EsQUFxQ0MsQ0FyQ3NDLElBQUksQ0FBQyxlQUFlLEdBcUMxRDs7Ozs7QUN4Q0QsaURBQTRDO0FBQzVDLG1EQUFrRDtBQUNsRCx5Q0FBb0M7QUFDcEMsZ0RBQTJDO0FBQzNDLDhEQUF5RDtBQUV6RDs7RUFFRTtBQUNGO0lBQXdDLDhCQUFTO0lBRzdDO1FBQUEsWUFDSSxpQkFBTyxTQUdWO1FBRkcsS0FBSSxDQUFDLFdBQVcsR0FBRyx1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLEtBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7SUFDckIsQ0FBQztJQUNTLDhCQUFTLEdBQW5CO0lBR0EsQ0FBQztJQUVEOzs7T0FHRztJQUNPLGlDQUFZLEdBQXRCLFVBQXdCLElBQVcsRUFBRSxXQUFlLEVBQUUsZUFBd0I7UUFFMUUsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBRSxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNPLHNDQUFpQixHQUEzQixVQUE0QixJQUFXLEVBQUUsSUFBZTtRQUFmLHFCQUFBLEVBQUEsV0FBZTtRQUVwRCx1QkFBVSxDQUFDLGFBQWEsQ0FBRSxJQUFJLEVBQUUsSUFBSSxDQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ08sb0NBQWUsR0FBekIsVUFBMEIsSUFBVyxFQUFDLFdBQWUsRUFBRSxlQUF3QjtRQUUzRSx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFFLENBQUM7SUFDeEUsQ0FBQztJQUVTLDZCQUFRLEdBQWxCLFVBQW1CLEdBQU87UUFFdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRVMsZ0NBQVcsR0FBckIsVUFBdUIsR0FBVSxFQUFDLElBQWUsRUFBQyxVQUF5QjtRQUF6QyxxQkFBQSxFQUFBLFdBQWU7UUFBQywyQkFBQSxFQUFBLGlCQUF5QjtRQUV2RSxvQkFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFJRCxzQkFBVyw4QkFBTTthQUFqQjtZQUVJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0JBQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN2QztZQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUNMLGlCQUFDO0FBQUQsQ0F6REEsQUF5REMsQ0F6RHVDLG1CQUFTLEdBeURoRDs7Ozs7QUNsRUQsZ0VBQTJEO0FBQzNELGtFQUE2RDtBQUM3RCxtREFBa0Q7QUFDbEQsaURBQTRDO0FBQzVDLG1EQUE4QztBQUM5QyxzREFBcUQ7QUFHckQsbURBQThDO0FBQzlDLDJDQUFzQztBQUd0Qzs7RUFFRTtBQUNGO0lBQXNDLDRCQUFlO0lBMkJqRDs7Ozs7Ozs7T0FRRztJQUNILGtCQUFZLE9BQW9CLEVBQUUsT0FBb0IsRUFBRSxZQUE2QixFQUN6RSxjQUF3RCxFQUFFLGNBQXVCLEVBQUUsT0FBdUI7UUFEMUcsd0JBQUEsRUFBQSxZQUFvQjtRQUFFLHdCQUFBLEVBQUEsWUFBb0I7UUFBRSw2QkFBQSxFQUFBLG9CQUE2QjtRQUN6RSwrQkFBQSxFQUFBLGlCQUFzQix3QkFBYyxDQUFDLG1CQUFtQjtRQUFFLCtCQUFBLEVBQUEsa0JBQXVCO1FBQUUsd0JBQUEsRUFBQSxjQUF1QjtRQUR0SCxZQUVJLGlCQUFPLFNBUVY7UUE1Q0QsZ0JBQVUsR0FBUyxLQUFLLENBQUM7UUFDakIsY0FBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixjQUFRLEdBQVcsRUFBRSxDQUFDO1FBRXRCLGNBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIscUJBQWUsR0FBVSx3QkFBYyxDQUFDLG1CQUFtQixDQUFDO1FBTTVELHFCQUFlLEdBQVcsQ0FBQyxDQUFDO1FBS3BDOztXQUVHO1FBQ0ssZ0JBQVUsR0FBTyxFQUFFLENBQUM7UUFDNUI7O1dBRUc7UUFDSyxzQkFBZ0IsR0FBTyxFQUFFLENBQUM7UUFjOUIsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsS0FBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFDbEMsS0FBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsS0FBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztJQUN6QixDQUFDO0lBRU0sb0NBQWlCLEdBQXhCO1FBQ0ksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUc7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0o7SUFDTCxDQUFDO0lBSUQ7Ozs7O09BS0c7SUFDTyx5QkFBTSxHQUFoQixVQUFpQixTQUFpQixFQUFFLE1BQVcsRUFBRSxlQUF5QjtRQUN0RSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO1FBQ3hDLHlCQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLDhCQUFXLEdBQXJCLFVBQXNCLElBQWdCLEVBQUUsTUFBVyxFQUFFLGVBQXlCO1FBQzFFLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO1FBQ3hDLHlCQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyw4QkFBVyxHQUFuQjtRQUVJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQzdDO1lBQ0ksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFFLENBQUM7U0FDbEQ7SUFDTCxDQUFDO0lBRVMsc0NBQW1CLEdBQTdCLFVBQThCLFdBQW1CO1FBQzdDLHdCQUFjLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVTLHFDQUFrQixHQUE1QixVQUE2QixJQUFZO1FBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVTLHFDQUFrQixHQUE1QixVQUE2QixJQUFZO1FBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVTLDJDQUF3QixHQUFsQyxVQUFvQyxJQUFXO1FBRTNDLElBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztZQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFNBQVM7SUFDQyx5QkFBTSxHQUFoQjtRQUNJLGlCQUFNLE1BQU0sV0FBRSxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLElBQUksQ0FBQyxlQUFlLEVBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0g7SUFDTCxDQUFDO0lBRUQsTUFBTTtJQUNJLDBCQUFPLEdBQWpCLFVBQWtCLE9BQWUsRUFBRSxPQUFlLEVBQUUsWUFBcUIsRUFBQyxjQUF3RCxFQUFFLGNBQXVCLEVBQUUsT0FBdUI7UUFBMUcsK0JBQUEsRUFBQSxpQkFBc0Isd0JBQWMsQ0FBQyxtQkFBbUI7UUFBRSwrQkFBQSxFQUFBLGtCQUF1QjtRQUFFLHdCQUFBLEVBQUEsY0FBdUI7UUFDaEwsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsd0JBQWMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzNFLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxJQUFJLEdBQXFCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUU7Z0JBQzNCLElBQUksU0FBUyxHQUF3QixJQUEyQixDQUFDO2dCQUNqRSxJQUFJLFNBQVMsRUFBRTtvQkFDWCxLQUFLLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7d0JBQ2xDLElBQUksYUFBYSxHQUFxQixTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQztxQkFDNUM7aUJBQ0o7Z0JBQ0QsMEJBQTBCO2dCQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQTJCLENBQUM7YUFDakQ7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDMUI7U0FDSjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFUywyQkFBUSxHQUFsQjtJQUdBLENBQUM7SUFFUyw0QkFBUyxHQUFuQjtJQUdBLENBQUM7SUFFUyxtQ0FBZ0IsR0FBMUI7UUFFSSxRQUFRLElBQUksQ0FBQyxlQUFlLEVBQzVCO1lBQ0ksS0FBSyx3QkFBYyxDQUFDLG1CQUFtQjtnQkFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN6QixNQUFNO1lBQ04sS0FBSyx3QkFBYyxDQUFDLDhCQUE4QjtnQkFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUMzSCxNQUFNO1lBQ04sS0FBSyx3QkFBYyxDQUFDLGdDQUFnQztnQkFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUMzSCxNQUFNO1lBQ04sS0FBSyx3QkFBYyxDQUFDLCtCQUErQjtnQkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pJLE1BQU07U0FDVDtJQUNMLENBQUM7SUFFTyxnQ0FBYSxHQUFyQjtRQUVJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFFLElBQUksRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFFLENBQUM7SUFDakQsQ0FBQztJQUVTLDZCQUFVLEdBQXBCO1FBRUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sOEJBQVcsR0FBbkI7UUFFSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQ2pCO1lBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFDdkQ7Z0JBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsRDtTQUNKO0lBQ0wsQ0FBQztJQUVTLCtCQUFZLEdBQXRCO1FBRUkscUJBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFFLElBQUksQ0FBQyxPQUFPLEVBQUMsSUFBSSxDQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksOEJBQVcsR0FBbEIsVUFBb0IsY0FBMEI7UUFBMUIsK0JBQUEsRUFBQSxtQkFBMEI7UUFFMUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUNqQjtZQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUNqQztRQUNELElBQUksY0FBYyxJQUFJLEVBQUUsRUFDeEI7WUFDSSxRQUFRLElBQUksQ0FBQyxlQUFlLEVBQzVCO2dCQUNJLEtBQUssd0JBQWMsQ0FBQyxtQkFBbUI7b0JBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsTUFBTTtnQkFDTixLQUFLLHdCQUFjLENBQUMsOEJBQThCO29CQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ2pJLE1BQU07Z0JBQ04sS0FBSyx3QkFBYyxDQUFDLGdDQUFnQztvQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNsSSxNQUFNO2dCQUNOLEtBQUssd0JBQWMsQ0FBQywrQkFBK0I7b0JBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFDLElBQUksRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUM3SCxNQUFNO2FBQ0w7U0FDSjthQUVEO1lBQ0ksUUFBUSxjQUFjLEVBQ3RCO2dCQUNJLEtBQUssd0JBQWMsQ0FBQyxtQkFBbUI7b0JBQ25DLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsTUFBTTtnQkFDTixLQUFLLHdCQUFjLENBQUMsa0NBQWtDO29CQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDN0gsTUFBTTtnQkFDTixLQUFLLHdCQUFjLENBQUMsZ0NBQWdDO29CQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQzdILE1BQU07YUFDVDtTQUNKO0lBQ0wsQ0FBQztJQUVTLDZCQUFVLEdBQXBCLFVBQXFCLEVBQVU7UUFDM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDL0MsQ0FBQztJQUVTLHNDQUFtQixHQUE3QixVQUE4QixFQUFVO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLHNDQUFtQixHQUE3QixVQUE4QixFQUFVO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELFlBQVk7SUFDTCwyQkFBUSxHQUFmLFVBQWdCLENBQU07UUFDbEIsT0FBTyx1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRVMsb0NBQWlCLEdBQTNCLFVBQTRCLElBQVksRUFBRSxJQUFnQjtRQUFoQixxQkFBQSxFQUFBLFdBQWdCO1FBQ3RELHVCQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTywrQkFBWSxHQUF0QixVQUF1QixJQUFZLEVBQUUsVUFBZSxFQUFFLFFBQWtCO1FBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFFLElBQUksQ0FBRSxFQUM3QztZQUNJLElBQUksRUFBRSxHQUFjLG9CQUFVLENBQUMsTUFBTSxDQUFFLG9CQUFVLENBQUMsT0FBTyxDQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNmLEVBQUUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUMxRDtJQUNULENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGtDQUFlLEdBQXpCLFVBQTBCLElBQVksRUFBRSxVQUFlLEVBQUUsUUFBa0I7UUFDdkUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQy9CO1lBQ0ksSUFBSSxFQUFFLEdBQWMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELHVCQUFVLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLDhCQUFXLEdBQXJCLFVBQXVCLE1BQVUsRUFBRSxJQUFZLEVBQUUsVUFBZSxFQUFFLFFBQWtCLEVBQUMsSUFBYTtRQUFiLHFCQUFBLEVBQUEsV0FBYTtRQUU5RixJQUFJLE1BQU0sRUFDVjtZQUNJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQzVDO2dCQUNJLE1BQU0sMENBQTBDLENBQUM7YUFDcEQ7WUFDRCxJQUFJLEVBQUUsR0FBYyxvQkFBVSxDQUFDLE1BQU0sQ0FBRSxvQkFBVSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ25CLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDM0IsRUFBRSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUUsRUFDbEQ7Z0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBRSxNQUFNLEVBQUMsSUFBSSxDQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLEVBQUUsRUFDUDtnQkFDSSxNQUFNLENBQUMsRUFBRSxDQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLElBQUksQ0FBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUUsRUFBRSxDQUFFLENBQUM7YUFDM0M7U0FDSjtJQUNMLENBQUM7SUFFUyw4QkFBVyxHQUFyQixVQUF1QixNQUFVLEVBQUMsSUFBWTtRQUUxQyxJQUFJLFFBQTBCLENBQUM7UUFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksT0FBa0IsQ0FBQztRQUN2QixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFDdEI7WUFDSSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUNuQztnQkFDSSxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxrQ0FBZSxHQUF6QixVQUEyQixNQUFVLEVBQUUsSUFBWSxFQUFFLFVBQWUsRUFBRSxRQUFrQjtRQUVwRixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDMUM7WUFDSSxJQUFJLEdBQUcsR0FBcUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQVEsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxJQUFJLEdBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM3QixJQUFJLEVBQWEsQ0FBQztZQUNsQixLQUFJLENBQUMsRUFBQyxDQUFDLEdBQUMsSUFBSSxFQUFDLENBQUMsRUFBRSxFQUNoQjtnQkFDSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUNqRjtvQkFDSSxNQUFNLENBQUMsR0FBRyxDQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxDQUFFLENBQUM7b0JBQ3ZDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxHQUFHLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBQyxDQUFDLENBQUUsQ0FBQztvQkFDbEIsTUFBTTtpQkFDVDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyx1Q0FBb0IsR0FBOUI7UUFFSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFDekI7WUFDSSxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksSUFBSSxHQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQ2Q7Z0JBQ0ksSUFBSSxFQUFFLEdBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLEVBQUUsRUFDTjtvQkFDSSxJQUFJLENBQUMsZUFBZSxDQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUMsRUFBRSxDQUFDLFVBQVUsRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFFLENBQUM7aUJBQzdEO2FBQ0o7U0FDSjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ08sb0NBQWlCLEdBQTNCO1FBRUksSUFBRyxJQUFJLENBQUMsVUFBVSxFQUNsQjtZQUNJLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxJQUFJLEdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvQixJQUFJLEdBQXFCLENBQUM7WUFDMUIsSUFBSSxDQUFRLENBQUM7WUFDYixJQUFJLElBQUksR0FBVSxDQUFDLENBQUM7WUFDcEIsSUFBSSxFQUFhLENBQUM7WUFDbEIsS0FBSyxDQUFDLElBQUksSUFBSSxFQUNkO2dCQUNJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3pCO29CQUNJLENBQUMsR0FBQyxDQUFDLENBQUM7b0JBQ0osSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2xCLEtBQUssQ0FBQyxHQUFDLElBQUksR0FBQyxDQUFDLEVBQUMsQ0FBQyxJQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFDdEI7d0JBQ0ksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDWixJQUFJLEVBQUUsRUFDTjs0QkFDSSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQ2I7Z0NBQ0ksRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUUsRUFBRSxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUUsQ0FBQzs2QkFDdEQ7NEJBQ0QsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO3lCQUNkO3dCQUNELEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBRSxDQUFDO3FCQUNyQjtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0I7U0FDSjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFUyw2QkFBVSxHQUFwQjtJQUdBLENBQUM7SUFFRCxPQUFPO0lBQ0EsMEJBQU8sR0FBZDtRQUNJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBRSxJQUFJLENBQUUsQ0FBQztRQUM5Qix3QkFBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQXBlTSxrQkFBUyxHQUFVLEVBQUUsQ0FBQztJQXFlakMsZUFBQztDQXRlRCxBQXNlQyxDQXRlcUMsUUFBUSxDQUFDLE1BQU0sR0FzZXBEO2tCQXRlb0IsUUFBUTs7OztBQ2Y3QixtREFBa0Q7QUFDbEQsaURBQTRDO0FBQzVDLG1EQUE4QztBQUM5QywyQ0FBc0M7QUFFdEM7SUFBMkMsaUNBQW1CO0lBWTFEO1FBQUEsWUFDSSxpQkFBTyxTQUNWO1FBWkQsZ0JBQVUsR0FBUyxLQUFLLENBQUM7UUFDekI7O1dBRUc7UUFDSyxnQkFBVSxHQUFPLEVBQUUsQ0FBQztRQUM1Qjs7V0FFRztRQUNLLHNCQUFnQixHQUFPLEVBQUUsQ0FBQzs7SUFJbEMsQ0FBQztJQUVTLHdDQUFnQixHQUExQixVQUEyQixHQUFRO1FBQy9CLGlCQUFNLGdCQUFnQixZQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM1QixJQUFJLElBQUksR0FBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRVMsOEJBQU0sR0FBaEI7SUFFQSxDQUFDO0lBRUQsWUFBWTtJQUNMLGdDQUFRLEdBQWYsVUFBZ0IsQ0FBTTtRQUNsQixPQUFPLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFUyx5Q0FBaUIsR0FBM0IsVUFBNEIsSUFBWSxFQUFFLElBQWdCO1FBQWhCLHFCQUFBLEVBQUEsV0FBZ0I7UUFDdEQsdUJBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUyxvQ0FBWSxHQUF0QixVQUF1QixJQUFZO1FBQy9CLE9BQU8sdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxvQ0FBWSxHQUF0QixVQUF1QixJQUFZLEVBQUUsVUFBZSxFQUFFLFFBQWtCO1FBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFFLElBQUksQ0FBRSxFQUNqRDtZQUNJLElBQUksRUFBRSxHQUFjLG9CQUFVLENBQUMsTUFBTSxDQUFFLG9CQUFVLENBQUMsT0FBTyxDQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNmLEVBQUUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQzNCLEVBQUUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFDLFVBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUN6RDtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLHVDQUFlLEdBQXpCLFVBQTBCLElBQVksRUFBRSxVQUFlLEVBQUUsUUFBa0I7UUFDdkUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQy9CO1lBQ0ksSUFBSSxFQUFFLEdBQWMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELHVCQUFVLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzRCxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLG1DQUFXLEdBQXJCLFVBQXVCLE1BQVUsRUFBRSxJQUFZLEVBQUUsVUFBZSxFQUFFLFFBQWtCLEVBQUMsSUFBYTtRQUFiLHFCQUFBLEVBQUEsV0FBYTtRQUU5RixJQUFJLE1BQU0sRUFDVjtZQUNJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQzVDO2dCQUNJLE1BQU0sK0NBQStDLENBQUM7YUFDekQ7WUFDRCxJQUFJLEVBQUUsR0FBYyxvQkFBVSxDQUFDLE1BQU0sQ0FBRSxvQkFBVSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzVELEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ25CLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDM0IsRUFBRSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUUsRUFDbEQ7Z0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBRSxNQUFNLEVBQUMsSUFBSSxDQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLEVBQUUsRUFDUDtnQkFDSSxNQUFNLENBQUMsRUFBRSxDQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxFQUFDLElBQUksQ0FBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUUsRUFBRSxDQUFFLENBQUM7YUFDM0M7U0FDSjtJQUNMLENBQUM7SUFFUyxtQ0FBVyxHQUFyQixVQUF1QixNQUFVLEVBQUMsSUFBWTtRQUUxQyxJQUFJLFFBQTBCLENBQUM7UUFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksT0FBa0IsQ0FBQztRQUN2QixLQUFLLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFDdEI7WUFDSSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUNuQztnQkFDSSxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyx1Q0FBZSxHQUF6QixVQUEyQixNQUFVLEVBQUUsSUFBWSxFQUFFLFVBQWUsRUFBRSxRQUFrQjtRQUVwRixJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDMUM7WUFDSSxJQUFJLEdBQUcsR0FBcUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLEdBQVEsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxJQUFJLEdBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM3QixJQUFJLEVBQWEsQ0FBQztZQUNsQixLQUFJLENBQUMsRUFBQyxDQUFDLEdBQUMsSUFBSSxFQUFDLENBQUMsRUFBRSxFQUNoQjtnQkFDSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUNqRjtvQkFDSSxNQUFNLENBQUMsR0FBRyxDQUFFLElBQUksRUFBQyxVQUFVLEVBQUMsUUFBUSxDQUFFLENBQUM7b0JBQ3ZDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxHQUFHLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBQyxDQUFDLENBQUUsQ0FBQztvQkFDbEIsTUFBTTtpQkFDVDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyw0Q0FBb0IsR0FBOUI7UUFFSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFDekI7WUFDSSxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksSUFBSSxHQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQ2Q7Z0JBQ0ksSUFBSSxFQUFFLEdBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLEVBQUUsRUFDTjtvQkFDSSxJQUFJLENBQUMsZUFBZSxDQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUMsRUFBRSxDQUFDLFVBQVUsRUFBQyxFQUFFLENBQUMsUUFBUSxDQUFFLENBQUM7aUJBQzdEO2FBQ0o7U0FDSjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ08seUNBQWlCLEdBQTNCO1FBRUksSUFBRyxJQUFJLENBQUMsVUFBVSxFQUNsQjtZQUNJLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxJQUFJLEdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvQixJQUFJLEdBQXFCLENBQUM7WUFDMUIsSUFBSSxDQUFRLENBQUM7WUFDYixJQUFJLElBQUksR0FBVSxDQUFDLENBQUM7WUFDcEIsSUFBSSxFQUFhLENBQUM7WUFDbEIsS0FBSyxDQUFDLElBQUksSUFBSSxFQUNkO2dCQUNJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3pCO29CQUNJLENBQUMsR0FBQyxDQUFDLENBQUM7b0JBQ0osSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2xCLEtBQUssQ0FBQyxHQUFDLElBQUksR0FBQyxDQUFDLEVBQUMsQ0FBQyxJQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFDdEI7d0JBQ0ksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDWixJQUFJLEVBQUUsRUFDTjs0QkFDSSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQ2I7Z0NBQ0ksRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUUsRUFBRSxDQUFDLElBQUksRUFBQyxFQUFFLENBQUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUUsQ0FBQzs2QkFDdEQ7NEJBQ0QsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO3lCQUNkO3dCQUNELEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBRSxDQUFDO3FCQUNyQjtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDN0I7U0FDSjtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSwrQkFBTyxHQUFkO1FBRUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsaUJBQU0sT0FBTyxXQUFFLENBQUM7SUFDcEIsQ0FBQztJQUNMLG9CQUFDO0FBQUQsQ0EzTkEsQUEyTkMsQ0EzTjBDLFFBQVEsQ0FBQyxVQUFVLEdBMk43RDs7Ozs7QUNoT0QseUNBQW9DO0FBRXBDOztFQUVFO0FBQ0Y7SUFBMkMsaUNBQW9CO0lBTTlEO2VBRUksaUJBQU87SUFDWCxDQUFDO0lBRWdCLHlCQUFXLEdBQXpCO1FBRUksSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFDekI7WUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7U0FDeEM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVNLGdDQUFRLEdBQWYsVUFBZ0IsR0FBTztRQUVuQixtQkFBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU0sZ0NBQVEsR0FBZixVQUFnQixHQUFPO1FBRW5CLE9BQU8sbUJBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLG1DQUFXLEdBQWxCLFVBQW1CLEdBQU87UUFFdEIsbUJBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLCtCQUFPLEdBQWQsVUFBZ0IsT0FBYyxFQUFDLEdBQU87UUFFbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQ3hDO1lBQ0ksYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDMUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7U0FDckI7SUFDTCxDQUFDO0lBRWEscUJBQU8sR0FBckIsVUFBdUIsT0FBYztRQUVqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFDeEM7WUFDSSxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztTQUN2QztRQUNELE9BQU8sYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBL0NjLDBCQUFZLEdBQUssRUFBRSxDQUFDO0lBZ0R2QyxvQkFBQztDQXBERCxBQW9EQyxDQXBEMEMsSUFBSSxDQUFDLGVBQWUsR0FvRDlEO2tCQXBEb0IsYUFBYTs7OztBQ0xsQzs7RUFFRTtBQUNGO0lBQXdDLDhCQUFvQjtJQUl4RDtlQUNJLGlCQUFPO0lBQ1gsQ0FBQztJQUVhLG1CQUFRLEdBQXRCLFVBQXdCLEdBQVUsRUFBRSxRQUFZO1FBRTVDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFYSxpQkFBTSxHQUFwQixVQUFzQixHQUFVO1FBQUMsY0FBYTthQUFiLFVBQWEsRUFBYixxQkFBYSxFQUFiLElBQWE7WUFBYiw2QkFBYTs7UUFFMUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUM1QjtZQUNJLElBQUksR0FBRyxHQUFjLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFHLENBQUMsRUFDbEI7Z0JBQ0ksSUFBSSxRQUFRLEdBQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsSUFBSSxFQUFFLEdBQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLENBQUM7YUFDYjtZQUNELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMzQzthQUVEO1lBQ0ksT0FBTyxDQUFDLEdBQUcsQ0FBRSxlQUFlLENBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVhLHVCQUFZLEdBQTFCLFVBQTRCLEdBQVU7UUFFbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQzdCO1lBQ0ksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDakM7UUFDRCxJQUFJLEdBQUcsR0FBYyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBRyxDQUFDLEVBQ2xCO1lBQ0ksSUFBSSxFQUFFLEdBQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBRSxHQUFHLENBQUUsQ0FBQztZQUMzRCxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFYSxtQkFBUSxHQUF0QixVQUF3QixHQUFVLEVBQUUsR0FBTztRQUV2QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQzVCO1lBQ0ksSUFBSSxLQUFLLEdBQVUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUUsR0FBRyxDQUFFLENBQUM7WUFDM0QsSUFBRyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQ2Q7Z0JBQ0ksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFFLENBQUM7YUFDeEM7U0FDSjtJQUNMLENBQUM7SUF6RGMsd0JBQWEsR0FBTyxFQUFFLENBQUM7SUFDdkIsbUJBQVEsR0FBSyxFQUFFLENBQUM7SUF5RG5DLGlCQUFDO0NBNURELEFBNERDLENBNUR1QyxJQUFJLENBQUMsZUFBZSxHQTREM0Q7a0JBNURvQixVQUFVOzs7O0FDSC9COztFQUVFO0FBQ0Y7SUFBdUMsNkJBQW9CO0lBR3ZEO2VBQ0ksaUJBQU87SUFDWCxDQUFDO0lBRUE7Ozs7TUFJRTtJQUNXLHFCQUFXLEdBQXpCLFVBQTBCLEdBQU87UUFFN0IsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksRUFDbkI7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ1csNkJBQW1CLEdBQWpDLFVBQWtDLEdBQU87UUFFckMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLElBQUksRUFDbkI7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O0tBSUM7SUFDYSxnQkFBTSxHQUFwQixVQUFxQixHQUFPO1FBRXhCLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQ25CO1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUM5QjtZQUNJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7U0FDbkM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztXQUlPO0lBQ08sZ0JBQU0sR0FBcEIsVUFBcUIsR0FBTztRQUV4QixJQUFJLEdBQUcsR0FBVSxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3pCLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQzFCO1lBQ0ksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRDs7TUFFRTtJQUNLLDJCQUFPLEdBQWQ7SUFHQSxDQUFDO0lBeEVjLGVBQUssR0FBTyxFQUFFLENBQUM7SUF5RWxDLGdCQUFDO0NBM0VELEFBMkVDLENBM0VzQyxJQUFJLENBQUMsZUFBZSxHQTJFMUQ7a0JBM0VvQixTQUFTOzs7O0FDSDlCOztHQUVHO0FBQ0g7SUFBQTtJQW1DQSxDQUFDO0lBakNHOztPQUVHO0lBQ0ksa0NBQW1CLEdBQVUscUJBQXFCLENBQUM7SUFDMUQ7O09BRUc7SUFDSSw2Q0FBOEIsR0FBUSxnQ0FBZ0MsQ0FBQztJQUM5RTs7T0FFRztJQUNJLCtDQUFnQyxHQUFVLGtDQUFrQyxDQUFDO0lBRXBGOztPQUVHO0lBQ0ksK0NBQWdDLEdBQVEsa0NBQWtDLENBQUM7SUFDbEY7O09BRUc7SUFDSSwyQ0FBNEIsR0FBUSw4QkFBOEIsQ0FBQztJQUUxRTs7T0FFRztJQUNJLDhDQUErQixHQUFVLGlDQUFpQyxDQUFDO0lBRWxGOztPQUVHO0lBQ0ksaURBQWtDLEdBQVUsb0NBQW9DLENBQUM7SUFHNUYscUJBQUM7Q0FuQ0QsQUFtQ0MsSUFBQTtrQkFuQ29CLGNBQWM7Ozs7QUNIbkMsc0NBQWlDO0FBQ2pDLHVDQUFzQztBQUd0Qzs7RUFFRTtBQUNGO0lBQXVDLDZCQUFvQjtJQU12RDtRQUFBLFlBQ0ksaUJBQU8sU0FFVjtRQUpPLG1CQUFhLEdBQVcsS0FBSyxDQUFDO1FBR2xDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7SUFDaEIsQ0FBQztJQUVhLHFCQUFXLEdBQXpCO1FBRUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFDMUI7WUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7U0FDcEM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVNLHdCQUFJLEdBQVg7UUFFSSxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLG1CQUFtQjtRQUNuQixJQUFJO1FBQ0osNENBQTRDO1FBQzVDLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sNEJBQVEsR0FBZixVQUFnQixHQUFVLEVBQUUsSUFBUSxFQUFDLFFBQWlCLEVBQUUsV0FBZSxFQUFDLFVBQTBCO1FBQTFCLDJCQUFBLEVBQUEsa0JBQTBCO1FBRTlGLElBQUksUUFBUSxHQUFPLEVBQUUsQ0FBQztRQUN0QixRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNuQixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyQixRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM3QixRQUFRLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNuQyxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNqQyxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUMzQixRQUFRLENBQUMsT0FBTyxHQUFHLGVBQU0sQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsUUFBUSxDQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBRSxHQUFHLEVBQUMsSUFBSSxFQUFDLFFBQVEsRUFBQyxXQUFXLEVBQUMsVUFBVSxDQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVNLGlDQUFhLEdBQXBCLFVBQXNCLEdBQVUsRUFBQyxHQUFVLEVBQUUsSUFBUSxFQUFDLFFBQWlCLEVBQUUsV0FBZSxFQUFDLFVBQTBCO1FBQTFCLDJCQUFBLEVBQUEsa0JBQTBCO1FBRS9HLElBQUksUUFBUSxHQUFPLEVBQUUsQ0FBQztRQUN0QixRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNuQixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyQixRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUM3QixRQUFRLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNuQyxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNqQyxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQixRQUFRLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxRQUFRLENBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFFLEdBQUcsRUFBQyxJQUFJLEVBQUMsUUFBUSxFQUFDLFdBQVcsRUFBQyxVQUFVLENBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRU8sOEJBQVUsR0FBbEIsVUFBbUIsR0FBVSxFQUFFLElBQVEsRUFBQyxXQUFlLEVBQUMsUUFBaUIsRUFBQyxVQUEwQjtRQUExQiwyQkFBQSxFQUFBLGtCQUEwQjtRQUVoRyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQ3RCO1lBQ0ksT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxVQUFVLEVBQ2Q7WUFDSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN2QztRQUNELGlCQUFPLENBQUMsR0FBRyxDQUFFLE9BQU8sR0FBRSxlQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBQyxJQUFJLENBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLDJCQUFPLEdBQWQsVUFBZSxHQUFZLEVBQUUsSUFBYSxFQUFDLFdBQW9CLEVBQUMsUUFBc0IsRUFBQyxVQUF5QjtRQUFqRyxvQkFBQSxFQUFBLFVBQVk7UUFBRSxxQkFBQSxFQUFBLFdBQWE7UUFBQyw0QkFBQSxFQUFBLGtCQUFvQjtRQUFDLHlCQUFBLEVBQUEsZUFBc0I7UUFBQywyQkFBQSxFQUFBLGlCQUF5QjtRQUU1RyxJQUFJLFFBQVEsR0FBTyxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbkIsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDckIsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDN0IsUUFBUSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDbkMsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDakMsUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUIsUUFBUSxDQUFDLE9BQU8sR0FBRyxlQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFFLFFBQVEsQ0FBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUUsR0FBRyxFQUFDLElBQUksRUFBQyxRQUFRLEVBQUMsV0FBVyxFQUFDLFVBQVUsQ0FBRSxDQUFDO0lBQy9ELENBQUM7SUFFTyw2QkFBUyxHQUFqQixVQUFrQixHQUFZLEVBQUUsSUFBYSxFQUFDLFFBQXNCLEVBQUUsV0FBb0IsRUFBQyxVQUEwQjtRQUFuRyxvQkFBQSxFQUFBLFVBQVk7UUFBRSxxQkFBQSxFQUFBLFdBQWE7UUFBQyx5QkFBQSxFQUFBLGVBQXNCO1FBQUUsNEJBQUEsRUFBQSxrQkFBb0I7UUFBQywyQkFBQSxFQUFBLGtCQUEwQjtRQUVqSCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQ3RCO1lBQ0ksT0FBTztTQUNWO1FBQ0QsSUFBSSxVQUFVLEVBQ2Q7WUFDSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN2QztRQUNELElBQUksUUFBUSxHQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxFQUNSO1lBQ0ksSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUUsSUFBSSxDQUFFLENBQUM7U0FDekU7YUFFRDtZQUNJLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1NBQzlCO1FBQ0QsaUJBQU8sQ0FBQyxHQUFHLENBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLHNDQUFrQixHQUExQixVQUEyQixDQUFNO1FBQzdCLGlCQUFPLENBQUMsR0FBRyxDQUFFLG9DQUFvQyxDQUFFLENBQUM7UUFDcEQsSUFBRyxDQUFDLEVBQ0o7WUFDSSxpQkFBTyxDQUFDLEdBQUcsQ0FBRSxDQUFDLENBQUUsQ0FBQztTQUNwQjtRQUNELFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFTyx5Q0FBcUIsR0FBN0IsVUFBOEIsQ0FBTTtJQUNwQyxDQUFDO0lBRU8seUNBQXFCLEdBQTdCLFVBQThCLENBQU07UUFDaEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckMsaUJBQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2pDO1lBQ0ksSUFBSSxRQUFRLEdBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxRQUFRLEdBQVksUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMxQyxJQUFJLFdBQVcsR0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQzNDLElBQUksSUFBSSxHQUFPLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUUsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFDdEI7Z0JBQ0ksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFFLFdBQVcsQ0FBRSxFQUN0QztvQkFDSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUUsQ0FBQyxFQUFFLFNBQVM7cUJBQ2hDO3dCQUNJLElBQUksUUFBUSxJQUFJLFdBQVcsRUFDM0I7NEJBQ0ksUUFBUSxDQUFDLElBQUksQ0FBRSxXQUFXLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDO3lCQUM1QztxQkFDSjt5QkFDRyxPQUFPO3FCQUNYO3FCQUVDO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFTyxnQ0FBWSxHQUFwQjtRQUVJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNqQztZQUNJLElBQUksWUFBWSxHQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxZQUFZLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFDbkM7Z0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBRSxZQUFZLENBQUMsR0FBRyxFQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxZQUFZLENBQUMsV0FBVyxFQUFDLFlBQVksQ0FBQyxVQUFVLENBQUUsQ0FBQzthQUNoSTtpQkFFRDtnQkFDSSxJQUFJLENBQUMsU0FBUyxDQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUMsWUFBWSxDQUFDLElBQUksRUFBQyxZQUFZLENBQUMsUUFBUSxFQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBRSxDQUFDO2FBQy9IO1NBQ0o7SUFDTCxDQUFDO0lBQ0wsZ0JBQUM7QUFBRCxDQTlLQSxBQThLQyxDQTlLc0MsSUFBSSxDQUFDLGVBQWUsR0E4SzFEOzs7OztBQ3JMRCxtREFBa0Q7QUFDbEQsc0NBQWlDO0FBRWpDLDZEQUF3RDtBQUV4RDtJQUFBO1FBTUk7O1dBRUc7UUFDSyxrQkFBYSxHQUFVLENBQUMsQ0FBQztRQUVqQzs7V0FFRztRQUNLLGdCQUFXLEdBQVUsQ0FBQyxDQUFDO1FBRS9COztXQUVHO1FBQ0sscUJBQWdCLEdBQVcsS0FBSyxDQUFDO0lBcUk3QyxDQUFDO0lBbklpQixzQkFBVyxHQUF6QjtRQUNJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1NBQ3JDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPO0lBQ0Esa0NBQWEsR0FBcEIsVUFBcUIsUUFBZTtRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUN0QztZQUNJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDckQ7WUFDRCxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRU0sOEJBQVMsR0FBaEI7UUFDSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTywyQkFBTSxHQUFkLFVBQWUsQ0FBYTtRQUFiLGtCQUFBLEVBQUEsUUFBYTtRQUN4QixpQkFBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRU8saUNBQVksR0FBcEI7UUFFSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUcsSUFBSSxDQUFDLElBQUksRUFDWjtZQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDcEI7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQ0FBVyxHQUFsQixVQUFvQixZQUF1QjtRQUF2Qiw2QkFBQSxFQUFBLGdCQUF1QjtRQUV2QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFDcEI7WUFDSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUN0QjtnQkFDSSxJQUFJLENBQUMsYUFBYSxHQUFFLFlBQVksQ0FBQzthQUNwQztZQUNELHVCQUFVLENBQUMsYUFBYSxDQUFFLHNCQUFZLENBQUMsWUFBWSxDQUFFLENBQUM7U0FDekQ7SUFDTCxDQUFDO0lBRU8sa0NBQWEsR0FBckIsVUFBc0IsQ0FBYTtRQUFiLGtCQUFBLEVBQUEsUUFBYTtRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLGlCQUFPLENBQUMsR0FBRyxDQUFFLFdBQVcsQ0FBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFDLENBQUMsQ0FBQztRQUNyQix1QkFBVSxDQUFDLGFBQWEsQ0FBRSxzQkFBWSxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQzFELENBQUM7SUFHTyxtQ0FBYyxHQUF0QjtRQUVJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTyxrQ0FBYSxHQUFyQjtRQUVJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFHRCxRQUFRO0lBQ0EsaUNBQVksR0FBcEIsVUFBcUIsS0FBaUI7UUFBakIsc0JBQUEsRUFBQSxZQUFpQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsaUJBQU8sQ0FBQyxHQUFHLENBQUUsYUFBYSxDQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsdUJBQVUsQ0FBQyxhQUFhLENBQUMsc0JBQVksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELFVBQVU7SUFDSCxnQ0FBVyxHQUFsQixVQUFtQixHQUFXLEVBQUUsSUFBUyxFQUFFLFVBQTBCO1FBQTFCLDJCQUFBLEVBQUEsaUJBQTBCO1FBQ2pFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDcEM7WUFDSSxJQUFJLFVBQVUsRUFDZDtnQkFDSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDeEI7WUFDRCxJQUFJLENBQUMsSUFBSSxFQUNUO2dCQUNJLElBQUksR0FBQyxFQUFFLENBQUM7YUFDWDtZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3REO2FBRUQ7WUFDSSxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRCxhQUFhO0lBQ2IsZ0RBQWdEO0lBQ3hDLHFDQUFnQixHQUF4QixVQUF5QixHQUFlO1FBQWYsb0JBQUEsRUFBQSxVQUFlO1FBQ3BDLElBQUksVUFBVSxHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsaUJBQU8sQ0FBQyxHQUFHLENBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFFLENBQUM7SUFDakQsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0F4SkEsQUF3SkMsSUFBQTs7Ozs7QUM3SkQsc0NBQWlDO0FBQ2pDLHVDQUFzQztBQUN0Qyw0REFBdUQ7QUFDdkQscUVBQWdFO0FBRWhFOztFQUVFO0FBQ0Y7SUFBeUMsK0JBQW9CO0lBS3pEO1FBQUEsWUFDSSxpQkFBTyxTQUVWO1FBSk8sZ0JBQVUsR0FBUyxJQUFJLENBQUM7UUFHNUIsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDOztJQUNoQixDQUFDO0lBRWEsdUJBQVcsR0FBekI7UUFFSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUMxQjtZQUNJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUN0QztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRU0sMEJBQUksR0FBWDtRQUVJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLDBCQUFJLEdBQVgsVUFBYSxHQUFVLEVBQUMsSUFBYTtRQUFiLHFCQUFBLEVBQUEsV0FBYTtRQUVqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQ25CO1lBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFFLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRU0sZ0NBQVUsR0FBakIsVUFBbUIsSUFBVyxFQUFDLElBQWdCLEVBQUMsR0FBYyxFQUFDLEtBQWMsRUFBQyxLQUFpQjtRQUFoRSxxQkFBQSxFQUFBLFNBQWdCO1FBQUMsb0JBQUEsRUFBQSxPQUFjO1FBQUMsc0JBQUEsRUFBQSxTQUFjO1FBQUMsc0JBQUEsRUFBQSxVQUFpQjtRQUUzRixRQUFRLGVBQU0sQ0FBQyxXQUFXLEVBQzFCO1lBQ0ksS0FBSyxzQkFBWSxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQWEsQ0FBQyxlQUFlLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBRSxDQUFDO2dCQUNsRixNQUFNO1NBQ1Q7SUFDTCxDQUFDO0lBRU8sb0NBQWMsR0FBdEIsVUFBd0IsR0FBVSxFQUFDLElBQVcsRUFBQyxJQUFXLEVBQUUsR0FBYyxFQUFDLEtBQVksRUFBQyxLQUFZO1FBQXhDLG9CQUFBLEVBQUEsT0FBYztRQUV0RSxJQUFJLEtBQUssR0FBTyxFQUFFLENBQUM7UUFDbkIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxRQUFRLEdBQUcsZUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNqQyxLQUFLLENBQUMsUUFBUSxHQUFHLGVBQU0sQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUMsS0FBSyxDQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLCtCQUFTLEdBQWpCLFVBQWtCLEdBQVUsRUFBQyxJQUFhO1FBQWIscUJBQUEsRUFBQSxXQUFhO1FBRXRDLElBQUksSUFBSSxFQUNSO1lBQ0ksSUFBSSxPQUFPLEdBQVUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxlQUFNLENBQUMsT0FBTyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFFLElBQUksQ0FBRSxDQUFDO1lBQ3BFLGlCQUFPLENBQUMsR0FBRyxDQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUNMLGtCQUFDO0FBQUQsQ0FsRUEsQUFrRUMsQ0FsRXdDLElBQUksQ0FBQyxlQUFlLEdBa0U1RDs7Ozs7QUMxRUQ7Ozs7R0FJRztBQUNILElBQWMsV0FBVyxDQXdCeEI7QUF4QkQsV0FBYyxXQUFXO0lBQ3JCOztPQUVHO0lBQ1EsNEJBQWdCLEdBQVcsa0JBQWtCLENBQUM7SUFDekQ7O09BRUc7SUFDUSx5QkFBYSxHQUFXLGVBQWUsQ0FBQztJQUVuRDs7T0FFRztJQUNRLDJCQUFlLEdBQVcsaUJBQWlCLENBQUM7SUFDdkQ7O09BRUc7SUFDUSwyQkFBZSxHQUFXLGlCQUFpQixDQUFDO0lBRXZEOztPQUVHO0lBQ1EsNEJBQWdCLEdBQVUsa0JBQWtCLENBQUM7QUFFNUQsQ0FBQyxFQXhCYSxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQXdCeEI7Ozs7QUM3QkQ7SUFBQTtJQWdCQSxDQUFDO0lBZEc7O09BRUc7SUFDSSxtQ0FBc0IsR0FBVSx3QkFBd0IsQ0FBQztJQUVoRTs7T0FFRztJQUNJLHlCQUFZLEdBQVUsY0FBYyxDQUFDO0lBRTVDOztPQUVHO0lBQ0ksbUNBQXNCLEdBQVUsd0JBQXdCLENBQUM7SUFDcEUsbUJBQUM7Q0FoQkQsQUFnQkMsSUFBQTtrQkFoQm9CLFlBQVk7Ozs7QUNFakM7O0VBRUU7QUFDRjtJQUE0QiwwQkFBb0I7SUFFNUM7ZUFDSSxpQkFBTztJQUNYLENBQUM7SUFFTSx3QkFBTyxHQUFkLFVBQWdCLElBQVE7UUFFcEIsSUFBSSxJQUFJLEVBQ1I7WUFDSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksRUFDbEI7Z0JBQ0ksSUFBSSxLQUFLLEdBQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQ2pCO29CQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JCO2dCQUNELE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixzQ0FBc0M7Z0JBQ3RDLElBQUk7YUFDUDtTQUNKO0lBQ0wsQ0FBQztJQUVNLDhCQUFhLEdBQXBCLFVBQXFCLElBQVksRUFBRSxJQUFVO1FBRXpDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFTCxhQUFDO0FBQUQsQ0E5QkEsQUE4QkMsQ0E5QjJCLElBQUksQ0FBQyxlQUFlLEdBOEIvQztBQTlCWSx3QkFBTTs7OztBQ0xuQixnREFBMkM7QUFFM0M7O0VBRUU7QUFDRjtJQUFxQywyQkFBb0I7SUFBekQ7UUFBQSxxRUF5QkM7UUF0Qkc7O1dBRUc7UUFDSCxTQUFHLEdBQVUsQ0FBQyxDQUFDO1FBRWY7O1dBRUc7UUFDSCxVQUFJLEdBQVUsQ0FBQyxDQUFDO1FBRWhCOztXQUVHO1FBQ0gsaUJBQVcsR0FBVSxFQUFFLENBQUM7O0lBUzVCLENBQUM7SUFQVSx1QkFBSyxHQUFaO1FBRUksSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLG9CQUFVLENBQUMsUUFBUSxDQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUMsSUFBSSxDQUFFLENBQUM7SUFDaEQsQ0FBQztJQXRCTSxlQUFPLEdBQVUsU0FBUyxDQUFDO0lBdUJ0QyxjQUFDO0NBekJELEFBeUJDLENBekJvQyxJQUFJLENBQUMsZUFBZSxHQXlCeEQ7a0JBekJvQixPQUFPOzs7O0FDSjVCO0lBQW9DLGtDQUFvQjtJQXdCcEQsd0JBQW1CLFVBQTJCO1FBQTlDLFlBQ0ksaUJBQU8sU0FPVjtRQWZNLFNBQUcsR0FBVSxDQUFDLENBQUM7UUFDZixZQUFNLEdBQVUsQ0FBQyxDQUFDO1FBQ2xCLFdBQUssR0FBVSxDQUFDLENBQUM7UUFFakIsVUFBSSxHQUFVLENBQUMsQ0FBQztRQThCZixpQkFBVyxHQUFXLEtBQUssQ0FBQztRQW1DNUIsb0JBQWMsR0FBVyxLQUFLLENBQUM7UUE1RG5DLEtBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsS0FBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQixLQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNsQixLQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLEtBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFDLEtBQUksRUFBRSxLQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7O0lBQ3RFLENBQUM7SUFPTSx5Q0FBZ0IsR0FBdkIsVUFBeUIsT0FBVyxFQUFDLFlBQVksRUFBQyxZQUFxQixFQUFDLFVBQW1CO1FBRXZGLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxnQ0FBTyxHQUFkLFVBQWUsR0FBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFHTyxvQ0FBVyxHQUFuQixVQUFvQixHQUFlO1FBQy9CLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFDLGFBQWE7WUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRixJQUFJLEVBQUUsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLEVBQUUsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUN2QztnQkFDSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUM7YUFDNUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztTQUNuRTtJQUNMLENBQUM7SUFFTyxrQ0FBUyxHQUFqQixVQUFrQixHQUFtQjtRQUFuQixvQkFBQSxFQUFBLFVBQW1CO1FBQ2pDLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQ3pDO2dCQUNJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUUsQ0FBQzthQUM5QztTQUNKO0lBQ0wsQ0FBQztJQUdNLGdDQUFPLEdBQWQ7UUFFSSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFTyxvQ0FBVyxHQUFuQixVQUFvQixHQUFlO1FBQy9CLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEQsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbkMsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbkMsSUFBSSxLQUFLLEdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDMUMsSUFBSSxLQUFLLEdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzdDLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUU3QyxJQUFJLE9BQU8sR0FBVyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNsRCxJQUFJLE9BQU8sR0FBVyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNsRCxJQUFJLElBQUksR0FBVSxDQUFDLENBQUM7WUFDcEIsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsRUFDN0I7Z0JBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDM0I7aUJBRUQ7Z0JBQ0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsRUFDaEM7Z0JBQ0ksT0FBTzthQUNWO1lBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUNmO2dCQUNJLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQ3pCO29CQUNJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztpQkFDbkI7cUJBRUQ7b0JBQ0ksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO29CQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7aUJBQzNDO2FBQ0o7aUJBQ0ksSUFBSSxPQUFPLElBQUksQ0FBQyxFQUNyQjtnQkFDSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNsQjtpQkFFRDtnQkFDSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQzFCO29CQUNJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2lCQUNwQjtxQkFFRDtvQkFDSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7b0JBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtZQUNELElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLElBQUksSUFBSSxHQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxJQUFJLElBQUksR0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsSUFBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUNqQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDakMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1lBQ3RDLElBQUcsT0FBTyxHQUFHLENBQUM7Z0JBQ1YsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFHLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUNuQyxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFFLE9BQU8sR0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsRUFDbEY7Z0JBQ0ksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFFLENBQUM7YUFDdEQ7U0FDSjtJQUNMLENBQUM7SUFFTSxnQ0FBTyxHQUFkO1FBRUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBN0tELG1DQUFtQztJQUVyQiw2QkFBYyxHQUFXLGdCQUFnQixDQUFDO0lBQzFDLHlCQUFVLEdBQVcsWUFBWSxDQUFDO0lBMktwRCxxQkFBQztDQXhMRCxBQXdMQyxDQXhMbUMsSUFBSSxDQUFDLGVBQWUsR0F3THZEO0FBeExZLHdDQUFjOzs7O0FDRDNCLHlEQUF3RDtBQUN4RCxtREFBOEM7QUFFOUMsdURBQWtEO0FBQ2xELHNFQUFxRTtBQUNyRSxxRUFBZ0U7QUFDaEUsbUVBQThEO0FBQzlELDhEQUF5RDtBQUN6RCx3RUFBbUU7QUFDbkUsaUVBQTREO0FBQzVELHlEQUFvRDtBQUNwRCxnRUFBMkQ7QUFDM0Qsa0VBQTZEO0FBQzdELGtFQUE2RDtBQUM3RCw4REFBeUQ7QUFDekQsZ0VBQTJEO0FBQzNELDBEQUFxRDtBQUNyRCw4REFBK0Q7QUFDL0Qsa0VBQWlFO0FBQ2pFLGtGQUFpRjtBQUNqRiw4RUFBNkU7QUFFN0UsMENBQXlDO0FBRXpDO0lBQXdDLDhCQUFVO0lBSTlDO2VBQWdCLGlCQUFPO0lBQUUsQ0FBQztJQUVoQiw4QkFBUyxHQUFuQjtRQUVJLElBQUksQ0FBQyxZQUFZLENBQUUsdUJBQWEsQ0FBQywwQkFBMEIsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQ3pGLENBQUM7SUFFTSwrQkFBVSxHQUFqQjtRQUVJLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBRSxxQkFBVyxDQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUN4QjtZQUNJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQjthQUVEO1lBQ0ksdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUMxQjtRQUNELHVDQUF1QztJQUMzQyxDQUFDO0lBQ0QsNEJBQU8sR0FBUDtRQUFBLGlCQXVCQztRQXJCRyxXQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLFdBQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO1lBRVYsSUFBSSxHQUFHLElBQUksT0FBTyxFQUNsQjtnQkFDSSxXQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRSxXQUFLLENBQUMsWUFBWSxHQUFHLHNCQUFzQixHQUFHLFdBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNsSCxhQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsV0FBSyxDQUFDLFlBQVksRUFBQyxXQUFLLENBQUMsaUJBQWlCLEVBQUM7b0JBRTVELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7d0JBQzFCLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckIsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QixDQUFDLENBQUMsQ0FBQzthQUNOO2lCQUVEO2dCQUNJLFdBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNsQjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELCtCQUFVLEdBQVY7UUFBQSxpQkFnQkM7UUFkRyxXQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFdBQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO1lBRWQsSUFBSSxHQUFHLElBQUksT0FBTyxFQUNsQjtnQkFDSSxXQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoQyxLQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzdCO2lCQUVEO2dCQUNJLFdBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNyQjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9DQUFlLEdBQWYsVUFBZ0IsR0FBVTtRQUFWLG9CQUFBLEVBQUEsVUFBVTtRQUV0QixXQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLElBQUcsR0FBRyxFQUNOO1lBQ0ksSUFBSSw2QkFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQUssQ0FBQyxXQUFXLEVBQUUsV0FBSyxDQUFDLFdBQVcsRUFBQyxlQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbkg7UUFDRCwrQkFBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEksaUJBQWlCO0lBQ3JCLENBQUM7SUFFRCx5Q0FBb0IsR0FBcEI7UUFFSSxXQUFLLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLFdBQUssQ0FBQyxhQUFhLENBQUMsNkJBQWEsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsaUNBQVksR0FBWixVQUFhLENBQUM7UUFFVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxrQ0FBYSxHQUFyQixVQUF1QixLQUFZO1FBRS9CLElBQUksV0FBVyxHQUFlLHFCQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBRSxxQkFBVyxDQUFFLENBQUM7UUFDeEUsSUFBSSxXQUFXLEVBQ2Y7WUFDSSxXQUFXLENBQUMsUUFBUSxDQUFFLEtBQUssQ0FBRSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVPLGlDQUFZLEdBQXBCO1FBRUksaUJBQU8sQ0FBQyxHQUFHLENBQUUsTUFBTSxDQUFFLENBQUM7UUFDdEIscUJBQXFCO1FBQ3JCLElBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQ3hCO1lBQ0ksSUFBSSxDQUFDLFlBQVksRUFBRyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDcEI7YUFFRDtZQUNJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQix3QkFBd0I7WUFDeEIsbUJBQW1CO1lBQ25CLG9CQUFvQjtTQUN2QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGlDQUFZLEdBQXBCO1FBRUksSUFBSSxRQUFRLEdBQU8sNkJBQWEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0UsaUJBQU8sQ0FBQyxHQUFHLENBQUUsUUFBUSxFQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQ2pDLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQzlCO1lBQ0ksSUFBSSxHQUFHLEdBQWlCLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFRLENBQUM7WUFDYixJQUFJLElBQUksR0FBVSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzdCLEtBQUssQ0FBQyxHQUFDLENBQUMsRUFBQyxDQUFDLEdBQUMsSUFBSSxFQUFDLENBQUMsRUFBRSxFQUNuQjtnQkFDSSxJQUFJLE9BQU8sR0FBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxHQUFHLEdBQVEsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0I7cUJBQ0k7b0JBQ0QsaUJBQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN0QzthQUNKO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTywrQkFBVSxHQUFsQjtRQUVJLElBQUksT0FBTyxHQUFjLEVBQUUsQ0FBQztRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFFLEVBQUUsR0FBRyxFQUFDLHVCQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFFLENBQUM7UUFDbkYseUJBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFDLElBQUksQ0FBQyxhQUFhLEVBQUMsS0FBSyxDQUFFLENBQUM7SUFDdEcsQ0FBQztJQUVPLG1DQUFjLEdBQXRCO1FBRUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNkJBQVEsR0FBaEI7UUFFTSxJQUFJLENBQUMsUUFBUSxDQUFFLHVCQUFhLENBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBRSxtQkFBUyxDQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTyw4QkFBUyxHQUFqQjtRQUVJLE9BQU8sQ0FBQyxHQUFHLENBQUUsV0FBVyxFQUFDLGtCQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUUsbUJBQVMsQ0FBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQ0FBVyxHQUFuQjtRQUVJLElBQUksUUFBUSxHQUFVLHdCQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLHVCQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLEVBQUUsRUFDOUI7WUFDSSxJQUFJLEdBQUcsR0FBaUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQVEsQ0FBQztZQUNiLElBQUksSUFBSSxHQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDN0IsS0FBSyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsR0FBQyxJQUFJLEVBQUMsQ0FBQyxFQUFFLEVBQ25CO2dCQUNJLElBQUksT0FBTyxHQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLEdBQUcsR0FBUSxVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLEdBQUcsRUFBRTtvQkFDTCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQjtxQkFDSTtvQkFDRCxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDO2FBQ0o7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQXhNTSxjQUFHLEdBQVUsWUFBWSxDQUFDO0lBME1uQixzQkFBVyxHQUN6QjtRQUNJLE9BQU8sRUFBQyxpQkFBTztRQUNmLFFBQVEsRUFBQyxrQkFBUTtRQUNqQixRQUFRLEVBQUMsa0JBQVE7UUFDakIsTUFBTSxFQUFDLGdCQUFNO1FBQ2IsT0FBTyxFQUFDLGlCQUFPO0tBQ2xCLENBQUE7SUFDTCxpQkFBQztDQXBORCxBQW9OQyxDQXBOdUMsb0JBQVUsR0FvTmpEO2tCQXBOb0IsVUFBVTs7OztBQ3hCL0IsNkRBQXdEO0FBRXhEO0lBQXlDLCtCQUFRO0lBSTdDO2VBRUksa0JBQU0sU0FBUyxFQUFDLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRVMsNEJBQU0sR0FBaEI7UUFFSSxpQkFBTSxNQUFNLFdBQUUsQ0FBQztJQUNuQixDQUFDO0lBRVMsOEJBQVEsR0FBbEI7SUFHQSxDQUFDO0lBRVMsK0JBQVMsR0FBbkI7SUFHQSxDQUFDO0lBRU0sOEJBQVEsR0FBZixVQUFpQixLQUFZO1FBRXpCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRVMsZ0NBQVUsR0FBcEI7SUFHQSxDQUFDO0lBRU0sNkJBQU8sR0FBZDtRQUVJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixpQkFBTSxPQUFPLFdBQUUsQ0FBQztJQUNwQixDQUFDO0lBcENNLGVBQUcsR0FBVSxhQUFhLENBQUM7SUFxQ3RDLGtCQUFDO0NBdkNELEFBdUNDLENBdkN3QyxrQkFBUSxHQXVDaEQ7a0JBdkNvQixXQUFXOzs7O0FDRmhDLCtDQUE4QztBQUM5Qyx1RUFBc0U7QUFDdEUsNEVBQTJFO0FBQzNFLG9FQUFtRTtBQUNuRSw2REFBd0Q7QUFFeEQ7O0VBRUU7QUFDRjtJQUFBO0lBNkVBLENBQUM7SUFuRWlCLHlCQUFXLEdBQXpCO1FBRUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQ25CO1lBQ0ksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTSxpQ0FBUyxHQUFoQjtRQUVJLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzdCLHVCQUFVLENBQUMsZ0JBQWdCLENBQUUsbUJBQVMsQ0FBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUUsQ0FBQztJQUNoRixDQUFDO0lBRU0sb0NBQVksR0FBbkIsVUFBcUIsSUFBVztRQUU1QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFDMUI7WUFDSSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDekM7WUFDSSxJQUFJLFFBQVEsR0FBVSxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM5Rix5QkFBeUI7WUFDekIsSUFBSTtZQUNKLGNBQWM7WUFDZCxJQUFJO1NBQ1A7UUFDRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDckM7WUFDSSxJQUFJLElBQUksR0FBZ0IsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2RCxtQ0FBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUUsSUFBSSxFQUFDLHlCQUFXLENBQUMsZUFBZSxDQUFFLENBQUM7WUFDOUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBRSxJQUFJLENBQUUsQ0FBQztTQUN6QjthQUVEO1lBQ0ksSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQzFDO2dCQUNJLElBQUksS0FBSyxHQUFnQixJQUFJLDJCQUFZLEVBQUUsQ0FBQztnQkFDNUMsbUNBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFFLEtBQUssRUFBQyx5QkFBVyxDQUFDLGVBQWUsQ0FBRSxDQUFDO2dCQUMvRSxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkMsS0FBSyxDQUFDLFFBQVEsQ0FBRSxJQUFJLENBQUUsQ0FBQzthQUMxQjtpQkFFRDtnQkFDSSxJQUFJLEtBQUssR0FBZ0IsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUQsS0FBSyxDQUFDLFFBQVEsQ0FBRSxJQUFJLENBQUUsQ0FBQztnQkFDdkIsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUM7U0FDSjtJQUNMLENBQUM7SUFDTSxtQ0FBVyxHQUFsQixVQUFvQixJQUFpQjtRQUVqQyxJQUFJLElBQUksRUFDUjtZQUNJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxHQUFVLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBRSxDQUFDO1lBQzlELElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUNmO2dCQUNJLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFFLEtBQUssRUFBQyxDQUFDLENBQUUsQ0FBQzthQUNoRDtZQUNELG1DQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLGVBQWUsQ0FBQyx5QkFBVyxDQUFDLGVBQWUsQ0FBRSxDQUFDO1lBQzdFLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBRSxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQztJQTFFTSxzQkFBUSxHQUF1QixFQUFFLENBQUM7SUFDbEMsMEJBQVksR0FBdUIsRUFBRSxDQUFDO0lBQ3RDLG9CQUFNLEdBQVUsRUFBRSxDQUFDO0lBQ25CLHFCQUFPLEdBQVcsS0FBSyxDQUFDO0lBd0VuQyxvQkFBQztDQTdFRCxBQTZFQyxJQUFBO0FBN0VZLHNDQUFhOzs7O0FDVDFCLDZEQUF3RDtBQUN4RCxvRUFBbUU7QUFDbkUsNkRBQXdEO0FBRXhEOztFQUVFO0FBQ0Y7SUFBa0MsZ0NBQVE7SUFNdEM7UUFBQSxZQUNJLGtCQUFPLFNBQVMsRUFBQyxVQUFVLENBQUUsU0FDaEM7UUFITSxhQUFPLEdBQVUsRUFBRSxDQUFDOztJQUczQixDQUFDO0lBRVMsNkJBQU0sR0FBaEI7UUFFSSxpQkFBTSxNQUFNLFdBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSwrQkFBUSxHQUFmLFVBQWlCLElBQVc7UUFFeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFFLEVBQUMsQ0FBQyxDQUFFLENBQUM7SUFDeEUsQ0FBQztJQUVPLHNDQUFlLEdBQXZCO1FBRUksdUJBQVUsQ0FBQyxhQUFhLENBQUUsbUJBQVMsQ0FBQyxZQUFZLEVBQUMsSUFBSSxDQUFFLENBQUM7SUFDNUQsQ0FBQztJQXhCYSxnQkFBRyxHQUFVLGNBQWMsQ0FBQztJQXlCOUMsbUJBQUM7Q0EzQkQsQUEyQkMsQ0EzQmlDLGtCQUFRLEdBMkJ6QztBQTNCWSxvQ0FBWTs7OztBQ1B6Qiw2REFBNEQ7QUFDNUQsaUVBQWdFO0FBQ2hFLDBEQUFxRDtBQUNyRCxnRUFBMkQ7QUFDM0QsMkRBQXNEO0FBR3RELDhEQUF5RDtBQUN6RCw2REFBd0Q7QUFDeEQsZ0VBQTJEO0FBQzNELDJEQUE0RDtBQUU1RDtJQUFBO1FBTUk7O1dBRUc7UUFDSCxpQkFBWSxHQUFVLENBQUMsQ0FBQztRQUVoQixzQkFBaUIsR0FBVSxDQUFDLENBQUM7UUFZN0IsbUJBQWMsR0FBVSxDQUFDLENBQUM7UUFDMUIsd0JBQW1CLEdBQVUsQ0FBQyxDQUFDO1FBRWhDLHFCQUFnQixHQUFpQixFQUFFLENBQUM7UUFtQ25DLG1CQUFjLEdBQVcsS0FBSyxDQUFDO1FBQy9CLGFBQVEsR0FBVSxDQUFDLENBQUM7UUFNcEIsZUFBVSxHQUFVLENBQUMsQ0FBQztRQTRDdEIsVUFBSyxHQUFVLENBQUMsQ0FBQztRQUNsQixjQUFTLEdBQVUsQ0FBQyxDQUFDO1FBQ3BCLFVBQUssR0FBVSxDQUFDLENBQUM7UUFDakIsU0FBSSxHQUFVLENBQUMsQ0FBQztJQTZENUIsQ0FBQztJQWxLaUIsNEJBQVcsR0FBekI7UUFFSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDbkI7WUFDSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBT00sK0JBQUksR0FBWDtRQUVJLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxpQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbkI7WUFDSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFFLGlCQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBRSxDQUFDO1NBQzVEO2FBRUQ7WUFDSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxvQ0FBUyxHQUFqQjtRQUVJLHVCQUFVLENBQUMsZ0JBQWdCLENBQUUsbUJBQVMsQ0FBQyxPQUFPLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FBQztRQUNuRSx1QkFBVSxDQUFDLGdCQUFnQixDQUFFLG1CQUFTLENBQUMsVUFBVSxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUUsQ0FBQztJQUNwRixDQUFDO0lBRU8sNENBQWlCLEdBQXpCLFVBQTJCLEdBQVU7UUFFakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBRSxHQUFHLENBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sd0NBQWEsR0FBcEIsVUFBc0IsS0FBc0I7UUFFeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLCtCQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFJLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxJQUFJLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FBQztJQUM3RixDQUFDO0lBSU8sb0NBQVMsR0FBakI7UUFFSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUMsSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFTyxvQ0FBUyxHQUFqQixVQUFtQixPQUFjO1FBRTdCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQzFCO1lBQ0ksSUFBSSxRQUFRLEdBQVUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNuRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzdDLElBQUksdUJBQWEsQ0FBQyxVQUFVLEVBQzVCO2dCQUNLLHVCQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBZSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFBLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUMsUUFBUSxHQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzlKO2lCQUVEO2dCQUNJLHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFBLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFBLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBQyxRQUFRLEdBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFFLENBQUM7YUFDek47U0FDSjtJQUNMLENBQUM7SUFFTyxrQ0FBTyxHQUFmO1FBRUksSUFBSSx1QkFBYSxDQUFDLFVBQVUsRUFDNUI7WUFDSyx1QkFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNFO2FBRUQ7WUFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUMxQjtnQkFDSSx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUUsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUUsQ0FBQztnQkFDcEUsc0RBQXNEO2dCQUN0RCxJQUFJO2dCQUNKLDBDQUEwQztnQkFDMUMsUUFBUTtnQkFDUixvRUFBb0U7Z0JBQ3BFLFFBQVE7Z0JBQ1IsZ0RBQWdEO2dCQUNoRCxRQUFRO2dCQUNSLHFFQUFxRTtnQkFDckUsV0FBVztnQkFDWCxJQUFJO2FBQ1A7U0FDSjtJQUNMLENBQUM7SUFNTSxpQ0FBTSxHQUFiLFVBQWUsRUFBUztRQUVwQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUMxQjtZQUNJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxPQUFPLEdBQU8sdUJBQWEsQ0FBQyxhQUFhLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxLQUFlLENBQUM7WUFDcEIsS0FBSyxDQUFDLElBQUksT0FBTyxFQUNqQjtnQkFDSSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQzVCO29CQUNJLElBQUksdUJBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFDdEU7d0JBQ0ksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUNoQjtvQkFDRCxJQUFJLENBQUMsSUFBSSxFQUFHLENBQUM7aUJBQ2hCO2FBQ0o7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLHVCQUFhLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRU0sb0NBQVMsR0FBaEI7UUFFSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixzQkFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUUsSUFBSSxDQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBRSxHQUFHLENBQUUsQ0FBQztRQUNuQix1QkFBVSxDQUFDLGFBQWEsQ0FBRSxtQkFBUyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ2hELHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELFdBQUssQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLG1DQUFRLEdBQWY7UUFFSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVNLGtDQUFPLEdBQWQ7UUFFSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixzQkFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sR0FBTyx1QkFBYSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLE9BQU8sRUFDWDtZQUNJLEtBQUssSUFBSSxDQUFDLElBQUksT0FBTyxFQUNyQjtnQkFDSyxPQUFPLENBQUMsQ0FBQyxDQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDcEM7U0FDSjtRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNMLHVCQUFDO0FBQUQsQ0FoTEEsQUFnTEMsSUFBQTs7Ozs7QUM1TEQsaUVBQTREO0FBQzVELDZEQUF3RDtBQUN4RCx5REFBd0Q7QUFDeEQsOERBQXlEO0FBQ3pELHdEQUFtRDtBQUNuRCxzREFBcUQ7QUFDckQsbUVBQThEO0FBQzlELDhEQUF5RDtBQUl6RCw4REFBK0Q7QUFFL0Q7SUFBdUMsNkJBQVU7SUFJN0M7ZUFBZ0IsaUJBQU87SUFBRSxDQUFDO0lBRWhCLDZCQUFTLEdBQW5CO1FBRUksSUFBSSxDQUFDLFlBQVksQ0FBRSxtQkFBUyxDQUFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBRSxDQUFDO0lBQ3BFLENBQUM7SUFFTyxrQ0FBYyxHQUF0QjtRQUVJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQ25ELENBQUM7SUFFTyxnQ0FBWSxHQUFwQjtRQUVJLElBQUksVUFBVSxHQUFVLDBCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNqRSxJQUFJLE9BQU8sR0FBVSxDQUFDLENBQUM7UUFDdkIsSUFBSSwwQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUMvRDtZQUNJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDdkMsV0FBSyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN4QzthQUVEO1lBQ0ksSUFBSSxHQUFHLEdBQWlCLHFCQUFTLENBQUMsV0FBVyxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzlFLE9BQU8sR0FBRyxxQkFBUyxDQUFDLFlBQVksQ0FBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7WUFDbEUsV0FBSyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN4QztRQUNELHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBRSx3QkFBYyxFQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxrQ0FBYyxHQUFyQjtRQUVJLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDN0MscUJBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFFLHdCQUFjLENBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUUsbUJBQVMsQ0FBQyxjQUFjLENBQUUsQ0FBQztRQUNuRCx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFTSw2QkFBUyxHQUFoQjtRQUVJLDBCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUEzQ00sYUFBRyxHQUFVLFdBQVcsQ0FBQztJQTZDcEMsZ0JBQUM7Q0EvQ0QsQUErQ0MsQ0EvQ3NDLG9CQUFVLEdBK0NoRDtrQkEvQ29CLFNBQVM7Ozs7QUNiOUIsaUVBQTREO0FBQzVELHFFQUFnRTtBQUNoRSw4REFBeUQ7QUFDekQseURBQXdEO0FBQ3hELG1FQUE4RDtBQUM5RCw2Q0FBd0M7QUFDeEMsbUVBQThEO0FBQzlELHNFQUFxRTtBQUNyRSx3REFBbUQ7QUFHbkQsOEVBQXlFO0FBRXpFLDhEQUF5RDtBQUt6RCxrRUFBaUU7QUFFakU7SUFBdUMsNkJBQVU7SUFPN0M7UUFBQSxZQUFnQixpQkFBTyxTQUFHO1FBSGxCLGFBQU8sR0FBVSxDQUFDLENBQUM7UUFDbkIsWUFBTSxHQUFVLENBQUMsQ0FBQzs7SUFFRCxDQUFDO0lBRWhCLDZCQUFTLEdBQW5CO0lBR0EsQ0FBQztJQUVNLDZCQUFTLEdBQWhCO1FBRUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUUsWUFBWSxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUMsSUFBSSxDQUFFLENBQUM7SUFDOUcsQ0FBQztJQUVPLGdDQUFZLEdBQXBCO1FBRUksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUUsYUFBYSxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUMsSUFBSSxDQUFFLENBQUM7SUFDOUcsQ0FBQztJQUVPLCtCQUFXLEdBQW5CO1FBRUksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBQzVCLElBQUksTUFBTSxHQUFpQixFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBRSx1QkFBVSxDQUFDLFVBQVUsQ0FBRSxZQUFZLENBQUUsQ0FBRSxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUUsdUJBQVUsQ0FBQyxVQUFVLENBQUUsVUFBVSxDQUFFLENBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFFLHVCQUFVLENBQUMsVUFBVSxDQUFFLFdBQVcsQ0FBRSxDQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBRSx1QkFBVSxDQUFDLFVBQVUsQ0FBRSxXQUFXLENBQUUsQ0FBRSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUUsdUJBQVUsQ0FBQyxVQUFVLENBQUUsYUFBYSxDQUFFLENBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFFLHVCQUFVLENBQUMsVUFBVSxDQUFFLFVBQVUsQ0FBRSxDQUFFLENBQUM7UUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBRSx1QkFBVSxDQUFDLFVBQVUsQ0FBRSxRQUFRLENBQUUsQ0FBRSxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUUsdUJBQVUsQ0FBQyxVQUFVLENBQUUsa0JBQWtCLENBQUUsQ0FBRSxDQUFDO1FBQzNELHlEQUF5RDtRQUN6RCxNQUFNLENBQUMsSUFBSSxDQUFFLHVCQUFVLENBQUMsY0FBYyxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxDQUFFLENBQUM7UUFDckUsSUFBSSxHQUFHLEdBQWlCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ2hELElBQUksQ0FBQyxHQUFVLENBQUMsQ0FBQztRQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxFQUFFLEVBQzdCO1lBQ0ksSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFFLHVCQUFVLENBQUMsVUFBVSxDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQzNEO2dCQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUUsdUJBQVUsQ0FBQyxVQUFVLENBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsSUFBSSxNQUFNLEdBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2pELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFDaEM7WUFDSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUUsdUJBQVUsQ0FBQyxjQUFjLENBQUUsZ0JBQU0sQ0FBQyxJQUFJLENBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDLElBQUksQ0FBRSxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3pGO2dCQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUUsdUJBQVUsQ0FBQyxjQUFjLENBQUUsZ0JBQU0sQ0FBQyxJQUFJLENBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFDLElBQUksQ0FBRSxDQUFFLENBQUM7YUFDaEY7U0FDSjtRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFDaEM7WUFDSSxPQUFPLENBQUMsSUFBSSxDQUFFLEVBQUUsR0FBRyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQUM7U0FDckM7UUFDRCx5QkFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBRSxPQUFPLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQ3BHLENBQUM7SUFFTyxrQ0FBYyxHQUF0QjtRQUVJLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLHlCQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFFLE1BQU0sRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFDLEtBQUssQ0FBRSxDQUFDO0lBQ3JHLENBQUM7SUFFTyxnQ0FBWSxHQUFwQixVQUFzQixLQUFZO1FBRTlCLElBQUksV0FBVyxHQUFlLHFCQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBRSxxQkFBVyxDQUFFLENBQUM7UUFDeEUsSUFBSSxXQUFXLEVBQ2Y7WUFDSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFFLEtBQUssR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDO1lBQzFELFdBQVcsQ0FBQyxRQUFRLENBQUUsS0FBSyxDQUFFLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRU8sZ0NBQVksR0FBcEI7UUFFSSxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztRQUN0RCwwQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0Qyx3QkFBYyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBRSxNQUFNLENBQUUsQ0FBQztRQUNyRCxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUUscUJBQVcsQ0FBRSxDQUFDO1FBQ3hDLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBRSxrQkFBUSxDQUFFLENBQUM7UUFDbkMsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4Qyx3REFBd0Q7UUFDeEQseUNBQXlDO1FBQ3pDLGFBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8seUJBQUssR0FBYjtJQUdBLENBQUM7SUFuR00sYUFBRyxHQUFVLFdBQVcsQ0FBQztJQW9HcEMsZ0JBQUM7Q0F0R0QsQUFzR0MsQ0F0R3NDLG9CQUFVLEdBc0doRDtrQkF0R29CLFNBQVM7Ozs7QUNwQjlCLDZEQUF3RDtBQUN4RCx3REFBbUQ7QUFFbkQsNkRBQXdEO0FBQ3hELDhEQUF5RDtBQUN6RCw4REFBeUQ7QUFFekQscUVBQWdFO0FBQ2hFLDBEQUFxRDtBQUNyRCxpREFBNEM7QUFFNUMseURBQXdEO0FBQ3hELHNGQUFpRjtBQUNqRixrRkFBNkU7QUFFN0U7SUFBc0MsNEJBQVE7SUFnQjFDO2VBRUksa0JBQU0sTUFBTSxFQUFDLFVBQVUsQ0FBQztJQUM1QixDQUFDO0lBRVMseUJBQU0sR0FBaEI7UUFFSSxpQkFBTSxNQUFNLFdBQUUsQ0FBQztJQUNuQixDQUFDO0lBRVMsMkJBQVEsR0FBbEI7UUFFSSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUUsdUJBQWEsQ0FBRSxDQUFDO1FBQ3JELHVCQUFhLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkMsdUJBQWEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBRSxTQUFTLENBQUUsQ0FBQztRQUNyRCwwQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFUyw0QkFBUyxHQUFuQjtRQUVJLElBQUksQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLENBQUUsSUFBSSxDQUFDLFdBQVcsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO1FBQzdFLElBQUksQ0FBQyxZQUFZLENBQUUsbUJBQVMsQ0FBQyxjQUFjLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyxZQUFZLENBQUUsdUJBQWEsQ0FBQyw0QkFBNEIsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFFLENBQUM7SUFDcEcsQ0FBQztJQUVPLCtCQUFZLEdBQXBCO1FBRUkscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFFLHFCQUFXLENBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sNEJBQVMsR0FBakI7UUFFTSxJQUFJLENBQUMsUUFBUSxDQUFFLG1CQUFTLENBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVPLDRCQUFTLEdBQWpCO1FBRUkscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFFLHVCQUFhLENBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRU8sd0NBQXFCLEdBQTdCO1FBRUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFTyxvQ0FBaUIsR0FBekI7UUFFSSxJQUFJLE1BQU0sR0FBVSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUMvQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUN4QjtZQUNJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztTQUNsQzthQUVEO1lBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVPLDJCQUFRLEdBQWhCO1FBRUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBRSxtQkFBUyxDQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFuRk0sWUFBRyxHQUFVLFVBQVUsQ0FBQztJQXVGbkMsZUFBQztDQXpGRCxBQXlGQyxDQXpGcUMsa0JBQVEsR0F5RjdDO2tCQXpGb0IsUUFBUTs7OztBQ1o3QiwyREFBc0Q7QUFFdEQsbURBQWtEO0FBQ2xELDZEQUF3RDtBQUV4RDtJQUEyQyxpQ0FBYTtJQU9wRDtRQUFBLFlBQ0ksaUJBQU8sU0FDVjtRQUhNLGlCQUFXLEdBQVcsS0FBSyxDQUFDO1FBNkIzQixZQUFNLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ2hELFlBQU0sR0FBVSxDQUFDLENBQUM7UUFDbEIsaUJBQVcsR0FBVSxDQUFDLENBQUM7UUFDdkIsZ0JBQVUsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDOztJQTdCbkQsQ0FBQztJQUVNLCtCQUFPLEdBQWQ7UUFDSSxVQUFVO1FBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0sK0JBQU8sR0FBZCxVQUFnQixHQUFnQjtRQUU1QixJQUFJLFFBQVEsR0FBaUIscUJBQVMsQ0FBQyxXQUFXLENBQUUsaUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFFLENBQUM7UUFDNUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBRSxFQUFDLE1BQU0sQ0FBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUUsRUFBQyxNQUFNLENBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLGlFQUFpRTtJQUNyRSxDQUFDO0lBRU0sK0JBQU8sR0FBZDtRQUNJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDeEMsU0FBUztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRSxpQ0FBaUM7SUFDckMsQ0FBQztJQU1NLGdDQUFRLEdBQWY7UUFFSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQ3BCO1lBQ0ksSUFBSSx1QkFBYSxDQUFDLFVBQVUsRUFDNUI7Z0JBQ0ksSUFBSSx1QkFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDbEM7b0JBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUUsdUJBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUUsQ0FBQztvQkFDbEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLHVCQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUM3RSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBRSx1QkFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUUsQ0FBQztpQkFDL0Y7YUFDSjtpQkFFRDtnQkFDSSxJQUFJLHVCQUFhLENBQUMsUUFBUSxFQUMxQjtvQkFDSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBRSx1QkFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBRSxDQUFDO29CQUMxRiwrREFBK0Q7b0JBQy9ELDBDQUEwQztvQkFDMUMsbUZBQW1GO29CQUVuRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFDLEVBQUUsR0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFFLENBQUM7b0JBQ2pHLGlGQUFpRjtvQkFDakYsbUZBQW1GO29CQUNuRixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsdUJBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLHVCQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUUsQ0FBQztpQkFDekQ7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVNLHNDQUFjLEdBQXJCLFVBQXNCLFNBQXNCLEVBQUUsS0FBa0I7UUFFNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUUsS0FBSyxFQUFDLEtBQUssQ0FBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFFLFNBQVMsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFFLENBQUM7SUFDcEQsQ0FBQztJQUNMLG9CQUFDO0FBQUQsQ0FqRkEsQUFpRkMsQ0FqRjBDLElBQUksQ0FBQyxRQUFRLEdBaUZ2RDs7Ozs7QUN6RkQsb0RBQStDO0FBQy9DLDhEQUF5RDtBQUN6RCwyREFBc0Q7QUFDdEQsdURBQWtEO0FBRWxELG9FQUErRDtBQUMvRCwyREFBc0Q7QUFDdEQsK0RBQTBEO0FBRTFELGlEQUE0QztBQUM1QyxpRUFBZ0U7QUFDaEUsMERBQXFEO0FBQ3JELG1EQUFrRDtBQUNsRCw2REFBd0Q7QUFDeEQsZ0VBQTJEO0FBQzNELDJFQUFzRTtBQUV0RTtJQUE2QyxtQ0FBYTtJQW9CdEQ7UUFBQSxZQUVJLGlCQUFPLFNBQ1Y7UUFqQkQ7O1dBRUc7UUFDSyxlQUFTLEdBQVUsRUFBRSxDQUFDO1FBUzlCLGlCQUFXLEdBQVUsRUFBRSxDQUFDO1FBcUVoQixnQkFBVSxHQUFXLEtBQUssQ0FBQztRQUMzQix3QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsbUJBQWEsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBSTlDLG1CQUFhLEdBQVUsRUFBRSxDQUFDO1FBRTFCLG1CQUFhLEdBQVUsRUFBRSxDQUFDO1FBQ2xDOztXQUVHO1FBQ0ssaUJBQVcsR0FBVSxDQUFDLENBQUM7UUFPdkIsc0JBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQ3JDOztXQUVHO1FBQ0ssZ0JBQVUsR0FBVSxDQUFDLENBQUM7UUFFdEIsaUJBQVcsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBK1I1QyxnQkFBVSxHQUFVLEVBQUUsQ0FBQztRQUN2QixlQUFTLEdBQVUsQ0FBQyxDQUFDO1FBRXJCLG1CQUFhLEdBQVcsS0FBSyxDQUFDO1FBQzlCLHNCQUFnQixHQUFVLENBQUMsQ0FBQztRQUM1QixxQkFBZSxHQUFVLENBQUMsQ0FBQztRQUVuQzs7V0FFRztRQUNLLHFCQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLG9CQUFjLEdBQVUsQ0FBQyxDQUFDO1FBQzFCLG1CQUFhLEdBQVcsS0FBSyxDQUFDO1FBQzlCLGtCQUFZLEdBQVUsQ0FBQyxDQUFDO1FBQ3hCLHVCQUFpQixHQUFXLEtBQUssQ0FBQztRQUVsQyxnQkFBVSxHQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUUsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUUsQ0FBQztRQTRPcEQsY0FBUSxHQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDekMsa0JBQVksR0FBVyxLQUFLLENBQUM7UUFDN0IsZUFBUyxHQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUMsZUFBUyxHQUFVLENBQUMsQ0FBQztRQUNyQixXQUFLLEdBQVUsQ0FBQyxDQUFDO1FBQ2xCLE9BQUMsR0FBUSxFQUFFLENBQUMsQ0FBQSxPQUFPO1FBZ1ZsQixhQUFPLEdBQVcsS0FBSyxDQUFDO1FBQ3hCLG1CQUFhLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hELGtCQUFZLEdBQVUsQ0FBQyxDQUFDO1FBQ3hCLG9CQUFjLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQWlCL0Msa0JBQVksR0FBVSxDQUFDLENBQUM7UUFFeEIsaUJBQVcsR0FBVyxLQUFLLENBQUM7UUFFNUIsZ0JBQVUsR0FBbUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDOztJQWorQnpELENBQUM7SUFFTSxpQ0FBTyxHQUFkO1FBRUksSUFBSSxDQUFDLFNBQVMsR0FBSSxJQUFJLENBQUMsS0FBdUIsQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBRSxDQUFDO1FBQzdFLHVCQUFhLENBQUMsV0FBVyxDQUFFLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBRSxDQUFDO1FBQzlDLElBQUksRUFBRSxHQUFpQixJQUFJLENBQUMsS0FBc0IsQ0FBQztRQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBSSx1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBRSx1QkFBYSxDQUFvQixDQUFDLE1BQU0sQ0FBQztRQUM3RixFQUFFLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBQyxXQUFXLENBQXdCLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQXVCLENBQUM7UUFDdkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBdUIsQ0FBQztJQUM3RSxDQUFDO0lBRU0sa0NBQVEsR0FBZjtJQUdBLENBQUM7SUFFTSxpQ0FBTyxHQUFkO0lBR0EsQ0FBQztJQUdNLGtDQUFRLEdBQWY7UUFFSSxvQkFBb0I7UUFDcEIsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsR0FBRyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUM5QyxpQkFBTyxDQUFDLEdBQUcsQ0FBRSxLQUFLLENBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixzQkFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUUsSUFBSSxDQUFFLENBQUM7SUFDbEQsQ0FBQztJQUdELDJCQUEyQjtJQUMzQixpQ0FBaUM7SUFDakM7O09BRUc7SUFDSSwwQ0FBZ0IsR0FBdkIsVUFBd0IsU0FBd0I7UUFDNUMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssRUFDdkY7WUFDSSxJQUFJLFlBQVksR0FBcUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzdGO0lBQ0wsQ0FBQztJQWdCTSx5Q0FBZSxHQUF0QixVQUF3QixHQUFnQjtRQUVwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBVU8seUNBQWUsR0FBdkIsVUFBeUIsTUFBbUIsRUFBQyxNQUFnQixFQUFDLFNBQXNCO1FBRWhGLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsS0FBSyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3RFO1lBQ0ksT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELGlCQUFPLENBQUMsR0FBRyxDQUFFLE1BQU0sRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsQ0FBQztRQUNyRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUUsT0FBTyxDQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxhQUFhLENBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxXQUFXLENBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxtQkFBbUI7U0FDN0U7WUFDSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUUsT0FBTyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3BEO2dCQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzthQUNsRDtZQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxXQUFXLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDeEQ7Z0JBQ0ksSUFBSSxDQUFDLGFBQWEsR0FBRyx1QkFBYSxDQUFDLGdCQUFnQixDQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsQ0FBQzthQUM5RztpQkFFRDtnQkFDSSxJQUFJLENBQUMsYUFBYSxHQUFHLHVCQUFhLENBQUMsZ0JBQWdCLENBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBRSxDQUFDO2FBQzVHO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRyxJQUFJO2FBQ3JDO2dCQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFDbkY7b0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztvQkFDMUgsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQztpQkFDbkM7cUJBRUQ7b0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEtBQUssQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM5Qyw0REFBNEQ7b0JBQzVELDhDQUE4QztpQkFDakQ7YUFFSjtpQkFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDL0Q7Z0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQzthQUNuQztpQkFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNuQztnQkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxHQUFHLEVBQ3BDO29CQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QjtxQkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxLQUFLLEVBQzNDO29CQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QjtxQkFFRDtvQkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsVUFBVSxDQUFDO2lCQUMxQzthQUNKO2lCQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNsQztnQkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxHQUFHLEVBQ3BDO29CQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QjtxQkFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxLQUFLLEVBQzNDO29CQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QjtxQkFFRDtvQkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsV0FBVyxDQUFDO2lCQUMzQzthQUNKO2lCQUVEO2dCQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUM3QjtvQkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsU0FBUyxDQUFDO29CQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ2pEO2FBQ0o7U0FDSjthQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxZQUFZLENBQUUsSUFBSSxDQUFDLENBQUMsRUFBRyxPQUFPO1NBQ3hFO1lBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLFNBQVMsQ0FBQztZQUN0QyxpQ0FBaUM7U0FFcEM7YUFDSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDaEU7WUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsU0FBUyxDQUFDO1lBQ3RDLGlDQUFpQztTQUNwQzthQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxXQUFXLENBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsU0FBUyxFQUN2RztZQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUcsSUFBSTthQUNyQztnQkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDakQ7U0FDSjthQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxjQUFjLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDaEU7WUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLGlDQUFpQztTQUNwQzthQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxjQUFjLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDaEU7WUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsUUFBUSxDQUFDO1lBQ3JDLGlDQUFpQztTQUNwQzthQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxXQUFXLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDN0Q7WUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNqRDtJQUNMLENBQUM7SUFDRDs7T0FFRztJQUNLLHlDQUFlLEdBQXZCLFVBQXdCLFNBQXdCO1FBRTVDLHdCQUF3QjtRQUN4QixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUN2RjtZQUNJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksWUFBWSxHQUFxQixTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksVUFBVSxHQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDcEMsSUFBSSxVQUFVLElBQUksYUFBYSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUUsS0FBSyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3BFO2dCQUNJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUM7YUFDeEM7WUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUUsT0FBTyxDQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxhQUFhLENBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUUsV0FBVyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQUcsbUJBQW1CO2FBQzlFO2dCQUNJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxPQUFPLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDcEQ7b0JBQ0ksSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7b0JBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2lCQUNsRDtnQkFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUUsV0FBVyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3hEO29CQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsdUJBQWEsQ0FBQyxnQkFBZ0IsQ0FBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFFLENBQUM7aUJBQzlHO3FCQUVEO29CQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsdUJBQWEsQ0FBQyxnQkFBZ0IsQ0FBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFFLENBQUM7aUJBQzVHO2FBQ0o7U0FDSjtJQUVMLENBQUM7SUFDRDs7T0FFRztJQUNJLHlDQUFlLEdBQXRCLFVBQXVCLFNBQXdCO1FBRTNDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQ3ZGO1lBQ0ksSUFBSSxZQUFZLEdBQXFCLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBRSxZQUFZLENBQUMsTUFBTSxFQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFFLENBQUM7U0FDbEU7SUFDTCxDQUFDO0lBRU8sc0NBQVksR0FBcEIsVUFBc0IsTUFBbUIsRUFBQyxNQUFnQjtRQUV0RCxpQkFBTyxDQUFDLEdBQUcsQ0FBRSxNQUFNLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxhQUFhLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsS0FBSyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQ3RFO1lBQ0ksT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUNwQjtZQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLE9BQU87U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFDcEI7WUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNyQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUMxQztZQUNJLE9BQU87U0FDVjtRQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUUsWUFBWSxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQzdDO1lBQ0ksT0FBTztTQUNWO1FBQ0QsaUJBQU8sQ0FBQyxHQUFHLENBQUUsVUFBVSxDQUFFLENBQUM7UUFDMUIsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUNyQjtZQUNJLEtBQUsscUJBQVcsQ0FBQyxLQUFLLENBQUM7WUFDdkIsS0FBSyxxQkFBVyxDQUFDLFNBQVM7Z0JBQ3RCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBRSxXQUFXLENBQUUsSUFBSSxDQUFDLENBQUMsRUFDeEQ7b0JBQ0ksSUFBSSxDQUFDLFlBQVksQ0FBRSxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUM7aUJBQzFDO3FCQUVEO29CQUNJLHlIQUF5SDtvQkFDekgsZ0JBQWdCO29CQUNoQixJQUFJO29CQUNKLGlDQUFpQztvQkFDakMsbURBQW1EO29CQUNuRCx5QkFBeUI7b0JBQ3pCLElBQUk7b0JBQ0osT0FBTztvQkFDUCxJQUFJO29CQUNKLGtDQUFrQztvQkFDbEMsUUFBUTtvQkFDUixrREFBa0Q7b0JBQ2xELDRDQUE0QztvQkFDNUMsUUFBUTtvQkFDUix1Q0FBdUM7b0JBQ3ZDLFFBQVE7b0JBQ1IsaURBQWlEO29CQUNqRCw0Q0FBNEM7b0JBQzVDLFFBQVE7b0JBQ1IsSUFBSTtvQkFDSixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUN6Qjt3QkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsVUFBVSxDQUFDO3dCQUN2QyxpQ0FBaUM7cUJBQ3BDO3lCQUNJLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQzlCO3dCQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxTQUFTLENBQUM7d0JBQ3RDLGlDQUFpQztxQkFDcEM7aUJBQ0o7Z0JBQ0wsTUFBTTtZQUNOLEtBQUsscUJBQVcsQ0FBQyxXQUFXLENBQUM7WUFDN0IsS0FBSyxxQkFBVyxDQUFDLFVBQVU7Z0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO2dCQUMzQyxNQUFNO1lBQ04sS0FBSyxxQkFBVyxDQUFDLEdBQUc7Z0JBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO2dCQUMzQyxNQUFNO1lBQ04sS0FBSyxxQkFBVyxDQUFDLE9BQU87Z0JBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUUsQ0FBQztnQkFDekMsTUFBTTtTQUNUO0lBQ0wsQ0FBQztJQUVPLHNDQUFZLEdBQXBCLFVBQXNCLEtBQVk7UUFFOUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUNiO1lBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLFVBQVUsQ0FBQztZQUN2QyxpQ0FBaUM7U0FDcEM7YUFDSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQ2xCO1lBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLFNBQVMsQ0FBQztZQUN0QyxpQ0FBaUM7U0FDcEM7YUFFRDtZQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxJQUFJLENBQUM7WUFDakMsaUNBQWlDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVPLGtDQUFRLEdBQWhCLFVBQWtCLFNBQWdCO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLFFBQVEsQ0FBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyx3Q0FBYyxHQUF0QjtRQUVJLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxHQUFHLENBQUM7SUFDcEMsQ0FBQztJQXNCRCxzQkFBVyxxQ0FBUTthQTRObkI7WUFFSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQzthQS9ORCxVQUFxQixLQUFZO1lBRTdCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxxQkFBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLHFCQUFXLENBQUMsU0FBUyxFQUNsSDtnQkFDSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxlQUFlLENBQUUsSUFBSSxDQUFFLENBQUM7Z0JBQzdCLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFDdEI7b0JBQ0ksS0FBSyxxQkFBVyxDQUFDLEtBQUs7d0JBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO3dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsS0FBSyxDQUFFLENBQUM7d0JBQ3hDLE1BQU07b0JBQ04sS0FBSyxxQkFBVyxDQUFDLEdBQUc7d0JBQ2hCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxxQkFBVyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLHFCQUFXLENBQUMsU0FBUyxJQUFHLElBQUksQ0FBQyxVQUFVLElBQUkscUJBQVcsQ0FBQyxVQUFVLEVBQy9IOzRCQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOzRCQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOzRCQUMxQixJQUFJLElBQUksR0FBVSxxQkFBUyxDQUFDLFlBQVksQ0FBRSxDQUFDLEVBQUMsR0FBRyxDQUFFLENBQUM7NEJBQ2xELElBQUksSUFBSSxHQUFHLEVBQUUsRUFDYjtnQ0FDSSxJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsTUFBTSxDQUFFLENBQUM7NkJBQ3hDO2lDQUVEO2dDQUNJLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxNQUFNLENBQUUsQ0FBQzs2QkFDeEM7eUJBQ0o7NkJBRUQ7NEJBQ0ksSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7NEJBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQzt5QkFDckM7d0JBQ0wsTUFBTTtvQkFDTixLQUFLLHFCQUFXLENBQUMsSUFBSTt3QkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLElBQUksQ0FBRSxDQUFDO3dCQUNuQyx1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixDQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBRSxDQUFDO3dCQUN0RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDNUMsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ25ELHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2hELE1BQU07b0JBQ04sS0FBSyxxQkFBVyxDQUFDLFNBQVM7d0JBQ3RCLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsZ0JBQWdCLENBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFFLENBQUM7d0JBQ3RGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsUUFBUSxDQUFFLENBQUM7d0JBQ3ZDLHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNuRCx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNoRCxNQUFNO29CQUNOLEtBQUsscUJBQVcsQ0FBQyxVQUFVO3dCQUN2Qix1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixDQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBRSxDQUFDO3dCQUN0RixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLFNBQVMsQ0FBRSxDQUFDO3dCQUN4Qyx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDbkQsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDaEQsTUFBTTtvQkFDTixLQUFLLHFCQUFXLENBQUMsU0FBUzt3QkFDdEIsSUFBSSxRQUFRLEdBQVksa0JBQVEsQ0FBQyxJQUFJLENBQUUsWUFBWSxDQUFFLENBQUM7d0JBQ3RELElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQzNCOzRCQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7NEJBQ3BELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7eUJBQ2pDOzZCQUVEOzRCQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO3lCQUN0Qzt3QkFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7d0JBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7d0JBQzFFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLElBQUksR0FBVSxxQkFBUyxDQUFDLFlBQVksQ0FBRSxDQUFDLEVBQUMsR0FBRyxDQUFFLENBQUM7d0JBQ2xELElBQUksSUFBSSxHQUFHLEVBQUUsRUFDYjs0QkFDSSxJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsT0FBTyxDQUFFLENBQUM7eUJBQ3pDOzZCQUVEOzRCQUNJLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxPQUFPLENBQUUsQ0FBQzt5QkFDekM7d0JBQ0Qsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFFLElBQUksRUFBQyxJQUFJLENBQUMsY0FBYyxDQUFFLENBQUM7d0JBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLEdBQUcsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBRSxDQUFDO3dCQUNoRCx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUNoRCxNQUFNO29CQUNOLEtBQUsscUJBQVcsQ0FBQyxTQUFTO3dCQUN0QixJQUFJLFFBQVEsR0FBWSxrQkFBUSxDQUFDLElBQUksQ0FBRSxnQkFBZ0IsQ0FBRSxDQUFDO3dCQUMxRCxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUMzQjs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzRCQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO3lCQUNqQzs2QkFFRDs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzt5QkFDdEM7d0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUMxRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLE9BQU8sQ0FBRSxDQUFDO3dCQUN0QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3RCLHdCQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2hELE1BQU07b0JBQ04sS0FBSyxxQkFBVyxDQUFDLFVBQVU7d0JBQ3ZCLElBQUksUUFBUSxHQUFZLGtCQUFRLENBQUMsSUFBSSxDQUFFLGNBQWMsQ0FBRSxDQUFDO3dCQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUMzQjs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzRCQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO3lCQUNqQzs2QkFFRDs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzt5QkFDdEM7d0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUMxRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN0Qix3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUM1QyxrQ0FBa0M7d0JBQ3RDLE1BQU07b0JBQ04sS0FBSyxxQkFBVyxDQUFDLFFBQVE7d0JBQ3JCLElBQUksUUFBUSxHQUFZLGtCQUFRLENBQUMsSUFBSSxDQUFFLGNBQWMsQ0FBRSxDQUFDO3dCQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUMzQjs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOzRCQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO3lCQUNqQzs2QkFFRDs0QkFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzt5QkFDdEM7d0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7d0JBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7d0JBQzFFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsTUFBTSxDQUFFLENBQUM7d0JBQ3pDLE1BQU07b0JBQ04sS0FBSyxxQkFBVyxDQUFDLEtBQUssQ0FBQztvQkFDdkIsS0FBSyxxQkFBVyxDQUFDLFNBQVM7d0JBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7d0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxPQUFPLENBQUUsQ0FBQzt3QkFDdEMsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7d0JBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFFLEtBQUssQ0FBRSxDQUFDO3dCQUNsQyxNQUFNO29CQUNOLEtBQUsscUJBQVcsQ0FBQyxVQUFVO3dCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLFlBQVksQ0FBRSxDQUFDO3dCQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFFLEtBQUssQ0FBRSxDQUFDO3dCQUNsQyxNQUFNO29CQUNOLEtBQUsscUJBQVcsQ0FBQyxXQUFXO3dCQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLGFBQWEsQ0FBRSxDQUFDO3dCQUM1QyxJQUFJLENBQUMsZUFBZSxDQUFFLEtBQUssQ0FBRSxDQUFDO3dCQUNsQyxNQUFNO29CQUNOLEtBQUsscUJBQVcsQ0FBQyxlQUFlO3dCQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7d0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsUUFBUSxDQUFFLENBQUM7d0JBQzNDLE1BQU07aUJBQ1Q7YUFDSjtRQUNMLENBQUM7OztPQUFBO0lBRU8sd0NBQWMsR0FBdEI7UUFFSSx3QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBT08seUNBQWUsR0FBdkIsVUFBeUIsRUFBVTtRQUUvQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQ3ZFO1lBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFRTSxnQ0FBTSxHQUFiLFVBQWUsRUFBUztRQUVwQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUNuQjtZQUNJLElBQUksT0FBTyxHQUFVLEVBQUUsR0FBQyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUM7WUFDMUIsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUNyQjtnQkFDSSxLQUFLLHFCQUFXLENBQUMsR0FBRyxFQUFDLElBQUk7b0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFDekI7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7cUJBQ2pEO3lCQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLEVBQzlCO3dCQUNJLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQ3pCOzRCQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDdkI7NkJBRUQ7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7eUJBQ2pEO3FCQUNKO3lCQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLEVBQzlCO3dCQUNJLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQ3pCOzRCQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDdkI7NkJBRUQ7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7eUJBQ2pEO3FCQUNKO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hELE1BQU07Z0JBQ1YsS0FBSyxxQkFBVyxDQUFDLEtBQUssRUFBQyxJQUFJO29CQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFDekI7d0JBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFDekI7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUN2Qjs2QkFFRDs0QkFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQzt5QkFDakQ7cUJBQ0o7eUJBQ0ksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsRUFDN0I7d0JBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFDekI7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUN2Qjs2QkFFRDs0QkFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQzt5QkFDakQ7cUJBQ0o7eUJBRUQ7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7cUJBQ2pEO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFDcEI7d0JBQ0ksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUNyRDs0QkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsZUFBZSxDQUFDO3lCQUMvQztxQkFDSjt5QkFDSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQzNCO3dCQUNJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDdkQ7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLGVBQWUsQ0FBQzt5QkFDL0M7cUJBQ0o7b0JBQ0QsTUFBTTtnQkFDVixLQUFLLHFCQUFXLENBQUMsU0FBUztvQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUNwQjt3QkFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQ3JEOzRCQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxlQUFlLENBQUM7eUJBQy9DO3FCQUNKO3lCQUNJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDNUQ7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLGVBQWUsQ0FBQzt3QkFDNUMsaUJBQU8sQ0FBQyxHQUFHLENBQUUsVUFBVSxDQUFFLENBQUM7cUJBQzdCO29CQUNMLE1BQU07Z0JBQ04sS0FBSyxxQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFBLElBQUk7Z0JBQzFCLEtBQUsscUJBQVcsQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLEtBQUsscUJBQVcsQ0FBQyxVQUFVO29CQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUMsT0FBTyxDQUFDO29CQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUMsT0FBTyxDQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRSxPQUFPLENBQUM7b0JBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hELE1BQU07Z0JBQ1YsS0FBSyxxQkFBVyxDQUFDLFNBQVM7b0JBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7b0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxPQUFPLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFFLE9BQU8sQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDaEQsTUFBTTtnQkFDVixLQUFLLHFCQUFXLENBQUMsVUFBVSxDQUFDO2dCQUM1QixLQUFLLHFCQUFXLENBQUMsV0FBVztvQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7b0JBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDaEQsTUFBTTtnQkFDVixLQUFLLHFCQUFXLENBQUMsT0FBTztvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7b0JBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hELElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQ3hCO3dCQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxHQUFHLENBQUM7cUJBQ25DO29CQUNMLE1BQU07Z0JBQ04sS0FBSyxxQkFBVyxDQUFDLFNBQVM7b0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUUsT0FBTyxDQUFDO29CQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRCxNQUFNO2dCQUNOLEtBQUsscUJBQVcsQ0FBQyxVQUFVO29CQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUUsT0FBTyxDQUFDO29CQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNoRCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUUscUJBQVcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxxQkFBVyxDQUFDLFdBQVcsRUFDckg7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO3FCQUNuQzt5QkFFRDt3QkFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsSUFBSSxDQUFDO3dCQUNqQyxpQ0FBaUM7cUJBQ3BDO29CQUNMLE1BQU07Z0JBQ04sS0FBSyxxQkFBVyxDQUFDLFFBQVE7b0JBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7b0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxPQUFPLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFFLE9BQU8sQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDcEQsTUFBTTtnQkFDTixLQUFLLHFCQUFXLENBQUMsZUFBZTtvQkFDNUIsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUNyQjt3QkFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDckQ7NEJBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxHQUFHLENBQUMsR0FBQyxPQUFPLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDbkQ7cUJBQ0o7b0JBQ0wsTUFBTTthQUNUO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxxQkFBVyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUMzSDtnQkFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDdEQ7b0JBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFDekI7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLFVBQVUsQ0FBQztxQkFDMUM7eUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFDOUI7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLFNBQVMsQ0FBQztxQkFDekM7eUJBRUQ7d0JBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLElBQUksQ0FBQztxQkFDcEM7aUJBQ0o7YUFDSjtZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLHVCQUFhLENBQUMsT0FBTyxFQUFFLE1BQU07YUFDOUQ7Z0JBQ0ksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsRUFDeEQ7b0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkQ7cUJBRUQ7b0JBQ0ksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsdUJBQWEsQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFJLENBQUMsYUFBYSxFQUFDLElBQUksQ0FBQyxhQUFhLENBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDOUc7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQzthQUNuQztZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLHVCQUFhLENBQUMsV0FBVyxFQUMxRDtnQkFDSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbEI7aUJBRUQ7Z0JBQ0ksdUJBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyx1QkFBYSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7YUFDakc7WUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQ3RCO2dCQUNJLElBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFDN0I7b0JBQ0ksSUFBRyxJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUEyQixFQUFFLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFDdkY7d0JBQ0ksUUFBUSxJQUFJLENBQUMsY0FBYyxFQUMzQjs0QkFDSSxLQUFLLHFCQUFXLENBQUMsSUFBSSxDQUFDOzRCQUN0QixLQUFLLHFCQUFXLENBQUMsUUFBUSxDQUFDOzRCQUMxQixLQUFLLHFCQUFXLENBQUMsU0FBUyxDQUFDOzRCQUMzQixLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDOzRCQUN6QixLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDOzRCQUN6QixLQUFLLHFCQUFXLENBQUMsTUFBTTtnQ0FDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxTQUFTLENBQUUsQ0FBQztnQ0FDNUMsTUFBTTs0QkFDTixLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDOzRCQUN6QixLQUFLLHFCQUFXLENBQUMsUUFBUTtnQ0FDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQztnQ0FDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQztnQ0FDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztnQ0FDOUgsTUFBTTs0QkFDTixLQUFLLHFCQUFXLENBQUMsTUFBTSxDQUFDOzRCQUN4QixLQUFLLHFCQUFXLENBQUMsTUFBTTtnQ0FDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQztnQ0FDdEMsTUFBTTs0QkFDTixLQUFLLHFCQUFXLENBQUMsT0FBTztnQ0FDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQztnQ0FDcEMsTUFBTTt5QkFDVDtxQkFDSjtpQkFDSjtxQkFDSSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFDM0U7b0JBQ0ksUUFBUSxJQUFJLENBQUMsY0FBYyxFQUMzQjt3QkFDSSxLQUFLLHFCQUFXLENBQUMsSUFBSSxDQUFDO3dCQUN0QixLQUFLLHFCQUFXLENBQUMsUUFBUSxDQUFDO3dCQUMxQixLQUFLLHFCQUFXLENBQUMsU0FBUyxDQUFDO3dCQUMzQixLQUFLLHFCQUFXLENBQUMsT0FBTyxDQUFDO3dCQUN6QixLQUFLLHFCQUFXLENBQUMsT0FBTzs0QkFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7NEJBQzNCLElBQUksQ0FBQyxTQUFTLENBQUUscUJBQVcsQ0FBQyxTQUFTLENBQUUsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7NEJBQzFCLE1BQU07d0JBQ04sS0FBSyxxQkFBVyxDQUFDLE1BQU07NEJBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsU0FBUyxDQUFFLENBQUM7NEJBQzVDLE1BQU07d0JBQ04sS0FBSyxxQkFBVyxDQUFDLE9BQU8sQ0FBQzt3QkFDekIsS0FBSyxxQkFBVyxDQUFDLFFBQVE7NEJBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFFLHFCQUFXLENBQUMsR0FBRyxDQUFFLENBQUM7NEJBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxHQUFHLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUM7NEJBQzlILE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQzNCO2dCQUNJLElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxDQUFDO2dCQUMvQix1QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBRSxXQUFXLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUUsQ0FBQztnQkFDOUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQzFCO29CQUNJLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFFLFdBQVcsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBRSxDQUFDO2lCQUNsRjthQUNKO2lCQUVEO2dCQUNJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsY0FBYyxFQUFHLENBQUM7Z0JBQzlDLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsZUFBZSxFQUFHLENBQUM7YUFFbEQ7WUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQ3RCO2dCQUNJLElBQUksQ0FBQyxZQUFZLElBQUcsT0FBTyxDQUFDO2dCQUM1QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksR0FBRyxFQUM1QjtvQkFDSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztvQkFDdEIsd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDL0M7YUFDSjtTQUNKO2FBRUQ7WUFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQ2hCO2dCQUNJLElBQUksT0FBTyxHQUFVLEVBQUUsR0FBQyxJQUFJLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDO2dCQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFDdkM7b0JBQ0ksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNsQjtxQkFFRDtvQkFDSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFDdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO29CQUNyRCx1QkFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUUsdUJBQWEsQ0FBcUIsQ0FBQyxjQUFjLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxDQUFDO2lCQUMxSTthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8saUNBQU8sR0FBZjtRQUVJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNCQUFZLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFFLElBQUksQ0FBRSxDQUFDO0lBQ3JELENBQUM7SUFNTyxpQ0FBTyxHQUFmO1FBRUksd0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsdUJBQVUsQ0FBQyxhQUFhLENBQUUsbUJBQVMsQ0FBQyxPQUFPLENBQUUsQ0FBQztRQUM5QyxJQUFJLFVBQVUsR0FBb0IsdUJBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFdEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBRSxxQkFBVyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ3hDLHVCQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFFLFFBQVEsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBQywwQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUEsQ0FBQyxDQUFBLEtBQUssQ0FBRSxDQUFDO0lBQ3hKLENBQUM7SUFPTSx3Q0FBYyxHQUFyQixVQUF1QixLQUFZLEVBQUMsTUFBYSxFQUFDLEtBQVk7UUFFMUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsR0FBRyxFQUNwQztZQUNJLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzdCO2FBQ0ksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsS0FBSyxJQUFJLHFCQUFXLENBQUMsVUFBVSxJQUFJLHFCQUFXLENBQUMsV0FBVyxFQUNoRztZQUNJLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFHLE1BQU07U0FDN0U7WUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsVUFBVSxDQUFDO1NBQzFDO2FBQ0ksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUMxRTtZQUNJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQVcsQ0FBQyxTQUFTLENBQUM7U0FDekM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxJQUFJO1lBQ2pDLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxTQUFTO1lBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxVQUFVO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUkscUJBQVcsQ0FBQyxTQUFTLEVBQzFDO1lBQ0ksS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUMsR0FBRyxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFFLEVBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUUsQ0FBQztZQUN2RixJQUFJLEtBQUssR0FBVSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUFDO1lBQzVFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFTSxpQ0FBTyxHQUFkLFVBQWdCLEtBQVk7UUFFeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFXLENBQUMsR0FBRyxFQUNwQztZQUNJLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLE9BQU8sQ0FBQztTQUN2QztJQUNMLENBQUM7SUFHTSxtQ0FBUyxHQUFoQixVQUFrQixVQUFpQjtRQUUvQixJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQ2xCO1lBQ0ksSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLHFCQUFXLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUkscUJBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxxQkFBVyxDQUFDLE1BQU0sRUFDekk7Z0JBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO2FBQzlCO2lCQUVEO2dCQUNJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFDRCx3Q0FBd0M7UUFDeEMsSUFBSTtRQUNKLHVDQUF1QztRQUN2QyxJQUFJO1FBQ0osT0FBTztRQUNQLElBQUk7UUFDSix3REFBd0Q7UUFDeEQsdUNBQXVDO1FBQ3ZDLElBQUk7SUFDUixDQUFDO0lBRU0sc0NBQVksR0FBbkI7UUFFSSxJQUFJLENBQUMsUUFBUSxHQUFHLHFCQUFXLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxrQ0FBUSxHQUFmO0lBR0EsQ0FBQztJQUVNLHNDQUFZLEdBQW5CO0lBR0EsQ0FBQztJQUVNLGlDQUFPLEdBQWQ7UUFFSSxzQkFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBRSxJQUFJLENBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU0saUNBQU8sR0FBZDtRQUVJLHNCQUFZLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFFLElBQUksQ0FBRSxDQUFDO1FBQ2pELGlCQUFNLE9BQU8sV0FBRSxDQUFDO0lBQ3BCLENBQUM7SUFDTCxzQkFBQztBQUFELENBeGxDQSxBQXdsQ0MsQ0F4bEM0QyxJQUFJLENBQUMsUUFBUSxHQXdsQ3pEOzs7OztBQ3ptQ0QsOERBQXlEO0FBQ3pELDJEQUFzRDtBQUN0RCx1REFBa0Q7QUFJbEQsK0RBQTBEO0FBRTFELGlEQUE0QztBQUM1QyxpRUFBZ0U7QUFDaEUsMERBQXFEO0FBQ3JELG1EQUFrRDtBQUdsRDtJQUF1Qyw2QkFBYTtJQWtCaEQ7UUFBQSxZQUVJLGlCQUFPLFNBQ1Y7UUFmRDs7V0FFRztRQUNLLGVBQVMsR0FBVSxFQUFFLENBQUM7UUFLOUIsaUJBQVcsR0FBVSxFQUFFLENBQUM7UUFFaEIsaUJBQVcsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBdUJwRDs7V0FFRztRQUNLLG1CQUFhLEdBQVUsQ0FBQyxDQUFDO1FBc0JqQyxlQUFTLEdBQVUsQ0FBQyxDQUFDO1FBQ3JCLGVBQVMsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzFDLGNBQVEsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3pDLGVBQVMsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzFDLGFBQU8sR0FBVSxDQUFDLENBQUM7UUFDbkIsZ0JBQVUsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBb0NuQyxnQkFBVSxHQUFXLEtBQUssQ0FBQztRQUMzQix3QkFBa0IsR0FBVSxFQUFFLENBQUM7UUFDL0IsbUJBQWEsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBSTlDLG1CQUFhLEdBQVUsRUFBRSxDQUFDO1FBRTFCLG1CQUFhLEdBQVUsRUFBRSxDQUFDO1FBQ2xDOztXQUVHO1FBQ0ssaUJBQVcsR0FBVSxDQUFDLENBQUM7UUFPdkIsc0JBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQ3JDOztXQUVHO1FBQ0ssZ0JBQVUsR0FBVSxDQUFDLENBQUM7UUFvWHRCLGdCQUFVLEdBQVUsRUFBRSxDQUFDO1FBQ3ZCLGVBQVMsR0FBVSxDQUFDLENBQUM7UUFDckIsZ0JBQVUsR0FBVSxDQUFDLENBQUM7UUFFdEIsbUJBQWEsR0FBVyxLQUFLLENBQUM7UUFDOUIsc0JBQWdCLEdBQVUsQ0FBQyxDQUFDO1FBQzVCLHFCQUFlLEdBQVUsQ0FBQyxDQUFDO1FBMkozQixjQUFRLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxrQkFBWSxHQUFXLEtBQUssQ0FBQztRQUM3QixlQUFTLEdBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMxQyxlQUFTLEdBQVUsQ0FBQyxDQUFDO1FBQ3JCLFdBQUssR0FBVSxDQUFDLENBQUM7UUFDbEIsT0FBQyxHQUFRLEVBQUUsQ0FBQyxDQUFBLE9BQU87UUFDbEIsZ0JBQVUsR0FBVSxDQUFDLENBQUM7UUEwVXRCLGFBQU8sR0FBVyxLQUFLLENBQUM7UUFDeEIsbUJBQWEsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEQsa0JBQVksR0FBVSxDQUFDLENBQUM7UUFDeEIsb0JBQWMsR0FBZ0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBUy9DLGtCQUFZLEdBQVUsQ0FBQyxDQUFDO1FBRXhCLGlCQUFXLEdBQVcsS0FBSyxDQUFDO1FBRTVCLGdCQUFVLEdBQW1CLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQzs7SUFoK0J6RCxDQUFDO0lBRU0sMkJBQU8sR0FBZDtRQUVJLElBQUksQ0FBQyxTQUFTLEdBQUksSUFBSSxDQUFDLEtBQXVCLENBQUMsWUFBWSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUUsQ0FBQztRQUM3RSx1QkFBYSxDQUFDLFdBQVcsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVNLDJCQUFPLEdBQWQ7UUFFSSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUksSUFBSSxDQUFDLEtBQXVCLENBQUMsU0FBUyxDQUFDO1FBQzFELElBQUksRUFBRSxHQUFpQixJQUFJLENBQUMsS0FBc0IsQ0FBQztRQUNsRCxFQUFFLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBd0IsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3JFLEVBQUUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUF5QixDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDNUUsQ0FBQztJQVFNLDRCQUFRLEdBQWY7UUFFSSxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQVcsQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBVyxDQUFDLEdBQUcsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixzQkFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUUsSUFBSSxDQUFFLENBQUM7SUFDbEQsQ0FBQztJQVdNLDZCQUFTLEdBQWhCLFVBQWtCLEdBQVU7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1FBRWpELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcs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LElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBQyxPQUFPLENBQUM7d0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7d0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBQyxPQUFPLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFFLE9BQU8sQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDaEQsTUFBTTtvQkFDVixLQUFLLHFCQUFXLENBQUMsU0FBUzt3QkFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFDLE9BQU8sQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFDLE9BQU8sQ0FBQzt3QkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUUsT0FBTyxDQUFDO3dCQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FB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QyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsY0FBYyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUU7UUFDN0MsV0FBVyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsZUFBZSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdB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dEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXRELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBRXRELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUUsQ0FBQztRQUN4RCxJQUFJLENB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bEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRmUsb0JBQVUsYUFFekIsQ0FBQTtBQUNMLENBQUMsRUF6UWEsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUF5UXRCIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5cclxuaW1wb3J0IENvbUV2ZW50Vk8gZnJvbSBcIi4vZnJhbWV3b3Jrcy9ldmVudHMvQ29tRXZlbnRWT1wiO1xyXG5pbXBvcnQgUmVjQ29uZmlncyBmcm9tIFwiLi9jb25maWdzL2dhbWVDb25maWdzL1JlY0NvbmZpZ3NcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCB7IFBhdGhDb25maWcgfSBmcm9tIFwiLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFRpbWVyU2VydmljZSBmcm9tIFwiLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2xvYmFsV2FpdGluZyBmcm9tIFwiLi9HbG9iYWxXYWl0aW5nXCI7XHJcbmltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9mcmFtZXdvcmtzL212Yy9PYmplY3RQb29sXCI7XHJcbmltcG9ydCB7IEdhbWVMYXllck1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuL21hbmFnZXJzL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgUmVzRGF0YU1hbmFnZXIgZnJvbSBcIi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFNvdW5kc3NNYW5hZ2VyIGZyb20gXCIuL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEJpbmRlck1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2Vycy9CaW5kZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBQbGF0Zm9ybVRvb2wgZnJvbSBcIi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sXCI7XHJcbmltcG9ydCBMb2dpblByb3h5IGZyb20gXCIuL2dhbWVtb2R1bGUvbG9hZGluZy9wcm94eXMvTG9naW5Qcm94eVwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IE1haW5Qcm94eSBmcm9tIFwiLi9nYW1lbW9kdWxlL21haW4vcHJveHlzL01haW5Qcm94eVwiO1xyXG5pbXBvcnQgR2FtZVByb3h5IGZyb20gXCIuL2dhbWVtb2R1bGUvbWFpbi9wcm94eXMvR2FtZVByb3h5XCI7XHJcbmltcG9ydCBTa2luUHJveHkgZnJvbSBcIi4vZ2FtZW1vZHVsZS9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBHYW1lQ29udGVudHMgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjQ29uZmlncy5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBFdmVudFV0aWxzLmluaXQoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuZ2V0SW5hc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0bGF5ZXIoKTtcclxuICAgICAgICBVaU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0KCk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBCaW5kZXJNYW5hZ2VyLmJpbmRlckFsbCgpO1xyXG4gICAgICAgIFRpbWVzVGFtcGVyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICB0aGlzLmluaXRQb29sT2JqZWN0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0UHJveHkoKTtcclxuICAgICAgICB0aGlzLmluaXRtYXBWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5iZWdpbkxvYWRIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJblr7nosaHmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpbml0UG9vbE9iamVjdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBPYmplY3RQb29sLnJlZ2lzdGVyKCBDb21FdmVudFZPLnBvb2xrZXksQ29tRXZlbnRWTyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5qih5Z2X5Luj55CG57G7XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdFByb3h5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBtdmNwb29sOk1WQ09iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgbXZjcG9vbC5hZGRQcm94eSggTG9naW5Qcm94eSApO1xyXG4gICAgICAgIG12Y3Bvb2wuYWRkUHJveHkoIFVzZXJJbmZvUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBNYWluUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBHYW1lUHJveHkgKTtcclxuICAgICAgICBtdmNwb29sLmFkZFByb3h5KCBTa2luUHJveHkgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRtYXBWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBtdmNwb29sOk1WQ09iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgLy8gbXZjcG9vbC5tYXBWaWV3KCBNYXBWaWV3VHlwZS5EYWlseXJld2FyZFZpZXcsRGFpbHlyZXdhcmRWaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiZWdpbkxvYWRIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBwYXRoYXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICBwYXRoYXJyLnB1c2goIHsgdXJsOlBhdGhDb25maWcuZ2V0UmVzQ29uZmlnKCksIHR5cGU6IExheWEuTG9hZGVyLkpTT04gfSApO1xyXG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXRHYW1lVmVyc2lvbigpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Mb2FkZXJzKCBwYXRoYXJyLHRoaXMsdGhpcy5yZWNsb2FkQ29tcGxldGUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY2xvYWRDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2FtZXZlcnNpb246YW55ID0gUmVzRGF0YU1hbmFnZXIuaW5zdGFuY2UuZ2V0UmVzQnl1cmwoIFBhdGhDb25maWcuZ2V0R2FtZVZlcnNpb24oKSxmYWxzZSApO1xyXG4gICAgICAgIGlmKCBnYW1ldmVyc2lvbiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuZ2FtZVZlcnNpb24gPSBnYW1ldmVyc2lvbi52ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuZ2FtZVZlcnNpb24gPSBcIjEuMC4wXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImdhbWVWZXJzaW9uOlwiICsgR2xvYmFsLmdhbWVWZXJzaW9uICk7XHJcbiAgICAgICAgdmFyIGNvbmZpZ3JlczphbnkgPSBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5nZXRSZXNCeXVybCggUGF0aENvbmZpZy5nZXRSZXNDb25maWcoKSxmYWxzZSApO1xyXG4gICAgICAgIFJlY0NvbmZpZ3MuaW5zdGFuY2UuaW5pdFJlYyggY29uZmlncmVzICk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmluc3RhbmNlLmxvYWRHcm91cChcImxvYWRpbmdcIix0aGlzLHRoaXMub25QcmVMb2FkZWQsdGhpcy5vblByZXByb2dyZXNzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblByZXByb2dyZXNzKHZhbHVlOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25QcmVMb2FkZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVzRGF0YU1hbmFnZXIuaW5zdGFuY2UuYWRkdWlQYWNrYWdlKCBcImxvYWRpbmdcIix0cnVlLGZhbHNlICk7XHJcbiAgICAgICAgdmFyIGdsb2JhbHdhaXR1cmw6c3RyaW5nID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJnbG9iYWxXYWl0aW5nXCIpO1xyXG4gICAgICAgIEJhc2VWaWV3LnZpZXdiZ1VybCA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5nZXRJdGVtVVJMKFwibG9hZGluZ1wiLFwiaW1nX2JsYWNrXCIpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihnbG9iYWx3YWl0dXJsLCBHbG9iYWxXYWl0aW5nKTtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nbG9iYWxNb2RhbFdhaXRpbmcgPSBnbG9iYWx3YWl0dXJsO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLndpbmRvd01vZGFsV2FpdGluZyA9IGdsb2JhbHdhaXR1cmw7XHJcbiAgICAgICAgLy8gQ1BBVXRpbHMuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuc3RhcnRMb2dpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydExvZ2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIChNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIExvZ2luUHJveHkgKSBhcyBMb2dpblByb3h5KS5zdGFydExvZ2luKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgRGVidWdlciBmcm9tIFwiLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuXHJcbmV4cG9ydCBtb2R1bGUgR2xvYmFsIHtcclxuICAgIGV4cG9ydCB2YXIgc3RhZ2U6IExheWEuU3RhZ2U7XHJcbiAgICBleHBvcnQgdmFyIGh0dHB1cmwgPSBcIlwiO1xyXG4gICAgZXhwb3J0IHZhciByZXNvdXJjZWh0dHRwOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGNkbnVybDpzdHJpbmcgPSBcImh0dHBzOi8vd3hnYW1lLjUxeW95b3lvLmNvbS9cIjtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDlkI7nvIDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciB2ZXJzaW9uczpzdHJpbmcgPSBcIlwiOy8vXCI/dj0xLjAuN1wiO1xyXG5cclxuICAgIGV4cG9ydCB2YXIgaW5pdFdpZHRoOm51bWJlciA9IDcyMDsgXHJcblxyXG4gICAgZXhwb3J0IHZhciBpbml0SGVpZ2h0Om51bWJlciA9IDEyODA7IFxyXG4gICAgLyoqXHJcbiAgICAgKiDotYTmupDniYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IHZhciByZXNjb25maWdWZXJzaW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjeW5s+WPsFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIG5vd3BsYXRmcm9tOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPliY3muLjmiI9hcHBpZFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIGFwcGlkOnN0cmluZyA9IFwid3g0NmY0NjI2OTMyZTVmNDhiXCI7IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ri45oiP54mI5pys5Y+3XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgZ2FtZVZlcnNpb246c3RyaW5nID0gXCIxLjAuMFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm6LCD6K+V54mI5pysXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBpc2RlYnVnOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBleHBvcnQgdmFyIEFwcEtleUlEOm51bWJlciA9IDA7XHJcbiAgICBleHBvcnQgdmFyIE1lbWJlcklEOm51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXJIZWlnaHQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1cldpZHRoKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuc3RhZ2Uud2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHNldFZhcnMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2xvYmFsLnN0YWdlID0gTGF5YS5zdGFnZTtcclxuICAgICAgICBHbG9iYWwuc2V0aHR0cHVybCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRVcmwoIHVybDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBpZih1cmwuaW5kZXhPZihcInd4bG9jYWxcIik9PS0xKVxyXG4gICAgICAgIHsgXHJcbiAgICAgICAgICAgIHJldHVybiBHbG9iYWwucmVzb3VyY2VodHR0cCArIHVybCArIEdsb2JhbC52ZXJzaW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0aHR0cHVybCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vd3hnYW1lZGV2LjUxeW95b3lvLmNvbS9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmh0dHB1cmwgPSBcImh0dHBzOi8vbWlucG9ydC41MXlveW95by5jb20vXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsb2JhbFdhaXRpbmcgZXh0ZW5kcyBmYWlyeWd1aS5HQ29tcG9uZW50XHJcbntcclxuICAgIGltZ18wOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIHByaXZhdGUgX2lzZm9yY2VoaWRlOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0RnJvbVhNTCh4bWw6YW55KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgIHN1cGVyLmNvbnN0cnVjdEZyb21YTUwoeG1sKTtcclxuICAgICAgICB0aGlzLmltZ18wID0gdGhpcy5nZXRDaGlsZChcImltZ18wXCIpLmFzSW1hZ2U7XHJcbiAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vbihMYXlhLkV2ZW50LkRJU1BMQVksdGhpcyx0aGlzLm9uQWRkZWRUb1N0YWdlKTtcclxuICAgICAgICB0aGlzLm9uKCBMYXlhLkV2ZW50LlVORElTUExBWSx0aGlzLHRoaXMub25SZW1vdmVGcm9tU3RhZ2UpOyAgICAgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xhc3RUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG9uQWRkZWRUb1N0YWdlKCk6dm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbGFzdFRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5vblRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkIHtcclxuICAgICAgICBpZih0aGlzLmltZ18wKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5vd3RpbWU6bnVtYmVyID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBub3d0aW1lLXRoaXMuX2xhc3RUaW1lO1xyXG4gICAgICAgICAgICBpZiggZGlzdGltZSAvMTAwMCA+PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoICF0aGlzLl9pc2ZvcmNlaGlkZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBpOm51bWJlciA9IHRoaXMuaW1nXzAucm90YXRpb247XHJcbiAgICAgICAgICAgICAgICBpICs9IDEwO1xyXG4gICAgICAgICAgICAgICAgaWYoaSA+IDM2MClcclxuICAgICAgICAgICAgICAgICAgICBpID0gaSAlIDM2MDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAucm90YXRpb24gPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfMC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGVpbWcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNmb3JjZWhpZGUgPSB0cnVlO1xyXG4gICAgICAgIGlmKCB0aGlzLmltZ18wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBvblJlbW92ZUZyb21TdGFnZSgpOnZvaWQge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcywgdGhpcy5vblRpbWVyKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlncy9nYW1lQ29uZmlncy9QYXRoQ29uZmlnXCI7XHJcbmltcG9ydCB7IEdhbWVDb250ZW50cyB9IGZyb20gXCIuL0dhbWVDb250ZW50c1wiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcbmNsYXNzIE1haW4ge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcbiAgICAgICAgLy8gTGF5YS5pbml0KEdsb2JhbC5pbml0V2lkdGgsIEdsb2JhbC5pbml0SGVpZ2h0LCBMYXlhW1wiV2ViR0xcIl0pO1xyXG4gICAgICAgIExheWEzRC5pbml0KEdsb2JhbC5pbml0V2lkdGgsIEdsb2JhbC5pbml0SGVpZ2h0KTtcclxuXHRcdExheWEuc3RhZ2Uuc2NhbGVNb2RlID0gU3RhZ2UuU0NBTEVfRklYRURfV0lEVEg7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hbGlnbkggPSBTdGFnZS5BTElHTl9DRU5URVI7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hbGlnblYgPSBTdGFnZS5BTElHTl9UT1A7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gU3RhZ2UuU0NSRUVOX1ZFUlRJQ0FMO1xyXG5cdFx0TGF5YS5zdGFnZS5iZ0NvbG9yID0gXCIjNTRCOUY2XCI7XHJcbiAgICAgICAgLy8gTGF5YS5TdGF0LnNob3coKTtcclxuICAgICAgICBMYXlhLmFsZXJ0R2xvYmFsRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHdpbmRvd1snQ29uZmlnM0QnXSAmJiAod2luZG93WydDb25maWczRCddW1wiX2RlZmF1bHRcIl1bXCJfZGVmYXVsdFBoeXNpY3NNZW1vcnlcIl0gPSAxMjgpO1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFd4QXBpLld4SW5pdCgpO1xyXG4gICAgICAgICAgICBXeEFwaS5DaGVja1dYVXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuc3RhZ2Uub24oXCJyZXNpemVcIiwgdGhpcywgdGhpcy5vblJlc2l6ZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uUmVzaXplKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKFwicmVzaXplXCIsIHRoaXMsIHRoaXMub25SZXNpemUpO1xyXG4gICAgICAgIEdsb2JhbC5zZXRWYXJzKCk7IFxyXG4gICAgICAgIFBhdGhDb25maWcuaW5pdCgpOyAgXHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcucGFja2FnZUZpbGVFeHRlbnNpb24gPSBcImJpblwiO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnRleHR1cmVMaW5lYXJTYW1wbGluZyA9IHRydWU7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZGVmYXVsdEZvbnQgPSBcIum7keS9k1wiO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnZlcnNpb25zPUdsb2JhbC52ZXJzaW9ucztcclxuICAgICAgICB2YXIgZ2FtZUNvbnRlbnQ6R2FtZUNvbnRlbnRzID0gbmV3IEdhbWVDb250ZW50cygpO1xyXG4gICAgICAgIGdhbWVDb250ZW50LmluaXRHYW1lKCk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuLy/mv4DmtLvlkK/liqjnsbtcclxubmV3IE1haW4oKTtcclxuIiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmJ1aWxkLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWlsZENGR1xue1xuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/lu7rnrZHlkI1cblx0cHVibGljIGJ1ZmZ4Om51bWJlcjsvL2J1ZmZ4XG5cdHB1YmxpYyBidWZmeTpudW1iZXI7Ly9idWZmeVxuXHRwdWJsaWMgYnVmZno6bnVtYmVyOy8vYnVmZnpcblx0cHVibGljIHRpbWU6bnVtYmVyOy8v5oyB57ut5pe26Ze0KOenkilcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxCdWlsZENGRz4gPSBbXTtcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcblx0e1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xuXHRcdFx0aWYoQnVpbGRDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06QnVpbGRDRkc9IG5ldyBCdWlsZENGRygpO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclswXTtcblx0XHRcdGl0ZW0uYnVmZng9IE51bWJlcihzaW5nbGVBcnJbMV0pO1xuXHRcdFx0aXRlbS5idWZmeT0gTnVtYmVyKHNpbmdsZUFyclsyXSk7XG5cdFx0XHRpdGVtLmJ1ZmZ6PSBOdW1iZXIoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0udGltZT0gTnVtYmVyKHNpbmdsZUFycls0XSk7XG5cdFx0XHRCdWlsZENGRy5kaWN0W2l0ZW0ubmFtZV09aXRlbTtcblx0XHRcdEJ1aWxkQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmdhbWUueGxzeOOAglxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDRkdcbntcblx0cHVibGljIGlkOm51bWJlcjsvL2lkXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/lrZfmrrXlgLxcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxHYW1lQ0ZHPiA9IFtdO1xuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdHZhciBpOm51bWJlcj0wO1xuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XG5cdFx0XHRpZihHYW1lQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkdhbWVDRkc9IG5ldyBHYW1lQ0ZHKCk7XG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzFdO1xuXHRcdFx0R2FtZUNGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XG5cdFx0XHRHYW1lQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmxldmVsLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMZXZlbENGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v5YWz5Y2hXG5cdHB1YmxpYyByb2FkOnN0cmluZzsvL+WFs+WNoeaooeWei1xuXHRwdWJsaWMgcm9sZWluaXRwb3M6YW55Oy8v546p5a626KeS6Imy5Yid5aeL56uZ5L2NXG5cdHB1YmxpYyBucGM6YW55Oy8vbnBjXG5cdHB1YmxpYyBmaXJzdFNjZW5lcG9zOnN0cmluZzsvL+WIneWni+esrOS4gOS4quWcuuaZr+aooeWei+eahOS9jee9rlxuXHRwdWJsaWMgd2luR29sZDpudW1iZXI7Ly/pgJrlhbPmiJDlip/ojrflvpfph5HluIFcblx0cHVibGljIGZhaWxHb2Q6c3RyaW5nOy8v6YCa5YWz5aSx6LSl6I635b6X6YeR5biBXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TGV2ZWxDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKExldmVsQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcblx0XHRcdHZhciBpdGVtOkxldmVsQ0ZHPSBuZXcgTGV2ZWxDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5yb2FkPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0ucm9sZWluaXRwb3M9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzJdKTtcblx0XHRcdGl0ZW0ubnBjPSBKU09OLnBhcnNlKHNpbmdsZUFyclszXSk7XG5cdFx0XHRpdGVtLmZpcnN0U2NlbmVwb3M9c2luZ2xlQXJyWzRdO1xuXHRcdFx0aXRlbS53aW5Hb2xkPSBOdW1iZXIoc2luZ2xlQXJyWzVdKTtcblx0XHRcdGl0ZW0uZmFpbEdvZD1zaW5nbGVBcnJbNl07XG5cdFx0XHRMZXZlbENGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XG5cdFx0XHRMZXZlbENGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpucGMueGxzeOOAglxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5wY0NGR1xue1xuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v6KeS6ImyaWRcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXG5cdHB1YmxpYyBzcGVlZDpudW1iZXI7Ly/op5LoibLliY3ov5vnp7vliqjpgJ/luqYo57GzL+enkilcblx0cHVibGljIGZyb250anVtcDphbnk7Ly/liY3ot7PliqDpgJ/luqZcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxuXHRwdWJsaWMgcmlnaHRqdW1wOmFueTsvL+WPs+i3s+WKoOmAn+W6plxuXHRwdWJsaWMgdXBjbGltYjpudW1iZXI7Ly/niKzljYfpgJ/luqZcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXG5cdHB1YmxpYyBqdW1wX2xlZnQ6bnVtYmVyOy8v5ZCR5bem6Lez6LeD5p2D6YeNXG5cdHB1YmxpYyBqdW1wX3JpZ2h0Om51bWJlcjsvL+WQkeWPs+i3s+adg+mHjVxuXHRwdWJsaWMgc3RhcnRfYWhlYWQ6bnVtYmVyOy8v55u06Lez5p2D6YeNXG5cdHB1YmxpYyBkaXN0YW5jZTpudW1iZXI7Ly9ucGPotoXov4fnjqnlrrbot53nprvlgZzmraJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxOcGNDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKE5wY0NGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XG5cdFx0XHR2YXIgaXRlbTpOcGNDRkc9IG5ldyBOcGNDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0ubGVmdGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzRdKTtcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xuXHRcdFx0aXRlbS5zbGlkZWNsaW1iPSBKU09OLnBhcnNlKHNpbmdsZUFycls3XSk7XG5cdFx0XHRpdGVtLmp1bXBfbGVmdD0gTnVtYmVyKHNpbmdsZUFycls4XSk7XG5cdFx0XHRpdGVtLmp1bXBfcmlnaHQ9IE51bWJlcihzaW5nbGVBcnJbOV0pO1xuXHRcdFx0aXRlbS5zdGFydF9haGVhZD0gTnVtYmVyKHNpbmdsZUFyclsxMF0pO1xuXHRcdFx0aXRlbS5kaXN0YW5jZT0gTnVtYmVyKHNpbmdsZUFyclsxMV0pO1xuXHRcdFx0TnBjQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcblx0XHRcdE5wY0NGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxuLy/phY3nva7mlofku7blkI3np7DvvJpyb2xlLnhsc3jjgIJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlQ0ZHXG57XG5cdHB1YmxpYyBpZDpudW1iZXI7Ly/op5LoibJpZFxuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/op5LoibLotYTmupDlkI1cblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxuXHRwdWJsaWMgZnJvbnRqdW1wOmFueTsvL+WJjei3s+WKoOmAn+W6plxuXHRwdWJsaWMgbGVmdGp1bXA6YW55Oy8v5bem6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXG5cdHB1YmxpYyB1cGNsaW1iOm51bWJlcjsvL+eIrOWNh+mAn+W6plxuXHRwdWJsaWMgc2xpZGVjbGltYjphbnk7Ly/mlpznnYDniKzmpbzpgJ/luqZcblx0cHVibGljIGdldFN0YXRlOm51bWJlcjsvL+iOt+WPluinkuiJsuaWueW8j1xuXHRwdWJsaWMgbmVlZDpudW1iZXI7Ly/ojrflj5bop5LoibLoirHotLlcblx0cHVibGljIGljb246c3RyaW5nOy8v5Zu+5qCHaWNvblxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PFJvbGVDRkc+ID0gW107XG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHR2YXIgaTpudW1iZXI9MDtcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XG5cdFx0dmFyIGk6bnVtYmVyPTA7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcblx0XHRcdGlmKFJvbGVDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xuXHRcdFx0dmFyIGl0ZW06Um9sZUNGRz0gbmV3IFJvbGVDRkcoKTtcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xuXHRcdFx0aXRlbS5uYW1lPXNpbmdsZUFyclsxXTtcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcblx0XHRcdGl0ZW0ubGVmdGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzRdKTtcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xuXHRcdFx0aXRlbS5zbGlkZWNsaW1iPSBKU09OLnBhcnNlKHNpbmdsZUFycls3XSk7XG5cdFx0XHRpdGVtLmdldFN0YXRlPSBOdW1iZXIoc2luZ2xlQXJyWzhdKTtcblx0XHRcdGl0ZW0ubmVlZD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XG5cdFx0XHRpdGVtLmljb249c2luZ2xlQXJyWzEwXTtcblx0XHRcdFJvbGVDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xuXHRcdFx0Um9sZUNGRy52ZWMucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi8uLi9HbG9iYWxcIjtcclxuaW1wb3J0IFJlY0NvbmZpZ3MgZnJvbSBcIi4vUmVjQ29uZmlnc1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgbW9kdWxlIFBhdGhDb25maWdcclxue1xyXG4gICAgZXhwb3J0IHZhciByZXM6IHN0cmluZyA9IFwicmVzL1wiO1xyXG4gICAgZXhwb3J0IHZhciB3eGxvY2FsOnN0cmluZyA9IFwid3hsb2NhbC9cIjtcclxuICAgIGV4cG9ydCB2YXIgY29uZmlnczpzdHJpbmcgPSBcImNvbmZpZ3MvXCI7XHJcbiAgICBleHBvcnQgdmFyIHVpOnN0cmluZyA9IFwidWkvXCI7XHJcbiAgICBleHBvcnQgdmFyIHNvdW5kczpzdHJpbmcgPSBcInNvdW5kL1wiO1xyXG4gICAgZXhwb3J0IHZhciB2ZXJzaW9ucmFuZG9tOnN0cmluZyA9IFwiXCI7XHJcbiAgICBleHBvcnQgdmFyIGljb246c3RyaW5nID0gXCJpY29uL1wiO1xyXG4gICAgZXhwb3J0IHZhciBzY2VuZTpzdHJpbmcgPSBcInNjZW5lcy9cIlxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFBhdGhDb25maWcudmVyc2lvbnJhbmRvbSA9IFwiP3Y9XCIgKyBNYXRoLnJhbmRvbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRzb3VuZCggaWQ6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcuc291bmRzICsgaWQgK1wiLm1wM1wiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJlc0NvbmZpZygpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBQYXRoQ29uZmlnLnd4bG9jYWwgKyBQYXRoQ29uZmlnLmNvbmZpZ3MgK1wicmVzQ29uZmlnLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWcoIGNvbmZpZ25hbWU6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcuY29uZmlncyArIGNvbmZpZ25hbWUgK1wiLmJpblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDNEc2NlbmUoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgUGF0aENvbmZpZy5zY2VuZSArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxzXCIgKTtcclxuICAgIH0gXHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldDNETW9kZWwoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgUGF0aENvbmZpZy5zY2VuZSArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxoXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0M0RSb2xlTW9kZWwoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgXCJyb2xlL0NvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldHJvbGVpY29uKCBpZDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLmljb24gKyBcInJvbGVpY29uL1wiICsgaWQgKyBcIi5wbmdcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRWZXJpc29udXJsKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIEdsb2JhbC5pc2RlYnVnIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBQYXRoQ29uZmlnLnJlcyArIFwidmVyc2lvbi5qc29uXCIgKSArIFBhdGhDb25maWcudmVyc2lvbnJhbmRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFBhdGhDb25maWcucmVzICsgXCJ2ZXJzaW9uXCIgKyBHbG9iYWwucmVzY29uZmlnVmVyc2lvbiArIFwiLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRHYW1lVmVyc2lvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBcImdhbWV2ZXJzaW9uLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICBcclxufSAiLCJpbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4vUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY0NvbmZpZ3MgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOlJlY0NvbmZpZ3M7XHJcblxyXG4gICAgcHVibGljIGdyb3VwZGljdDphbnk7XHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuW3sue7j+WIneWni+WMllxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzaGFzaW5pdDpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOlJlY0NvbmZpZ3NcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgUmVjQ29uZmlncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRSZWMoIGRpY3Q6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgaWYoIGRpY3QgIT0gbnVsbCAmJiAhUmVjQ29uZmlncy5pc2hhc2luaXQgKVxyXG4gICAgICAge1xyXG4gICAgICAgICAgICBSZWNDb25maWdzLmlzaGFzaW5pdCA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBncm91cHNBcnI6QXJyYXk8YW55PiA9IGRpY3QuZ3JvdXBzO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VzQXJyOkFycmF5PGFueT4gPSBkaWN0LnJlc291cmNlcztcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlc0RpY3Q6YW55ID0ge307XHJcbiAgICAgICAgICAgIGZvciggdmFyIGl0ZW0gaW4gcmVzb3VyY2VzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkOmFueSA9IHJlc291cmNlc0FycltpdGVtXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggY2hpbGQudHlwZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJpblwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5Mb2FkZXIuQlVGRkVSO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5TY2VuZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGhcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc291cmNlc0RpY3RbY2hpbGQubmFtZV0gPSBjaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIHZhciBncm91cHR5cGUgaW4gZ3JvdXBzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwY2hpbGQ6YW55ID0gZ3JvdXBzQXJyW2dyb3VwdHlwZV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBncm91cGNoaWxkLmtleXMuc3BsaXQoIFwiLFwiICk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWRzdHI7XHJcbiAgICAgICAgICAgICAgICBmb3IoIGNoaWRzdHIgaW4gYXJyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyQ2hpbGQ6c3RyaW5nID0gYXJyW2NoaWRzdHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBzdHJDaGlsZCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxzOnN0cmluZyA9IHJlc291cmNlc0RpY3Rbc3RyQ2hpbGRdLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IHVybHMucmVwbGFjZShcInJlcy9cIixQYXRoQ29uZmlnLnJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQXJyLnB1c2goIHsgdXJsOkdsb2JhbC5nZXRVcmwodXJscyksIHR5cGU6cmVzb3VyY2VzRGljdFtzdHJDaGlsZF0udHlwZSB9ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cGRpY3RbZ3JvdXBjaGlsZC5uYW1lXSA9IGNoaWxkQXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKFBhdGhDb25maWcuZ2V0UmVzQ29uZmlnKCkpO1xyXG4gICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWJ1Z2VyIHtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5omT5Y2wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNwcmludDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBsb2cobXNnOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmIChEZWJ1Z2VyLmlzcHJpbnQmJiBHbG9iYWwuaXNkZWJ1ZyApIHtcclxuICAgICAgICAvLyAgICAgaWYob3B0aW9uYWxQYXJhbXMmJm9wdGlvbmFsUGFyYW1zLmxlbmd0aD4wKXtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKG1zZyxvcHRpb25hbFBhcmFtcyk7XHJcbiAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAoRGVidWdlci5pc3ByaW50KSB7XHJcbiAgICAgICAgICAgIGlmKG9wdGlvbmFsUGFyYW1zJiZvcHRpb25hbFBhcmFtcy5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtc2csb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtc2c6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKERlYnVnZXIuaXNwcmludCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZywgb3B0aW9uYWxQYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgU29ja2V0Tm9maWZ5IGZyb20gXCIuL25vdGlmaWNhdGlvbi9Tb2NrZXROb2ZpZnlcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXJTZXJ2aWNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTpUaW1lclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIF90aW1lU2NhbGU6bnVtYmVyID0gMTtcclxuXHJcbiAgICBwcml2YXRlIF91bnNjYWxhYmxlTGlzdDpBcnJheTxJVGltZXI+ID0gW107XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmFzdGFuY2UoKTpUaW1lclNlcnZpY2VcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGltZXJTZXJ2aWNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsIHRoaXMub25UaW1lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWNvdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKCAxLCB0aGlzLCB0aGlzLm9uVGltZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVGltZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoaT0wOyBpPHRoaXMuX3Vuc2NhbGFibGVMaXN0Lmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3RbaV0udXBkYXRlKExheWEudGltZXIuZGVsdGEgKiB0aGlzLl90aW1lU2NhbGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzVXBkYXRhVGFyZ2V0KCB1cGRhdGVUYXJnZXQ6SVRpbWVyICk6Qm9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXI7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFVwZGF0ZVRhcmdldCh1cGRhdGVUYXJnZXQ6SVRpbWVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcclxuICAgICAgICBpbmRleCA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICBpZihpbmRleD09LTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdC5wdXNoKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVVcGRhdGVUYXJnZXQodXBkYXRlVGFyZ2V0OklUaW1lcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl91bnNjYWxhYmxlTGlzdC5pbmRleE9mKHVwZGF0ZVRhcmdldCk7XHJcbiAgICAgICAgaWYoaW5kZXghPS0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdW5zY2FsYWJsZUxpc3Quc3BsaWNlKGluZGV4LDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWVTY2FsZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lU2NhbGU7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgdGltZVNjYWxlKHZhbHVlOm51bWJlcilcclxuICAgIHtcclxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IGlzTmFOKHZhbHVlKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgVXNlckNhY2hlVHlwZSBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgQ2FjaGVNYW5hZ2VyIGZyb20gXCIuLi9tYW5hZ2Vycy9DYWNoZU1hbmFnZXJcIjtcclxuaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuL25ldC9Ub25namlIdHRwc1wiO1xyXG5pbXBvcnQgUGxhdGZvcm1Ub29sIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lc1RhbXBlciBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcblx0cHVibGljIGxhc3RnYW1lVGltZTpudW1iZXIgPSAwO1xyXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxyXG5cdHtcclxuXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgaW5zdGFuY2U6IFRpbWVzVGFtcGVyO1xyXG5cclxuXHRwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFRpbWVzVGFtcGVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUaW1lc1RhbXBlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcblx0cHVibGljIGluaXQoICk6dm9pZFxyXG5cdHtcclxuXHRcdHRoaXMubGFzdGdhbWVUaW1lID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLmxhc3R0aW1lICk7XHJcblx0XHRMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLnVwZGF0ZSApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICog5ZCM5q2l5pyN5Yqh5Zmo5pe26Ze0KOenkilcclxuXHQgKi9cclxuXHRwcml2YXRlIF9zZXJ2ZXJUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuXHRwcml2YXRlIGlzY2FuOmJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIF9vbmxpbmVkaXN0aW1lOm51bWJlciA9IDA7XHJcblx0XHJcblx0cHVibGljIHVwZGF0ZVNlcnZpY2VUaW1lKHNlcnZlclRpbWU6IG51bWJlcik6IHZvaWQge1xyXG5cdFx0dGhpcy5fc2VydmVyVGltZSA9IE51bWJlcihzZXJ2ZXJUaW1lKTtcclxuXHRcdHRoaXMuaXNjYW4gPSB0cnVlO1xyXG5cdFx0dGhpcy5fb25saW5lZGlzdGltZSA9IHRoaXMuX3NlcnZlclRpbWU7XHJcblx0XHRDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSBfb25saW5ldGltZTpudW1iZXIgPSAwO1xyXG5cdHB1YmxpYyB1cGRhdGUoKTogdm9pZCBcclxuXHR7XHJcblx0XHRpZiggdGhpcy5pc2NhbiApXHJcblx0XHR7XHJcblx0XHRcdHRoaXMuX3RpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcclxuXHRcdFx0dGhpcy5fb25saW5ldGltZSArPSBMYXlhLnRpbWVyLmRlbHRhO1xyXG5cdFx0XHR0aGlzLl9zZXJ2ZXJUaW1lICs9IExheWEudGltZXIuZGVsdGEgLyAxMDAwO1xyXG5cdFx0XHRpZiggdGhpcy5fdGltZSA+PSAzMDAwMCApXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLl90aW1lID0gMDtcclxuXHRcdFx0XHRDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYoIHRoaXMuX29ubGluZXRpbWUgPj0gOTAwMDAgKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dGhpcy5fb25saW5ldGltZSA9IDA7XHJcblx0XHRcdFx0dGhpcy5zZW5kb25saW5lVG9uZ2ppKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZW5kb25saW5lVG9uZ2ppKCk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBkaXN0aW1lOm51bWJlciA9IHRoaXMuc2VydmVyVGltZSAtIHRoaXMuX29ubGluZWRpc3RpbWU7XHJcblx0XHRpZiggZGlzdGltZSA+IDAgKVxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLl9vbmxpbmVkaXN0aW1lID0gdGhpcy5zZXJ2ZXJUaW1lO1xyXG5cdFx0XHRUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwiT25saW5lXCIsXCJcIixkaXN0aW1lICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDmnI3liqHlmajml7bpl7QgKCDnp5IgKSBcclxuXHQgKiBAcmV0dXJuIFxyXG5cdCAqIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXQgc2VydmVyVGltZSgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3NlcnZlclRpbWU7XHJcblx0fVxyXG5cclxufSIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuLi9tdmMvT2JqZWN0UG9vbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tRXZlbnRWT1xyXG57XHJcbiAgICBzdGF0aWMgcG9vbGtleTpzdHJpbmcgPSBcIkNvbUV2ZW50Vk9cIjtcclxuXHJcbiAgICB0YXJnZXQ6YW55O1xyXG4gICAgdHlwZTpzdHJpbmc7XHJcbiAgICB0aGlzT2JqZWN0OmFueTtcclxuICAgIGxpc3RlbmVyOkZ1bmN0aW9uO1xyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50eXBlPW51bGw7XHJcbiAgICAgICAgdGhpcy50aGlzT2JqZWN0PW51bGw7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcj1udWxsO1xyXG4gICAgICAgIE9iamVjdFBvb2wuY2xlYXJPYmooIENvbUV2ZW50Vk8ucG9vbGtleSx0aGlzICk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IExFdmVudCBmcm9tIFwiLi9MRXZlbnRcIjtcclxuaW1wb3J0IExMaXN0ZW5lciBmcm9tIFwiLi9MTGlzdGVuZXJcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IG1vZHVsZSBFdmVudFV0aWxzXHJcbntcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExMaXN0ZW5lci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5paw5bu65LqL5Lu2XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gRXZlbnQodHlwZTogc3RyaW5nLCBvYmo6IE9iamVjdCA9IG51bGwsIGJ1YmJsZXM6IGJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogTGF5YS5FdmVudCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMRXZlbnQodHlwZSwgb2JqLCBidWJibGVzLCBjYW5jZWxhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+a0vuWPkeS6i+S7tlxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodHlwZTogc3RyaW5nLCBvYmo6IE9iamVjdCA9IG51bGwsIGJ1YmJsZXM6IGJvb2xlYW4gPSBmYWxzZSwgY2FuY2VsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgTExpc3RlbmVyLl9pbnN0YW5jZS5kaXNwYXRjaEV2ZW50KHR5cGUsIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nm5HlkKzkuovku7ZcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBMTGlzdGVuZXIuX2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QsIHVzZUNhcHR1cmUsIHByaW9yaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaGFzRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gTExpc3RlbmVyLl9pbnN0YW5jZS5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIHVzZUNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcclxuICAgICAgICBMTGlzdGVuZXIuX2luc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXNPYmplY3QpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTEV2ZW50IGV4dGVuZHMgTGF5YS5FdmVudFxyXG57XHJcbiAgICBwdWJsaWMgQ0xBU1NfTkFNRTpzdHJpbmcgPSBcIkxFdmVudFwiO1xyXG4gICAgcHJpdmF0ZSBfb2JqOmFueTtcclxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgb2JqOmFueSA9IG51bGwsIGJ1YmJsZXM6Ym9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOmJvb2xlYW4gPSBmYWxzZSl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBpZihvYmope1xyXG4gICAgICAgICAgICB0aGlzLl9vYmogPSBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9uZShvYmo/Ok9iamVjdCk6TEV2ZW50e1xyXG4gICAgICAgIHJldHVybiBuZXcgTEV2ZW50KHRoaXMudHlwZSwgb2JqP29iajp0aGlzLl9vYmopO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0b1N0cmluZygpOnZvaWR7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5DTEFTU19OQU1FLCBcInR5cGVcIiwgXCJidWJibGVzXCIsIFwiY2FuY2VsYWJsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS8oOWPguiOt+WPllxyXG4gICAgICogQHJldHVybnMge2FueX1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBwYXJhbSgpOmFueXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqO1xyXG4gICAgfVxyXG5cclxufSIsIi8qKlxyXG4gKiDlhajlsYDkvqblkKznsbvlj4rmtojmga/lpITnkIZcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExMaXN0ZW5lciBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHB1YmxpYyBzdGF0aWMgX2luc3RhbmNlOkxMaXN0ZW5lcjtcclxuICAgIHByaXZhdGUgX2Rpc3BhdGNoZXI6TGF5YS5FdmVudERpc3BhdGNoZXI7XHJcbiAgICBwcml2YXRlIGlzSW5pdDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGlmKHRoaXMuaXNJbml0KXsgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuX2Rpc3BhdGNoZXIgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luaXQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6TExpc3RlbmVye1xyXG4gICAgICAgIGlmKHRoaXMuX2luc3RhbmNlPT1udWxsKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBMTGlzdGVuZXIoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsbGlzdGVuZXI6RnVuY3Rpb24sdGhpc09iamVjdDphbnksdXNlQ2FwdHVyZTpib29sZWFuPWZhbHNlLHByaW9yaXR5Om51bWJlcj0wKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub24oIHR5cGUsdGhpc09iamVjdCwgbGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLGxpc3RlbmVyOkZ1bmN0aW9uLHRoaXNPYmplY3Q6YW55LHVzZUNhcHR1cmU6Ym9vbGVhbj1mYWxzZSk6dm9pZHtcclxuICAgICAgICB0aGlzLl9kaXNwYXRjaGVyLm9mZiggdHlwZSx0aGlzT2JqZWN0LCBsaXN0ZW5lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuaGFzTGlzdGVuZXIodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTpzdHJpbmcsZGF0YT86IGFueSk6Ym9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXZlbnQodHlwZSxkYXRhKTtcclxuICAgIH1cclxufSIsImltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgU2luZ2xldG9uIGZyb20gXCIuL1NpbmdsZXRvblwiO1xyXG5pbXBvcnQgR2FtZVNvY2tldCBmcm9tIFwiLi4vbmV0L0dhbWVTb2NrZXRcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vZ2FtZW1vZHVsZS91c2VyaW5mby92by9Sb2xlVk9cIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVByb3h5cyBleHRlbmRzIFNpbmdsZXRvblxyXG57XHJcbiAgICBwcml2YXRlIF9vYmplY3RQb29sOiBNVkNPYmplY3RQb29sO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX29iamVjdFBvb2wgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0UHJveHkoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOazqOWGjOWFqOWxgOS+puWQrOS6i+S7tlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGREYXRhRXZlbnQoIHR5cGU6c3RyaW5nLCBjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2tvYmosIGNhbGxiYWNrSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOaKm+WHuuWFqOWxgOS6i+S7tiBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRpc3BhY2hlRGF0YUV2ZW50KHR5cGU6c3RyaW5nLCBkYXRhOmFueSA9IG51bGwpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCB0eXBlLCBkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkvqblkKzkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbW92ZURhdGFFdmVudCh0eXBlOnN0cmluZyxjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFja29iaiwgY2FsbGJhY2tIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFByb3h5KHJlZjphbnkpOmFueVxyXG5cdHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0UG9vbC5nZXRQcm94eShyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZW5kTWVzc2FnZSggYWN0OnN0cmluZyxkYXRhOmFueSA9IG51bGwsaXNTaG93V2FpdDpib29sZWFuID0gdHJ1ZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHYW1lU29ja2V0LmdldEluc3RhbmNlKCkuc2VuZE1lc3NhZ2UoYWN0LCBkYXRhLCBpc1Nob3dXYWl0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9yb2xlVm86Um9sZVZPO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgcm9sZVZPKCk6Um9sZVZPXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yb2xlVm8pe1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlVm8gPSBSb2xlVk8uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvbGVWbztcclxuICAgIH1cclxufSIsImltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IE1WQ09iamVjdFBvb2wgZnJvbSBcIi4vTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgV2luZG93QW5tb1R5cGUgZnJvbSBcIi4vV2luZG93QW5tb1R5cGVcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9EZWJ1Z2VyXCI7XHJcbmltcG9ydCBDb21FdmVudFZPIGZyb20gXCIuLi9ldmVudHMvQ29tRXZlbnRWT1wiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XHJcbmltcG9ydCBHbG9iYWxXYWl0aW5nIGZyb20gXCIuLi8uLi9HbG9iYWxXYWl0aW5nXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VWaWV3IGV4dGVuZHMgZmFpcnlndWkuV2luZG93IHtcclxuICAgIHN0YXRpYyB2aWV3YmdVcmw6c3RyaW5nID0gXCJcIjtcclxuICAgIGlzZ3VpZGVpbmc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHByaXZhdGUgX3BrZ05hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9yZXNOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfaXNBZGRwYWNrYWdlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYWNoZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9XaW5kb3dBbm1vVHlwZTpzdHJpbmcgPSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9ub25lO1xyXG5cclxuICAgIGl0ZW1fcGFuZWw6IGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICBpdGVtX2JnOiBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tCZzogZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICBwcml2YXRlIF9jbGlja0JnSXNDb2xzZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgdmlld0tleTogYW55O1xyXG4gICAgcHVibGljIGdhbWVMYXllcjpzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZXZlbnRkaWN0OmFueSA9IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiDlhajlsYDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2xvYmFsRXZlbnRkaWN0OmFueSA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5Yid5aeL5YyWXHJcbiAgICAgKiBAcGFyYW0gcGtnTmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSByZXNOYW1lIOeVjOmdouWQjVxyXG4gICAgICogQHBhcmFtIGlzQWRkcGFja2FnZSDmmK/lkKbmt7vliqDljIUgXHJcbiAgICAgKiBAcGFyYW0gd2luZG93QW5tb1R5cGUg55WM6Z2i5omT5byA5Yqo55S757G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2xpY2tCZ0lzQ29sc2Ug6buR6Imy6IOM5pmvIDA65peg6IOM5pmvIDE66IOM5pmv5peg5YWz6Zet5LqL5Lu2IDI66IOM5pmv5pyJ5YWz6Zet5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNjYWNoZSDmmK/lkKbmt7vliqDliLDnvJPlrZjmsaDvvIjlpoLmmK/kuLp0cnVlLOWImeWKoOWFpei/m+e8k+WtmOaxoOWumuaXtuagueaNruaYr+WQpuW8leeUqOa4heeQhuOAgiDoi6XmmK/kuLpmYWxzZe+8jOWImeS4jea4heeQhuW9k+WJjee8k+WtmO+8jOWmguiLpea4heeQhu+8jOivt+aJi+WKqOa4heeQhiDvvIlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGtnTmFtZTogc3RyaW5nID0gXCJcIiwgcmVzTmFtZTogc3RyaW5nID0gXCJcIiwgaXNBZGRwYWNrYWdlOiBib29sZWFuID0gZmFsc2UsIFxyXG4gICAgICAgICAgICAgICAgd2luZG93QW5tb1R5cGU6c3RyaW5nPVdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsIGNsaWNrQmdJc0NvbHNlOm51bWJlcj0wLCBpc2NhY2hlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5faXNjYWNoZSA9IGlzY2FjaGU7XHJcbiAgICAgICAgdGhpcy5fcGtnTmFtZSA9IHBrZ05hbWU7XHJcbiAgICAgICAgdGhpcy5fcmVzTmFtZSA9IHJlc05hbWU7XHJcbiAgICAgICAgdGhpcy5faXNBZGRwYWNrYWdlID0gaXNBZGRwYWNrYWdlO1xyXG4gICAgICAgIHRoaXMuX1dpbmRvd0FubW9UeXBlID0gd2luZG93QW5tb1R5cGU7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcclxuICAgICAgICB0aGlzLnNob3dNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Y2xpY2tCZ0lzQ29sc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nICYmIHRoaXMuX2NsaWNrQmdJc0NvbHNlID4gMCAmJiB0aGlzLmNvbnRlbnRQYW5lKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2xpY2tCZyAmJiBCYXNlVmlldy52aWV3YmdVcmwgIT0gXCJcIiApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcgPSBuZXcgZmFpcnlndWkuR0xvYWRlcigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy50b3VjaGFibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcudXJsID0gQmFzZVZpZXcudmlld2JnVXJsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5maWxsID0gZmFpcnlndWkuTG9hZGVyRmlsbFR5cGUuU2NhbGVGcmVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLmFkZENoaWxkQXQodGhpcy5fY2xpY2tCZywgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9hZFRhcmdldDphbnk7XHJcbiAgICBwcml2YXRlIF9vbkxvYWRlZEhhbmRsZXI6RnVuY3Rpb247XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vXVpXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIHRhcmdldCAgICDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsb2FkVWkoZ3JvdXBOYW1lOiBzdHJpbmcsIHRhcmdldDogYW55LCBvbkxvYWRlZEhhbmRsZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBvbkxvYWRlZEhhbmRsZXI7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZEdyb3VwKGdyb3VwTmFtZSwgdGhpcywgdGhpcy5sb2Fkc3VjY2VlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4RcclxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxyXG4gICAgICogQHBhcmFtIHRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsb2FkVWlieUFycih1cmxzOiBBcnJheTxhbnk+LCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gb25Mb2FkZWRIYW5kbGVyO1xyXG4gICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLkxvYWRlcnModXJscywgdGhpcywgdGhpcy5sb2Fkc3VjY2VlZCk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZHN1Y2NlZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRUYXJnZXQgJiYgdGhpcy5fb25Mb2FkZWRIYW5kbGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlci5jYWxsKCB0aGlzLl9sb2FkVGFyZ2V0ICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZW1vdmVFZmZlY3RQYWNrYWdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5yZW1vdmVQYWNrYWdlKHBhY2thZ2VOYW1lLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxDb250cm9sbGVyKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRDb250cm9sbGVyKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxUcmFuc2l0aW9uKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRUcmFuc2l0aW9uKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q2hpbGRmb3JtQ29udGVudFBhbmVsKCBuYW1lOnN0cmluZyApOmZhaXJ5Z3VpLkdPYmplY3RcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLmNvbnRlbnRQYW5lKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8q55WM6Z2i5Yid5aeL5YyWKi9cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BrZ05hbWUgIT0gXCJcIiAmJiB0aGlzLl9yZXNOYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJzZVVpKHRoaXMuX3BrZ05hbWUsIHRoaXMuX3Jlc05hbWUsIHRoaXMuX2lzQWRkcGFja2FnZSx0aGlzLl9XaW5kb3dBbm1vVHlwZSx0aGlzLl9jbGlja0JnSXNDb2xzZSwgdGhpcy5faXNjYWNoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v6Kej5p6QdWlcclxuICAgIHByb3RlY3RlZCBwYXJzZVVpKHBrZ25hbWU6IHN0cmluZywgcmVzbmFtZTogc3RyaW5nLCBpc2FkZHBhY2thZ2U6IGJvb2xlYW4sd2luZG93QW5tb1R5cGU6c3RyaW5nPVdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsIGNsaWNrQmdJc0NvbHNlOm51bWJlcj0wLCBpc2NhY2hlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BrZ05hbWUgPSBwa2duYW1lO1xyXG4gICAgICAgIHRoaXMuX3Jlc05hbWUgPSByZXNuYW1lO1xyXG4gICAgICAgIHRoaXMuX1dpbmRvd0FubW9UeXBlID0gd2luZG93QW5tb1R5cGU7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcclxuICAgICAgICBSZXNEYXRhTWFuYWdlci5pbnN0YW5jZS5hZGR1aVBhY2thZ2UocGtnbmFtZSwgaXNhZGRwYWNrYWdlLCBpc2NhY2hlKTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lID0gZmFpcnlndWkuVUlQYWNrYWdlLmNyZWF0ZU9iamVjdChwa2duYW1lLCByZXNuYW1lKS5hc0NvbTtcclxuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5jb250ZW50UGFuZS5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLmNvbnRlbnRQYW5lLl9jaGlsZHJlbltzdHJdO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09IFwiaXRlbV9wYW5lbFwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsOiBmYWlyeWd1aS5HQ29tcG9uZW50ID0gaXRlbSBhcyBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1wYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0cjEgaW4gaXRlbXBhbmVsLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsSXRlbTogZmFpcnlndWkuR09iamVjdCA9IGl0ZW1wYW5lbC5fY2hpbGRyZW5bc3RyMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbaXRlbXBhbmVsSXRlbS5uYW1lXSA9IGl0ZW1wYW5lbEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9wYW5lbCA9IGl0ZW0gYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNldFBpdm90KDAuNSwwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0UGl2b3QoMC41LCAwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0Y2xpY2tCZ0lzQ29sc2UoKTtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgICAgICB0aGlzLmRvMVNob3dBbmltYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkbzFTaG93QW5pbWF0aW9uKCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIHRoaXMuX1dpbmRvd0FubW9UeXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93YW5tb2VuZCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnggPSBmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHg6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfYWRkbW92ZUZyb21Cb3R0b206XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnkgPSBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodDtcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcy5jb250ZW50UGFuZSwgeyB5OjAgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy53aW5kb3dhbm1vZW5kKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX2FkZHNjYWxlTWluVG9NYXg6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNjYWxlWCA9IHRoaXMuY29udGVudFBhbmUuc2NhbGVZID0gMC4wMTtcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcy5jb250ZW50UGFuZSwgeyBzY2FsZVg6MSxzY2FsZVk6MSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2luZG93YW5tb2VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcyx0aGlzLm9uU2hvd1ZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25TaG93VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5zaG93Q2xpY2tCZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvd0NsaWNrQmcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDAuNTU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jbGlja0JnSXNDb2xzZT09MiAmJiAhdGhpcy5oYXNDbGlja0xpc3RlbmVyKCkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLm9uQ2xpY2sodGhpcywgdGhpcy5jbG9zZWJnQ2xpY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjbG9zZWJnQ2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmNsb3NlKCB0aGlzLnZpZXdLZXksdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5YWz6Zet5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNsb3NlVmlldyggd2luZG93QW5tb1R5cGU6c3RyaW5nID0gXCJcIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fY2xpY2tCZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHdpbmRvd0FubW9UeXBlID09IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9XaW5kb3dBbm1vVHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgeDpmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB5OmZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0IH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9hZGRzY2FsZU1pblRvTWF4OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIHdpbmRvd0FubW9UeXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBXaW5kb3dBbm1vVHlwZS5XaW5kb3dBbm1vVHlwZV9ub25lOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX3JlbW92ZXNjYWxlTWF4VG9NaW46XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRDb21CeUlkKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5HQ29tcG9uZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDaGlsZChpZCkuYXNDb207XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldENvbnRyb2xsZXJCeUJhbWUoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lLmdldENvbnRyb2xsZXIoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRUcmFuc2l0aW9uQnlOYW1lKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5UcmFuc2l0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRUcmFuc2l0aW9uKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNwYWNoZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhozlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGREYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZ2xvYmFsRXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0eXBlICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXSA9IHZvO1xyXG4gICAgICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcclxuICAgICAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc09iamVjdCxsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOWFqOWxgOS6i+S7tlxyXG4gICAgICogQHBhcmFtIHR5cGUgXHJcbiAgICAgKiBAcGFyYW0gdGhpc09iamVjdCBcclxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlbW92ZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2dsb2JhbEV2ZW50ZGljdFt0eXBlXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhoznu4Tku7bkuovku7bvvIzosIPnlKjmraTmlrnms5XvvIznlYzpnaLlhbPpl63kvJroh6rliqjnp7vpmaRcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osINcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFkZExpc3RlbmVyKCB0YXJnZXQ6YW55LCB0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBudWxsIHx8IHRhcmdldC5uYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcImJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fZXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRkaWN0W3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5oYXNMaXN0ZW5lciggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzTGlzdGVuZXIoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21FdmVudFZPPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tRXZlbnRWTztcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVzTGlzdGVuZXIoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tRXZlbnRWTz4gPSB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk87XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZ2xvYmFsRXZlbnRkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLl9nbG9iYWxFdmVudGRpY3Q7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2xvYmFsRXZlbnRkaWN0PXt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxDb21FdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9ldmVudGRpY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5fZXZlbnRkaWN0O1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbUV2ZW50Vk8+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFyciA9IGRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpPTA7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPW51bXMtMTtpPj0wO2ktLSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvLnRhcmdldCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8udGFyZ2V0Lm9mZiggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudGRpY3Rbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXZlbnRkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNsZWFyRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qIOmUgOavgSovXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsQ29tRXZlbnQoKTtcclxuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBudWxsO1xyXG4gICAgICAgIExheWEuVHdlZW4uY2xlYXJUd2VlbiggdGhpcyApO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmluc3RhbmNlLnJlbW92ZVBhY2thZ2UodGhpcy5fcGtnTmFtZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX3BrZ05hbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3Jlc05hbWUgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0JnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcub2ZmQ2xpY2sodGhpcywgdGhpcy5jbG9zZWJnQ2xpY2spO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld0tleSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IENvbUV2ZW50Vk8gZnJvbSBcIi4uL2V2ZW50cy9Db21FdmVudFZPXCI7XHJcbmltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuL09iamVjdFBvb2xcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoaWxkQmFzZVZpZXcgZXh0ZW5kcyBmYWlyeWd1aS5HQ29tcG9uZW50IFxyXG57XHJcbiAgICBpc2d1aWRlaW5nOmJvb2xlYW49ZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ldmVudGRpY3Q6YW55ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIOWFqOWxgOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9nbG9iYWxFdmVudGRpY3Q6YW55ID0ge307XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEZyb21YTUwoeG1sOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jb25zdHJ1Y3RGcm9tWE1MKHhtbCk7XHJcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuX2NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5fY2hpbGRyZW5bc3RyXTtcclxuICAgICAgICAgICAgdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNwYWNoZURhdGFFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGhhc0RhdGFFdmVudCh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gRXZlbnRVdGlscy5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWRkRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuX2dsb2JhbEV2ZW50ZGljdC5oYXNPd25Qcm9wZXJ0eSggdHlwZSApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPID0gT2JqZWN0UG9vbC5nZXRPYmooIENvbUV2ZW50Vk8ucG9vbGtleSApO1xyXG4gICAgICAgICAgICB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVEYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV07XHJcbiAgICAgICAgICAgIEV2ZW50VXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9nbG9iYWxFdmVudGRpY3RbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM57uE5Lu25LqL5Lu277yM6LCD55So5q2k5pa55rOV77yM55WM6Z2i5YWz6Zet5Lya6Ieq5Yqo56e76ZmkXHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGRMaXN0ZW5lciggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbixhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gbnVsbCB8fCB0YXJnZXQubmFtZSA9PSBcIlwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJjaGlsZGJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tRXZlbnRWTyA9IE9iamVjdFBvb2wuZ2V0T2JqKCBDb21FdmVudFZPLnBvb2xrZXkgKTtcclxuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fZXZlbnRkaWN0Lmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRkaWN0W3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5oYXNMaXN0ZW5lciggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzTGlzdGVuZXIoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21FdmVudFZPPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuX2V2ZW50ZGljdFt0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tRXZlbnRWTztcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVzTGlzdGVuZXIoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tRXZlbnRWTz4gPSB0aGlzLl9ldmVudGRpY3RbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk87XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZ2xvYmFsRXZlbnRkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLl9nbG9iYWxFdmVudGRpY3Q7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbUV2ZW50Vk8gPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2xvYmFsRXZlbnRkaWN0PXt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVBbGxDb21FdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9ldmVudGRpY3QpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5fZXZlbnRkaWN0O1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbUV2ZW50Vk8+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21FdmVudFZPO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFyciA9IGRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpPTA7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtcyA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPW51bXMtMTtpPj0wO2ktLSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZvLnRhcmdldCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8udGFyZ2V0Lm9mZiggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudGRpY3Rbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXZlbnRkaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsQ29tRXZlbnQoKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgU2luZ2xldG9uIGZyb20gXCIuL1NpbmdsZXRvblwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNVkNPYmplY3RQb29sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOk1WQ09iamVjdFBvb2w7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX21hcHZpZXdEaWN0OmFueT17fTtcclxuXHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgXHRzdXBlcigpO1xyXG5cdH1cclxuXHRcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTVZDT2JqZWN0UG9vbFxyXG5cdHtcclxuICAgICAgICBpZih0aGlzLl9pbnN0YW5jZSA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgTVZDT2JqZWN0UG9vbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBhZGRQcm94eShyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5jcmVhdGUocmVmKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGdldFByb3h5KHJlZjphbnkpOmFueVxyXG5cdHtcclxuICAgICAgICByZXR1cm4gU2luZ2xldG9uLmdldEluc3RhbmNlKHJlZik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyByZW1vdmVQcm94eShyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5yZW1vdmUocmVmKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWFwVmlldyggdmlld2tleTpzdHJpbmcscmVmOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIU1WQ09iamVjdFBvb2wuX21hcHZpZXdEaWN0W3ZpZXdrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE1WQ09iamVjdFBvb2wuX21hcHZpZXdEaWN0W3ZpZXdrZXldID0gcmVmO1xyXG4gICAgICAgICAgICByZWYua2V5ID0gdmlld2tleTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRWaWV3KCB2aWV3a2V5OnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhTVZDT2JqZWN0UG9vbC5fbWFwdmlld0RpY3Rbdmlld2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJlcnIwIOacque7keWumueahHZpZXdrZXk6XCIgKyB2aWV3a2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTVZDT2JqZWN0UG9vbC5fbWFwdmlld0RpY3Rbdmlld2tleV07XHJcbiAgICB9XHJcbn0iLCIvKlxyXG4qIOWvueixoeaxoOexu1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3RQb29sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2NsYXNzYXJnRGljdDphbnkgPSB7fTtcclxuICAgIHByaXZhdGUgc3RhdGljIF9jb250ZW50OmFueT17fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyKCBrZXk6c3RyaW5nLCBjbGFzc2FyZzphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5fY2xhc3NhcmdEaWN0W2tleV0gPSBjbGFzc2FyZztcclxuICAgICAgICBPYmplY3RQb29sLl9jb250ZW50W2tleV0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9iaigga2V5OnN0cmluZywuLi5hcmdzOmFueVtdICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIE9iamVjdFBvb2wuX2NvbnRlbnRba2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBPYmplY3RQb29sLl9jb250ZW50W2tleV07XHJcbiAgICAgICAgICAgIGlmKCBhcnIubGVuZ3RoID09MCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYWxzc29iajphbnkgPSBPYmplY3RQb29sLl9jbGFzc2FyZ0RpY3Rba2V5XTtcclxuICAgICAgICAgICAgICAgIHZhciB2bzphbnkgPSBuZXcgY2Fsc3NvYmooKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0UG9vbC5fY29udGVudFtrZXldLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCBcIuatpGtleeWAvOWvueW6lOeahOexu+acquiiq+azqOWGjFwiICk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldE9iakJ5Zmd1aSggdXJsOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhT2JqZWN0UG9vbC5fY29udGVudFt1cmxdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIE9iamVjdFBvb2wuX2NvbnRlbnRbdXJsXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBPYmplY3RQb29sLl9jb250ZW50W3VybF07XHJcbiAgICAgICAgaWYoIGFyci5sZW5ndGggPT0wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzphbnkgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0RnJvbVVSTCggdXJsICk7XHJcbiAgICAgICAgICAgIHJldHVybiB2bztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFBvb2wuX2NvbnRlbnRbdXJsXS5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJPYmooIGtleTpzdHJpbmcsIG9iajphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIE9iamVjdFBvb2wuX2NvbnRlbnRba2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gT2JqZWN0UG9vbC5fY29udGVudFtrZXldLmluZGV4T2YoIG9iaiApO1xyXG4gICAgICAgICAgICBpZihpbmRleCA9PSAtMSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0UG9vbC5fY29udGVudFtrZXldLnB1c2goIG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfZGljdDphbnkgPSB7fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiDojrflj5bljZXkvovnsbvvvIzoi6XkuI3lrZjlnKjliJnov5Tlm57nqbpcclxuICAgICAqIEBwYXJhbVx0cmVmIOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICogQHJldHVyblx0KlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0aW5zdGFuY2UgZXJyb1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5Y2V5L6L57G777yM6Iul5LiN5a2Y5Zyo5YiZ5Yib5bu6XHJcbiAgICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgICAqIEByZXR1cm5cdCpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZU9yQ3JlYXRlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0SW5zdGFuY2VPckNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZShyZWYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgKiDliJvlu7rljZXkvovnsbtcclxuICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgKiBAcmV0dXJuXHR2b2lkXHJcbiAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShyZWY6YW55KTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLl9kaWN0W3JlZi5rZXldID09IG51bGwpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZGljdFtyZWYua2V5XSA9IG5ldyByZWYoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICAgICAqIOWIoOmZpOWNleS+i+exu1xyXG4gICAgICAgICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICAgICAqIEByZXR1cm5cdHZvaWRcclxuICAgICAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHJlZjphbnkpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIGtleTpzdHJpbmcgPSByZWYua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX2RpY3Rba2V5XSAhPSBudWxsKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpY3Rba2V5XS5kZXN0b3J5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICog6ZSA5q+B5pa55rOVXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn0iLCIvKipcclxuICog57un5om/YmFzZVZpZXfnlYzpnaLnmoTmiZPlvIDlhbPpl63liqjmlYjnsbvlnotcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpbmRvd0FubW9UeXBlIFxyXG57ICAgXHJcbiAgICAvKipcclxuICAgICAqIOayoeacieWKqOaViFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV2luZG93QW5tb1R5cGVfbm9uZTpzdHJpbmcgPSBcIldpbmRvd0FubW9UeXBlX25vbmVcIjtcclxuICAgIC8qKlxyXG4gICAgICog5LuO5Y+z6L6556e75Yqo5Yiw5Lit5aSuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlVG9NaWRkbGU6c3RyaW5nPVwiV2luZG93QW5tb1R5cGVfYWRkbW92ZVRvTWlkZGxlXCI7XHJcbiAgICAvKipcclxuICAgICAqIOS7juacgOWPs+i+ueenu+WHulxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV2luZG93QW5tb1R5cGVfcmVtb3ZlbW92ZVRvUmlnaHQ6c3RyaW5nID0gXCJXaW5kb3dBbm1vVHlwZV9yZW1vdmVtb3ZlVG9SaWdodFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5bqV6YOo5ZCR5LiK56e75YqoXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpzdHJpbmc9XCJXaW5kb3dBbm1vVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDku47kuIrlkJHlupXpg6jnp7vliqhcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFdpbmRvd0FubW9UeXBlX2FkZG1vdmVGcm9tdXA6c3RyaW5nPVwiV2luZG93QW5tb1R5cGVfYWRkbW92ZUZyb211cFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5bCP5Y+Y5aSnXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9hZGRzY2FsZU1pblRvTWF4OnN0cmluZyA9IFwiV2luZG93QW5tb1R5cGVfYWRkc2NhbGVNaW5Ub01heFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5aSn5Y+Y5bCP56e75Ye6XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBXaW5kb3dBbm1vVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluOnN0cmluZyA9IFwiV2luZG93QW5tb1R5cGVfcmVtb3Zlc2NhbGVNYXhUb01pblwiO1xyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uLy4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVIdHRwcyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpHYW1lSHR0cHM7XHJcbiAgICBwcml2YXRlIGhyOkxheWEuSHR0cFJlcXVlc3Q7XHJcbiAgICBwcml2YXRlIF9jYWxsYmFja0xpc3Q6QXJyYXk8YW55PjtcclxuICAgIHByaXZhdGUgX2lzcmVxdWVzdGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVIdHRwc1xyXG4gICAge1xyXG4gICAgICAgIGlmKCBudWxsID09IHRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVIdHRwcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5ociA9IG5ldyBMYXlhLkh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgLy8gaWYodGhpcy5oci5odHRwKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5oci5odHRwLnRpbWVvdXQgPSA1MDAwOy8v6K6+572u6LaF5pe25pe26Ze077ybXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuaHIub24oIExheWEuRXZlbnQuUFJPR1JFU1MsdGhpcyx0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcyApO1xyXG4gICAgICAgIHRoaXMuaHIub24oTGF5YS5FdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0Q29tcGxldGUpO1xyXG4gICAgICAgIHRoaXMuaHIub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0RXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kUG9zdChhY3Q6c3RyaW5nLCBkYXRhOmFueSxjYWxsYmFjazpGdW5jdGlvbiwgY2FsbGJhY2tvYmo6YW55LGlzU2hvd1dhaXQ6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBpdGVtZGF0YS5hY3QgPSBhY3Q7XHJcbiAgICAgICAgaXRlbWRhdGEuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgaXRlbWRhdGEuY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFja29iaiA9IGNhbGxiYWNrb2JqO1xyXG4gICAgICAgIGl0ZW1kYXRhLmlzU2hvd1dhaXQgPSBpc1Nob3dXYWl0O1xyXG4gICAgICAgIGl0ZW1kYXRhLnNlbmR0eXBlID0gXCJwb3N0XCI7XHJcbiAgICAgICAgaXRlbWRhdGEuaHR0cHVybCA9IEdsb2JhbC5odHRwdXJsO1xyXG4gICAgICAgIHRoaXMuX2NhbGxiYWNrTGlzdC5wdXNoKCBpdGVtZGF0YSApO1xyXG4gICAgICAgIHRoaXMuc2VuZEJ5UG9zdCggYWN0LGRhdGEsY2FsbGJhY2ssY2FsbGJhY2tvYmosaXNTaG93V2FpdCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kYnlIdHRwdXJsKCB1cmw6c3RyaW5nLGFjdDpzdHJpbmcsIGRhdGE6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLCBjYWxsYmFja29iajphbnksaXNTaG93V2FpdDpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1kYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGl0ZW1kYXRhLmFjdCA9IGFjdDtcclxuICAgICAgICBpdGVtZGF0YS5kYXRhID0gZGF0YTtcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGl0ZW1kYXRhLmNhbGxiYWNrb2JqID0gY2FsbGJhY2tvYmo7XHJcbiAgICAgICAgaXRlbWRhdGEuaXNTaG93V2FpdCA9IGlzU2hvd1dhaXQ7XHJcbiAgICAgICAgaXRlbWRhdGEuc2VuZHR5cGUgPSBcImdldFwiO1xyXG4gICAgICAgIGl0ZW1kYXRhLmh0dHB1cmwgPSB1cmw7XHJcbiAgICAgICAgdGhpcy5fY2FsbGJhY2tMaXN0LnB1c2goIGl0ZW1kYXRhICk7XHJcbiAgICAgICAgdGhpcy5zZW5kYnlnZXQoIGFjdCxkYXRhLGNhbGxiYWNrLGNhbGxiYWNrb2JqLGlzU2hvd1dhaXQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbmRCeVBvc3QoYWN0OnN0cmluZywgZGF0YTphbnksY2FsbGJhY2tvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGlzU2hvd1dhaXQ6Ym9vbGVhbiA9IGZhbHNlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzcmVxdWVzdGluZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzcmVxdWVzdGluZyA9IHRydWU7XHJcbiAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImh0dHA6XCIrIEdsb2JhbC5odHRwdXJsICsgYWN0LGRhdGEgKTtcclxuICAgICAgICB0aGlzLmhyLnNlbmQoR2xvYmFsLmh0dHB1cmwgKyBhY3QsZGF0YSxcInBvc3RcIixcImpzb25cIixbXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VuZEdldChhY3Q6YW55PW51bGwsIGRhdGE6YW55PW51bGwsY2FsbGJhY2tvYmo6YW55PW51bGwsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSB0cnVlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1kYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGl0ZW1kYXRhLmFjdCA9IGFjdDtcclxuICAgICAgICBpdGVtZGF0YS5kYXRhID0gZGF0YTtcclxuICAgICAgICBpdGVtZGF0YS5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIGl0ZW1kYXRhLmNhbGxiYWNrb2JqID0gY2FsbGJhY2tvYmo7XHJcbiAgICAgICAgaXRlbWRhdGEuaXNTaG93V2FpdCA9IGlzU2hvd1dhaXQ7XHJcbiAgICAgICAgaXRlbWRhdGEuc2VuZHR5cGUgPSBcImdldFwiO1xyXG4gICAgICAgIGl0ZW1kYXRhLmh0dHB1cmwgPSBHbG9iYWwuaHR0cHVybDtcclxuICAgICAgICB0aGlzLl9jYWxsYmFja0xpc3QucHVzaCggaXRlbWRhdGEgKTtcclxuICAgICAgICB0aGlzLnNlbmRieWdldCggYWN0LGRhdGEsY2FsbGJhY2ssY2FsbGJhY2tvYmosaXNTaG93V2FpdCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VuZGJ5Z2V0KGFjdDphbnk9bnVsbCwgZGF0YTphbnk9bnVsbCxjYWxsYmFjazpGdW5jdGlvbj1udWxsLCBjYWxsYmFja29iajphbnk9bnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNyZXF1ZXN0aW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpdGVtRGF0YTphbnkgPSB0aGlzLl9jYWxsYmFja0xpc3RbMF07XHJcbiAgICAgICAgdmFyIHNlbmR1cmw6c3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcclxuICAgICAgICAgICAgc2VuZHVybCA9IGl0ZW1EYXRhLmh0dHB1cmwgKyBcInJlcXVlc3Q/anNvbj1cIiArIEpTT04uc3RyaW5naWZ5KCBkYXRhICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbmR1cmwgPSBpdGVtRGF0YS5odHRwdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJHYW1lSHR0cDpzZW5kOlwiLCBzZW5kdXJsICk7XHJcbiAgICAgICAgdGhpcy5oci5zZW5kKHNlbmR1cmwsbnVsbCxcImdldFwiLFwidGV4dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCIqKioqKioqKm9uSHR0cFJlcXVlc3RFcnJvcioqKioqKioqXCIgKTtcclxuICAgICAgICBpZihlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2lzcmVxdWVzdGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdFByb2dyZXNzKGU6IGFueSk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25IdHRwUmVxdWVzdENvbXBsZXRlKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyhcImh0dHBSZWNlaXZlOlwiLHRoaXMuaHIuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5faXNyZXF1ZXN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NhbGxiYWNrTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtRGF0YTphbnkgPSB0aGlzLl9jYWxsYmFja0xpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja01lc3NhZ2UoKTtcclxuICAgICAgICAgICAgdmFyIGNhbGxiYWNrOkZ1bmN0aW9uID0gaXRlbURhdGEuY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHZhciBjYWxsYmFja29iajphbnkgPSBpdGVtRGF0YS5jYWxsYmFja29iajtcclxuICAgICAgICAgICAgdmFyIGRhdGE6YW55ID0gSlNPTi5wYXJzZSggdGhpcy5oci5kYXRhICk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmhyLmRhdGEgIT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBkYXRhLmhhc093blByb3BlcnR5KCBcIkFDVElPTkNPTVwiICkgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBkYXRhLkFDVElPTkNPTT09MCApLy9zdWNjZWVkXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsbGJhY2sgJiYgY2FsbGJhY2tvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsYmFja29iaixkYXRhLkpTREFUQSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UvL2ZhaWxkXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja01lc3NhZ2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NhbGxiYWNrTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBuZXh0SXRlbURhdGE6YW55ID0gdGhpcy5fY2FsbGJhY2tMaXN0WzBdO1xyXG4gICAgICAgICAgICBpZiggbmV4dEl0ZW1EYXRhLnNlbmR0eXBlID09IFwicG9zdFwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQnlQb3N0KCBuZXh0SXRlbURhdGEuYWN0LG5leHRJdGVtRGF0YS5kYXRhLG5leHRJdGVtRGF0YS5jYWxsYmFjayxuZXh0SXRlbURhdGEuY2FsbGJhY2tvYmosbmV4dEl0ZW1EYXRhLmlzU2hvd1dhaXQgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZGJ5Z2V0KCBuZXh0SXRlbURhdGEuYWN0LG5leHRJdGVtRGF0YS5kYXRhLG5leHRJdGVtRGF0YS5jYWxsYmFjayxuZXh0SXRlbURhdGEuY2FsbGJhY2tvYmosbmV4dEl0ZW1EYXRhLmlzU2hvd1dhaXQgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL0RlYnVnZXJcIjtcclxuaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuL1RvbmdqaUh0dHBzXCI7XHJcbmltcG9ydCBTb2NrZXROb2ZpZnkgZnJvbSBcIi4uL25vdGlmaWNhdGlvbi9Tb2NrZXROb2ZpZnlcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVTb2NrZXRcclxue1xyXG4gICAgcHJpdmF0ZSBzb2NrOiBMYXlhLlNvY2tldDtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEdhbWVTb2NrZXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxOuiHquWKqOaWree6v++8jDLvvJrkuLvliqjmlq3nur9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb2ZmbGluZXN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlq3nur/ph43ov57mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfY29ubmV0TnVtczpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogc29ja2V06L+e5o6l5LitXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvY2tldGNvbm5ldGluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHYW1lU29ja2V0IHtcclxuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBHYW1lU29ja2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvL+i/nuaOpeacjeWKoeWZqFxyXG4gICAgcHVibGljIGNvbm5lY3RTZXJ2ZXIoZ2FtZUhvc3Q6c3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5zb2NrIHx8ICF0aGlzLnNvY2suY29ubmVjdGVkKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbndhaXRwYW5lbCgpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc29jaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrID0gbmV3IExheWEuU29ja2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5PUEVOLCB0aGlzLCB0aGlzLm9uU29ja2V0T3Blbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuQ0xPU0UsIHRoaXMsIHRoaXMub25Tb2NrZXRDbG9zZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2sub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5pb0Vycm8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5byA5aeL6L+e5o6lc29ja2V0OlwiICsgZ2FtZUhvc3QpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY29ubmVjdEJ5VXJsKGdhbWVIb3N0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQ29ubmVjdCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlvRXJybyhlOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgRGVidWdlci5sb2coXCJnYW1lc29ja2V0SU9FcnJvckV2ZW50OlwiICsgZS50eXBlKTtcclxuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jb25uZXROdW1zKys7XHJcbiAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVTb2NrZXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYodGhpcy5zb2NrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk9QRU4sIHRoaXMsIHRoaXMub25Tb2NrZXRPcGVuKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50Lk1FU1NBR0UsIHRoaXMsIHRoaXMub25SZWNlaXZlTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5DTE9TRSwgdGhpcywgdGhpcy5vblNvY2tldENsb3NlKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLm9mZihMYXlhLkV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLmlvRXJybyk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5jbGVhblNvY2tldCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiYvliqjlhbPpl63muLjmiI9zb2NrZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbHNlU29ja2V0KCBvZmZsaW5lc3RhdGU6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5pc0Nvbm5lY3QoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU29ja2V0KCk7XHJcbiAgICAgICAgICAgIGlmKCBvZmZsaW5lc3RhdGUgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9IG9mZmxpbmVzdGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFNvY2tldE5vZmlmeS5TT0NLRVRfQ0xPU0UgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblNvY2tldENsb3NlKGU6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zb2NrZXRjb25uZXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJzb2NrZXQg5YWz6ZetXCIgKTtcclxuICAgICAgICB0aGlzLmNsb3Nld2FpdHBhbmVsKCk7XHJcbiAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPTE7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgY2xvc2V3YWl0cGFuZWwoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcGVud2FpdHBhbmVsKCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v6L+e5o6l5oiQ5Yqf6L+U5ZueXHJcbiAgICBwcml2YXRlIG9uU29ja2V0T3BlbihldmVudDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Nvbm5ldE51bXMgPSAwO1xyXG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCJzb2NrZXQg6L+e5o6l5oiQ5YqfXCIgKTtcclxuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGUgPSAwO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudChTb2NrZXROb2ZpZnkuU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRCwgbnVsbCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5ZCR5pyN5Yqh56uv5Y+R6YCB5raI5oGvXHJcbiAgICBwdWJsaWMgc2VuZE1lc3NhZ2UoYWN0OiBzdHJpbmcsIGRhdGE6IGFueSwgaXNTaG93V2FpdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiggdGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGlzU2hvd1dhaXQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggIWRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkYXRhPXt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGEuQUNUSU9OID0gYWN0O1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwic29ja2V0IHNlbmQ6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5b2T5YmNc29ja2V05pyq6L+e5o6lXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+a2iOaBr+i/lOWbnuWQju+8jOS8muW5v+aSreWHuuWOu1xyXG4gICAgLy9HbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIuS9oOWPkemAgeeahGNtZOWQjeensFwiLOebkeWQrOaWueazlSx0aGlzKVxyXG4gICAgcHJpdmF0ZSBvblJlY2VpdmVNZXNzYWdlKG1zZzogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBzb2NrZXRkYXRhOiBhbnkgPSBKU09OLnBhcnNlKG1zZyk7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwic29ja2V0IHJlY2VpdmU6XCIsIHNvY2tldGRhdGEgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi8uLi9HbG9iYWxcIjtcclxuaW1wb3J0IFBsYXRmcm9tVHlwZSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vUGxhdGZyb21UeXBlXCI7XHJcbmltcG9ydCBQbGF0Zm9ybUV2ZW50IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS9ldmVudHMvUGxhdGZvcm1FdmVudFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb25namlIdHRwcyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpUb25namlIdHRwcztcclxuICAgIHByaXZhdGUgaHI6TGF5YS5IdHRwUmVxdWVzdDtcclxuICAgIHByaXZhdGUgX2lzY2FuU2VuZDpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOlRvbmdqaUh0dHBzXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIG51bGwgPT0gdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVG9uZ2ppSHR0cHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaHIgPSBuZXcgTGF5YS5IdHRwUmVxdWVzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kKCBhY3Q6c3RyaW5nLGRhdGE6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzY2FuU2VuZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmRieWdldChhY3QsIGRhdGEgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvbmdqaURhdGEoIFRJRDI6c3RyaW5nLFRJRDM6c3RyaW5nID0gXCJcIixOdW06bnVtYmVyID0gMCxUb3RhbDpudW1iZXI9MCxEYXRhczpzdHJpbmcgPSBcIlwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kVG9uZ2ppRGF0YShQbGF0Zm9ybUV2ZW50Lm1lc3NhZ2VfOTg5MTAwMixUSUQyLFRJRDMsTnVtLFRvdGFsLERhdGFzICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbmRUb25namlEYXRhKCBhY3Q6c3RyaW5nLFRJRDI6c3RyaW5nLFRJRDM6c3RyaW5nLCBOdW06bnVtYmVyID0gMCxUb3RhbDpudW1iZXIsRGF0YXM6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtZDphbnkgPSB7fTtcclxuICAgICAgICBpdGVtZC5USUQyID0gVElEMjtcclxuICAgICAgICBpdGVtZC5USUQzID0gVElEMztcclxuICAgICAgICBpdGVtZC5OdW0gPSBNYXRoLmZsb29yKE51bSk7XHJcbiAgICAgICAgaXRlbWQuVG90YWwgPSBUb3RhbDtcclxuICAgICAgICBpdGVtZC5EYXRhcyA9IERhdGFzO1xyXG4gICAgICAgIGl0ZW1kLk1FTUJFUklEID0gR2xvYmFsLk1lbWJlcklEO1xyXG4gICAgICAgIGl0ZW1kLkFwcEtleUlEID0gR2xvYmFsLkFwcEtleUlEO1xyXG4gICAgICAgIHRoaXMuc2VuZGJ5Z2V0KGFjdCxpdGVtZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VuZGJ5Z2V0KGFjdDpzdHJpbmcsZGF0YTphbnk9bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2VuZHVybDpzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcclxuICAgICAgICAgICAgc2VuZHVybCA9IEdsb2JhbC5odHRwdXJsICsgXCJyZXF1ZXN0P2pzb249XCIgKyBKU09OLnN0cmluZ2lmeSggZGF0YSApO1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCIqKipzZW5kdG9uZ2ppKioqOlwiLCBzZW5kdXJsICk7XHJcbiAgICAgICAgICAgIHRoaXMuaHIuc2VuZChzZW5kdXJsLG51bGwsXCJnZXRcIixcInRleHRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgbW9kdWxlIExheWVyTm90aWZ5IHtcclxuICAgIC8qKlxyXG4gICAgICog6IOM5pmv5bGCXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgTEFZRVJfQkFDS0dST1VORDogc3RyaW5nID0gXCJMQVlFUl9CQUNLR1JPVU5EXCI7XHJcbiAgICAvKipcclxuICAgICAqIHVp5bGCXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB2YXIgTEFZRVJfVUlMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9VSUxBWUVSXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxguS4iuWxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX1VQVUlMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9VUFVJTEFZRVJcIjtcclxuICAgIC8qKlxyXG4gICAgICogdGlwc+WxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX1RJUFNMQVlFUjogc3RyaW5nID0gXCJMQVlFUl9USVBTTEFZRVJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaWsOaJi+W8leWvvOWxglxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdmFyIExBWUVSX0dVSURFTEFZRVI6c3RyaW5nID0gXCJMQVlFUl9HVUlERUxBWUVSXCI7XHJcblxyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldE5vZmlmeVxyXG57ICAgXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOi/nuaOpeaIkOWKn1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NPTk5FQ1RfU1VDQ0VFRDpzdHJpbmcgPSBcIlNPQ0tFVF9DT05ORUNUX1NVQ0NFRURcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOWFs+mXrVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU09DS0VUX0NMT1NFOnN0cmluZyA9IFwiU09DS0VUX0NMT1NFXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ph43mlrDov57mjqVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEdhbWVfYWdhaW5Db25uZXRTb2NrZXQ6c3RyaW5nID0gXCJHYW1lX2FnYWluQ29ubmV0U29ja2V0XCI7XHJcbn0iLCJpbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vRGVidWdlclwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgQmFzZVZPIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRJbmZvKCBkYXRhOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpc1tzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBpdGVtZCAhPSBudWxsICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzXSA9IGRhdGFbc107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgRGVidWdlci5sb2coIFwiVk865pyq5a6a5LmJ5bGe5oCnLVwiICsgcyApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwYXRjaEV2ZW50KHR5cGU6IHN0cmluZywgZGF0YT86IGFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBPYmplY3RQb29sIGZyb20gXCIuLi9tdmMvT2JqZWN0UG9vbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZVZPIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxueyAgIFxyXG4gICAgc3RhdGljIHBvb2xrZXk6c3RyaW5nID0gXCJDYWNoZVZPXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW8leeUqOasoeaVsFxyXG4gICAgICovXHJcbiAgICByZWY6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOacgOWQjuS4gOasoeiiq+W8leeUqOeahOaXtumXtFxyXG4gICAgICovXHJcbiAgICB0aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXlkI1cclxuICAgICAqL1xyXG4gICAgcGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZWYgPSAwO1xyXG4gICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IFwiXCI7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5jbGVhck9iaiggQ2FjaGVWTy5wb29sa2V5LHRoaXMgKTtcclxuICAgIH1cclxufSIsIlxyXG5leHBvcnQgY2xhc3MgSm95c3RpY2tNb2R1bGUgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgICBwcml2YXRlIF9Jbml0WDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfSW5pdFk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX3N0YXJ0U3RhZ2VYOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zdGFydFN0YWdlWTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YWdlWDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YWdlWTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfYnV0dG9uOkxheWEuUG9pbnQ7XHJcbiAgICBwcml2YXRlIHRvdWNoSWQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2N1clBvczogTGF5YS5Qb2ludDtcclxuICAgIC8vIHByaXZhdGUgX2NlbnRlcjpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICBcclxuICAgIHB1YmxpYyBzdGF0aWMgSm95c3RpY2tNb3Zpbmc6IHN0cmluZyA9IFwiSm95c3RpY2tNb3ZpbmdcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgSm95c3RpY2tVcDogc3RyaW5nID0gXCJKb3lzdGlja1VwXCI7XHJcblxyXG4gICAgcHVibGljIHJhZGl1czogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfY2xpY2twYW5lbDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHVibGljIGRpczpudW1iZXIgPSAwOyBcclxuICAgIHB1YmxpYyBkZWdyZWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBhbmdsZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBvZmZ4Om51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihjbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwgPSBjbGlja3BhbmVsO1xyXG4gICAgICAgIHRoaXMuX2J1dHRvbiA9IG5ldyBMYXlhLlBvaW50KCk7XHJcbiAgICAgICAgdGhpcy50b3VjaElkID0gLTE7XHJcbiAgICAgICAgdGhpcy5yYWRpdXMgPSA0MDA7XHJcbiAgICAgICAgdGhpcy5fY3VyUG9zID0gbmV3IExheWEuUG9pbnQoKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLCB0aGlzLm9uVG91Y2hEb3duKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfY2FsbG9iajphbnk7XHJcbiAgICBwcml2YXRlIF9tb3ZlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF91cGRhdGVjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgX2Rvd25DYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBzZXRFdmVudENhbGxiYWNrKCBjYWxsb2JqOmFueSxkb3duQ2FsbGJhY2ssbW92ZWNhbGxiYWNrOkZ1bmN0aW9uLHVwY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5fZG93bkNhbGxiYWNrID0gZG93bkNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuX21vdmVjYWxsYmFjayA9IG1vdmVjYWxsYmFjaztcclxuICAgICAgICB0aGlzLl91cGRhdGVjYWxsYmFjayA9IHVwY2FsbGJhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFRyaWdnZXIoZXZ0OiBMYXlhLkV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoRG93bihldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzY2FuQ0JhY2s6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBvblRvdWNoRG93bihldnQ6IExheWEuRXZlbnQpIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgPT0gLTEpIHsvL0ZpcnN0IHRvdWNoXHJcbiAgICAgICAgICAgIHRoaXMudG91Y2hJZCA9IGV2dC50b3VjaElkO1xyXG4gICAgICAgICAgICB0aGlzLm9mZnggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuZ2xvYmFsVG9Mb2NhbChMYXlhLnN0YWdlLm1vdXNlWCwgTGF5YS5zdGFnZS5tb3VzZVksdGhpcy5fY3VyUG9zKTtcclxuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueDtcclxuICAgICAgICAgICAgdmFyIGJ5OiBudW1iZXIgPSB0aGlzLl9jdXJQb3MueTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi54ID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi55ID0gYnk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX2Rvd25DYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25DYWxsYmFjay5jYWxsKCB0aGlzLl9jYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy5PblRvdWNoVXApO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgT25Ub3VjaFVwKGV2dDpMYXlhLkV2ZW50PW51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgIT0gLTEgJiYgZXZ0LnRvdWNoSWQgPT0gdGhpcy50b3VjaElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG91Y2h1cCgpO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fY2FsbG9iaiAmJiB0aGlzLl91cGRhdGVjYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWNhbGxiYWNrLmNhbGwoIHRoaXMuX2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pYWNhbkNhbGxiYWNrOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyB0b3VjaHVwKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvdWNoSWQgPSAtMTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX01PVkUsdGhpcyx0aGlzLk9uVG91Y2hNb3ZlKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy5PblRvdWNoVXApO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub2ZmKCBMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMuT25Ub3VjaFVwICk7XHJcbiAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZGVncmVlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIE9uVG91Y2hNb3ZlKGV2dDogTGF5YS5FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCAhPSAtMSAmJiBldnQudG91Y2hJZCA9PSB0aGlzLnRvdWNoSWQpIHtcclxuICAgICAgICAgICAgdmFyIGJ4OiBudW1iZXIgPSBMYXlhLnN0YWdlLm1vdXNlWDtcclxuICAgICAgICAgICAgdmFyIGJ5OiBudW1iZXIgPSBMYXlhLnN0YWdlLm1vdXNlWTtcclxuICAgICAgICAgICAgdmFyIG1vdmVYOiBudW1iZXIgPSBieCAtIHRoaXMuX2xhc3RTdGFnZVg7XHJcbiAgICAgICAgICAgIHZhciBtb3ZlWTogbnVtYmVyID0gYnkgLSB0aGlzLl9sYXN0U3RhZ2VZO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGFnZVkgPSBieTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvblg6IG51bWJlciA9IHRoaXMuX2J1dHRvbi54ICsgbW92ZVg7XHJcbiAgICAgICAgICAgIHZhciBidXR0b25ZOiBudW1iZXIgPSB0aGlzLl9idXR0b24ueSArIG1vdmVZO1xyXG5cclxuICAgICAgICAgICAgdmFyIG9mZnNldFg6IG51bWJlciA9IGJ1dHRvblggLSB0aGlzLl9zdGFydFN0YWdlWDtcclxuICAgICAgICAgICAgdmFyIG9mZnNldFk6IG51bWJlciA9IGJ1dHRvblkgLSB0aGlzLl9zdGFydFN0YWdlWTtcclxuICAgICAgICAgICAgdmFyIGRpc1g6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgaWYoIG1vdmVYID49IDIgfHwgbW92ZVggPD0gLTIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm9mZnggPSBtb3ZlWDtcclxuICAgICAgICAgICAgaWYoIG9mZnNldFggPT0gMCAmJiBvZmZzZXRZID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIG9mZnNldFggPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIG9mZnNldFggPiB0aGlzLnJhZGl1cyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSA5MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXMgLSBvZmZzZXRYO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSA5MCAtIGRpc1gvdGhpcy5yYWRpdXMgKiA5MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCBvZmZzZXRYID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCAtb2Zmc2V0WCA+IHRoaXMucmFkaXVzIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IC05MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNYID0gdGhpcy5yYWRpdXMgKyBvZmZzZXRYO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSAtKDkwLWRpc1gvdGhpcy5yYWRpdXMgKiA5MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHJhZDogbnVtYmVyID0gTWF0aC5hdGFuMihvZmZzZXRZLG9mZnNldFgpO1xyXG4gICAgICAgICAgICB0aGlzLmRlZ3JlZSA9IHJhZDtcclxuICAgICAgICAgICAgdmFyIG1heFg6IG51bWJlciA9IHRoaXMucmFkaXVzICogTWF0aC5jb3MocmFkKTtcclxuICAgICAgICAgICAgdmFyIG1heFk6IG51bWJlciA9IHRoaXMucmFkaXVzICogTWF0aC5zaW4ocmFkKTtcclxuICAgICAgICAgICAgaWYoTWF0aC5hYnMob2Zmc2V0WCkgPiBNYXRoLmFicyhtYXhYKSlcclxuICAgICAgICAgICAgICAgIG9mZnNldFggPSBtYXhYO1xyXG4gICAgICAgICAgICBpZihNYXRoLmFicyhvZmZzZXRZKSA+IE1hdGguYWJzKG1heFkpKVxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0WSA9IG1heFk7XHJcbiAgICAgICAgICAgIGJ1dHRvblggPSB0aGlzLl9zdGFydFN0YWdlWCArIG9mZnNldFg7XHJcbiAgICAgICAgICAgIGJ1dHRvblkgPSB0aGlzLl9zdGFydFN0YWdlWSArIG9mZnNldFk7XHJcbiAgICAgICAgICAgIGlmKGJ1dHRvblggPCAwKVxyXG4gICAgICAgICAgICAgICAgYnV0dG9uWCA9IDA7XHJcbiAgICAgICAgICAgIGlmKGJ1dHRvblkgPiBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodClcclxuICAgICAgICAgICAgICAgIGJ1dHRvblkgPSBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodDtcclxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnggPSBidXR0b25YO1xyXG4gICAgICAgICAgICB0aGlzLl9idXR0b24ueSA9IGJ1dHRvblk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzID0gTWF0aC5zcXJ0KCBvZmZzZXRYKm9mZnNldFggKyBvZmZzZXRZKm9mZnNldFkgKTtcclxuICAgICAgICAgICAgdGhpcy5faWFjYW5DYWxsYmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2NhbkNCYWNrICYmIHRoaXMuX2NhbGxvYmogJiYgdGhpcy5fbW92ZWNhbGxiYWNrICYmIHRoaXMuX2lhY2FuQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlY2FsbGJhY2suY2FsbCggdGhpcy5fY2FsbG9iaix0aGlzLm9mZnggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZihMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcywgdGhpcy5vblRvdWNoRG93bik7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgTG9hZGluZ1ZpZXcgZnJvbSBcIi4uL3ZpZXcvTG9hZGluZ1ZpZXdcIjtcclxuaW1wb3J0IFBsYXRmb3JtVG9vbCBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vUGxhdGZvcm1Ub29sXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzb3VyY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IFVzZXJJbmZvUHJveHkgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IFBsYXRmb3JtRXZlbnQgZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL2V2ZW50cy9QbGF0Zm9ybUV2ZW50XCI7XHJcbmltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBNYWluUHJveHkgZnJvbSBcIi4uLy4uL21haW4vcHJveHlzL01haW5Qcm94eVwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvQnVpbGRDRkdcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9OcGNDRkdcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuLi8uLi9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IFlRU2RrIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvWVFTZGtcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvTWFpbkNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vLi4vR2xvYmFsXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dpblByb3h5IGV4dGVuZHMgQmFzZVByb3h5cyBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvZ2luUHJveHlcIjtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2xvZ2luU3VjY2VlZCx0aGlzLHRoaXMubG9naW5zdWNjZWVkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0TG9naW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggTG9hZGluZ1ZpZXcgKTtcclxuICAgICAgICB0aGlzLmxvZ2lucHJvZ3Jlc3MoMCk7XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5Mb2dpbllRKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubG9naW5zdWNjZWVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuTG9naW5Mb2NhbFNldmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmxvZ2luKCApO1xyXG4gICAgfVxyXG4gICAgTG9naW5ZUSgpXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vlvq7kv6HnmbvlvZVcIik7XHJcbiAgICAgICAgV3hBcGkuV1hMb2dpbigocmVzKSA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBcImVycm9yXCIpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaHBsb2dpbjpcIiArIFwicXVlcnljaGFubmVsLT5cIisgV3hBcGkucXVlcnljaGFubmVsICsgXCIgcmVmZXJyZXJJbmZvYXBwSWQtPlwiICsgV3hBcGkucmVmZXJyZXJJbmZvYXBwSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLmxvZ2luKHJlcy5jb2RlLFd4QXBpLnF1ZXJ5Y2hhbm5lbCxXeEFwaS5yZWZlcnJlckluZm9hcHBJZCwoKT0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uSGlkZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5leHBvc3VyZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9naW5ZUSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsKClcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+eZu+W9lVwiKTtcclxuICAgICAgICBXeEFwaS5XWExvZ2luKChyZXMpID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHJlcyAhPSBcImVycm9yXCIpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW+ruS/oeeZu+W9leaIkOWKnzJcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWxTZXZlcihyZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsU2V2ZXIocmVzID0gbnVsbCkgXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vmnKzlnLDnmbvlvZVcIik7XHJcbiAgICAgICAgaWYocmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3IFBsYXllckFjY291bnQocmVzLmNvZGUsIFwiXCIsIFwiXCIsIDAsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFd4QXBpLnNoYXJlT3BlbklkLCBXeEFwaS5zaGFyZU9wZW5JZCxHbG9iYWwuZ2FtZVZlcnNpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5sb2dpbihudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuT25Mb2dpbkxvY2FsQ29tcGxldGUpLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuT25Mb2dpbkVycm9yKSk7XHJcbiAgICAgICAgLy90aGlzLkxvYWRTYnAoKTtcclxuICAgIH1cclxuXHJcbiAgICBPbkxvZ2luTG9jYWxDb21wbGV0ZSgpIFxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5pys5Zyw5pyN5Yqh5Zmo55m75b2V5a6M5oiQLi4uXCIpO1xyXG4gICAgICAgIFd4QXBpLmFsZFNlbmRPcGVuaWQoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQpO1xyXG4gICAgICAgIHRoaXMubG9naW5zdWNjZWVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgT25Mb2dpbkVycm9yKGUpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbnByb2dyZXNzKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxvYWRpbmd2aWV3OkxvYWRpbmdWaWV3ID0gVWlNYW5hZ2VyLmluc3RhbmNlLmdldFZpZXcoIExvYWRpbmdWaWV3ICk7XHJcbiAgICAgICAgaWYoIGxvYWRpbmd2aWV3IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmd2aWV3LnNob3dXb3JkKCB2YWx1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvZ2luc3VjY2VlZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLnmbvlvZXmiJDlip9cIiApO1xyXG4gICAgICAgIC8vIHRoaXMubG9hZGNvbmZpZygpO1xyXG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyc2VDb25maWcxKCApO1xyXG4gICAgICAgICAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW50ZXJNYWluKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGNvbmZpZygpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnBhcnNlQ29uZmlnMSggKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmVudGVyTWFpbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ29uZmlnMSgpOmJvb2xlYW4gXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJ5dGVEYXRhOmFueSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQubm93Q29uZmlnLmdhbWVDb25maWdbMF0uY29uZmlnO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIumFjee9ruihqOaVsOaNru+8mlwiLGJ5dGVEYXRhICk7XHJcbiAgICAgICAgaWYoIGJ5dGVEYXRhICYmIGJ5dGVEYXRhICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gYnl0ZURhdGEuc3BsaXQoXCIlZmlsZSVcIik7XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1zO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoXCIlY2ZnJVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBjbGE6IGFueSA9IExvZ2luUHJveHkuY29uZmlnQ2xhc3NbaXRlbWFyclswXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhLmluaXRDZmcoaXRlbWFyclsxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcIuayoeacieazqOWGjOatpOexu1wiICsgaXRlbWFyclswXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRjb25maWcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXRDb25maWcoXCJnYW1lQ29uZmlnXCIpLCB0eXBlOiBMYXlhLkxvYWRlci5URVhUIH0gKTtcclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Mb2FkZXJzKHBhdGhBcnIsdGhpcyx0aGlzLmNvbmZpZ0NvbXBsZXRlLHRoaXMubG9naW5wcm9ncmVzcyxmYWxzZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlnQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wYXJzZUNvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB0aGlzLmVudGVyTWFpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5ri45oiP5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmluaXQoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFNraW5Qcm94eSApIGFzIFNraW5Qcm94eSApLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVudGVyTWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyggXCLlvZPliY3phY3nva7ooajmgLvlhbPljaHvvJpcIixMZXZlbENGRy52ZWMubGVuZ3RoICk7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBNYWluUHJveHkgKSBhcyBNYWluUHJveHkgKS5lbnRlck1haW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlQ29uZmlnKCk6Ym9vbGVhbiBcclxuICAgIHtcclxuICAgICAgICB2YXIgYnl0ZURhdGE6c3RyaW5nID0gUmVzRGF0YU1hbmFnZXIuZ2V0SW5hc3RhbmNlKCkuZ2V0UmVzQnl1cmwoUGF0aENvbmZpZy5nZXRDb25maWcoXCJnYW1lQ29uZmlnXCIpKTtcclxuICAgICAgICBpZiggYnl0ZURhdGEgJiYgYnl0ZURhdGEgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBieXRlRGF0YS5zcGxpdChcIiVmaWxlJVwiKTtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IoIGk9MDtpPG51bXM7aSsrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdChcIiVjZmclXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsYTogYW55ID0gTG9naW5Qcm94eS5jb25maWdDbGFzc1tpdGVtYXJyWzBdXTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGEuaW5pdENmZyhpdGVtYXJyWzFdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5rKh5pyJ5rOo5YaM5q2k57G7XCIgKyBpdGVtYXJyWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgY29uZmlnQ2xhc3M6YW55ID1cclxuICAgIHtcclxuICAgICAgICBSb2xlQ0ZHOlJvbGVDRkcsXHJcbiAgICAgICAgTGV2ZWxDRkc6TGV2ZWxDRkcsXHJcbiAgICAgICAgQnVpbGRDRkc6QnVpbGRDRkcsXHJcbiAgICAgICAgTnBjQ0ZHOk5wY0NGRyxcclxuICAgICAgICBHYW1lQ0ZHOkdhbWVDRkdcclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvYWRpbmdWaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvYWRpbmdWaWV3XCI7XHJcbiAgICBwcm9fYmFyOmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKFwibG9hZGluZ1wiLFwibG9hZGluZ1wiKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93V29yZCggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvX2Jhci52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBXb3JkVGlwc1ZpZXcgfSBmcm9tIFwiLi9Xb3JkVGlwc1ZpZXdcIjtcclxuaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IExheWVyTm90aWZ5IH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5XCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBXb3JkVGlwc1V0aWxzXHJcbntcclxuICAgIHN0YXRpYyB3b3JkTGlzdDpBcnJheTxXb3JkVGlwc1ZpZXc+ID0gW107XHJcbiAgICBzdGF0aWMgc2hvd1dvcmRMaXN0OkFycmF5PFdvcmRUaXBzVmlldz4gPSBbXTtcclxuICAgIHN0YXRpYyBtYXhOdW06bnVtYmVyID0gMTA7XHJcbiAgICBzdGF0aWMgaXNFdmVudDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6V29yZFRpcHNVdGlscztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6V29yZFRpcHNVdGlsc1xyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgV29yZFRpcHNVdGlscygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXb3JkVGlwc1V0aWxzLmlzRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50LnJlbW92ZXNlbGVjdCx0aGlzLHRoaXMuYWRkd29yZExpc3QgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1dvcmRUaXBzKCB3b3JkOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIVdvcmRUaXBzVXRpbHMuaXNFdmVudCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBsYXN0d29yZDpzdHJpbmcgPSBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdFtXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGgtMV0ubm93d29yZDtcclxuICAgICAgICAgICAgLy8gaWYoIGxhc3R3b3JkID09IHdvcmQgKVxyXG4gICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIFdvcmRUaXBzVXRpbHMud29yZExpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTpXb3JkVGlwc1ZpZXcgPSBXb3JkVGlwc1V0aWxzLndvcmRMaXN0LnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGR0b0xheWVyKCBpdGVtLExheWVyTm90aWZ5LkxBWUVSX1RJUFNMQVlFUiApO1xyXG4gICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5sZW5ndGggPCAxMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtMTpXb3JkVGlwc1ZpZXcgPSBuZXcgV29yZFRpcHNWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkdG9MYXllciggaXRlbTEsTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSICk7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTE6V29yZFRpcHNWaWV3ID0gV29yZFRpcHNVdGlscy5zaG93V29yZExpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGR3b3JkTGlzdCggaXRlbTpXb3JkVGlwc1ZpZXcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGl0ZW0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBXb3JkVGlwc1V0aWxzLnNob3dXb3JkTGlzdC5pbmRleE9mKCBpdGVtICk7XHJcbiAgICAgICAgICAgIGlmKCBpbmRleCAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuc2hvd1dvcmRMaXN0LnNwbGljZSggaW5kZXgsMSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVmb3JtTGF5ZXIoTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSICk7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMud29yZExpc3QucHVzaCggaXRlbSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vLi4vdXNlcmluZm8vZXZlbnRzL0dhbWVFdmVudFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgV29yZFRpcHNWaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJXb3JkVGlwc1ZpZXdcIjtcclxuICAgIHRleHRfd29yZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdDE6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIHB1YmxpYyBub3d3b3JkOnN0cmluZyA9IFwiXCI7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCBcImxvYWRpbmdcIixcIndvcmRUaXBzXCIgKTtcclxuICAgIH0gICBcclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMudDEgPSB0aGlzLmdldHBhbmVsVHJhbnNpdGlvbihcInQxXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93V29yZCggd29yZDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3d3b3JkID0gd29yZDtcclxuICAgICAgICB0aGlzLnRleHRfd29yZC50ZXh0ID0gd29yZDtcclxuICAgICAgICB0aGlzLnQxLnBsYXkoIExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsIHRoaXMucGxheUVuZENhbGxiYWNrICksMSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheUVuZENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50LnJlbW92ZXNlbGVjdCx0aGlzICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBKb3lzdGlja01vZHVsZSB9IGZyb20gXCIuLi9qb3lzdGljay9Kb3lzdGlja01vZHVsZVwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vdXNlcmluZm8vZXZlbnRzL0dhbWVFdmVudFwiO1xyXG5pbXBvcnQgU2NlbmUzRE1hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL1NjZW5lM0RNYW5hZ2VyXCI7XHJcbmltcG9ydCBTY2VuZTNkT2JqZWN0IGZyb20gXCIuLi9zY2VuZTNkcy9TY2VuZTNkT2JqZWN0XCI7XHJcbmltcG9ydCBOcGNTY3JpcHQgZnJvbSBcIi4uL21vZGVsU2NyaXB0cy9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9HYW1lQ0ZHXCI7XHJcbmltcG9ydCBTb3VuZHNzTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU291bmRzc01hbmFnZXJcIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9TZGtcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVTdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJVGltZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOkdhbWVTdGF0ZU1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBfam95c3RpY2tNb2R1bGU6Sm95c3RpY2tNb2R1bGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquW8gOWni++8jDHvvJrmuLjmiI/kuK3vvIwy77ya5pqC5YGc5LitXHJcbiAgICAgKi9cclxuICAgIG5vd0dhbWVTdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX3podWFueGlhbmdiZWlzaHU6bnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVTdGF0ZU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVTdGF0ZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHByaXZhdGUgX2h1YWRvbmdTcGVlZFg6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2h1YWRvbmdDbGltYlNwZWVkWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lUGxheWVyQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgaW5pdCggKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faHVhZG9uZ1NwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNF0udmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX2h1YWRvbmdDbGltYlNwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNV0udmFsdWUpO1xyXG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbN10gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5femh1YW54aWFuZ2JlaXNodSA9IE51bWJlciggR2FtZUNGRy5kaWN0WzddLnZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50LmVuZEdhbWUsdGhpcyx0aGlzLmVuZEdhbWUgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVFdmVudC5ucGNlbmRHYW1lLHRoaXMsdGhpcy5ucGNlbmRHYW1lSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbnBjZW5kR2FtZUhhbmRsZXIoIHN0cjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLnB1c2goIHN0ciApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRDbGlja1BhbmVsKCBwYW5lbDpmYWlyeWd1aS5HTG9hZGVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2pveXN0aWNrTW9kdWxlID0gbmV3IEpveXN0aWNrTW9kdWxlKHBhbmVsKTtcclxuICAgICAgICB0aGlzLl9qb3lzdGlja01vZHVsZS5zZXRFdmVudENhbGxiYWNrKCB0aGlzLHRoaXMub25kb3duZnVuLHRoaXMub25tb3ZlZnVuLHRoaXMub251cGZ1biApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzbmVlZFNodW55aVg6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfbm93VGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBvbmRvd25mdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbGFzdEFuZ2xlID0gMDtcclxuICAgICAgICB0aGlzLl9ub3dUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpLzEwMDA7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9sYXN0QW5nbGU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgb25tb3ZlZnVuKCBvZmZzZXRYOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dHYW1lU3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGlzQW5nbGU6bnVtYmVyID0gdGhpcy5fam95c3RpY2tNb2R1bGUuYW5nbGUgLSB0aGlzLl9sYXN0QW5nbGU7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RBbmdsZSA9IHRoaXMuX2pveXN0aWNrTW9kdWxlLmFuZ2xlO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgKFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdFtcIm5wY18wXCJdIGFzIE5wY1NjcmlwdCkuam95U3RpY2tDSGFuZ2Uob2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLGRpc0FuZ2xlKnRoaXMuX3podWFueGlhbmdiZWlzaHUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tYWluUm9sZVNjcmlwdC5qb3lTdGlja0NIYW5nZSggb2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYOi10aGlzLl9odWFkb25nQ2xpbWJTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb251cGZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIChTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLmpveVN0aWNrQ0hhbmdlKDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tYWluUm9sZVNjcmlwdC5qb3lTdGlja0NIYW5nZSggMCwwLDAgKTtcclxuICAgICAgICAgICAgICAgIC8vIGlmKCBMYXlhLkJyb3dzZXIubm93KCkvMTAwMCAtIHRoaXMuX25vd1RpbWUgPCAwLjIgKVxyXG4gICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmKCB0aGlzLl9qb3lzdGlja01vZHVsZS5vZmZ4ID4gNCApXHJcbiAgICAgICAgICAgICAgICAvLyAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLm1haW5Sb2xlU2NyaXB0LnhzaHVueWkoIDEgKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgZWxzZSBpZiggdGhpcy5fam95c3RpY2tNb2R1bGUub2ZmeCA8IC00IClcclxuICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFNjZW5lM0RNYW5hZ2VyLmdldEluc3RhbmNlKCkubWFpblJvbGVTY3JpcHQueHNodW55aSggLTEgKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICB9ICAgXHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG5vd01pbmdDaTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbnVtczpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBucGNkaWN0OmFueSA9IFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdDtcclxuICAgICAgICAgICAgdGhpcy5fbnVtcyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX2FsbCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TnBjU2NyaXB0O1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5wY3NwID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBucGNzcC5nZXROb3dzdGF0ZSgpID09IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IDwgbnBjc3AuZ2V0UG9zdGlvbigpLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbnVtcysrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGwgKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoICsgKCggdGhpcy5fYWxsICsgMSApIC0gdGhpcy5fbnVtcyk7XHJcbiAgICAgICAgICAgIFNjZW5lM2RPYmplY3QudHh0X21pbmdjaS50ZXh0ID0gXCLnrKxcIiArIHRoaXMubm93TWluZ0NpICsgXCLlkI1cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd01pbmdDaSA9IDA7XHJcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAxO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZSggNTAwICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuc3RhcnRHYW1lICk7XHJcbiAgICAgICAgU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5YmdTb3VuZChcImJnbVwiKTtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuS4u+eVjOmdoueCueWHu+W8gOWni+a4uOaIjy4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RvcEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAyO1xyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMDtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gU2NlbmUzZE9iamVjdC5ucGNzY3JpcHREaWN0O1xyXG4gICAgICAgIGlmKCBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIChucGNkaWN0W3NdIGFzIE5wY1NjcmlwdCkuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgR2FtZVJlc3VsdFZpZXcgZnJvbSBcIi4uLy4uL3Jlc3VsdC9HYW1lUmVzdWx0Vmlld1wiO1xyXG5pbXBvcnQgR2FtZVN0YXRlTWFuYWdlciBmcm9tIFwiLi4vR2FtZVN0YXRlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uLy4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IFBST1RPQ09MUywgTmV0d29ya01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiR2FtZVByb3h5XCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFByb3h5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lRXZlbnQuZW5kR2FtZSx0aGlzLHRoaXMuZW5kZ2FtZUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuZGdhbWVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIub25jZSggMTAwMCx0aGlzLHRoaXMuc3RhcnRFbmRWaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydEVuZFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLm5vd01pbmdDaTtcclxuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmKCBHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBnZXRHb2xkID0gdGhpcy5yb2xlVk8ubGV2ZWxjZmcud2luR29sZDtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP6IOc5YipKVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCB0aGlzLnJvbGVWTy5sZXZlbGNmZy5mYWlsR29kICk7XHJcbiAgICAgICAgICAgIGdldEdvbGQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCBOdW1iZXIoYXJyWzBdKSxOdW1iZXIoYXJyWzFdKSApO1xyXG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijmuLjmiI/lpLHotKUpXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBVaU1hbmFnZXIuaW5zdGFuY2UuYWRkKCBHYW1lUmVzdWx0VmlldyxnZXRHb2xkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJldHVybm1haW52aWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZWVuZ2FtbGl6aSgpO1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggR2FtZVJlc3VsdFZpZXcgKTtcclxuICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQucmV0dXJuTWFpblZpZXcgKTtcclxuICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLnNob3dTY2VuZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0R2FtZSgpO1xyXG4gICAgfVxyXG4gICBcclxufSIsImltcG9ydCBCYXNlUHJveHlzIGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlUHJveHlzXCI7XHJcbmltcG9ydCBSZXNvdXJjZU1hbmFnZXIgZnJvbSBcIi4uLy4uLy4uL21hbmFnZXJzL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgTG9hZGluZ1ZpZXcgZnJvbSBcIi4uLy4uL2xvYWRpbmcvdmlldy9Mb2FkaW5nVmlld1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZXNEYXRhTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IE1haW5WaWV3IGZyb20gXCIuLi92aWV3L01haW5WaWV3XCI7XHJcbmltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IFdYR2FtZVBsYXRmb3JtIGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi8uLi8uLi9jb25maWdzL2RhdGFDb25maWdzL1JvbGVDRkdcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9OcGNDRkdcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL1lRU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWluUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTWFpblByb3h5XCI7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX2xvYWRqZDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsamQ6bnVtYmVyID0gMDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVudGVyTWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSAwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMjA7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5sb2FkU3VicGFja2FnZSggXCJzdWJwYWNrYWdlXCIsdGhpcyx0aGlzLnN1YjFjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyxudWxsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWIxY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMjA7XHJcbiAgICAgICAgdGhpcy5fYWxsamQgPSAzMDtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2UxXCIsdGhpcyx0aGlzLnN1YmNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1YmNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRqZCA9IDUwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gNDA7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHZhciB1cmxBcnI6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwic3RhcnRQbGFuZVwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcImVuZFBsYW5lXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwiamlhc3VsaXppXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwidGFuc2VfYmFpXCIgKSApO1xyXG4gICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIFwidGFuc2VfaHVhbmdcIiApICk7XHJcbiAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggXCJ3aW5feGlhblwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcInlhbmh1YVwiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBcIkRpcmVjdGlvbmFsTGlnaHRcIiApICk7XHJcbiAgICAgICAgLy8gdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggXCJkaXN0YW50dmlld1wiICkgKTtcclxuICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggdGhpcy5yb2xlVk8ucm9sZUNmZy5uYW1lICkgKTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSB0aGlzLnJvbGVWTy5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHRoaXMucm9sZVZPLmxldmVsY2ZnLm5wYztcclxuICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIFBhdGhDb25maWcuZ2V0M0RSb2xlTW9kZWwoIE5wY0NGRy5kaWN0WyBucGNBcnJbaV0uaWQgXS5uYW1lICkgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aEFyci5wdXNoKCB7IHVybDp1cmxBcnJbaV0gfSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkZXIzREFyciggcGF0aEFycix0aGlzLHRoaXMubG9hZDNEY29tcGxldGUsdGhpcy5sb2FkcHJvZ3Jlc3MgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWQzRGNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRqZCA9IDkwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMTA7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZEdyb3VwKCBcIm1haW5cIix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLGZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkcHJvZ3Jlc3MoIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9hZGluZ3ZpZXc6TG9hZGluZ1ZpZXcgPSBVaU1hbmFnZXIuaW5zdGFuY2UuZ2V0VmlldyggTG9hZGluZ1ZpZXcgKTtcclxuICAgICAgICBpZiggbG9hZGluZ3ZpZXcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9sb2FkamQgKyBNYXRoLmNlaWwoIHZhbHVlLzEwMCp0aGlzLl9hbGxqZCApO1xyXG4gICAgICAgICAgICBsb2FkaW5ndmlldy5zaG93V29yZCggdmFsdWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmQgPSBcInVpOi8vbGVjeHluaDJpejl5MjZcIjtcclxuICAgICAgICBHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdCgpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLmFkZHVpUGFja2FnZSggXCJtYWluXCIgKTtcclxuICAgICAgICBVaU1hbmFnZXIuaW5zdGFuY2UuY2xvc2UoIExvYWRpbmdWaWV3ICk7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggTWFpblZpZXcgKTtcclxuICAgICAgICBTY2VuZTNETWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXRHYW1lKCk7XHJcbiAgICAgICAgLy8gU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5YmdTb3VuZCggXCJnYW1lYmdcIiApO1xyXG4gICAgICAgIC8vIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsKCk7XHJcbiAgICAgICAgWVFTZGsucHVsbEFkUG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNlc2hpKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uLy4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IFVzZXJJbmZvUHJveHkgZnJvbSBcIi4uLy4uL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCBVc2VySW5mb0V2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvVXNlckluZm9FdmVudFwiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuLi8uLi9za2lucy9wcm94eXMvU2tpblByb3h5XCI7XHJcbmltcG9ydCBHYW1lUHJveHkgZnJvbSBcIi4uL3Byb3h5cy9HYW1lUHJveHlcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi8uLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi8uLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DaG91dGlQYW5WaWV3XCI7XHJcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9jcGEvVHVpamlhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW5WaWV3IGV4dGVuZHMgQmFzZVZpZXdcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIk1haW5WaWV3XCI7XHJcblxyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbG9hZF9jbGlja3BhbmVsOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBsb2FkX3N0YXJ0OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfbHY6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHByb19kaXM6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgdHh0X2dvbGQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGJ0bl9za2luOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBidG5fbW9yZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuX3R1aWppYW46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHByaXZhdGUgX3VzZXJpbmZvUHJveHk6VXNlckluZm9Qcm94eTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcihcIm1haW5cIixcIm1haW52aWV3XCIpOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl91c2VyaW5mb1Byb3h5ID0gdGhpcy5nZXRQcm94eSggVXNlckluZm9Qcm94eSApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QucHJvX2ppbmR1ID0gdGhpcy5wcm9fZGlzO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3QudHh0X21pbmdjaSA9IHRoaXMudHh0X21pbmdjaTtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXJCeUJhbWUoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldENsaWNrUGFuZWwoIHRoaXMubG9hZF9jbGlja3BhbmVsICk7XHJcbiAgICAgICAgdGhpcy5yZXR1cm5tYWluSGFuZGxlcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxvYWRfc3RhcnQsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl9za2luLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnNraW5jbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMuYnRuX21vcmUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMubW9yZWNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fdHVpamlhbixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy50dWlqaWFuY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggR2FtZUV2ZW50LnJldHVybk1haW5WaWV3LHRoaXMsdGhpcy5yZXR1cm5tYWluSGFuZGxlciApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBVc2VySW5mb0V2ZW50LlVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGEsdGhpcyx0aGlzLnVwZGF0ZVVzZXJEYXRhSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHVpamlhbmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIFR1aWppYW5WaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBza2luY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBTa2luUHJveHkgKSBhcyBTa2luUHJveHkgKS5vcGVudmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW9yZWNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVVzZXJEYXRhSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLl91c2VyaW5mb1Byb3h5LnJvbGVWTy5Hb2xkLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5tYWluSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcm9sZXZvOlJvbGVWTyA9IHRoaXMuX3VzZXJpbmZvUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCByb2xldm8ubm93bGV2ZWwgPD0gMiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDI7XHJcbiAgICAgICAgdGhpcy50eHRfbHYudGV4dCA9IHRoaXMuX3VzZXJpbmZvUHJveHkucm9sZVZPLmdldE5vd1NlcnZlckxldmVsKCkudG9TdHJpbmcoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEdhbWVQcm94eSApIGFzIEdhbWVQcm94eSApLnN0YXJ0R2FtZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxufSIsImltcG9ydCBTY2VuZTNETWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU2NlbmUzRE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFJlc0RhdGFNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9SZXNEYXRhTWFuYWdlclwiO1xyXG5pbXBvcnQgU2NlbmUzZE9iamVjdCBmcm9tIFwiLi4vc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtZXJhc1NjcmlwdCBleHRlbmRzIExheWEuU2NyaXB0M0Rcclxue1xyXG4gICAgcHJvdGVjdGVkIGNhbWVyYTogTGF5YS5DYW1lcmE7XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2Rpc1ZlY3RvcjpMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIF90b1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgaXNjYW5mb2xsb3c6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpOnZvaWR7XHJcbiAgICAgICAgLy/ojrflj5bohJrmnKzmiYDlsZ7lr7nosaFcclxuICAgICAgICB0aGlzLmNhbWVyYSA9IHRoaXMub3duZXIgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgdGhpcy5fdG9WZWMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZmllbGRPZlZpZXcgPSA5MDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdFBvcyggdmVjOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdmFsdWVBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzFdLnZhbHVlICk7XHJcbiAgICAgICAgdGhpcy5fZGlzVmVjdG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIoIHZhbHVlQXJyWzBdICksTnVtYmVyKCB2YWx1ZUFyclsxXSApLE51bWJlciggdmFsdWVBcnJbMl0gKSk7XHJcbiAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCh2ZWMgLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbi54ID0gdmVjLng7XHJcbiAgICAgICAgLy8gdGhpcy5jYW1lcmEudHJhbnNmb3JtLmxvb2tBdCggdmVjLG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICkgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TdGFydCgpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5jYW1lcmEudHJhbnNmb3JtO1xyXG4gICAgICAgIC8v5peL6L2s5pGE5YOP5py66KeS5bqmXHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnJvdGF0ZShuZXcgTGF5YS5WZWN0b3IzKCAwLCAwLCAwKSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLmNsZWFyQ29sb3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwdmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICk7XHJcbiAgICBwcml2YXRlIF9pbmRleDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfc2xlcnBWYWx1ZTpudW1iZXIgPSA4O1xyXG4gICAgcHJpdmF0ZSBfbG9va2F0VmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgb25VcGRhdGUoKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmlzY2FuZm9sbG93IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5ucGNEaWN0W1wibnBjXzBcIl0gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5hZGQoIFNjZW5lM2RPYmplY3QubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCA9IFNjZW5lM2RPYmplY3QubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBTY2VuZTNkT2JqZWN0Lm5wY0RpY3RbXCJucGNfMFwiXS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMuYWRkKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy54ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl91cHZlYyApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMubGVycCggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3RvVmVjLDE2LzEwMDAgKiB0aGlzLl9zbGVycFZhbHVlLHRoaXMuX3RvVmVjICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueiA9IFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnordGhpcy5fZGlzVmVjdG9yLno7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueSA9IFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyB0aGlzLl9kaXNWZWN0b3IueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rYXRWZWMueCA9IHRoaXMuX3RvVmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnkgPSBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy56ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCB0aGlzLl9sb29rYXRWZWMsdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTXlSb3RhdGVBcm91bmQodGFyZ2V0UG9zOkxheWEuVmVjdG9yMywgc3BlZWQ6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNjYW5mb2xsb3cgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKCBzcGVlZCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5sb29rQXQoIHRhcmdldFBvcyx0aGlzLl91cHZlYyApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgU2NlbmUzZE9iamVjdCBmcm9tIFwiLi4vc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgUm9sZUFjdGlvbnMgZnJvbSBcIi4uL3NjZW5lM2RzL1JvbGVBY3Rpb25zXCI7XHJcbmltcG9ydCBSb2xlVk8gZnJvbSBcIi4uL3VzZXJpbmZvL3ZvL1JvbGVWT1wiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvQnVpbGRDRkdcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgQ2FtZXJhc1NjcmlwdCBmcm9tIFwiLi9DYW1lcmFzU2NyaXB0XCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVTdGF0ZU1hbmFnZXIgZnJvbSBcIi4uL21haW4vR2FtZVN0YXRlTWFuYWdlclwiO1xyXG5pbXBvcnQgU291bmRzc01hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL1NvdW5kc3NNYW5hZ2VyXCI7XHJcbmltcG9ydCBXWEdhbWVQbGF0Zm9ybSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWEdhbWVQbGF0Zm9ybVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpblJBb2xlU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm9sZUFjdGlvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ub3dTdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgX3JvbGVWTzpSb2xlVk87XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0b3I6TGF5YS5BbmltYXRvcjtcclxuXHJcbiAgICBwcml2YXRlIF9sZWZ0dHJhaWw6TGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBfcmlnaHR0cmFpbDpMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcblxyXG4gICAgcmVzb3VzZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBzcC50cmFuc2Zvcm07XHJcbiAgICAgICAgdGhpcy5fcm9sZVZPID0gKE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggVXNlckluZm9Qcm94eSApIGFzIFVzZXJJbmZvUHJveHkpLnJvbGVWTztcclxuICAgICAgICAoIHNwLmdldENvbXBvbmVudCggTGF5YS5SaWdpZGJvZHkzRCApIGFzIExheWEuUmlnaWRib2R5M0QgKS5jY2RNb3Rpb25UaHJlc2hvbGQgPSAwLjAwMTtcclxuICAgICAgICB0aGlzLl9sZWZ0dHJhaWwgPSBzcC5nZXRDaGlsZEJ5TmFtZShcImxlZnR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgdGhpcy5fcmlnaHR0cmFpbCA9IHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRW5hYmxlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0KClcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zVmVjOkxheWEuVmVjdG9yMztcclxuICAgIHB1YmxpYyBzdGFydFJ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyB0aGlzLnB6ZGljdCA9IHt9O1xyXG4gICAgICAgIC8vIHRoaXMucHphcnIgPSBbXTtcclxuICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gMTtcclxuICAgICAgICB0aGlzLl9qaWFzdWJ1ZmZUaW1lID0gMDtcclxuICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbGFzdGppYXN1U3RhdGUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dzY2VuZW5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueSA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLl9yb2xlVk8ubW92ZXNwZWVkO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIuW8gOWni+i3kVwiICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICAvLyBwcml2YXRlIHB6ZGljdDphbnkgPSB7fTtcclxuICAgIC8vIHByaXZhdGUgcHphcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5qaXN1YW5Db2xsaXNpb24oIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyLGNvbnRhY3RQb2ludC5wb3NpdGlvbk9uQik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzQ29sbGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dDb2xsVGFyZ2V0TmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfbm9ybWFsaXplVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX25vd3NlbGVjdFZlYzpMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93YnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBcclxuICAgIHByaXZhdGUgX25vd3NjZW5lbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacqumUge+8jDHvvJrplIHlt6bovrnvvIwy77ya6ZSB5Y+z6L65XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc2V0bm93U2VsZWN0VmVjKCBwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IHBvcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sb2NrYnlCdWlsZG5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrooqvplIHvvIwx77ya6ZSB5a6a5bem6L6577yMMu+8mumUgeWumuWPs+i+ue+8jFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2Nrc3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBqaXN1YW5Db2xsaXNpb24oIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSxjb2xscG9pbnQ6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwi5byA5aeL56Kw5pKeXCIsdGhpcy5fbm9ybWFsaXplVmVjLHRhcmdldC5uYW1lICk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8IFxyXG4gICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEpIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA+ICh0aGlzLl9ub3dzZWxlY3RWZWMueSAtIDAuMikgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucHpkaWN0W3RoaXMuX25vd0NvbGxUYXJnZXROYW1lXSA9IFJvbGVBY3Rpb25zLkNsaW1iO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucHphcnIucHVzaCggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI7ICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sb2NrY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmppYXN1SnVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmRvd25TbGlkZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSAmJiB0aGlzLm5vd1N0YXRlICE9IFJvbGVBY3Rpb25zLmRvd25TbGlkZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfc2lkZWp1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5zbGlkZWppYXN1O1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfU3VybW91bnRcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5zdXJtb3VudDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOaMgee7reeisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgIG9uQ29sbGlzaW9uU3RheShjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coIFwi56Kw5pKe5LitXCIgKTtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNDb2xsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNvbGxpc2lvbi5vdGhlci5vd25lcjtcclxuICAgICAgICAgICAgdmFyIHRhcmdldG5hbWU6c3RyaW5nID0gdGFyZ2V0Lm5hbWU7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXRuYW1lICE9IFwiU2xpZGVyQm9vc3RcIiAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwibnBjXCIgKSA9PSAtMSAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSA9IHRhcmdldG5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKSAvL+eisOWIsOW7uuetke+8jOWIpOaWreaYr+S4iueIrO+8jOW3pueIrOi/mOaYr+WPs+eIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NjZW5lbmFtZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5PmnZ/norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRXhpdChjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNDb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlbmRDb2xsKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lciApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrZW5kQ29sbCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIue7k+adn+eisOaSnlwiLHRhcmdldC5uYW1lICk7XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5pc2ZvcmNlSnVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lICE9IHRhcmdldC5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLorqHnrpfnorDmkp7lrozmiJDnirbmgIFcIiApO1xyXG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dTdGF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLkNsaW1iOlxyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhciBpc3RvVG9wOmJvb2xlYW4gPSBTY2VuZTNkT2JqZWN0LmNoZWNraXNDbGltYlRvcCggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQubmFtZSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiggaXN0b1RvcCApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBEZWJ1Z2VyLmxvZyggXCLmkq3mlL7niKzmpbzlrozmiJDliqjkvZxcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnBsYXlBbm1vKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOlxyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEp1bXBTdGF0ZSggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucnVuOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnhzaHVueWk6XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9zcGVlZE1vdmVWMy54ICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEp1bXBTdGF0ZSggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB2YWx1ZSA8IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfanVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5QW5tbyggYWN0aW5OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmNsaW1iZW5kICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhY3Rpb25Db21wZWx0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfbGFzdFN0YXRlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9tb3ZlVGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2lzQWN0aW9uTnVtczpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc25lZWRhY3Rpb25udW06bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX25lZWRhY3Rpb250aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDpgJ9idWZmdmVjXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xhc3RqaWFzdVN0YXRlOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9qaWFzdWJ1ZmZUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGlzY2FuemhlbmRvbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB6aGVuZG9uZ3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2lzU2h1YW5nYmVpamlhc3U6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX2JlaXNodVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAxLDEsMSApO1xyXG5cclxuICAgIHB1YmxpYyBzZXQgbm93U3RhdGUoIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1N0YXRlICE9IHZhbHVlIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qaWFzdUp1bXAgfHwgdGhpcy5fbm93U3RhdGUgPT0gUm9sZUFjdGlvbnMuamlhc3VKdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGF0ZSA9IHRoaXMuX25vd1N0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dTdGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNjYW56aGVuZG9uZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5ndHJhaWxTdGF0ZSggdHJ1ZSApO1xyXG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd1N0YXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdGFuZDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXAgfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmx1b2RpMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmx1b2RpMiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuc2V0bGl6aVBsYXl0YW5zZSggXCJ0YW5zZV9iYWlcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLl9yb2xlVk8uZnJvbnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX3JvbGVWTy5mcm9udGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fcm9sZVZPLmZyb250anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheUdhbWVTb3VuZChcImp1bXBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLnNldGxpemlQbGF5dGFuc2UoIFwidGFuc2VfYmFpXCIsIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLl9yb2xlVk8ubGVmdGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLmxlZnRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3JvbGVWTy5sZWZ0anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMubGVmdGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuc2V0bGl6aVBsYXl0YW5zZSggXCJ0YW5zZV9iYWlcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuX3JvbGVWTy5yaWdodGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLnJpZ2h0anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9yb2xlVk8ucmlnaHRqdW1wLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5yaWdodGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuamlhc3VKdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fYmVpc2h1VmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fYmVpc2h1VmVjLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlHYW1lU291bmQoXCJqdW1wXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5wbGF5c3BlZWRTb3VuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwLHRoaXMsdGhpcy5wbGF5c3BlZWRTb3VuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZG93blNsaWRlOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfZG93bnNsaXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9qaWFzdWJ1ZmZUaW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ppYXN1YnVmZlRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeCAqIHRoaXMuX2JlaXNodVZlYy54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSAqIHRoaXMuX2JlaXNodVZlYy55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fYmVpc2h1VmVjLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5odWFjaGFuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5c3BlZWRTb3VuZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc2xpZGVqaWFzdTpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9zaWRlanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fYmVpc2h1VmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5ICogdGhpcy5fYmVpc2h1VmVjLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZnogKiB0aGlzLl9iZWlzaHVWZWMuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc3VybW91bnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJib3hfU3VybW91bnRcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9qaWFzdWJ1ZmZUaW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NodWFuZ2JlaWppYXN1ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmVpc2h1VmVjLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWlzaHVWZWMueiA9IGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9qaWFzdWJ1ZmZUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9iZWlzaHVWZWMueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gKGJ1aWxkY2ZnLmJ1ZmZ5KzAuNSkgKiB0aGlzLl9iZWlzaHVWZWMueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmeiAqIHRoaXMuX2JlaXNodVZlYy56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua3VhbGFuICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fcm9sZVZPLnVwY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhcWlhbmcgKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNjYW56aGVuZG9uZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmd0cmFpbFN0YXRlKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX3JvbGVWTy5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3JvbGVWTy5zbGlkZWNsaW1iLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhb3FpYW5nbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmd0cmFpbFN0YXRlKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9yb2xlVk8uc2xpZGVjbGltYi55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9yb2xlVk8uc2xpZGVjbGltYi56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5wYW9xaWFuZ3JpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ3RyYWlsU3RhdGUoIGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZWVkYWN0aW9udGltZSA9IDAuMztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmNsaW1iZW5kICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBsYXlzcGVlZFNvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheUdhbWVTb3VuZChcInNwZWVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93U3RhdGUoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93U3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ3RyYWlsU3RhdGUoIGJvOmJvb2xlYW4gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xlZnR0cmFpbCAmJiB0aGlzLl9yaWdodHRyYWlsICYmIHRoaXMuX2xlZnR0cmFpbC5hY3RpdmUgIT0gYm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGVmdHRyYWlsLmFjdGl2ZSA9IGJvO1xyXG4gICAgICAgICAgICB0aGlzLl9yaWdodHRyYWlsLmFjdGl2ZSA9IGJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZlVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGlzUGVuZ3podWFuZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGp1bXBTcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wSGlnaHQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2Rpc3k6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBnOm51bWJlcj0xMDsvL+mHjeWKm+WKoOmAn+W6plxyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGR0ID0gMTY7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzY2FuTW92ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSArPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICBzd2l0Y2goIHRoaXMubm93U3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJ1bjovL+i3keWKqFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqICh0aGlzLl9zcGVlZE1vdmVWMy56ICogdGhpcy5fYmVpc2h1VmVjLnopO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5DbGltYjovL+eIrOWNh1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxvY2tjbGltYjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLniKzlopnliqjkvZznu5PmnZ/mkq3mlL5cIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qdW1wOi8v6Lez6LeDXHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfanVtcDpcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qaWFzdUp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnhzaHVueWk6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fc3BlZWRNb3ZlVjMueCpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kb3duU2xpZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc2xpZGVqaWFzdTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5famlhc3VidWZmVGltZSA8PSAwICYmIHRoaXMuX2xhc3RTdGF0ZT09Um9sZUFjdGlvbnMubGVmdF9jbGltYiB8fCB0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IHRoaXMuX2xhc3RTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdXJtb3VudDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAoMS8wLjMpKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmICh0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLnJ1biB8fCB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmRvd25TbGlkZSApICYmICF0aGlzLl9pc0NvbGxpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPD0gdGhpcy5fbm93c2VsZWN0VmVjLnogKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgU2NlbmUzZE9iamVjdC5kaWVQb3NZICkvL+inkuiJsuatu+S6oVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgdGhpcy5fbm93YnVpbGRuYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX2luaXRQb3NWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuX25vd3NjZW5lbmFtZSx0aGlzLl9ub3didWlsZG5hbWUgKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53aW5nYW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LnByb19qaW5kdS52YWx1ZSA9ICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAvIFNjZW5lM2RPYmplY3QuZ2FtZXdpblBvc1ogKiAxMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzQWN0aW9uTnVtcyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc25lZWRhY3Rpb25udW0gPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmt1YWxhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmx1b2RpMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJpZ2h0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kYXRpYW8xOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5rb25nemhvbmcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMua3VhbGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2ppYXN1YnVmZlRpbWUgPiAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5famlhc3VidWZmVGltZSAtPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLmppYWR1bGl6aSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc1NodWFuZ2JlaWppYXN1IClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdldEluc3RhbmNlKCkuamlhZHVsaXppMSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy54ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy55ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JlaXNodVZlYy56ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2h1YW5nYmVpamlhc3UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZUppYXN1bGl6aSggKTtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZ2V0SW5zdGFuY2UoKS5jbG9zZUppYXN1bGl6aTEoICk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5pc2NhbnpoZW5kb25nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUrPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuemhlbmRvbmd0aW1lID49IDAuNSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56aGVuZG9uZ3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+PSB0aGlzLl9lbmRhbm1vdGltZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS54ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnogPSB0aGlzLl9lbmRBbm1vU3BlZWQueiAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgKCBTY2VuZTNkT2JqZWN0LmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhc1NjcmlwdCApIGFzIENhbWVyYXNTY3JpcHQgKS5NeVJvdGF0ZUFyb3VuZCggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl9lbmRBbm1vU3BlZWQxICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbmRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHdpbmdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgU291bmRzc01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5wbGF5R2FtZVNvdW5kKFwiY29tcGxldGVcIik7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuZW5kR2FtZSApO1xyXG4gICAgICAgIHZhciBjYXJtYVRyYW5zOkxheWEuVHJhbnNmb3JtM0QgPSBTY2VuZTNkT2JqZWN0LmNhcm1hLnRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueiA9ICh0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiAtIDIgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnopL3RoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC55ID0gKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IC0gY2FybWFUcmFucy5wb3NpdGlvbi55KS90aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQueCA9ICggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnggKyAzIC0gY2FybWFUcmFucy5wb3NpdGlvbi54ICkgLyB0aGlzLl9lbmRhbm1vdGltZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5nZXRJbnN0YW5jZSgpLmxpemllbmRnYW1lKCBcInlhbmh1YVwiLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbixHYW1lU3RhdGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPT0gMD90cnVlOmZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGlzZm9yY2VKdW1wOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXHJcbiAgICBwdWJsaWMgam95U3RpY2tDSGFuZ2UoIHZhbHVlOm51bWJlcix2YWx1ZTE6bnVtYmVyLGFuZ2xlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiB8fCBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iIHx8IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWUxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iICYmIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApIC8v5by65Yi26Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMubGVmdF9qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhbmdsZSA9IC1hbmdsZSAqIE1hdGguUEkvMTgwO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSxhbmdsZSx0aGlzLnF1YXRlcm5pb24gKTtcclxuICAgICAgICAgICAgdmFyIGp1bXB6Om51bWJlciA9IHRoaXMuanVtcFNwZWVkLno7XHJcbiAgICAgICAgICAgIExheWEuVmVjdG9yMy50cmFuc2Zvcm1RdWF0KCB0aGlzLmp1bXBTcGVlZCx0aGlzLnF1YXRlcm5pb24sdGhpcy5qdW1wU3BlZWQgKTtcclxuICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IGp1bXB6O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgeHNodW55aSggc3RhdGU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLnJ1biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnggPSBzdGF0ZSAqIDIwO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMueHNodW55aTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uTmFtZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgc2V0QWN0aW9uKCBhY3Rpb25OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcclxuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvbk5hbWUgPT0gUm9sZUFjdGlvbnMuY2xpbWJlbmQgfHwgdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBSb2xlQWN0aW9ucy5sdW9kaTEgfHwgdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBSb2xlQWN0aW9ucy5sdW9kaTIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDEuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5wbGF5KGFjdGlvbk5hbWUsMCwwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoIGFjdGlvbk5hbWUgPT0gUm9sZUFjdGlvbnMuc3RhbmQgKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fYW5pbWF0b3IucGxheShhY3Rpb25OYW1lKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgLy8gdGhpcy5fYW5pbWF0b3IuY3Jvc3NGYWRlKGFjdGlvbk5hbWUsIDAuMDIsIDApO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9hbmltYXRvci5wbGF5KGFjdGlvbk5hbWUpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2VzaGl0aWFveXVlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblVwZGF0ZSgpXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxhdGVVcGRhdGUoKVxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxufSIsImltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBTY2VuZTNkT2JqZWN0IGZyb20gXCIuLi9zY2VuZTNkcy9TY2VuZTNkT2JqZWN0XCI7XHJcbmltcG9ydCBSb2xlQWN0aW9ucyBmcm9tIFwiLi4vc2NlbmUzZHMvUm9sZUFjdGlvbnNcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vdXNlcmluZm8vdm8vUm9sZVZPXCI7XHJcbmltcG9ydCBNVkNPYmplY3RQb29sIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9NVkNPYmplY3RQb29sXCI7XHJcbmltcG9ydCBVc2VySW5mb1Byb3h5IGZyb20gXCIuLi91c2VyaW5mby9Vc2VySW5mb1Byb3h5XCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9CdWlsZENGR1wiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1V0aWxzXCI7XHJcbmltcG9ydCBDYW1lcmFzU2NyaXB0IGZyb20gXCIuL0NhbWVyYXNTY3JpcHRcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi8uLi9jb25maWdzL2RhdGFDb25maWdzL05wY0NGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnBjU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm9sZUFjdGlvblxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ub3dTdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIF9hbmltYXRvcjpMYXlhLkFuaW1hdG9yO1xyXG5cclxuICAgIHJlc291c2VOYW1lOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2hhbmdwYVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF3YWtlKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvciA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLmdldENvbXBvbmVudCggTGF5YS5BbmltYXRvciApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2V0QW5pbWF0b3IoIHRoaXMuX2FuaW1hdG9yICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm07XHJcbiAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSB0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgKHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRCkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgKHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0QgKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zVmVjOkxheWEuVmVjdG9yMztcclxuICAgIC8qKlxyXG4gICAgICog54q25oCB77yMMO+8muetieW+heeKtuaAge+8jDHvvJrlvIDlp4vnirbmgIHvvIwy77ya5a6M5oiQ54q25oCBXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX25vd1JvbGVTdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzdGFydFJ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jaGVja3RpbWUgPSA1MDA7XHJcbiAgICAgICAgdGhpcy5fbm93Um9sZVN0YXRlID0gMTtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IDA7XHJcbiAgICAgICAgdGhpcy5faW5pdFBvc1ZlYyA9IHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnN0YW5kO1xyXG4gICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueSA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueiA9IC10aGlzLm1vdmVzcGVlZDtcclxuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9ub3dOcGNDZmc6TnBjQ0ZHO1xyXG5cclxuICAgIG1vdmVzcGVlZDpudW1iZXIgPSAwO1xyXG4gICAgZnJvbnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBsZWZ0anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcmlnaHRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICB1cGNsaW1iOm51bWJlciA9IDA7XHJcbiAgICBzbGlkZWNsaW1iOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIHNldG5wY0NGRyggY2ZnOk5wY0NGRyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dOcGNDZmcgPSBjZmc7XHJcbiAgICAgICAgdGhpcy5tb3Zlc3BlZWQgPSB0aGlzLl9ub3dOcGNDZmcuc3BlZWQ7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmZyb250anVtcC56ICk7XHJcblxyXG4gICAgICAgIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLmxlZnRqdW1wLnggKTtcclxuICAgICAgICB0aGlzLmxlZnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY0NmZy5sZWZ0anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcubGVmdGp1bXAueiApO1xyXG5cclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnggKTtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnkgKTtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcudXBjbGltYiApO1xyXG5cclxuICAgICAgICB0aGlzLnNsaWRlY2xpbWIueCA9IE51bWJlciggdGhpcy5fbm93TnBjQ2ZnLnNsaWRlY2xpbWIueCApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYi55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNDZmcuc2xpZGVjbGltYi55ICk7XHJcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY0NmZy5zbGlkZWNsaW1iLnogKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5qaXN1YW5Db2xsaXNpb24oIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb2xsaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX25vd0NvbGxUYXJnZXROYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuXHJcbiAgICBwcml2YXRlIF9ub3didWlsZG5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2NlbmVuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq6ZSB77yMMe+8mumUgeW3pui+ue+8jDLvvJrplIHlj7PovrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9ja3hzdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzZXRub3dTZWxlY3RWZWMoIHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gcG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvY2tieUJ1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquiiq+mUge+8jDHvvJrplIHlrprlt6bovrnvvIwy77ya6ZSB5a6a5Y+z6L6577yMXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2tzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBqaXN1YW5Db2xsaXNpb24oIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogPT0gLTEgKSAvL+S4iueIrFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55ID4gKHRoaXMuX25vd3NlbGVjdFZlYy55IC0gMC4xKSAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuQ2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI7ICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5DbGltYiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2NsaW1iOyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sb2NrY2xpbWI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicGFuZWxfanVtcFwiICkgIT0gLTEgKSAvL+WKoOmAn+adv+i3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmppYXN1SnVtcDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd1N0YXRlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoXCJwYW5lbF9kb3duc2xpcFwiKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuZG93blNsaWRlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93U3RhdGUgIT0gUm9sZUFjdGlvbnMuZG93blNsaWRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5DbGltYjtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9zaWRlanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnNsaWRlamlhc3U7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9TdXJtb3VudFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnN1cm1vdW50O1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5DbGltYjtcclxuICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5oyB57ut56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyAgb25Db2xsaXNpb25TdGF5KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcclxuICAgIHtcclxuICAgICAgICAvLyBEZWJ1Z2VyLmxvZyggXCLnorDmkp7kuK1cIiApO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0NvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gY29sbGlzaW9uLm90aGVyLm93bmVyO1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0bmFtZTpzdHJpbmcgPSB0YXJnZXQubmFtZTtcclxuICAgICAgICAgICAgaWYoIHRhcmdldG5hbWUgIT0gXCJTbGlkZXJCb29zdFwiICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJucGNcIiApID09IC0xICYmIHRhcmdldG5hbWUuaW5kZXhPZiggXCJyb2xlXCIgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lID0gdGFyZ2V0bmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJTY2FmZm9sZGluZ1wiICkgIT0gLTEgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93YnVpbGRuYW1lID0gdGhpcy5fbm93Q29sbFRhcmdldE5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkV4aXQoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZW5kQ29sbCggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja2VuZENvbGwoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuaXNmb3JjZUp1bXAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pc2ZvcmNlSnVtcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSAhPSB0YXJnZXQubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInBhbmVsX2p1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoKCB0aGlzLm5vd1N0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYm94X0JvYXJkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGlzdG9Ub3A6Ym9vbGVhbiA9IFNjZW5lM2RPYmplY3QuY2hlY2tpc0NsaW1iVG9wKCB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5uYW1lLHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmKCBpc3RvVG9wIClcclxuICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIERlYnVnZXIubG9nKCBcIuaSreaUvueIrOalvOWujOaIkOWKqOS9nFwiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucGxheUFubW8oXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93U3RhdGUgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SnVtcFN0YXRlKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEp1bXBTdGF0ZSggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMueHNodW55aTpcclxuICAgICAgICAgICAgdGhpcy5zZXRKdW1wU3RhdGUoIHRoaXMuX3NwZWVkTW92ZVYzLnggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0SnVtcFN0YXRlKCB2YWx1ZTpudW1iZXIsaXNxdWFuemhvbmc6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHZhbHVlIDwgMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggaXNxdWFuemhvbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZGlyOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwibGVmdHJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiZnJvbnRyaWdodFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsdmFsdWUgPSB0aGlzLl9ub3dOcGNDZmcuc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiZnJvbnRsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwicmlnaHRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJmcm9udFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY0NmZy5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY0NmZy5qdW1wX2xlZnQgKyB0aGlzLl9ub3dOcGNDZmcuanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjQ2ZnLnN0YXJ0X2FoZWFkICsgdGhpcy5fbm93TnBjQ2ZnLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggc2VsZWN0ZGlyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucmlnaHRfanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmcm9udFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5qdW1wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheUFubW8oIGFjdGluTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5jbGltYmVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWN0aW9uQ29tcGVsdGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJ1bjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sYXN0U3RhdGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX21vdmVUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9jaGl4dVRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9pc0FjdGlvbk51bXM6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNuZWVkYWN0aW9ubnVtOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9uZWVkYWN0aW9udGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBzZXQgbm93U3RhdGUoIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dTdGF0ZSAhPSB2YWx1ZSB8fCB0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMuamlhc3VKdW1wfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTdGF0ZSA9IHRoaXMuX25vd1N0YXRlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93U3RhdGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93U3RhdGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuc3RhbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnJ1bjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXAgfHx0aGlzLl9sYXN0U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5sdW9kaTEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMubHVvZGkyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMuZnJvbnRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmZyb250anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5mcm9udGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IHRoaXMubGVmdGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMubGVmdGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMubGVmdGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmxlZnRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5yaWdodGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMucmlnaHRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnJpZ2h0anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucmlnaHRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5qaWFzdUp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbGFzdFN0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLmp1bXBTcGVlZC56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5kYXRpYW8xICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMuZGF0aWFvMiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5kb3duU2xpZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfZG93bnNsaXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaXh1VGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5odWFjaGFuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBSb2xlQWN0aW9ucy5zbGlkZWppYXN1OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9zaWRlanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5fY2hpeHVUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy4gKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnN1cm1vdW50OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9TdXJtb3VudFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5KzAuNTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaXh1VGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5rdWFsYW4gKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLkNsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMudXBjbGltYjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucGFxaWFuZyApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9jbGltYjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnNsaWRlY2xpbWIueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuc2xpZGVjbGltYi56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnBhb3FpYW5nbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNsaWRlY2xpbWIuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5wYW9xaWFuZ3JpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb246XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25lZWRhY3Rpb250aW1lID0gMC4zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aW9uKCBSb2xlQWN0aW9ucy5jbGltYmVuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93U3RhdGUoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgX21vdmVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgaXNQZW5nemh1YW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUganVtcFNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGp1bXBIaWdodDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZGlzeTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGc6bnVtYmVyPTEwOy8v6YeN5Yqb5Yqg6YCf5bqmXHJcbiAgICBwcml2YXRlIF9jaGVja3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbm93Um9sZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZHQgPSAxNjtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2t0aW1lICs9IGR0O1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGVja3RpbWUgPj0gNTAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dOcGNDZmcgJiYgU2NlbmUzZE9iamVjdC5tYWluUm9sZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKyB0aGlzLl9ub3dOcGNDZmcuZGlzdGFuY2UgPCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dTdGF0ZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5ydW46Ly/ot5HliqhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuQ2xpbWI6Ly/niKzljYdcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubG9ja2NsaW1iOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5wbGF5UGFsb3VBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnBsYXlQYWxvdUFjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDovL+i3s+i3g1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMubGVmdF9qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRfanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmppYXN1SnVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRfY2xpbWI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5yaWdodF9jbGltYjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuanVtcFNwZWVkLnkqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMueHNodW55aTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX3NwZWVkTW92ZVYzLngqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRvd25TbGlkZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLnNsaWRlamlhc3U6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9jaGl4dVRpbWUgJiYgdGhpcy5fbGFzdFN0YXRlPT1Sb2xlQWN0aW9ucy5sZWZ0X2NsaW1iIHx8IHRoaXMuX2xhc3RTdGF0ZSA9PSBSb2xlQWN0aW9ucy5yaWdodF9jbGltYiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSB0aGlzLl9sYXN0U3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dTdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5zdXJtb3VudDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucGxheVBhbG91QWN0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9ICgxLzAuMykqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiAodGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gfHwgdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5kb3duU2xpZGUgKSAmJiAhdGhpcy5faXNDb2xsaW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPD0gdGhpcy5fbm93c2VsZWN0VmVjLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5yaWdodF9qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5sZWZ0X2p1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IFNjZW5lM2RPYmplY3QuZGllUG9zWSApLy/op5LoibLmrbvkuqFcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgdGhpcy5fbm93YnVpbGRuYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5faW5pdFBvc1ZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBTY2VuZTNkT2JqZWN0LmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuX25vd3NjZW5lbmFtZSx0aGlzLl9ub3didWlsZG5hbWUgKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMucnVuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IDwgU2NlbmUzZE9iamVjdC5nYW1ld2luUG9zWiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5nYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNBY3Rpb25OdW1zIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAvL+WmguaenOW9k+WJjeaSreaUvnN0YXRl5bey57uP5pKt5pS+5a6M5LqG5LiA5qyhXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fYW5pbWF0b3IuZ2V0Q3VycmVudEFuaW1hdG9yUGxheVN0YXRlKCkubm9ybWFsaXplZFRpbWUgPj0gdGhpcy5faXNuZWVkYWN0aW9ubnVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZGF0aWFvMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5rdWFsYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5sdW9kaTI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25lZWRhY3Rpb250aW1lICE9IDAgJiYgdGhpcy5fbW92ZVRpbWUgPiB0aGlzLl9uZWVkYWN0aW9udGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbk5hbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmxlZnRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMucmlnaHRqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuZGF0aWFvMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJvbGVBY3Rpb25zLmRhdGlhbzI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5rdWFsYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMua29uZ3pob25nICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSb2xlQWN0aW9ucy5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUm9sZUFjdGlvbnMuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGlvbiggUm9sZUFjdGlvbnMucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPSBSb2xlQWN0aW9ucy5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueCA9IHRoaXMuX2VuZEFubW9TcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS55ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnkgKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnogPSB0aGlzLl9lbmRBbm1vU3BlZWQueiAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICggU2NlbmUzZE9iamVjdC5jYXJtYS5nZXRDb21wb25lbnQoIENhbWVyYXNTY3JpcHQgKSBhcyBDYW1lcmFzU2NyaXB0ICkuTXlSb3RhdGVBcm91bmQoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5fZW5kQW5tb1NwZWVkMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuZEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50LmVuZEdhbWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIHdpbmdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHRoaXMuX25vd1JvbGVTdGF0ZSA9IDI7XHJcbiAgICAgICAgdGhpcy5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLmtvbmd6aG9uZyApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggR2FtZUV2ZW50Lm5wY2VuZEdhbWUsdGhpcy5vd25lci5uYW1lICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGlzZm9yY2VKdW1wOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIHF1YXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjsgXHJcbiAgICBwdWJsaWMgam95U3RpY2tDSGFuZ2UoIHZhbHVlOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucnVuIHx8IHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMuQ2xpbWIgfHwgUm9sZUFjdGlvbnMubGVmdF9jbGltYiB8fCBSb2xlQWN0aW9ucy5yaWdodF9jbGltYiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5sZWZ0X2NsaW1iICYmIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApIC8v5by65Yi26Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnJpZ2h0X2p1bXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfY2xpbWIgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID0gUm9sZUFjdGlvbnMubGVmdF9qdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMubGVmdF9qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93U3RhdGUgPT0gUm9sZUFjdGlvbnMucmlnaHRfanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd1N0YXRlID09IFJvbGVBY3Rpb25zLmppYXN1SnVtcCApXHJcbiAgICAgICAgICAgIGFuZ2xlID0gLWFuZ2xlICogTWF0aC5QSS8xODA7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLGFuZ2xlLHRoaXMucXVhdGVybmlvbiApO1xyXG4gICAgICAgICAgICBMYXlhLlZlY3RvcjMudHJhbnNmb3JtUXVhdCggdGhpcy5qdW1wU3BlZWQsdGhpcy5xdWF0ZXJuaW9uLHRoaXMuanVtcFNwZWVkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHhzaHVueWkoIHN0YXRlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dTdGF0ZSA9PSBSb2xlQWN0aW9ucy5ydW4gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy54ID0gc3RhdGUgKiAzMDtcclxuICAgICAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLnhzaHVueWk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIHNldEFjdGlvbiggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XHJcbiAgICAgICAgaWYoIHRoaXMuX2FuaW1hdG9yIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dBY3Rpb25OYW1lID09IFJvbGVBY3Rpb25zLmNsaW1iZW5kIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxLjU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3IucGxheShhY3Rpb25OYW1lLDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjZXNoaXRpYW95dWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dTdGF0ZSA9IFJvbGVBY3Rpb25zLmp1bXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uVXBkYXRlKClcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF0ZVVwZGF0ZSgpXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQb3N0aW9uKCk6TGF5YS5WZWN0b3IzXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm93c3RhdGUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93Um9sZVN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdHJveSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgV2luZG93QW5tb1R5cGUgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvbXZjL1dpbmRvd0FubW9UeXBlXCI7XHJcbmltcG9ydCBHYW1lU3RhdGVNYW5hZ2VyIGZyb20gXCIuLi9tYWluL0dhbWVTdGF0ZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5pbXBvcnQgR2FtZVByb3h5IGZyb20gXCIuLi9tYWluL3Byb3h5cy9HYW1lUHJveHlcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi8uLi9wbGF0Zm9ybS93eG1pbmlnYW1lL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9VaU1hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVSZXN1bHRWaWV3IGV4dGVuZHMgQmFzZVZpZXcgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJHYW1lUmVzdWx0Vmlld1wiO1xyXG5cclxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIHR4dF9nb2xkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuXzE6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGdldGdvbGQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2dhbWVQcm94eTpHYW1lUHJveHk7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCBnb2xkOm51bWJlciApIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJnYW1lcmVzdWx0XCIsZmFsc2UsV2luZG93QW5tb1R5cGUuV2luZG93QW5tb1R5cGVfbm9uZSwxICk7IFxyXG4gICAgICAgIHRoaXMuZ2V0Z29sZCA9IGdvbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2dhbWVQcm94eSA9IHRoaXMuZ2V0UHJveHkoIEdhbWVQcm94eSApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3N0YXRlXCIgKTtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLmdldGdvbGQudG9TdHJpbmcoKTtcclxuICAgICAgICBpZiggR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fMCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4wY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnRuMGNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5pqC5pyq5byA5pS+XCIgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmNoYW5nZUdvbGQoIHRoaXMuZ2V0Z29sZCApO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcoICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnRuMWNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggVXNlckluZm9Qcm94eSApIGFzIFVzZXJJbmZvUHJveHkgKS5jaGFuZ2VHb2xkKCB0aGlzLmdldGdvbGQgKTtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLmFkZExldmVsKCAgKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkuY2hhbmdlR29sZCggdGhpcy5nZXRnb2xkICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2dhbWVQcm94eS5yZXR1cm5tYWludmlldyggKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHdpbnM6bnVtYmVyID0gR2FtZVN0YXRlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgPzE6MDtcclxuICAgICAgICB2YXIgdXNlcmlkOmFueSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0VXNlciggQWNjb3VudFVzZXIudXNlcl9pZCApO1xyXG4gICAgICAgIHZhciBhZ3JzID0gW3sgXCJ0XCI6UGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgfSx7IFwicGxheV9pZFwiOnVzZXJpZCB9LHtcIm1vbmV5XCI6XCIwXCJ9LHsgXCJ3aW5cIjogd2lucy50b1N0cmluZygpIH1dO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcIuS4iuS8oO+8mlwiLGFncnMgKTtcclxuICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5IdHRwUG9zdFJlcXVlc3QoUFJPVE9DT0xTLmVuZCwgYWdycywgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICkgYXMgVXNlckluZm9Qcm94eSApLnNlbmRHb2xkU3luYygpO1xyXG4gICAgICAgIH0pLCBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIChfZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIua4uOaIj+e7k+aenGVyclwiKTtcclxuICAgICAgICB9KSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZUFjdGlvbnNcclxue1xyXG5cclxuICAgIHN0YXRpYyBzdGFuZDpzdHJpbmcgPSBcInN0YW5kXCI7XHJcbiAgICBzdGF0aWMga29uZ3pob25nOnN0cmluZyA9IFwia29uZ3pob25nXCI7XHJcbiAgICBzdGF0aWMgbHVvZGkxOnN0cmluZyA9IFwibHVvZGkxXCI7XHJcbiAgICBzdGF0aWMgbHVvZGkyOnN0cmluZyA9IFwibHVvZGkyXCI7XHJcbiAgICBzdGF0aWMgZGF0aWFvMTpzdHJpbmcgPSBcImRhdGlhbzFcIjtcclxuICAgIHN0YXRpYyBkYXRpYW8yOnN0cmluZyA9IFwiZGF0aWFvMlwiO1xyXG4gICAgc3RhdGljIGh1YWNoYW46c3RyaW5nID0gXCJodWFjaGFuXCI7XHJcbiAgICBzdGF0aWMga3VhbGFuOnN0cmluZyA9IFwia3VhbGFuXCI7XHJcbiAgICBzdGF0aWMgY2VmYW4xOnN0cmluZyA9IFwiY2VmYW4xXCI7XHJcbiAgICBzdGF0aWMgY2VmYW4yOnN0cmluZyA9IFwiY2VmYW4yXCI7XHJcbiAgICBzdGF0aWMgcGFvcWlhbmdsZWZ0OnN0cmluZyA9IFwicGFvcWlhbmdsZWZ0XCI7XHJcbiAgICBzdGF0aWMgcmlnaHRqdW1wOnN0cmluZyA9IFwicmlnaHRqdW1wXCI7XHJcbiAgICBzdGF0aWMgcGFvcWlhbmdyaWdodDpzdHJpbmcgPSBcInBhb3FpYW5ncmlnaHRcIjtcclxuICAgIHN0YXRpYyBsZWZ0anVtcDpzdHJpbmcgPSBcImxlZnRqdW1wXCI7XHJcbiAgICBzdGF0aWMgcGFxaWFuZzpzdHJpbmcgPSBcInBhcWlhbmdcIjtcclxuICAgIHN0YXRpYyBjbGltYmVuZDpzdHJpbmcgPSBcImNsaW1iZW5kXCI7XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi3keWKqFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcnVuOnN0cmluZyA9IFwicnVuXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDot7Pot4NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGp1bXA6c3RyaW5nID0gXCJqdW1wXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDniKzljYdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIENsaW1iOnN0cmluZyA9IFwiQ2xpbWJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOiHqueUseiQveS9k1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgRnJlZWZhbGxpbmc6c3RyaW5nID0gXCJGcmVlZmFsbGluZ1wiO1xyXG5cclxuICAgIHN0YXRpYyBsZWZ0X2NsaW1iOnN0cmluZyA9IFwibGVmdF9jbGltYlwiO1xyXG5cclxuICAgIHN0YXRpYyByaWdodF9jbGltYjpzdHJpbmcgPSBcInJpZ2h0X2NsaW1iXCI7XHJcblxyXG4gICAgc3RhdGljIHJpZ2h0X2p1bXA6c3RyaW5nID0gXCJyaWdodF9qdW1wXCI7XHJcbiAgICBzdGF0aWMgbGVmdF9qdW1wOnN0cmluZyA9IFwibGVmdF9qdW1wXCI7XHJcblxyXG4gICAgc3RhdGljIHBsYXlQYWxvdUFjdGlvbjpzdHJpbmcgPSBcInBsYXlQYWxvdUFjdGlvblwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6YCf5p2/6Lez6LeDXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqaWFzdUp1bXA6c3RyaW5nID0gXCJqaWFzdUp1bXBcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHjmlrnlkJHnnqznp7tcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHhzaHVueWk6c3RyaW5nID0gXCJ4c2h1bnlpXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuIvmu5HkvY3np7tcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRvd25TbGlkZTpzdHJpbmcgPSBcImRvd25TbGlkZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L6n6Z2i5Yqg6YCfXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzbGlkZWppYXN1OnN0cmluZyA9IFwic2xpZGVqaWFzdVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57+76LaKXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzdXJtb3VudDpzdHJpbmcgPSBcInN1cm1vdW50XCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDplIHlrprniKzljYdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGxvY2tjbGltYjpzdHJpbmcgPSBcImxvY2tjbGltYlwiO1xyXG59IiwiaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4vU2NlbmUzZE9iamVjdFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZXNQb29sXHJcbntcclxuICAgIHN0YXRpYyByb2xlZGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGFkZFJvbGVCeU5hbWUoIHJlc291Y2VOYW1lOnN0cmluZyxjbGFzOmFueSxwYXJlbnQ6YW55ICk6TGF5YS5TcHJpdGUzRFxyXG4gICAge1xyXG4gICAgICAgIHZhciBza2lubmVkbWVzaDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8TGF5YS5TcHJpdGUzRD4gPSBSb2xlc1Bvb2wucm9sZWRpY3RbcmVzb3VjZU5hbWVdO1xyXG4gICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2ggPSBhcnIuc2hpZnQoKTtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2guYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKCBza2lubmVkbWVzaCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKHJlc291Y2VOYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2ggPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKHNwLHBhcmVudCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2xhcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjbGE6YW55ID0gc2tpbm5lZG1lc2guYWRkQ29tcG9uZW50KCBjbGFzICk7XHJcbiAgICAgICAgICAgIGNsYS5yZXNvdXNlTmFtZSA9IHJlc291Y2VOYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgX291dDpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xyXG4gICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLDE4MCpNYXRoLlBJLzE4MCxfb3V0ICk7XHJcbiAgICAgICAgc2tpbm5lZG1lc2gudHJhbnNmb3JtLnJvdGF0aW9uID0gX291dDtcclxuICAgICAgICByZXR1cm4gc2tpbm5lZG1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVSb2xlKCBzcDpMYXlhLlNwcml0ZTNELHJlc291Y2VOYW1lOnN0cmluZyxjbGE6TGF5YS5TY3JpcHQzRCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIVJvbGVzUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUm9sZXNQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjbGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjbGEuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICBzcC5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgUm9sZXNQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXS5wdXNoKCBzcCApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUzZE9iamVjdFxyXG57XHJcbiAgICBzdGF0aWMgc2NlbmUzRDpMYXlhLlNjZW5lM0Q7XHJcbiAgICBzdGF0aWMgc3RhcnRQbGFuZTpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgIHN0YXRpYyBjYXJtYTpMYXlhLkNhbWVyYTtcclxuICAgIHN0YXRpYyBtYWluUm9sZTpMYXlhLlNwcml0ZTNEO1xyXG4gICAgc3RhdGljIG5vd21hcERpY3Q6YW55ID0ge307XHJcbiAgICBzdGF0aWMgZGllUG9zWTpudW1iZXIgPSAwO1xyXG4gICAgc3RhdGljIGVuZFBsYW5lOkxheWEuTWVzaFNwcml0ZTNEO1xyXG5cclxuICAgIHN0YXRpYyBnYW1ld2luUG9zWjpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBwYXR0ZXJuRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBzdGF0aWMgbnBjRGljdDphbnkgPSB7fTtcclxuICAgIHN0YXRpYyBucGNzY3JpcHREaWN0OmFueSA9IHt9O1xyXG4gICAgc3RhdGljIG5wY251bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBpc2Nhcm1hbnBjOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzdGF0aWMgcHJvX2ppbmR1OmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuXHJcbiAgICBzdGF0aWMgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG5cclxuICAgIHN0YXRpYyBsaXppRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICAvLyBzdGF0aWMgYmdzcHJpdGUzZDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6U2NlbmUzZE9iamVjdDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6U2NlbmUzZE9iamVjdFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgU2NlbmUzZE9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQb3NWZWNieVNjZW5lKCBzY2VuZU5hbWU6c3RyaW5nLGJ1aWxkbmFtZTpzdHJpbmcgKTpMYXlhLlZlY3RvcjNcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgc2NlbmVOYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFNjZW5lM2RPYmplY3QucGF0dGVybkRpY3RbIHNjZW5lTmFtZSBdW2J1aWxkbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5piv5ZCm54is5Yiw6aG256uvXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjaGVja2lzQ2xpbWJUb3AoIHNjZW5lTmFtZTpzdHJpbmcsYnVpbGRuYW1lOnN0cmluZywgcG9zOkxheWEuVmVjdG9yMyApOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgdmVjOkxheWEuVmVjdG9yMyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lLGJ1aWxkbmFtZSApO1xyXG4gICAgICAgIGlmKCB2ZWMgJiYgTWF0aC5hYnModmVjLnkgLSBwb3MueSkgPCAxLjUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWN0aW9ubnVtczpudW1iZXIgPSA1NzU7XHJcblxyXG4gICAgc3RhdGljIGFjdGlvbkRpY3Q6YW55ID0geyBcclxuICAgICAgICBcImNsaW1iZW5kXCI6eyBzOjU1MCxlOjU3NSxpc2xvb3Bpbmc6ZmFsc2UgfSxcclxuICAgICAgICBcInN0YW5kXCI6eyBzOjAsZTo4MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicnVuXCI6eyBzOjkwLGU6MTA2LGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJqdW1wXCI6eyBzOjExMCxlOjEzMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia29uZ3pob25nXCI6eyBzOjEzMixlOjE0NSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkxXCI6eyBzOjE0NSxlOjE2MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkyXCI6eyBzOjE3MCxlOjIwMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiZGF0aWFvMVwiOnsgczoyMTAsZToyMzUsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImRhdGlhbzJcIjp7IHM6MjQwLGU6MjczLGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJodWFjaGFuXCI6eyBzOjI4MCxlOjMxMCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia3VhbGFuXCI6eyBzOjMxMCxlOjM0Nixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4xXCI6eyBzOjM1MCxlOjM5MSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4yXCI6eyBzOjQwMCxlOjQzNCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdsZWZ0XCI6eyBzOjQ0MCxpc2xvb3Bpbmc6dHJ1ZSxlOjQ1NiB9LFxyXG4gICAgICAgIFwicmlnaHRqdW1wXCI6eyBzOjQ2MCxlOjQ3Nyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdyaWdodFwiOnsgczo0ODAsZTo0OTYsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImxlZnRqdW1wXCI6eyBzOjUwMCxlOjUxNyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFxaWFuZ1wiOnsgczo1MjAsZTo1NDIsaXNsb29waW5nOnRydWUgfVxyXG4gICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBhbmltYXRvciBcclxuICAgICAqIEBwYXJhbSBhbmltYXRvckRpY3QgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzZXRBbmltYXRvciggYW5pbWF0b3I6TGF5YS5BbmltYXRvciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpZGRpY3Q6YW55O1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gU2NlbmUzZE9iamVjdC5hY3Rpb25EaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCAhYW5pbWF0b3IuZ2V0Q29udHJvbGxlckxheWVyKCApLmdldEFuaW1hdG9yU3RhdGUoIHMgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNoaWRkaWN0ID0gU2NlbmUzZE9iamVjdC5hY3Rpb25EaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgLy/liJvlu7rkuIDkuKrliqjnlLvliqjkvZznirbmgIFcclxuICAgICAgICAgICAgICAgIHZhciBzdGF0ZTEgPSBuZXcgTGF5YS5BbmltYXRvclN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvL+iuvue9ruWKqOS9nOeKtuaAgeeahOWQjeensFxyXG4gICAgICAgICAgICAgICAgc3RhdGUxLm5hbWUgPSBzO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTotbflp4vml7bpl7TvvIjotbflp4vml7bpl7TkuI7nu5PmnZ/ml7bpl7TnmoTorr7nva7kuLowLTHnmoTnmb7liIbmr5TmlbDlgLzvvIkgIOimgeaIquWPlueahOaXtumXtOeCuSAvIOWKqOeUu+eahOaAu+aXtumVv1xyXG4gICAgICAgICAgICAgICAgc3RhdGUxLmNsaXBTdGFydCA9IGNoaWRkaWN0LnMvU2NlbmUzZE9iamVjdC5hY3Rpb25udW1zO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTnu5PmnZ/ml7bpl7RcclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwRW5kID0gY2hpZGRpY3QuZS9TY2VuZTNkT2JqZWN0LmFjdGlvbm51bXM7XHJcbiAgICAgICAgICAgICAgICAvL+W+l+WIsOm7mOiupOWKqOeUu+i1i+WAvOe7mUNsaXDvvIhnZXREZWZhdWx0U3RhdGXpu5jorqTliqjnlLvkuLpVbml0eeS4rWFuaW1hdGlvbueahOaVsOe7hOmhuuW6jzDkuIvmoIfnmoTliqjnlLvvvIlcclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwID0gYW5pbWF0b3IuZ2V0RGVmYXVsdFN0YXRlKCkuY2xpcDtcclxuICAgICAgICAgICAgICAgIC8v5Yqo55S75pKt5pS+5piv5ZCm5b6q546vXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcC5pc2xvb3BpbmcgPSBjaGlkZGljdC5pc2xvb3Bpbmc7XHJcbiAgICAgICAgICAgICAgICAvL+a3u+WKoOWKqOeUu+eKtuaAgeWIsOWKqOeUu+e7hOS7tumHjFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0b3IuYWRkU3RhdGUoc3RhdGUxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdGxpemkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIFwiamlhc3VsaXppXCIgKTtcclxuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcInRhbnNlX2JhaVwiICk7XHJcbiAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ0YW5zZV9odWFuZ1wiICk7XHJcbiAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ3aW5feGlhblwiICk7XHJcbiAgICAgICAgLy8gbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgLy8gbGl6aS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyB2YXIgbGl6aTpMYXlhLlNodXJpS2VuUGFydGljbGUzRCA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJ5YW5odWFcIiApO1xyXG4gICAgICAgIC8vIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIC8vIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGFuc2VsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIHNldGxpemlQbGF5dGFuc2UoIG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNsb3NldGltZTpudW1iZXIgPSAwO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy5saXppZW5kICk7XHJcbiAgICAgICAgdGhpcy5saXppZW5kdGFuc2UoKTtcclxuICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lID0gXCJ0YW5zZV9odWFuZ1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsb3NldGltZSA9IDUwMDtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIG5hbWUgKTtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgaWYoIGNsb3NldGltZSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5saXppZW5kdGFuc2UgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsaXppZW5kdGFuc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RhbnNlbGl6aSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90YW5zZWxpemkucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLl90YW5zZWxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemk0OkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHJpdmF0ZSBfb3V0UVVhdGVybmlvbjQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBqaWFkdWxpemkxKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2VuZ2FtZWxpemk0IHx8ICh0aGlzLl9lbmdhbWVsaXppNCAmJiAhdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIFwiamlhc3VsaXppXCIgKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQucGFydGljbGVTeXN0ZW0ubG9vcGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnRyYW5zZm9ybS5zY2FsZSA9IG5ldyBMYXlhLlZlY3RvcjMoIDIwLDIwLDIwICk7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAxLDAsMCApLC01MCx0aGlzLl9vdXRRVWF0ZXJuaW9uNCApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl9vdXRRVWF0ZXJuaW9uNDtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XHJcbiAgICAgICAgbHpwb3MueSArPSA1O1xyXG4gICAgICAgIGx6cG9zLnogLT0gMTA7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQudHJhbnNmb3JtLnBvc2l0aW9uID0gbHpwb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSmlhc3VsaXppMSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTQgJiYgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMzpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX291dFFVYXRlcm5pb246TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHB1YmxpYyBqaWFkdWxpemkobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZW5nYW1lbGl6aTMgfHwgKHRoaXMuX2VuZ2FtZWxpemkzICYmICF0aGlzLl9lbmdhbWVsaXppMy5hY3RpdmUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMyA9IFNjZW5lM2RPYmplY3QuZ2V0bGl6aWJ5TmFtZSggXCJqaWFzdWxpemlcIiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5wYXJ0aWNsZVN5c3RlbS5sb29waW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnNjYWxlID0gbmV3IExheWEuVmVjdG9yMyggMjAsMjAsMjAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDEsMCwwICksLTUwLHRoaXMuX291dFFVYXRlcm5pb24gKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0UVVhdGVybmlvbjtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbHpwb3M6TGF5YS5WZWN0b3IzID0gcG9zLmNsb25lKCk7XHJcbiAgICAgICAgbHpwb3MueSArPSA1O1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnRyYW5zZm9ybS5wb3NpdGlvbiA9IGx6cG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUppYXN1bGl6aSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTMgJiYgdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemkyOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIGxpemllbmRnYW1lKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMsaXN3aW46Ym9vbGVhbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcInlhbmh1YVwiICk7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBpZihpc3dpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkyID0gU2NlbmUzZE9iamVjdC5nZXRsaXppYnlOYW1lKCBcIndpbl94aWFuXCIgKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZWVuZ2FtbGl6aSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9lbmdhbWVsaXppMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuX2VuZ2FtZWxpemkyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldGxpemlQbGF5KCBuYW1lOnN0cmluZyxwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHZhciBjbG9zZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8vICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMubGl6aWVuZCApO1xyXG4gICAgLy8gICAgIHN3aXRjaCggbmFtZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwidGFuc2VfYmFpXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcclxuICAgIC8vICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwidGFuc2VfaHVhbmdcIjtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSA1MDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwiamlhc3VsaXppXCI6XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwid2luX3hpYW5cIjpcclxuICAgIC8vICAgICAgICAgICAgIGNsb3NldGltZSA9IDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwieWFuaHVhXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSAwO1xyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBTY2VuZTNkT2JqZWN0LmdldGxpemlieU5hbWUoIG5hbWUgKTtcclxuICAgIC8vICAgICBsaXppLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcclxuICAgIC8vICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgIC8vICAgICBpZiggY2xvc2V0aW1lICE9IDAgKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgTGF5YS50aW1lci5vbmNlKCBjbG9zZXRpbWUsdGhpcyx0aGlzLmxpemllbmQsW2xpemldICk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByaXZhdGUgbGl6aWVuZChsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGxpemkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XHJcbiAgICAgICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRsaXppYnlOYW1lKCBuYW1lOnN0cmluZyApOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemlzcDpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5saXppRGljdFtuYW1lXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXppc3AgPSBTY2VuZTNkT2JqZWN0LmxpemlEaWN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsaXppc3AgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwobmFtZSkpKSBhcyBMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5saXppRGljdFtuYW1lXSA9IGxpemlzcDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKCBsaXppc3AgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGl6aXNwLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGxpemlzcDtcclxuICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCBQaUZ1Vk8gZnJvbSBcIi4vdm8vUGlGdVZPXCI7XHJcbmltcG9ydCBTa2luUHJveHkgZnJvbSBcIi4vcHJveHlzL1NraW5Qcm94eVwiO1xyXG5pbXBvcnQgTVZDT2JqZWN0UG9vbCBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvTVZDT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2xvYWRpbmcvdmlldy9Xb3JkVGlwc1V0aWxzXCI7XHJcbmltcG9ydCB7IFBhdGhDb25maWcgfSBmcm9tIFwiLi4vLi4vY29uZmlncy9nYW1lQ29uZmlncy9QYXRoQ29uZmlnXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQaWZ1SXRlbSBleHRlbmRzIGZhaXJ5Z3VpLkdCdXR0b24gXHJcbntcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgdHh0X25lZWQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHBpZnV2bzpQaUZ1Vk87XHJcbiAgICBidG5fMDpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJpdmF0ZSBfc2tpblByb3h5OlNraW5Qcm94eTtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RGcm9tWE1MKHhtbDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xyXG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTogZmFpcnlndWkuR09iamVjdCA9IHRoaXMuX2NoaWxkcmVuW3N0cl07XHJcbiAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NraW5Qcm94eSA9IE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggU2tpblByb3h5ICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub24oIExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bmNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiAvL+aLpeaciVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NraW5Qcm94eS5nZXRTa2luKCB0aGlzLnBpZnV2byApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/nnIvop4bpopHojrflj5ZcclxuICAgICAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6Ly/ph5HluIHotK3kubBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9za2luUHJveHkuZ2V0U2tpbiggdGhpcy5waWZ1dm8gKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93RGF0YSggdm86UGlGdVZPICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGlmdXZvID0gdm87XHJcbiAgICAgICAgaWYoIHRoaXMucGlmdXZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLmljb24gPSBQYXRoQ29uZmlnLmdldHJvbGVpY29uKCB0aGlzLnBpZnV2by5yb2xlQ0ZHLmljb24gKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3NraW5Qcm94eS5yb2xlVk8ucm9sZWlkID09IHRoaXMucGlmdXZvLnJvbGVDRkcuaWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5waWZ1dm8uc3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5waWZ1dm8ucm9sZUNGRy5nZXRTdGF0ZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHh0X25lZWQudGV4dCA9IHRoaXMucGlmdXZvLmhhc251bSArIFwiL1wiICsgdGhpcy5waWZ1dm8ucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4dF9uZWVkLnRleHQgPSB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9mZiggTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IFdpbmRvd0FubW9UeXBlIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL212Yy9XaW5kb3dBbm1vVHlwZVwiO1xyXG5pbXBvcnQgU2tpblByb3h5IGZyb20gXCIuL3Byb3h5cy9Ta2luUHJveHlcIjtcclxuaW1wb3J0IFBpZnVJdGVtIGZyb20gXCIuL1BpZnVJdGVtXCI7XHJcbmltcG9ydCBHYW1lRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9HYW1lRXZlbnRcIjtcclxuaW1wb3J0IFVzZXJJbmZvRXZlbnQgZnJvbSBcIi4uL3VzZXJpbmZvL2V2ZW50cy9Vc2VySW5mb0V2ZW50XCI7XHJcbmltcG9ydCBSb2xlVk8gZnJvbSBcIi4uL3VzZXJpbmZvL3ZvL1JvbGVWT1wiO1xyXG5pbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uL3NjZW5lM2RzL1NjZW5lM2RPYmplY3RcIjtcclxuaW1wb3J0IFJvbGVBY3Rpb25zIGZyb20gXCIuLi9zY2VuZTNkcy9Sb2xlQWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBSb2xlc1Bvb2wgZnJvbSBcIi4uL3NjZW5lM2RzL1JvbGVzUG9vbFwiO1xyXG5pbXBvcnQgTWFpblJBb2xlU2NyaXB0IGZyb20gXCIuLi9tb2RlbFNjcmlwdHMvTWFpblJvbGVTY3JpcHRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNraW5WaWV3IGV4dGVuZHMgQmFzZVZpZXcgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJTa2luVmlld1wiO1xyXG4gICAgY190aXRsZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgYnRuX2Nsb3NlOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBwcml2YXRlIF91aTNEU2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHJpdmF0ZSBfdWljYXJtYTNEOkxheWEuQ2FtZXJhO1xyXG4gICAgLy8gcHJpdmF0ZSBfdWlsaWdodDpMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgcHJpdmF0ZSBfc2tpblByb3h5OlNraW5Qcm94eTtcclxuICAgIHByaXZhdGUgX3JvbGVtbzpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBfaXNkZXN0b3J5czpib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJza2ludmlld1wiLGZhbHNlLFdpbmRvd0FubW9UeXBlLldpbmRvd0FubW9UeXBlX25vbmUsMCApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkZXN0b3J5cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY190aXRsZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3RpdGxlXCIgKTtcclxuICAgICAgICB0aGlzLl9za2luUHJveHkgPSB0aGlzLmdldFByb3h5KCBTa2luUHJveHkgKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1saXN0cmVuZGVyLG51bGwsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLmNfdGl0bGUuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5vbmNoYW5nZSgpO1xyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSB0aGlzLmRpc3BsYXlPYmplY3QuYWRkQ2hpbGRBdChuZXcgTGF5YS5TY2VuZTNEKCksMCkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gKHRoaXMuX3VpM0RTY2VuZS5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA4MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICAvLyB0aGlzLl91aWNhcm1hM0QuY2xlYXJDb2xvciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnZpZXdwb3J0ID0gbmV3IExheWEuVmlld3BvcnQodGhpcy54LHRoaXMueSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl91aWNhcm1hM0QudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsMS4yLDUpLGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0ID0gU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKG5ldyBMYXlhLkRpcmVjdGlvbkxpZ2h0KCkpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7XHJcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodC5jb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMC42LDAuNiwwLjYpO1xyXG4gICAgICAgIC8vIHRoaXMuX3VpbGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZXJvbGVIYW5kbGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5jX3RpdGxlLGZhaXJ5Z3VpLkV2ZW50cy5TVEFURV9DSEFOR0VELHRoaXMsdGhpcy5vbmNoYW5nZSApO1xyXG4gICAgICAgIHRoaXMuYWRkRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcsdGhpcyx0aGlzLm9uY2hhbmdlICk7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF91cGRhdGVyb2xlaWQsdGhpcyx0aGlzLnVwZGF0ZXJvbGVIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVyb2xlSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcm9sZVZPOlJvbGVWTyA9IHRoaXMuX3NraW5Qcm94eS5yb2xlVk87XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSb2xlKCk7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6UGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggcm9sZVZPLnJvbGVDZmcubmFtZSApfSApO1xyXG4gICAgICAgIFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5sb2FkY29tcGxldGUsbnVsbCx0cnVlLHJvbGVWTy5yb2xlQ2ZnLm5hbWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9vdXQ6TGF5YS5RdWF0ZXJuaW9uID0gbmV3IExheWEuUXVhdGVybmlvbjtcclxuICAgIHByaXZhdGUgbG9hZGNvbXBsZXRlKCByZXNvdXNlbmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHJvbGVWTzpSb2xlVk8gPSB0aGlzLl9za2luUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCAhdGhpcy5faXNkZXN0b3J5cyAmJiB0aGlzLl91aTNEU2NlbmUgJiYgcmVzb3VzZW5hbWUgPT0gcm9sZVZPLnJvbGVDZmcubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8gPSBSb2xlc1Bvb2wuYWRkUm9sZUJ5TmFtZSggcmVzb3VzZW5hbWUsTWFpblJBb2xlU2NyaXB0LHRoaXMuX3VpM0RTY2VuZSApO1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggMCwyLDAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICksLTEzNSoxODAvTWF0aC5QSSx0aGlzLl9vdXQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dDtcclxuICAgICAgICAgICAgKCB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBNYWluUkFvbGVTY3JpcHQgKSBhcyBNYWluUkFvbGVTY3JpcHQgKS5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlUm9sZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fcm9sZW1vIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzY3JpcHQ6TWFpblJBb2xlU2NyaXB0ID0gdGhpcy5fcm9sZW1vLmdldENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICkgYXMgTWFpblJBb2xlU2NyaXB0O1xyXG4gICAgICAgICAgICBSb2xlc1Bvb2wucmVtb3ZlUm9sZSggdGhpcy5fcm9sZW1vLHNjcmlwdC5yZXNvdXNlTmFtZSxzY3JpcHQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNoYW5nZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX3NraW5Qcm94eS5waWZ1QXJyLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1saXN0cmVuZGVyKCBpbmRleDpudW1iZXIsaXRlbTpQaWZ1SXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9za2luUHJveHkucGlmdUFyci5sZW5ndGggKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9za2luUHJveHkucGlmdUFycltpbmRleF0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVWlNYW5hZ2VyLmluc3RhbmNlLmNsb3NlKCBTa2luVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZGVzdG9yeXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUm9sZSgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl91aWNhcm1hM0QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNELmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX3VpM0RTY2VuZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IEJhc2VQcm94eXMgZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXNcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCBVc2VyQ2FjaGVUeXBlIGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgUGlGdVZPIGZyb20gXCIuLi92by9QaUZ1Vk9cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGR1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcbmltcG9ydCBTa2luVmlldyBmcm9tIFwiLi4vU2tpblZpZXdcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi8uLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgR2FtZUV2ZW50IGZyb20gXCIuLi8uLi91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgVXNlckluZm9Qcm94eSBmcm9tIFwiLi4vLi4vdXNlcmluZm8vVXNlckluZm9Qcm94eVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2tpblByb3h5IGV4dGVuZHMgQmFzZVByb3h5cyBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlNraW5Qcm94eVwiO1xyXG4gICAgXHJcbiAgICBjYWNoZWRhdGE6YW55O1xyXG4gICAgcGlmdUFycjpBcnJheTxQaUZ1Vk8+O1xyXG4gICAgcGlmdURpY3Q6YW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVPYmooIFVzZXJDYWNoZVR5cGUuc2tpbiApO1xyXG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XHJcbiAgICAgICAgaWYoICF0aGlzLmNhY2hlZGF0YS5oYXNPd25Qcm9wZXJ0eSggXCJwaWZ1XCIgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZGF0YVtcInBpZnVcIl0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGlmdURhdGEgPSB0aGlzLmNhY2hlZGF0YVtcInBpZnVcIl07XHJcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XHJcbiAgICAgICAgdGhpcy5waWZ1RGljdCA9IHt9O1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IG51bXM7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwaWZ1dm86UGlGdVZPID0gbmV3IFBpRnVWTztcclxuICAgICAgICAgICAgdmFyIGNmZzpSb2xlQ0ZHID0gUm9sZUNGRy52ZWNbaV07XHJcbiAgICAgICAgICAgIHBpZnV2by5yb2xlQ0ZHID0gY2ZnO1xyXG4gICAgICAgICAgICB2YXIgZDphbnkgPSBwaWZ1RGF0YVsgY2ZnLmlkIF07XHJcbiAgICAgICAgICAgIGlmKCBkIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gTnVtYmVyKCBkLnN0YXRlICk7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gTnVtYmVyKCBkLmhhc251bSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMDtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5oYXNudW0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBjZmcuZ2V0U3RhdGUgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWZ1QXJyLnB1c2goIHBpZnV2byApO1xyXG4gICAgICAgICAgICB0aGlzLnBpZnVEaWN0WyBwaWZ1dm8ucm9sZUNGRy5pZCBdID0gcGlmdXZvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW52aWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIFNraW5WaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFNraW4oIHBpZnU6UGlGdVZPICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBwaWZ1LnN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5yb2xlVk8ucm9sZWlkID0gcGlmdS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCBwaWZ1LnJvbGVDRkcuZ2V0U3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6Ly/op4bpopHojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOi8v6YeR5biB6LSt5LmwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMucm9sZVZPLkdvbGQgPj0gcGlmdS5yb2xlQ0ZHLm5lZWQgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlVk8ucm9sZWlkID0gcGlmdS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVWTy5Hb2xkIC09IHBpZnUucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWZ1LnN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRza2luQ2FjaGUocGlmdS5yb2xlQ0ZHLmlkLHBpZnUuc3RhdGUscGlmdS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhY2hlRGF0YUV2ZW50KCBHYW1lRXZlbnQudXBkYXRlU0tpblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgV29yZFRpcHNVdGlscy5nZXRJbnN0YW5jZSgpLnNob3dXb3JkVGlwcyggXCLotK3kubDmiJDlip9cIiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkuc2VuZEdvbGRTeW5jKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoXCLph5HluIHkuI3otrNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkc2tpbkNhY2hlKCBpZDphbnksc3RhdGU6bnVtYmVyLGhhc251bTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRhdGFbXCJwaWZ1XCJdW2lkXSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhW1wicGlmdVwiXVtpZF1bXCJzdGF0ZVwiXSA9IHN0YXRlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVkYXRhW1wicGlmdVwiXVtpZF1bXCJoYXNudW1cIl0gPSBoYXNudW07XHJcbiAgICAgICAgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkQ2FjaGVPYmooIFVzZXJDYWNoZVR5cGUuc2tpbix0aGlzLmNhY2hlZGF0YSApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uLy4uLy4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvUm9sZUNGR1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlGdVZPXHJcbntcclxuICAgIHJvbGVDRkc6Um9sZUNGRztcclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrmi6XmnInvvIwx77ya5bey57uP5oul5pyJXHJcbiAgICAgKi9cclxuICAgIHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgaGFzbnVtOm51bWJlciA9IDA7XHJcbiAgICBcclxufSIsImltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHsgV29yZFRpcHNVdGlscyB9IGZyb20gXCIuLi9sb2FkaW5nL3ZpZXcvV29yZFRpcHNVdGlsc1wiO1xyXG5pbXBvcnQgUGxhdGZvcm1FdmVudCBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vZXZlbnRzL1BsYXRmb3JtRXZlbnRcIjtcclxuaW1wb3J0IEJhc2VQcm94eXMgZnJvbSBcIi4uLy4uL2ZyYW1ld29ya3MvbXZjL0Jhc2VQcm94eXNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vLi4vcGxhdGZvcm0vd3htaW5pZ2FtZS9OZXR3b3JrTWFuYWdlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvUHJveHkgZXh0ZW5kcyBCYXNlUHJveHlzXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJVc2VySW5mb1Byb3h5XCI7XHJcblxyXG4gICAgcHVibGljIHVzZXJkYXRhOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS9k+WKm+acgOWkp+S4iumZkFxyXG4gICAgICovXHJcbiAgICB0aWxpTWF4Om51bWJlcjtcclxuICAgIC8qKlxyXG4gICAgICog5L2T5Yqb5oGi5aSN5pe26Ze06Ze06ZqUKOavq+enkilcclxuICAgICAqL1xyXG4gICAgdGlsaWh1aWZ1RGlzVGltZTpudW1iZXI7XHJcblxyXG4gICAgaGFzdGlsaXRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBpc2VudGVyTWFpbkdhbWU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0UHJveHkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kLHRoaXMsdGhpcy5hdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHByaXZhdGUgYXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNlbnRlck1haW5HYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkucGxheWJnU291bmQoIFwiZ2FtZWJnXCIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlVk8uaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvbGVWTy5hZGRMZXZlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ2VHb2xkKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlVk8uR29sZCArPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2VuZEdvbGRTeW5jKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhZ3JzID0gW3sgXCJ0XCI6UGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXJ2ZXJUaW1lLnRvU3RyaW5nKCkgfSx7XCJ2bW9uZXlcIjp0aGlzLnJvbGVWTy5Hb2xkLnRvU3RyaW5nKCl9XTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLph5HluIHlkIzmraXvvJpcIixhZ3JzICk7XHJcbiAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UuSHR0cFBvc3RSZXF1ZXN0KFBST1RPQ09MUy51c2Vyc3luYywgYWdycywgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICB9KSwgbmV3IExheWEuSGFuZGxlcih0aGlzLCAoX2RhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmuLjmiI/nu5PmnpxlcnJcIik7XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lRXZlbnRcclxue1xyXG4gICAgc3RhdGljIHJlbW92ZXNlbGVjdDpzdHJpbmcgPSBcIkdhbWVFdmVudF9yZW1vdmVzZWxlY3RcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc3RhcnRHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X3N0YXJ0R2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBlbmRHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X2VuZEdhbWVcIjtcclxuXHJcbiAgICBzdGF0aWMgbnBjZW5kR2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9ucGNlbmRHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmoLlgZzmuLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHN0b3BHYW1lOnN0cmluZyA9IFwiR2FtZUV2ZW50X3N0b3BHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrlhbPmiJDlip9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpbkdhbWU6c3RyaW5nID0gXCJHYW1lRXZlbnRfd2luR2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCa5YWz5aSx6LSlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmYWlsR2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9mYWlsR2FtZVwiO1xyXG5cclxuICAgIHN0YXRpYyBqdW1wZ2FtZTpzdHJpbmcgPSBcIkdhbWVFdmVudF9qdW1wZ2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Zue5Yiw5Li755WM6Z2iXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXR1cm5NYWluVmlldzpzdHJpbmcgPSBcInJldHVybk1haW5WaWV3XCI7XHJcblxyXG4gICAgc3RhdGljIHVwZGF0ZVNLaW5WaWV3OnN0cmluZyA9IFwiR2FtZUV2ZW50X3VwZGF0ZVNLaW5WaWV3XCI7XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyQ2FjaGVUeXBlXHJcbnsgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHN0YXRpYyBsYXN0RGF5OnN0cmluZyA9IFwibGFzdERheVwiO1xyXG5cclxuICAgIHN0YXRpYyBub3dkYXlTaGFyZTpzdHJpbmcgPSBcImRheXNoYXJlXCI7XHJcblxyXG4gICAgc3RhdGljIG5vd2RheVZpZGVvOnN0cmluZyA9IFwiZGF5dmlkZW9cIjtcclxuICAgIC8qKlxyXG4gICAgICog6K6w5b2V5LiK5qyh56a75byA5pe26Ze0XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBsYXN0dGltZTpzdHJpbmcgPSBcImxhc3R0aW1lXCI7XHJcblxyXG4gICAgXHJcbiAgICBzdGF0aWMgY2FwbGFzdGZsdXNodGltZTpzdHJpbmcgPSBcImNhcHRpbWVcIjtcclxuICAgIHN0YXRpYyBjYXBzdG9yYWdlYXBwaWRzOnN0cmluZyA9IFwiY2FwYXBwaWRzXCI7XHJcbiAgICBzdGF0aWMgaGFzZ2V0YXBwaWRzOnN0cmluZyA9IFwiaGFzZ2V0YXBwaWRzXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop5LoibLkv6Hmga9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJvbGVEYXRhOnN0cmluZyA9IFwicm9sZURhdGFcIjtcclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgc3RhdGljIGdvbGQ6c3RyaW5nID0gXCJnb2xkXCI7XHJcbiAgICBzdGF0aWMgcm9sZWlkOnN0cmluZyA9IFwicm9sZWlkXCI7XHJcbiAgICBzdGF0aWMgbGV2ZWxpZDpzdHJpbmcgPSBcImxldmVsaWRcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOearuiCpFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2tpbjpzdHJpbmcgPSBcInNraW5cIjtcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJJbmZvRXZlbnQgXHJcbntcclxuICAgIHN0YXRpYyBVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YVwiO1xyXG5cclxuICAgIHN0YXRpYyB1c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkXCI7XHJcblxyXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfbGV2ZWxpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfbGV2ZWxpZFwiO1xyXG59IiwiaW1wb3J0IHsgQmFzZVZPIH0gZnJvbSBcIi4uLy4uLy4uL2ZyYW1ld29ya3Mvdm8vQmFzZVZPXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgVXNlckluZm9FdmVudCBmcm9tIFwiLi4vZXZlbnRzL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IENhY2hlTWFuYWdlciBmcm9tIFwiLi4vLi4vLi4vbWFuYWdlcnMvQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCBVc2VyQ2FjaGVUeXBlIGZyb20gXCIuLi9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vLi4vLi4vY29uZmlncy9kYXRhQ29uZmlncy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uLy4uLy4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlVk8gZXh0ZW5kcyBCYXNlVk8gXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTpSb2xlVk87XHJcbiAgICAvKipcclxuICAgICAqIOmHkeW4gVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9Hb2xkOm51bWJlcj0wO1xyXG5cclxuICAgIHByaXZhdGUgX3JvbGVpZDpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHJvbGVDZmc6Um9sZUNGRztcclxuXHJcbiAgICBwcml2YXRlIF9sZXZlaWQ6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsZXZlbGNmZzpMZXZlbENGRztcclxuICAgIHB1YmxpYyBsZXZlbG1hcEFycjpBcnJheTxzdHJpbmc+O1xyXG5cclxuICAgIHByaXZhdGUgX3NlcnZlckxldmVsOm51bWJlciA9IDA7XHJcbiAgICBcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSb2xlVk8ge1xyXG4gICAgICAgIGlmICghUm9sZVZPLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBSb2xlVk8uX2luc3RhbmNlID0gbmV3IFJvbGVWTztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJvbGVWTy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGNhY2hlbWFuYWdlcjpDYWNoZU1hbmFnZXIgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgbm93R29sZDpudW1iZXIgPSBOdW1iZXIoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRVc2VyKEFjY291bnRVc2VyLnZtb25leSkpO1xyXG4gICAgICAgIHRoaXMuR29sZCA9IG5vd0dvbGQ7Ly9jYWNoZW1hbmFnZXIuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLmdvbGQgKTtcclxuICAgICAgICB0aGlzLl9yb2xlaWQgPSBjYWNoZW1hbmFnZXIuZ2V0bnVtKCBVc2VyQ2FjaGVUeXBlLnJvbGVpZCApO1xyXG4gICAgICAgIGlmKCB0aGlzLnJvbGVpZCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZWlkID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb2xlQ0ZHKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX2xldmVpZCA9IGNhY2hlbWFuYWdlci5nZXRudW0oIFVzZXJDYWNoZVR5cGUubGV2ZWxpZCApO1xyXG4gICAgICAgIHRoaXMuX3NlcnZlckxldmVsID0gTnVtYmVyKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0VXNlcihBY2NvdW50VXNlci5zdGFnZSkpO1xyXG4gICAgICAgIC8vIHRoaXMuX3NlcnZlckxldmVsID0gOTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxldmVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3dsZXZlbCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldE5vd1NlcnZlckxldmVsKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlckxldmVsKzE7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTGV2ZWwoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc2VydmVyTGV2ZWwrKztcclxuICAgICAgICB0aGlzLnVwZGF0ZUxldmVsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbHYgPSB0aGlzLl9zZXJ2ZXJMZXZlbCsxO1xyXG4gICAgICAgIHZhciBhbGxudW1zOm51bWJlciA9IExldmVsQ0ZHLnZlYy5sZW5ndGg7XHJcbiAgICAgICAgaWYoIGx2ID4gYWxsbnVtcyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWU6bnVtYmVyID0gKGx2LWFsbG51bXMpJSggYWxsbnVtcy0yICk7XHJcbiAgICAgICAgICAgIGlmKCAgdmFsdWUgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVpZCA9IGFsbG51bXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZSArIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGV2ZWlkID0gbHY7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGV2ZWxjZmcgPSBMZXZlbENGRy5kaWN0WyB0aGlzLl9sZXZlaWQgXTtcclxuICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICB9XHJcblxyXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBmcm9udGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICByaWdodGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHVwY2xpbWI6bnVtYmVyID0gMDtcclxuICAgIHNsaWRlY2xpbWI6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgc2V0Um9sZUNGRygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvbGVDZmcgPSBSb2xlQ0ZHLmRpY3RbIHRoaXMuX3JvbGVpZCBdO1xyXG4gICAgICAgIHRoaXMubW92ZXNwZWVkID0gdGhpcy5yb2xlQ2ZnLnNwZWVkO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueCApO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueSApO1xyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueiApO1xyXG5cclxuICAgICAgICB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueSApO1xyXG4gICAgICAgIHRoaXMubGVmdGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC54ICk7XHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC55ICk7XHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcC56ICk7XHJcblxyXG4gICAgICAgIHRoaXMudXBjbGltYiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnVwY2xpbWIgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iLnggKTtcclxuICAgICAgICB0aGlzLnNsaWRlY2xpbWIueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWIueSApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYi56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldCBsZXZlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgICAgaWYoIHRoaXMuX2xldmVpZCAhPSB2YWx1ZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIHRoaXMuX2xldmVpZCBdO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAvLyAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5sZXZlbGlkLHRoaXMuX2xldmVpZC50b1N0cmluZygpICk7XHJcbiAgICAvLyAgICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgZ2V0IGxldmVpZCgpOm51bWJlclxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIHNldCByb2xlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3JvbGVpZCAhPSB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlaWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSb2xlQ0ZHKCk7XHJcbiAgICAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5yb2xlaWQsdGhpcy5fcm9sZWlkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgcm9sZWlkKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvbGVpZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IEdvbGQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX0dvbGQgIT0gdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fR29sZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUuZ29sZCx0aGlzLl9Hb2xkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LlVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGEgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBHb2xkKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX0dvbGQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IFJlc0RhdGFNYW5hZ2VyIGZyb20gXCIuL1Jlc0RhdGFNYW5hZ2VyXCI7XHJcbmltcG9ydCBQaWZ1SXRlbSBmcm9tIFwiLi4vZ2FtZW1vZHVsZS9za2lucy9QaWZ1SXRlbVwiO1xyXG5pbXBvcnQgQ3BhRG93bnNWaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9DcGFEb3duc1ZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4uL3BsYXRmb3JtL3d4bWluaWdhbWUvV1hTREsvY3BhL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgQmFvS3VhbkdhbWVWaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9CYW9LdWFuR2FtZVZpZXdcIjtcclxuaW1wb3J0IFNoaXdhbnR1aWppYW5WaWV3IGZyb20gXCIuLi9wbGF0Zm9ybS93eG1pbmlnYW1lL1dYU0RLL2NwYS9TaGl3YW50dWlqaWFuVmlld1wiO1xyXG5cclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEJpbmRlck1hbmFnZXIgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZGVyRmFpcnlndWkoKTtcclxuICAgICAgICB0aGlzLmJpbmRlckdDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVp5qGG5p6255qE57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyRmFpcnlndWkoKTogdm9pZCB7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZ2FtZUxvYWRlck1hbmFnZXIgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAvL+eJueaViOe7keWumiggdXJsIOe7keWumue7hOWQje+8jOWPquacieWFrOWFseeJueaViOmcgOimgee7keWumiApIFwidWk6Ly9mcXBneHIxa2w2bXcwXCI6XCJlZmZlY3QxXCJcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lRWZmZWN0RGljdCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog57uE5Lu257uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgYmluZGVyR0NvbXBvbmVudCgpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vbWFpblxyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJwd2xrMWFcIiwgUGlmdUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjdcIiwgQ3BhRG93bnNWaWV3KTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTI4XCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjlcIiwgQmFvS3VhbkdhbWVWaWV3KTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJhXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmJcIiwgU2hpd2FudHVpamlhblZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmNcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmVrc2MyMVwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyZWtzYzIyXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmVcIiwgQ3BhSXRlbSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgUGxhdGZvcm1Ub29sIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0Zm9ybVRvb2xcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgUGxhdGZyb21UeXBlIGZyb20gXCIuLi9wbGF0Zm9ybS9QbGF0ZnJvbVR5cGVcIjtcclxuXHJcbi8qXHJcbiog5pys5Zyw5pWw5o2u57yT5a2Y566h55CG5ZmoXHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhY2hlTWFuYWdlciBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IENhY2hlTWFuYWdlcjtcclxuXHJcbiAgICBwdWJsaWMgZ2FtZURhdGE6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogQ2FjaGVNYW5hZ2VyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBDYWNoZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5pys5Zyw57yT5a2Y5pWw5o2uIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZE9iaihrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZU9iaihrZXksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVPYmooa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRzdHIoa2V5OiBzdHJpbmcsIHZhbHVlOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2FjaGVTdHIoa2V5LCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZG51bSgga2V5OnN0cmluZyx2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldHN0cihrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBudW1iZXJcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRudW0oIGtleTpzdHJpbmcgKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmjIflrprmnKzlnLDnvJPlrZjmlbDmja5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDYWNoZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3Zlc2VsZWN0Q2FjaGUoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuaJgOacieacrOWcsOe8k+WtmOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZENhY2hlT2JqKGtleSwgdmFsdWUpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9iajphbnk7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBvYmogPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBvYmogPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggIW9iaiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvYmogPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkQ2FjaGVTdHIoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVzdHIoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiMFwiO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHN0ciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCBzdHIgPT0gXCJcIikgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3Zlc2VsZWN0Q2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdG9yYWdlV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGNsZWFyQWxsQ2FjaGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVdYKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pys5Zyw5a2Y5YKoXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcpOmFueSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnKzlnLDnvJPlrZjkuK3np7vpmaTmjIflrpoga2V5XHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlU3RvcmFnZVdYKGtleTpzdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnJlbW92ZVN0b3JhZ2Uoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIblrZjlgqjmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZVdYKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBDYWNoZU1hbmFnZXIgZnJvbSBcIi4vQ2FjaGVNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFRpbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9UaW1lVXRpbHNcIjtcclxuaW1wb3J0IFVzZXJDYWNoZVR5cGUgZnJvbSBcIi4uL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJDYWNoZVR5cGVcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9UaW1lc1RhbXBlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF5TWFuYWdlcntcclxuICAgIHB1YmxpYyBzdGF0aWMgaXNOZXdEYXk6Ym9vbGVhbjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOkRheU1hbmFnZXI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkRheU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IERheU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsYXN0ZGF5OnN0cmluZyA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldHN0ciggVXNlckNhY2hlVHlwZS5sYXN0RGF5IClcclxuICAgICAgICB2YXIgbm93ZGF5OnN0cmluZyA9IFRpbWVVdGlscy5mb3JtYXRZZWFyTW9udGhEYXRlMSggVGltZXNUYW1wZXIuZ2V0SW5zdGFuY2UoKS5zZXJ2ZXJUaW1lICk7XHJcbiAgICAgICAgaWYoIGxhc3RkYXkgIT0gbm93ZGF5IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckNhY2hlVHlwZS5sYXN0RGF5LG5vd2RheSApO1xyXG4gICAgICAgICAgICBEYXlNYW5hZ2VyLmlzTmV3RGF5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGF5TWFuYWdlci5pc05ld0RheSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgTGF5ZXJOb3RpZnkgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ub3RpZmljYXRpb24vTGF5ZXJOb3RpZnlcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEdhbWVMYXllck1hbmFnZXIgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6R2FtZUxheWVyTWFuYWdlcjtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/lsYIoIOaIluiAhTNE5Zy65pmv5bGCIClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2tncm91bmQ6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxglxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVpTGF5ZXI6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcbiAgICBcclxuICAgICAvKipcclxuICAgICAgKiDmnIDlrprlsYJcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyB0b3BMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOkdhbWVMYXllck1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IEdhbWVMYXllck1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW5bGC57qnXHJcblx0cHVibGljIGluaXRsYXllcigpOnZvaWRcclxuXHR7XHJcblx0XHRHbG9iYWwuc3RhZ2UuYWRkQ2hpbGQoIGZhaXJ5Z3VpLkdSb290Lmluc3QuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMuYmFja2dyb3VuZCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudWlMYXllciApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudG9wTGF5ZXIgKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfdWlsYXllclpvcmRlcjpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfdXB1aWxheWVyWm9yZGVyOm51bWJlciA9IDIwMDtcclxuICAgIHByaXZhdGUgX3RpcHNsYXllclpvcmRlcjpudW1iZXIgPSAxMDAwO1xyXG4gICAgcHJpdmF0ZSBfZ3VpZGVsYXllclpvcmRlcjpudW1iZXIgPSA2MDA7XHJcblxyXG4gICAgcHVibGljIGFkZHRvTGF5ZXIoIGl0ZW12aWV3OmZhaXJ5Z3VpLkdPYmplY3QsbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX0JBQ0tHUk9VTkQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmJhY2tncm91bmQuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobGF5ZXIgPT0gTGF5ZXJOb3RpZnkuTEFZRVJfVUlMQVlFUilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgPSB0aGlzLl91aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXllck5vdGlmeS5MQVlFUl9VUFVJTEFZRVIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fdXB1aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX1RJUFNMQVlFUilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEdhbWVMYXllck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS50aXBzTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLl90aXBzbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnVpTGF5ZXIuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl90aXBzbGF5ZXJab3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIGxheWVyID09IExheWVyTm90aWZ5LkxBWUVSX0dVSURFTEFZRVIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3VpZGVsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkudWlMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl9ndWlkZWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlZm9ybUxheWVyKCBsYXllcjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBsYXllciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIExheWVyTm90aWZ5LkxBWUVSX1VJTEFZRVI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdWlsYXllclpvcmRlciA8IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMYXllck5vdGlmeS5MQVlFUl9VUFVJTEFZRVI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXItLTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl91cHVpbGF5ZXJab3JkZXIgPCAyMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlciA9IDIwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5ZXJOb3RpZnkuTEFZRVJfVElQU0xBWUVSOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdGlwc2xheWVyWm9yZGVyIDwgMTAwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gMTAwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5ZXJOb3RpZnkuTEFZRVJfR1VJREVMQVlFUjpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDYwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gNjAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgUmVzb3VyY2VNYW5hZ2VyIGZyb20gXCIuL1Jlc291cmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCBDYWNoZVZPIGZyb20gXCIuLi9mcmFtZXdvcmtzL3ZvL0NhY2hlVk9cIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9tdmMvT2JqZWN0UG9vbFwiO1xyXG5pbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ3MvZ2FtZUNvbmZpZ3MvUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuLypcclxuKiDotYTmupDnrqHnkIblmag7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc0RhdGFNYW5hZ2VyIGltcGxlbWVudHMgSVRpbWVyXHJcbntcclxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6UmVzRGF0YU1hbmFnZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1cmzotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2V1cmxQb29sOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWMhei1hOa6kOaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9wa2dQb29sOmFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4jee8k+WtmOeahOWMheaVsOaNru+8iCDpooTpmLLnlYzpnaLkuIrnmoTnirbmgIHorr7nva7plJnor68g77yJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbm9jYWNoZURpY3Q6YW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6LaF6L+HWOWIhumSn+acquiiq+W8leeUqOeahOi1hOa6kO+8jOa4heeQhuaOiVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jbGVhclRpbWU6bnVtYmVyID0gNjAwMDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfZGlzVXBkYXRlVGltZTpudW1iZXIgPSAzMDAwMDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5hc3RhbmNlKCk6UmVzRGF0YU1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggbnVsbCA9PSB0aGlzLmluc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgUmVzRGF0YU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgT2JqZWN0UG9vbC5yZWdpc3RlciggQ2FjaGVWTy5wb29sa2V5LENhY2hlVk8gKTtcclxuICAgICAgICB0aGlzLl9yZXNvdXJjZXVybFBvb2wgPSB7fTtcclxuICAgICAgICB0aGlzLl9wa2dQb29sID0ge307XHJcbiAgICAgICAgdGhpcy5ub2NhY2hlRGljdCA9IHsgXCJsb2FkaW5nXCI6dHJ1ZSxcIm1haW5cIjp0cnVlLFwidWljb21wb25lbnRcIjp0cnVlfTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuZ2V0SW5hc3RhbmNlKCkuYWRkVXBkYXRlVGFyZ2V0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID4gdGhpcy5fZGlzVXBkYXRlVGltZSApIC8vMeWIhumSn+ajgOafpeS4gOasoVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFJlc291cmNlTWFuYWdlci5pbnN0YW5jZS5ydW5uaW5nICkgLy/lpoLmnpzlvZPliY3lnKjliqDovb3kuK3vvIzlu7bml7Yx56eS5qOA5rWLXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUtPTEwMDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVHcm91cFBvb2woKTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlR3JvdXBQb29sKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBub3dUaW1lOm51bWJlciA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB2YXIgcztcclxuICAgICAgICBpZiggdGhpcy5fcGtnUG9vbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q2FjaGVWTztcclxuICAgICAgICAgICAgZm9yKCBzIGluIHRoaXMuX3BrZ1Bvb2wgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2byA9IHRoaXMuX3BrZ1Bvb2xbc107XHJcbiAgICAgICAgICAgICAgICBpZiggdm8ucmVmIDw9IDAgJiYgKG5vd1RpbWUgLSB2by50aW1lKSA+IHRoaXMuX2NsZWFyVGltZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVQYWNrYWdlKCB2by5wYWNrYWdlTmFtZSx0cnVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckNhY2hlVk8oIHZvLnBhY2thZ2VOYW1lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy/muIXnkIblm77niYfnvJPlrZhcclxuICAgICAgICBpZiggdGhpcy5fcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXVybFBvb2w6YW55ID0gdGhpcy5fcmVzb3VyY2V1cmxQb29sO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlc291cmNldXJsUG9vbFtzXSA8PSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmVzQnlVcmwoIHMsdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkQ2FjaGVWTyggcGtnbmFtZTpzdHJpbmcsaXNDYWNoZTpib29sZWFuICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlICYmICF0aGlzLm5vY2FjaGVEaWN0Lmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNhY2hlVk87XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5fcGtnUG9vbC5oYXNPd25Qcm9wZXJ0eSggcGtnbmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBPYmplY3RQb29sLmdldE9iaiggQ2FjaGVWTy5wb29sa2V5ICk7XHJcbiAgICAgICAgICAgICAgICB2by5wYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wa2dQb29sWyBwa2duYW1lIF0gPSB2bztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gdGhpcy5fcGtnUG9vbFtwa2duYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2by5yZWYrKztcclxuICAgICAgICAgICAgdm8udGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhckNhY2hlVk8oIHBrZ05hbWU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNhY2hlVk8gPSB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF07XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wa2dQb29sWyBwa2dOYW1lIF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoHVp5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2FkZHBhY2thZ2Ug5piv5ZCm5Yib5bu6dWlwYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbmt7vliqDliLDnu4TnvJPlrZjkuK3vvIgg5aaC5p6c5re75Yqg77yM5YiZ5Y+C5LiO5a6a5pe25riF55CG55qE6YC76L6RLOW4uOmpu+i1hOa6kOivt+WLv+iuvue9ruS4unR1cmUg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGR1aVBhY2thZ2UocGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBwa2duYW1lID09IFwibWFpblwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLnVpICsgcGtnbmFtZSxwa2duYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKFBhdGhDb25maWcud3hsb2NhbCArIFBhdGhDb25maWcudWkgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENhY2hlVk8oIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5YyFXHJcbiAgICAgKiBAcGFyYW0gcGF0aCDot6/lvoTvvIgg5LqL5L6L77yacmVzL3VpLyDvvIlcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbmt7vliqAgXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbnvJPlrZhcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFBhY2thZ2UocGF0aDpzdHJpbmcscGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKHBhdGggKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENhY2hlVk8oIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2NsZWFyIOaYr+WQpuW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZeWImeetieW+heWumuaXtuWZqOWIpOaWrea4heeQhu+8jOWmguaenOS4unRydWXliJnlvLrliLbmuIXpmaQg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVQYWNrYWdlKHBrZ25hbWU6c3RyaW5nLGlzY2xlYXI6Ym9vbGVhbiA9IGZhbHNlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHBrZ25hbWUgPT0gXCJcIiB8fCBwa2duYW1lID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggaXNjbGVhciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLmuIXnkIbljIXotYTmupDnvJPlrZjvvJpcIiArIHBrZ25hbWUgKTtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UoIHBrZ25hbWUgKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3BrZ1Bvb2wuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wa2dQb29sW3BrZ25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9wa2dQb29sLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q2FjaGVWTyA9IHRoaXMuX3BrZ1Bvb2xbIHBrZ25hbWUgXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm8ucmVmLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZGVmZmVjdFBhY2thZ2UoIHBrZ25hbWU6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coXCJhZGRlZmZlY3RQYWNrYWdlOlwiICsgcGtnbmFtZSk7XHJcbiAgICAgICAgLy8gZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoUGF0aENvbmZpZy5yZXMgKyBQYXRoQ29uZmlnLmVmZmVjdHMgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIC8vIHRoaXMuYWRkQ2FjaGVWTyggcGtnbmFtZSxpc0NhY2hlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZWVmZmVjdHBhY2thZ2UoIHBrZ25hbWU6c3RyaW5nLGlzY2xlYXI6Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKFwicmVtb3ZlZWZmZWN0cGFja2FnZTpcIiArIHBrZ25hbWUpO1xyXG4gICAgICAgIFJlc0RhdGFNYW5hZ2VyLmdldEluYXN0YW5jZSgpLnJlbW92ZVBhY2thZ2UoIHBrZ25hbWUsaXNjbGVhciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5bey57uP5Yqg6L296L+H55qE5pWw5o2uXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIGlzQ2FjaGUg5piv5ZCm5a2Y5YKo5Zyo57yT5a2Y5rGg5Lit77yM6buY6K6k5Li6dHJ1ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzQnl1cmwoIHVybDpzdHJpbmcsaXNDYWNoZTpib29sZWFuID0gdHJ1ZSApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdID09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZXVybFBvb2xbdXJsXSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTGF5YS5sb2FkZXIuZ2V0UmVzKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbotYTmupDnvJPlrZgodXJsKVxyXG4gICAgICogQHBhcmFtIHVybCDopoHmuIXnkIbnmoTotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSBpc0NsZWFyIOWvueS6jue8k+WtmOaxoOS4reeahOaVsOaNru+8jOW9k+W8leeUqOS4ujDml7bvvIzmmK/lkKbnm7TmjqXlvLrliLbmuIXpmaTvvIgg5aaC5p6c5Li6ZmFsc2Us5YiZ562J5b6F57yT5a2Y5a6a5pe25Yi35paw5pe25YCZ5YaN5Y675Yik5patIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJSZXNCeVVybCggdXJsOnN0cmluZyxpc0NsZWFyOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9yZXNvdXJjZXVybFBvb2wuaGFzT3duUHJvcGVydHkodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc0NsZWFyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coIFwiY2xlYXJSZXNCeVVybDpcIiArIHVybCApO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXNvdXJjZXVybFBvb2xbdXJsXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNldXJsUG9vbFt1cmxdLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG6LWE5rqQ57yT5a2YKEFycmF5KVxyXG4gICAgICogQHBhcmFtIHVybHMg6LWE5rqQ5pWw57uEXHJcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUg5YyF5ZCNXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclJlc0J5QXJyVXJscyggdXJsczpBcnJheTxhbnk+LHBhY2thZ2VOYW1lOnN0cmluZyA9IFwiXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHBhY2thZ2VOYW1lICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLnJlbW92ZVBhY2thZ2UoIHBhY2thZ2VOYW1lICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggdmFyIHMgaW4gdXJscyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyUmVzQnlVcmwoIHVybHNbc10udXJsLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCIvKlxyXG4qIG5hbWU7XHJcbiovXHJcbmltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG5pbXBvcnQgUmVzRGF0YU1hbmFnZXIgZnJvbSBcIi4vUmVzRGF0YU1hbmFnZXJcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5pbXBvcnQgVG9uZ2ppSHR0cHMgZnJvbSBcIi4uL2ZyYW1ld29ya3MvbmV0L1RvbmdqaUh0dHBzXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBSZWNDb25maWdzIGZyb20gXCIuLi9jb25maWdzL2dhbWVDb25maWdzL1JlY0NvbmZpZ3NcIjtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBfY29uZmlnczogQXJyYXk8YW55PjtcclxuICAgIHByaXZhdGUgX29uQ29uZmlnQ29tcGxldGU6IEZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBfb25Db25maWdQcm9ncmVzczogRnVuY3Rpb247IFxyXG4gICAgcHJpdmF0ZSBfb25Db25maWdDb21wbGV0ZVRhcmdldDogYW55O1xyXG4gICAgcHJpdmF0ZSBfZ3JvdXBzOiBhbnk7XHJcbiAgICBwcml2YXRlIF9ncm91cEluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHJ1bm5pbmc6Qm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfbm93TG9hZERhdGE6YW55O1xyXG4gICAgXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZTpSZXNvdXJjZU1hbmFnZXI7XHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblx0fVxyXG5cdFxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSZXNvdXJjZU1hbmFnZXJcclxuXHR7XHJcbiAgICAgICAgaWYodGhpcy5pbnN0YW5jZSA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBSZXNvdXJjZU1hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5fZ3JvdXBzID0ge307XHJcbiAgICAgICAgTGF5YS5sb2FkZXIucmV0cnlOdW0gPSA0O1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5lcnJvcnNNc2doYW5kbGVyKTtcclxuICAgICAgICBMYXlhLmxvYWRlci5vbihcImdhbWVlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5nYW1lZXJyb3JzTXNnaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb25maWdDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCAhPSBudWxsICYmIHRoaXMuX29uQ29uZmlnQ29tcGxldGUgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkNvbmZpZ0NvbXBsZXRlLmNhbGwoIHRoaXMuX29uQ29uZmlnQ29tcGxldGVUYXJnZXQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlcnJvcnNNc2doYW5kbGVyKCBtc2c6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImVycm9yc01zZ2hhbmRsZXJcIixtc2cgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFwibG9hZGZhaWxFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2FtZWVycm9yc01zZ2hhbmRsZXIoIG1zZzpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBcImdhbWVzZXJyb3NFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwKGdyb3VwTmFtZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coZ3JvdXBOYW1lKTtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gUmVjQ29uZmlncy5nZXRJbnN0YW5jZSgpLmdyb3VwZGljdFsgZ3JvdXBOYW1lIF07XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJncm91cFwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veWNleS4qui1hOa6kFxyXG4gICAgICogQHBhcmFtIHVybCDotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSB0eXBlIOi1hOa6kOexu+Wei1xyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyDliqDovb3ov5vluqbkuovku7ZcclxuICAgICAqIEBwYXJhbSBpc1Nob3cg5piv5ZCm5pi+56S65Yqg6L2954q25oCBXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkZXIoIHVybDphbnksIHR5cGU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSBbe3VybDp1cmwsdHlwZTp0eXBlfV07XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJzaW5nbGVcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3mlbDnu4TotYTmupBcclxuICAgICAqIEBwYXJhbSB1cmxzIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkZXJzKCB1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwiYXJyXCI7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6KaB5Yqg6L2955qE5oC75pWw6YePXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvYWROdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5bey57uP5Yqg6L2955qE5pWw6YePXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvYWRlZE51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX3ByZWxvYWROdW06bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jdXQ6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9ub3dMb2FkQXJyOkFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4TvvIzmraTliqDovb3mlrnms5XkvJrljZXkuKrliqDovb3mlbDnu4TlhoXnmoTotYTmupDvvIznlKjkuo7mmL7npLrkuKTkuKrov5vluqbmnaHvvIgg5LiA5Liq5oC76L+b5bqm5p2h77yM5LiA5Liq5Y2V5Liq6LWE5rqQ6L+b5bqm5p2hIO+8iVxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRlckFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGN1dDpudW1iZXIgPSAzKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImxvYWRlckFyclwiO1xyXG4gICAgICAgIGRhdGEuY3V0ID0gY3V0O1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5zdGFydExvYWQxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydExvYWQxKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5ydW5uaW5nICYmIHRoaXMuX2NvbmZpZ3MubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IHRoaXMuX2NvbmZpZ3Muc2hpZnQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbm93TG9hZEFyciA9ICh0aGlzLl9ub3dMb2FkRGF0YS51cmxzIGFzIEFycmF5PGFueT4pLmNvbmNhdCgpLnJldmVyc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZE51bSA9IHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWROdW0gPTA7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWROdW0gPSB0aGlzLl9sb2FkZWROdW07XHJcbiAgICAgICAgICAgIHRoaXMuX2N1dCA9IE51bWJlcih0aGlzLl9ub3dMb2FkRGF0YS5jdXQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTdGFydDEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3RhcnQxKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLnJ1bm5pbmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZEFyciAmJiB0aGlzLl9ub3dMb2FkQXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIG5lZWRBcnI6QXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gdGhpcy5fY3V0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmVlZEFyciA9IHRoaXMuX25vd0xvYWRBcnIuc3BsaWNlKCAwLHRoaXMuX2N1dCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmVlZEFyciA9IHRoaXMuX25vd0xvYWRBcnIuc3BsaWNlKCAwICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fY3V0ID0gbmVlZEFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWROdW0gPSB0aGlzLl9sb2FkZWROdW07XHJcbiAgICAgICAgICAgIHRoaXMub25Mb2FkaW5nQXJyKCAwICk7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXNlVHlwZTpzdHJpbmcgPSB0aGlzLl9ub3dMb2FkRGF0YS5yZXNvdXNlVHlwZTtcclxuICAgICAgICAgICAgaWYocmVzb3VzZVR5cGUgPT0gXCIyRFwifHxyZXNvdXNlVHlwZT09bnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZChuZWVkQXJyLCBIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlQXJyKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZ0FycixudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0TG9hZDEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRpbmdBcnIodmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB2YWx1ZSp0aGlzLl9jdXQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSBNYXRoLmNlaWwoKHRoaXMuX2xvYWRlZE51bSAvIHRoaXMuX2xvYWROdW0gKSoxMDApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MgIT0gbnVsbCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzLmNhbGwoIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LGFsbHZhbHVlLE1hdGguZmxvb3IodmFsdWUqMTAwKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Mb2FkQ29tcGxldGVBcnIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5vbkxvYWRpbmdBcnIoIDEgKTtcclxuICAgICAgICB0aGlzLl9sb2FkZWROdW0gPSB0aGlzLl9wcmVsb2FkTnVtICsgdGhpcy5fY3V0O1xyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCB0aGlzLl9sb2FkZWROdW0gPT0gdGhpcy5fbG9hZE51bSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgJiYgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcywgdGhpcy5sb2FkU3RhcnQxICk7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkU3RhcnQxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkU3RhcnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucnVubmluZyB8fCB0aGlzLl9jb25maWdzLmxlbmd0aCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IHRoaXMuX2NvbmZpZ3NbMF07XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gdGhpcy5fbm93TG9hZERhdGEudXJscztcclxuICAgICAgICB2YXIgaXNTaG93OmJvb2xlYW4gPSB0aGlzLl9ub3dMb2FkRGF0YS5pc1Nob3c7XHJcbiAgICAgICAgaWYoIGlzU2hvdyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJlc291c2VUeXBlOnN0cmluZyA9IHRoaXMuX25vd0xvYWREYXRhLnJlc291c2VUeXBlO1xyXG4gICAgICAgIGlmKCBhcnIgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZihyZXNvdXNlVHlwZSA9PSBcIjJEXCJ8fHJlc291c2VUeXBlPT1udWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKGFycixIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZywgbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShhcnIsSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZSksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmcsIG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Yqg6L296L+b5bqm5L6m5ZCs5ZmoXHJcbiAgICBwcml2YXRlIG9uTG9hZGluZyhwcm9ncmVzczogbnVtYmVyKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvZ3Jlc3MgPSBNYXRoLmNlaWwoIE51bWJlcihwcm9ncmVzcyAqIDEwMCkgKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzICE9IG51bGwgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcy5jYWxsKCB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCxwcm9ncmVzcyApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Mb2FkQ29tcGxldGUoYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgJiYgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYodGhpcy5fbm93TG9hZERhdGEuYXJncyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LHRoaXMuX25vd0xvYWREYXRhLmFyZ3MpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnNoaWZ0KCk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRXJyb3IoZXJyOiBTdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgRGVidWdlci5sb2coXCLliqDovb3lpLHotKU6IFwiICsgZXJyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE5Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcjNEKCB1cmw6YW55LCB0eXBlOmFueSxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE6LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwM0QoZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbClcclxuICAgIHtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyhncm91cE5hbWUpO1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSBSZWNDb25maWdzLmdldEluc3RhbmNlKCkuZ3JvdXBkaWN0WyBncm91cE5hbWUgXTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImdyb3VwXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiM0RcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ5pWw57uE77yM5q2k5Yqg6L295pa55rOV5Lya5Y2V5Liq5Yqg6L295pWw57uE5YaF55qE6LWE5rqQ77yM55So5LqO5pi+56S65Lik5Liq6L+b5bqm5p2h77yIIOS4gOS4quaAu+i/m+W6puadoe+8jOS4gOS4quWNleS4qui1hOa6kOi/m+W6puadoSDvvIlcclxuICAgICAqIEBwYXJhbSB1cmxzIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkZXIzREFycih1cmxzOkFycmF5PGFueT4sIG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzc2hvdzpib29sZWFuID0gZmFsc2UsYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNzaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiM0RcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L2954m55pWIXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIGFyZ3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkRWZmZWN0KCBncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixhcmdzOmFueT1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1cmxzOkFycmF5PGFueT4gPSBSZWNDb25maWdzLmdldEluc3RhbmNlKCkuZ3JvdXBkaWN0WyBncm91cE5hbWUgXTtcclxuICAgICAgICBpZiggdXJscyAmJiB1cmxzLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZCh1cmxzLEhhbmRsZXIuY3JlYXRlKCBvblJlc291cmNlTG9hZFRhcmdldCxSZXNvdXJjZUxvYWRDb21wbGV0ZSxbYXJnc10gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuL0dhbWVMYXllck1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGF0aENvbmZpZyB9IGZyb20gXCIuLi9jb25maWdzL2dhbWVDb25maWdzL1BhdGhDb25maWdcIjtcclxuaW1wb3J0IENhbWVyYXNTY3JpcHQgZnJvbSBcIi4uL2dhbWVtb2R1bGUvbW9kZWxTY3JpcHRzL0NhbWVyYXNTY3JpcHRcIjtcclxuaW1wb3J0IFNjZW5lM2RPYmplY3QgZnJvbSBcIi4uL2dhbWVtb2R1bGUvc2NlbmUzZHMvU2NlbmUzZE9iamVjdFwiO1xyXG5pbXBvcnQgTWFpblJBb2xlU2NyaXB0IGZyb20gXCIuLi9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9NYWluUm9sZVNjcmlwdFwiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IEdhbWVFdmVudCBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvR2FtZUV2ZW50XCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9jb25maWdzL2RhdGFDb25maWdzL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCBVc2VySW5mb1Byb3h5IGZyb20gXCIuLi9nYW1lbW9kdWxlL3VzZXJpbmZvL1VzZXJJbmZvUHJveHlcIjtcclxuaW1wb3J0IE1WQ09iamVjdFBvb2wgZnJvbSBcIi4uL2ZyYW1ld29ya3MvbXZjL01WQ09iamVjdFBvb2xcIjtcclxuaW1wb3J0IFJvbGVWTyBmcm9tIFwiLi4vZ2FtZW1vZHVsZS91c2VyaW5mby92by9Sb2xlVk9cIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9jb25maWdzL2RhdGFDb25maWdzL05wY0NGR1wiO1xyXG5pbXBvcnQgTnBjU2NyaXB0IGZyb20gXCIuLi9nYW1lbW9kdWxlL21vZGVsU2NyaXB0cy9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IFJlc291cmNlTWFuYWdlciBmcm9tIFwiLi9SZXNvdXJjZU1hbmFnZXJcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL2NvbmZpZ3MvZGF0YUNvbmZpZ3MvR2FtZUNGR1wiO1xyXG5pbXBvcnQgUm9sZUFjdGlvbnMgZnJvbSBcIi4uL2dhbWVtb2R1bGUvc2NlbmUzZHMvUm9sZUFjdGlvbnNcIjtcclxuaW1wb3J0IFVzZXJJbmZvRXZlbnQgZnJvbSBcIi4uL2dhbWVtb2R1bGUvdXNlcmluZm8vZXZlbnRzL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgUm9sZXNQb29sIGZyb20gXCIuLi9nYW1lbW9kdWxlL3NjZW5lM2RzL1JvbGVzUG9vbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUzRE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOlNjZW5lM0RNYW5hZ2VyO1xyXG5cclxuICAgIHByaXZhdGUgX2luaXRQb3NZOm51bWJlciA9IDE7XHJcblxyXG4gICAgcHVibGljIGNhbWVyYVNjcmlwdDpDYW1lcmFzU2NyaXB0O1xyXG4gICAgcHVibGljIG1haW5Sb2xlU2NyaXB0Ok1haW5SQW9sZVNjcmlwdDtcclxuXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6U2NlbmUzRE1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMuX2luc3RhbmNlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IFNjZW5lM0RNYW5hZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJhY2tncm91bmRQYXJlbnQ6TGF5YS5TcHJpdGUgPSBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuYmFja2dyb3VuZC5kaXNwbGF5T2JqZWN0O1xyXG5cclxuICAgICAgICB2YXIgc2NlbmViZzpmYWlyeWd1aS5HSW1hZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcInNreVwiICkgYXMgZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgICAgIGJhY2tncm91bmRQYXJlbnQuYWRkQ2hpbGQoIHNjZW5lYmcuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIHNjZW5lYmcuc2V0U2NhbGUoIDIuNSwyLjUgKTtcclxuICAgICAgICBzY2VuZWJnLnkgPSAtMjAwO1xyXG4gICAgICAgIHZhciBzY2VuZWJnMTpmYWlyeWd1aS5HSW1hZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcInNreV9kb3duXCIgKSBhcyBmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgICAgYmFja2dyb3VuZFBhcmVudC5hZGRDaGlsZCggc2NlbmViZzEuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIHNjZW5lYmcxLnNldFNjYWxlKCAyLjUsMi41ICk7XHJcbiAgICAgICAgc2NlbmViZzEueSA9IHNjZW5lYmcueSs3NDA7XHJcblxyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QgPSBiYWNrZ3JvdW5kUGFyZW50LmFkZENoaWxkKG5ldyBMYXlhLlNjZW5lM0QoKSkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5waHlzaWNzU2ltdWxhdGlvbi5jb250aW51b3VzQ29sbGlzaW9uRGV0ZWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy/mt7vliqDnhafnm7jmnLpcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LmNhcm1hID0gKFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA3MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICB0aGlzLmNhbWVyYVNjcmlwdCA9IFNjZW5lM2RPYmplY3QuY2FybWEuYWRkQ29tcG9uZW50KCBDYW1lcmFzU2NyaXB0ICk7XHJcblxyXG4gICAgICAgIFNjZW5lM2RPYmplY3QuY2FybWEuY2xlYXJGbGFnID0gTGF5YS5CYXNlQ2FtZXJhLkNMRUFSRkxBR19ERVBUSE9OTFk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBMYXlhLkxvYWRlci5nZXRSZXMoUGF0aENvbmZpZy5nZXQzRE1vZGVsKFwiRGlyZWN0aW9uYWxMaWdodFwiKSkgYXMgTGF5YS5EaXJlY3Rpb25MaWdodDsvL1NjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZCggZGlyZWN0aW9uTGlnaHQgKTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XHJcblxyXG4gICAgICAgIC8vIHZhciBkaXJlY3Rpb25MaWdodDogTGF5YS5EaXJlY3Rpb25MaWdodCA9IFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LmNvbG9yID0gbmV3IExheWEuVmVjdG9yMygxLDEsMSk7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQuaW50ZW5zaXR5ID0gMC41O1xyXG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LnRyYW5zZm9ybS53b3JsZE1hdHJpeC5zZXRGb3J3YXJkKG5ldyBMYXlhLlZlY3RvcjMoMSwgLTEsIDApKTtcclxuXHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5zdGFydFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKFBhdGhDb25maWcuZ2V0M0RNb2RlbChcInN0YXJ0UGxhbmVcIikpO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5hZGRDaGlsZChTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUpO1xyXG5cclxuICAgICAgICBTY2VuZTNkT2JqZWN0LmVuZFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKFBhdGhDb25maWcuZ2V0M0RNb2RlbChcImVuZFBsYW5lXCIpKTtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QuYWRkQ2hpbGQoU2NlbmUzZE9iamVjdC5lbmRQbGFuZSk7XHJcblxyXG4gICAgICAgIC8vIFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwoXCJkaXN0YW50dmlld1wiKSk7XHJcbiAgICAgICAgLy8gU2NlbmUzZE9iamVjdC5zY2VuZTNELmFkZENoaWxkKFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy/pm77ljJbku6PnoIFcclxuICAgICAgICBTY2VuZTNkT2JqZWN0LnNjZW5lM0QuZW5hYmxlRm9nID0gdHJ1ZTtcclxuICAgICAgICAvL+iuvue9rumbvuWMlueahOminOiJslxyXG4gICAgICAgIHZhciBmb2dBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzJdLnZhbHVlICk7XHJcbiAgICAgICAgaWYoIEdhbWVDRkcuZGljdFs4XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3Vjb2xvcjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCBHYW1lQ0ZHLmRpY3RbOF0udmFsdWUgKTtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5zY2VuZTNELmZvZ0NvbG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIod3Vjb2xvclswXSksTnVtYmVyKHd1Y29sb3JbMV0pLE51bWJlcih3dWNvbG9yWzJdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dDb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMCwwLDAuNik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v6K6+572u6Zu+5YyW55qE6LW35aeL5L2N572u77yM55u45a+55LqO55u45py655qE6Led56a7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFszXS52YWx1ZSApO1xyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dTdGFydCA9IE51bWJlciggdmFsdWVBcnJbMF0gKTtcclxuICAgICAgICAvL+iuvue9rumbvuWMluacgOa1k+WkhOeahOi3neemu+OAglxyXG4gICAgICAgIFNjZW5lM2RPYmplY3Quc2NlbmUzRC5mb2dSYW5nZSA9IE51bWJlciggdmFsdWVBcnJbMV0gKTtcclxuICAgICAgICB0aGlzLnNob3dTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0TGl6aSgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTY2VuZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgdmFyIHVybEFycjpBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuaXNjYW5mb2xsb3cgPSB0cnVlO1xyXG4gICAgICAgIHZhciByb2xlVk86Um9sZVZPID0gKCBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKSBhcyBVc2VySW5mb1Byb3h5ICkucm9sZVZPO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHJvbGVWTy5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggUGF0aENvbmZpZy5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIFBhdGhDb25maWcuZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHJvbGVWTy5sZXZlbGNmZy5ucGM7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgbnBjQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHVybEFyci5pbmRleE9mKCBQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICkgPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggUGF0aENvbmZpZy5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IHVybEFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWQzRGNvbXBsZXRlLG51bGwsdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZDNEY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNYXAoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZU1haW5Sb2xlKCApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTnBjKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5hZGRFdmVudExpc3RlbmVyKCBHYW1lRXZlbnQuc3RhcnRHYW1lLHRoaXMsdGhpcy5zdGFydEdhbWVIYW5kbGVyICk7IFxyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggR2FtZUV2ZW50Lmp1bXBnYW1lLHRoaXMsdGhpcy5qdW1waGFuZGxlciApO1xyXG4gICAgICAgIEV2ZW50VXRpbHMuYWRkRXZlbnRMaXN0ZW5lciggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMudXBkYXRlcm9sZU1vZGVsSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlcm9sZU1vZGVsSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7dXJsOlBhdGhDb25maWcuZ2V0M0RSb2xlTW9kZWwoIHJvbGV2by5yb2xlQ2ZnLm5hbWUgKSB9ICk7XHJcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWRyb2xlY29tcGxldGUsbnVsbCx0cnVlLFBhdGhDb25maWcuZ2V0M0RNb2RlbCggcm9sZXZvLnJvbGVDZmcubmFtZSApICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2Fkcm9sZWNvbXBsZXRlKCB1cmw6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VyaW5mb1Byb3h5OlVzZXJJbmZvUHJveHkgPSBNVkNPYmplY3RQb29sLmdldEluc3RhbmNlKCkuZ2V0UHJveHkoIFVzZXJJbmZvUHJveHkgKTtcclxuICAgICAgICB2YXIgcm9sZXZvOlJvbGVWTyA9IHVzZXJpbmZvUHJveHkucm9sZVZPO1xyXG4gICAgICAgIGlmKCBQYXRoQ29uZmlnLmdldDNETW9kZWwoIHJvbGV2by5yb2xlQ2ZnLm5hbWUgKSA9PSB1cmwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNYWluUm9sZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGp1bXBoYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuY2VzaGl0aWFveXVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydEdhbWVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuc3RhcnRSdW4oKTtcclxuICAgICAgICB2YXIgbnBjZGljdDphbnkgPSBTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnN0YXJ0UnVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlTm93Um9sZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5tYWluUm9sZSAmJiB0aGlzLm1haW5Sb2xlU2NyaXB0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJvbGVzUG9vbC5yZW1vdmVSb2xlKCBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLHRoaXMubWFpblJvbGVTY3JpcHQucmVzb3VzZU5hbWUsdGhpcy5tYWluUm9sZVNjcmlwdCApO1xyXG4gICAgICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0ID0gbnVsbDtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5tYWluUm9sZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8v5Yib5bu65Li76KeSXHJcbiAgICBwcml2YXRlIGNyZWF0ZU1haW5Sb2xlKCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgaXNjcmVhdGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCAhU2NlbmUzZE9iamVjdC5tYWluUm9sZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpc2NyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIFNjZW5lM2RPYmplY3QubWFpblJvbGUubmFtZSAhPSBcInJvbGVfXCIgKyByb2xldm8ucm9sZUNmZy5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVOb3dSb2xlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBpc2NyZWF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKHJvbGV2by5yb2xlQ2ZnLm5hbWUpKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAvLyBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgU2NlbmUzZE9iamVjdC5zY2VuZTNELCBmYWxzZSxuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlID0gUm9sZXNQb29sLmFkZFJvbGVCeU5hbWUoIHJvbGV2by5yb2xlQ2ZnLm5hbWUsTWFpblJBb2xlU2NyaXB0LFNjZW5lM2RPYmplY3Quc2NlbmUzRCApO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLm5hbWUgPSBcInJvbGVfXCIgKyByb2xldm8ucm9sZUNmZy5uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0ID0gU2NlbmUzZE9iamVjdC5tYWluUm9sZS5nZXRDb21wb25lbnQoIE1haW5SQW9sZVNjcmlwdCApO1xyXG4gICAgICAgICAgICAvLyB0aGlzLm1haW5Sb2xlU2NyaXB0LnJlc291c2VOYW1lID0gcm9sZXZvLnJvbGVDZmcubmFtZTtcclxuICAgICAgICAgICAgLy8gaWYoICApXHJcbiAgICAgICAgICAgIC8vIHRoaXMubWFpblJvbGVTY3JpcHQgPSBTY2VuZTNkT2JqZWN0Lm1haW5Sb2xlLmFkZENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW5mbzphbnkgPSByb2xldm8ubGV2ZWxjZmcucm9sZWluaXRwb3M7XHJcbiAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihpbmZvLm9mZnNldFBvcyk7XHJcbiAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgIHZhciBwb3NWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuICAgICAgICBpZiggaW5mby5pbml0YnVpbGQgPT0gXCJzdGFydFBsYW5lXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnggKyBvZmZzZXRQb3MueDtcclxuICAgICAgICAgICAgcG9zVmVjLnkgPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgcG9zVmVjLnogPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUuZ2V0Q2hpbGRCeU5hbWUoIFwiY2hpbGRfcG9zXCIgKSBhcyBMYXlhLlNwcml0ZTNEICkudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gU2NlbmUzZE9iamVjdC5nZXRQb3NWZWNieVNjZW5lKCByb2xldm8ubGV2ZWxtYXBBcnJbMF0saW5mby5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBjaGlsZHBvcy54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgIHBvc1ZlYy55ID0gY2hpbGRwb3MueSArIG9mZnNldFBvcy55O1xyXG4gICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gY2hpbGRwb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFNjZW5lM2RPYmplY3QubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zVmVjO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0LmluaXRQb3MoU2NlbmUzZE9iamVjdC5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMubWFpblJvbGVTY3JpcHQuc2V0bm93U2VsZWN0VmVjKCBzZWxlY3RWZWMgKTtcclxuICAgICAgICB0aGlzLm1haW5Sb2xlU2NyaXB0Lm5vd1N0YXRlID0gUm9sZUFjdGlvbnMuc3RhbmQ7XHJcbiAgICAgICAgdGhpcy5tYWluUm9sZVNjcmlwdC5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVBbGxOcGMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gU2NlbmUzZE9iamVjdC5ucGNEaWN0O1xyXG4gICAgICAgIHZhciBzO1xyXG4gICAgICAgIGZvciggcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLk1lc2hTcHJpdGUzRCA9IG5wY2RpY3Rbc107XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gU2NlbmUzZE9iamVjdC5ucGNzY3JpcHREaWN0W3NdO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VzZW5hbWU6c3RyaW5nID0gbnBjc2NyaXB0LnJlc291c2VOYW1lO1xyXG4gICAgICAgICAgICBSb2xlc1Bvb2wucmVtb3ZlUm9sZSggc3AscmVzb3VzZW5hbWUsbnBjc2NyaXB0KTtcclxuICAgICAgICAgICAgZGVsZXRlIFNjZW5lM2RPYmplY3QubnBjc2NyaXB0RGljdFtzXTtcclxuICAgICAgICAgICAgZGVsZXRlIG5wY2RpY3Rbc107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvL+WIm+W7um5wY1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVOcGMoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTnBjKCk7XHJcbiAgICAgICAgdmFyIHVzZXJpbmZvUHJveHk6VXNlckluZm9Qcm94eSA9IE1WQ09iamVjdFBvb2wuZ2V0SW5zdGFuY2UoKS5nZXRQcm94eSggVXNlckluZm9Qcm94eSApO1xyXG4gICAgICAgIHZhciByb2xldm86Um9sZVZPID0gdXNlcmluZm9Qcm94eS5yb2xlVk87XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gcm9sZXZvLmxldmVsY2ZnLm5wYztcclxuICAgICAgICB2YXIgY2hpbGRkaWN0OmFueTtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY251bSA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBhcnIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGRkaWN0ID0gYXJyW3NdO1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMyA9IG51bGw7XHJcbiAgICAgICAgICAgIHZhciBucGNjZmc6TnBjQ0ZHID0gTnBjQ0ZHLmRpY3RbIGNoaWxkZGljdC5pZCBdO1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNEUm9sZU1vZGVsKG5wY2NmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihjaGlsZGRpY3Qub2Zmc2V0UG9zKTtcclxuICAgICAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgICAgICB2YXIgcG9zVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICAgICAgICAgIGlmKCBjaGlsZGRpY3Quc2NlbmUgPT0gXCJzdGFydFBsYW5lXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueCA9IFNjZW5lM2RPYmplY3Quc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyAxICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IFNjZW5lM2RPYmplY3Quc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueiArIG9mZnNldFBvcy56O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBTY2VuZTNkT2JqZWN0LnN0YXJ0UGxhbmUuZ2V0Q2hpbGRCeU5hbWUoIFwiY2hpbGRfcG9zXCIgKSBhcyBMYXlhLlNwcml0ZTNEICkudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcG9zOkxheWEuVmVjdG9yMyA9IFNjZW5lM2RPYmplY3QuZ2V0UG9zVmVjYnlTY2VuZShjaGlsZGRpY3Quc2NlbmUgLGNoaWxkZGljdC5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBjaGlsZHBvcy55ICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TGF5YS5TcHJpdGUzRCA9IFJvbGVzUG9vbC5hZGRSb2xlQnlOYW1lKCBucGNjZmcubmFtZSxOcGNTY3JpcHQsU2NlbmUzZE9iamVjdC5zY2VuZTNEICk7XHJcbiAgICAgICAgICAgIG5wY3NwLm5hbWUgPSBcIm5wY19cIiArIGluZGV4O1xyXG4gICAgICAgICAgICBucGNzcC50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NWZWM7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjc3AuZ2V0Q29tcG9uZW50KCBOcGNTY3JpcHQgKTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnNldG5vd1NlbGVjdFZlYyggc2VsZWN0VmVjICk7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRucGNDRkcoIG5wY2NmZyApO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY0RpY3RbIG5wY3NwLm5hbWUgXSA9IG5wY3NwO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0Lm5wY3NjcmlwdERpY3RbbnBjc3AubmFtZV0gPSBucGNzY3JpcHQ7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRBY3Rpb24oIFJvbGVBY3Rpb25zLnN0YW5kICk7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVNYXAoICApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXNlcmluZm9Qcm94eTpVc2VySW5mb1Byb3h5ID0gTVZDT2JqZWN0UG9vbC5nZXRJbnN0YW5jZSgpLmdldFByb3h5KCBVc2VySW5mb1Byb3h5ICk7XHJcbiAgICAgICAgdmFyIHJvbGV2bzpSb2xlVk8gPSB1c2VyaW5mb1Byb3h5LnJvbGVWTztcclxuICAgICAgICB2YXIgbm93bGV2ZWxjZmc6TGV2ZWxDRkcgPSByb2xldm8ubGV2ZWxjZmc7XHJcbiAgICAgICAgdmFyIG1hcEFycjpBcnJheTxzdHJpbmc+ID0gcm9sZXZvLmxldmVsbWFwQXJyO1xyXG4gICAgICAgIHZhciBtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBtYXBuYW1lOnN0cmluZztcclxuICAgICAgICB2YXIgX2xhc3RtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG5cclxuICAgICAgICBmb3IoIHZhciBzIGluIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoU2NlbmUzZE9iamVjdC5ub3dtYXBEaWN0W3NdIGFzIExheWEuTWVzaFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgbWFwQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWFwbmFtZSA9IG1hcEFycltpXTtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdFsgbWFwbmFtZSBdIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QgPSBTY2VuZTNkT2JqZWN0Lm5vd21hcERpY3RbIG1hcG5hbWUgXTtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNELmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhQYXRoQ29uZmlnLmdldDNETW9kZWwobWFwbmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AsIFNjZW5lM2RPYmplY3Quc2NlbmUzRCwgZmFsc2UsbnVsbCkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3Qubm93bWFwRGljdFsgbWFwbmFtZSBdID0gbWFwU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIGkgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0Fyciggbm93bGV2ZWxjZmcuZmlyc3RTY2VuZXBvcyApO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBhcnJbMF0pLE51bWJlciggYXJyWzFdKSxOdW1iZXIoIGFyclsyXSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zOkxheWEuVmVjdG9yMyA9IChfbGFzdG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueCA9IDA7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueSA9IDA7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRC50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5hZGRQYXR0ZXJuQ2hpbGRQb3MoIG1hcFNwcml0ZTNEICk7XHJcbiAgICAgICAgICAgIF9sYXN0bWFwU3ByaXRlM0QgPSBtYXBTcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIGVuZFBvczE6TGF5YS5WZWN0b3IzID0gKG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgIGVuZFBvczEueiArPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzZdLnZhbHVlKTtcclxuICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5lbmRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3MxO1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaID0gZW5kUG9zMS56O1xyXG4gICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmdhbWV3aW5Qb3NaIC09IDI7XHJcbiAgICAgICAgICAgIC8vIFNjZW5lM2RPYmplY3QuYmdzcHJpdGUzZC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLC0yMCwtNDAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRQYXR0ZXJuQ2hpbGRQb3MoIG1hcFNwcml0ZTNEOkxheWEuU3ByaXRlM0QgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QucGF0dGVybkRpY3RbIG1hcFNwcml0ZTNELm5hbWUgXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxldGUgU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEZWJ1Z2VyLmxvZyggXCLnu5HlrppNYXBQYXR0ZXJuUG9zXCIgKTtcclxuICAgICAgICB2YXIgQmxvY2tzU3ByaXRlOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJCbG9ja3NcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGNoaWRkaWN0OmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBjaGlkc3A6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgYnVpbGRTcDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2FsbF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9hbGxfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2FsbF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9yaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmUzZE9iamVjdC5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFNjZW5lM2RPYmplY3QuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZTNkT2JqZWN0LmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggU2NlbmUzZE9iamVjdC5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lM2RPYmplY3QuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXg9MDtcclxuICAgICAgICB2YXIgUHJvcHM6TGF5YS5TcHJpdGUzRCA9IG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIlByb3BzXCIgKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHdoaWxlKCBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJTY2FmZm9sZGluZ19cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpZHNwID0gUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCApLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4PTA7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJncmlsbGluZ19cIiArIGluZGV4ICkuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgU2NlbmUzZE9iamVjdC5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdID0gY2hpZGRpY3Q7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBQYXRoQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZ3MvZ2FtZUNvbmZpZ3MvUGF0aENvbmZpZ1wiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvdW5kc3NNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOlNvdW5kc3NNYW5hZ2VyO1xyXG4gICAgcHJpdmF0ZSBfaXNiZ09wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9nYW1lc291bmRPcGVuOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfaXNBbGxPcGVuOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfbm93QmdOYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9pc1BsYXliZ2luZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOWjsOmfs+W8gOWFs+W8leeUqOe0ouW8lVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zb3VuZEluZGV4Om51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTpTb3VuZHNzTWFuYWdlclxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5faW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgU291bmRzc01hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLmF1dG9SZWxlYXNlU291bmQgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5hdXRvU3RvcE11c2ljID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdhbWVzb3VuZE9wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9nYW1lc291bmRPcGVuID0gdmFsdWU7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc291bmRNdXRlZCA9ICF2YWx1ZTtcclxuICAgICAgICBpZiggdmFsdWUgPT0gdHJ1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Z+z5pWI5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZ2FtZXNvdW5kT3BlbigpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2FtZXNvdW5kT3BlbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGlzYmdPcGVuKHZhbHVlOmJvb2xlYW4pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNiZ09wZW4gPSB2YWx1ZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5tdXNpY011dGVkID0gIXZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6IOM5pmv6Z+z5LmQ5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNiZ09wZW4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzYmdPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaXNBbGxPcGVuKCB2YWx1ZTpib29sZWFuIClcclxuICAgIHtcclxuICAgICAgICBpZiggdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleC0tO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fc291bmRJbmRleCA8IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighdGhpcy5faXNQbGF5YmdpbmcmJnRoaXMuX3NvdW5kSW5kZXg9PTAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRHYW1lVm9sdW1lKCAxICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXliZ1NvdW5kKCB0aGlzLl9ub3dCZ05hbWUgKTtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9zb3VuZEluZGV4IDwgMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXgrKztcclxuICAgICAgICAgICAgaWYodGhpcy5faXNQbGF5YmdpbmcpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldEdhbWVWb2x1bWUoIDAgKTtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omA5pyJ6Z+z5LmQ5piv5ZCm5byA5ZCvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNBbGxPcGVuKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0FsbE9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7og4zmma/pn7PkuZDpn7Pph49cclxuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgYmdTb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zZXRNdXNpY1ZvbHVtZSggdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJnU291bmRWb2x1bWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5Tb3VuZE1hbmFnZXIubXVzaWNWb2x1bWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7og4zmma/pn7PkuZDpn7Pph49cclxuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc291bmRWb2x1bWUoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc2V0U291bmRWb2x1bWUoIHZhbHVlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzb3VuZFZvbHVtZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZFZvbHVtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruaJgOacieWjsOmfs+mfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEdhbWVWb2x1bWUodmFsdWU6bnVtYmVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5iZ1NvdW5kVm9sdW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zb3VuZFZvbHVtZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pKt5pS+6IOM5pmv6Z+z5LmQXHJcbiAgICAgKiBAcGFyYW0gc291bmROYW1lIOWjsOmfs+WQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGxheWJnU291bmQoIHNvdW5kTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QmdOYW1lID0gc291bmROYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgdGhpcy5fbm93QmdOYW1lICE9IFwiXCIgJiYgdGhpcy5fc291bmRJbmRleDw9IDAgJiYgIXRoaXMuX2lzUGxheWJnaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIFwicGxheWJnU291bmRcIixQYXRoQ29uZmlnLmdldHNvdW5kKCB0aGlzLl9ub3dCZ05hbWUgKSApO1xyXG4gICAgICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5wbGF5TXVzaWMoIFBhdGhDb25maWcuZ2V0c291bmQoIHRoaXMuX25vd0JnTmFtZSApICk7XHJcbiAgICAgICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IDAuNDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLog4zmma/pn7PkuZBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BiZ1NvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcE11c2ljKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYhcclxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg6Z+z5pWI5ZCNXHJcbiAgICAgKiBAcGFyYW0gbG9vcCDmkq3mlL7mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlHYW1lU291bmQoIHNvdW5kTmFtZTpzdHJpbmcsIGxvb3A6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNBbGxPcGVuICYmIHNvdW5kTmFtZSAhPSBcIlwiICYmIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheVNvdW5kKCBQYXRoQ29uZmlnLmdldHNvdW5kKCBzb3VuZE5hbWUgKSxsb29wICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5pKt5pS+6Z+z5pWIXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wR2FtZVNvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnN0b3BBbGxTb3VuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YGc5q2i5omA5pyJ5aOw6Z+zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9wQWxsKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc3RvcEdhbWVTb3VuZCgpO1xyXG4gICAgICAgIHRoaXMuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IExheWVyTm90aWZ5IH0gZnJvbSBcIi4uL2ZyYW1ld29ya3Mvbm90aWZpY2F0aW9uL0xheWVyTm90aWZ5XCI7XHJcbmltcG9ydCB7IEdhbWVMYXllck1hbmFnZXIgfSBmcm9tIFwiLi9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IERlYnVnZXIgZnJvbSBcIi4uL2ZyYW1ld29ya3MvRGVidWdlclwiO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBhdXRob3IgXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVWlNYW5hZ2VyIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBVaU1hbmFnZXI7XHJcbiAgICAvKipcclxuICAgICAqIOW3suazqOWGjOeahFVJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3ZpZXdzOiBhbnk7XHJcblxyXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxyXG5cdHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cdH1cclxuXHRcclxuXHRwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6VWlNYW5hZ2VyXHJcblx0e1xyXG5cdCAgICBpZiggIXRoaXMuaW5zdGFuY2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBVaU1hbmFnZXIoKTsgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xyXG5cdH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl92aWV3cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgIH1cclxuXHRcclxuICAgIC8qKlxyXG4gICAgICogIHZpZXcg6KeG5Zu+5a+56LGh57G7XHJcbiAgICAgKiAgZGF0YSDnu5HlrprmlbDmja4g77yIIGRhdGEg5aaC5p6c5LiN5Li656m677yM5Luj6KGo5p6E6YCg5Ye95pWw5Lyg5Y+CIO+8iVxyXG4gICAgICogIGxheWVyIOWxgue6p1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkKCB2aWV3OmFueSxkYXRhOmFueSA9IG51bGwsbGF5ZXI6IHN0cmluZyA9IExheWVyTm90aWZ5LkxBWUVSX1VJTEFZRVIgKTphbnlcclxuXHR7XHJcbiAgICAgICAgaWYoIHZpZXcua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlldyBoYXZlIG5vIGtleVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX3ZpZXdzW3R5cGVdKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW12aWV3OmZhaXJ5Z3VpLkdDb21wb25lbnQgPSB0aGlzLl92aWV3c1t0eXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW12aWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZDogYW55O1xyXG4gICAgICAgIGlmKGRhdGEgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGQgPSBuZXcgdmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkLnZpZXdLZXkgPSB2aWV3O1xyXG4gICAgICAgIGQuZ2FtZUxheWVyID0gbGF5ZXI7XHJcbiAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHRvTGF5ZXIoIGQsbGF5ZXIgKTtcclxuICAgICAgICB0aGlzLl92aWV3c1t0eXBlXSA9IGQ7XHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcblx0fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreeVjOmdolxyXG4gICAgICogQHBhcmFtIHZpZXcg55WM6Z2iIFxyXG4gICAgICogQHBhcmFtIGlzYmdjbG9zZSDmmK/lkKbmmK/ngrnlh7vog4zmma/lhbPpl63nmoTnirbmgIEgXHJcbiAgICAgKiBAcGFyYW0gaXNwbGF5QW5tbyDmmK/lkKbmkq3mlL7lhbPpl63liqjnlLvvvIgg5Li76KaB55So5LqO5by65Yi25YWz6ZetIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2UoIHZpZXc6IGFueSxpc2JnY2xvc2U6Ym9vbGVhbj1mYWxzZSxpc3BsYXlBbm1vOmJvb2xlYW49dHJ1ZSApOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHZhciBpdGVtOiBCYXNlVmlldyA9IHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG4gICAgICAgIGlmKCFpdGVtKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgR2FtZUxheWVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZWZvcm1MYXllciggaXRlbS5nYW1lTGF5ZXIgKTtcclxuICAgICAgICBpZihpc3BsYXlBbm1vKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5vbkNsb3NlVmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLmRlc3RvcnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3ZpZXdzW3R5cGVdO1xyXG5cdH1cclxuXHJcbiAgICBwdWJsaWMgb25yZXNpemUoIHc6bnVtYmVyLGg6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl92aWV3cyAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtdmlldzpCYXNlVmlldztcclxuICAgICAgICAgICAgZm9yKCB2YXIgaXRlbSBpbiB0aGlzLl92aWV3cyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGl0ZW12aWV3ID0gdGhpcy5fdmlld3NbaXRlbV07XHJcbiAgICAgICAgICAgICAgICBpdGVtdmlldy5zZXRTaXplKCB3LGggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHRcclxuICAgIHB1YmxpYyBnZXRWaWV3KCB2aWV3OiBhbnkgKTphbnlcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3c1t0eXBlXTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IFdYR2FtZVBsYXRmb3JtIGZyb20gXCIuL3d4bWluaWdhbWUvV1hHYW1lUGxhdGZvcm1cIjtcclxuaW1wb3J0IFBsYXRmcm9tVHlwZSBmcm9tIFwiLi9QbGF0ZnJvbVR5cGVcIjtcclxuaW1wb3J0IFBsYXRmb3JtRXZlbnQgZnJvbSBcIi4vZXZlbnRzL1BsYXRmb3JtRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9ldmVudHMvRXZlbnRVdGlsc1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCBUb25namlIdHRwcyBmcm9tIFwiLi4vZnJhbWV3b3Jrcy9uZXQvVG9uZ2ppSHR0cHNcIjtcclxuaW1wb3J0IERheU1hbmFnZXIgZnJvbSBcIi4uL21hbmFnZXJzL0RheU1hbmFnZXJcIjtcclxuaW1wb3J0IFNvdW5kc3NNYW5hZ2VyIGZyb20gXCIuLi9tYW5hZ2Vycy9Tb3VuZHNzTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uL2dhbWVtb2R1bGUvbG9hZGluZy92aWV3L1dvcmRUaXBzVXRpbHNcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi8gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYXRmb3JtVG9vbFxyXG57XHJcbiAgICBwcml2YXRlIF9pc2VuYWJsZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIOaYr+WQpuWQiOinhFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpc2xlZ2FsOm51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFBsYXRmb3JtVG9vbDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFBsYXRmb3JtVG9vbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBQbGF0Zm9ybVRvb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5bmz5Y+wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0UGxhdGZyb20oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cudHQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSAvL+W+ruS/oeWwj+a4uOaIj1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnd4O1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnBjO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pbml0UGxhdGZyb20oKTtcclxuICAgICAgICBEZWJ1Z2VyLmxvZyggR2xvYmFsLm5vd3BsYXRmcm9tICsgXCLlubPlj7DliJ3lp4vljJZcIiApO1xyXG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5pbml0KCk7XHJcbiAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgIC8vICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyB0aGlzLm9uU2hvdyggdGhpcyx0aGlzLnNob3djYWxsYmFjayApO1xyXG4gICAgICAgIC8vIHRoaXMub25IaWRlKHRoaXMsdGhpcy5oaWRlY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGF5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXQoKTtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuaW5pdERhdGEoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQiOi/neinhOWIpOaWrSB0cnVl77ya5ZCI6KeE77yMZmFsc2U66L+d6KeEXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tFbmFibGUoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKFBsYXRmb3JtVG9vbC5pc2xlZ2FsID09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvZ2luY2FsbG9iajphbnk7XHJcbiAgICBwcml2YXRlIF9sb2dpbnN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBsb2dpbiggY2FsbG9iajphbnk9bnVsbCxzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxwcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB0aGlzLl9sb2dpbmNhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5jcmVhdGVVc2VyQW5kTG9naW4odGhpcyx0aGlzLmxvZ2luU3VjY2VlZCx0aGlzLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayx0aGlzLmxvZ2luZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luU3VjY2VlZChudWxsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzc0NhbGxiYWNrKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWQoIGRhdGE6YW55ICk6dm9pZFxyXG4gICAgeyBcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coIFwibG9naW5TdWNjZWVkXCIsZGF0YSApO1xyXG4gICAgICAgIC8vIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgIC8vICAgICAgICAgdmFyIG5vd3RpbWU6bnVtYmVyID0gZGF0YS5Ob3dUaW1lO1xyXG4gICAgICAgIC8vICAgICAgICAgVGltZXNUYW1wZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGVTZXJ2aWNlVGltZShub3d0aW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFBsYXRmb3JtVG9vbC5pc2xlZ2FsID0gTnVtYmVyKGRhdGEuVmVyc2lvbik7XHJcbiAgICAgICAgLy8gICAgICAgICB2YXIgTWVtYmVyOmFueSA9IGRhdGEuTWVtYmVyO1xyXG4gICAgICAgIC8vICAgICAgICAgdmFyIEFwcEluZm86YW55ID0gZGF0YS5BcHBJbmZvO1xyXG4gICAgICAgIC8vICAgICAgICAgdmFyIENsaWVudDI6YW55ID0gQXBwSW5mby5DbGllbnQyO1xyXG4gICAgICAgIC8vICAgICAgICAgR2xvYmFsLkFwcEtleUlEID0gTWVtYmVyLkFwcEtleUlEO1xyXG4gICAgICAgIC8vICAgICAgICAgR2xvYmFsLk1lbWJlcklEID0gTWVtYmVyLk1lbWJlcklEO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uVmlkZW9UaW1lID0gTnVtYmVyKENsaWVudDIuVmlkZW9UaW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlZpZGVvTnVtID0gTnVtYmVyKENsaWVudDIuVmlkZW9OdW0pO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmVUaW1lID0gTnVtYmVyKENsaWVudDIuU2hhcmVUaW1lKTtcclxuICAgICAgICAvLyAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmppbGl3ZWl0aW1lID0gTnVtYmVyKCBDbGllbnQyLlNoYXJlVGltZSApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvID0gTnVtYmVyKCBDbGllbnQyLlNoYXJldG9WaWRlbyApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlID0gTnVtYmVyKCBDbGllbnQyLlZpZGVvdG9TaGFyZSApO1xyXG4gICAgICAgIC8vICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5pbml0U2hhcmVEaWFuKCBDbGllbnQyLlNoYXJlICk7XHJcbiAgICAgICAgLy8gICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIENQQUV2ZW50LkNQQUV2ZW50X2luaXRDUEFEYXRhLGRhdGEgKTtcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVNlcnZpY2VUaW1lKExheWEuQnJvd3Nlci5ub3coKS8xMDAwKTtcclxuICAgICAgICAvLyAgICAgICAgIHZhciBkYXRhczphbnkgPSBKU09OLnBhcnNlKCd7XCJBQ1RJT05cIjo5ODkxMDAxLFwiQUNUSU9OQ09NXCI6MCxcIkpTREFUQVwiOntcIkFwcEluZm9cIjp7XCJDbGllbnRcIjpbe1wiSURcIjpcIjFcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiMlwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9LHtcIklEXCI6XCIzXCIsXCJJc1Nob3dcIjp0cnVlLFwiUGFyYW0xXCI6XCIzMFwiLFwiUGFyYW0yXCI6XCJcIn0se1wiSURcIjpcIjRcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiNVwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9LHtcIklEXCI6XCI2XCIsXCJJc1Nob3dcIjp0cnVlLFwiUGFyYW0xXCI6XCIzMFwiLFwiUGFyYW0yXCI6XCJcIn0se1wiSURcIjpcIjdcIixcIklzU2hvd1wiOnRydWUsXCJQYXJhbTFcIjpcIjMwXCIsXCJQYXJhbTJcIjpcIlwifSx7XCJJRFwiOlwiOFwiLFwiSXNTaG93XCI6dHJ1ZSxcIlBhcmFtMVwiOlwiMzBcIixcIlBhcmFtMlwiOlwiXCJ9XSxcIkNsaWVudDJcIjp7XCJWaWRlb1RpbWVcIjoxMCxcIlZpZGVvTnVtXCI6XCIxMFwiLFwiU2hhcmVUaW1lXCI6NCxcIlNoYXJlXCI6W3tcImtleVwiOlwiZnVodW9cIixcImltZ1wiOlwiYmluZ2R1d2VpamkvZnVodW9meC5wbmdcIixcInRpbGVcIjpcIuadpeW4ruWKqeaIkea2iOeBreeXheavkuWQp++8gVwifV0sXCJqaWxpd2VpdGltZVwiOlwiNjAwXCIsXCJWaWRlb3RvU2hhcmVcIjpcIjFcIixcIlNoYXJldG9WaWRlb1wiOlwiMVwifSxcIlJlTnVtXCI6MTAwLFwiUmVUaW1lXCI6MjU5MjAwfSxcIk1lbWJlclwiOntcIkFwcEtleUlEXCI6MyxcIk1lbWJlcklEXCI6MTAwMDAxLFwiVXNlck5hbWVcIjpcIlwifSxcIk5vd1RpbWVcIjoxNTcyMjUxNTU4LFwiVmVyc2lvblwiOlwiXCJ9fScpO1xyXG4gICAgICAgIC8vICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBDUEFFdmVudC5DUEFFdmVudF9pbml0Q1BBRGF0YSxkYXRhcy5KU0RBVEEgKTtcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICBpZiggdGhpcy5fbG9naW5jYWxsb2JqICYmIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2luc3VjY2VlZGNhbGxiYWNrLmNhbGwoIHRoaXMuX2xvZ2luY2FsbG9iaiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9sb2dpblN1Y2NlZWQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbmZhaWxjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvdyhjYWxsb2JqOiBhbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOiBGdW5jdGlvbj1udWxsLCBmYWlsQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vblNob3coY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrLCBmYWlsQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNob3djYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xyXG4gICAgICAgIExheWEudGltZXIub25jZSggNTAwLHRoaXMsdGhpcy5hZ2FpbnBsYXliZ1NvdW5kICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfb25zaG93ICk7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgICAgICB2YXIgZnJvbXNjZW5lOm51bWJlciA9IFBsYXRmb3JtVG9vbC5mcm9tc2NlbmUoKTtcclxuICAgICAgICBpZiggZnJvbXNjZW5lID09IDEwODkgfHwgZnJvbXNjZW5lID09IDExMzEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZnJvbXNjb3JmayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFnYWlucGxheWJnU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfb25BdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkhpZGUoY2FsbG9iajogYW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazogRnVuY3Rpb249bnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vbkhpZGUoY2FsbG9iaiwgc3VjY2VlZGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGhpZGVjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnNlbmRvbmxpbmVUb25namkoKTtcclxuICAgICAgICBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0b3BBbGwoKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9vbmhpZGUgKTtcclxuICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF9sb3NlZm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjea4uOaIj+aYr+WQpuWcqOaYvuekuuS4rVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzc2hvdygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uaXNTaG93aW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBibyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiG5YyF5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkU3VicGFja2FnZSggdHlwZW5hbWU6c3RyaW5nLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGNhbGxwcm9ncmVzczpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkubG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lLGNhbGxvYmosY2FsbGJhY2ssY2FsbHByb2dyZXNzLGZhaWxjYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaYr+WQpuW3sue7j+aOiOadg1xyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc2FjY3JlZGl0KCBjYWxsb2JqOmFueSxhY2NyZWRpdENhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRhY2NyZWRpdCggY2FsbG9iaixhY2NyZWRpdENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS5xcTpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0YWNjcmVkaXQoIGNhbGxvYmosYWNjcmVkaXRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ou/6KeS6Imy5L+h5oGv5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjcmVhdGVhY2NyZWRpdCggY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5jcmVhdGVVc2VySW5mb0J1dHRvbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb0J1dHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuY2xvc2V1c2VyaW5mb2JVdHRvbigpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgIDlh7rmuLjmiI9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4aXRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5leGl0R2FtZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiZPlvIDlrqLmnI3lr7nor53moYZcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5DdXN0b21lclNlcnZpY2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLm9wZW5DdXN0b21lclNlcnZpY2UoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55+t6ZyH5YqoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNDYW5WaWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBQbGF0Zm9ybVRvb2wuY2hlY2tFbmFibGUoKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICAgICAgYm8gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmlzQ2FuVmlkZW8oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYm87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVBcHAoa2V5OnN0cmluZyxjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuc3RhcnRTaGFyZUFwcCgga2V5LGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZENhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwbGF5VmlkZW8oIGtleTpzdHJpbmcsIGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbj1udWxsLGlzdG9uZ2ppTnVtOmJvb2xlYW4gPSB0cnVlIClcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIC8vIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoXCLmmoLmnKrlvIDmlL5cIik7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnBsYXlWaWRlbygga2V5LGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxDYWxsYmFjayxpc3RvbmdqaU51bSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVCYW5uZXIoYmFubmVydHlwZTpzdHJpbmcsc3R5bGU6YW55PXt4OjAseTowLHNjYWxlOjF9KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJhbm5lciggYmFubmVydHlwZSxzdHlsZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlQmFubmVyKCBiYW5uZXJ0eXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuaGlkZUJhbm5lciggYmFubmVydHlwZSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0xIOS4iuaKpeaVsOaNrjFcclxuICAgICAqIEBwYXJhbSBwYXJhbTIg5LiK5oql5pWw5o2uMlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcmVUb0Nsb3VkKHBhcmFtMTpudW1iZXIscGFyYW0yOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5zdG9yZVRvQ2xvdWQoIHBhcmFtMSxwYXJhbTIgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5vcGVuRnJpZW5kUmFuayggdHlwZSx2aWV3VHlwZSxyZWN0LHBhcmVudCxkYXRhICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnirbmgIHml7blgJnvvIzliIfmjaLmmL7npLrnsbvlnotcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlRnJpZW5kUmFuayggdHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNoYW5nZUZyaWVuZFJhbmsodHlwZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzkuIrkuIDpobVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByZVBhZ2VSYW5rKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5wcmVQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiL5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLm5leHRQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YWz6Zet5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbG9zZUZyaWVuZFJhbmsoIHZpZXdUeXBlOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuY2xvc2VGcmllbmRSYW5rKHZpZXdUeXBlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAwO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGltZSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRheVZpZGVvTnVtcygpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxMDg5Oua3u+WKoOWIsOaIkeeahOWwj+eoi+W6j++8jDExMzE65re75Yqg5Yiw5rWu56qXXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbXNjZW5lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgIHNjZW5lID0gV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZTphbnksaWNvbjpzdHJpbmcgPSBcImdyZWVuXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZSxpY29uICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQbGF0ZnJvbVR5cGVcclxuIHtcclxuICAgIC8qKlxyXG4gICAgICog55S16ISRXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYzpzdHJpbmcgPSBcInBjXCI7XHJcbiAgICAvKipcclxuICAgICAqIOW+ruS/oeWwj+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd3g6c3RyaW5nID0gXCJ3eFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogcXHlsI/muLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHFxOnN0cmluZyA9IFwicXFcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaKlumfs1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdHQ6c3RyaW5nID0gXCJ0dFwiO1xyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1FdmVudCBcclxue1xyXG4gICAgLyoqXHJcbiAgICAgKiDnmbvlvZVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTAwMTpzdHJpbmcgPSBcIjk4OTEwMDFcIjtcclxuICAgIC8qKlxyXG4gICAgICog5bm/5ZGK54K55Ye7XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDI6c3RyaW5nID0gXCI5ODkxMTAyXCI7XHJcbiAgICAvKipcclxuICAgICAqIOeCueWHu+ehruWumui3s+i9rOWIsOWklumDqOa4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMTAzOnN0cmluZyA9IFwiOTg5MTEwM1wiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55So5oi35omT54K5XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTEwMDI6c3RyaW5nID0gXCI5ODkxMDAyXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blkI7lj7DmlbDmja5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMTpzdHJpbmcgPSBcIjk4OTExMDFcIjtcclxuXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9sb2dpblN1Y2NlZWQ6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2xvZ2luU3VjY2VlZFwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ku47lkI7lj7DmgaLlpI3mmL7npLrkuovku7ZcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfb25zaG93OnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF9vbnNob3dcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4uOaIj+i/m+WFpeWQjuWPsOS6i+S7tlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9vbmhpZGU6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X29uaGlkZVwiO1xyXG5cclxuICAgIHN0YXRpYyBQbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmQ6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmRcIjtcclxuXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9sb3NlZm9jdXM6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2xvc2Vmb2N1c1wiO1xyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXM6c3RyaW5nID0gXCJQbGF0Zm9ybUV2ZW50X2dldGZvY3VzXCI7XHJcblxyXG4gICAgc3RhdGljIFBsYXRmb3JtRXZlbnRfdXBkYXRlVmlkZW9OdW1zOnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF91cGRhdGVWaWRlb051bXNcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juaUtuiXj+aIluiAhea1rueql+i/m+WFpea4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgUGxhdGZvcm1FdmVudF9mcm9tc2NvcmZrOnN0cmluZyA9IFwiUGxhdGZvcm1FdmVudF9mcm9tc2NvcmZrXCI7XHJcbn0iLCJleHBvcnQgbW9kdWxlIFJhbmtUeXBle1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5aW95Y+L5o6S6KGM5qacXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBvcGVuZnJpZW5kcmFuazpzdHJpbmcgPSBcIm9wZW5mcmllbmRyYW5rXCI7XHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgY2xvc2VmcmllbmRyYW5rOnN0cmluZyA9IFwiY2xvc2VmcmllbmRyYW5rXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuIvkuIDpobVcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IG5leHRwYWdlOnN0cmluZyA9IFwibmV4dHBhZ2VcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS4iuS4gOmhtVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgcHJlcGFnZTpzdHJpbmcgPSBcInByZXBhZ2VcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOi2hei2iuWlveWPi++8iOaYvuekuuWQjuS4gOWQje+8iVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgY2hhb3l1ZTpzdHJpbmcgPSBcImNoYW95dWVcIjtcclxuICAgIC8qKlxyXG4gICAgICog6LaF6LaK5aW95Y+L77yI5pi+56S65YmN5ZCO5LiA5ZCN77yJXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBjaGFveXVlMTpzdHJpbmcgPSBcImNoYW95dWUxXCI7XHJcbn0iLCJpbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgV2ViR0wgPSBMYXlhLldlYkdMO1xyXG5pbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG5pbXBvcnQgSHR0cFJlcXVlc3QgPSBMYXlhLkh0dHBSZXF1ZXN0O1xyXG5pbXBvcnQgVGV4dCA9IExheWEuVGV4dDtcclxuaW1wb3J0IEJyb3dzZXIgPSBMYXlhLkJyb3dzZXI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE1haW5Db25maWcgfSBmcm9tIFwiLi9NYWluQ29uZmlnXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1dYU0RLL1NoYXJlVXRpbFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uLy4uL0dsb2JhbFwiO1xyXG5cclxuLy8gY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9waXBlbGluZWFwaS54d3hnYW1lLmNvbS9cIjtcclxuY29uc3QgUFJPVE9DT0xfVVJMOnN0cmluZyA9IFwiaHR0cHM6Ly9wYXJrb3VycmFjZWFwaS54d3hnYW1lLmNvbS9cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQUk9UT0NPTFMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9naW5cdFx0XHRcdD0gXCJ1c2VyL2xvZ2luXCI7XHRcdFx0XHQvLyBub3QgdG9rZW5cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdhbWUgICAgICAgICAgICAgICAgID0gXCJnYW1lL3N0YXJ0XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGVuZCAgICAgICAgICAgICAgICAgID0gXCJnYW1lL3BsYXlcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNpZ24gICAgICAgICAgICAgID0gXCJzaWduL3NpZ25cIjtcclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGVybyAgICAgICAgICAgPSBcInRoZW1lL2VxdWlwSGVyb1wiO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIZXJvICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIZXJvXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGF0ICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5SGF0ICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5RGFuY2UgICAgICAgICAgICAgPSBcInRoZW1lL2J1eURhbmNlXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwRGFuY2UgICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcERhbmNlXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBCdXk9XCJ0aGVtZS9idXlcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgRXF1aXA9XCJ0aGVtZS9lcXVpcFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBzaGFyZSAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi9zaGFyZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyB2ZCAgICAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi92ZFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyByZXZpdmFsICAgICAgICAgICAgICA9IFwiZ2FtZS9yZXZpdmFsXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGZpc3Npb24gICAgICAgICAgID0gXCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRoZW1lZmlzc2lvbiAgICAgICAgICA9XCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRyZWFzdXJlICAgICAgID0gXCJ0cmVhc3VyZS9jbGlja1wiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnICAgICAgICAgICAgPSBcImNvbmZpZy90YWJsZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBMb3R0ZXJ5PVwibG90dGVyeS9sb3R0ZXJ5XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEFjaGlldmU9XCJhY2hpZXZlbWVudC9nZXRSZXdhcmRzXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1c2Vyc3luYyA9IFwidXNlci9zeW5jXCI7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6TmV0d29ya01hbmFnZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoTmV0d29ya01hbmFnZXIuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTmV0d29ya01hbmFnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya01hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIE5ldHdvcmtNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24g55m75YWlXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsb2dpbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHB1YmxpYyBsb2dpbihwcm9ncmVzc2NiOkxheWEuSGFuZGxlciwgY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsIGVycm9yY2I6TGF5YS5IYW5kbGVyKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VySW5mb3IgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciB2ZXIgPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcblxyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IGBjb2RlPSR7dXNlckluZm9yLkNvZGV9Jm5pY2tuYW1lPSR7dXNlckluZm9yLk5pY2tOYW1lfSZhdmF0YXI9JHt1c2VySW5mb3IuQXZhdGFyfSZnZW5kZXI9JHt1c2VySW5mb3IuR2VuZGVyfSZjb3VudHJ5PSR7dXNlckluZm9yLkNvdW50cnl9JnByb3ZpbmNlPSR7dXNlckluZm9yLlByb3ZpbmNlfSZjaXR5PSR7dXNlckluZm9yLkNpdHl9JiBkZXZpY2U9JHt1c2VySW5mb3IuRGV2aWNlfSQmc2hhcmVfaWQ9JHt1c2VySW5mb3IuU2hhcmVJZH0mc2NlbmU9JHt1c2VySW5mb3IuU2NlbmV9JnY9JHt2ZXJ9YDtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LlBST0dSRVNTLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcywgW3Byb2dyZXNzY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5vbkxvZ2luUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChQUk9UT0NPTF9VUkwrUFJPVE9DT0xTLkxvZ2luICwgYXJncywgXCJwb3N0XCIsIFwidGV4dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RQcm9ncmVzcyhwcm9ncmVzc2NiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZihwcm9ncmVzc2NiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJIdHRwUmVxdWVzdFByb2dyZXNzOi4uLlwiKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NjYi5ydW4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvZ2luUmVxdWVzdENvbXBsZXRlKGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KVxyXG4gICAge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCLnmbvlvZXmlbDmja7vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICAgICAgbGV0IGRhdGE6IEpTT04gPSBKU09OLnBhcnNlKGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG5cdFx0XHRpZiAoZGF0YVtcImNvZGVcIl0gIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V5byC5bi46ZSZ6K+v77yB6ZSZ6K+v5L+h5oGv77yaXCIsIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJo9IFwiICsgZGF0YVtcImNvZGVcIl0sXCJodHRwUmVxdWVzdC5kYXRcIik7XHJcblx0XHRcdFx0Ly9jb21wbGV0ZWNiLnJ1bldpdGgoZGF0YSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuU2VydmVyVGltZSA9IGRhdGFbXCJ0XCJdO1xyXG4gICAgICAgICAgICBUaW1lc1RhbXBlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVNlcnZpY2VUaW1lKCBOdW1iZXIoZGF0YVtcInRcIl0pICk7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi55m75b2V5q2j5byP5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNldEFjY291bnREYXRhKGRhdGEsY29tcGxldGVjYik7XHJcbiAgICAgICAgICAgIFNoYXJlVXRpbC5TaGFyZU1lc3NhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RFcnJvcihlcnJvcmNiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZiAoZXJyb3JjYiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGVycm9yY2IucnVuV2l0aChodHRwUmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uIFwiICxcImh0dHBSZXF1ZXN0LmRhdFwiKTtcclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOWksei0pS4uLlwiKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoODAwMCx0aGlzLCgpPT57V3hBcGkuSGlkZUxvYWRpbmcoKTt9KVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBlcnJvci4uLlwiICsgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIFxyXG5cclxuICAgIC8qXHJcbiAgICAqIOmAmueUqEh0dHAgUG9zdOWNj+iuruWPkemAgVxyXG4gICAgKiBwcm90b2NvbCBcdFx05a+55bqU4oCcUFJPVE9DT0xT4oCd5a2X5YW45Lit5Y2P6K6u5ZCN56ewXHJcbiAgICAqIGhhc1Rva2VuXHRcdOaYr+WQpuS9v+eUqHRva2Vu77yM55uu5YmN5Y+q5pyJbG9naW7ljY/orq7kuI3pnIDopoF0b2tlbu+8jOWFtuS7lumDvemcgOimgXRva2Vu77yM5omA5Lul5q2k5aSE6Ieq5Yqo57uE5ZCIXHJcbiAgICAqIHBhcmFtXHRcdFx05Y+C5pWw5YiX6KGo77yMa2V55piv5a2X5q615ZCN77yMdmFs5piv5YC877yM5YC86ZyA6KaB5YWI6L2sc3RyaW5nXHJcbiAgICAqIGNvbXBsZXRlY2JcdOWNj+iuruWPkemAgeaIkOWKn+Wbnuiwg+WHveaVsFxyXG4gICAgKiBlcnJvcmNiXHRcdOWNj+iuruWPkemAgeWksei0peWbnuiwg+WHveaVsFxyXG4gICAgKiByZXR1cm5cdFx06L+U5Zue5YC85Li6dm9pZFxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBIdHRwUG9zdFJlcXVlc3QocHJvdG9jb2w6c3RyaW5nLCBwYXJhbTpBcnJheTx7W2tleTpzdHJpbmddOnN0cmluZ30+LCBjb21wbGV0ZWNiOkxheWEuSGFuZGxlciwgZXJyb3JjYjpMYXlhLkhhbmRsZXIsIGhhc1Rva2VuOmJvb2xlYW4gPSB0cnVlKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHVybDpzdHJpbmcgPSBQUk9UT0NPTF9VUkwgKyBwcm90b2NvbDtcclxuICAgICAgICAvLyBjaGVjaGsgYWRkIHRva2VuXHJcbiAgICAgICAgdmFyIGFjY291bnQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciBhY2NvdW50ZGF0YSA9IGFjY291bnQuQ3VyQWNjb3VudERhdGE7XHJcbiAgICAgICAgaWYgKGhhc1Rva2VuID09IHRydWUpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJncyA9IGB0b2tlbj0ke2FjY291bnRkYXRhLm1fdG9rZW59JmA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBXeEFwaS5TaG93TG9hZGluZyhcIui/nuaOpee9kee7nOS4rS4uLlwiKTtcclxuICAgICAgICBpZiAocHJvdG9jb2wgPT0gUFJPVE9DT0xTLmdhbWUgfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLmVuZCB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMuZmlzc2lvbiB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudmR8fFxyXG4gICAgICAgICAgICBwcm90b2NvbD09UFJPVE9DT0xTLnRoZW1lZmlzc2lvbnx8cHJvdG9jb2w9PVBST1RPQ09MUy5Mb3R0ZXJ5IHx8IHByb3RvY29sID09IFBST1RPQ09MUy51c2Vyc3luYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBzdHIgID0gXCJhYmNkZWZnaGlqa2ltbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcclxuICAgICAgICAgICAgbGV0IGNvZGUgPSBcIntcIjtcclxuICAgICAgICAgICAgbGV0IG1hc2sgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hc2sgKz0gc3RyW01hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAxMDApICUgc3RyLmxlbmd0aF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtW2ldKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IGBcXFwiJHtrZXl9XFxcIjpcXFwiJHtwYXJhbVtpXVtrZXldfVxcXCJgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gXCJ9XCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXJncyArPSBcIl9yPVwiICsgbWFzayArIHRoaXMuYmFzZTY0RW5jb2RlKGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbVtpXSkgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsOnN0cmluZyA9IHBhcmFtW2ldW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7a2V5fT0ke3ZhbH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBhcmFtLmxlbmd0aCAtIDEpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IFwiJlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMub25IdHRwUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgZXJyb3JjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcInRleHRcIik7XHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RDb21wbGV0ZShzdWNjZWVkY2I6TGF5YS5IYW5kbGVyLCBmYWlsdXJlY2I6TGF5YS5IYW5kbGVyLCBodHRwUmVxdWVzdDpIdHRwUmVxdWVzdCk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5IaWRlTG9hZGluZygpO1xyXG4gICAgICAgIGxldCBkYXRhOiBKU09OID0gSlNPTi5wYXJzZShodHRwUmVxdWVzdC5kYXRhKTtcclxuICAgICAgICBpZiAoZGF0YVtcImNvZGVcIl0gPT0gMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2V0QWNjb3VudERhdGEoZGF0YSxudWxsKTtcclxuICAgICAgICAgICAgLy9FdmVudE1hbmFnZXIuVHJpZ2dlcihFdmVudFR5cGUuUmVmcmVzaE1vbmVyeSk7XHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkY2IgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIuS4iuS8oOaIkOWKn+Wbnuiwg+aWueazlSBcIiArIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCJyZWNlaXZlOlwiLCBkYXRhICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGZhaWx1cmVjYiAhPSBudWxsKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpbHVyZWNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBjb21wbGV0ZSBlcnJvciwgY29kZTogXCIgKyBkYXRhW1wiY29kZVwiXSArIFwiIG1lc3NhZ2U6IFwiICsgZGF0YVtcIm1lc3NhZ2VcIl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhc2U2NEVuY29kZSAoc3RyKTpzdHJpbmcge1xyXG4gICAgICAgIHZhciBjMSwgYzIsIGMzO1xyXG4gICAgICAgIHZhciBiYXNlNjRFbmNvZGVDaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xyXG4gICAgICAgIHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aCwgc3RyaW5nID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICAgIGMxID0gc3RyLmNoYXJDb2RlQXQoaSsrKSAmIDB4ZmY7XHJcbiAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzEgJiAweDMpIDw8IDQpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9PVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzIgJiAweEYpIDw8IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYzMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMSAmIDB4MykgPDwgNCkgfCAoKGMyICYgMHhGMCkgPj4gNCkpO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMyICYgMHhGKSA8PCAyKSB8ICgoYzMgJiAweEMwKSA+PiA2KSk7XHJcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMzICYgMHgzRilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZztcclxuICAgICAgfVxyXG59IiwiaW1wb3J0IFRvbmdqaUh0dHBzIGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL25ldC9Ub25namlIdHRwc1wiO1xyXG5pbXBvcnQgRGVidWdlciBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9EZWJ1Z2VyXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVIdHRwcyBmcm9tIFwiLi4vLi4vZnJhbWV3b3Jrcy9uZXQvR2FtZUh0dHBzXCI7XHJcbmltcG9ydCBQbGF0Zm9ybUV2ZW50IGZyb20gXCIuLi9ldmVudHMvUGxhdGZvcm1FdmVudFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vLi4vR2xvYmFsXCI7XHJcbmltcG9ydCBEYXlNYW5hZ2VyIGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9EYXlNYW5hZ2VyXCI7XHJcbmltcG9ydCBDYWNoZU1hbmFnZXIgZnJvbSBcIi4uLy4uL21hbmFnZXJzL0NhY2hlTWFuYWdlclwiO1xyXG5pbXBvcnQgVXNlckNhY2hlVHlwZSBmcm9tIFwiLi4vLi4vZ2FtZW1vZHVsZS91c2VyaW5mby9ldmVudHMvVXNlckNhY2hlVHlwZVwiO1xyXG5pbXBvcnQgeyBXb3JkVGlwc1V0aWxzIH0gZnJvbSBcIi4uLy4uL2dhbWVtb2R1bGUvbG9hZGluZy92aWV3L1dvcmRUaXBzVXRpbHNcIjtcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gXCIuLi8uLi9mcmFtZXdvcmtzL2V2ZW50cy9FdmVudFV0aWxzXCI7XHJcbmltcG9ydCBTb3VuZHNzTWFuYWdlciBmcm9tIFwiLi4vLi4vbWFuYWdlcnMvU291bmRzc01hbmFnZXJcIjtcclxuaW1wb3J0IHsgUmFua1R5cGUgfSBmcm9tIFwiLi4vdHlwZXMvUmFua1R5cGVcIjtcclxuaW1wb3J0IHsgR2FtZUxheWVyTWFuYWdlciB9IGZyb20gXCIuLi8uLi9tYW5hZ2Vycy9HYW1lTGF5ZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBQbGF0Zm9ybVRvb2wgZnJvbSBcIi4uL1BsYXRmb3JtVG9vbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXWEdhbWVQbGF0Zm9ybVxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6V1hHYW1lUGxhdGZvcm07XHJcblxyXG4gICAgc3RhdGljIGNvZGU6c3RyaW5nO1xyXG4gICAgc3RhdGljIG5pY2tOYW1lOnN0cmluZztcclxuICAgIHN0YXRpYyBRdURhb0lEOnN0cmluZyA9IFwiXCI7Ly/lvq7kv6Hlub/lkYpJRFxyXG5cclxuICAgIHN0YXRpYyBpc1Nob3dpbmc6Ym9vbGVhbj10cnVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjojmnYPnirbmgIEgMDrmnKrliKTmlq3vvIwx77ya5bey5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhY2NyZWRpdHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPlpKnliIbkuqvmrKHmlbBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRheVNoYXJlTnVtOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+Wkqeeci+inhumikeasoeaVsFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZGF5VmlkZW9OdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5YiG5Lqr5piv5ZCm5oiQ5Yqf5pe26Ze06Ze06ZqUXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZVRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5q+P5pel5pyA5aSn55yL6KeG6aKR5qyh5pWw77yI5oiQ5Yqf57Sv5Yqg5LiA5qyh77yJXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBWaWRlb051bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHlhrfljbTml7bpl7RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvVGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogOOWlveS9jWNwYeWPr+W8ueWHuuaXtumXtOmXtOmalCjnp5IpXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqaWxpd2VpdGltZTpudW1iZXIgPSAxMDA7XHJcbiAgICAvKipcclxuICAgICAqIOWIhuS6q+WHoOasoeWIh+aNouWIsOinhumikVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU2hhcmV0b1ZpZGVvOm51bWJlciA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop4bpopHlh6DmrKHliIfmjaLliLDliIbkuqtcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvdG9TaGFyZTpudW1iZXIgPSAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiG5Lqr5pWw5o2u5a655ZmoXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZURpY3Q6YW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlKjmiLfmnaXmupBpZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbXNjZW5lOm51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOldYR2FtZVBsYXRmb3JtXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICF0aGlzLl9pbnN0YW5jZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBXWEdhbWVQbGF0Zm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaG93U2hhcmVNZW51KHt3aXRoU2hhcmVUaWNrZXQ6dHJ1ZX0pO1xyXG4gICAgICAgIHRoaXMub25BdWRpb0ludGVycnVwdGlvbkJlZ2luKCk7XHJcbiAgICAgICAgdGhpcy5vbkF1ZGlvSW50ZXJydXB0aW9uRW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRTaGFyZURpYW4oIGRhdGE6QXJyYXk8YW55PiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1kOmFueTtcclxuICAgICAgICAgICAgZm9yKCB2YXIgcyBpbiBkYXRhIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXRlbWQgPSBkYXRhW3NdO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uU2hhcmVEaWN0W2l0ZW1kLmtleV0gPSBpdGVtZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZmlyc3RkOmFueSA9IGRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMub25TaGFyZUFwcE1lc3NhZ2UoZmlyc3RkLnRpbGUsR2xvYmFsLmNkbnVybCArIGZpcnN0ZC5pbWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIERheU1hbmFnZXIuaXNOZXdEYXkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09MDtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09MDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlTaGFyZUluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlWaWRlb0luZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09Q2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0bnVtKFVzZXJDYWNoZVR5cGUubm93ZGF5U2hhcmUpO1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bT1DYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRudW0oVXNlckNhY2hlVHlwZS5ub3dkYXlWaWRlbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIERlYnVnZXIubG9nKCBcImluaXREYXlTaGFyZU51bVwiLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrZjlgqjlvZPlpKnliIbkuqvnmoTkv6Hmga9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZURheVNoYXJlSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubm93ZGF5U2hhcmUsV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0udG9TdHJpbmcoKSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVwZGF0ZURheVNoYXJlSW5mb1wiLFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZURheVZpZGVvSW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRzdHIoIFVzZXJDYWNoZVR5cGUubm93ZGF5VmlkZW8sV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0udG9TdHJpbmcoKSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVwZGF0ZURheVZpZGVvSW5mb1wiLFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZXJpbmZvYnV0dG9uO1xyXG4gICAgc3RhdGljIGxvZ2luQ2FsbG9iajphbnk7XHJcbiAgICBzdGF0aWMgbG9naW5zdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBzdGF0aWMgbG9naW5wcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGNyZWF0ZVVzZXJBbmRMb2dpbiggY2FsbG9iajphbnksc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLHByb2dyZXNzQ2FsbGJhY2s6RnVuY3Rpb24gPW51bGwsIGZhaWxjYWxsYmFjazpGdW5jdGlvbj1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5zdWNjZWVkY2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrID0gcHJvZ3Jlc3NDYWxsYmFjaztcclxuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGxvZ2luX2luZm86YW55ID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgICAgICBpZihsb2dpbl9pbmZvKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcImdldExhdW5jaE9wdGlvbnNTeW5jOlwiLGxvZ2luX2luZm8pO1xyXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID1sb2dpbl9pbmZvLnF1ZXJ5O1xyXG4gICAgICAgICAgICAgICAgaWYocXVlcnkgJiYgcXVlcnkuQ2hhbklEKXtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID0gcXVlcnkuQ2hhbklEO1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCfmnaXmupDivLTlkYrnmoTlub/lkYppZOaYrycgKyBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZWZlcnJlckluZm8gPSBsb2dpbl9pbmZvLnJlZmVycmVySW5mbztcclxuICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID09IFwiXCIgJiYgcmVmZXJyZXJJbmZvICYmIHJlZmVycmVySW5mby5hcHBJZCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCA9IHJlZmVycmVySW5mby5hcHBJZDtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZygn5p2l5rqQ5b6u5L+h5bCP5ri45oiP55qEYXBwaWTmmK8nICsgV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggbG9naW5faW5mby5zY2VuZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lID0gTnVtYmVyKCBsb2dpbl9pbmZvLnNjZW5lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHN5c3RlbXJlcyA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gc3lzdGVtcmVzLlNES1ZlcnNpb247XHJcbiAgICAgICAgICAgIGlmICh3eC5nZXRVcGRhdGVNYW5hZ2VyKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZU1hbmFnZXIgPSB3eC5nZXRVcGRhdGVNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOivt+axguWujOaWsOeJiOacrOS/oeaBr+eahOWbnuiwg1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKFwi5piv5ZCm5pyJ5paw54mI5pys6ZyA6KaB5pu05pawOlwiK3Jlcy5oYXNVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCByZXMuaGFzVXBkYXRlPT10cnVlIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmlrDniYjmnKzlt7Lnu4/lh4blpIflpb3vvIzmmK/lkKbph43lkK/lupTnlKjvvJ8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb25maXJtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDnmoTniYjmnKzlt7Lnu4/kuIvovb3lpb3vvIzosIPnlKggYXBwbHlVcGRhdGUg5bqU55So5paw54mI5pys5bm26YeN5ZCvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmV4aXRHYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZUZhaWxlZChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDniYjmnKzkuIvovb3lpLHotKVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZXhpdEdhbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogJiYgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eHBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJpbmZvY2FsbG9iajphbnk7XHJcbiAgICB1c2VyaW5mb3N1Y2NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgdXNlcmluZm9mYWlsY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgY3JlYXRlVXNlckluZm9CdXR0b24oICBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnVzZXJpbmZvY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb3N1Y2NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb2ZhaWxjYWxsYmFjayA9IGZhaWxjYWxsYmFjaztcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGxldCByZXMgPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIGlmKCByZXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGVidWdlci5sb2coIFwiZ2V0U3lzdGVtSW5mb1N5bmNcIixyZXMgKTtcclxuICAgICAgICAgICAgdmFyIHBvc3g6bnVtYmVyID0gKHJlcy53aW5kb3dXaWR0aC0xNTEpLzI7XHJcbiAgICAgICAgICAgIHZhciBwb3N5Om51bWJlciA9IHJlcy53aW5kb3dIZWlnaHQtMTcyIC0gNDA7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9idXR0b24gPSB3eC5jcmVhdGVVc2VySW5mb0J1dHRvbihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIGltYWdlOid3eGxvY2FsL2xvZ2luLnBuZycsXHJcbiAgICAgICAgICAgICAgICBzdHlsZTpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwb3N4LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcG9zeSxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUxLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNzJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9idXR0b24ub25UYXAoIFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkudXNlcmluZm9CdXR0b25DbGljayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIpOaWreaYr+WQpuW3sue7j+aOiOadg1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0YWNjcmVkaXQoIGNhbGxvYmo6YW55LGFjY3JlZGl0Q2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmFjY3JlZGl0c3RhdGUgPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgICAgICB7ICAgXHJcbiAgICAgICAgICAgICAgICB3eC5nZXRTZXR0aW5nKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKHJlcykgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbWQgPSByZXMuYXV0aFNldHRpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpdGVtZC5oYXNPd25Qcm9wZXJ0eSggXCJzY29wZS51c2VySW5mb1wiICkgJiYgaXRlbWRbXCJzY29wZS51c2VySW5mb1wiXSA9PSB0cnVlICkgLy/lt7Lnu4/mjojmnYPov4dcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosZmFsc2UgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKGFjY3JlZGl0Q2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVzZXJpbmZvQnV0dG9uQ2xpY2soIHJlczphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInVzZXJpbmZvQnV0dG9uQ2xpY2tcIixyZXMgKTtcclxuICAgICAgICBpZiggcmVzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlcnJNc2c6c3RyaW5nID0gcmVzLmVyck1zZztcclxuICAgICAgICAgICAgaWYoIGVyck1zZyA9PSBcImdldFVzZXJJbmZvOm9rXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLlkIzmhI/mjojmnYNcIiApO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmNsb3NldXNlcmluZm9iVXR0b24oKTtcclxuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0uZ2V0VXNlckluZm8oIGZhbHNlLHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqLHd4cGxhdGZvcm0udXNlcmluZm9zdWNjYWxsYmFjayx3eHBsYXRmb3JtLnVzZXJpbmZvZmFpbGNhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCLngrnlh7vmi5Lnu53mjojmnYNcIiApO1xyXG4gICAgICAgICAgICAgICAgaWYoIHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqICYmIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2suY2FsbCggd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb2JVdHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgaWYod3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24ub2ZmVGFwKHd4cGxhdGZvcm0udXNlcmluZm9CdXR0b25DbGljayk7XHJcbiAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uPW51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVc2VySW5mbyggaXNsb2dpbjpib29sZWFuLGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guZ2V0VXNlckluZm8oXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJJbmZvID0gcmVzLnVzZXJJbmZvO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLm5pY2tOYW1lID0gdXNlckluZm8ubmlja05hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIGlzbG9naW4gKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCggY2FsbG9iaixXWEdhbWVQbGF0Zm9ybS5uaWNrTmFtZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOeZu+W9lVxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvZ2luKCBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCByZXMgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcInd4LmxvZ2luOlwiLHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY29kZSA9IHJlcy5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtZDphbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNoYW5JRCA9IFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNvZGUgPSBXWEdhbWVQbGF0Zm9ybS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkFwcElEID0gR2xvYmFsLmFwcGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLlZlcnNpb24gPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgR2FtZUh0dHBzLmdldEluc3RhbmNlKCkuc2VuZEdldCggUGxhdGZvcm1FdmVudC5tZXNzYWdlXzk4OTEwMDEsaXRlbWQsd3hwbGF0Zm9ybSx3eHBsYXRmb3JtLmxvZ2luU3VjY2VlZENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDpmdW5jdGlvbihyZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIuW+ruS/oeeZu+W9leWksei0pe+8jOmHjeaWsOeZu+W9leWQp1wiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbiggY2FsbG9iaixjYWxsYmFjayxmYWlsY2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWRDYWxsYmFjayggZGF0YTphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiAmJiBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjayApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnN1Y2NlZWRjYWxsYmFjay5jYWxsKCBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmosZGF0YSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIF9zdWJjYWxsb2JqOmFueTtcclxuICAgIHB1YmxpYyBfc3ViY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgX3VwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIF9zdWJmYWlsY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbG9hZFN1YnBhY2thZ2UoIG5hbWU6c3RyaW5nLHN1YmNhbGxvYmo6YW55LHN1YmNhbGxiYWNrOkZ1bmN0aW9uLHVwZGF0ZWNhbGxiYWNrOkZ1bmN0aW9uLHN1YmZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zdWJjYWxsb2JqID0gc3ViY2FsbG9iajtcclxuICAgICAgICAgICAgdGhpcy5fc3ViY2FsbGJhY2sgPSBzdWJjYWxsYmFjaztcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2sgPSB1cGRhdGVjYWxsYmFjaztcclxuICAgICAgICAgICAgdGhpcy5fc3ViZmFpbGNhbGxiYWNrID0gc3ViZmFpbGNhbGxiYWNrO1xyXG4gICAgICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICAgICAgaWYoIHd4LmxvYWRTdWJwYWNrYWdlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFRhc2sgPSB3eC5sb2FkU3VicGFja2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDliIbljIXliqDovb3miJDlip/lkI7pgJrov4cgc3VjY2VzcyDlm57osINcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdlci5sb2coXCLliIbljIXliqDovb3miJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veWksei0pemAmui/hyBmYWlsIOWbnuiwg1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0uX3N1YmZhaWxjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pOyAgXHJcbiAgICAgICAgICAgICAgICBpZihsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKXtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkVGFzay5vblByb2dyZXNzVXBkYXRlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fdXBkYXRlY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fdXBkYXRlY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmoscmVzLnByb2dyZXNzICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdlci5sb2coJ+S4i+i9vei/m+W6picsIHJlcy5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCflt7Lnu4/kuIvovb3nmoTmlbDmja7plb/luqYnLCByZXMudG90YWxCeXRlc1dyaXR0ZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZygn6aKE5pyf6ZyA6KaB5LiL6L2955qE5pWw5o2u5oC76ZW/5bqmJywgcmVzLnRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggc3ViY2FsbG9iaiAmJiBzdWJjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBzdWJjYWxsb2JqICYmIHN1YmNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W6L2s5Y+R6K+m57uG5L+h5oGvXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYXJlSW5mbyggb2JqOmFueSxjYWxsb2JqOmFueSwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKFwic2hhcmVUaWNrZXQ6XCIsb2JqLnNoYXJlVGlja2V0KTtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTaGFyZUluZm8oe1xyXG4gICAgICAgICAgICAgICAgc2hhcmVUaWNrZXQ6b2JqLnNoYXJlVGlja2V0LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcylcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBEZWJ1Z2VyLmxvZyhcIuaIkOWKn++8mlwiLHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs55So5oi354K55Ye75Y+z5LiK6KeS6I+c5Y2V55qE4oCc6L2s5Y+R4oCd5oyJ6ZKu5pe26Kem5Y+R55qE5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgXHJcbiAgICAgKiBAcGFyYW0gaW1hZ2VVcmwgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNoYXJlQXBwTWVzc2FnZSggdGl0bGU6c3RyaW5nLGltYWdlVXJsOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hhcmVBcHBNZXNzYWdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6dGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6aW1hZ2VVcmxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuLvliqjmi4notbfovazlj5HvvIzov5vlhaXpgInmi6npgJrorq/lvZXnlYzpnaLjgIJcclxuICAgICAqIEBwYXJhbSB0aXRsZSBcclxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNoYXJlQXBwTWVzc2FnZSggZDphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaGFyZUFwcE1lc3NhZ2UoZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65b2T5YmN6aG16Z2i55qE6L2s5Y+R5oyJ6ZKuXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1NoYXJlTWVudSggb2JqOmFueSA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6L2s5Y+R5bGe5oCnXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhcmVNZW51KCBvYmo6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnVwZGF0ZVNoYXJlTWVudShvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuW9k+WJjemhtemdoueahOi9rOWPkeaMiemSrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd01lbnUoKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFN0b3JhZ2VTeW5jKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luYyhrZXk6c3RyaW5nKTphbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRVc2VyQ2xvdWRTdG9yYWdlKG9iaixjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5zZXRVc2VyQ2xvdWRTdG9yYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixvYmogKTtcclxuICAgICAgICAgICAgd3guc2V0VXNlckNsb3VkU3RvcmFnZSh7XHJcbiAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBvYmosXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc3VjY2VlZGNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixcIuS4iuS8oOaIkOWKn1wiICk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZhaWxDYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxDYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInNldFVzZXJDbG91ZFN0b3JhZ2VcIixcIuS4iuS8oOWksei0pVwiICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuua2iOaBr+aPkOekuuahhlxyXG4gICAgICogQHBhcmFtIHdvcmQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2FzdCh3b3JkOnN0cmluZyk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiB3b3JkIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkeW8gOaUvuaVsOaNruWfn+WPkemAgea2iOaBr1xyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvc3RNZXNzYWdlKHN0cjpzdHJpbmcsZGF0YTphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERlYnVnZXIubG9nKCBcInBvc3RNZXNzYWdlOlwiLHN0ciApO1xyXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IHd4LmdldE9wZW5EYXRhQ29udGV4dCgpO1xyXG4gICAgICAgICAgICBjb250ZXh0LnBvc3RNZXNzYWdlKHsgYWN0aW9uOiBzdHIsZGF0YTpkYXRhIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+W7uuS4gOS4qiBJbm5lckF1ZGlvQ29udGV4dCDlrp7kvotcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZUlubmVyQXVkaW9Db250ZXh0KCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bns7vnu5/kv6Hmga9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN5c3RlbUluZm9TeW5jKCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpooTop4jlm77niYfvvIzosIPnlKjkuYvlkI7kvJrlnKjmlrDmiZPlvIDnmoTpobXpnaLkuK3lhajlsY/pooTop4jkvKDlhaXnmoTlm77niYfvvIzpooTop4jnmoTov4fnqIvkuK3nlKjmiLflj6/ku6Xov5vooYzkv53lrZjlm77niYfjgIHlj5HpgIHnu5nmnIvlj4vnrYnmk43kvZxcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmV2aWV3SW1hZ2Uob2JqKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnByZXZpZXdJbWFnZShvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOebkeWQrOWwj+a4uOaIj+makOiXj+WIsOWQjuWPsOS6i+S7tuOAgumUgeWxj+OAgeaMiSBIT01FIOmUrumAgOWIsOahjOmdouOAgeaYvuekuuWcqOiBiuWkqemhtumDqOetieaTjeS9nOS8muinpuWPkeatpOS6i+S7tuOAglxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25IaWRlKGNhbGxvYmo6YW55LCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uSGlkZShmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZihzdWNjZWVkY2FsbGJhY2smJmNhbGxvYmopXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoY2FsbG9iaiwgcmVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDov5Tlm57lsI/nqIvluo/lkK/liqjlj4LmlbBcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExhdW5jaE9wdGlvbnNTeW5jKCk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOmakOiXj+a2iOaBr+aPkOekuuahhlxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZGVUb2FzdChvYmopOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmhpZGVUb2FzdChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuaooeaAgeWvueivneahhlxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dNb2RhbChvYmopOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuWtmOWCqOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJTdG9yYWdlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS9v+aJi+acuuWPkeeUn+i+g+efreaXtumXtOeahOaMr+WKqO+8iDE1IG1z77yJXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmlicmF0ZVNob3J0KCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnKzlnLDnvJPlrZjkuK3np7vpmaTmjIflrpoga2V5XHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlU3RvcmFnZShrZXk6c3RyaW5nKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5yZW1vdmVTdG9yYWdlKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oKTp2b2lke1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkJlZ2luKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAvLyBTb3VuZHNzTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXliZ1NvdW5kKFwiYmdtXCIpO1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coIFwib25BdWRpb0ludGVycnVwdGlvbkJlZ2luXCIgKTtcclxuICAgICAgICAgICAgICAgIFNvdW5kc3NNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcEFsbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTp2b2lke1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4ICl7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25BdWRpb0ludGVycnVwdGlvbkVuZChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgRGVidWdlci5sb2coXCJvbkF1ZGlvSW50ZXJydXB0aW9uRW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIoIHd4Z2FtZXBsYXRmb3JtLHd4Z2FtZXBsYXRmb3JtLm9uQXVkaW9FbmRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCA1MDAsd3hnYW1lcGxhdGZvcm0sd3hnYW1lcGxhdGZvcm0ub25BdWRpb0VuZENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25BdWRpb0VuZENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X29uQXVkaW9JbnRlcnJ1cHRpb25FbmQgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAgOWHuua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhpdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guZXhpdE1pbmlQcm9ncmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omT5byA5a6i5pyN5a+56K+d5qGGXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuQ3VzdG9tZXJTZXJ2aWNlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYgKHd4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB3eC5nZXRTeXN0ZW1JbmZvU3luYygpLlNES1ZlcnNpb247XHJcbiAgICAgICAgICAgIGlmKCBHYW1lVXRpbHMuY29tcGFyZVZlcnNpb24odmVyc2lvbiwgJzIuMC4zJykgPj0gMCAmJiB3eC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ29udmVyc2F0aW9uIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd3gub3BlbkN1c3RvbWVyU2VydmljZUNvbnZlcnNhdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd01lc3NhZ2VDYXJkOnRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VJbWc6XCJodHRwczovL3Jlc291cmNlLjUxeW95b3lvLmNvbS9yZXMvd3hzZW5kbWVzc2FnZWltZy9zbWkuanBnXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gQWxlcnRVdGlscy5zaG93V29yZFRpcHMoXCLlvZPliY3lvq7kv6HniYjmnKzkuI3mlK/mjIFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnm5HlkKzlhoXlrZjkuI3otrPlkYroraZcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTWVtb3J5V2FybmluZygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5vbk1lbW9yeVdhcm5pbmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3gub25NZW1vcnlXYXJuaW5nKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCdvbk1lbW9yeVdhcm5pbmdSZWNlaXZlJyk7Ly/mlLbliLDorablkYrvvIzlvLrliLbmuIXnkIbkuI3lv4XopoHnmoTotYTmupBcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRXJyb3IoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggJiYgd3gub25FcnJvciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5vbkVycm9yKGZ1bmN0aW9uKCByZXMgKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKipvbkVycm9yXCIscmVzKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5vd1NoYXJlaW5kZXg6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBub3dzaGFyZU9iajphbnk7XHJcbiAgICBwdWJsaWMgbm93c2hhcmVzdWNjZWVkZnVuOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIG5vd3NoYXJlZmFpbGZ1bjpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3dzaGFyZWluZm86YW55O1xyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVUaW1lOm51bWJlcjtcclxuICAgIHB1YmxpYyBpc1NoYXJlaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHN0YXRpYyBjYWxsYmFja2ZhaWxzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vliIbkuqtcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXJ0U2hhcmVBcHAoa2V5OnN0cmluZyxjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4PTA7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtrZXldIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFRvbmdqaUh0dHBzLmdldEluc3RhbmNlKCkudG9uZ2ppRGF0YSggXCJzaGFyZVwiLGtleSwxICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVBcHAoIFdYR2FtZVBsYXRmb3JtLlNoYXJlRGljdFtrZXldLGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNoYXJlQXBwKGluZm86YW55LGNhbGxvYmo6YW55LCBzdWNjZXNzOiBGdW5jdGlvbixmYWlsQ2FsbGJhY2s6RnVuY3Rpb24pIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVPYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVpbmZvID0gaW5mbztcclxuICAgICAgICB0aGlzLm5vd3NoYXJlc3VjY2VlZGZ1biA9IHN1Y2Nlc3M7XHJcbiAgICAgICAgdGhpcy5ub3dzaGFyZWZhaWxmdW4gPSBmYWlsQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zdGFydFNoYXJlVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB0aGlzLmlzU2hhcmVpbmcgPSB0cnVlO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMDtcclxuICAgICAgICB0aGlzLnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIHRpdGxlOmluZm8udGlsZSxpbWFnZVVybDpHbG9iYWwuY2RudXJsICsgaW5mby5pbWcscXVlcnk6XCJcIixcclxuICAgICAgICAgICAgc3VjY2VzczpmdW5jdGlvbiAocmVzKVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcyl7XHJcbiAgICAgICAgICAgICAgICBXb3JkVGlwc1V0aWxzLmdldEluc3RhbmNlKCkuc2hvd1dvcmRUaXBzKFwi5oKo5Y+W5raI5LqG5YiG5LqrXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxDYWxsYmFjayAmJiBjYWxsb2JqICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbENhbGxiYWNrLmNhbGwoY2FsbG9iaik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAgICAgXHJcblxyXG4gICAgcHVibGljIHNob3dvYmo6YW55O1xyXG4gICAgcHVibGljIHNob3dDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs5bCP5ri45oiP5Zue5Yiw5YmN5Y+w55qE5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TaG93KGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwpIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2hvd29iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3gub25TaG93KGZ1bmN0aW9uIChyZXMpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIm9uU2hvd1wiLHJlcyApO1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlcyAmJiByZXMuc2NlbmUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmZyb21zY2VuZSA9IE51bWJlciggcmVzLnNjZW5lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmZyYW1lT25jZSggMSxXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkub25TaG93U3VjY2VlZCApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvd1N1Y2NlZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0uc2hvd29iaiAmJiB3eGdhbWVwbGF0Zm9ybS5zaG93Q2FsbGJhY2sgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLmlzU2hhcmVpbmcgKSAvL+WmguaenOaYr+WIhuS6q+eKtuaAgVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uaXNTaGFyZWluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YXIgaXNTaGFyZVN1Y2NlZWQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmNhbGxiYWNrZmFpbHN0YXRlPT0wICkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3dUaW1lOm51bWJlciA9TGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpc1RpbWU6bnVtYmVyID0obm93VGltZSAtIHd4Z2FtZXBsYXRmb3JtLnN0YXJ0U2hhcmVUaW1lKS8xMDAwO1xyXG4gICAgICAgICAgICAgICAgaWYoIGRpc1RpbWU+PVdYR2FtZVBsYXRmb3JtLlNoYXJlVGltZSB8fCBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4ID49IDMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzU2hhcmVTdWNjZWVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZT0wO1xyXG4gICAgICAgICAgICBpZiggaXNTaGFyZVN1Y2NlZWQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVpbmZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwic2hhcmVlbmRcIix3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZWluZm8ua2V5LDEgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtKys7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS51cGRhdGVEYXlTaGFyZUluZm8oKTtcclxuICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZU9iaiAmJiB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZXN1Y2NlZWRmdW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlc3VjY2VlZGZ1bi5jYWxsKCB3eGdhbWVwbGF0Zm9ybS5ub3dzaGFyZU9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0uc2hvd01vZGFsKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIuaPkOekulwiLCBjb250ZW50OiBcIuivt+avj+asoeWIhuS6q+WIsOS4jeWQjOe+pCzmmK/lkKbph43mlrDliIbkuqvvvJ9cIiwgc2hvd0NhbmNlbDogdHJ1ZSwgY2FuY2VsVGV4dDogJ+WPlua2iCcsIGNvbmZpcm1UZXh0OiAn56Gu5a6aJyxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLnNoYXJlQXBwKCB3eHBsYXRmb3JtLm5vd3NoYXJlaW5mbyx3eHBsYXRmb3JtLm5vd3NoYXJlT2JqLHd4cGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubm93c2hhcmVmYWlsZnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1biAmJiB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1bi5jYWxsKCB3eHBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAoKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxhc3RWaWRlb1RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgdmlkZW9BZDtcclxuICAgIHB1YmxpYyB2aWRlb2NhbGxvYmo6YW55O1xyXG4gICAgcHVibGljIHZpZGVvc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSB2aWRlb2ZhaWxDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBub3d2aWRlb2tleTpzdHJpbmc7XHJcbiAgICAgLyoqXHJcbiAgICAgKiDop4bpopHmmK/lkKblnKjmkq3mlL7kuK1cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHZpZGVvcGxheWluZzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgc3RhdGljIGlzdG9uZ2ppVmlkZW9OdW06Ym9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHpooblpZblirFcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlWaWRlbygga2V5OnN0cmluZywgY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsaXN0b25namlOdW06Ym9vbGVhbiA9IHRydWUgKVxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4LmNyZWF0ZVJld2FyZGVkVmlkZW9BZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggIVdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB0aW1lOm51bWJlciA9IHRoaXMubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV29yZFRpcHNVdGlscy5nZXRJbnN0YW5jZSgpLnNob3dXb3JkVGlwcyggXCLlub/lkYrlsJrmnKrlh4blpIflpb3vvIzor7dcIisgdGltZSArXCLnp5LlkI7lho3or5VcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2xvc2Vmb2N1cyApO1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uaXN0b25namlWaWRlb051bSA9IGlzdG9uZ2ppTnVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3d2aWRlb2tleSA9IGtleTtcclxuICAgICAgICAgICAgICAgIFRvbmdqaUh0dHBzLmdldEluc3RhbmNlKCkudG9uZ2ppRGF0YSggXCJWaWRlb1wiLGtleSwxICk7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9jYWxsb2JqID0gY2FsbG9iajtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9zdWNjZWVkQ2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvZmFpbENhbGxiYWNrID0gZmFpbENhbGxiYWNrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkID0gd3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkVW5pdElkOidhZHVuaXQtZGUwMDczODhkOGY4NmY3MSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLm9uQ2xvc2UodGhpcy5jbG9zZUFEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5vbkVycm9yKCB0aGlzLm9uZXJybyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHRoaXMudmlkZW9BZC5zaG93KCkpLmNhdGNoKGVyciA9PiB7IGNvbnNvbGUubG9nKGVyci5lcnJNc2cpLFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCkuZmFpbFZpZGVvKCkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9ja1ZpZGVvTGVmdFRpbWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgdGltZTpudW1iZXIgPSAoTGF5YS5Ccm93c2VyLm5vdygpLVdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUpLzEwMDA7IFxyXG4gICAgICAgIHRpbWUgPSBXWEdhbWVQbGF0Zm9ybS5WaWRlb1RpbWUgLSB0aW1lO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwodGltZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgb25lcnJvKHJlcyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmRXJyb3Iod3hnYW1lUGxhdGZvcm0ub25lcnJvKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZDbG9zZSh3eGdhbWVQbGF0Zm9ybS5jbG9zZUFEKTsgLy/np7vpmaQg5LiN54S26KKr5aSa5qyh6LCD55SoXHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlhbPpl63lub/lkYpcclxuICAgIHB1YmxpYyBjbG9zZUFEKHN0YXR1cyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5pc0VuZGVkIHx8IHN0YXR1cyA9PSB1bmRlZmluZWQpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udXBkYXRlRGF5VmlkZW9JbmZvKCk7XHJcbiAgICAgICAgICAgICAgICBFdmVudFV0aWxzLmRpc3BhdGNoRXZlbnQoIFBsYXRmb3JtRXZlbnQuUGxhdGZvcm1FdmVudF91cGRhdGVWaWRlb051bXMgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBUb25namlIdHRwcy5nZXRJbnN0YW5jZSgpLnRvbmdqaURhdGEoIFwiVmlkZW9lbmRcIix3eGdhbWVQbGF0Zm9ybS5ub3d2aWRlb2tleSwxICk7XHJcbiAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9zdWNjZWVkQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb3N1Y2NlZWRDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5pyq6KeC55yL5a6M5pW06KeG6aKR77yM5peg5rOV6I635b6X5aWW5YqxXCIgKTtcclxuICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiAmJiB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjayApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIEV2ZW50VXRpbHMuZGlzcGF0Y2hFdmVudCggUGxhdGZvcm1FdmVudC5QbGF0Zm9ybUV2ZW50X2dldGZvY3VzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bm/5ZGK5aSx6LSlXHJcbiAgICBwdWJsaWMgZmFpbFZpZGVvKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxhc3RWaWRlb1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0udmlkZW9wbGF5aW5nPWZhbHNlO1xyXG4gICAgICAgIFdvcmRUaXBzVXRpbHMuZ2V0SW5zdGFuY2UoKS5zaG93V29yZFRpcHMoIFwi5bm/5ZGK5Yqg6L295aSx6LSlLOivleivleWIq+eahOaWueW8j+WQp35cIiApO1xyXG4gICAgICAgIHZhciB3eGdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLmdldEluc3RhbmNlKCk7XHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICYmIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrICkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBQbGF0Zm9ybUV2ZW50LlBsYXRmb3JtRXZlbnRfZ2V0Zm9jdXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaXNDYW5WaWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPCBXWEdhbWVQbGF0Zm9ybS5WaWRlb051bSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0gPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB2aWRlb2JzOm51bWJlciA9IE1hdGguZmxvb3IoV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0vV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlKTtcclxuICAgICAgICAgICAgdmFyIHNoYXJlYnM6bnVtYmVyID0gTWF0aC5mbG9vcihXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bS9XWEdhbWVQbGF0Zm9ybS5TaGFyZXRvVmlkZW8pO1xyXG4gICAgICAgICAgICBpZiggdmlkZW9icyA+IHNoYXJlYnMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdmlkZW9icyA8IHNoYXJlYnMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3l1c2h1Om51bWJlciA9IFdYR2FtZVBsYXRmb3JtLmRheVZpZGVvTnVtJVdYR2FtZVBsYXRmb3JtLlZpZGVvdG9TaGFyZTtcclxuICAgICAgICAgICAgICAgIGlmKCB2aWRlb3l1c2h1ICE9IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHNoYXJleXVzaHU6bnVtYmVyID0gV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0lV1hHYW1lUGxhdGZvcm0uU2hhcmV0b1ZpZGVvO1xyXG4gICAgICAgICAgICAgICAgaWYoIHNoYXJleXVzaHUgIT0gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyUnVuVGltZTpudW1iZXI9MDtcclxuICAgIHByaXZhdGUgYmFubmVyQWQ7XHJcbiAgICBwdWJsaWMgbm93U3R5cGU6YW55O1xyXG4gICAgcHJpdmF0ZSBfYmFubmVyVHlwZUxpc3Q6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHVibGljIGNyZWF0ZUJhbm5lciggYmFubmVydHlwZTpzdHJpbmc9XCJcIixzdHlsZTphbnkpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggYmFubmVydHlwZSAhPSBcIlwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIGJhbm5lcnR5cGUgPT0gdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0udHlwZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS5zdHlsZSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9iYW5uZXJUeXBlTGlzdC5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5wdXNoKCBhcnJbMF0gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggIWJvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYW5uZXJUeXBlTGlzdC5wdXNoKCB7IHR5cGU6YmFubmVydHlwZSxzdHlsZTpzdHlsZSB9ICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoPT0wIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW06YW55ID0gdGhpcy5fYmFubmVyVHlwZUxpc3RbdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gaXRlbS5zdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBub3cgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgICAgICAgICAvL+i2hei/hzPliIbpkp/liLfmlrBcclxuICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmJhbm5lclJ1blRpbWUgPiA2MDAwMCAqIDMpIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIERlYnVnZXIubG9nKCBcIuWFiOenu+mZpGJhbm5lcizlho3mt7vliqBcIiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub2ZmRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vZmZSZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QmFubmVyKHN0eWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0Jhbm5lcihzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NyZWVud2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGJhbm5lcmhlaWdodDpudW1iZXIgPSAwO1xyXG4gICAgYmFubmVyd2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGlzb25SZXNpemU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTmV3QmFubmVyKHN0eWxlOiBhbnkpIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5jcmVhdGVCYW5uZXJBZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyUnVuVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlbndpZHRoID0gaW5mby5zY3JlZW5XaWR0aDtcclxuICAgICAgICAgICAgdmFyIHNjYWxlOm51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIGlmKCBzdHlsZS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NhbGUgPSBzdHlsZS5zY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkID0gd3guY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6ICdhZHVuaXQtNmVjMjY4OGFkZmFmNWEzNCcsXHJcbiAgICAgICAgICAgICAgICBhZEludGVydmFsczozMCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGluZm8uc2NyZWVuSGVpZ2h0IC0gMTA1LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoICogc2NhbGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9uRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyUmVzaXplKCByZXMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGVidWdlci5sb2coIFwiYmFubmVyUmVzaXplXCIscmVzICk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSBXWEdhbWVQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHNlbGYuYmFubmVyQWQub2ZmUmVzaXplKHNlbGYuYmFubmVyUmVzaXplKTtcclxuICAgICAgICBzZWxmLmlzb25SZXNpemUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbm93c3R5cGU6YW55ID0gc2VsZi5ub3dTdHlwZTtcclxuICAgICAgICBpZiggIW5vd3N0eXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZm8gPSBzZWxmLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xyXG4gICAgICAgIHZhciBwZXJjZW50YWdlVzpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50V2lkdGgvTGF5YS5zdGFnZS5kaXNwbGF5V2lkdGg7XHJcbiAgICAgICAgc2VsZi5iYW5uZXJ3aWR0aCA9IHJlcy53aWR0aDtcclxuICAgICAgICBzZWxmLmJhbm5lcmhlaWdodCA9IHJlcy5oZWlnaHQ7XHJcbiAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gbm93c3R5cGUueCAqIHBlcmNlbnRhZ2VXO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHJlcy53aWR0aCkgKiAwLjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUudG9wID0gbm93c3R5cGUueSAqIHBlcmNlbnRhZ2VIO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHJlcy5oZWlnaHQpIC0gMTU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyRXJyb3IoZXJyOmFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERlYnVnZXIubG9nKGVycik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93QmFubmVyKCBzdHlsZSApIHtcclxuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgICAgICBEZWJ1Z2VyLmxvZyggXCJnZXRTeXN0ZW1JbmZvU3luYzpcIixpbmZvICk7XHJcbiAgICAgICAgICAgIHZhciBub3dzdHlwZTphbnkgPSB0aGlzLm5vd1N0eXBlO1xyXG4gICAgICAgICAgICB2YXIgc2NhbGU6bnVtYmVyID0gMTtcclxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwic2NhbGVcIikgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzY2FsZSA9IG5vd3N0eXBlLnNjYWxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBwZXJjZW50YWdlSDpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0L0xheWEuc3RhZ2UuZGlzcGxheUhlaWdodDtcclxuICAgICAgICAgICAgdmFyIHBlcmNlbnRhZ2VXOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRXaWR0aC9MYXlhLnN0YWdlLmRpc3BsYXlXaWR0aDtcclxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieFwiKSAmJiBub3dzdHlwZS54ICE9IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSBub3dzdHlwZS54ICogcGVyY2VudGFnZVc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mby53aW5kb3dXaWR0aCAtIHRoaXMuYmFubmVyd2lkdGgpICogMC41O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInlcIikgJiYgbm93c3R5cGUueSAhPSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS50b3AgPSBub3dzdHlwZS55ICogcGVyY2VudGFnZUg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLnRvcCA9IChpbmZvLndpbmRvd0hlaWdodCAtIHRoaXMuYmFubmVyaGVpZ2h0KSAtIDE1O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUud2lkdGggPSBpbmZvLnNjcmVlbldpZHRoICogc2NhbGU7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5pc29uUmVzaXplIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc29uUmVzaXplID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub25SZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUJhbm5lciggdHlwZTpzdHJpbmcgPSBcIlwiICkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdHlwZSAhPSBcIlwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IHRoaXMuX2Jhbm5lclR5cGVMaXN0W2ldLnR5cGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTphbnkgPSB0aGlzLl9iYW5uZXJUeXBlTGlzdFt0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUJhbm5lciggaXRlbS50eXBlLGl0ZW0uc3R5bGUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOaJk+W8gOexu+Wei+WtmOWCqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9vcGVucmFua0RpY3Q6YW55PXt9O1xyXG4gICAgLy8gcHJpdmF0ZSBfd3hPcGVuRGF0YVZpZXdlcjpXWE9wZW5EYXRhVmlld2VyO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmiZPlvIDlpb3lj4vmjpLooYzmppxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5GcmllbmRSYW5rKCB0eXBlOnN0cmluZyx2aWV3VHlwZTpzdHJpbmcscmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgPSBudWxsLGRhdGE6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3Nleml5dVN0YWdlKCk7XHJcbiAgICAgICAgdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXSA9IHt0eXBlOnR5cGUsdmlld1R5cGU6dmlld1R5cGUscmVjdDpyZWN0LHBhcmVudDpwYXJlbnQsZGF0YTpkYXRhfTtcclxuICAgICAgICB0aGlzLmluaXR6aXl1U3RhZ2UocmVjdCxwYXJlbnQpO1xyXG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoIHR5cGUsZGF0YSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5omT5byA54q25oCB5pe25YCZ77yM5YiH5o2i5pi+56S657G75Z6LXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZUZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoIHR5cGUgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOS4iuS4gOmhtVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJlUGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUucHJlcGFnZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiL5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUubmV4dHBhZ2UgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggUmFua1R5cGUuY2xvc2VmcmllbmRyYW5rICk7XHJcbiAgICAgICAgdGhpcy5jbG9zZXppeXVTdGFnZSgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMuX29wZW5yYW5rRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpcy5fb3BlbnJhbmtEaWN0W3NdO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5GcmllbmRSYW5rKCBpdGVtZC50eXBlLGl0ZW1kLnZpZXdUeXBlLGl0ZW1kLnJlY3QsaXRlbWQucGFyZW50LGl0ZW1kLmRhdGEgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5a2Q5Z+fXHJcbiAgICAgKiBAcGFyYW0gcmVjdCBcclxuICAgICAqIEBwYXJhbSBwYXJlbnQgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdHppeXVTdGFnZSggcmVjdDpMYXlhLlJlY3RhbmdsZSxwYXJlbnQ6TGF5YS5TcHJpdGUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoICF0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgPSBuZXcgV1hPcGVuRGF0YVZpZXdlcigpO1xyXG4gICAgICAgIC8vICAgICBpZiggcGFyZW50IClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgcGFyZW50LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgZWxzZVxyXG4gICAgICAgIC8vICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICBHYW1lTGF5ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkudG9wTGF5ZXIuZGlzcGxheU9iamVjdC5hZGRDaGlsZCggdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIueCA9IHJlY3QueDtcclxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnkgPSByZWN0Lnk7XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci53aWR0aCA9IHJlY3Qud2lkdGg7XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5oZWlnaHQgPSByZWN0LmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmUgOavgeWtkOWfn1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNsb3Nleml5dVN0YWdlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIGlmKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyLnJlbW92ZVNlbGYoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlciA9IG51bGw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u5LiK5Lyg77yI55So5LqO5o6S6KGM5qac5pWw5o2u5pi+56S677yJXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0xIOS4iuaKpeaVsOaNrlxyXG4gICAgICogQHBhcmFtIHBhcmFtMiDkuIrmiqXmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3JlVG9DbG91ZChwYXJhbTE6bnVtYmVyLHBhcmFtMjpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2FjaGVNYWdlcjpDYWNoZU1hbmFnZXIgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB2YXIgc2NvcmUxOm51bWJlciA9IGNhY2hlTWFnZXIuZ2V0bnVtKCBcInBhcmFtMVwiICk7XHJcbiAgICAgICAgLy8gdmFyIHNjb3JlMjpudW1iZXIgPSBjYWNoZU1hZ2VyLmdldG51bSggXCJwYXJhbTJcIiApO1xyXG4gICAgICAgIHBhcmFtMSA9IE1hdGguZmxvb3IocGFyYW0xKTtcclxuICAgICAgICBwYXJhbTIgPSBNYXRoLmZsb29yKHBhcmFtMik7XHJcbiAgICAgICAgdmFyIHJlc3VsdDE6bnVtYmVyID0gcGFyYW0xO1xyXG4gICAgICAgIHZhciByZXN1bHQyOm51bWJlciA9IHBhcmFtMjtcclxuXHJcbiAgICAgICAgaWYoIHJlc3VsdDEgPCBzY29yZTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmVzdWx0MSA9IHNjb3JlMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FjaGVNYWdlci5hZGRzdHIoIFwicGFyYW0xXCIscmVzdWx0MS50b1N0cmluZygpICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIGFyci5wdXNoKCB7IGtleTpcInBhcmFtMVwiLHZhbHVlOnJlc3VsdDEudG9TdHJpbmcoKSB9ICk7XHJcbiAgICAgICAgYXJyLnB1c2goIHsga2V5OlwicGFyYW0yXCIsdmFsdWU6cmVzdWx0MiArIFwiXCIgfSApO1xyXG4gICAgICAgIERlYnVnZXIubG9nKCBcInN0b3JlVG9DbG91ZFwiLCBhcnIpO1xyXG4gICAgICAgIHRoaXMuc2V0VXNlckNsb3VkU3RvcmFnZShhcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnYW1lY2x1YkJ1dHRvbjphbnk7XHJcbiAgICBwdWJsaWMgY3JlYXRlR2FtZUNsdWJCdXR0b24oIHN0eWxlOmFueSxpY29uOnN0cmluZyA9IFwiZ3JlZW5cIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3g6YW55ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggJiYgc3R5bGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3R5bGUud2lkdGggPSA0MDtcclxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gNDA7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmdhbWVjbHViQnV0dG9uID0gd3guY3JlYXRlR2FtZUNsdWJCdXR0b24oXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBpZihXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24uc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG4iLCJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuL1lRU2RrXCI7XG5pbXBvcnQgeyBTaGFyZVV0aWwgfSBmcm9tIFwiLi9TaGFyZVV0aWxcIjtcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi9QbGF5ZXJBY2NvdW50XCI7XG5cbmV4cG9ydCBjbGFzcyBXeEdhbWVJdGVtXG57XG4gICAgYXBwTmFtZUhpZGRlbjpib29sZWFuID0gZmFsc2U7XG4gICAgY29sb3I6c3RyaW5nID0gXCJDOTNCM0JGRlwiO1xuICAgIHNpemU6bnVtYmVyID0gMTAwO1xuICAgIGJvcmRlcldpZHRoOm51bWJlciA9IDUwO1xuICAgIGJvcmRlckNvbG9yOnN0cmluZyA9IFwiQTFBMEEwRkZcIjtcbiAgICBsZWZ0Om51bWJlcjtcbiAgICB0b3A6bnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHdWFuZ0dhbyBcbntcblxuICAgIHByaXZhdGUgc3RhdGljIGZzYWFzZmFmc3NmYTtcblxuICAgIHByaXZhdGUgc3RhdGljIGN1cmJhbm5lcjtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHZpZGVsQWRVbml0SWQgPSBcImFkdW5pdC1hOTIwM2IyMDgwY2JiNWRkXCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWRVbml0SWQgPSBcImFkdW5pdC00MTk5OGFiNDBjODY0YTQ1XCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWZzZnNhYWZzZnNhOiBib29sZWFuID0gZmFsc2U7XG4gICAgLy/op4blsY/lub/lkYrmmK/lkKbliqDovb3miJDlip9cbiAgICBwcml2YXRlIHN0YXRpYyBhc2Zhc2ZzYWZmc2E6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHN0YXRpYyBnZXQgaGFzYmFubmVyKCk6Ym9vbGVhblxuICAgIHtcbiAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBoYXN2aWRlbygpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdmlkZW9udW0gPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldEdsb2JlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8v6aKE5YWI5Yqg6L296KeG5bGP5bm/5ZGKXG4gICAgcHVibGljIHN0YXRpYyBJbml0VmlkZW8oKVxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4gfHwgIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZW8pIHJldHVybjtcblxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmJhbm5lckFkVW5pdElkKTtcblxuICAgICAgICAvL3ZlZGlvXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xuXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+a/gOWKseinhumikSDlub/lkYrliqDovb3miJDlip8nKTtcbiAgICAgICAgICAgIHRoaXMuYXNmYXNmc2FmZnNhID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25FcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4blsY/liqDovb3lpLHotKU6XCIgKyBlcnIpO1xuICAgICAgICAgICAgdGhpcy5hc2Zhc2ZzYWZmc2EgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZnNmc2FhZnNmc2EgPSB0cnVlO1xuICAgIH1cblxuICAgIC8v55yL6KeG6aKRXG4gICAgcHVibGljIHN0YXRpYyBTaG93VmlkZW8oY2FsbGJhY2s6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmhhc3ZpZGVvKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaWYodGhpcy5hc2Zhc2ZzYWZmc2EpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgWVFTZGsuc3RhdGlzdGljczEoXCJ2aWRlb1wiKTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzaG93VmlkZW9BZDpcIiArIHRoaXMuYXNmYXNmc2FmZnNhKTtcblxuICAgICAgICAgICAgdGhpcy5TZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpLmNhdGNoKGVyciA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLmxvYWQoKS50aGVuKCgpID0+IFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLop4bpopHmsqHmnInliIbkuqtcIiwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLCBcIjFcIik7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgXG4gICAgICAgIH0gXG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgU2hhcmVVdGlsLnNoYXJlSW1hZ2UoXCLop4bpopHmsqHmnInliIbkuqtcIiwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgLCBcIjFcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBTZXRWaWRlb0NhbGxCYWNrKGNhbGxiYWNrOkZ1bmN0aW9uKVxuICAgIHtcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub25DbG9zZShyZXMgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5r+A5Yqx6KeG6aKR5YWz6ZetOlwiK3Jlcy5pc0VuZGVkKTtcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmlzRW5kZWQgfHwgcmVzID09PSB1bmRlZmluZWQpIHtjYWxsYmFjayAmJiBjYWxsYmFjayh0cnVlKX1cbiAgICAgICAgICAgIGVsc2UgeyBjYWxsYmFjayAmJiBjYWxsYmFjayhmYWxzZSkgfVxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbnNob3diYW5uZXIgPSB0cnVlO1xuICAgIC8v5omT5byAYmFubmVyXG4gICAgcHVibGljIHN0YXRpYyBPcGVuQmFubmVyKGdhcDogbnVtYmVyID0gMCxjYWxsVmFjazogRnVuY3Rpb24gPSBudWxsLCBpc3dhaXQ6IGJvb2xlYW4gPSBmYWxzZSkgXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuaGFzYmFubmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWxsVmFjayhudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBcblxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxuICAgICAgICB7XG4gICAgICAgICAgICBjYWxsVmFjayhudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2Fuc2hvd2Jhbm5lciA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICB2YXIgaWRkID0gdGhpcy5iYW5uZXJBZFVuaXRJZDtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZFVuaXRJZDpcIitpZGQpO1xuICAgICAgICBsZXQgbmV3QmFubmVyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVCYW5uZXJBZCh7XG4gICAgICAgICAgICBhZFVuaXRJZDogaWRkLFxuICAgICAgICAgICAgc3R5bGU6IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiA0NjBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vbkVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgY2FsbFZhY2sobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyID0gbmV3QmFubmVyO1xuICAgICAgICAgICAgdmFyIGhpZ2h0OiBudW1iZXIgPSB0aGlzLkdldFJlYWxIaWdodChnYXApO1xuXG4gICAgICAgICAgICBpZiAoY2FsbFZhY2sgIT0gbnVsbCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FsbFZhY2soaGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5jYW5zaG93YmFubmVyICYmICFpc3dhaXQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBHZXRSZWFsSGlnaHQoZ2FwKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS53aWR0aCA9IGluZm8ud2luZG93V2lkdGg7XG5cbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodCAtIGdhcDtcbiAgICAgICAgICAgIHJldHVybiBMYXlhLnN0YWdlLmhlaWdodCAvIGluZm8ud2luZG93SGVpZ2h0ICogdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vY2xlYXJcbiAgICBzdGF0aWMgQ2xlYXIoKVxuICAgIHtcbiAgICAgICAgTGF5YS50aW1lci5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhckFsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jYW5zaG93YmFubmVyID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xuICAgICAgICBZUVNkay5IaWRlQmFubmVySW1hZ2UoKTtcbiAgICAgICAgLy8gaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgLy8gaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoaWRlYmFubmVyKCkgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmhpZGUoKTtcbiAgICAgICAgWVFTZGsuSGlkZUJhbm5lckltYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2hvd2Jhbm5lcigpIFxuICAgIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgY2FuY2hlYXQoKTpib29sZWFuXG5cdHtcbiAgICAgICAgaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6ZmFsc2UtPiBDdXJBY2NvdW50RGF0YS5jaGVhdCAhPSAxXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cdFx0dmFyIGNoZWNrc2NlbmNlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5jaGVja3NjZW5jZTtcbiAgICAgICAgaWYgKGNoZWNrc2NlbmNlID09IGZhbHNlKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImNoZWF0OnRydWUtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDM3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwNThcInx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDY3XCIgfHwgV3hBcGkuc2NlbmVWYWx1ZSA9PSBcIjEwOTVcIikgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2hlYXQ6dHJ1ZS0+IFwiICsgV3hBcGkuc2NlbmVWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcImNoZWF0OmZhbHNlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHN0YXRpYyBnZXQgQ2FuQ3JlYXRXeEJhbm5lclJlKCk6Ym9vbGVhblxuICAgIC8vIHtcbiAgICAvLyAgICAgaWYoIU1haW4uV1gpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICBpZighQWNjb3VudC5JbnN0YW5jZS5jdXJwbGF5ZXJEYXRhLld4UmUpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAvLyAgICAgaWYoIXRoaXMuY3BWZXJzaW9uR3JlYXRlck9yRXF1YWwoaW5mby5TREtWZXJzaW9uLFwiMi43LjVcIikpcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0IENhbkNyZWF0V3hHYW1lUmUoKTpib29sZWFuXG4gICAgLy8ge1xuICAgIC8vICAgICBpZighTWFpbi5XWClyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIGlmKCFBY2NvdW50Lkluc3RhbmNlLmN1cnBsYXllckRhdGEuV3hSZSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgIC8vICAgICBpZighdGhpcy5jcFZlcnNpb25HcmVhdGVyT3JFcXVhbChpbmZvLlNES1ZlcnNpb24sXCIyLjguM1wiKSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cbiAgICBcbiAgICAvLyBzdGF0aWMgd3hyZWJhbm5lcmlkID0gXCJQQmdBQV8yQUJEWkZSeVl3XCI7XG4gICAgLy8gc3RhdGljIHd4YmFubmVyOmFueTtcbiAgICAvLyBzdGF0aWMgU2hvd1hXQmFubmVyKClcbiAgICAvLyB7XG4gICAgLy8gICAgIGlmICghTWFpbi5XWCkgcmV0dXJuO1xuICAgIC8vICAgICB2YXIgaWRkID0gdGhpcy53eHJlYmFubmVyaWQ7XG5cbiAgICAvLyAgICAgbGV0IG5ld0Jhbm5lciA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlR2FtZUJhbm5lcih7XG4gICAgLy8gICAgICAgICBhZFVuaXRJZDogaWRkLFxuICAgIC8vICAgICAgICAgc3R5bGU6IFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgLy8gICAgICAgICAgICAgdG9wOiAwLFxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBuZXdCYW5uZXIub25Mb2FkKCgpID0+IFxuICAgIC8vICAgICB7XG4gICAgLy8gICAgICAgICBpZiAodGhpcy53eGJhbm5lcikgdGhpcy53eGJhbm5lci5kZXN0cm95KCk7XG4gICAgLy8gICAgICAgICB0aGlzLnd4YmFubmVyID0gbmV3QmFubmVyO1xuICAgIC8vICAgICAgICAgdGhpcy53eGJhbm5lci5zaG93KCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIHN0YXRpYyB3eHJlZ2FtZWlkID0gXCJQQmdBQV8yQUJEWktWSWxNXCI7XG4gICAgLy8gc3RhdGljIHd4Z2FtZTphbnk7XG4gICAgLy8gc3RhdGljIFNob3dYV0dhbWUoKVxuICAgIC8vIHtcbiAgICAvLyAgICAgaWYgKCFNYWluLldYIHx8ICF0aGlzLkNhbkNyZWF0V3hHYW1lUmUpIHJldHVybjtcbiAgICAvLyAgICAgdmFyIGlkZCA9IHRoaXMud3hyZWdhbWVpZDtcblxuICAgIC8vICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcbiAgICAgICAgXG4gICAgLy8gICAgIHZhciBnYW1lMSA9IG5ldyBXeEdhbWVJdGVtKCk7XG4gICAgLy8gICAgIGdhbWUxLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0ICogMC4zO1xuICAgIC8vICAgICBnYW1lMS5sZWZ0ID0gaW5mby53aW5kb3dXaWR0aCAtIDgwO1xuXG4gICAgLy8gICAgIHZhciBnYW1lcyA9IFtnYW1lMV07XG5cbiAgICAvLyAgICAgbGV0IG5ld0dhbWUgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUdhbWVJY29uKHtcbiAgICAvLyAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgLy8gICAgICAgICBjb3VudDogMSxcbiAgICAvLyAgICAgICAgIHN0eWxlOiBnYW1lc1xuICAgIC8vICAgICB9LGdhbWUxKTtcbiAgICAvLyAgICAgbmV3R2FtZS5vbkVycm9yKGVyciA9PiB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgbmV3R2FtZS5vbkxvYWQoKCkgPT4gXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLnd4Z2FtZSkgdGhpcy53eGdhbWUuZGVzdHJveSgpO1xuICAgIC8vICAgICAgICAgdGhpcy53eGdhbWUgPSBuZXdHYW1lO1xuICAgIC8vICAgICAgICAgdGhpcy53eGdhbWUuc2hvdygpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyB9XG5cbiAgICBzdGF0aWMgYmFubmVyaGlndCA9IDA7XG4gICAgcHVibGljIHN0YXRpYyBTZXRQb3NCYW5uZXIoYnRuOkxheWEuVUlDb21wb25lbnQsY29tcGxldGU6RnVuY3Rpb24pXG4gICAge1xuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25QQylcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coaW5mbyk7XG4gICAgICAgIC8vY29uc29sZS5sb2coYnRuKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4ueSxMYXlhLnN0YWdlLmhlaWdodCxpbmZvLndpbmRvd0hlaWdodCk7XG4gICAgICAgIHZhciByZXNoaWdodCA9IGJ0bi55ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcblxuICAgICAgICAvL2NvbnNvbGUubG9nKFwicmVzaGlnaHRcIixyZXNoaWdodCk7XG5cbiAgICAgICAgdmFyIGlkZCA9IHRoaXMuYmFubmVyQWRVbml0SWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5kZXN0cm95KCk7XG4gICAgICAgIGxldCBuZXdCYW5uZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNyZWF0ZUJhbm5lckFkKHtcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXG4gICAgICAgICAgICBzdHlsZTogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDcyMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3QmFubmVyLm9uRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IHJlc2hpZ2h0O1xuXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidG9wXCIsdGhpcy5hc2dhZ2Fzc2dhLnN0eWxlLnRvcCk7XG4gICAgICAgICAgICBpZih0aGlzLmN1cmJhbm5lcilcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lciBzaG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnNob3coKTtcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjMwMCx0aGlzLCgpPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyLnN0eWxlLnRvcCA9IGluZm8ud2luZG93SGVpZ2h0IC0gR3VhbmdHYW8uYmFubmVyaGlndDtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0Jhbm5lci5vblJlc2l6ZSgocmVzKT0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIEd1YW5nR2FvLmJhbm5lcmhpZ3QgPSByZXMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUud2lkdGggPSBpbmZvLndpbmRvd1dpZHRoO1xuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gcmVzaGlnaHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8v5oyJ6ZKu6K+v5a+8XG4gICAgc3RhdGljIENoZWF0QmFubmVyKGJ0bjpMYXlhLlVJQ29tcG9uZW50LGNvbXBsZXRlOkZ1bmN0aW9uID0gbnVsbCxnYXAgPSAwKVxuICAgIHtcbiAgICAgICAgaWYoIUd1YW5nR2FvLmNhbmNoZWF0KVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImlnbm9yZWNoZWF0XCIpO1xuICAgICAgICAgICAgR3VhbmdHYW8uT3BlbkJhbm5lcigwLChoZWlnaHQpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoaGVpZ2h0ID09IG51bGwpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBZUVNkay5TaG93QmFubmVySW1hZygoaGgpPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZD1MYXlhLnN0YWdlLmhlaWdodC1oaC1idG4uaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnkgPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBidG4ueSA9IExheWEuc3RhZ2UuaGVpZ2h0LWJ0bi5oZWlnaHQgLSAxMDA7XG4gICAgICAgICAgICBHdWFuZ0dhby5PcGVuQmFubmVyKGdhcCwoaGVpZ2h0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyB2YXIgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZihoZWlnaHQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLlNob3dCYW5uZXJJbWFnKChoaCk9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kPUxheWEuc3RhZ2UuaGVpZ2h0LWhoLWJ0bi5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBidG4ueSA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJ0bi55KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjaGVhdHN0YXJ0XCIsXCJib3R0b206MTAwXCIpO1xuICAgICAgICAgICAgICAgICAgICBidG4ubW91c2VFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbmQ9TGF5YS5zdGFnZS5oZWlnaHQtaGVpZ2h0LWJ0bi5oZWlnaHQgLSAyMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ5OlwiICsgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXR0aW1lKjEwMDAsdGhpcywoKT0+XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5tb3VzZUVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93YmFubmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKGJ0bix7eTplbmR9LDUwMCxudWxsLExheWEuSGFuZGxlci5jcmVhdGUodGhpcywoKT0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29tcGxldGUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSx0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IERpY3Rpb25hcnkgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0RpY3Rpb25hcnlcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciwgUFJPVE9DT0xTIH0gZnJvbSBcIi4uL05ldHdvcmtNYW5hZ2VyXCI7XHJcblxyXG5cclxuZXhwb3J0IGVudW0gcmVxdWlyZXR5cGUge1xyXG4gICAg57O757uf6LWg6YCBID0gMSwg6YeR5biB6LSt5LmwID0gMiwg6KeC55yL6KeG6aKRID0gMywg5YiG5LqrID0gNCwg562+5YiwID0gNSwg5rS75YqoID0gNiwg6YCa6L+H5YWz5Y2hID0gNywg57Sv6K6h55m76ZmGID0gOCwg6YKA6K+35Lq65pWw6L6+5YiwID0gOSwg56CW55+z6LSt5LmwID0gMTBcclxufVxyXG5cclxuZXhwb3J0IGVudW0gQWNjb3VudENvbmZpZyB7XHJcbiAgICBjcm9wLHRoaW5ncywgbGFuZCwgZ2xvYmFsLCBlbnRpdHksIHNpZ24sIHJld2FyZHMsIGFjaGlldmVtZW50LCBpbnZpdGUsIG1pc3Npb24sIHRyZWFzdXJlX2NsaWNrLCB0aGVtZSwgbG90dGVyeVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBBY2NvdW50VXNlciB7XHJcbiAgICBtb25leSwgZGlhbW9uZCwgdXNlcl9pZCwgZ2FtZV90aW1lcywgZ2V0X3RoZW1lcywgdmlkZW9fdGltZXMsIGVxdWlwX3RoZW1lcywgbGFzdF9hY3Rpb25fdGltZSwgbGFzdF9mYXZvcml0ZV90aW1lLCBwcm9ncmVzc190aGVtZXMsIHJldml2YWwsIHN0YWdlLHZtb25leVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBoZXJvQXR0ciB7XHJcbiAgICBpZCwgbmFtZSwgcXVhbGl0eSwgaWNvbiwgcHJlZmFiLCByZXF1aXJlX251bSwgcmVxdWlyZV90eXBlXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIHNpZ25kYXRhIHtcclxuICAgIHNpZ25fZGF5cywgc2lnbl90aW1lXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIGVudGl0eSB7XHJcbiAgICBpZCwgbmFtZSwgZW50aXR5X2lkLCBpY29uXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIHNraW5hdHRyIHtcclxuICAgIGVmZmVjdFZhbHVlXzEsXHJcbiAgICBlZmZlY3RWYWx1ZV8yLFxyXG4gICAgZWZmZWN0VmFsdWVfMyxcclxuICAgIGVmZmVjdFZhbHVlXzRcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFjY291bnREYXRhIHtcclxuICAgIGNvbnN0cnVjdG9yKF90b2tlbjogc3RyaW5nLCBfY29uZmlnOiBPYmplY3QsIF9hcHBTZXR0aW5nOiBPYmplY3QsIF91c2VyOiBPYmplY3QsIF91c2VyYmFzZTogT2JqZWN0LCBfdXNlSW52aXRlOiBPYmplY3QgPSBudWxsLCBfdXNlcl9zdGFnZTogT2JqZWN0ID0gbnVsbCwgX3VzZXJfc2lnbiwgX3VzZXJfYWNoaWV2ZW1lbnQsIF9sb3R0ZXJ5LF91c2VfbGFuZF90YXNrLF91c2VyX3ZpZGVvKSB7XHJcbiAgICAgICAgdGhpcy5tX3Rva2VuID0gX3Rva2VuO1xyXG4gICAgICAgIHRoaXMubV9hcHBfc2V0dGluZyA9IF9hcHBTZXR0aW5nO1xyXG4gICAgICAgIHRoaXMubV91c2VyID0gX3VzZXI7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfYmFzZSA9IF91c2VyYmFzZTtcclxuICAgICAgICB0aGlzLm1fc2lnbiA9IF91c2VyX3NpZ247XHJcbiAgICAgICAgdGhpcy5tX3Rhc2sgPSBfdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICB0aGlzLmxvdHRlcnkgPSBfbG90dGVyeTtcclxuICAgICAgICB0aGlzLm1fdXNlX2xhbmRfdGFzayA9IF91c2VfbGFuZF90YXNrO1xyXG4gICAgICAgIHRoaXMubV91c2VyX3ZpZGVvID0gX3VzZXJfdmlkZW87XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLm1fdXNlcltcInVzZXJfaWRcIl07XHJcbiAgICAgICAgdGhpcy5vcGVuaWQgPSB0aGlzLm1fdXNlcl9iYXNlW1wib3BlbmlkXCJdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXNlcl9pZDpcIiArIHRoaXMudXNlcklkKTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwib3Blbl9pZDpcIit0aGlzLm9wZW5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1fdG9rZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBtX2NvbmZpZ3M6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX2FwcF9zZXR0aW5nOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyOiBPYmplY3Q7XHJcbiAgICBwdWJsaWMgbV91c2VyX2Jhc2U6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3NpZ246IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3Rhc2s6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZV9sYW5kX3Rhc2s6YW55O1xyXG4gICAgcHVibGljIG1fdXNlcl92aWRlbzpPYmplY3Q7XHJcbiAgICBwdWJsaWMgb3BlbmlkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgbG90dGVyeTogYW55O1xyXG4gICAgcHVibGljIHJvYWRjb25maWc6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcclxuICAgIHB1YmxpYyBtX1Jld2FyZERpYzogT2JqZWN0ID0ge307XHJcbiAgICBwdWJsaWMgbV9FbnRpdHlEaWM6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcclxuICAgIHB1YmxpYyBtX0FjaGlldmVtZW50RGljOiBPYmplY3QgPSB7fTtcclxuICAgIC8vIHB1YmxpYyBtX3NraW5EaWM6RGljdGlvbmFyeTxudW1iZXIsU2tpbkRhdGE+ID0gbmV3IERpY3Rpb25hcnkoKTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxvdHRlcnl0aW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmxvdHRlcnlbXCJkYXlfdmlkZW9fdGltZXNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc2hhcmVjb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYXJlY29udGVudFwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgU2hhcmVJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJTaGFyZUltYWdlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdHRpbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjaGVhdHRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lclwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlkZW8oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBCdG5DYW5Nb3ZlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJCdG5DYW5Nb3ZlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVja3NjZW5jZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlY2tzY2VuY2VcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lcl9kaXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lcl9kaXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVRpbWVcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjcmVhdGVCYW5uZXJUaW1lcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY3JlYXRlQmFubmVyVGltZXNcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJNb3ZlUHJvcCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiYmFubmVyTW92ZVByb3BcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1NoYXJlVGhlblZpZGVvKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJpc1NoYXJlVGhlblZpZGVvXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc1Nob3dIdWlUdWkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImlzU2hvd0h1aVR1aVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhcnRfc3ByaW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJzdGFydF9zcHJpbnRcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgSXNWaWRlb01vZGVsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJJc1ZpZGVvTW9kZWxcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZpZGVvTW9kZWxOdW0oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVvTW9kZWxOdW1cIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBWaWRlb01vZGVsVGl0bGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiVmlkZW9Nb2RlbFRpdGxlXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBmYWlsY291bnQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImZhaWxjb3VudFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNwbWluc3BlZWQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInNwbWluc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiZ20oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJnbVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGNhbWVyYWhpZ2h0KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJjYW1lcmFoaWdodFwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGN0bmZpbGVuYW1lKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImN0bmZpbGVuYW1lXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaGVhdCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNoYWtlc3RhZ2UoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYWtlc3RhZ2VcIl0gJiYgdGhpcy5tX2FwcF9zZXR0aW5nW1wic2hha2VzdGFnZVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc3RhZ2Vjb25maWdjZG4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInN0YWdlY29uZmlnY2RuXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBwbGF5ZXJzcGVlZCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wicGxheWVyc3BlZWRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aWRlbEFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInZpZGVsQWRVbml0SWRcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGJhbm5lckFkVW5pdElkKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lckFkVW5pdElkXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB0cmkoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcInRyaVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcmVjb21tZW5kKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJlY29tbWVuZGZsZygpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJyZWNvbW1lbmRmbGdcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGVnZygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdnXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBlZ2dyYXRlKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJlZ2dyYXRlXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgVXNlSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51c2VySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldENvbmZpZyhfdHlwZTogQWNjb3VudENvbmZpZyk6IGFueSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50Q29uZmlnW190eXBlXTtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2NvbmZpZ3NbdHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFVzZXIoX3R5cGU6IEFjY291bnRVc2VyKSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBBY2NvdW50VXNlcltfdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV91c2VyW3R5cGVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBHZXRWaWRlb1RvdGFsKClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV91c2VyX3ZpZGVvW1widG90YWxcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTaWduKF9kYXRhdHlwZTogc2lnbmRhdGEpIHtcclxuICAgICAgICB2YXIgdHlwZSA9IHNpZ25kYXRhW19kYXRhdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9zaWduW3R5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRSZXdhcmRDb25maWcoX3Jld2FyZGlkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciByZXdhcmQgPSB0aGlzLm1fUmV3YXJkRGljW19yZXdhcmRpZF07XHJcbiAgICAgICAgcmV0dXJuIHJld2FyZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RW50aXR5KF9pZDogc3RyaW5nLCBhdHRyOiBlbnRpdHkpIHtcclxuICAgICAgICBpZighdGhpcy5tX0VudGl0eURpY1tfaWRdKXJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fRW50aXR5RGljW19pZF1bZW50aXR5W2F0dHJdXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldFJld2FyZERpYygpIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5yZXdhcmRzKTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9SZXdhcmREaWNbY29uZmlnW2tleV0uaWRdID0gY29uZmlnW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRFbnRpdHlEaWMoKSB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuZW50aXR5KTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29uZmlnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubV9FbnRpdHlEaWNbY29uZmlnW2tleV0uZW50aXR5X2lkXSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBHZXRUaGVtZUJ5SWQoX2lkOiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy50aGVtZSk7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pZCA9PSBfaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2tpbkF0dHIoX2lkOiBudW1iZXIpICB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcudGhlbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZmlnLmxlbmd0aDsgaSsrKSAge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnW2ldLmlkID09IF9pZCkgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFjaGlldmVtZW50RGF0YSgpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcuYWNoaWV2ZW1lbnQpO1xyXG4gICAgICAgIHZhciBkaWMgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIga2V5MSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciB0eXBlMSA9IGRhdGFba2V5MV0udHlwZTtcclxuICAgICAgICAgICAgLy92YXIgb2JqID0ge307XHJcblxyXG4gICAgICAgICAgICBpZiAoZGljW3R5cGUxXSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkyIGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHZhciB0eXBlMiA9IGRhdGFba2V5Ml0udHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGRhdGFba2V5Ml0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkaWNbdHlwZTFdID0gYXJyYXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubV9BY2hpZXZlbWVudERpYyA9IGRpYztcclxuICAgIH1cclxuXHJcbiAgICBIYXNUaGVtZShfaWQ6bnVtYmVyKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGhhcyA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBnZXR0aGVtZXMgPSB0aGlzLkdldFVzZXIoQWNjb3VudFVzZXIuZ2V0X3RoZW1lcyk7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGdldHRoZW1lcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoZ2V0dGhlbWVzW2ldID09IF9pZClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGFzO1xyXG4gICAgfVxyXG5cclxuICAgIEdldFNraW5EaWMoX2NvbmZpZzphbnkpXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEhlcm9Qcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfaGVyb2VzXCJdO1xyXG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xyXG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0SGF0UHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2hhdHNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDYlByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19kYW5jZXNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBIYXNNb3RvcihfaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaGQgPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICBpZiAoX2lkID09IGhkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvL+iOt+WPluearuiCpOeahOi/m+W6plxyXG4gICAgcHVibGljIEdldE1vdG9yUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX3RoZW1lc1wiXTtcclxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcclxuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNldmVyQ29uZmlnKF9jb25maWc6IGFueSkge1xyXG4gICAgICAgIHRoaXMubV9jb25maWdzID0gX2NvbmZpZztcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgICAgIHRoaXMuR2V0UmV3YXJkRGljKCk7XHJcbiAgICAgICAgdGhpcy5HZXRFbnRpdHlEaWMoKTtcclxuICAgICAgICAvLyB0aGlzLkdldEFjaGlldmVtZW50RGF0YSgpO1xyXG4gICAgICAgIGxldCBfZ2xvYmU9X2NvbmZpZ1tcImdsb2JhbFwiXTtcclxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX2dsb2JlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gX2dsb2JlW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQua2V5ID09IFwidGlsaXJlY1wiKSB7XHJcbiAgICAgICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LnRpbGlyZWM9IE51bWJlcihlbGVtZW50LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBVcGRhdGVTa2luRGljKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLkdldFNraW5EaWModGhpcy5tX2NvbmZpZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRHbG9iZShfa2V5OnN0cmluZylcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2xvYmUgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmdsb2JhbCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gZ2xvYmUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgb2JqID0gZ2xvYmVba2V5XTtcclxuICAgICAgICAgICAgdmFyIGtrayA9IG9ialtcImtleVwiXTtcclxuICAgICAgICAgICAgaWYoa2trID09IF9rZXkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtcInZhbHVlXCJdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUGxheWVyQWNjb3VudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihfY29kZTogc3RyaW5nLCBfbmlja25hbWU6IHN0cmluZywgX2F2YXRhcjogc3RyaW5nLCBfZ2VuZGVyOiBudW1iZXIsIF9jb3VudHJ5OiBzdHJpbmcsIF9wcm92aW5jZTogc3RyaW5nLCBfY2l0eTogc3RyaW5nLCBfZGV2aWNlOiBzdHJpbmcsIF9zaGFyZWlkOiBzdHJpbmcsIF9zY2VuY2U6IHN0cmluZywgX3Zlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbFRpbWUgPSBMYXlhLnRpbWVyLmN1cnJUaW1lcjtcclxuXHJcbiAgICAgICAgdGhpcy5Db2RlID0gX2NvZGU7XHJcbiAgICAgICAgdGhpcy5OaWNrTmFtZSA9IF9uaWNrbmFtZTtcclxuICAgICAgICB0aGlzLkF2YXRhciA9IF9hdmF0YXI7XHJcbiAgICAgICAgdGhpcy5HZW5kZXIgPSBfZ2VuZGVyO1xyXG4gICAgICAgIHRoaXMuQ291bnRyeSA9IF9jb3VudHJ5O1xyXG4gICAgICAgIHRoaXMuUHJvdmluY2UgPSBfcHJvdmluY2U7XHJcbiAgICAgICAgdGhpcy5DaXR5ID0gX2NpdHk7XHJcbiAgICAgICAgdGhpcy5EZXZpY2UgPSBfZGV2aWNlO1xyXG4gICAgICAgIHRoaXMuU2hhcmVJZCA9IF9zaGFyZWlkO1xyXG4gICAgICAgIHRoaXMuU2NlbmUgPSBfc2NlbmNlO1xyXG4gICAgICAgIHRoaXMudmVyID0gX3ZlcjtcclxuICAgICAgICB0aGlzLklzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBQbGF5ZXJBY2NvdW50Lmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUGxheWVyQWNjb3VudDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBDdXJyZW50QWNjb3VudCgpIHtcclxuICAgICAgICBpZiAoUGxheWVyQWNjb3VudC5pbnN0YW5jZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55Sf5oiQ5pys5Zyw5rWL6K+V6LSm5Y+3Li4uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUGxheWVyQWNjb3VudC5UZXN0QWNjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBUZXN0QWNjb3VudCgpIHtcclxuICAgICAgICB2YXIgY29kZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsb2NhbGNvZGVcIik7XHJcbiAgICAgICAgaWYoIWNvZGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHZhciByYW5kb20gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDEwMDAwLDk5OTk5KS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb2RlID0gXCJ4al9cIiArIHRpbWUgKyByYW5kb207XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJsb2NhbGNvZGVcIixjb2RlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGltZSxyYW5kb20pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaWsOeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiAgeeUqOaIt1wiLGNvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY3VyYWNjb3VudCA9IG5ldyBQbGF5ZXJBY2NvdW50KGNvZGUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGN1cmFjY291bnQuSXNUZXN0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gY3VyYWNjb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ29kZTogc3RyaW5nO1xyXG4gICAgcHVibGljIE5pY2tOYW1lOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQXZhdGFyOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgR2VuZGVyOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgQ291bnRyeTogc3RyaW5nO1xyXG4gICAgcHVibGljIFByb3ZpbmNlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2l0eTogc3RyaW5nO1xyXG4gICAgcHVibGljIERldmljZTogc3RyaW5nO1xyXG4gICAgcHVibGljIFNoYXJlSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBTY2VuZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHZlcjogc3RyaW5nO1xyXG4gICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJUaW1lOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGxvY2FsVGltZTtcclxuICAgIHN0YXRpYyBsb2NhbGNvZmlna2V5ID0gXCJtY29uZmlnXCI7XHJcblxyXG4gICAgcHVibGljIElzVGVzdCA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBDdXJBY2NvdW50RGF0YTogQWNjb3VudERhdGE7XHJcblxyXG4gICAgcHVibGljIHRpbGlyZWM6bnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBub3dDb25maWc6YW55O1xyXG5cclxuICAgIHB1YmxpYyBTZXRBY2NvdW50RGF0YShkYXRhLGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyKSB7XHJcbiAgICAgICAgdmFyIHRva2VuID0gZGF0YVtcInRva2VuXCJdO1xyXG4gICAgICAgIHZhciBjb25maWdzID0gZGF0YVtcImNvbmZpZ3NcIl07XHJcbiAgICAgICAgdmFyIGFwcF9zZXR0aW5nID0gZGF0YVtcImFwcF9zZXR0aW5nXCJdO1xyXG4gICAgICAgIHZhciB1c2VyID0gZGF0YVtcInVzZXJcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYmFzZSA9IGRhdGFbXCJ1c2VyX2Jhc2VcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfc2lnbiA9IGRhdGFbXCJ1c2VyX3NpZ25cIl07XHJcbiAgICAgICAgdmFyIHVzZXJfYWNoaWV2ZW1lbnQgPSBkYXRhW1widXNlcl9hY2hpZXZlbWVudFwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sb3R0ZXJ5ID0gZGF0YVtcInVzZXJfbG90dGVyeVwiXTtcclxuICAgICAgICB2YXIgdXNlcl9sYW5kX3Rhc2sgPSBkYXRhW1widXNlcl9sYW5kX3Rhc2tcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfdmlkZW8gPSBkYXRhW1widXNlcl92aWRlb1wiXTtcclxuICAgICAgICBpZiAodGhpcy5DdXJBY2NvdW50RGF0YSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL6I635Y+WY29uZmln5pWw5o2uXCIpO1xyXG4gICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhID0gbmV3IEFjY291bnREYXRhKHRva2VuLCBjb25maWdzLCBhcHBfc2V0dGluZywgdXNlciwgdXNlcl9iYXNlLCBudWxsLCBudWxsLCB1c2VyX3NpZ24sIHVzZXJfYWNoaWV2ZW1lbnQsIHVzZXJfbG90dGVyeSx1c2VyX2xhbmRfdGFzayx1c2VyX3ZpZGVvKTtcclxuICAgICAgICAgICAgdGhpcy5DaGVja0xvY2FsQ29uZmlnKGRhdGEudGFibGVfdmVyc2lvbiwgKF9jb25maWcpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEuR2V0U2V2ZXJDb25maWcoX2NvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0NvbmZpZyA9IF9jb25maWc7XHJcbiAgICAgICAgICAgICAgICBpZihjb21wbGV0ZWNiICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVjYi5ydW5XaXRoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWdzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fY29uZmlncyA9IGNvbmZpZ3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcF9zZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fYXBwX3NldHRpbmcgPSBhcHBfc2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXIgPSB1c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1c2VyX2Jhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyX2Jhc2UgPSB1c2VyX2Jhc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfc2lnbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3NpZ24gPSB1c2VyX3NpZ247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfYWNoaWV2ZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV90YXNrID0gdXNlcl9hY2hpZXZlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcl9sb3R0ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLmxvdHRlcnkgPSB1c2VyX2xvdHRlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl9sYW5kX3Rhc2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VfbGFuZF90YXNrID0gdXNlcl9sYW5kX3Rhc2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodXNlcl92aWRlbylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX3VzZXJfdmlkZW8gPSB1c2VyX3ZpZGVvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2hlY2tMb2NhbENvbmZpZyhfdmVyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBjdXJjb25maWcgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSk7XHJcbiAgICAgICAgaWYgKGN1cmNvbmZpZykge1xyXG4gICAgICAgICAgICAvL0xheWEuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5KTtcclxuICAgICAgICAgICAgaWYgKGN1cmNvbmZpZy52ZXIgPT0gX3Zlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruaYr+acgOaWsOeahC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgY2IoY3VyY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXksIGRhdGEuY29uZmlncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcumFjee9ruabtOaWsOWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJjb25maWfmjqXlj6Pojrflj5blpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyLkluc3RhbmNlLkh0dHBQb3N0UmVxdWVzdChQUk9UT0NPTFMuQ29uZmlnLCBudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbmZpZ3MudmVyID0gX3ZlcjtcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5LCBkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZXZlcuS/neWtmOmFjee9ruWujOaIkC4uLlwiLCBfdmVyKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjYihkYXRhLmNvbmZpZ3MpO1xyXG5cclxuICAgICAgICAgICAgfSksIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6YWN572u6I635Y+W5aSx6LSlXCIgKyBkYXRhKTtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgU2VydmVyVGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0aW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgbGV0IHN0aW1lID0gUGxheWVyQWNjb3VudC5TZXJ2ZXJUaW1lICsgTWF0aC5jZWlsKCh0aW1lIC0gdGhpcy5sb2NhbFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHN0aW1lO1xyXG4gICAgfVxyXG59IiwiXG5cblxuXG5leHBvcnQgZW51bSBzeXN0ZW10eXBlIHtcbiAgICBpb3MsIGFuZHJvaWQsIG90aGVyXG59XG5cbmV4cG9ydCBjbGFzcyBXeEFwaVxue1xuICAgIHB1YmxpYyBzdGF0aWMgcmVjb3JkQWxkRXZlbnQoa2V5OnN0cmluZyx2YWx1ZTpzdHJpbmc9XCJcIik6dm9pZFxuICAgIHtcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRFdmVudChrZXkse2tleTp2YWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LqL5Lu2OiBcIixrZXkpO1xuICAgIH1cbiAgICBzdGF0aWMgbmV3YWNjb3VudCA9IGZhbHNlO1xuICAgIHN0YXRpYyBzY2VuZVZhbHVlID0gXCJcIjtcbiAgICBzdGF0aWMgc2hhcmVPcGVuSWQgPSBcIlwiO1xuICAgIHN0YXRpYyBxdWVyeWNoYW5uZWwgPSBcIlwiO1xuICAgIHN0YXRpYyByZWZlcnJlckluZm9hcHBJZCA9IFwiXCI7XG4gICAgc3RhdGljIFdYTG9naW4oY2I6IEZ1bmN0aW9uKSBcbiAgICB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5sb2dpbih7XG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY29kZTpcIixyZXMuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6I635Y+W55So5oi355m75b2V5oCB5aSx6LSl77yBJyArIHJlcy5lcnJNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7IGNvbnNvbGUubG9nKFwid3gubG9naW46IGZhaWxlZCwgcmVzPVwiICsgcmVzKTsgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgV3hJbml0KCkgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xuXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1NoYXJlTWVudShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoU2hhcmVUaWNrZXQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vblNob3coKG9wdGlvbikgPT4gXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNoYXJlT3BlbklkID0gb3B0aW9uLnF1ZXJ5LnVzZXJJZDtcbiAgICAgICAgICAgIHRoaXMucXVlcnljaGFubmVsID0gb3B0aW9uLnF1ZXJ5LmNoYW5uZWw7XG4gICAgICAgICAgICBpZihvcHRpb24ucmVmZXJyZXJJbmZvKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJyZXJJbmZvYXBwSWQgPSBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcElkIGlzOlwiLCBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2NlbmVWYWx1ZSA9IG9wdGlvbi5zY2VuZTtcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzY2VuZVwiKTtcbiAgICAgICAgICAgIGlmIChzY2VuZSkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZVZhbHVlID0gc2NlbmU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLor7vlj5bphY3nva7lnLrmma/lgLw6XCIgKyBzY2VuZSk7XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuesrOS4gOasoeaLieWPluWcuuaZr+WAvDpcIiArIHRoaXMuc2NlbmVWYWx1ZSk7XG4gICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwic2NlbmVcIiwgdGhpcy5zY2VuZVZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL+aYvuekuuWKoOi9veS/oeaBr1xuICAgIHByaXZhdGUgc3RhdGljIGlzU2hvd2luZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0xvYWRpbmcodGl0bGU6IHN0cmluZyA9IFwi5Yqg6L295LitLi4uXCIpIFxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNTaG93aW5nID0gdHJ1ZTtcbiAgICAgICAgKExheWEuQnJvd3Nlci5vbk1pbmlHYW1lKSAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dMb2FkaW5nKHsgdGl0bGU6IHRpdGxlLCBtYXNrOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUxvYWRpbmcoKSBcbiAgICB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gICAgICAgIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5oaWRlTG9hZGluZygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhbGRTZW5kT3BlbmlkKF9vcGVuaWQ6c3RyaW5nKVxuICAgIHtcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uTWluaUdhbWUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYWxkU2VuZE9wZW5pZFwiLF9vcGVuaWQpO1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTZW5kT3BlbmlkKF9vcGVuaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8v5qOA5rWL5pu05pawXG4gICAgc3RhdGljIENoZWNrV1hVcGRhdGUoKSBcbiAgICB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZU1hbmFnZXIgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFVwZGF0ZU1hbmFnZXIoKTtcblxuICAgICAgICB1cGRhdGVNYW5hZ2VyLm9uQ2hlY2tGb3JVcGRhdGUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnIDmlrDniYjmnKw6XCIgKyByZXMuaGFzVXBkYXRlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdXBkYXRlTWFuYWdlci5vblVwZGF0ZVJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKHtcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOaPkOekuicsXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFuYWdlci5hcHBseVVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmFpbChyZXM/KSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsU3RhcnQoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCLlvIDlp4vorrDlvZXlhbPljaE6XCIgKyBzdGFnZUlkKTtcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eCkge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBcIuaWsOeUqOaItzpcIiArIHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBsZXZlbFJ1bm5pbmcoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsdXNlcmV2aXZlOnN0cmluZylcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2h5LitOlwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci53aW5kb3cgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eClcbiAgICAgICAge1xuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblJ1bm5pbmcoe1xuICAgICAgICAgICAgICAgIHN0YWdlSWQgICA6IHN0YWdlSWQsICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgdXNlcklkICAgIDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxuICAgICAgICAgICAgICAgIGV2ZW50ICAgICA6IFwicmV2aXZlXCIsICAvL+S9v+eUqOmBk+WFtyAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lICA6IFwi5L2/55So5aSN5rS7XCIsLy/kvb/nlKjpgZPlhbflkI3np7Ag6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICBpdGVtQ291bnQgOiAxLCAgIC8v5L2/55So6YGT5YW35pWw6YePICDlj6/pgIlcbiAgICAgICAgICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XG4gICAgICAgICAgICAgICAgICAgIHN0YWdlSWQgICA6XCLmlrDnlKjmiLc6XCIgKyAgc3RhZ2VJZCwgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZCAgICA6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQgICAgIDogXCJyZXZpdmVcIiwgIC8v5L2/55So6YGT5YW3ICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtTmFtZSAgOiBcIuS9v+eUqOWkjea0u1wiLC8v5L2/55So6YGT5YW35ZCN56ewIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA6IDEsICAgLy/kvb/nlKjpgZPlhbfmlbDph48gIOWPr+mAiVxuICAgICAgICAgICAgICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbGV2ZWxTdWNjZXNzKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWujOaIkFwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImNvbXBsZXRlXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5YWz5Y2h5a6M5oiQXCIgICAvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGxldmVsRmFpbChzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgc2NvcmU6IHN0cmluZywgY2FybmFtZTogc3RyaW5nKTogdm9pZCBcbiAgICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6K6w5b2V5YWz5Y2hOuWksei0pVwiICsgc3RhZ2VJZCk7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGFnZUlkOiBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZTogc2NvcmUsLy/mj4/ov7BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXI6IGNhcm5hbWUvL+aPj+i/sFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZihXeEFwaS5uZXdhY2NvdW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IHNjb3JlLC8v5o+P6L+wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcjogY2FybmFtZS8v5o+P6L+wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBDYW5TaGFrZSA9IHRydWU7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBzaGFrZSgpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlU2hvcnQoe30pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNoYWtlTG9uZygpOiB2b2lkIFxuICAgIHtcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC52aWJyYXRlTG9uZyh7fSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTaGFrZShfc2hvcnQgPSB0cnVlKSBcbiAgICB7XG4gICAgICAgIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbiAmJiBXeEFwaS5DYW5TaGFrZSkgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKF9zaG9ydCkgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWtlTG9uZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFfc2hvcnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuc3RhZ2VTaGFrZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIOaYr+WQpumch+WKqOS4rSAqL1xuICAgIHN0YXRpYyBpc1NoYWtlOmJvb2xlYW47XG4gICAgc3RhdGljIHRpbWVzID0gMS4zO1xuICAgIHN0YXRpYyBudW06bnVtYmVyID0gMDtcbiAgICBzdGF0aWMgb2Zmc2V0QXJyID0gWzAsIDBdO1xuICAgIHN0YXRpYyBvZmZzZXQgPSAxNDtcbiAgICBzdGF0aWMgY2Fuc2hha2VzdGFnZSA9IGZhbHNlO1xuXG4gICAgc3RhdGljIHN0YWdlU2hha2UoY2FsbEJhY2s6RnVuY3Rpb24gPSBudWxsLHNwZWVkOm51bWJlciA9IDMyKTp2b2lkXG4gICAge1xuICAgICAgICBpZih0aGlzLmlzU2hha2UgfHwgIXRoaXMuY2Fuc2hha2VzdGFnZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzU2hha2UgPSB0cnVlO1xuXG4gICAgICAgIHZhciBwb2ludDpMYXlhLlZlY3RvcjIgPSBuZXcgTGF5YS5WZWN0b3IyKExheWEuc3RhZ2UueCwgTGF5YS5zdGFnZS55KTtcbiAgICAgICAgTGF5YS5zdGFnZS50aW1lckxvb3Aoc3BlZWQsIHRoaXMsIHRoaXMuc2hha2VPYmplY3QsW3BvaW50LGNhbGxCYWNrXSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNoYWtlT2JqZWN0KF9wb2ludDpMYXlhLlZlY3RvcjIsX2NhbGxCYWNrKTp2b2lkXG4gICAge1xuICAgICAgICB2YXIgY291bnQ6bnVtYmVyID0gKHRoaXMubnVtKyspICUgNDtcbiAgICAgICAgdGhpcy5vZmZzZXRBcnJbdGhpcy5udW0gJSAyXSA9IGNvdW50IDwgMiA/IDAgOiB0aGlzLm9mZnNldDtcbiAgICAgICAgTGF5YS5zdGFnZS54ID0gdGhpcy5vZmZzZXRBcnJbMF0gKyBfcG9pbnQueDtcbiAgICAgICAgTGF5YS5zdGFnZS55ID0gdGhpcy5vZmZzZXRBcnJbMV0gKyBfcG9pbnQueTtcblxuICAgICAgICBpZih0aGlzLm51bSA+ICh0aGlzLnRpbWVzICogNCArIDEpKVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLmNsZWFyVGltZXIodGhpcywgdGhpcy5zaGFrZU9iamVjdCk7XG4gICAgICAgICAgICBMYXlhLnN0YWdlLnBvcygwLDApO1xuICAgICAgICAgICAgdGhpcy5udW0gPSAwO1xuICAgICAgICAgICAgdGhpcy5pc1NoYWtlID0gZmFsc2U7XG4gICAgICAgICAgICBpZihfY2FsbEJhY2sgIT0gbnVsbClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfY2FsbEJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1R4dCh0ZXh0OiBzdHJpbmcpIFxuICAgIHtcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci5vbldlaVhpbikgXG4gICAgICAgIHtcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KHsgdGl0bGU6IHRleHQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBTeXN0ZW1Gcm9tKCk6IHN5c3RlbXR5cGUgXG4gICAge1xuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuIHN5c3RlbXR5cGUub3RoZXI7XG5cbiAgICAgICAgbGV0IGluZm8gPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmdldFN5c3RlbUluZm9TeW5jKCk7XG4gICAgICAgIHZhciBzeXN0ZW06IHN0cmluZyA9IGluZm8uc3lzdGVtO1xuICAgICAgICB2YXIgSU9TID0gc3lzdGVtLmluZGV4T2YoXCJpT1NcIikgIT0gLTE7XG4gICAgICAgIHZhciBBbmRyb2lkID0gc3lzdGVtLmluZGV4T2YoXCJBbmRyb2lkXCIpICE9IC0xO1xuXG4gICAgICAgIGlmIChJT1MpIHtcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLmlvcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBbmRyb2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5hbmRyb2lkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUub3RoZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IElzTG9uZ1NjcmVlblN5c3RlbSgpOmJvb2xlYW5cbiAgICB7XG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzeXN0ZW1JbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgICAgICBsZXQgcGxhdGZvcm1Nb2RlbCA9IFwiaXB4XCI7XG4gICAgICAgIGlmIChzeXN0ZW1JbmZvICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG1vZGVsID0gc3lzdGVtSW5mby5tb2RlbDtcbiAgICAgICAgcGxhdGZvcm1Nb2RlbCA9IGAke3N5c3RlbUluZm8uYnJhbmR9XyR7bW9kZWx9XyR7c3lzdGVtSW5mby5zeXN0ZW19X3d4JHtzeXN0ZW1JbmZvLnZlcnNpb259X1NES1ZlciR7c3lzdGVtSW5mby5TREtWZXJzaW9ufWA7XG4gICAgICAgIGNvbnNvbGUubG9nKFwicGxhdGZvcm1Nb2RlbDpcIiArIHBsYXRmb3JtTW9kZWwpO1xuICAgICAgICByZXR1cm4gICEobW9kZWwuaW5kZXhPZihcIlhcIikgPCAwKSB8fFxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJvcHBvXCIpID49IDAgfHwgbW9kZWwuaW5kZXhPZihcIk9QUE9cIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCJSMTVcIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwicjE1XCIpID49IDApKSB8fFxuICAgICAgICBzeXN0ZW1JbmZvLnN0YXR1c0JhckhlaWdodCA+IDIwIHx8XG4gICAgICAgIChtb2RlbC5pbmRleE9mKFwiTm90ZVwiKSA+PSAwICYmIChtb2RlbC5pbmRleE9mKFwiN1wiKSA+PSAwIHx8IG1vZGVsLmluZGV4T2YoXCI4XCIpID49IDApKSB8fFxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJpUGhvbmVcIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCIxMVwiKSA+PSAwKSlcbn1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdyaXRlU3RhZ2Uoc3RhZ2U6IG51bWJlcilcbiAgICB7XG4gICAgICAgIHZhciBrdkRhdGFMaXN0ID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHZhciBteVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJ3eGdhbWVcIjogXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJzdGFnZVwiOiBzdGFnZSxcbiAgICAgICAgICAgICAgICBcInVwZGF0ZV90aW1lXCI6IGRhdGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAga3ZEYXRhTGlzdC5wdXNoKHtrZXk6XCJzdGFnZVwiLCB2YWx1ZTogbXlWYWx1ZX0pO1xuICAgICAgXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxuICAgICAgICB7XG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNldFVzZXJDbG91ZFN0b3JhZ2UoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBLVkRhdGFMaXN0OiBrdkRhdGFMaXN0LFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiByPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDliIbmlbDmiJDlip9cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNwVmVyc2lvbkdyZWF0ZXJPckVxdWFsKHYxOiBzdHJpbmcsIHYyOiBzdHJpbmcpIFxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtMT0dd5Z+656GA5bqT54mI5pys5Y+3IGN1clZlcjoke3YxfSB0YXJnVmVyOiR7djJ9YCk7XG4gICAgICAgIGxldCB2MUFyciA9IHYxLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgbGV0IHYyQXJyID0gdjIuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgbGVuID0gdjFBcnIubGVuZ3RoO1xuICAgICAgICBpZiAodjJBcnIubGVuZ3RoIDwgbGVuKSB7XG4gICAgICAgICAgICBsZW4gPSB2MkFyci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IHZlcjEgPSBOdW1iZXIodjFBcnJbaV0pO1xuICAgICAgICAgICAgbGV0IHZlcjIgPSBOdW1iZXIodjJBcnJbaV0pO1xuICAgICAgICAgICAgaWYgKHZlcjEgPiB2ZXIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2ZXIxIDwgdmVyMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjFBcnIubGVuZ3RoID49IHYyQXJyLmxlbmd0aDtcbiAgICB9XG59IiwiaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi9TZGtcIjtcbmltcG9ydCBHdWFuZ0dhbyBmcm9tIFwiLi9HdWFuZ0dhb1wiO1xuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0dhbWVVdGlsc1wiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcblxuLypcbiogbmFtZTtcbiovXG4gZXhwb3J0IGNsYXNzIFNoYXJlVXRpbFxue1xuICAgIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFNoYXJlVXRpbCA9IG5ldyBTaGFyZVV0aWwoKTtcbiAgICBcbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlU3VjY2Vzc1RpbWU6bnVtYmVyID0gMDtcbiAgICBwdWJsaWMgc3RhdGljIGJlZ2luU2hhcmVUaW1lOm51bWJlcjtcbiAgICBwdWJsaWMgc3RhdGljICBpc1NoYXJpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgY2FsbGJhY2s7XG5cbiAgICBwdWJsaWMgYmVnaW5TaGFyZShjYWxsQmFjayk6dm9pZFxuICAgIHtcbiAgICAgICAgICBTaGFyZVV0aWwuYmVnaW5TaGFyZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr54K55Ye75pe26Ze0PVwiICsgU2hhcmVVdGlsLmJlZ2luU2hhcmVUaW1lKTtcbiAgICAgICAgICBTaGFyZVV0aWwuaXNTaGFyaW5nID0gdHJ1ZTtcbiAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2sgPSBjYWxsQmFjaztcbiAgICB9XG4gICAgcHVibGljIG9uUmVnaXN0ZXIoKTp2b2lkXG4gICAge1xuICAgICAgICAgaWYoTGF5YS5Ccm93c2VyLndpbmRvdy53eCA9PSBudWxsKVxuICAgICAgICAge1xuICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaG93KGZ1bmN0aW9uKG9wdGlvbilcbiAgICAgICAgIHtcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uc2hvdyBzaGFyZSBzdGFydFwiKTtcbiAgICAgICAgICAgICBpZihTaGFyZVV0aWwuaXNTaGFyaW5nKVxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgU2hhcmVVdGlsLmlzU2hhcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICBsZXQgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5Zue5Yiw5ri45oiP5pe26Ze0XCIgKyB0aW1lKTtcbiAgICAgICAgICAgICAgICAgbGV0IHdhaXQgPSAodGltZSAtICBTaGFyZVV0aWwuYmVnaW5TaGFyZVRpbWUpLzEwMDA7XG4gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5YGc55WZ5pe26Ze05Li677yaXCIgKyB3YWl0KTtcbiAgICAgICAgICAgICAgICAgbGV0IHNoYXJlU3VjY2Vzczpib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgIGxldCByZWFsU3VjY2Vzczpib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgaWYod2FpdCA8IDMpXG4gICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpcIuivt+mHjeivleS4gOasoVwifSApO1xuICAgICAgICAgICAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgICAgICAgICAgICAgICBpZihyYW5kb20gPD0gMC4zKVxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBbXCLkvaDlt7LliIbkuqvov4for6XnvqRcIixcIuivt+mHjeaWsOaNouS4que+pOWIhuS6q++8gVwiLFwi6K+35YiG5Lqr5YiwMzDkurrlpKfnvqTkuK3vvIFcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VybWVzID0gbWVzc2FnZVtHYW1lVXRpbHMucmFuZFJhbmdlaW50KDAsMildO1xuICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpjdXJtZXN9ICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93VG9hc3QoIHt0aXRsZTpcIuWIhuS6q+aIkOWKnyFcIn0gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlVXRpbC5jYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gIGlmKHdhaXQgPj0gMilcbiAgICAgICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZih3YWl0IDwgNClcbiAgICAgICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgc2hhcmVTdWNjZXNzID0gKE1hdGgucmFuZG9tKCkgPiAwLjUpP2ZhbHNlOnRydWU7XG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgZWxzZVxuICAgICAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBzaGFyZVN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgICAgICAvLyAgZWxzZXtcbiAgICAgICAgICAgICAgICAvLyAgICAgc2hhcmVTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gIH1cbiAgICAgICAgICAgICAgICAvLyAgaWYoc2hhcmVTdWNjZXNzID09IGZhbHNlKVxuICAgICAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCgge3RpdGxlOlwi6K+36YeN6K+V5LiA5qyhXCJ9ICk7XG4gICAgICAgICAgICAgICAgLy8gICAgICBTaGFyZVV0aWwuY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgICAgLy8gIGVsc2V7XG4gICAgICAgICAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd1RvYXN0KCB7dGl0bGU6XCLliIbkuqvmiJDlip9cIn0gKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgU2hhcmVVdGlsLmNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgICAgIC8vICB9XG4gICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIFNoYXJlTWVzc2FnZSgpIHtcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcbiAgICAgICAgdmFyIHQ6IG51bWJlciA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuU2VydmVyVGltZTtcbiAgICAgICAgdmFyIF90aXRsZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuc2hhcmVjb250ZW50O1xuICAgICAgICBfdGl0bGUgPSAoX3RpdGxlID09IFwiXCIgfHwgIV90aXRsZSkgPyBcIuS9oOiDvei3n+W+l+S4iuaIkeeahOmAn+W6puWQl++8ge+8n1wiIDogX3RpdGxlO1xuICAgICAgICB2YXIgX2ltYWdlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaGFyZUltYWdlO1xuICAgICAgICBfaW1hZ2UgPSAoX2ltYWdlID09IFwiXCIgfHwgIV9pbWFnZSkgPyBcImJnL3NoYXJlMS5wbmdcIiA6IF9pbWFnZTtcbiAgICAgICAgY29uc29sZS5sb2coXCJTaGFyZU1lc3NhZ2VcIik7XG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25TaGFyZUFwcE1lc3NhZ2UoKCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBfdGl0bGUsXG4gICAgICAgICAgICBpbWFnZVVybDogX2ltYWdlLFxuICAgICAgICAgICAgcXVlcnk6IFwic2hhcmVpZD1cIiArIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuVXNlSWQgKyBcIl9cIiArIHQgKyBcIl9cIiArIE1hdGguZmxvb3IoOTk5OSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKClcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2hhcmVJbWFnZShjaGFubmVsOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbiA9IG51bGwsIHNoYXJlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuc2hhcmUpIHtcbiAgICAgICAgICAgIFd4QXBpLlNob3dUeHQoXCLmmoLmnKrlvIDmlL5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHZhciB0OiBudW1iZXIgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNlcnZlclRpbWU7XG4gICAgICAgIHZhciBfdGl0bGUgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnNoYXJlY29udGVudDtcbiAgICAgICAgX3RpdGxlID0gKF90aXRsZSA9PSBcIlwiIHx8ICFfdGl0bGUpID8gXCLkvaDog73ot5/lvpfkuIrmiJHnmoTpgJ/luqblkJfvvIHvvJ9cIiA6IF90aXRsZTtcbiAgICAgICAgdmFyIF9pbWFnZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuU2hhcmVJbWFnZTtcbiAgICAgICAgX2ltYWdlID0gKF9pbWFnZSA9PSBcIlwiIHx8ICFfaW1hZ2UpID8gXCJiZy9zaGFyZTEucG5nXCIgOiBfaW1hZ2U7XG4gICAgICAgIGlmIChXeEFwaS5zY2VuZVZhbHVlID09IFwiMTAzN1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDU4XCJ8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA2N1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDk1XCIpIFxuICAgICAgICB7XG4gICAgICAgICAgICBfdGl0bGUgPSBcIjIwMjDlhajmlrDlt6XotYTotbDlir/vvIzkvaDot5/kuIroioLlpY/kuoblkJfvvJ9cIjtcbiAgICAgICAgICAgIF9pbWFnZSA9IFwiYmcvc2hhcmUyLnBuZ1wiO1xuICAgICAgICB9XG4gICAgICAgIFxuXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU2hhcmVBcHBNZXNzYWdlKHtcbiAgICAgICAgICAgIHRpdGxlOiBfdGl0bGUsXG4gICAgICAgICAgICBpbWFnZVVybDogX2ltYWdlLFxuICAgICAgICAgICAgcXVlcnk6IFwidXNlcklkPVwiICsgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5Vc2VJZCArIFwiX1wiICsgc2hhcmVUeXBlICsgXCJfXCIgKyB0ICsgXCJfXCIgKyBNYXRoLmZsb29yKDk5OTkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygpLy8gKyBcIiZzaGFyZVRpdGxlPVwiICsgX3RpdGxlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBTaGFyZVV0aWwuSW5zdGFuY2UuYmVnaW5TaGFyZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IEd1YW5nR2FvIGZyb20gXCIuL0d1YW5nR2FvXCI7XG5pbXBvcnQgRGljdGlvbmFyeSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRGljdGlvbmFyeVwiO1xuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4vU2RrXCI7XG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XG5pbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi9jcGEvUmVjb21tZW5kVmlld1wiO1xuXG5leHBvcnQgY2xhc3MgWVFTZGtcbntcbiAgICBwdWJsaWMgc3RhdGljIGZsZyA9IFwic2dweXBcIjtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0YWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgY2Fpbml4aWh1YW46IGFueTtcblxuICAgIHB1YmxpYyBzdGF0aWMgYmFva3VhbnlvdXhpMjogYW55O1xuXG4gICAgcHVibGljIHN0YXRpYyBiYW9rdWFueW91eGkxOiBhbnk7XG5cbiAgICBwdWJsaWMgc3RhdGljIHNoYXJlczphbnlbXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2R5eTphbnk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGpzOmFueTtcbiAgICBwdWJsaWMgc3RhdGljIHRjOmFueTtcbiAgICBcblxuICAgIHB1YmxpYyBzdGF0aWMgYmFubmVyX2RhdGE6IGFueTtcblxuICAgIHB1YmxpYyBzdGF0aWMgcG9zdGJqKHVybDogc3RyaW5nLCBhcmdzOiBhbnksIGNhbGxiYWNrPzogYW55LCBoZWFkZXIgPSBudWxsKSBcbiAgICB7XG4gICAgICAgIGxldCBodHRwUmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCA9IG5ldyBMYXlhLkh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgXG4gICAgICAgIHtcbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0Lm9uY2UoTGF5YS5FdmVudC5QUk9HUkVTUywgdGhpcywgKCkgPT4geyBjYWxsYmFjay5wcm9ncmVzcyAmJiBjYWxsYmFjay5wcm9ncmVzcyhodHRwUmVxdWVzdCkgfSk7XG4gICAgICAgICAgICBodHRwUmVxdWVzdC5vbmNlKExheWEuRXZlbnQuRVJST1IsIHRoaXMsICgpID0+IHsgY2FsbGJhY2suZXJyb3IgJiYgY2FsbGJhY2suZXJyb3IoaHR0cFJlcXVlc3QpIH0pO1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Qub25jZShMYXlhLkV2ZW50LkNPTVBMRVRFLCB0aGlzLCAoKSA9PiB7IGNhbGxiYWNrLmNvbXBsZXRlICYmIGNhbGxiYWNrLmNvbXBsZXRlKGh0dHBSZXF1ZXN0KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVhZGVyKSBcbiAgICAgICAge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcImpzb25cIiwgW1wiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3Quc2VuZCh1cmwsIGFyZ3MsIFwicG9zdFwiLCBcImpzb25cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL+eZu+W9lVxuICAgIHB1YmxpYyBzdGF0aWMgbG9naW4oY29kZSxfY2hhbm5lbCxfYXBwaWQsY2I6RnVuY3Rpb24gPSBudWxsKVxuICAgIHtcbiAgICAgICAgbGV0IHVybDEgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9hdXRoP1wiO1xuICAgICAgICB2YXIgdXJsO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IF9jaGFubmVsO1xuICAgICAgICB2YXIgYXBwaWQgPSBfYXBwaWQ7XG4gICAgICAgIGlmICghY2hhbm5lbCkgY2hhbm5lbCA9IFwib3duXCI7XG4gICAgICAgIGxldCBhcmdzMSA9IFxuICAgICAgICB7XG4gICAgICAgICAgICBmbGc6IHRoaXMuZmxnLFxuICAgICAgICAgICAgY29kZTogY29kZSxcbiAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWxcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBwaWQpIFxuICAgICAgICB7XG4gICAgICAgICAgICB1cmwgPSBgJHt1cmwxfWZsZz0ke2FyZ3MxLmZsZ30mY29kZT0ke2FyZ3MxLmNvZGV9JmNoYW5uZWw9JHthcmdzMS5jaGFubmVsfSZhcHBpZD0ke2FwcGlkfWA7XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2UgXG4gICAgICAgIHtcbiAgICAgICAgICAgIHVybCA9IGAke3VybDF9ZmxnPSR7YXJnczEuZmxnfSZjb2RlPSR7YXJnczEuY29kZX0mY2hhbm5lbD0ke2FyZ3MxLmNoYW5uZWx9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc3Riaih1cmwsIG51bGwsIFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihjYiAhPSBudWxsKWNiKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSFBfbG9naW4gY29tcGxldGVcIitKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSFBfbG9naW4gcHJvZ3Jlc3M6XCIgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkhQX2xvZ2luIGVycm9yOlwiICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXlj4LmlbA6XCIgKyB1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRQb3NpdGlvbjogYW55O1xuICAgIC8v6I635Y+W5bm/5ZGK77yI5ZCr5YiG5Lqr77yJ57Sg5p2Q5o6l5Y+jXG4gICAgcHVibGljIHN0YXRpYyBwdWxsQWRQb3NpdGlvbihjYjpGdW5jdGlvbiA9IG51bGwpIFxuICAgIHtcbiAgICAgICAgLy9hZCBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvc3RiaihcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9nYW1lL1wiICsgdGhpcy5mbGcsIG51bGwsIFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wbGV0ZTogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbGxQb3NpdGlvbiA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIFlRU2RrLmFkUG9zaXRpb24gPSByZXF1ZXN0LmRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBZUVNkay5HZXRBZEluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgWVFTZGsuZ2V0YWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZihjYiljYigpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYWxsUG9zaXRpb25mYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbGxQb3NpdGlvbiBmYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0YyA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRnZHl4ID0gZmFsc2U7XG4gICAgc3RhdGljIGdldGJhbm5lciA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRqcyA9IGZhbHNlO1xuICAgIHN0YXRpYyBnZXRiID0gZmFsc2U7XG4gICAgc3RhdGljIGdldHRjID0gZmFsc2U7XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyBhZFBvc2l0aW9uRGljOkRpY3Rpb25hcnk8c3RyaW5nLGFueT4gPSBuZXcgRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIEdldEFkSW5mbygpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWRQb3NpdGlvbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5hZFBvc2l0aW9uW2luZGV4XS5sb2NhdGlvbl9mbGcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkUG9zaXRpb25EaWMuYWRkKFwiQ1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwgKGRhdGEpID0+IFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5jYWluaXhpaHVhbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldGMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkMyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJDMlwiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwoZGF0YSk9PlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZnVodW9jYWluaXhpaHVhbiA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZFBvc2l0aW9uRGljLmFkZChcIkJcIiwgdGhpcy5hZFBvc2l0aW9uW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWRkZXRhaWwodGhpcy5hZFBvc2l0aW9uW2luZGV4XS51cmwsIChkYXRhKSA9PiBcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgWVFTZGsuYmFva3VhbnlvdXhpMSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldGIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmJhb2t1YW55b3V4aTEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJhbm5lclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkUG9zaXRpb25EaWMuYWRkKFwiYmFubmVyXCIsIHRoaXMuYWRQb3NpdGlvbltpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLmJhbm5lcl9kYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0YmFubmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJHRFlYXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJHRFlYXCIsIHRoaXMuYWRQb3NpdGlvbltpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBZGRldGFpbCh0aGlzLmFkUG9zaXRpb25baW5kZXhdLnVybCwgKGRhdGEpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLmdkeXkgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Z2R5eCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkpTXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJKU1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5qcyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0anMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlRDXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRQb3NpdGlvbkRpYy5hZGQoXCJUQ1wiLCB0aGlzLmFkUG9zaXRpb25baW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFkZGV0YWlsKHRoaXMuYWRQb3NpdGlvbltpbmRleF0udXJsLCAoZGF0YSkgPT4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZUVNkay50YyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0dGMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgQ2hlY2tHZXREYXRhQ29tcGxldGUoKTpib29sZWFuXG4gICAge1xuICAgICAgICB2YXIgY29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5nZXRjICYmIHRoaXMuZ2V0Z2R5eCAmJiB0aGlzLmdldGIgJiYgdGhpcy5nZXRqcyAmJiB0aGlzLmdldGJhbm5lcilcbiAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wbGV0ZTtcbiAgICB9XG5cbiAgICAvL+iOt+WPluW5v+WRiuivpue7huS/oeaBr+aOpeWPo1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWRkZXRhaWwodXJsLCBjYWxsYmFjazogRnVuY3Rpb24pOiBhbnkgXG4gICAge1xuICAgICAgICB2YXIgdWlkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQ7XG4gICAgICAgIHRoaXMucG9zdGJqKHVybCArIFwiJnVpZD1cIiArIHVpZCwgbnVsbCwge1xuICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS5zdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwicHVsbEFkUG9zaXRpb24gOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXF1ZXN0LmRhdGEucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5DaGVja0dldERhdGFDb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY29tbWVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwdWxsQWRQb3NpdGlvbmZhaWxlZDpcIiwgcmVxdWVzdC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJwdWxsQWRQb3NpdGlvbiBmYWlsZWQ6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgR2V0U2hhcmUoX2NiOkZ1bmN0aW9uID0gbnVsbClcbiAgICB7XG4gICAgICAgIGxldCB1cmwxID0gXCJodHRwczovL2FwaS55ejA2MS5jb20vbWF0dGVyL3NoYXJlP2lkPTI4MSZnZmxnPSBcIisgdGhpcy5mbGcgK1wiICZsZmxnPUZcIjtcbiAgICAgICAgdmFyIHVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgdXJsID0gYCR7dXJsMX0mdWlkPSR7dWlkfWA7XG4gICAgICAgIHRoaXMucG9zdGJqKHVybCxudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihfY2IgIT0gbnVsbClfY2IoSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXF1ZXN0LmRhdGE7XG4gICAgICAgICAgICAgICAgWVFTZGsuc2hhcmVzID0gZGF0YS5yZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiR2V0U2hhcmUgcHJvZ3Jlc3M6XCIgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmRhdGEpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJHZXRTaGFyZSBlcnJvcjpcIiArIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuZGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8v5bm/5ZGK54K55Ye75LiK5oql5o6l5Y+jXG4gICAgcHVibGljIHN0YXRpYyByZXBvcnRhZChhZF9pZCwgbG9jYXRpb25faWQsIGlzc3VjY2VzcyA9IGZhbHNlKSBcbiAgICB7XG4gICAgICAgIGxldCB1cmwgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9yZXBvcnRhZD9cIjtcbiAgICAgICAgdmFyIGN1cnVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgbGV0IHJnczEgPSBcbiAgICAgICAge1xuICAgICAgICAgICAgZ2ZsZzogdGhpcy5mbGcsXG4gICAgICAgICAgICB1aWQ6IGN1cnVpZCxcbiAgICAgICAgICAgIGFkX2lkOiBhZF9pZCxcbiAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBsb2NhdGlvbl9pZCxcbiAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWxcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNzdWNjZXNzKSBcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJncyA9IGAke3VybH1nZmxnPSR7cmdzMS5nZmxnfSZ1aWQ9JHtyZ3MxLnVpZH0mYWRfaWQ9JHtyZ3MxLmFkX2lkfSZsb2NhdGlvbl9pZD0ke3JnczEubG9jYXRpb25faWR9JmNoYW5uZWw9JHtyZ3MxLmNoYW5uZWx9JnN0YXR1cz1jYmA7XG4gICAgICAgIH0gZWxzZSBcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJncyA9IGAke3VybH1nZmxnPSR7cmdzMS5nZmxnfSZ1aWQ9JHtyZ3MxLnVpZH0mYWRfaWQ9JHtyZ3MxLmFkX2lkfSZsb2NhdGlvbl9pZD0ke3JnczEubG9jYXRpb25faWR9JmNoYW5uZWw9JHtyZ3MxLmNoYW5uZWx9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeeahOWPguaVsFwiICsgcmdzKTtcbiAgICAgICAgdGhpcy5wb3N0YmoocmdzLCBudWxsLCBcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbXBsZXRlOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS5zdGF0dXMgPT0gMSkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaIkOWKnyA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrmiqXlpLHotKU6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAocmVxdWVzdDogTGF5YS5IdHRwUmVxdWVzdCkgPT4gXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLplJnor6/mtojmga86XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc3RhdGlzdGljczEobG9jOiBzdHJpbmcsX3NoYXJlaWQ6c3RyaW5nID0gXCJcIikgXG4gICAge1xuICAgICAgICBsZXQgdXJsID0gXCJodHRwczovL2FwaS55ejA2MS5jb20vc3RhdD9cIjtcbiAgICAgICAgdmFyIGN1cnVpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEub3BlbmlkO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgdmFyIHNpZCA9IF9zaGFyZWlkO1xuICAgICAgICBpZiAoIXNpZCkgc2lkID0gXCJcIjtcbiAgICAgICAgbGV0IHIgPSBcbiAgICAgICAge1xuICAgICAgICAgICAgZmxnOiB0aGlzLmZsZyxcbiAgICAgICAgICAgIHVpZDogY3VydWlkLFxuICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbCxcbiAgICAgICAgICAgIGxvYzogbG9jLFxuICAgICAgICAgICAgc2lkOiBzaWRcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IGAke3VybH0mZmxnPSR7ci5mbGd9JnVpZD0ke3IudWlkfSZjaGFubmVsPSR7ci5jaGFubmVsfSZsb2M9JHtyLmxvY30mc2lkPSR7ci5zaWR9YDtcbiAgICAgICAgdGhpcy5wb3N0YmooYXJncywgbnVsbCwgXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6IChyZXF1ZXN0OiBMYXlhLkh0dHBSZXF1ZXN0KSA9PiBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIue7n+iuoeWujOaIkCA6XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi57uf6K6h5aSx6LSlOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLplJnor6/mtojmga86XCIsIHJlcXVlc3QuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBleHBvc3VyZSgpIHtcblxuICAgICAgICB2YXIgZCA9IHRoaXMuZXhwb3N1cmVEYXRhKCk7XG4gICAgICAgIGlmIChkLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHZhciB1cmwgPSBcImh0dHBzOi8vYXBpLnl6MDYxLmNvbS9leHBvc3VyZVwiO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IFd4QXBpLnF1ZXJ5Y2hhbm5lbDtcbiAgICAgICAgaWYgKCFjaGFubmVsKSBjaGFubmVsID0gXCJvd25cIjtcbiAgICAgICAgdmFyIHIgPVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IGQsXG4gICAgICAgICAgICAgICAgZ2ZsZzogdGhpcy5mbGcsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbFxuICAgICAgICAgICAgfVxuICAgICAgICB2YXIgYXJncyA9IEpTT04uc3RyaW5naWZ5KHIpO1xuICAgICAgICB0aGlzLnBvc3Riaih1cmwsIGFyZ3MsIFxuICAgICAgICB7XG4gICAgICAgICAgICBjb21wbGV0ZTogKHJlcXVlc3Q6IExheWEuSHR0cFJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEuc3RhdHVzID09IDEpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmm53lhYnmiJDlip8gOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pud5YWJ5aSx6LSlOlwiLCByZXF1ZXN0LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKHJlcXVlc3QpID0+IFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6ZSZ6K+v5raI5oGvOlwiLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuQ2xlcmFEYXRhKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBleHBvc3VyZURhdGEoKVxuICAgIHtcbiAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0gfHwgIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJDXCJdLmxvY2F0aW9uX2lkID09IHVuZGVmaW5lZCljb250aW51ZTtcbiAgICAgICAgICAgIHZhciBjID0geyBhZF9pZDogUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQ1wiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtICE9IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5qaWVzdWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkpTXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiSlNcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIGMyID0geyBhZF9pZDogUmVjb21tZW5kLmppZXN1YW5EYXRhW2ldLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOlJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJGSFwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmppZXN1YW5EYXRhW2ldLnNob3dudW0udG9TdHJpbmcoKSB9XG4gICAgICAgICAgICBpZihSZWNvbW1lbmQuamllc3VhbkRhdGFbaV0uc2hvd251bSAhPSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChjMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmdkeXhEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXSB8fCAhUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkdEWVhcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiBSZWNvbW1lbmQuZ2R5eERhdGFbaV0uYWRfaWQudG9TdHJpbmcoKSwgbG9jYXRpb25faWQ6UmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkdEWVhcIl0ubG9jYXRpb25faWQudG9TdHJpbmcoKSxudW06IFJlY29tbWVuZC5nZHl4RGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmdkeXhEYXRhW2ldLnNob3dudW0gIT0gMClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJCXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICB2YXIgcyA9IHsgYWRfaWQ6IFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhW2ldLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOlJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJCXCJdLmxvY2F0aW9uX2lkLnRvU3RyaW5nKCksbnVtOiBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YVtpXS5zaG93bnVtLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgaWYoUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGFbaV0uc2hvd251bSAhPSAwKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBDbGVyYURhdGEoKSB7XG4gICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJDXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQ1wiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhW2ldLnNob3dudW0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5qaWVzdWFuRGF0YS5sZW5ndGg7aSsrKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZighUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkpTXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiSlNcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YVtpXS5zaG93bnVtID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBSZWNvbW1lbmQuZ2R5eERhdGEubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYoIVJlY29tbWVuZC5yZWNvbW1lbmREaWNbXCJHRFlYXCJdIHx8ICFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXS5sb2NhdGlvbl9pZCA9PSB1bmRlZmluZWQpY29udGludWU7XG4gICAgICAgICAgICB2YXIgcyA9IHsgYWRfaWQ6IFJlY29tbWVuZC5nZHl4RGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiR0RZWFwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmdkeXhEYXRhW2ldLnNob3dudW0udG9TdHJpbmcoKSB9XG4gICAgICAgICAgICBSZWNvbW1lbmQuY2Fpbml4aWh1YW5EYXRhW2ldLnNob3dudW0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKCFSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXSB8fCAhUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkJcIl0ubG9jYXRpb25faWQgPT0gdW5kZWZpbmVkKWNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiBSZWNvbW1lbmQuYmFva3VhbnlvdXhpRGF0YVtpXS5hZF9pZC50b1N0cmluZygpLCBsb2NhdGlvbl9pZDpSZWNvbW1lbmQucmVjb21tZW5kRGljW1wiQlwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLG51bTogUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGFbaV0uc2hvd251bS50b1N0cmluZygpIH1cbiAgICAgICAgICAgIFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhW2ldLnNob3dudW0gPSAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGJhbm5lckltYWc6IExheWEuSW1hZ2U7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyaW5kZXggPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIGFwcElkO1xuICAgIHByaXZhdGUgc3RhdGljIHBhdGg7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWRfaWQ7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWlnaHQ6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBzaG93T3BlbkhhbmRlcigpXG4gICAge1xuXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTaG93QmFubmVySW1hZyhjYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgICAgIC8vOTYwKjMzNFxuICAgICAgICBjb25zb2xlLmxvZyhcIlNob3dCYW5uZXJJbWFnXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYmFubmVyX2RhdGEpIHJldHVybjtcbiAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuYmFubmVySW1hZykge1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJpbmRleCArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFubmVyaW5kZXggPj0gdGhpcy5iYW5uZXJfZGF0YS5sZW5ndGgpIHRoaXMuYmFubmVyaW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnNraW4gPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2ltZztcbiAgICAgICAgICAgIHRoaXMuYXBwSWQgPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2FwcGlkO1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9wYXRoO1xuICAgICAgICAgICAgdGhpcy5hZF9pZCA9IHRoaXMuYmFubmVyX2RhdGFbdGhpcy5iYW5uZXJpbmRleF0uYWRfaWQ7XG4gICAgICAgICAgICAvLyAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGU9dHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZyA9IG5ldyBMYXlhLkltYWdlKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIm5ldyBMYXlhLkltYWdlXCIpO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5iYW5uZXJJbWFnKTtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5za2luID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pbWc7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IExheWEuc3RhZ2Uud2lkdGggLyA5NjAgKiAzMzQ7XG4gICAgICAgICAgICB0aGlzLmJhbm5lckltYWcud2lkdGggPSBMYXlhLnN0YWdlLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCIgdGhpcy5iYW5uZXJJbWFnLmhlaWdodDpcIiArIHRoaXMuYmFubmVySW1hZy5oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnggPSAwO1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnpPcmRlciA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIGFkUG9zaXRpb24gPSBZUVNkay5hZFBvc2l0aW9uRGljLmdldFZhbHVlKFwiYmFubmVyXCIpO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbl9pZCA9IGFkUG9zaXRpb24ubG9jYXRpb25faWQ7XG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLm9uV2VpWGluICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcbiAgICAgICAgICAgICAgICAgICAgXCJhcHBJZFwiOiB0aGlzLmFwcElkLCBcInBhdGhcIjogdGhpcy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaTjeS9nOaIkOWKnyFcIiArIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBZUVNkay5yZXBvcnRhZCh0aGlzLmFkX2lkLCBsb2NhdGlvbl9pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZhaWw6IChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKHRoaXMuYWRfaWQsIGxvY2F0aW9uX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5pON5L2c5aSx6LSlXCIgKyByZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcElkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9hcHBpZDtcbiAgICAgICAgdGhpcy5wYXRoID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9wYXRoO1xuICAgICAgICB0aGlzLmFkX2lkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pZDtcbiAgICAgICAgdGhpcy5BZGRfQmFubmVyRGF0YSh0aGlzLmFkX2lkLnRvU3RyaW5nKCkpO1xuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoNTAwLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYW5uZXJJbWFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJJbWFnLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lciAmJiBHdWFuZ0dhby5jYW5jaGVhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soMzAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMuQmFubmVyTG9vcCk7XG4gICAgICAgIHZhciBsb29wcmF0ZSA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoNywxMCkqMTAwMDtcbiAgICAgICAgTGF5YS50aW1lci5sb29wKGxvb3ByYXRlLCB0aGlzLCB0aGlzLkJhbm5lckxvb3ApO1xuICAgIH1cblxuICAgIHN0YXRpYyBCYW5uZXJMb29wKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmJhbm5lckltYWcpIHtcbiAgICAgICAgICAgIHRoaXMuYmFubmVyaW5kZXggKz0gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lcmluZGV4ID49IHRoaXMuYmFubmVyX2RhdGEubGVuZ3RoKSB0aGlzLmJhbm5lcmluZGV4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuYmFubmVySW1hZy5za2luID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9pbWc7XG4gICAgICAgICAgICB0aGlzLmFwcElkID0gdGhpcy5iYW5uZXJfZGF0YVt0aGlzLmJhbm5lcmluZGV4XS5hZF9hcHBpZDtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHRoaXMuYmFubmVyX2RhdGFbdGhpcy5iYW5uZXJpbmRleF0uYWRfcGF0aDtcbiAgICAgICAgICAgIHRoaXMuYWRfaWQgPSB0aGlzLmJhbm5lcl9kYXRhW3RoaXMuYmFubmVyaW5kZXhdLmFkX2lkO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgSGlkZUJhbm5lckltYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5iYW5uZXJJbWFnICYmIHRoaXMuYmFubmVySW1hZy52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmJhbm5lckltYWcudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIEFkZF9CYW5uZXJEYXRhKGFkX2lkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYmFubmVyX2RhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuYmFubmVyX2RhdGFbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuYWRfaWQgPT0gYWRfaWQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm51bSA9IChOdW1iZXIoZWxlbWVudC5udW0pICsgMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGQgPSB7IGFkX2lkOiBhZF9pZCwgbG9jYXRpb25faWQ6IHRoaXMuYWRQb3NpdGlvbkRpY1tcImJhbm5lclwiXS5sb2NhdGlvbl9pZC50b1N0cmluZygpLCBudW06IFwiMVwiIH07XG4gICAgICAgIHRoaXMuYmFubmVyX2RhdGEucHVzaChkKTtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgU19kYXRhID0gW107XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgaW5pdFNfZGF0YSgpIHtcblxuICAgIC8vICAgICBpZiAoIXRoaXMuc2l3YW5ndHVpamlhbikgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5zaXdhbmd0dWlqaWFuLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIC8vICAgICAgICAgdmFyIHMgPSB7IGFkX2lkOiB0aGlzLnNpd2FuZ3R1aWppYW5baW5kZXhdLmFkX2lkLnRvU3RyaW5nKCksIGxvY2F0aW9uX2lkOiB0aGlzLmFkUG9zaXRpb25EaWMuZ2V0VmFsdWUoXCJTXCIpLmxvY2F0aW9uX2lkLnRvU3RyaW5nKCksIG51bTogXCIwXCIgfTtcbiAgICAvLyAgICAgICAgIHRoaXMuU19kYXRhLnB1c2gocyk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgLy9jb25zb2xlLmxvZyhcIuWIt+aWsOatu+S6oeaOqOiNkOaVsOaNrjpcIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuU19kYXRhKSlcbiAgICAvLyB9XG5cblxuICAgIC8vIHB1YmxpYyBzdGF0aWMgaXNoYXZlRGF0YSA9IGZhbHNlO1xuICAgIC8vIHByaXZhdGUgc3RhdGljIHRlbXBDb3VudCA9IDA7XG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgSnVuZGdlRGF0ZSgpIHtcbiAgICAvLyAgICAgdGhpcy50ZW1wQ291bnQrKztcbiAgICAvLyAgICAgaWYgKHRoaXMudGVtcENvdW50ID09IDIpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuaXNoYXZlRGF0YSA9IHRydWU7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG59IiwiaW1wb3J0IENoaWxkQmFzZVZpZXcgZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvbXZjL0NoaWxkQmFzZVZpZXdcIjtcclxuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFvS3VhbkdhbWVWaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBpdGVtXzA6Q3BhSXRlbTtcclxuICAgIGl0ZW1fMTpDcGFJdGVtO1xyXG4gICAgaXRlbV8yOkNwYUl0ZW07XHJcbiAgICBpdGVtXzM6Q3BhSXRlbTtcclxuICAgIHQwOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIHRoaXMudDAgPSB0aGlzLmdldFRyYW5zaXRpb24oIFwidDBcIiApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUmVmcmVzaEJLWVgoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gNTAwMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWZyZXNoQktZWCggdHJ1ZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGtleSA9IDA7XHJcbiAgICBwcml2YXRlIF9pc3RhcnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgUmVmcmVzaEJLWVgoIGlzYW5tbzpib29sZWFuID0gZmFsc2UgKSAgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnJlY29tbWVuZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB2YXIgZGF0YXMgPSBSZWNvbW1lbmQuZ2R5eERhdGE7XHJcbiAgICAgICAgdmFyIGl0ZW06Q3BhSXRlbTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5ICsgaSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjdXJkYXRhID0gZGF0YXNbdGhpcy5rZXkgKyBpXTsgIFxyXG4gICAgICAgICAgICBpdGVtID0gdGhpc1tcIml0ZW1fXCIraV07XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIGN1cmRhdGEgKTtcclxuICAgICAgICAgICAgaWYgKGN1cmRhdGEgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGN1cmRhdGEuc2hvd251bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmtleSArPSA0O1xyXG4gICAgICAgIGlmICh0aGlzLmtleSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICB0aGlzLmtleSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzdGFydCA9IHRydWU7XHJcbiAgICAgICAgaWYoIGlzYW5tbyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnQwLnBsYXkoIG51bGwsMSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tIFwiLi4vLi4vLi4vLi4vZnJhbWV3b3Jrcy9tdmMvQmFzZVZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vaXRlbS9DcGFJdGVtXCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IHsgVWlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21hbmFnZXJzL1VpTWFuYWdlclwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hvdXRpUGFuVmlldyBleHRlbmRzIEJhc2VWaWV3IGltcGxlbWVudHMgSVRpbWVyXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJDaG91dGlQYW5WaWV3XCI7XHJcbiAgICBidG5fcmV0dXJuOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBsaXN0XzE6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBidG5faml4dWdhbWU6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHByaXZhdGUgX25vd0xpc3QwOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX25vd0xpc3QxOlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcclxuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImNob3V0aXBhblZpZXdcIiApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5saXN0XzEuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8xLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdDEsbnVsbCxmYWxzZSApO1xyXG5cclxuICAgICAgICB0aGlzLl9ub3dMaXN0MCA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLl9ub3dMaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QwLmxlbmd0aDtcclxuICAgICAgICB0aGlzLmxpc3RfMS5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QxLmxlbmd0aDtcclxuICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMuYnRuX3JldHVybixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5faml4dWdhbWUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0MC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93TGlzdDBbaW5kZXhdICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QxKCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QxLmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0MVtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkb3duY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0aW1lb3V0Q2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzZG93biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnBlcmNYO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5pbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmQsIFJlY29tbWVuZEl0ZW0gfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL2l0ZW0vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgVGltZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL1RpbWVyU2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRG93bnNWaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBwcml2YXRlIF9ub3dMaXN0OlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcclxuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXIoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcyx0aGlzLmRvd25jbGljayApO1xyXG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXIoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZG93biA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc2Rvd24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNkb3duID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5wZXJjWDtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2ZsdXNodGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBkaXI6Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3d2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc1N0YXJ0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lICYmIHRoaXMuX25vd0xpc3QgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1goIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdCggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCB0aGlzLl9ub3dMaXN0Lmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0W2luZGV4XSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHlxaG9tZWRhdGFIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICB0aGlzLl9ub3dMaXN0ID0gUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd0xpc3QubGVuZ3RoO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuX25vd0xpc3QubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xpc3RbaV0uc2hvd251bSArKztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmdldEluYXN0YW5jZSgpLnJlbW92ZVVwZGF0ZVRhcmdldCh0aGlzKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRXZlbnRcclxue1xyXG4gICAgc3RhdGljIFlRSG9tZURhdGE6c3RyaW5nID0gXCJDcGFFdmVudF9ZUUhvbWVEYXRhXCI7XHJcbn0iLCJpbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi9ZUVNka1wiO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvZXZlbnRzL0V2ZW50VXRpbHNcIjtcclxuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgcmVjb21tZW5kUGFuXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKGRhdGE6T2JqZWN0KVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZ2FtZV9mbGcgPSBkYXRhW1wiZ2FtZV9mbGdcIl07XHJcbiAgICAgICAgdGhpcy5nYW1lX2lkID0gZGF0YVtcImdhbWVfaWRcIl07XHJcbiAgICAgICAgdGhpcy5nYW1lX25hbWUgPSBkYXRhW1wiZ2FtZV9uYW1lXCJdO1xyXG4gICAgICAgIHRoaXMuaWQgPSBkYXRhW1wiaWRcIl07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9mbGcgPSBkYXRhW1wibG9jYXRpb25fZmxnXCJdO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25faWQgPSBkYXRhW1wibG9jYXRpb25faWRcIl07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbl9uYW1lID0gZGF0YVtcImxvY2F0aW9uX25hbWVcIl07XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJfdHlwZSA9IGRhdGFbXCJtYXR0ZXJfdHlwZVwiXTtcclxuICAgIH1cclxuICAgIGdhbWVfZmxnOnN0cmluZztcclxuICAgIGdhbWVfaWQ6bnVtYmVyO1xyXG4gICAgZ2FtZV9uYW1lOnN0cmluZztcclxuICAgIGlkOnN0cmluZztcclxuICAgIGxvY2F0aW9uX2ZsZzpzdHJpbmc7XHJcbiAgICBsb2NhdGlvbl9pZDpudW1iZXI7XHJcbiAgICBsb2NhdGlvbl9uYW1lOnN0cmluZztcclxuICAgIG1hdHRlcl90eXBlOnN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZFxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb21tZW5kLkluaXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldGRhdGEgPSBmYWxzZTtcclxuICAgIHN0YXRpYyBJbml0RGF0YSgpXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb21tZW5kLmNhaW5peGlodWFuRGF0YSA9IFJlY29tbWVuZC5HZXRDYWlOaVhpYUh1YW5EYXRhcygpO1xyXG4gICAgICAgIFJlY29tbWVuZC5qaWVzdWFuRGF0YSA9IFJlY29tbWVuZC5HZXRKSWVTdWFuRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQuZ2R5eERhdGEgPSBSZWNvbW1lbmQuR2V0R0RZWERhdGFzKCk7XHJcbiAgICAgICAgUmVjb21tZW5kLmJhb2t1YW55b3V4aURhdGEgPSBSZWNvbW1lbmQuR2V0QmFvS3VhbllvdVhpRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQubW9yZURhdGEgPSBSZWNvbW1lbmQuR2V0TW9yZURhdGFzKCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gWVFTZGsuYWRQb3NpdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFJlY29tbWVuZC5yZWNvbW1lbmREaWNbWVFTZGsuYWRQb3NpdGlvbltrZXldLmxvY2F0aW9uX2ZsZ10gID0gbmV3IHJlY29tbWVuZFBhbihZUVNkay5hZFBvc2l0aW9uW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgWVFTZGsuR2V0U2hhcmUoKTtcclxuICAgICAgICBSZWNvbW1lbmQuZ2V0ZGF0YSA9IHRydWU7XHJcbiAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBDcGFFdmVudC5ZUUhvbWVEYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlY29tbWVuZERpYyA9IHt9O1xyXG4gICAgc3RhdGljIGNhaW5peGlodWFuRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgIHN0YXRpYyBiYW9rdWFueW91eGlEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIGdkeXhEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIGppZXN1YW5EYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgc3RhdGljIG1vcmVEYXRhOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHN0YXRpYyBHZXRDYWlOaVhpYUh1YW5EYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighWVFTZGsuY2Fpbml4aWh1YW4pcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IFlRU2RrLmNhaW5peGlodWFuLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKFlRU2RrLmNhaW5peGlodWFuW2ldKSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldLnNob3dudW0gKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIHN0YXRpYyBHZXRNb3JlRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIVlRU2RrLnRjKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay50Yy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay50Y1tpXSkpO1xyXG4gICAgICAgICAgICBpdGVtc1tpXS5zaG93bnVtICsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEJhb0t1YW5Zb3VYaURhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFZUVNkay5iYW9rdWFueW91eGkxKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay5iYW9rdWFueW91eGkxLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKFlRU2RrLmJhb2t1YW55b3V4aTFbaV0pKTtcclxuICAgICAgICAgICAgaXRlbXNbaV0uc2hvd251bSArKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBHZXRKSWVTdWFuRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIVlRU2RrLmpzKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBZUVNkay5qcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay5qc1tpXSkpO1xyXG4gICAgICAgICAgICBpdGVtc1tpXS5zaG93bnVtICsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEdEWVhEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighWVFTZGsuZ2R5eSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgWVFTZGsuZ2R5eS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShZUVNkay5nZHl5W2ldKSk7XHJcbiAgICAgICAgICAgIGl0ZW1zW2ldLnNob3dudW0gKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZEl0ZW1cclxue1xyXG4gICAgY29uc3RydWN0b3IoRGF0YTpPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZF9hcHBpZCA9IERhdGFbXCJhZF9hcHBpZFwiXTtcclxuICAgICAgICB0aGlzLmFkX2NvdW50ID0gRGF0YVtcImFkX2NvdW50XCJdO1xyXG4gICAgICAgIHRoaXMuYWRfZGV2aWNlID0gRGF0YVtcImFkX2RldmljZVwiXTtcclxuICAgICAgICB0aGlzLmFkX2RvdCA9IERhdGFbXCJhZF9kb3RcIl07XHJcbiAgICAgICAgdGhpcy5hZF9pZCA9IERhdGFbXCJhZF9pZFwiXTtcclxuICAgICAgICB0aGlzLmFkX2ltZyA9IERhdGFbXCJhZF9pbWdcIl07XHJcbiAgICAgICAgdGhpcy5hZF9uYW1lID0gRGF0YVtcImFkX25hbWVcIl07XHJcbiAgICAgICAgdGhpcy5hZF9wYXRoID0gRGF0YVtcImFkX3BhdGhcIl07XHJcbiAgICB9XHJcbiAgICBhZF9hcHBpZDpzdHJpbmc7XHJcbiAgICBhZF9jb3VudDpudW1iZXI7XHJcbiAgICBhZF9kZXZpY2U6bnVtYmVyO1xyXG4gICAgYWRfZG90Om51bWJlcjtcclxuICAgIGFkX2lkOm51bWJlcjtcclxuICAgIGFkX2ltZzpzdHJpbmc7XHJcbiAgICBhZF9uYW1lOnN0cmluZztcclxuICAgIGFkX3BhdGg6c3RyaW5nO1xyXG4gICAgc2hvd251bSA9IDA7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWNvbW1lbmRWaWV3XHJcbntcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSB7IFxyXG4gICAgICAgIFxyXG4gICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vaXRlbS9DcGFJdGVtXCI7XHJcbmltcG9ydCBUaW1lclNlcnZpY2UgZnJvbSBcIi4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBEZWJ1Z2VyIGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL0RlYnVnZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoaXdhbnR1aWppYW5WaWV3IGV4dGVuZHMgQ2hpbGRCYXNlVmlldyBpbXBsZW1lbnRzIElUaW1lclxyXG57XHJcbiAgICBcclxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcclxuICAgIHByaXZhdGUgX25vd2xpc3Q6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfaXNTdGFydDpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYW5tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzZG93bjpib29sZWFuO1xyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdF8wLnNldFZpcnR1YWwoKTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QsbnVsbCxmYWxzZSApO1xyXG4gICAgICAgIHRoaXMuX25vd2xpc3QgPSBSZWNvbW1lbmQuamllc3VhbkRhdGE7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd2xpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd2xpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLl9ub3dsaXN0Lmxlbmd0aDtpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd2xpc3RbaV0uc2hvd251bSArKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9pc1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzZG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8wLnNjcm9sbFBhbmUucGVyY1k7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0sdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93bGlzdCAmJiB0aGlzLl9ub3dsaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1koIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLmluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG59IiwiaW1wb3J0IEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9CYXNlVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9pdGVtL0NwYUl0ZW1cIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBVaU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbWFuYWdlcnMvVWlNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUdWlqaWFuVmlldyBleHRlbmRzIEJhc2VWaWV3IFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiVHVpamlhblZpZXdcIjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgcHJpdmF0ZSBfbm93bGlzdDpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJ0dWlqaWFuVmlld1wiICk7IFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5fbm93bGlzdCA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuX25vd2xpc3QubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lciggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5jbG9zZSggVHVpamlhblZpZXcgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBDaGlsZEJhc2VWaWV3IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL212Yy9DaGlsZEJhc2VWaWV3XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZEl0ZW0sIFJlY29tbWVuZCB9IGZyb20gXCIuLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uLy4uL1Nka1wiO1xyXG5pbXBvcnQgeyBZUVNkayB9IGZyb20gXCIuLi8uLi9ZUVNka1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFVpTWFuYWdlciB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9tYW5hZ2Vycy9VaU1hbmFnZXJcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENwYUl0ZW0gZXh0ZW5kcyBDaGlsZEJhc2VWaWV3IFxyXG57XHJcbiAgICBpbWdfdGlwOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0X3dvcmQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHR4dF93b3JkMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgcHJpdmF0ZSBfdm86UmVjb21tZW5kSXRlbTtcclxuICAgIHByaXZhdGUgaXNwZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHVibGljIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcImNhcEl0ZW1cIjtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCB0aGlzLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uYnRuY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uYnRuY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3ZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhOlJlY29tbWVuZEl0ZW0gPSB0aGlzLl92bztcclxuICAgICAgICAgICAgdmFyIGFwcGlkID0gZGF0YS5hZF9hcHBpZDtcclxuICAgICAgICAgICAgdmFyIHBhdGggPSBkYXRhLmFkX3BhdGg7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbSA9IHtcImFwcElkXCI6YXBwaWQudG9TdHJpbmcoKSxcInBhdGhcIjpwYXRoLnRvU3RyaW5nKCl9O1xyXG4gICAgICAgICAgICBpZihMYXlhLkJyb3dzZXIub25XZWlYaW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi54K55Ye76Lez6L2s5Yiw5ri45oiPXCIgKyBkYXRhLmFkX25hbWUsXCIxXCIpO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5uYXZpZ2F0ZVRvTWluaVByb2dyYW0oXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6YXBwaWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXRoOnBhdGgudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOnJlcz0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+aIkOWKn1wiLFwiMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uX2lkID0gUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0ubG9jYXRpb25faWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKGRhdGEuYWRfaWQsbG9jYXRpb25faWQsdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmYWlsOnJlcz0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIui3s+i9rOWIsOa4uOaIj+Wksei0pVwiLFwiMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uX2lkID0gUmVjb21tZW5kLnJlY29tbWVuZERpY1tcIkNcIl0ubG9jYXRpb25faWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFlRU2RrLnJlcG9ydGFkKGRhdGEuYWRfaWQsbG9jYXRpb25faWQsZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5pc3BlbmNob3V0aXBhbiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihXaW5kb3dNYW5hZ2VyLkluc3RhbmNlLmN1ck9wZW5lZFZpZXcubmFtZSA9PSBcIkhvbWVXaW5kb3dcIil0aGlzLk9uT3BlbkN0Vmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0RhdGEoIGRhdGE6UmVjb21tZW5kSXRlbSxpc29wZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNwZW5jaG91dGlwYW4gPSBpc29wZW5jaG91dGlwYW47XHJcbiAgICAgICAgdGhpcy5fdm8gPSBkYXRhO1xyXG4gICAgICAgIGlmKCBkYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZF9pY29uLnVybCA9IGRhdGEuYWRfaW1nO1xyXG4gICAgICAgICAgICBpZiggdGhpcy50eHRfd29yZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHh0X3dvcmQudGV4dCA9IGRhdGEuYWRfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5pbWdfdGlwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfdGlwLnZpc2libGUgPSBkYXRhLmFkX2RvdCA9PSAxP3RydWU6ZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMudHh0X3dvcmQxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50eHRfd29yZDEudGV4dCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMjM1NDcwLDE1NjE0MzApLnRvU3RyaW5nKCkgKyBcIuS6uueOqVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+e1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmtleXMgPSBuZXcgQXJyYXk8VEtleT4oKTtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBBcnJheTxUVmFsdWU+KCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMga2V5czogQXJyYXk8VEtleT47XHJcbiAgICBwdWJsaWMgdmFsdWVzOiBBcnJheTxUVmFsdWU+O1xyXG4gICAgcHVibGljIGdldCBjb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmtleXMubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZChrZXk6IFRLZXksIHZhbHVlOiBUVmFsdWUpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZShrZXk6IFRLZXkpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmtleXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFZhbHVlKGtleTogVEtleSk6IFRWYWx1ZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5rZXlzLmluZGV4T2Yoa2V5KTtcclxuICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29udGFpbktleShrZXk6IFRLZXkpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWluVmFsdWUodmFsdWU6IFRWYWx1ZSkge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMudmFsdWVzLmluZGV4T2YodmFsdWUpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmtleXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLnZhbHVlcy5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG5cclxufSIsIlxyXG4vKlxyXG4qIOWFrOWFseaOpeWPo1xyXG4qL1xyXG5leHBvcnQgbW9kdWxlIEdhbWVVdGlscyB7XHJcbiAgICAvKipcclxuICAgICAqIOmaj+acuuWHveaVsCjov5Tlm57mlbTlnospXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByYW5kUmFuZ2VpbnQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyICB7XHJcbiAgICAgICAgdmFyIHZhbHVlOm51bWJlcj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xyXG4gICAgICAgIGlmKHZhbHVlPm1heCl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmo/mnLrlh73mlbAoIOS4jeWPluaVtCApXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByYW5kUmFuZ2VmbG9hdChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIgIHtcclxuICAgICAgICB2YXIgdmFsdWU6bnVtYmVyID0gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSArIG1pbjtcclxuICAgICAgICBpZih2YWx1ZT5tYXgpe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG1heDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRUZXhieVBrZ0FuZE5hbWUoIHBrZ25hbWU6c3RyaW5nLHRleG5hbWU6c3RyaW5nICk6TGF5YS5UZXh0dXJlXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVpcGFja2FnZTpmYWlyeWd1aS5VSVBhY2thZ2UgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0QnlOYW1lKHBrZ25hbWUpO1xyXG4gICAgICAgIGlmKCB1aXBhY2thZ2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVpcGFja2FnZS5nZXRJdGVtQXNzZXRCeU5hbWUodGV4bmFtZSkgYXMgTGF5YS5UZXh0dXJlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkFBvaW505a+56LGhXHJcbiAgICAgKiBAcGFyYW0gc3RyIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvUG9pbnQoIHN0cjpzdHJpbmcgKTpMYXlhLlBvaW50XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IExheWEuUG9pbnQoIE51bWJlciggYXJyWzBdICksTnVtYmVyKCBhcnJbMV0gKSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiH5Ymy5YiG5Y+35Y+Y5oiQ5pWw5o2uKG51bWJlcilcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb3RvQXJybnVtKCBzdHI6c3RyaW5nICk6QXJyYXk8bnVtYmVyPlxyXG4gICAge1xyXG4gICAgICAgIHZhciBudW1BcnI6QXJyYXk8bnVtYmVyPj1bXTtcclxuICAgICAgICBpZiAoc3RyID09IFwiXCIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVtQXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpO2k8YXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbnVtQXJyLnB1c2goIE51bWJlciggYXJyW2ldICkgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bUFycjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNrihzdHJpbmcpXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b0FycnN0ciggc3RyOnN0cmluZyApOkFycmF5PHN0cmluZz5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KFwiO1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNriggeyBrZXk6MSx2YWx1ZToxIH0gKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9PYmooIHN0cjpzdHJpbmcgKTphbnlcclxuICAgIHtcclxuICAgICAgICB2YXIgb2JqOmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCI7XCIgKTtcclxuICAgICAgICBvYmoua2V5ID0gYXJyWzBdO1xyXG4gICAgICAgIG9iai52YWx1ZSA9IGFyclsxXTtcclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuWIh+WJsnN0ciovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9BcnIoIHN0cjpzdHJpbmcgKTpBcnJheTxzdHJpbmc+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq5YiH5Ymyc3RyKCAxOjF8MToxICkgdG8gQXJyYXk8eyBrZXk6MSx2YWx1ZToxIH0+ICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9BcnIxKCBzdHI6c3RyaW5nICk6QXJyYXk8YW55PlxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXNsdXRBcnI6QXJyYXk8YW55Pj1bXTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwifFwiICk7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGk9MDtpPGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoIFwiO1wiICk7XHJcbiAgICAgICAgICAgIHJlc2x1dEFyci5wdXNoKCB7IGtleTppdGVtYXJyWzBdLHZhbHVlOml0ZW1hcnJbMV0gfSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzbHV0QXJyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRzdHJ0b09iaiggc3RyOnN0cmluZyApOmFueVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXN1bHRvYmo6YW55ID0ge307XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpPTA7aTxhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWFycjpBcnJheTxzdHJpbmc+ID0gYXJyW2ldLnNwbGl0KCBcIjtcIiApO1xyXG4gICAgICAgICAgICByZXN1bHRvYmpbaXRlbWFyclswXV0gPSBpdGVtYXJyWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0b2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmVyc2lvbih2MSwgdjIpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHYxID0gdjEuc3BsaXQoJy4nKTtcclxuICAgICAgICB2MiA9IHYyLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgodjEubGVuZ3RoLCB2Mi5sZW5ndGgpO1xyXG4gICAgICAgIHdoaWxlICh2MS5sZW5ndGggPCBsZW4pIHtcclxuICAgICAgICAgICAgdjEucHVzaCgnMCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAodjIubGVuZ3RoIDwgbGVuKSB7XHJcbiAgICAgICAgICAgIHYyLnB1c2goJzAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBudW0xID0gcGFyc2VJbnQodjFbaV0pO1xyXG4gICAgICAgICAgICBjb25zdCBudW0yID0gcGFyc2VJbnQodjJbaV0pO1xyXG4gICAgICAgICAgICBpZiAobnVtMSA+IG51bTIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG51bTEgPCBudW0yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgbW9kdWxlIFRpbWVVdGlscyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIgv5pelIOWwj+aXtjrliIbpkp9cclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gdGhpcy5nZXRUd28oZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIi9cIiArIHRoaXMuZ2V0VHdvKGRhdGUuZ2V0RGF0ZSgpKSArIFwiIFwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRIb3VycygpKSArIFwiOlwiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnIgv5pelXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRhMSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICBzdHIgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIuaciFwiICsgZGF0ZS5nZXREYXRlKCkgKyBcIuaXpVwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubTmnIjml6VcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFllYXJNb250aERhdGUodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgc3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCIuXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIi5cIiArIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubQt5pyILeaXpVxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0WWVhck1vbnRoRGF0ZTEodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlICogMTAwMCk7XHJcbiAgICAgICAgdmFyIG1vbnRoOiBzdHJpbmcgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgPj0gMTAgPyAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKSA6IFwiMFwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgICAgIHZhciBkYXRlczogc3RyaW5nID0gZGF0ZS5nZXREYXRlKCkgPj0gMTAgPyBkYXRlLmdldERhdGUoKS50b1N0cmluZygpIDogXCIwXCIgKyBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICBzdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBkYXRlcztcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gTFhhbmRKWFRpbWVUeXBlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjDnp5JcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgNjApIHtcclxuICAgICAgICAgICAgc3RyID0gTWF0aC5mbG9vcih2YWx1ZSkgKyBcIuenklwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCA2MCAqIDYwKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBob3VyOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGhvdXIgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjAgLyA2MCk7XHJcbiAgICAgICAgICAgIHN0ciA9IGhvdXIgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgICAgICBzdHIgKz0gTWF0aC5mbG9vcigodmFsdWUgLSBob3VyICogNjAgKiA2MCkgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMjQ6NTk6NTlcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgPj0gMTAgPyAoaG91cnMgKyBcIjpcIikgOiAoXCIwXCIgKyBob3VycyArIFwiOlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyA+PSAxMCA/IChtaW51dGVzICsgXCI6XCIpIDogKFwiMFwiICsgbWludXRlcyArIFwiOlwiKTtcclxuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XHJcbiAgICAgICAgc3RyICs9IHNlY29uZCA+PSAxMCA/IChzZWNvbmQgKyBcIlwiKSA6IChcIjBcIiArIHNlY29uZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagvOW8j+WMluaXtumXtFxyXG4gICAgICogQHBhcmFtIHRpbWUg56eSXHJcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjI05bCP5pe2NTnliIY1OeenkiBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWUxKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5bCP5pe2MjTliIYxMOenklxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZTUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIGlmKG1pbnV0ZXM+MClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhjU556eSXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIGlmKGRheT4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoaG91cnM+MCl7XHJcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgaWYobWludXRlcz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcclxuICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe277yIIOWPquS/neeVmeS4pOS4qiDvvIlcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWU2KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgaWYgKGRheT4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwKSAvIDM2MDApO1xyXG4gICAgICAgIGlmIChob3Vycz4wKXtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzICsgXCLlsI/ml7ZcIjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgICAgIGlmKG1pbnV0ZXM+MCl7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA8IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmNlaWwodGltZSAlIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAqIOagvOW8j+WMluaXtumXtFxyXG4gKiBAcGFyYW0gdGltZSDnp5JcclxuICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4gKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lMyh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcclxuICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG5cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhlwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4qIOagvOW8j+WMluaXtumXtFxyXG4qIEBwYXJhbSB0aW1lIOenklxyXG4qIEByZXR1cm4g6L+U5ZueMeWkqTI05bCP5pe2NTnliIZcclxuKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUaW1lNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRpbWUgPiA4NjQwMCkge1xyXG4gICAgICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDM2MDApIHtcclxuICAgICAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+IDYwKSB7XHJcbiAgICAgICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICAgICAgc3RyICs9IG1pbnV0ZXMgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiog5qC85byP5YyW5pe26Ze0XHJcbiogQHBhcmFtIHRpbWUg56eSXHJcbiogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4qL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWU0QXJyKHRpbWU6IG51bWJlcik6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHZhciBhcnJUaW1lOkFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIC8vIGlmICh0aW1lID49IDg2NDAwKSB7XHJcbiAgICAgICAgLy8gICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICAvLyAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhkYXkpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gMzYwMCkge1xyXG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XHJcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcoaG91cnMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbWUgPj0gNjApIHtcclxuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSA4NjQwMCAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKG1pbnV0ZXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJUaW1lO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VHdvKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pel5pyf6L2s5pe26Ze05oizXHJcbiAgICAgKiBAcGFyYW0gc3RyIDIwMTgtMS0xIFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZGF0ZXRvVGltZShzdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIERhdGUucGFyc2Uoc3RyKSAvIDEwMDA7XHJcbiAgICB9XHJcbn0iXX0=