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) { leftCoin = nextDrawal - this.totalCoin; if (leftCoin > 0) str = "\u8FD8\u5DEE" + (leftCoin / 10000).toFixed(3) + "\u91D1\u989D\u53EF\u63D0\u73B0"; } this.tiplab.text = str; this.tiplab.visible = Boolean(nextDrawal); return [2 /*return*/]; } }); }); }; return RedDrawal; }(Laya.Script)); exports.default = RedDrawal; },{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/model/RedpacketModel":15}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var layaMaxUI_1 = require("./ui/layaMaxUI"); var AdManager_1 = require("./sdk/AdManager"); var RedpacketModel_1 = require("./sdk/model/RedpacketModel"); var AppSdk_1 = require("./sdk/AppSdk"); var TeaSdk_1 = require("./sdk/TeaSdk"); var EventCenter_1 = require("./event/EventCenter"); var EventEnum_1 = require("./event/EventEnum"); var TestScene = /** @class */ (function (_super) { __extends(TestScene, _super); function TestScene() { var _this = _super.call(this) || this; //关闭多点触控,否则就无敌了 Laya.MouseManager.multiTouchEnabled = false; console.log('---------------TestScene-------'); _this.NativeAD.visible = false; return _this; } TestScene.prototype.onEnable = function () { this.btnServer.on(Laya.Event.CLICK, this, this.openServer); this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal); this.btnDraw.on(Laya.Event.CLICK, this, this.onDraw); this.btnInvite.on(Laya.Event.CLICK, this, this.invitation); this.btnVibrate.on(Laya.Event.CLICK, this, this.onVibrate); this.btnPreloadAD.on(Laya.Event.CLICK, this, this.preloadAD); this.btnShowBanner.on(Laya.Event.CLICK, this, this.showBanner); this.btnShowFullAd.on(Laya.Event.CLICK, this, this.showFullAd); this.btnShowNativeAd.on(Laya.Event.CLICK, this, this.showNativeAd); this.btnShowInterAd.on(Laya.Event.CLICK, this, this.showInterAd); this.btnRewardAd.on(Laya.Event.CLICK, this, this.showRewardAd); this.btnRedpacket.on(Laya.Event.CLICK, this, this.openRedpacket); }; /**预加载广告 */ TestScene.prototype.preloadAD = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: console.log('---------------preloadAD-------'); return [4 /*yield*/, AdManager_1.default.I.init()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; /**显示全屏广告 */ TestScene.prototype.showFullAd = function () { console.log('---------------showFullAd-------'); AdManager_1.default.I.showFullAd(); // var ret = MyBridge.mapToString({ // data: { // "count": 2, "title": [{ "name": "nnn", "value": "nnnvalue", "default_show": 1 } // , { "name": "mmm", "value": "mmmvalue\"aasdasd" }] // } // }); // console.log("-------web--------onClick----->>cocos JS-------MyBridge.mapToString------" + JSON.stringify(ret)); }; /**显示banner */ TestScene.prototype.showBanner = function () { console.log('---------------showBanner-------'); AdManager_1.default.I.showBanner(); }; /**信息流广告 */ TestScene.prototype.showNativeAd = function () { console.log('---------------showNativeAd-------'); this.NativeAD.visible = true; }; /**插屏广告 */ TestScene.prototype.showInterAd = function () { console.log('---------------showInterAd-------'); AdManager_1.default.I.showInterAd(); }; /**激励视频广告 */ TestScene.prototype.showRewardAd = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: console.log('---------------showRewardAd-------'); return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; /**意见反馈 */ TestScene.prototype.openServer = function () { console.log('---------------openServer-------'); AppSdk_1.default.I.feedback(); }; TestScene.prototype.openRedpacket = function () { return __awaiter(this, void 0, void 0, function () { var bol; var _this = this; return __generator(this, function (_a) { bol = RedpacketModel_1.default.I.checkRedpacket(); console.log(bol + '红包获取结果:curRedpacket' + RedpacketModel_1.default.I.curRedpacket); if (bol) { //**弹出红包的界面, 暂时处理成 直接看广告获取金币 */ AdManager_1.default.I.showRewardAd(TeaSdk_1.DotKey.reward_ad).then(function (res) { return __awaiter(_this, void 0, void 0, function () { var coin; return __generator(this, function (_a) { switch (_a.label) { case 0: console.log("加金币"); return [4 /*yield*/, RedpacketModel_1.default.I.addCoin()]; case 1: coin = _a.sent(); console.log("获取了钱", coin); RedpacketModel_1.default.I.getRepacket(); //计数 /**更新基本显示 */ EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.UPDATE_COIN); return [2 /*return*/]; } }); }); }).catch(function (err) { console.log("onVideo error"); }); } return [2 /*return*/]; }); }); }; /**打开个人中心 */ TestScene.prototype.openPersonal = function () { console.log('---------------openServer-------'); AppSdk_1.default.I.personal(); }; /**邀请好友 */ TestScene.prototype.invitation = function () { AppSdk_1.default.I.invitation(); }; //震动 TestScene.prototype.onVibrate = function () { AppSdk_1.default.I.vibrate(0); }; TestScene.prototype.getProps = function (data) { var booster; var rewardNum = data.num; var type = data.type; /** * 处理游戏中的道具显示 */ // switch (type) { // case 4: // booster = BoosterType.Remove; // break; // case 6: // booster = BoosterType.Change; // break; // case 5: // booster = BoosterType.Refresh; // break; // case 7: // booster = BoosterType.RandRemove; // break; // case 3: // booster = BoosterType.Star; // break; // } // ViewManager.I.openPopwin(ReceivePropsPopwin, booster, rewardNum); }; /** * 看广告获得红包 */ TestScene.prototype.watchADCoin = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')]; case 1: _a.sent(); this.getCoin(); return [2 /*return*/]; } }); }); }; /**直接获得红包 */ TestScene.prototype.getCoin = function () { //刷新总金币 // AppManager.I.redpacket.getRepacket() // ViewManager.I.openPopwin(RedPacketReward, 2); }; TestScene.prototype.onDraw = function () { AppSdk_1.default.I.openReward(); }; return TestScene; }(layaMaxUI_1.ui.TestSceneUI)); exports.default = TestScene; },{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/AdManager":7,"./sdk/AppSdk":8,"./sdk/TeaSdk":12,"./sdk/model/RedpacketModel":15,"./ui/layaMaxUI":20}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * name; */ var EventCenter = /** @class */ (function () { function EventCenter() { } Object.defineProperty(EventCenter, "I", { get: function () { window['ev'] = this._instance; return this._instance || (this._instance = new Laya.EventDispatcher); }, enumerable: true, configurable: true }); EventCenter.emit = function (event) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } this.I.event(event.toString(), args); }; EventCenter.add = function (type, caller, listener, args) { this.I.on(type.toString(), caller, listener, args); }; EventCenter.remove = function (type, caller, listener) { this.I.off(type.toString(), caller, listener); }; return EventCenter; }()); exports.EventCenter = EventCenter; },{}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EventEnum; (function (EventEnum) { EventEnum[EventEnum["CHECK_REDPACKET"] = 'check_redpacket'] = "CHECK_REDPACKET"; EventEnum[EventEnum["APP_SHOW"] = 'app.show'] = "APP_SHOW"; EventEnum[EventEnum["APP_HIDE"] = 'app.hide'] = "APP_HIDE"; EventEnum[EventEnum["UPDATE_COIN"] = 'update.coin'] = "UPDATE_COIN"; })(EventEnum = exports.EventEnum || (exports.EventEnum = {})); },{}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TTAdSdk_1 = require("./TTAdSdk"); var TeaSdk_1 = require("./TeaSdk"); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var AdManager = /** @class */ (function () { function AdManager() { } AdManager.prototype.init = function () { this.preloadRewardAd(); this.preloadBanner(); this.preloadFullAd(); }; AdManager.prototype.preloadBanner = function () { TTAdSdk_1.default.I.loadBannerExpressAd(1); }; AdManager.prototype.preloadRewardAd = function () { TTAdSdk_1.default.I.showRewardVideoAd(1); }; AdManager.prototype.preloadFullAd = function () { TTAdSdk_1.default.I.loadFullScreenVideoAd(1); }; AdManager.prototype.preloadNativeAdYLH = function () { TTAdSdk_1.default.I.loadNativeAdYLH(1, 1, 600, 300, 1); }; AdManager.prototype.preloadInterAd = function () { TTAdSdk_1.default.I.showInteractionExpressAd(1); }; AdManager.prototype.preloadNativeAd = function () { TTAdSdk_1.default.I.loadFullScreenVideoAd(1); }; AdManager.prototype.closeAdverDialog = function () { if (!Laya.Browser.onAndroid) { return; } TTAdSdk_1.default.I.closeAdverDialog(); }; AdManager.prototype.closeAdBanner = function () { TTAdSdk_1.default.I.closeAdBanner(); }; AdManager.prototype.showRewardAd = function (point) { return __awaiter(this, void 0, void 0, function () { var ret, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.showRewardVideoAd(0, point)]; case 1: ret = _a.sent(); // this.lastVideoTime = Laya.timer.currTimer; // this.preloadRewardAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_1 = _a.sent(); this.preloadRewardAd(); return [2 /*return*/, Promise.reject(e_1)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.showFullAd = function () { return __awaiter(this, void 0, void 0, function () { var ret, e_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.loadFullScreenVideoAd()]; case 1: ret = _a.sent(); TeaSdk_1.default.I.dot(TeaSdk_1.DotKey.fullScreen, { from: 'show' }); this.preloadFullAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_2 = _a.sent(); this.preloadFullAd(); return [2 /*return*/, Promise.reject(e_2)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.showInterAd = function () { return __awaiter(this, void 0, void 0, function () { var ret, e_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, TTAdSdk_1.default.I.showInteractionExpressAd()]; case 1: ret = _a.sent(); this.preloadInterAd(); return [2 /*return*/, Promise.resolve(ret)]; case 2: e_3 = _a.sent(); this.preloadInterAd(); return [2 /*return*/, Promise.reject(e_3)]; case 3: return [2 /*return*/]; } }); }); }; AdManager.prototype.checkVideoInCd = function () { return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000); }; AdManager.prototype.showBanner = function () { TTAdSdk_1.default.I.loadBannerExpressAd(); }; AdManager.prototype.showNativeAd = function (x, y, w, h, preload) { if (preload === void 0) { preload = 0; } TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h, preload); }; // 优量汇信息流广告 AdManager.prototype.showNativeAdYLH = function (x, y, w, h, preload) { if (preload === void 0) { preload = 0; } return TTAdSdk_1.default.I.loadNativeAdYLH(x, y, w, h, preload); }; AdManager.prototype.openLoadNativeAdEvent = function () { TTAdSdk_1.default.I.openLoadNativeAdEvent(); }; Object.defineProperty(AdManager, "I", { get: function () { return ObjectInstance_1.default.get(AdManager); }, enumerable: true, configurable: true }); return AdManager; }()); exports.default = AdManager; },{"../uitl/ObjectInstance":23,"./TTAdSdk":11,"./TeaSdk":12}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var AdManager_1 = require("./AdManager"); var RedpacketModel_1 = require("./model/RedpacketModel"); var LuckDrawModel_1 = require("./LuckDrawModel"); var AppSdkData_1 = require("./sdkData/AppSdkData"); var LuckDrawData_1 = require("./sdkData/LuckDrawData"); var AppSdk = /** @class */ (function () { function AppSdk() { } AppSdk.init = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: AppSdk.I.getSystemInfo(); AppSdk.I.initGameConfig(); AdManager_1.default.I.init(); //预加载广告 return [4 /*yield*/, ObjectInstance_1.default.get(RedpacketModel_1.default).init()]; case 1: _a.sent(); LuckDrawModel_1.default.I.init(); return [2 /*return*/]; } }); }); }; AppSdk.prototype.initSdk = function () { var _this = this; return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getUserInfo()]; case 1: _a.sent(); resolve(1); return [2 /*return*/]; } }); }); }); }; Object.defineProperty(AppSdk.prototype, "myBridge", { get: function () { if (typeof MyBridge !== 'undefined') { return MyBridge; } else { console.error(' no register myBridge!!!'); } }, enumerable: true, configurable: true }); /**获取基本版本信息以及手机的配置 */ AppSdk.prototype.getSystemInfo = function (key) { if (key === void 0) { key = 0; } var _a; var ret = this.myBridge.getSystemInfo(key); var _b = JSON.parse(ret), w = _b.w, h = _b.h, versionName = _b.versionName, channel = _b.channel, pangolin = _b.pangolin, adnet = _b.adnet, level = _b.level; _a = [w, h, versionName, channel, pangolin, adnet, level], this._width = _a[0], this._height = _a[1], this._version = _a[2], this._channel = _a[3], this.pangolinId = _a[4], this.adnetId = _a[5], this._level = _a[6]; }; AppSdk.prototype.getUserInfo = function () { var _this = this; return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { console.log("-------------getUserInfo回调 前---------------"); this.myBridge.getGameUserInfo(function (ret) { console.log("-------------getUserInfo回调---------------", ret); var res = JSON.parse(ret); AppSdkData_1.AppSdkData.I.initData(res); resolve(1); }); return [2 /*return*/]; }); }); }); }; AppSdk.prototype.initGameConfig = function () { this._gameConfig = this.getGameConfig(); }; /** * 震动 * @param key 0 短震动 1 长震动 */ AppSdk.prototype.vibrate = function (key) { if (key === void 0) { key = 0; } this.myBridge.openSystemFun(key); }; /**隐藏启动屏 */ AppSdk.prototype.hideSplash = function () { this.myBridge.hideSplash(); }; /**弹出提现 */ AppSdk.prototype.withDrawal = function () { this.myBridge.withDrawal(); }; /**意见反馈 */ AppSdk.prototype.feedback = function () { this.myBridge.feedback(); }; /** * key 默认0 ,签到 1 */ AppSdk.prototype.personal = function () { this.myBridge.personal(); }; /**邀请好友*/ AppSdk.prototype.invitation = function () { this.myBridge.invitation(); }; /**邀请好友*/ AppSdk.prototype.openReward = function () { this.myBridge.openReward(); }; /**签到*/ AppSdk.prototype.openSignin = function () { this.myBridge.openSingin(); }; AppSdk.prototype.putData = function (key, value) { this.myBridge.putData(key, value); }; /** * @param key 存数据的时候的唯一key * @return 存储的数据 * */ AppSdk.prototype.getData = function (key) { var ret = this.myBridge.getData(key); return JSON.parse(ret); }; /** * 获取游戏配置 */ AppSdk.prototype.getGameConfig = function () { var result = this.myBridge.getGameConfig(); console.log("获取游戏配置", JSON.stringify(result)); LuckDrawData_1.LuckDrawData.I.initData(JSON.parse(result)['draw']); //转盘数据配置 return JSON.parse(result); }; /** * 要求发放金币 * @param key 1红包 */ AppSdk.prototype.addGold = function (key) { if (key === void 0) { key = 1; } return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.addGold(key, function (res) { console.log("要求发放金币", JSON.stringify(res)); res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /** * 要求发放金币 可翻倍类型 */ AppSdk.prototype.rewardInfo = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { this.myBridge.rewardInfo(function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data.coin); } else { reject(msg); } }); return [2 /*return*/]; }); }); })]; }); }); }; /** * 获取双倍金币 * @param type 1原金币 2双倍金币 */ AppSdk.prototype.twofoldReward = function (type) { if (type === void 0) { type = 1; } return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { this.myBridge.twofoldReward(type, function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data.coin); } else { reject(msg); } }); return [2 /*return*/]; }); }); })]; }); }); }; /**获取总金币 */ AppSdk.prototype.myCoin = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.myCoin(function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data['coin']); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /**获取当前提现的档位 */ AppSdk.prototype.minWithDrawal = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.myBridge.minWithDrawal(function (res) { res = JSON.parse(res); var code = res.code, data = res.data, msg = res.msg; if ('0' === code || !code) { resolve(data['money']); } else { reject(msg); } })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); })]; }); }); }; /**上报埋点 */ AppSdk.prototype.appDotLog = function (key, value) { this.myBridge.appDotLog(key, value); }; /**热云打点 */ AppSdk.prototype.appDotTracKing = function (key) { this.myBridge.appDotTracKing(key); }; AppSdk.prototype.setCallback = function (funName, pramas) { var _this = this; console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge)); return new Promise(function (resolve, reject) { _this.myBridge[funName](pramas, function (res) { var _a = JSON.parse(res), code = _a.code, data = _a.data; if ('0' === code) { resolve(data); } else { reject(0); } }); }); }; AppSdk.prototype.closeAdverDialog = function () { this.myBridge.closeAdverDialog(); }; AppSdk.prototype.closeAdBanner = function () { this.myBridge.closeAdBanner(); }; /**激励视频 */ AppSdk.prototype.showRewardVideoAd = function (value, JBCallback) { this.myBridge.showRewardVideoAd(value, JBCallback); }; /** 全屏广告*/ AppSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) { this.myBridge.loadFullScreenVideoAd(data, JBCallback); }; /**信息流广告 */ AppSdk.prototype.loadNativeExpressAd = function (data, JBCallback) { this.myBridge.loadNativeExpressAd(data, JBCallback); }; /**信息流广告- 优量汇 */ AppSdk.prototype.loadNativeAdYLH = function (data, JBCallback) { this.myBridge.loadNativeAd(data, JBCallback); }; // 打开信息流-优量汇 AppSdk.prototype.openLoadNativeAdEvent = function () { this.myBridge.openLoadNativeAdEvent(); }; /**banner */ AppSdk.prototype.loadBannerExpressAd = function (data, JBCallback) { this.myBridge.loadBannerExpressAd(data, JBCallback); }; /**插屏广告 */ AppSdk.prototype.showInteractionExpressAd = function (data, JBCallback) { this.myBridge.showInteractionExpressAd(data, JBCallback); }; Object.defineProperty(AppSdk.prototype, "level", { get: function () { return this._level; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "width", { get: function () { return this._width; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "height", { get: function () { return this._height; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "version", { get: function () { return this._version; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "channel", { get: function () { return this._channel; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "bridge", { get: function () { return null; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk.prototype, "gameConfig", { get: function () { return this._gameConfig; }, enumerable: true, configurable: true }); Object.defineProperty(AppSdk, "I", { get: function () { return ObjectInstance_1.default.get(AppSdk); }, enumerable: true, configurable: true }); return AppSdk; }()); exports.default = AppSdk; // //这里是浏览器环境下, 接收web传过来的消息 window.onMyBridgeReady = function () { AppSdk.I.isMyBridge = true; console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms"); MyBridge.App.onResume = function () { var ret = []; for (var _i = 0; _i < arguments.length; _i++) { ret[_i] = arguments[_i]; } console.log(' laya onResume', ret); }; MyBridge.App.onPause = function () { var ret = []; for (var _i = 0; _i < arguments.length; _i++) { ret[_i] = arguments[_i]; } console.log(' laya onPause', ret); }; }; },{"../uitl/ObjectInstance":23,"./AdManager":7,"./LuckDrawModel":9,"./model/RedpacketModel":15,"./sdkData/AppSdkData":17,"./sdkData/LuckDrawData":19}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AppSdk_1 = require("./AppSdk"); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var DateUtils_1 = require("../uitl/DateUtils"); /**转盘 获取转盘机会的 */ var LuckDrawModel = /** @class */ (function () { function LuckDrawModel() { this.propRemove = 0; this.propChange = 0; } LuckDrawModel.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: _a = this; return [4 /*yield*/, this.initData()]; case 1: _a._data = _b.sent(); AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: 0 })); AppSdk_1.default.I.putData('LuckDrawToSign', JSON.stringify({ istoSignin: 0 })); return [2 /*return*/]; } }); }); }; LuckDrawModel.prototype.initData = function () { return __awaiter(this, void 0, void 0, function () { var data, lastTime, last, today, list, index, item, luckDrawData; return __generator(this, function (_a) { switch (_a.label) { case 0: data = new LuckDrawData; lastTime = Laya.LocalStorage.getItem('LuckDrawLastTime') || '0'; data.luckDrawLastTime = parseInt(lastTime); last = DateUtils_1.default.timeDay(data.luckDrawLastTime); today = DateUtils_1.default.today; if (!(last != today)) return [3 /*break*/, 1]; lastTime = DateUtils_1.default.nowTime.toString(); Laya.LocalStorage.setItem('LuckDrawLastTime', lastTime); data.luckDrawLastTime = parseInt(lastTime); /**初始化数据 * 1 签到 * 2 视频 * 3 摇一摇 * 4 红包 */ data.list = []; list = []; for (index = 0; index < 4; index++) { item = new LuckDrawVo; item.type = index + 1; item.num = 0; item.isUse = 0; item.useNum = 0; list.push(item); } data.list = list; return [3 /*break*/, 3]; case 1: return [4 /*yield*/, AppSdk_1.default.I.getData('LuckDrawData')]; case 2: luckDrawData = _a.sent(); if (luckDrawData) data.list = luckDrawData.list; _a.label = 3; case 3: AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(data)); this._data = data; return [2 /*return*/, data]; } }); }); }; Object.defineProperty(LuckDrawModel.prototype, "data", { get: function () { return this._data; }, enumerable: true, configurable: true }); LuckDrawModel.prototype.updateData = function (index, addNum) { if (addNum === void 0) { addNum = 1; } if (this.data) { this.data.list[index].num += addNum; AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(this.data)); } }; LuckDrawModel.prototype.getPropData = function () { return __awaiter(this, void 0, void 0, function () { var luckDrawProp; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AppSdk_1.default.I.getData('luckDrawProp')]; case 1: luckDrawProp = _a.sent(); console.log(' -------yyyyy laya luckDrawProp ' + JSON.stringify(luckDrawProp)); this.propRemove = Number(luckDrawProp.remove); this.propChange = Number(luckDrawProp.change); if (this.propRemove > 0) { this.updateRemoveProp(); } else { this.updateChangeProp(); } return [2 /*return*/, luckDrawProp]; } }); }); }; LuckDrawModel.prototype.updateRemoveProp = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { if (this.propRemove > 0) { /* 处理获得第1个道具*/ this.propRemove = 0; AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: this.propChange })); } return [2 /*return*/]; }); }); }; LuckDrawModel.prototype.updateChangeProp = function () { if (this.propChange > 0) { /* 处理获得第2个道具*/ this.propChange = 0; AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: this.propRemove, change: 0 })); } }; Object.defineProperty(LuckDrawModel, "I", { get: function () { return ObjectInstance_1.default.get(LuckDrawModel); }, enumerable: true, configurable: true }); return LuckDrawModel; }()); exports.default = LuckDrawModel; var LuckDrawData = /** @class */ (function () { function LuckDrawData() { } return LuckDrawData; }()); var LuckDrawVo = /** @class */ (function () { function LuckDrawVo() { } return LuckDrawVo; }()); },{"../uitl/DateUtils":22,"../uitl/ObjectInstance":23,"./AppSdk":8}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AdManager_1 = require("./AdManager"); var NativeAd = /** @class */ (function (_super) { __extends(NativeAd, _super); function NativeAd() { return _super !== null && _super.apply(this, arguments) || this; } NativeAd.prototype.onEnable = function () { var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true); AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height); }; NativeAd.prototype.onDisable = function () { AdManager_1.default.I.closeAdverDialog(); }; Object.defineProperty(NativeAd.prototype, "item", { get: function () { return this.owner; }, enumerable: true, configurable: true }); return NativeAd; }(Laya.Script)); exports.default = NativeAd; },{"./AdManager":7}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AppSdk_1 = require("./AppSdk"); var TeaSdk_1 = require("./TeaSdk"); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var TTAdSdk = /** @class */ (function () { function TTAdSdk() { } /** * * @param preload 0 直接加载;1 预加载 */ TTAdSdk.prototype.showRewardVideoAd = function (preload, point) { if (preload === void 0) { preload = 0; } if (point === void 0) { point = TeaSdk_1.DotKey.proloading; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { type: 1, preloading: preload, }; return [2 /*return*/, new Promise(function (resolve, reject) { var isComplete = false; AppSdk_1.default.I.showRewardVideoAd(data, function (ret) { console.log("视频回调", JSON.stringify(ret)); var _a = JSON.parse(ret), code = _a.code, msg = _a.msg; switch (code) { case -1: reject('error'); /**'暂无视频广告!每日0点重置'*/ ; break; case 0: break; case 100: break; case 102: isComplete = true; break; case 101: console.log("视频点了关闭"); if (isComplete) { console.log("视频观看完闭并点了关闭"); // TeaSdk.I.dot(DotKey.reward_ad, { from: point }); resolve(1); } else { reject('unComplete'); } break; default: reject('加载失败'); // TeaSdk.I.dot(DotKey.reward_ad_fail, { from: point, code: code }); break; } }); })]; }); }); }; TTAdSdk.prototype.loadFullScreenVideoAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: AppSdk_1.default.I.width, h: AppSdk_1.default.I.width * 90 / 600, preloading: preload, type: 1 }; return [2 /*return*/, new Promise(function (resolve, reject) { AppSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height, preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var scaleX, scaleY, data; return __generator(this, function (_a) { scaleX = AppSdk_1.default.I.width / Laya.stage.width; scaleY = AppSdk_1.default.I.height / Laya.stage.height; data = { type: 1, preloading: preload, w: width * scaleX, h: height * scaleY, left: x * scaleX, top: y * scaleY }; AppSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) { return Promise.resolve(res); }); return [2 /*return*/]; }); }); }; TTAdSdk.prototype.loadNativeAdYLH = function (x, y, width, height, preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { var scaleX = AppSdk_1.default.I.width / Laya.stage.width; var scaleY = AppSdk_1.default.I.height / Laya.stage.height; var data = { type: 1, preloading: preload, w: width * scaleX, h: height * scaleY, left: x * scaleX, bottom: AppSdk_1.default.I.height - height * scaleY - y * scaleY, }; // console.log(JSON.stringify(data)) // console.log(AppSdk.I.height, height, y, scaleY) AppSdk_1.default.I.loadNativeAdYLH(JSON.stringify(data), function (res) { resolve(JSON.parse(res)); }); })]; }); }); }; TTAdSdk.prototype.openLoadNativeAdEvent = function () { AppSdk_1.default.I.openLoadNativeAdEvent(); }; TTAdSdk.prototype.loadBannerExpressAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: AppSdk_1.default.I.width, h: AppSdk_1.default.I.width * 90 / 600, preloading: preload, type: 1 }; return [2 /*return*/, new Promise(function (resolve, reject) { AppSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; TTAdSdk.prototype.closeAdverDialog = function () { AppSdk_1.default.I.closeAdverDialog(); }; TTAdSdk.prototype.closeAdBanner = function () { AppSdk_1.default.I.closeAdBanner(); }; TTAdSdk.prototype.showInteractionExpressAd = function (preload) { if (preload === void 0) { preload = 0; } return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { data = { w: AppSdk_1.default.I.width * 0.8, h: AppSdk_1.default.I.height, preloading: preload, }; return [2 /*return*/, new Promise(function (resolve, reject) { var isComplete = false; AppSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) { resolve(res); }); })]; }); }); }; Object.defineProperty(TTAdSdk, "I", { get: function () { return ObjectInstance_1.default.get(TTAdSdk); }, enumerable: true, configurable: true }); return TTAdSdk; }()); exports.default = TTAdSdk; },{"../uitl/ObjectInstance":23,"./AppSdk":8,"./TeaSdk":12}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var AppSdk_1 = require("./AppSdk"); /** * 上报埋点⽇志 * 具体的打点需要跟运营联系 */ var TeaSdk = /** @class */ (function () { function TeaSdk() { } TeaSdk.prototype.dot = function (key, value) { if (!Laya.Browser.onAndroid) { return; } if (!value) { value = ''; } else if (typeof (value) == 'object') { value = JSON.stringify(value); } AppSdk_1.default.I.appDotLog(key, value); }; Object.defineProperty(TeaSdk, "I", { get: function () { return ObjectInstance_1.default.get(TeaSdk); }, enumerable: true, configurable: true }); return TeaSdk; }()); exports.default = TeaSdk; var DotKey; (function (DotKey) { DotKey["proloading"] = "proloading"; DotKey["reward_ad"] = "reward_ad"; DotKey["reward_ad_fail"] = "ad_fail"; DotKey["fullScreen"] = "fullScreen"; })(DotKey = exports.DotKey || (exports.DotKey = {})); },{"../uitl/ObjectInstance":23,"./AppSdk":8}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AppSdk_1 = require("./AppSdk"); var ObjectInstance_1 = require("../uitl/ObjectInstance"); var TrackingSdk = /** @class */ (function () { function TrackingSdk() { } TrackingSdk.prototype.dot = function (key) { AppSdk_1.default.I.appDotTracKing(key); }; Object.defineProperty(TrackingSdk, "I", { get: function () { return ObjectInstance_1.default.get(TrackingSdk); }, enumerable: true, configurable: true }); return TrackingSdk; }()); exports.default = TrackingSdk; var TrackingKey; (function (TrackingKey) { TrackingKey["RedPack1"] = "event_5"; TrackingKey["RedPack5"] = "event_6"; })(TrackingKey = exports.TrackingKey || (exports.TrackingKey = {})); },{"../uitl/ObjectInstance":23,"./AppSdk":8}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ArrayUtils_1 = require("../../uitl/ArrayUtils"); /* * name; */ var BaseModel = /** @class */ (function () { function BaseModel() { this._data = {}; this.updateArr = []; this.keyUpdateArr = {}; } BaseModel.prototype.update = function (data) { return __awaiter(this, void 0, void 0, function () { var _loop_1, this_1, key; var _this = this; return __generator(this, function (_a) { this._data = __assign({}, this._data, data); this.updateArr.forEach(function (func) { func(_this._data); }); _loop_1 = function (key) { var value = data[key]; if (value != null) { var arr = this_1.keyUpdateArr[key]; arr && arr.forEach(function (func) { func(value); }); } }; this_1 = this; for (key in this.keyUpdateArr) { _loop_1(key); } return [2 /*return*/]; }); }); }; BaseModel.prototype.waitFor = function (key) { var _this = this; return new Promise(function (resolve) { var value; value = _this._data[key]; if (value) { resolve(value); return; } var cb = function (data) { if (data) { resolve(data); _this.offUpdate(cb, key); } }; _this.onUpdate(cb, key, true); }); }; BaseModel.prototype.onUpdate = function (func, key, run) { if (run === void 0) { run = true; } if (key) { var value = this._data[key]; run && value != null && func(value); var arr = this.keyUpdateArr[key]; !arr && (this.keyUpdateArr[key] = arr = []); arr.push(func); } else { run && func(this._data); this.updateArr.push(func); } }; BaseModel.prototype.offUpdate = function (func, key) { if (key) { ArrayUtils_1.default.removeFromArr(this.keyUpdateArr[key], func); } else { ArrayUtils_1.default.removeFromArr(this.updateArr, func); } }; BaseModel.prototype.clearGame = function () { this._data = {}; }; return BaseModel; }()); exports.default = BaseModel; },{"../../uitl/ArrayUtils":21}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BaseModel_1 = require("./BaseModel"); var AdManager_1 = require("../../sdk/AdManager"); var TrackingSdk_1 = require("../../sdk/TrackingSdk"); var GoldConfigData_1 = require("../../sdk/sdkData/GoldConfigData"); var AddGoldData_1 = require("../../sdk/sdkData/AddGoldData"); var DateUtils_1 = require("../../uitl/DateUtils"); var Util_1 = require("../../uitl/Util"); var ObjectInstance_1 = require("../../uitl/ObjectInstance"); var AppSdk_1 = require("../AppSdk"); var RedpacketModel = /** @class */ (function (_super) { __extends(RedpacketModel, _super); function RedpacketModel() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.MAX = 20; /**当天领取红包的最大次数 */ _this.DAY_MAX_CNT = 50; _this.curRedpacket = 0; _this.confLen = 0; return _this; } /**初始化红包配置 */ RedpacketModel.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var arr, cash; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, GoldConfigData_1.GoldConfigData.I.getGoldConfig()]; case 1: arr = _a.sent(); cash = 0; this.conf = {}; arr.forEach(function (confData) { _this.conf[confData.id] = confData; }); this.update(this.initData()); this.confLen = this.conf.length; return [2 /*return*/]; } }); }); }; RedpacketModel.prototype.initData = function () { var data = new RedpacketData; var lastTime = Util_1.default.I.getItem(Util_1.DataKey.lastTime) || '0'; data.lastTime = parseInt(lastTime); var last = DateUtils_1.default.timeDay(data.lastTime); var today = DateUtils_1.default.today; if (last != today) { data.todayCnt = 0; lastTime = DateUtils_1.default.nowTime.toString(); Util_1.default.I.setItem(Util_1.DataKey.lastTime, lastTime); Util_1.default.I.setItem(Util_1.DataKey.todayCnt, 0); } else { var todayCnt = Util_1.default.I.getItem(Util_1.DataKey.todayCnt) || '0'; data.todayCnt = parseInt(todayCnt); } data.lastTime = parseInt(lastTime); var dataCnt = Util_1.default.I.getItem(Util_1.DataKey.dataCNT) || '0'; data.cnt = parseInt(dataCnt); data.list = []; return data; }; RedpacketModel.prototype.checkRedpacket = function () { return __awaiter(this, void 0, void 0, function () { var cnt, data, ran2, cash; return __generator(this, function (_a) { if (this.data.todayCnt >= this.DAY_MAX_CNT) return [2 /*return*/, false]; if (AdManager_1.default.I.checkVideoInCd()) return [2 /*return*/, false]; /**红包获取后没有看广告领取,再次获得红包的机会,不会获取红包, 自己也可以处理成 对应的红包提醒或不需要这里的判断 */ if (this.curRedpacket) { return [2 /*return*/, false]; } if (undefined === this.data.cnt) this.data.cnt = 0; cnt = this.data.cnt; if (cnt >= this.confLen) cnt = this.confLen - 1; data = this.conf[cnt + 1]; ran2 = Math.random(); if (data && ran2 < data.per) { cash = 0.000001; this.curRedpacket = cash; console.log("看视频领红包"); // //**弹出红包的界面, 暂时处理成 直接看广告获取金币 */ // await AdManager.I.showRewardAd(DotKey.reward_ad) // console.log("加金币") // let coin = await this.addCoin(); // 看完广告获取钱(此时已经加到账户了,暂未提供提前知道获取多少钱的方法) // console.log("获取了钱", coin) // this.getRepacket() // /**更新基本显示 */ // EventCenter.emit(EventEnum.UPDATE_COIN); /*** */ return [2 /*return*/, true]; } return [2 /*return*/, false]; }); }); }; RedpacketModel.prototype.getRepacket = function () { if (!this.curRedpacket) return; this.data.cnt += 1; this.data.list.push(this.curRedpacket); this.data.lastTime = (new Date).getTime(); this.data.todayCnt += 1; if (this.data.cnt == 1) TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack1); if (this.data.cnt == 5) TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack5); this.curRedpacket = 0; Util_1.default.I.setItem(Util_1.DataKey.dataCNT, this.data.cnt); Util_1.default.I.setItem(Util_1.DataKey.todayCnt, this.data.todayCnt); this.update(this.data); }; /** */ RedpacketModel.prototype.getCurRedpacket = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.curRedpacket]; }); }); }; Object.defineProperty(RedpacketModel.prototype, "data", { get: function () { return this._data; }, enumerable: true, configurable: true }); /**获取总共的金币数 */ RedpacketModel.prototype.getTotalCoin = function () { return __awaiter(this, void 0, void 0, function () { var totalCoin; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AppSdk_1.default.I.myCoin()]; case 1: totalCoin = _a.sent(); return [2 /*return*/, totalCoin]; } }); }); }; /**获取本次奖励的金币数 */ RedpacketModel.prototype.addCoin = function () { return __awaiter(this, void 0, void 0, function () { var coinData; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AddGoldData_1.default.addCoin()]; case 1: coinData = _a.sent(); return [2 /*return*/, coinData]; } }); }); }; /**获取最低提档 */ RedpacketModel.prototype.minWithDrawal = function () { return __awaiter(this, void 0, void 0, function () { var minCoin; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()]; case 1: minCoin = _a.sent(); return [2 /*return*/, minCoin]; } }); }); }; Object.defineProperty(RedpacketModel, "I", { get: function () { return ObjectInstance_1.default.get(RedpacketModel); }, enumerable: true, configurable: true }); return RedpacketModel; }(BaseModel_1.default)); exports.default = RedpacketModel; var RedpacketData = /** @class */ (function () { function RedpacketData() { } return RedpacketData; }()); var RedpacketConfigData = /** @class */ (function () { function RedpacketConfigData() { } return RedpacketConfigData; }()); },{"../../sdk/AdManager":7,"../../sdk/TrackingSdk":13,"../../sdk/sdkData/AddGoldData":16,"../../sdk/sdkData/GoldConfigData":18,"../../uitl/DateUtils":22,"../../uitl/ObjectInstance":23,"../../uitl/Util":26,"../AppSdk":8,"./BaseModel":14}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var AppSdk_1 = require("../AppSdk"); var AddGoldData = /** @class */ (function () { function AddGoldData() { } AddGoldData.initData = function (data) { if (!parseInt(data.code)) { AddGoldData.coin = data.data.coin; AddGoldData.mycoin = data.data.mycoin; } }; AddGoldData.addCoin = function () { return __awaiter(this, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AppSdk_1.default.I.addGold()]; case 1: result = _a.sent(); return [2 /*return*/, [parseInt(result.coin), parseInt(result.mycoin)]]; } }); }); }; AddGoldData.coin = '0'; AddGoldData.mycoin = '0'; return AddGoldData; }()); exports.default = AddGoldData; },{"../AppSdk":8}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../../uitl/ObjectInstance"); // sdk返回的用户信息 var AppSdkData = /** @class */ (function () { function AppSdkData() { this.isnew = 0; } AppSdkData.prototype.initData = function (data) { var _a; var d = data.data; var isnew = d.isnew, uid = d.uid, openid = d.openid, nickname = d.nickname, headimgurl = d.headimgurl; _a = [isnew, uid, openid, nickname, headimgurl], this.isnew = _a[0], this.uid = _a[1], this.openid = _a[2], this.nickname = _a[3], this.headimgurl = _a[4]; }; Object.defineProperty(AppSdkData, "I", { get: function () { return ObjectInstance_1.default.get(AppSdkData); }, enumerable: true, configurable: true }); return AppSdkData; }()); exports.AppSdkData = AppSdkData; },{"../../uitl/ObjectInstance":23}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Util_1 = require("../../uitl/Util"); var AppSdk_1 = require("../AppSdk"); var GoldConfigData = /** @class */ (function () { function GoldConfigData() { this.coin_config = ''; this.code = -3; } Object.defineProperty(GoldConfigData, "I", { get: function () { if (!this.instance) this.instance = new GoldConfigData(); return this.instance; }, enumerable: true, configurable: true }); GoldConfigData.prototype.initData = function (data) { this.code = data.code; if (!data.code) { data = data.data; for (var key in data) { if (data.hasOwnProperty(key)) { var ele = data[key]; this[key] = ele; } } } }; GoldConfigData.prototype.getGoldConfig = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { var result, configJson; return __generator(this, function (_a) { switch (_a.label) { case 0: result = AppSdk_1.default.I.gameConfig; if (!result) return [3 /*break*/, 2]; return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])]; case 1: configJson = _a.sent(); resolve(configJson); _a.label = 2; case 2: return [2 /*return*/]; } }); }); })]; }); }); }; GoldConfigData.prototype.loadGoldCfg = function (res) { return __awaiter(this, void 0, void 0, function () { var configJson; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Util_1.default.I.load(res)]; case 1: configJson = _a.sent(); return [2 /*return*/, configJson]; } }); }); }; GoldConfigData.instance = null; return GoldConfigData; }()); exports.GoldConfigData = GoldConfigData; },{"../../uitl/Util":26,"../AppSdk":8}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectInstance_1 = require("../../uitl/ObjectInstance"); var Util_1 = require("../../uitl/Util"); var LuckDrawData = /** @class */ (function () { function LuckDrawData() { } Object.defineProperty(LuckDrawData, "I", { get: function () { return ObjectInstance_1.default.get(LuckDrawData); }, enumerable: true, configurable: true }); LuckDrawData.prototype.initData = function (data) { return __awaiter(this, void 0, void 0, function () { var _a, red_turntable_times, red_turntable_config, shake_turntable_config, shake_turntable_times; return __generator(this, function (_b) { red_turntable_times = data.red_turntable_times, red_turntable_config = data.red_turntable_config, shake_turntable_config = data.shake_turntable_config, shake_turntable_times = data.shake_turntable_times; _a = [red_turntable_times, red_turntable_config, shake_turntable_config, shake_turntable_times], this.red_turntable_times = _a[0], this.red_turntable_config = _a[1], this.shake_turntable_config = _a[2], this.shake_turntable_times = _a[3]; return [2 /*return*/]; }); }); }; LuckDrawData.prototype.loadGoldCfg = function (res) { return __awaiter(this, void 0, void 0, function () { var configJson; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Util_1.default.I.load(res)]; case 1: configJson = _a.sent(); return [2 /*return*/, configJson]; } }); }); }; return LuckDrawData; }()); exports.LuckDrawData = LuckDrawData; },{"../../uitl/ObjectInstance":23,"../../uitl/Util":26}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Scene = Laya.Scene; var REG = Laya.ClassUtils.regClass; var ui; (function (ui) { var TestSceneUI = /** @class */ (function (_super) { __extends(TestSceneUI, _super); function TestSceneUI() { return _super.call(this) || this; } TestSceneUI.prototype.createChildren = function () { _super.prototype.createChildren.call(this); this.loadScene("TestScene"); }; return TestSceneUI; }(Scene)); ui.TestSceneUI = TestSceneUI; REG("ui.TestSceneUI", TestSceneUI); })(ui = exports.ui || (exports.ui = {})); },{}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ArrayUtils = /** @class */ (function () { function ArrayUtils() { } /** * 移除元素 */ ArrayUtils.removeFromArr = function (arr, obj) { var index = arr.indexOf(obj); arr.splice(index, 1); }; ArrayUtils.randomFromArr = function (arr) { var index = Math.floor(Math.random() * arr.length); return arr[index]; }; /** * 数组随机排序 */ ArrayUtils.shuffle = function (arr) { return arr.sort(function () { return Math.random() - 0.5; }); }; ArrayUtils.indexOf = function (arr, callback, ctx) { for (var i = 0; i < arr.length; i++) { if (callback.call(ctx, this[i], i)) return i; } return -1; }; ArrayUtils.each = function (arr, callback, context) { if (typeof callback !== 'function') throw new TypeError(); for (var i = 0, len = arr.length; i < len; i++) { if (callback.call(context, arr[i], i, arr)) break; } }; ArrayUtils.queue = function (arr) { return __awaiter(this, void 0, void 0, function () { var res, _i, arr_1, promise; return __generator(this, function (_a) { switch (_a.label) { case 0: res = null; _i = 0, arr_1 = arr; _a.label = 1; case 1: if (!(_i < arr_1.length)) return [3 /*break*/, 4]; promise = arr_1[_i]; return [4 /*yield*/, promise(res)]; case 2: res = _a.sent(); _a.label = 3; case 3: _i++; return [3 /*break*/, 1]; case 4: return [4 /*yield*/, res]; case 5: return [2 /*return*/, _a.sent()]; } }); }); }; ArrayUtils.getRandomArray = function (arr, count) { var shuffled = arr.slice(0); var len = arr.length; var min = len - count, temp, index; while (len-- > min) { index = Math.floor((len + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[len]; shuffled[len] = temp; } return shuffled.slice(min); }; return ArrayUtils; }()); exports.default = ArrayUtils; },{}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 日期工具类 */ var DateUtils = /** @class */ (function () { function DateUtils() { } Object.defineProperty(DateUtils, "now", { get: function () { return Math.floor(this.nowTime / 1000); }, enumerable: true, configurable: true }); Object.defineProperty(DateUtils, "nowTime", { get: function () { return new Date().getTime(); }, enumerable: true, configurable: true }); Object.defineProperty(DateUtils, "today", { get: function () { var time = new Date(this.nowTime); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); return year + "-" + this.add(month) + "-" + this.add(date); }, enumerable: true, configurable: true }); DateUtils.timeDay = function (timeNum) { var time = new Date(timeNum); var year = time.getFullYear(); var month = time.getMonth() + 1; var date = time.getDate(); return year + "-" + this.add(month) + "-" + this.add(date); }; /** * 根据秒数格式化字符串 * @param second 秒数 * @param type 1:00:00:00 2:yyyy-mm-dd h:m:s 3:00:00 4:xx天前,xx小时前,xx分钟前 * @return */ DateUtils.getFormatBySecond = function (second, type) { if (type === void 0) { type = 1; } var str = ""; switch (type) { case 0: str = this.getFormatBySecond0(second); break; case 1: str = this.getFormatBySecond1(second); break; case 2: str = this.getFormatBySecond2(second); break; case 3: str = this.getFormatBySecond3(second); break; case 4: str = this.getFormatBySecond4(second); break; case 5: str = this.getFormatBySecond5(second); break; } return str; }; // 0: 00:00 DateUtils.getFormatBySecond0 = function (t) { if (t === void 0) { t = 0; } var minst = Math.floor(t / 60); var secondt = Math.floor(t % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return mins + ":" + sens; }; //1: 00:00:00 DateUtils.getFormatBySecond1 = function (t) { if (t === void 0) { t = 0; } var hourst = Math.floor(t / 3600); var hours; var day = ''; if (hourst == 0) { hours = "00"; } else { if (hourst < 10) hours = "0" + hourst; else { var h = hourst % 24; if (hourst >= 24) { hours = h < 10 ? "0" + h : '' + h; day = Math.floor(hourst / 24) + 'd '; } else hours = h < 10 ? "0" + h : '' + h; } } var minst = Math.floor((t - hourst * 3600) / 60); var secondt = Math.floor((t - hourst * 3600) % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return day + hours + ":" + mins + ":" + sens; }; //3: 00:00 DateUtils.getFormatBySecond3 = function (t) { if (t === void 0) { t = 0; } var hourst = Math.floor(t / 3600); var minst = Math.floor((t - hourst * 3600) / 60); var secondt = Math.floor((t - hourst * 3600) % 60); var mins; var sens; if (minst == 0) { mins = "00"; } else if (minst < 10) { mins = "0" + minst; } else { mins = "" + minst; } if (secondt == 0) { sens = "00"; } else if (secondt < 10) { sens = "0" + secondt; } else { sens = "" + secondt; } return mins + ":" + sens; }; //2:yyyy-mm-dd h:m:s DateUtils.getFormatBySecond2 = function (time) { var date = new Date(time); var year = date.getFullYear(); var month = date.getMonth() + 1; //返回的月份从0-11; var day = date.getDate(); var hours = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); return year + "-" + month + "-" + day + " " + hours + ":" + minute + ":" + second; }; //4:xx天前,xx小时前,xx分钟前 DateUtils.getFormatBySecond4 = function (time) { var t = Math.floor(time / 3600); if (t > 0) { if (t > 24) { return Math.floor(t / 24) + "天前"; } else { return t + "小时前"; } } else { return Math.floor(time / 60) + "分钟前"; } }; DateUtils.getFormatBySecond5 = function (time) { // 每个时间单位所对应的秒数 var oneDay = 3600 * 24; var oneHourst = 3600; var oneMinst = 60; var days = Math.floor(time / oneDay); var hourst = Math.floor(time % oneDay / oneHourst); var minst = Math.floor((time - hourst * oneHourst) / oneMinst); //Math.floor(time % oneDay % oneHourst / oneMinst); var secondt = Math.floor((time - hourst * oneHourst) % oneMinst); //time; var dayss = ""; var hourss = ""; var minss = ""; var secss = ""; if (time > 0) { //天 if (days == 0) { dayss = ""; //小时 if (hourst == 0) { hourss = ""; //分 if (minst == 0) { minss = ""; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } return secss; } else { minss = "" + minst + "分钟"; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } } return minss + secss; } else { hourss = hourst + "小时"; if (minst == 0) { minss = ""; if (secondt == 0) { secss = ""; } else if (secondt < 10) { secss = "0" + secondt + "秒"; } else { secss = "" + secondt + "秒"; } return hourss + secss; } else if (minst < 10) { minss = "0" + minst + "分钟"; } else { minss = "" + minst + "分钟"; } return hourss + minss; } } else { dayss = days + "天"; if (hourst == 0) { hourss = ""; } else { if (hourst < 10) hourss = "0" + hourst + "小时"; else hourss = "" + hourst + "小时"; ; } return dayss + hourss; } } return ""; }; DateUtils.add = function (num) { return num < 10 ? '0' + num : num; }; return DateUtils; }()); exports.default = DateUtils; },{}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool_1 = require("./ObjectPool"); /* * name; */ var ObjectInstance = /** @class */ (function () { function ObjectInstance() { } ObjectInstance.get = function (cls) { var idx = this.clzs.indexOf(cls); return (idx >= 0 && this.objects[idx]) || this.create(cls); }; ObjectInstance.create = function (cls) { var obj = ObjectPool_1.default.pop(cls); this.objects.push(obj); this.clzs.push(cls); return obj; }; ObjectInstance.clzs = []; ObjectInstance.objects = []; return ObjectInstance; }()); exports.default = ObjectInstance; },{"./ObjectPool":24}],24:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ObjectPool = /** @class */ (function () { function ObjectPool() { } ObjectPool.pop = function (cls) { var idx = this.clsArr.indexOf(cls); if (idx < 0) { idx = this.clsArr.length; this.clsArr.push(cls); } var key = 'poolKey' + idx; var item = Laya.Pool.getItemByClass(key, cls); item.poolKey = key; return item; }; ObjectPool.push = function (item) { Laya.Pool.recover(item.poolKey, item); }; ObjectPool.clsArr = []; return ObjectPool; }()); exports.default = ObjectPool; },{}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ScaleButtonScript = /** @class */ (function () { function ScaleButtonScript() { this.delayTime = 0; this.minScale = 0; } Object.defineProperty(ScaleButtonScript.prototype, "owner", { /** *设置owner函数,可以直接获取到添加附加脚本的组件实例 **/ set: function (value) { this.monkeyBox = value; //自定义的脚本会有时序问题,所以在此添加一个延时 this.monkeyBox.frameOnce(2, this, this.onLoaded); }, enumerable: true, configurable: true }); ScaleButtonScript.prototype.onLoaded = function () { /* 设置按钮为单态按钮 ** 取值: ** 1:单态。图片不做切割,按钮的皮肤状态只有一种。 ** 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。 ** 3:三态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤 */ //添加鼠标按下事件侦听。按时时缩小按钮。 this.monkeyBox.on(Laya.Event.MOUSE_DOWN, this, this.scaleSmall); //添加鼠标抬起事件侦听。抬起时还原按钮。 this.monkeyBox.on(Laya.Event.MOUSE_UP, this, this.scaleBig); //添加鼠标离开事件侦听。离开时还原按钮。 this.monkeyBox.on(Laya.Event.MOUSE_OUT, this, this.scaleBig); }; ScaleButtonScript.prototype.scaleSmall = function () { //缩小至0.8的缓动效果 Laya.Tween.to(this.monkeyBox, { scaleX: 0.8, scaleY: 0.8 }, 2); }; ScaleButtonScript.prototype.scaleBig = function () { //变大还原的缓动效果 Laya.Tween.to(this.monkeyBox, { scaleX: 1, scaleY: 1 }, 2); }; return ScaleButtonScript; }()); exports.default = ScaleButtonScript; },{}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Util = /** @class */ (function () { function Util() { } Util.prototype.load = function (res, onProgress) { var _this = this; return new Promise(function (suc, fail) { Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress); }); }; Util.prototype.setItem = function (key, value) { Laya.LocalStorage.setItem(key, value.toString()); }; Util.prototype.getItem = function (key) { return Laya.LocalStorage.getItem(key); }; Object.defineProperty(Util, "I", { get: function () { return this._instance || (this._instance = new Util); }, enumerable: true, configurable: true }); return Util; }()); exports.default = Util; var DataKey; (function (DataKey) { DataKey["cur_red_day_limit"] = "cur_red_day_limit"; DataKey["cur_shake_day_limit"] = "cur_shake_day_limit"; DataKey["shakeLastTime"] = "shakeLastTime"; DataKey["dataCNT"] = "dataCNT"; DataKey["todayCnt"] = "todayCnt"; DataKey["lastTime"] = "lastTime"; })(DataKey = exports.DataKey || (exports.DataKey = {})); },{}]},{},[2]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFX2JldGEyXzFfMS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2FwcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwic3JjL0dhbWVDb25maWcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9SZWREcmF3YWwudHMiLCJzcmMvVGVzdFNjZW5lLnRzIiwic3JjL2V2ZW50L0V2ZW50Q2VudGVyLnRzIiwic3JjL2V2ZW50L0V2ZW50RW51bS50cyIsInNyYy9zZGsvQWRNYW5hZ2VyLnRzIiwic3JjL3Nkay9BcHBTZGsudHMiLCJzcmMvc2RrL0x1Y2tEcmF3TW9kZWwudHMiLCJzcmMvc2RrL05hdGl2ZUFkLnRzIiwic3JjL3Nkay9UVEFkU2RrLnRzIiwic3JjL3Nkay9UZWFTZGsudHMiLCJzcmMvc2RrL1RyYWNraW5nU2RrLnRzIiwic3JjL3Nkay9tb2RlbC9CYXNlTW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsLnRzIiwic3JjL3Nkay9zZGtEYXRhL0FkZEdvbGREYXRhLnRzIiwic3JjL3Nkay9zZGtEYXRhL0FwcFNka0RhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvR29sZENvbmZpZ0RhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvTHVja0RyYXdEYXRhLnRzIiwic3JjL3VpL2xheWFNYXhVSS50cyIsInNyYy91aXRsL0FycmF5VXRpbHMudHMiLCJzcmMvdWl0bC9EYXRlVXRpbHMudHMiLCJzcmMvdWl0bC9PYmplY3RJbnN0YW5jZS50cyIsInNyYy91aXRsL09iamVjdFBvb2wudHMiLCJzcmMvdWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50cyIsInNyYy91aXRsL1V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsZ0dBQWdHO0FBQ2hH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QUFSO1FBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFB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cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xyXG5pbXBvcnQgVGVzdFNjZW5lIGZyb20gXCIuL1Rlc3RTY2VuZVwiXG5pbXBvcnQgU2NhbGVCdXR0b25TY3JpcHQgZnJvbSBcIi4vdWl0bC9TY2FsZUJ1dHRvblNjcmlwdFwiXG5pbXBvcnQgUmVkRHJhd2FsIGZyb20gXCIuL1JlZERyYXdhbFwiXG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCJcclxuLypcclxuKiDmuLjmiI/liJ3lp4vljJbphY3nva47XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDb25maWd7XHJcbiAgICBzdGF0aWMgd2lkdGg6bnVtYmVyPTc1MDtcclxuICAgIHN0YXRpYyBoZWlnaHQ6bnVtYmVyPTEzMzQ7XHJcbiAgICBzdGF0aWMgc2NhbGVNb2RlOnN0cmluZz1cImZpeGVkd2lkdGhcIjtcclxuICAgIHN0YXRpYyBzY3JlZW5Nb2RlOnN0cmluZz1cIm5vbmVcIjtcclxuICAgIHN0YXRpYyBhbGlnblY6c3RyaW5nPVwidG9wXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25IOnN0cmluZz1cImxlZnRcIjtcclxuICAgIHN0YXRpYyBzdGFydFNjZW5lOmFueT1cIlRlc3RTY2VuZS5zY2VuZVwiO1xyXG4gICAgc3RhdGljIHNjZW5lUm9vdDpzdHJpbmc9XCJcIjtcclxuICAgIHN0YXRpYyBkZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHN0YXQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBwaHlzaWNzRGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBleHBvcnRTY2VuZVRvSnNvbjpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe31cclxuICAgIHN0YXRpYyBpbml0KCl7XHJcbiAgICAgICAgdmFyIHJlZzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XHJcbiAgICAgICAgcmVnKFwiVGVzdFNjZW5lLnRzXCIsVGVzdFNjZW5lKTtcbiAgICAgICAgcmVnKFwidWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50c1wiLFNjYWxlQnV0dG9uU2NyaXB0KTtcbiAgICAgICAgcmVnKFwiUmVkRHJhd2FsLnRzXCIsUmVkRHJhd2FsKTtcbiAgICAgICAgcmVnKFwic2RrL05hdGl2ZUFkLnRzXCIsTmF0aXZlQWQpO1xyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcclxuaW1wb3J0IEFwcFNkayBmcm9tIFwiLi9zZGsvQXBwU2RrXCI7XHJcbmNsYXNzIE1haW4ge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcblx0XHRpZiAod2luZG93W1wiTGF5YTNEXCJdKSBMYXlhM0QuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCk7XHJcblx0XHRlbHNlIExheWEuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCwgTGF5YVtcIldlYkdMXCJdKTtcclxuXHRcdExheWFbXCJQaHlzaWNzXCJdICYmIExheWFbXCJQaHlzaWNzXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YVtcIkRlYnVnUGFuZWxcIl0gJiYgTGF5YVtcIkRlYnVnUGFuZWxcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhLnN0YWdlLnNjYWxlTW9kZSA9IEdhbWVDb25maWcuc2NhbGVNb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gR2FtZUNvbmZpZy5zY3JlZW5Nb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5hbGlnblYgPSBHYW1lQ29uZmlnLmFsaWduVjtcclxuXHRcdExheWEuc3RhZ2UuYWxpZ25IID0gR2FtZUNvbmZpZy5hbGlnbkg7XHJcblx0XHQvL+WFvOWuueW+ruS/oeS4jeaUr+aMgeWKoOi9vXNjZW5l5ZCO57yA5Zy65pmvXHJcblx0XHRMYXlhLlVSTC5leHBvcnRTY2VuZVRvSnNvbiA9IEdhbWVDb25maWcuZXhwb3J0U2NlbmVUb0pzb247XHJcblxyXG5cdFx0Ly/miZPlvIDosIPor5XpnaLmnb/vvIjpgJrov4dJREXorr7nva7osIPor5XmqKHlvI/vvIzmiJbogIV1cmzlnLDlnYDlop7liqBkZWJ1Zz10cnVl5Y+C5pWw77yM5Z2H5Y+v5omT5byA6LCD6K+V6Z2i5p2/77yJXHJcblx0XHRpZiAoR2FtZUNvbmZpZy5kZWJ1ZyB8fCBMYXlhLlV0aWxzLmdldFF1ZXJ5U3RyaW5nKFwiZGVidWdcIikgPT0gXCJ0cnVlXCIpIExheWEuZW5hYmxlRGVidWdQYW5lbCgpO1xyXG5cdFx0aWYgKEdhbWVDb25maWcucGh5c2ljc0RlYnVnICYmIExheWFbXCJQaHlzaWNzRGVidWdEcmF3XCJdKSBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXS5lbmFibGUoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnN0YXQpIExheWEuU3RhdC5zaG93KCk7XHJcblx0XHRMYXlhLmFsZXJ0R2xvYmFsRXJyb3IgPSB0cnVlO1xyXG5cclxuXHRcdC8v5r+A5rS76LWE5rqQ54mI5pys5o6n5Yi277yMdmVyc2lvbi5qc29u55SxSURF5Y+R5biD5Yqf6IO96Ieq5Yqo55Sf5oiQ77yM5aaC5p6c5rKh5pyJ5Lmf5LiN5b2x5ZON5ZCO57ut5rWB56iLXHJcblx0XHRMYXlhLlJlc291cmNlVmVyc2lvbi5lbmFibGUoXCJ2ZXJzaW9uLmpzb25cIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uVmVyc2lvbkxvYWRlZCksIExheWEuUmVzb3VyY2VWZXJzaW9uLkZJTEVOQU1FX1ZFUlNJT04pO1xyXG5cdH1cclxuXHJcblx0b25WZXJzaW9uTG9hZGVkKCk6IHZvaWQge1xyXG5cdFx0Ly/mv4DmtLvlpKflsI/lm77mmKDlsITvvIzliqDovb3lsI/lm77nmoTml7blgJnvvIzlpoLmnpzlj5HnjrDlsI/lm77lnKjlpKflm77lkIjpm4bph4zpnaLvvIzliJnkvJjlhYjliqDovb3lpKflm77lkIjpm4bvvIzogIzkuI3mmK/lsI/lm75cclxuXHRcdExheWEuQXRsYXNJbmZvTWFuYWdlci5lbmFibGUoXCJmaWxlY29uZmlnLmpzb25cIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uQ29uZmlnTG9hZGVkKSk7XHJcblx0fVxyXG5cclxuXHRvbkNvbmZpZ0xvYWRlZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaW5pdFNkaygpO1xyXG5cdFx0dGhpcy5sb2FkRGF0YSgpO1xyXG5cdH1cclxuXHJcblx0Lyoq5Yid5aeL5YyWU0RLICovXHJcblx0cHJpdmF0ZSBhc3luYyBpbml0U2RrKCkge1xyXG5cdFx0aWYgKEFwcFNkay5JLmlzTXlCcmlkZ2UpIHtcclxuXHRcdFx0QXBwU2RrLmluaXQoKVxyXG5cdFx0XHRhd2FpdCBBcHBTZGsuSS5pbml0U2RrKCk7XHJcblx0XHRcdHRoaXMudG9nZ2xlU2NlbmUoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdExheWEudGltZXIub25jZSgxMDAsIHRoaXMsIHRoaXMuaW5pdFNkayk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGxvYWREYXRhKCkge1xyXG5cdFx0Ly8g5aSE55CG5ri45oiP5Yqg6L29XHJcblxyXG5cclxuXHRcdC8v5Yqg6L295a6M5oiQXHJcblx0XHR0aGlzLnRvZ2dsZVNjZW5lKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjaGVja0xvYWQ6IG51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSB0b2dnbGVTY2VuZSgpIHtcclxuXHRcdC8v5Yqg6L29SURF5oyH5a6a55qE5Zy65pmvXHJcblx0XHR0aGlzLmNoZWNrTG9hZCsrO1xyXG5cdFx0aWYgKHRoaXMuY2hlY2tMb2FkIDwgMikge1xyXG5cdFx0XHRyZXR1cm5cclxuXHRcdH1cclxuXHRcdEFwcFNkay5JLmhpZGVTcGxhc2goKTsvL+makOiXj+WKoOi9vemhtSDlj6/moLnmja7pnIDmsYLmlL7liLDlhbbku5bkvY3nva5cclxuXHRcdEdhbWVDb25maWcuc3RhcnRTY2VuZSAmJiBMYXlhLlNjZW5lLm9wZW4oR2FtZUNvbmZpZy5zdGFydFNjZW5lKTtcclxuXHR9XHJcbn1cclxuLy/mv4DmtLvlkK/liqjnsbtcclxubmV3IE1haW4oKTtcclxuIiwiaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi9ldmVudC9FdmVudENlbnRlclwiO1xuaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRFbnVtXCI7XG4vKipcbiAqIOS4u+eVjOmdoiAg6YeR5biB6YeR6aKdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZERyYXdhbCBleHRlbmRzIExheWEuU2NyaXB0IHtcbiAgICAvKiogQHByb3Age25hbWU6Y29pbmxhYiwgdGlwczpcIumHkeW4gVwiLCB0eXBlOk5vZGV9Ki9cbiAgICBjb2lubGFiOiBMYXlhLkxhYmVsO1xuICAgIC8qKiBAcHJvcCB7bmFtZTp0aXBsYWIsIHRpcHM6XCLmj5DnpLpcIiwgdHlwZTpOb2RlfSovXG4gICAgdGlwbGFiOiBMYXlhLkxhYmVsO1xuXG4gICAgcHJpdmF0ZSB0b3RhbENvaW46IG51bWJlciA9IDExMDtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG4gICAgb25TdGFydCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGFyKCk7XG4gICAgICAgIC8vIHRoaXMudGlwbGFiLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gICAgb25FbmFibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLmFkZChFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLmFkZChFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCkge1xuICAgICAgICBFdmVudENlbnRlci5yZW1vdmUoRXZlbnRFbnVtLkFQUF9TSE9XLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgICAgICBFdmVudENlbnRlci5yZW1vdmUoRXZlbnRFbnVtLlVQREFURV9DT0lOLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZVN0YXIoKSB7XG4gICAgICAgIGxldCBjb2luID0gYXdhaXQgUmVkcGFja2V0TW9kZWwuSS5nZXRUb3RhbENvaW4oKTtcbiAgICAgICAgLy8gbGV0IGNvaW4gPSAxMDAwXG4gICAgICAgIHRoaXMudG90YWxDb2luID0gY29pbjtcbiAgICAgICAgdGhpcy5jb2lubGFiLnRleHQgPSAnJyArIGNvaW47XG4gICAgICAgIGxldCBzdHIgPSAn5Y+v5o+Q546wJztcbiAgICAgICAgLyoq5pu05paw5LiL5LiL5LiA5qyh5o+Q546w55qE6aKd5bqmICovXG4gICAgICAgIGxldCBuZXh0RHJhd2FsID0gYXdhaXQgUmVkcGFja2V0TW9kZWwuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsQ29pbiA+IDApIHtcbiAgICAgICAgICAgIGxldCBsZWZ0Q29pbiA9IG5leHREcmF3YWwgLSB0aGlzLnRvdGFsQ29pbjtcbiAgICAgICAgICAgIGlmIChsZWZ0Q29pbiA+IDApXG4gICAgICAgICAgICAgICAgc3RyID0gYOi/mOW3riR7KGxlZnRDb2luIC8gMTAwMDApLnRvRml4ZWQoMyl96YeR6aKd5Y+v5o+Q546wYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpcGxhYi50ZXh0ID0gc3RyO1xuICAgICAgICB0aGlzLnRpcGxhYi52aXNpYmxlID0gQm9vbGVhbihuZXh0RHJhd2FsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgdWkgfSBmcm9tIFwiLi91aS9sYXlhTWF4VUlcIjtcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IEFwcFNkayBmcm9tIFwiLi9zZGsvQXBwU2RrXCI7XG5pbXBvcnQgeyBEb3RLZXkgfSBmcm9tIFwiLi9zZGsvVGVhU2RrXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9ldmVudC9FdmVudEVudW1cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFNjZW5lIGV4dGVuZHMgdWkuVGVzdFNjZW5lVUkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvL+WFs+mXreWkmueCueinpuaOp++8jOWQpuWImeWwseaXoOaVjOS6hlxuICAgICAgICBMYXlhLk1vdXNlTWFuYWdlci5tdWx0aVRvdWNoRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tVGVzdFNjZW5lLS0tLS0tLScpXG4gICAgICAgIHRoaXMuTmF0aXZlQUQudmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgfVxuXG4gICAgb25FbmFibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnRuU2VydmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblNlcnZlcik7XG4gICAgICAgIHRoaXMuYnRuRHJhd2FsLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblBlcnNvbmFsKTtcbiAgICAgICAgdGhpcy5idG5EcmF3Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25EcmF3KTtcbiAgICAgICAgdGhpcy5idG5JbnZpdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5pbnZpdGF0aW9uKTtcbiAgICAgICAgdGhpcy5idG5WaWJyYXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25WaWJyYXRlKTtcbiAgICAgICAgdGhpcy5idG5QcmVsb2FkQUQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkQUQpO1xuICAgICAgICB0aGlzLmJ0blNob3dCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93QmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5TaG93RnVsbEFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Z1bGxBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd05hdGl2ZUFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd05hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5TaG93SW50ZXJBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dJbnRlckFkKTtcbiAgICAgICAgdGhpcy5idG5SZXdhcmRBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUmVkcGFja2V0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblJlZHBhY2tldCk7XG5cbiAgICB9XG5cbiAgICAvKirpooTliqDovb3lub/lkYogKi9cbiAgICBhc3luYyBwcmVsb2FkQUQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1wcmVsb2FkQUQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuaW5pdCgpO1xuICAgICAgICAvLyBNeUJyaWRnZS50ZXN0UmV0dXJuKGZ1bmN0aW9uICguLi5hcnJheSkge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCItLS0tLS0td2ViLS0tLS0tLS1vbkNsaWNrLS0tLS0+PmNvY29zIEpTLS0tLS0tLU15QnJpZGdlLnRlc3RSZXR1cm4tLS0tLS1cIiArIEpTT04uc3RyaW5naWZ5KGFycmF5KSk7XG5cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgLyoq5pi+56S65YWo5bGP5bm/5ZGKICovXG4gICAgc2hvd0Z1bGxBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dGdWxsQWQtLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Z1bGxBZCgpO1xuICAgICAgICAvLyB2YXIgcmV0ID0gTXlCcmlkZ2UubWFwVG9TdHJpbmcoe1xuICAgICAgICAvLyAgICAgZGF0YToge1xuICAgICAgICAvLyAgICAgICAgIFwiY291bnRcIjogMiwgXCJ0aXRsZVwiOiBbeyBcIm5hbWVcIjogXCJubm5cIiwgXCJ2YWx1ZVwiOiBcIm5ubnZhbHVlXCIsIFwiZGVmYXVsdF9zaG93XCI6IDEgfVxuICAgICAgICAvLyAgICAgICAgICAgICAsIHsgXCJuYW1lXCI6IFwibW1tXCIsIFwidmFsdWVcIjogXCJtbW12YWx1ZVxcXCJhYXNkYXNkXCIgfV1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0td2ViLS0tLS0tLS1vbkNsaWNrLS0tLS0+PmNvY29zIEpTLS0tLS0tLU15QnJpZGdlLm1hcFRvU3RyaW5nLS0tLS0tXCIgKyBKU09OLnN0cmluZ2lmeShyZXQpKTtcbiAgICB9XG4gICAgLyoq5pi+56S6YmFubmVyICovXG4gICAgc2hvd0Jhbm5lcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dCYW5uZXItLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Jhbm5lcigpO1xuICAgIH1cblxuICAgIC8qKuS/oeaBr+a1geW5v+WRiiAqL1xuICAgIHNob3dOYXRpdmVBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dOYXRpdmVBZC0tLS0tLS0nKVxuICAgICAgICB0aGlzLk5hdGl2ZUFELnZpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKuaPkuWxj+W5v+WRiiAqL1xuICAgIHNob3dJbnRlckFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0ludGVyQWQtLS0tLS0tJylcblxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopHlub/lkYogKi9cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93UmV3YXJkQWQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCd2aWRlb1R5cGUnKTtcbiAgICAgICAgLyoq5oiQ5Yqf5ZCO5omn6KGM5a+55bqU55qE5aWW5YqxICovXG4gICAgfVxuICAgIC8qKuaEj+ingeWPjemmiCAqL1xuICAgIG9wZW5TZXJ2ZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1vcGVuU2VydmVyLS0tLS0tLScpXG4gICAgICAgIEFwcFNkay5JLmZlZWRiYWNrKCk7XG4gICAgfVxuXG5cbiAgICBhc3luYyBvcGVuUmVkcGFja2V0KCkge1xuICAgICAgICBsZXQgYm9sID0gUmVkcGFja2V0TW9kZWwuSS5jaGVja1JlZHBhY2tldCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhib2wgKyAn57qi5YyF6I635Y+W57uT5p6c77yaY3VyUmVkcGFja2V0JyArIFJlZHBhY2tldE1vZGVsLkkuY3VyUmVkcGFja2V0KVxuICAgICAgICBpZiAoYm9sKSB7XG4gICAgICAgICAgICAvLyoq5by55Ye657qi5YyF55qE55WM6Z2iLCAg5pqC5pe25aSE55CG5oiQIOebtOaOpeeci+W5v+WRiuiOt+WPlumHkeW4gSAqL1xuICAgICAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKERvdEtleS5yZXdhcmRfYWQpLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5Yqg6YeR5biBXCIpXG4gICAgICAgICAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLmFkZENvaW4oKTsgLy8g55yL5a6M5bm/5ZGK6I635Y+W6ZKx77yI5q2k5pe25bey57uP5Yqg5Yiw6LSm5oi35LqG77yM5pqC5pyq5o+Q5L6b5o+Q5YmN55+l6YGT6I635Y+W5aSa5bCR6ZKx55qE5pa55rOV77yJXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bkuobpkrFcIiwgY29pbilcbiAgICAgICAgICAgICAgICBSZWRwYWNrZXRNb2RlbC5JLmdldFJlcGFja2V0KCk7Ly/orqHmlbBcbiAgICAgICAgICAgICAgICAvKirmm7TmlrDln7rmnKzmmL7npLogKi9cbiAgICAgICAgICAgICAgICBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5VUERBVEVfQ09JTik7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25WaWRlbyBlcnJvclwiKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCfnuqLljIXojrflj5bnu5PmnpzvvJonICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWRwYWNrZXRQb3B3aW4sIDApO1xuICAgIH1cblxuICAgIC8qKuaJk+W8gOS4quS6uuS4reW/gyAqL1xuICAgIG9wZW5QZXJzb25hbCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgQXBwU2RrLkkucGVyc29uYWwoKTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LICovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgQXBwU2RrLkkuaW52aXRhdGlvbigpO1xuICAgIH1cbiAgICAvL+mch+WKqFxuICAgIHByaXZhdGUgb25WaWJyYXRlKCkge1xuICAgICAgICBBcHBTZGsuSS52aWJyYXRlKDApXG4gICAgfVxuXG5cbiAgICBnZXRQcm9wcyhkYXRhKSB7XG4gICAgICAgIGxldCBib29zdGVyO1xuICAgICAgICBsZXQgcmV3YXJkTnVtID0gZGF0YS5udW07XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5aSE55CG5ri45oiP5Lit55qE6YGT5YW35pi+56S6XG4gICAgICAgICAqL1xuICAgICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgLy8gICAgIGNhc2UgNDpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA2OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5DaGFuZ2U7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDU6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlZnJlc2g7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDc6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJhbmRSZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDM6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlN0YXI7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlY2VpdmVQcm9wc1BvcHdpbiwgYm9vc3RlciwgcmV3YXJkTnVtKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnnIvlub/lkYrojrflvpfnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyB3YXRjaEFEQ29pbigpIHtcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCd2aWRlb1R5cGUnKTtcbiAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgfVxuICAgIC8qKuebtOaOpeiOt+W+l+e6ouWMhSAqL1xuICAgIGdldENvaW4oKSB7XG4gICAgICAgIC8vXGLliLfmlrDmgLvph5HluIFcbiAgICAgICAgLy8gQXBwTWFuYWdlci5JLnJlZHBhY2tldC5nZXRSZXBhY2tldCgpXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWRQYWNrZXRSZXdhcmQsIDIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EcmF3KCkge1xuICAgICAgICBBcHBTZGsuSS5vcGVuUmV3YXJkKClcbiAgICB9XG59IiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vRXZlbnRFbnVtXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50Q2VudGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgc3RhdGljIGdldCBJKCk6IExheWEuRXZlbnREaXNwYXRjaGVyIHtcbiAgICAgICAgd2luZG93WydldiddID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1pdChldmVudDogRXZlbnRFbnVtLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuSS5ldmVudChldmVudC50b1N0cmluZygpLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZCh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIGFyZ3M/OiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuSS5vbih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLkkub2ZmKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lcik7XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEV2ZW50RW51bSB7XG5cblx0Q0hFQ0tfUkVEUEFDS0VUID0gPGFueT4nY2hlY2tfcmVkcGFja2V0Jyxcblx0QVBQX1NIT1cgPSA8YW55PidhcHAuc2hvdycsXG5cdEFQUF9ISURFID0gPGFueT4nYXBwLmhpZGUnLFxuXG5cblx0VVBEQVRFX0NPSU4gPSA8YW55Pid1cGRhdGUuY29pbicsXG5cbn0iLCJpbXBvcnQgVFRBZFNkayBmcm9tIFwiLi9UVEFkU2RrXCI7XHJcbmltcG9ydCB7IEFwcFNka0RhdGEgfSBmcm9tIFwiLi9zZGtEYXRhL0FwcFNka0RhdGFcIjtcclxuaW1wb3J0IFRlYVNkaywgeyBEb3RLZXkgfSBmcm9tIFwiLi9UZWFTZGtcIjtcclxuaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZE1hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBsYXN0VmlkZW9UaW1lOiBudW1iZXI7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgIHRoaXMucHJlbG9hZEJhbm5lcigpO1xyXG4gICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5zaG93UmV3YXJkVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkRnVsbEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoMSk7XHJcbiAgICB9XHJcbiAgICBwcmVsb2FkTmF0aXZlQWRZTEgoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWROYXRpdmVBZFlMSCgxLCAxLCA2MDAsIDMwMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEludGVyQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkTmF0aXZlQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uQW5kcm9pZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFRUQWRTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKClcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWRCYW5uZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dSZXdhcmRBZChwb2ludDogRG90S2V5IHwgc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5zaG93UmV3YXJkVmlkZW9BZCgwLCBwb2ludCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGFzdFZpZGVvVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIC8vIC8vIOWKoOi9vea/gOWKseinhumikeWksei0peiwg+eUqOWFqOWxj+inhumikeW5tui/lOWbnuaIkOWKn++8gVxyXG4gICAgICAgICAgICAvLyB0aGlzLnNob3dGdWxsQWQoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XHJcbiAgICAgICAgICAgIC8vIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAvLyB9KVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIHNob3dGdWxsQWQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoKTtcclxuXHJcbiAgICAgICAgICAgIFRlYVNkay5JLmRvdChEb3RLZXkuZnVsbFNjcmVlbiwgeyBmcm9tOiAnc2hvdycgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRGdWxsQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93SW50ZXJBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hlY2tWaWRlb0luQ2QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZpZGVvVGltZSAmJiAoTGF5YS50aW1lci5jdXJyVGltZXIgLSB0aGlzLmxhc3RWaWRlb1RpbWUgPD0gMzAwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TmF0aXZlQWQoeCwgeSwgdywgaCwgcHJlbG9hZCA9IDApIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZE5hdGl2ZUV4cHJlc3NBZCh4LCB5LCB3LCBoLCBwcmVsb2FkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDkvJjph4/msYfkv6Hmga/mtYHlub/lkYpcclxuICAgIHNob3dOYXRpdmVBZFlMSCh4LCB5LCB3LCBoLCBwcmVsb2FkID0gMCkge1xyXG4gICAgICAgIHJldHVybiBUVEFkU2RrLkkubG9hZE5hdGl2ZUFkWUxIKHgsIHksIHcsIGgsIHByZWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkub3BlbkxvYWROYXRpdmVBZEV2ZW50KClcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEFkTWFuYWdlciB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChBZE1hbmFnZXIpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL0FkTWFuYWdlclwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgTHVja0RyYXdNb2RlbCBmcm9tIFwiLi9MdWNrRHJhd01vZGVsXCI7XG5pbXBvcnQgeyBBcHBTZGtEYXRhIH0gZnJvbSBcIi4vc2RrRGF0YS9BcHBTZGtEYXRhXCI7XG5pbXBvcnQgeyBMdWNrRHJhd0RhdGEgfSBmcm9tIFwiLi9zZGtEYXRhL0x1Y2tEcmF3RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHBTZGsge1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3ZlcnNpb246IHN0cmluZztcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2dhbWVDb25maWc6IG51bWJlcjtcblxuICAgIHB1YmxpYyBwYW5nb2xpbklkOiBzdHJpbmc7XG4gICAgcHVibGljIGFkbmV0SWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdWlkOiBudW1iZXJcbiAgICBwdWJsaWMgaXNNeUJyaWRnZTogYm9vbGVhblxuICAgIHB1YmxpYyBpc0hpZGU6IGJvb2xlYW5cblxuICAgIHN0YXRpYyBhc3luYyBpbml0KCkge1xuICAgICAgICBBcHBTZGsuSS5nZXRTeXN0ZW1JbmZvKClcbiAgICAgICAgQXBwU2RrLkkuaW5pdEdhbWVDb25maWcoKTtcbiAgICAgICAgQWRNYW5hZ2VyLkkuaW5pdCgpOy8v6aKE5Yqg6L295bm/5ZGKIFxuICAgICAgICBhd2FpdCBPYmplY3RJbnN0YW5jZS5nZXQoUmVkcGFja2V0TW9kZWwpLmluaXQoKTtcbiAgICAgICAgTHVja0RyYXdNb2RlbC5JLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0U2RrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG15QnJpZGdlKCkge1xuICAgICAgICBpZiAodHlwZW9mIE15QnJpZGdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE15QnJpZGdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignIG5vIHJlZ2lzdGVyIG15QnJpZGdlISEhJylcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKirojrflj5bln7rmnKzniYjmnKzkv6Hmga/ku6Xlj4rmiYvmnLrnmoTphY3nva4gKi9cbiAgICBnZXRTeXN0ZW1JbmZvKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXRTeXN0ZW1JbmZvKGtleSk7XG4gICAgICAgIGxldCB7IHcsIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsIH0gPSBKU09OLnBhcnNlKHJldCk7XG4gICAgICAgIFt0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0aGlzLl92ZXJzaW9uLFxuICAgICAgICB0aGlzLl9jaGFubmVsLCB0aGlzLnBhbmdvbGluSWQsXG4gICAgICAgIHRoaXMuYWRuZXRJZCwgdGhpcy5fbGV2ZWxdID0gW3csIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsXTtcblxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXNlckluZm8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS1nZXRVc2VySW5mb+WbnuiwgyDliY0tLS0tLS0tLS0tLS0tLS1cIilcbiAgICAgICAgICAgIHRoaXMubXlCcmlkZ2UuZ2V0R2FtZVVzZXJJbmZvKChyZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS1nZXRVc2VySW5mb+Wbnuiwgy0tLS0tLS0tLS0tLS0tLVwiLCByZXQpXG4gICAgICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgICAgICAgICBBcHBTZGtEYXRhLkkuaW5pdERhdGEocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKDEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBpbml0R2FtZUNvbmZpZygpIHtcbiAgICAgICAgdGhpcy5fZ2FtZUNvbmZpZyA9IHRoaXMuZ2V0R2FtZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmch+WKqFxuICAgICAqIEBwYXJhbSBrZXkgMCDnn63pnIfliqggMSDplb/pnIfliqhcbiAgICAgKi9cbiAgICB2aWJyYXRlKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5TeXN0ZW1GdW4oa2V5KTtcbiAgICB9XG5cbiAgICAvKirpmpDol4/lkK/liqjlsY8gKi9cbiAgICBoaWRlU3BsYXNoKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmhpZGVTcGxhc2goKTtcbiAgICB9XG5cbiAgICAvKirlvLnlh7rmj5DnjrAgKi9cbiAgICB3aXRoRHJhd2FsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLndpdGhEcmF3YWwoKTtcbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgZmVlZGJhY2soKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuZmVlZGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoga2V5IOm7mOiupDAg77yM562+5YiwIDFcbiAgICAgKi9cbiAgICBwZXJzb25hbCgpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5wZXJzb25hbCgpO1xuICAgIH1cbiAgICAvKirpgoDor7flpb3lj4sqL1xuICAgIGludml0YXRpb24oKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaW52aXRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKumCgOivt+WlveWPiyovXG4gICAgb3BlblJld2FyZCgpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5vcGVuUmV3YXJkKCk7XG4gICAgfVxuICAgIC8qKuetvuWIsCovXG4gICAgb3BlblNpZ25pbigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5vcGVuU2luZ2luKCk7XG4gICAgfVxuXG4gICAgcHV0RGF0YShrZXk6IFN0cmluZywgdmFsdWU6IFN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnB1dERhdGEoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBrZXkgIOWtmOaVsOaNrueahOaXtuWAmeeahOWUr+S4gGtleVxuICAgICAqIEByZXR1cm4gIOWtmOWCqOeahOaVsOaNrlxuICAgICAqICovXG4gICAgZ2V0RGF0YShrZXk6IFN0cmluZykge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXREYXRhKGtleSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W5ri45oiP6YWN572uXG4gICAgICovXG4gICAgcHVibGljIGdldEdhbWVDb25maWcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm15QnJpZGdlLmdldEdhbWVDb25maWcoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bmuLjmiI/phY3nva5cIixKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICBMdWNrRHJhd0RhdGEuSS5pbml0RGF0YShKU09OLnBhcnNlKHJlc3VsdClbJ2RyYXcnXSk7Ly/ovaznm5jmlbDmja7phY3nva5cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6KaB5rGC5Y+R5pS+6YeR5biBXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFXG4gICAgICovXG4gICAgYXN5bmMgYWRkR29sZChrZXkgPSAxKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UuYWRkR29sZChrZXksIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLopoHmsYLlj5HmlL7ph5HluIFcIixKU09OLnN0cmluZ2lmeShyZXMpKVxuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOimgeaxguWPkeaUvumHkeW4gSDlj6/nv7vlgI3nsbvlnotcbiAgICAgKi9cbiAgICBhc3luYyByZXdhcmRJbmZvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm15QnJpZGdlLnJld2FyZEluZm8ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvaW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDojrflj5blj4zlgI3ph5HluIFcbiAgICAgKiBAcGFyYW0gdHlwZSAx5Y6f6YeR5biBIDLlj4zlgI3ph5HluIFcbiAgICAgKi9cbiAgICBhc3luYyB0d29mb2xkUmV3YXJkKHR5cGU6IG51bWJlciA9IDEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZS50d29mb2xkUmV3YXJkKHR5cGUsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YS5jb2luKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKirojrflj5bmgLvph5HluIEgKi9cbiAgICBhc3luYyBteUNvaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UubXlDb2luKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVsnY29pbiddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgLyoq6I635Y+W5b2T5YmN5o+Q546w55qE5qGj5L2NICovXG4gICAgYXN5bmMgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5taW5XaXRoRHJhd2FsKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVsnbW9uZXknXSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKirkuIrmiqXln4vngrkgKi9cbiAgICBhcHBEb3RMb2coa2V5OiBzdHJpbmcsIHZhbHVlPykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdExvZyhrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLyoq54Ot5LqR5omT54K5ICovXG4gICAgYXBwRG90VHJhY0tpbmcoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5hcHBEb3RUcmFjS2luZyhrZXkpO1xuICAgIH1cblxuICAgIHNldENhbGxiYWNrKGZ1bk5hbWU6IHN0cmluZywgcHJhbWFzPzogYW55KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zZXRDYWxsYmFjay0tLS0gdGhpcy5teUJyaWRnZS0tLScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLm15QnJpZGdlKSlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXlCcmlkZ2VbZnVuTmFtZV0ocHJhbWFzLCByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIGRhdGEgfSA9IEpTT04ucGFyc2UocmVzKTtcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY2xvc2VBZHZlckRpYWxvZygpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuY2xvc2VBZEJhbm5lcigpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopEgKi9cbiAgICBzaG93UmV3YXJkVmlkZW9BZCh2YWx1ZTogSVZpZGVvLCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnNob3dSZXdhcmRWaWRlb0FkKHZhbHVlLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKiog5YWo5bGP5bm/5ZGKKi9cbiAgICBsb2FkRnVsbFNjcmVlblZpZGVvQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBsb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuS/oeaBr+a1geW5v+WRii0g5LyY6YeP5rGHICovXG4gICAgbG9hZE5hdGl2ZUFkWUxIKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkTmF0aXZlQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLy8g5omT5byA5L+h5oGv5rWBLeS8mOmHj+axh1xuICAgIG9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpe1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpXG4gICAgfVxuICAgIC8qKmJhbm5lciAqL1xuICAgIGxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5zaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG5cbiAgICBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgICB9XG4gICAgZ2V0IHdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFubmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgYnJpZGdlKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZ2FtZUNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dhbWVDb25maWc7XG5cbiAgICB9XG4gICAgc3RhdGljIGdldCBJKCk6IEFwcFNkayB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQXBwU2RrKTtcbiAgICB9XG5cbiAgICBcbn1cbi8vICAgICAvL+i/memHjOaYr+a1j+iniOWZqOeOr+Wig+S4i++8jCDmjqXmlLZ3ZWLkvKDov4fmnaXnmoTmtojmga9cbndpbmRvdy5vbk15QnJpZGdlUmVhZHkgPSAoKSA9PiB7XG4gICAgQXBwU2RrLkkuaXNNeUJyaWRnZSA9IHRydWU7XG4gICAgY29uc29sZS5sb2coXCJvbk15QnJpZGdlUmVhZHkgbG9hZCBmaW5pc2gsIGNvc3Q6XCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgXCJtc1wiKTtcbiAgICBNeUJyaWRnZS5BcHAub25SZXN1bWUgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgIGxheWEgb25SZXN1bWUnLCByZXQpXG4gICAgfVxuICAgIE15QnJpZGdlLkFwcC5vblBhdXNlID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIGxheWEgb25QYXVzZScsIHJldClcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVmlkZW8ge1xuICAgIHByZWxvYWRpbmc6IG51bWJlcixcbiAgICB0eXBlOiBudW1iZXIsXG59IiwiXHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi91aXRsL0RhdGVVdGlsc1wiO1xyXG5cclxuLyoq6L2s55uYIOiOt+WPlui9rOebmOacuuS8mueahCAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMdWNrRHJhd01vZGVsIHtcclxuICAgIHByaXZhdGUgX2RhdGE6IEx1Y2tEcmF3RGF0YTtcclxuXHJcbiAgICBwcml2YXRlIHByb3BSZW1vdmU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHByb3BDaGFuZ2U6IG51bWJlciA9IDA7XHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBhd2FpdCB0aGlzLmluaXREYXRhKCk7XHJcbiAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IDAsIGNoYW5nZTogMCB9KSlcclxuICAgICAgICBBcHBTZGsuSS5wdXREYXRhKCdMdWNrRHJhd1RvU2lnbicsIEpTT04uc3RyaW5naWZ5KHsgaXN0b1NpZ25pbjogMCB9KSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0RGF0YSgpIHtcclxuICAgICAgICBsZXQgZGF0YSA9IG5ldyBMdWNrRHJhd0RhdGE7XHJcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTHVja0RyYXdMYXN0VGltZScpIHx8ICcwJztcclxuICAgICAgICBkYXRhLmx1Y2tEcmF3TGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XHJcbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShkYXRhLmx1Y2tEcmF3TGFzdFRpbWUpO1xyXG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcclxuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xyXG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0x1Y2tEcmF3TGFzdFRpbWUnLCBsYXN0VGltZSk7XHJcbiAgICAgICAgICAgIGRhdGEubHVja0RyYXdMYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcclxuICAgICAgICAgICAgLyoq5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgICAgICAgICAqIDEg562+5YiwXHJcbiAgICAgICAgICAgICAqIDIg6KeG6aKRXHJcbiAgICAgICAgICAgICAqIDMg5pGH5LiA5pGHXHJcbiAgICAgICAgICAgICAqIDQg57qi5YyFXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBbXTtcclxuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbmV3IEx1Y2tEcmF3Vm87XHJcbiAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICBpdGVtLm51bSA9IDA7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlzVXNlID0gMDtcclxuICAgICAgICAgICAgICAgIGl0ZW0udXNlTnVtID0gMDtcclxuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBsaXN0O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbHVja0RyYXdEYXRhOiBhbnkgPSBhd2FpdCBBcHBTZGsuSS5nZXREYXRhKCdMdWNrRHJhd0RhdGEnKTtcclxuICAgICAgICAgICAgaWYgKGx1Y2tEcmF3RGF0YSlcclxuICAgICAgICAgICAgICAgIGRhdGEubGlzdCA9IGx1Y2tEcmF3RGF0YS5saXN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBBcHBTZGsuSS5wdXREYXRhKCdMdWNrRHJhd0RhdGEnLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCk6IEx1Y2tEcmF3RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRGF0YShpbmRleDogbnVtYmVyLCBhZGROdW06IG51bWJlciA9IDEpIHtcclxuICAgICAgICBpZih0aGlzLmRhdGEpe1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEubGlzdFtpbmRleF0ubnVtICs9IGFkZE51bTtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnTHVja0RyYXdEYXRhJywgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UHJvcERhdGEoKSB7XHJcbiAgICAgICAgbGV0IGx1Y2tEcmF3UHJvcDogYW55ID0gYXdhaXQgQXBwU2RrLkkuZ2V0RGF0YSgnbHVja0RyYXdQcm9wJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgICAtLS0tLS0teXl5eXkgbGF5YSBsdWNrRHJhd1Byb3AgJyArIEpTT04uc3RyaW5naWZ5KGx1Y2tEcmF3UHJvcCkpXHJcbiAgICAgICAgdGhpcy5wcm9wUmVtb3ZlID0gTnVtYmVyKGx1Y2tEcmF3UHJvcC5yZW1vdmUpO1xyXG4gICAgICAgIHRoaXMucHJvcENoYW5nZSA9IE51bWJlcihsdWNrRHJhd1Byb3AuY2hhbmdlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcFJlbW92ZSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZW1vdmVQcm9wKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGFuZ2VQcm9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsdWNrRHJhd1Byb3A7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlUmVtb3ZlUHJvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wUmVtb3ZlID4gMCkge1xyXG4gICAgICAgICAgICAvKiDlpITnkIbojrflvpfnrKwx5Liq6YGT5YW3Ki9cclxuICAgICAgICAgICAgdGhpcy5wcm9wUmVtb3ZlID0gMDtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IDAsIGNoYW5nZTogdGhpcy5wcm9wQ2hhbmdlIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ2hhbmdlUHJvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wQ2hhbmdlID4gMCkge1xyXG4gICAgICAgICAgICAvKiDlpITnkIbojrflvpfnrKwy5Liq6YGT5YW3Ki9cclxuICAgICAgICAgICAgdGhpcy5wcm9wQ2hhbmdlID0gMDtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IHRoaXMucHJvcFJlbW92ZSwgY2hhbmdlOiAwIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEx1Y2tEcmF3TW9kZWwge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoTHVja0RyYXdNb2RlbCkgYXMgTHVja0RyYXdNb2RlbDtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgTHVja0RyYXdEYXRhIHtcclxuICAgIGxpc3Q6IEx1Y2tEcmF3Vm9bXTtcclxuICAgIGx1Y2tEcmF3TGFzdFRpbWU6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgTHVja0RyYXdWbyB7XHJcbiAgICB0eXBlOiBudW1iZXI7XHJcbiAgICBudW06IG51bWJlcjtcclxuICAgIGlzVXNlOiBudW1iZXI7XHJcbiAgICB1c2VOdW06IG51bWJlcjtcclxufSIsImltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vQWRNYW5hZ2VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdGl2ZUFkIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZ2xvYmFsUG9pbnQgPSB0aGlzLml0ZW0ubG9jYWxUb0dsb2JhbChMYXlhLlBvaW50LkVNUFRZLCB0cnVlKTtcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd05hdGl2ZUFkKGdsb2JhbFBvaW50LngsIGdsb2JhbFBvaW50LnksIHRoaXMuaXRlbS53aWR0aCwgdGhpcy5pdGVtLmhlaWdodCk7XG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXRlbSgpOiBMYXlhLlZpZXcge1xuICAgICAgICByZXR1cm4gdGhpcy5vd25lciBhcyBhbnk7XG4gICAgfVxufSIsImltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbmltcG9ydCBUZWFTZGssIHsgRG90S2V5IH0gZnJvbSBcIi4vVGVhU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVFRBZFNkayB7XHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByZWxvYWQgIDAg55u05o6l5Yqg6L2977ybMSDpooTliqDovb1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd1Jld2FyZFZpZGVvQWQocHJlbG9hZDogbnVtYmVyID0gMCwgcG9pbnQ6IHN0cmluZyA9IERvdEtleS5wcm9sb2FkaW5nKSB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAxLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBBcHBTZGsuSS5zaG93UmV3YXJkVmlkZW9BZChkYXRhLCByZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop4bpopHlm57osINcIiwgSlNPTi5zdHJpbmdpZnkocmV0KSlcclxuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIG1zZyB9ID0gSlNPTi5wYXJzZShyZXQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8qKifmmoLml6Dop4bpopHlub/lkYrvvIHmr4/ml6Uw54K56YeN572uJyovO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuinhumikeeCueS6huWFs+mXrVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop4bpopHop4LnnIvlrozpl63lubbngrnkuoblhbPpl61cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlYVNkay5JLmRvdChEb3RLZXkucmV3YXJkX2FkLCB7IGZyb206IHBvaW50IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgndW5Db21wbGV0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgn5Yqg6L295aSx6LSlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlYVNkay5JLmRvdChEb3RLZXkucmV3YXJkX2FkX2ZhaWwsIHsgZnJvbTogcG9pbnQsIGNvZGU6IGNvZGUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogQXBwU2RrLkkud2lkdGgsXHJcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLndpZHRoICogOTAgLyA2MDAsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgICAgIHR5cGU6IDFcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQXBwU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgc2NhbGVYID0gQXBwU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgIGxldCBzY2FsZVkgPSBBcHBTZGsuSS5oZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgbGVmdDogeCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgdG9wOiB5ICogc2NhbGVZXHJcbiAgICAgICAgfVxyXG4gICAgICAgIEFwcFNkay5JLmxvYWROYXRpdmVFeHByZXNzQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE5hdGl2ZUFkWUxIKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gQXBwU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgICAgICBsZXQgc2NhbGVZID0gQXBwU2RrLkkuaGVpZ2h0IC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgICAgICAgICB3OiB3aWR0aCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IHggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgICAgICBib3R0b206IEFwcFNkay5JLmhlaWdodCAtIGhlaWdodCAqIHNjYWxlWSAtIHkgKiBzY2FsZVksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSkpXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKEFwcFNkay5JLmhlaWdodCwgaGVpZ2h0LCB5LCBzY2FsZVkpXHJcbiAgICAgICAgICAgIEFwcFNkay5JLmxvYWROYXRpdmVBZFlMSChKU09OLnN0cmluZ2lmeShkYXRhKSwgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXMpKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkxvYWROYXRpdmVBZEV2ZW50KCkge1xyXG4gICAgICAgIEFwcFNkay5JLm9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEJhbm5lckV4cHJlc3NBZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoLFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XHJcbiAgICAgICAgQXBwU2RrLkkuY2xvc2VBZHZlckRpYWxvZygpO1xyXG4gICAgfVxyXG4gICAgY2xvc2VBZEJhbm5lcigpIHtcclxuICAgICAgICBBcHBTZGsuSS5jbG9zZUFkQmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogQXBwU2RrLkkud2lkdGggKiAwLjgsXHJcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLmhlaWdodCxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgQXBwU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVFRBZFNkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUVEFkU2RrKSBhcyBUVEFkU2RrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbi8qKlxyXG4gKiDkuIrmiqXln4vngrnivYflv5dcclxuICog5YW35L2T55qE5omT54K56ZyA6KaB6Lef6L+Q6JCl6IGU57O7XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZWFTZGsge1xyXG4gICAgZG90KGtleTogc3RyaW5nLCB2YWx1ZT8pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbkFuZHJvaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodmFsdWUpID09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBBcHBTZGsuSS5hcHBEb3RMb2coa2V5LCB2YWx1ZSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVGVhU2RrIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFRlYVNkaykgYXMgVGVhU2RrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBEb3RLZXkge1xyXG4gICAgcHJvbG9hZGluZyA9ICdwcm9sb2FkaW5nJywgICAgICAgICAgICAgICAgICAvL+mihOWKoOi9vVxyXG4gICAgcmV3YXJkX2FkID0gJ3Jld2FyZF9hZCcsXHRcdCAgICAgICAgICAgIC8v6KeG6aKR5omT54K5XHJcbiAgICByZXdhcmRfYWRfZmFpbCA9ICdhZF9mYWlsJywgICAgICAgICAgICAgICAgIC8v6KeG6aKR5Yqg6L295aSx6LSlXHJcbiAgICBmdWxsU2NyZWVuID0gJ2Z1bGxTY3JlZW4nLCAgICAgICAgICAgICAgICAgIC8v5YWo5bGP6KeG6aKRXHJcbiAgICBcclxufVxyXG4iLCJpbXBvcnQgQXBwU2RrIGZyb20gXCIuL0FwcFNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nU2RrIHtcclxuICAgIGRvdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIEFwcFNkay5JLmFwcERvdFRyYWNLaW5nKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRyYWNraW5nU2RrIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFRyYWNraW5nU2RrKSBhcyBUcmFja2luZ1NkaztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGVudW0gVHJhY2tpbmdLZXkge1xyXG4gICAgUmVkUGFjazEgPSAnZXZlbnRfNScsXHJcbiAgICBSZWRQYWNrNSA9ICdldmVudF82J1xyXG59XHJcbiIsImltcG9ydCBBcnJheVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0FycmF5VXRpbHNcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlTW9kZWwge1xuICAgIHByb3RlY3RlZCBfZGF0YTogYW55ID0ge307XG4gICAgcHJpdmF0ZSB1cGRhdGVBcnI6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICAgIHByaXZhdGUga2V5VXBkYXRlQXJyOiBhbnkgPSB7fTtcblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLl9kYXRhLFxuICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXJyLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgICAgICBmdW5jKHRoaXMuX2RhdGEpO1xuICAgICAgICB9KVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5rZXlVcGRhdGVBcnIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMua2V5VXBkYXRlQXJyW2tleV07XG4gICAgICAgICAgICAgICAgYXJyICYmIGFyci5mb3JFYWNoKGZ1bmMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmdW5jKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdhaXRGb3Ioa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9kYXRhW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2IgPSBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZlVwZGF0ZShjYiwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uVXBkYXRlKGNiLCBrZXksIHRydWUpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZShmdW5jOiBGdW5jdGlvbiwga2V5Pzogc3RyaW5nLCBydW46IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgIHJ1biAmJiB2YWx1ZSAhPSBudWxsICYmIGZ1bmModmFsdWUpO1xuICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMua2V5VXBkYXRlQXJyW2tleV07XG4gICAgICAgICAgICAhYXJyICYmICh0aGlzLmtleVVwZGF0ZUFycltrZXldID0gYXJyID0gW10pO1xuICAgICAgICAgICAgYXJyLnB1c2goZnVuYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW4gJiYgZnVuYyh0aGlzLl9kYXRhKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXJyLnB1c2goZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmVXBkYXRlKGZ1bmM6IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgQXJyYXlVdGlscy5yZW1vdmVGcm9tQXJyKHRoaXMua2V5VXBkYXRlQXJyW2tleV0sIGZ1bmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQXJyYXlVdGlscy5yZW1vdmVGcm9tQXJyKHRoaXMudXBkYXRlQXJyLCBmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhckdhbWUoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tIFwiLi9CYXNlTW9kZWxcIjtcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4uLy4uL3Nkay9BZE1hbmFnZXJcIjtcbmltcG9ydCBUZWFTZGssIHsgRG90S2V5IH0gZnJvbSBcIi4uLy4uL3Nkay9UZWFTZGtcIjtcbmltcG9ydCBUcmFja2luZ1NkaywgeyBUcmFja2luZ0tleSB9IGZyb20gXCIuLi8uLi9zZGsvVHJhY2tpbmdTZGtcIjtcbmltcG9ydCB7IEdvbGRDb25maWdEYXRhIH0gZnJvbSBcIi4uLy4uL3Nkay9zZGtEYXRhL0dvbGRDb25maWdEYXRhXCI7XG5pbXBvcnQgQWRkR29sZERhdGEgZnJvbSBcIi4uLy4uL3Nkay9zZGtEYXRhL0FkZEdvbGREYXRhXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRwYWNrZXRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gICAgcHJpdmF0ZSBNQVggPSAyMDtcbiAgICAvKirlvZPlpKnpooblj5bnuqLljIXnmoTmnIDlpKfmrKHmlbAgKi9cbiAgICBwcml2YXRlIERBWV9NQVhfQ05UID0gNTA7XG4gICAgcHJpdmF0ZSBjb25mOiBhbnk7XG4gICAgcHVibGljIGN1clJlZHBhY2tldDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgY29uZkxlbjogbnVtYmVyID0gMDtcblxuICAgIC8qKuWIneWni+WMlue6ouWMhemFjee9riAqL1xuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Yid5aeL5YyW57qi5YyF6YWN572uaW5pdFwiKVxuICAgICAgICBsZXQgYXJyID0gYXdhaXQgR29sZENvbmZpZ0RhdGEuSS5nZXRHb2xkQ29uZmlnKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1SZWRwYWNrZXRNb2RlbC0tLS0tLS0nK0pTT04uc3RyaW5naWZ5KGFycikpXG4gICAgICAgIGxldCBjYXNoID0gMDtcbiAgICAgICAgdGhpcy5jb25mID0ge307XG4gICAgICAgIGFyci5mb3JFYWNoKGNvbmZEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZltjb25mRGF0YS5pZF0gPSBjb25mRGF0YTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YSgpKTtcbiAgICAgICAgdGhpcy5jb25mTGVuID0gdGhpcy5jb25mLmxlbmd0aDtcblxuICAgIH1cblxuICAgIGluaXREYXRhKCkge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBSZWRwYWNrZXREYXRhO1xuICAgICAgICBsZXQgbGFzdFRpbWUgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGRhdGEubGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG5cbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShkYXRhLmxhc3RUaW1lKTtcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5O1xuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IDA7XG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lLCBsYXN0VGltZSlcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvZGF5Q250ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS50b2RheUNudCkgfHwgJzAnO1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IHBhcnNlSW50KHRvZGF5Q250KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgZGF0YUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuZGF0YUNOVCkgfHwgJzAnO1xuICAgICAgICBkYXRhLmNudCA9IHBhcnNlSW50KGRhdGFDbnQpO1xuICAgICAgICBkYXRhLmxpc3QgPSBbXTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tSZWRwYWNrZXQoKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS50b2RheUNudCA+PSB0aGlzLkRBWV9NQVhfQ05UKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBZE1hbmFnZXIuSS5jaGVja1ZpZGVvSW5DZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8qKue6ouWMheiOt+WPluWQjuayoeacieeci+W5v+WRiumihuWPlu+8jOWGjeasoeiOt+W+l+e6ouWMheeahOacuuS8mu+8jOS4jeS8muiOt+WPlue6ouWMhe+8jCDoh6rlt7HkuZ/lj6/ku6XlpITnkIbmiJAg5a+55bqU55qE57qi5YyF5o+Q6YaS5oiW5LiN6ZyA6KaB6L+Z6YeM55qE5Yik5patICovXG4gICAgICAgIGlmICh0aGlzLmN1clJlZHBhY2tldCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmRlZmluZWQgPT09IHRoaXMuZGF0YS5jbnQpIHRoaXMuZGF0YS5jbnQgPSAwO1xuICAgICAgICBsZXQgY250ID0gdGhpcy5kYXRhLmNudDtcbiAgICAgICAgaWYgKGNudCA+PSB0aGlzLmNvbmZMZW4pIGNudCA9IHRoaXMuY29uZkxlbiAtIDE7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5jb25mW2NudCArIDFdO1xuICAgICAgICBsZXQgcmFuMiA9IE1hdGgucmFuZG9tKCk7XG5cbiAgICAgICAgaWYgKGRhdGEgJiYgcmFuMiA8IGRhdGEucGVyKSB7XG4gICAgICAgICAgICBsZXQgY2FzaCA9IDAuMDAwMDAxO1xuICAgICAgICAgICAgdGhpcy5jdXJSZWRwYWNrZXQgPSBjYXNoO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnnIvop4bpopHpoobnuqLljIVcIilcbiAgICAgICAgICAgIC8vIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgICAvLyBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoRG90S2V5LnJld2FyZF9hZClcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Yqg6YeR5biBXCIpXG4gICAgICAgICAgICAvLyBsZXQgY29pbiA9IGF3YWl0IHRoaXMuYWRkQ29pbigpOyAvLyDnnIvlrozlub/lkYrojrflj5bpkrHvvIjmraTml7blt7Lnu4/liqDliLDotKbmiLfkuobvvIzmmoLmnKrmj5Dkvpvmj5DliY3nn6XpgZPojrflj5blpJrlsJHpkrHnmoTmlrnms5XvvIlcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6I635Y+W5LqG6ZKxXCIsIGNvaW4pXG4gICAgICAgICAgICAvLyB0aGlzLmdldFJlcGFja2V0KClcbiAgICAgICAgICAgIC8vIC8qKuabtOaWsOWfuuacrOaYvuekuiAqL1xuICAgICAgICAgICAgLy8gRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uVVBEQVRFX0NPSU4pO1xuXG4gICAgICAgICAgICAvKioqICovXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0UmVwYWNrZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJSZWRwYWNrZXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5kYXRhLmNudCArPSAxO1xuICAgICAgICB0aGlzLmRhdGEubGlzdC5wdXNoKHRoaXMuY3VyUmVkcGFja2V0KTtcbiAgICAgICAgdGhpcy5kYXRhLmxhc3RUaW1lID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZGF0YS50b2RheUNudCArPSAxO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSAxKVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazEpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSA1KVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazUpO1xuICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IDA7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuZGF0YUNOVCwgdGhpcy5kYXRhLmNudCk7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIHRoaXMuZGF0YS50b2RheUNudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvKiogKi9cbiAgICBhc3luYyBnZXRDdXJSZWRwYWNrZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1clJlZHBhY2tldDtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBSZWRwYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+WFseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGdldFRvdGFsQ29pbigpIHtcbiAgICAgICAgbGV0IHRvdGFsQ29pbiA9IGF3YWl0IEFwcFNkay5JLm15Q29pbigpO1xuICAgICAgICByZXR1cm4gdG90YWxDb2luO1xuICAgIH1cbiAgICAvKirojrflj5bmnKzmrKHlpZblirHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBhZGRDb2luKCkge1xuICAgICAgICBsZXQgY29pbkRhdGEgPSBhd2FpdCBBZGRHb2xkRGF0YS5hZGRDb2luKCk7XG4gICAgICAgIHJldHVybiBjb2luRGF0YTtcbiAgICB9XG5cbiAgICAvKirojrflj5bmnIDkvY7mj5DmoaMgKi9cbiAgICBhc3luYyAgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1pbkNvaW4gPSBhd2FpdCBBcHBTZGsuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIHJldHVybiBtaW5Db2luO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUmVkcGFja2V0TW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFJlZHBhY2tldE1vZGVsKSBhcyBSZWRwYWNrZXRNb2RlbDtcbiAgICB9XG59XG5cbmNsYXNzIFJlZHBhY2tldERhdGEge1xuICAgIGNudDogbnVtYmVyO1xuICAgIGxpc3Q6IEFycmF5PG51bWJlcj47XG4gICAgbGFzdFRpbWU6IG51bWJlcjtcbiAgICB0b2RheUNudDogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWRwYWNrZXRDb25maWdEYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHBlcjogbnVtYmVyO1xuICAgIGNhc2g6IG51bWJlcjtcbn0iLCJpbXBvcnQgQXBwU2RrIGZyb20gXCIuLi9BcHBTZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkR29sZERhdGEge1xuICAgIHN0YXRpYyBjb2luOiBzdHJpbmcgPSAnMCc7XG4gICAgc3RhdGljIG15Y29pbjogc3RyaW5nID0gJzAnO1xuICAgIHN0YXRpYyBpbml0RGF0YShkYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKCFwYXJzZUludChkYXRhLmNvZGUpKSB7XG4gICAgICAgICAgICBBZGRHb2xkRGF0YS5jb2luID0gZGF0YS5kYXRhLmNvaW47XG4gICAgICAgICAgICBBZGRHb2xkRGF0YS5teWNvaW4gPSBkYXRhLmRhdGEubXljb2luO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgIGFkZENvaW4oKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBBcHBTZGsuSS5hZGRHb2xkKCk7XG4gICAgICAgIHJldHVybiBbcGFyc2VJbnQocmVzdWx0LmNvaW4pLCBwYXJzZUludChyZXN1bHQubXljb2luKV07XG4gICAgfVxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuLy8gc2Rr6L+U5Zue55qE55So5oi35L+h5oGvXHJcbmV4cG9ydCBjbGFzcyBBcHBTZGtEYXRhIGltcGxlbWVudHMgSUFwcFNka0RhdGEge1xyXG4gICAgaXNuZXc6IG51bWJlciA9IDA7XHJcbiAgICB1aWQ6IG51bWJlcjtcclxuICAgIG9wZW5pZDogc3RyaW5nO1xyXG4gICAgbmlja25hbWU6IHN0cmluZztcclxuICAgIGhlYWRpbWd1cmw6IHN0cmluZztcclxuICAgIGluaXREYXRhKGRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBkID1kYXRhLmRhdGE7XHJcbiAgICAgICAgY29uc3QgeyBpc25ldywgdWlkLCBvcGVuaWQsIG5pY2tuYW1lLCBoZWFkaW1ndXJsIH0gPSBkO1xyXG4gICAgICAgIFt0aGlzLmlzbmV3LCB0aGlzLnVpZCwgdGhpcy5vcGVuaWQsIHRoaXMubmlja25hbWUsIHRoaXMuaGVhZGltZ3VybF0gPSBbaXNuZXcsIHVpZCwgb3BlbmlkLCBuaWNrbmFtZSwgaGVhZGltZ3VybF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEFwcFNka0RhdGEge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQXBwU2RrRGF0YSkgYXMgQXBwU2RrRGF0YTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5pbnRlcmZhY2UgSUFwcFNka0RhdGEge1xyXG4gICAgaXNuZXc6IG51bWJlcjtcclxuICAgIHVpZDogbnVtYmVyO1xyXG4gICAgb3BlbmlkOiBzdHJpbmc7XHJcbiAgICBuaWNrbmFtZTogc3RyaW5nO1xyXG4gICAgaGVhZGltZ3VybDogc3RyaW5nO1xyXG59IiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uLy4uL3VpdGwvVXRpbFwiO1xyXG5pbXBvcnQgQXBwU2RrIGZyb20gXCIuLi9BcHBTZGtcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHb2xkQ29uZmlnRGF0YSB7XHJcbiAgICBhZDogT2JqZWN0O1xyXG4gICAgYWRuZXQ6IHN0cmluZztcclxuICAgIGFwcF9uYW1lOiBzdHJpbmc7XHJcbiAgICBjb2luX2NvbmZpZzogc3RyaW5nID0gJyc7XHJcbiAgICBnYW1lVXJsOiBzdHJpbmc7XHJcbiAgICBrdWFpX2FwcF9uYW1lOiBzdHJpbmc7XHJcbiAgICBwYW5nb2xpbjogc3RyaW5nO1xyXG4gICAgdFR1cmJvQWdlbnQ6IHN0cmluZztcclxuICAgIHRlYUFnZW50OiBudW1iZXI7XHJcbiAgICB0cmFja2luZzogc3RyaW5nO1xyXG4gICAgdHRBcHBMb2c6IHN0cmluZztcclxuICAgIHVtaWQ6IHN0cmluZztcclxuICAgIGdhbWVDb25maWc6IGFueTtcclxuXHJcbiAgICBjb2RlOiBudW1iZXIgPSAtMztcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHb2xkQ29uZmlnRGF0YSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSSgpOiBHb2xkQ29uZmlnRGF0YSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IEdvbGRDb25maWdEYXRhKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBpbml0RGF0YShkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jb2RlID0gZGF0YS5jb2RlO1xyXG4gICAgICAgIGlmICghZGF0YS5jb2RlKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRhdGE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGUgPSBkYXRhW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1trZXldID0gZWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEdvbGRDb25maWcoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gQXBwU2RrLkkuZ2FtZUNvbmZpZztcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0pzb24gPSBhd2FpdCB0aGlzLmxvYWRHb2xkQ2ZnKHJlc3VsdFsnY29pbl9jb25maWcnXVswXSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZ0pzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEdvbGRDZmcocmVzOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IFV0aWwuSS5sb2FkKHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0pzb247XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi8uLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBVdGlsIGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTHVja0RyYXdEYXRhIGltcGxlbWVudHMgSVR1cm5DZmcge1xyXG4gICAgcmVkX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xyXG4gICAgcmVkX3R1cm50YWJsZV9jb25maWc6IElUdXJuQ2VsbENmZztcclxuICAgIHNoYWtlX3R1cm50YWJsZV9jb25maWc6IElUdXJuQ2VsbENmZztcclxuICAgIHNoYWtlX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xyXG4gICAgc3RhdGljIGdldCBJKCk6IEx1Y2tEcmF3RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChMdWNrRHJhd0RhdGEpIGFzIEx1Y2tEcmF3RGF0YTtcclxuICAgIH1cclxuICAgIGFzeW5jIGluaXREYXRhKGRhdGE6IElUdXJuQ2ZnKSB7XHJcbiAgICAgICAgY29uc3QgeyByZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcclxuICAgICAgICAgICAgc2hha2VfdHVybnRhYmxlX2NvbmZpZywgc2hha2VfdHVybnRhYmxlX3RpbWVzIH0gPSBkYXRhO1xyXG5cclxuICAgICAgICBbdGhpcy5yZWRfdHVybnRhYmxlX3RpbWVzLCB0aGlzLnJlZF90dXJudGFibGVfY29uZmlnLCB0aGlzLnNoYWtlX3R1cm50YWJsZV9jb25maWcsIHRoaXMuc2hha2VfdHVybnRhYmxlX3RpbWVzXSA9IFtyZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcclxuICAgICAgICAgICAgc2hha2VfdHVybnRhYmxlX2NvbmZpZywgc2hha2VfdHVybnRhYmxlX3RpbWVzXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgbG9hZEdvbGRDZmcocmVzOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IFV0aWwuSS5sb2FkKHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0pzb247XHJcbiAgICB9XHJcbn1cclxuaW50ZXJmYWNlIElUdXJuQ2ZnIHtcclxuICAgIHJlZF90dXJudGFibGVfdGltZXM6IG51bWJlcjtcclxuICAgIHJlZF90dXJudGFibGVfY29uZmlnOiBJVHVybkNlbGxDZmc7XHJcbiAgICBzaGFrZV90dXJudGFibGVfY29uZmlnOiBJVHVybkNlbGxDZmc7XHJcbiAgICBzaGFrZV90dXJudGFibGVfdGltZXM6IG51bWJlcjtcclxufVxyXG5cclxuXHJcbmludGVyZmFjZSBJVHVybkNlbGxDZmcge1xyXG4gICAgZGF5X2xpbWl0OiBudW1iZXI7XHJcbiAgICByZXF1aXJlbWVudDogbnVtYmVyO1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG59XHJcblxyXG4iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIFRlc3RTY2VuZVVJIGV4dGVuZHMgU2NlbmUge1xyXG5cdFx0cHVibGljIGJ0bkludml0ZTpMYXlhLlNwcml0ZTtcblx0XHRwdWJsaWMgYnRuU2VydmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5WaWJyYXRlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5EcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZWxvYWRBRDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Jhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Z1bGxBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd05hdGl2ZUFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93SW50ZXJBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmV3YXJkQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blJlZHBhY2tldDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgTmF0aXZlQUQ6Vmlldztcblx0XHRwdWJsaWMgYnRuRHJhdzpMYXlhLkJ1dHRvbjtcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTY2VuZShcIlRlc3RTY2VuZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5UZXN0U2NlbmVVSVwiLFRlc3RTY2VuZVVJKTtcclxufVxyIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlVdGlscyB7XG4gICAgLyoqXG4gICAgICog56e76Zmk5YWD57SgXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUZyb21BcnIoYXJyOiBBcnJheTxhbnk+LCBvYmo6IGFueSkge1xuICAgICAgICBsZXQgaW5kZXggPSBhcnIuaW5kZXhPZihvYmopO1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tRnJvbUFycihhcnI6IEFycmF5PGFueT4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhcnJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOe7hOmaj+acuuaOkuW6j1xuICAgICAqL1xuICAgIHN0YXRpYyBzaHVmZmxlKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICByZXR1cm4gYXJyLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbmRleE9mKGFyciwgY2FsbGJhY2ssIGN0eD8pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGN0eCwgdGhpc1tpXSwgaSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHN0YXRpYyBlYWNoKGFyciwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbChjb250ZXh0LCBhcnJbaV0sIGksIGFycikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcXVldWUoYXJyKSB7XG4gICAgICAgIGxldCByZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBwcm9taXNlIG9mIGFycikge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcHJvbWlzZShyZXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tQXJyYXkoYXJyLCBjb3VudCkge1xuICAgICAgICBsZXQgc2h1ZmZsZWQgPSBhcnIuc2xpY2UoMCk7XG4gICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBsZXQgbWluID0gbGVuIC0gY291bnQsIHRlbXAsIGluZGV4O1xuICAgICAgICB3aGlsZSAobGVuLS0gPiBtaW4pIHtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigobGVuICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtsZW5dO1xuICAgICAgICAgICAgc2h1ZmZsZWRbbGVuXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNodWZmbGVkLnNsaWNlKG1pbik7XG4gICAgfVxufSIsIi8qKlxuICog5pel5pyf5bel5YW357G7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVVdGlscyB7XG4gICAgc3RhdGljIGdldCBub3coKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ub3dUaW1lIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBub3dUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGhpcy5ub3dUaW1lKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyB0aW1lRGF5KHRpbWVOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGltZU51bSk7XG4gICAgICAgIGxldCB5ZWFyID0gdGltZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBsZXQgZGF0ZSA9IHRpbWUuZ2V0RGF0ZSgpO1xuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHt0aGlzLmFkZChtb250aCl9LSR7dGhpcy5hZGQoZGF0ZSl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7np5LmlbDmoLzlvI/ljJblrZfnrKbkuLJcbiAgICAgKiBAcGFyYW0gc2Vjb25kIOenkuaVsFxuICAgICAqIEBwYXJhbSB0eXBlIDE6MDA6MDA6MDAgICAyOnl5eXktbW0tZGQgaDptOnMgICAgMzowMDowMCAgIDQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZChzZWNvbmQ6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSk6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQwKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDEoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMihzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gMDogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDAodDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gNjApO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcih0ICUgNjApO1xuICAgICAgICB2YXIgbWluczogc3RyaW5nO1xuICAgICAgICB2YXIgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbnMgKyBcIjpcIiArIHNlbnM7XG4gICAgfVxuXG4gICAgLy8xOiAwMDowMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMSh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhvdXJzdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gMzYwMCk7XG4gICAgICAgIGxldCBob3Vyczogc3RyaW5nO1xuICAgICAgICBsZXQgZGF5ID0gJyc7XG4gICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgaG91cnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91cnN0IDwgMTApXG4gICAgICAgICAgICAgICAgaG91cnMgPSBcIjBcIiArIGhvdXJzdDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoID0gaG91cnN0ICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA+PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gTWF0aC5mbG9vcihob3Vyc3QgLyAyNCkgKyAnZCAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgbGV0IG1pbnM6IHN0cmluZztcbiAgICAgICAgbGV0IHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXkgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzM6IDAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQzKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzI6eXl5eS1tbS1kZCBoOm06c1xuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB2YXIgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IFx0Ly/ov5Tlm57nmoTmnIjku73ku44wLTEx77ybXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4geWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiIFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnV0ZSArIFwiOlwiICsgc2Vjb25kO1xuXG4gICAgfVxuXG4gICAgLy80Onh45aSp5YmN77yMeHjlsI/ml7bliY3vvIx4eOWIhumSn+WJjVxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgdCA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0ID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0IC8gMjQpICsgXCLlpKnliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgXCLlsI/ml7bliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWUgLyA2MCkgKyBcIuWIhumSn+WJjVwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIOavj+S4quaXtumXtOWNleS9jeaJgOWvueW6lOeahOenkuaVsFxuICAgICAgICB2YXIgb25lRGF5OiBudW1iZXIgPSAzNjAwICogMjQ7XG4gICAgICAgIHZhciBvbmVIb3Vyc3Q6IG51bWJlciA9IDM2MDA7XG4gICAgICAgIHZhciBvbmVNaW5zdDogbnVtYmVyID0gNjA7XG5cbiAgICAgICAgdmFyIGRheXMgPSBNYXRoLmZsb29yKHRpbWUgLyBvbmVEYXkpO1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgLyBvbmVIb3Vyc3QpXG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgLyBvbmVNaW5zdCkgIC8vTWF0aC5mbG9vcih0aW1lICUgb25lRGF5ICUgb25lSG91cnN0IC8gb25lTWluc3QpO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgJSBvbmVNaW5zdCkgLy90aW1lO1xuXG4gICAgICAgIHZhciBkYXlzczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzczogc3RyaW5nID0gXCJcIlxuICAgICAgICB2YXIgbWluc3M6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBzZWNzczogc3RyaW5nID0gXCJcIlxuICAgICAgICBpZiAodGltZSA+IDApIHtcbiAgICAgICAgICAgIC8v5aSpXG4gICAgICAgICAgICBpZiAoZGF5cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF5c3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIC8v5bCP5pe2XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8v5YiGXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWluc3MgKyBzZWNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgc2Vjc3NcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCIwXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgbWluc3M7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IGRheXMgKyBcIuWkqVwiO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiMFwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIiArIGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheXNzICsgaG91cnNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtO1xuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0SW5zdGFuY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGNsenMgPSBbXTtcbiAgICBwcml2YXRlIHN0YXRpYyBvYmplY3RzID0gW107XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldChjbHM6IGFueSkge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5jbHpzLmluZGV4T2YoY2xzKTtcbiAgICAgICAgcmV0dXJuIChpZHggPj0gMCAmJiB0aGlzLm9iamVjdHNbaWR4XSkgfHwgdGhpcy5jcmVhdGUoY2xzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGUoY2xzOiBhbnkpIHtcbiAgICAgICAgdmFyIG9iaiA9IE9iamVjdFBvb2wucG9wKGNscyk7XG4gICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iaik7XG4gICAgICAgIHRoaXMuY2x6cy5wdXNoKGNscyk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0UG9vbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2xzQXJyID0gW107XG5cbiAgICBzdGF0aWMgcG9wKGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsc0Fyci5pbmRleE9mKGNscyk7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmNsc0Fyci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNsc0Fyci5wdXNoKGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtleSA9ICdwb29sS2V5JyArIGlkeDtcbiAgICAgICAgbGV0IGl0ZW0gPSBMYXlhLlBvb2wuZ2V0SXRlbUJ5Q2xhc3Moa2V5LCBjbHMpO1xuICAgICAgICBpdGVtLnBvb2xLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGl0ZW0pIHtcbiAgICAgICAgTGF5YS5Qb29sLnJlY292ZXIoaXRlbS5wb29sS2V5LCBpdGVtKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFNjYWxlQnV0dG9uU2NyaXB0IHtcbiBcbiAgICBwdWJsaWMgZGVsYXlUaW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtaW5TY2FsZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1vbmtleUJveDogTGF5YS5JbWFnZTtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICrorr7nva5vd25lcuWHveaVsO+8jOWPr+S7peebtOaOpeiOt+WPluWIsOa3u+WKoOmZhOWKoOiEmuacrOeahOe7hOS7tuWunuS+iyBcbiAgICAgKiovXG4gICAgcHVibGljIHNldCBvd25lcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubW9ua2V5Qm94ID0gdmFsdWU7XG4gICAgICAgIC8v6Ieq5a6a5LmJ55qE6ISa5pys5Lya5pyJ5pe25bqP6Zeu6aKY77yM5omA5Lul5Zyo5q2k5re75Yqg5LiA5Liq5bu25pe2XG4gICAgICAgIHRoaXMubW9ua2V5Qm94LmZyYW1lT25jZSgyLCB0aGlzLCB0aGlzLm9uTG9hZGVkKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25Mb2FkZWQoKTogdm9pZCB7XG4gICAgICAgLyog6K6+572u5oyJ6ZKu5Li65Y2V5oCB5oyJ6ZKuXG4gICAgICAgICoqIOWPluWAvO+8mlxuICAgICAgICAqKiAx77ya5Y2V5oCB44CC5Zu+54mH5LiN5YGa5YiH5Ymy77yM5oyJ6ZKu55qE55qu6IKk54q25oCB5Y+q5pyJ5LiA56eN44CCXG4gICAgICAgICoqIDLvvJrkuKTmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB5oyJ5LiL5ZKM57uP6L+H5Y+K6YCJ5Lit54q25oCB55qu6IKk44CCXG4gICAgICAgICoqIDPvvJrkuInmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB57uP6L+H54q25oCB55qu6IKk44CB5oyJ5LiL5ZKM6YCJ5Lit54q25oCB55qu6IKkXG4gICAgICAgICovXG4gICAgICAgIC8v5re75Yqg6byg5qCH5oyJ5LiL5LqL5Lu25L6m5ZCs44CC5oyJ5pe25pe257yp5bCP5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5zY2FsZVNtYWxsKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfmiqzotbfkuovku7bkvqblkKzjgILmiqzotbfml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9VUCwgdGhpcywgdGhpcy5zY2FsZUJpZyk7XG4gICAgICAgIC8v5re75Yqg6byg5qCH56a75byA5LqL5Lu25L6m5ZCs44CC56a75byA5pe26L+Y5Y6f5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgcHJpdmF0ZSBzY2FsZVNtYWxsKCk6dm9pZHtcbiAgICAgICAgLy/nvKnlsI/oh7MwLjjnmoTnvJPliqjmlYjmnpxcbiAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLm1vbmtleUJveCwge3NjYWxlWDowLjgsIHNjYWxlWTogMC44fSwgMik7XG4gICAgfVxuICAgIHByaXZhdGUgc2NhbGVCaWcoKTp2b2lke1xuICAgICAgICAvL+WPmOWkp+i/mOWOn+eahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjEsIHNjYWxlWToxfSwgMik7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFV0aWwge1xuICAgIHB1YmxpYyBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgIH1cbiAgICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXRpbDtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IFV0aWwge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IFV0aWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGF0YUtleSB7XG4gICAgY3VyX3JlZF9kYXlfbGltaXQgPSAnY3VyX3JlZF9kYXlfbGltaXQnLFxuICAgIGN1cl9zaGFrZV9kYXlfbGltaXQgPSAnY3VyX3NoYWtlX2RheV9saW1pdCcsXG4gICAgc2hha2VMYXN0VGltZSA9ICdzaGFrZUxhc3RUaW1lJyxcbiAgICBkYXRhQ05UID0gJ2RhdGFDTlQnLFxuICAgIHRvZGF5Q250ID0gJ3RvZGF5Q250JyxcbiAgICBsYXN0VGltZSA9ICdsYXN0VGltZScsXG59Il19