(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/plat/PlatformHaiTuoH5.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '41220ca5RFCxL2IQ5Qfron9', 'PlatformHaiTuoH5'); // script/plat/PlatformHaiTuoH5.ts "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var gameCfg_1 = require("../common/gameCfg"); var gameMethod_1 = require("../common/gameMethod"); var Xyc_1 = require("../common/Xyc"); var Config_1 = require("../Config"); var EventConst_1 = require("../data/const/EventConst"); var TypeConst_1 = require("../data/const/TypeConst"); var GameDataCenter_1 = require("../data/GameDataCenter"); var GameController_1 = require("../GameController"); var UIHelp_1 = require("../logic/ui/UIHelp"); var EventMng_1 = require("../manager/EventMng"); var PlatformBase_1 = require("./PlatformBase"); var PlatformHaiTuoH5 = /** @class */ (function (_super) { __extends(PlatformHaiTuoH5, _super); function PlatformHaiTuoH5() { var _this = _super.call(this) || this; cc.game.on(cc.game.EVENT_SHOW, function () { if (_this.isGoPay) { _this.isGoPay = false; if (Config_1.default.paySuccAdokId != null) { clearInterval(Config_1.default.paySuccAdokId); Config_1.default.paySuccAdokId = null; } Config_1.default.paySuccAdokIndex = 0; Config_1.default.paySuccAdokId = setInterval(function () { Config_1.default.paySuccAdokIndex++; if (Config_1.default.paySuccAdokIndex >= 5) { clearInterval(Config_1.default.paySuccAdokId); Config_1.default.paySuccAdokId = null; } GameDataCenter_1.default.time.sendAdok(); }, 1000); } }); window['DHMiniH5SDK'].setSwitchAccountNotification(function (callbackData) { console.log("SwitchAccount data=>", JSON.stringify(callbackData)); window['DHMiniH5SDK'].logout(function () { }); }); window['DHMiniH5SDK'].setLogoutNotification(function () { GameDataCenter_1.default.sevBack = null; Config_1.default.inGame = TypeConst_1.InGame.no; // this.restart() cc.game.restart(); }); //防沉迷 if (window['DHMiniH5SDK'].isDhApp) { console.log("注册防沉迷强制下线监听"); window['DHMiniH5SDK'].gamePreventAddiction(function (reponse) { // 在被强制下线后的回调函数中,理论上游戏应按如下步骤执行相关操作: // 第一步,清除当前登录的账号角色等信息 // 第二步,重回游戏起始页 // 第三步,再次调用 sdk.login 接口以拉起登录窗口 console.log("触发防沉迷强制下线,游戏重启"); var cb = function () { GameDataCenter_1.default.sevBack = null; Config_1.default.inGame = TypeConst_1.InGame.no; // this.restart() cc.game.restart(); }; UIHelp_1.default.ShowDialog({ content: "根据国家新闻出版署 《关于防止未成年人沉迷网络游戏的通知》、《关于进一步严格管理切实防止未成年人沉迷网络游戏的通知》的要求,您已超出今日健康体验时限,游戏将强制退出。", title: "防沉迷调整通知", txtConfirm: "我知道了", onlyConfirm: true, cbConfirm: cb }); }); } return _this; } PlatformHaiTuoH5.prototype.showLoginView = function () { var _this = this; console.log("MiniH5初始化&登录SDK"); EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.25, "login"); var packageInfo = gameCfg_1.default.packageInfo.getItem(Config_1.default.pid); var productCode = packageInfo.params[0]; //QuickSDK后台自动分配 var productKey = packageInfo.params[1]; //QuickSDK后台自动分配 try { window['DHMiniH5SDK'].login(function (result) { console.log("login data=", JSON.stringify(result)); // EventMng.emit(LoadEvent.LOAD_MESSAGE, JSON.stringify(result)) if (result.code == 0) { var data = result.data; EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login"); var params_1 = { pid: Config_1.default.pid, param: [data.accountId, data.loginType, data.token] }; setTimeout(function () { //电魂sdk漏斗打点 if (window['DHMiniH5SDK']) { window['DHMiniH5SDK'].analytics.log({ eventId: "420000::GAME_CLIENT_LOGIN_START", subEventId: "0", logLevel: "d", logContent: "游戏客户端开始请求登录游戏服", accountId: window['DHMiniH5SDK'].userInfo.accountId }, function (params) { console.log(params); }); } GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params_1, function (result) { console.log("后段验证返回"); if (result.type != 1) { if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) { GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin); } return; } EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login"); if (result.type == 1 && result.platBack) { _this.openId = result.platBack.openid; _this.loginParams = [result.platBack.token]; console.log("后端验证成功", _this.openId); _this.login(); //电魂sdk漏斗打点 if (window['DHMiniH5SDK']) { window['DHMiniH5SDK'].analytics.log({ eventId: "450000::GAME_CLIENT_LOGIN_SUCCESS", subEventId: "0", logLevel: "d", logContent: "游戏客户端登录成功", accountId: window['DHMiniH5SDK'].userInfo.accountId }, function (params) { console.log(params); }); } } else { console.log("PlayerLogin.url 返回数据异常"); if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) { GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin); } } }); }, 1000); } else { UIHelp_1.default.ShowTips("登录失败"); // GameDataCenter.plat.instance.restart() } }); } catch (error) { UIHelp_1.default.ShowTips("----" + error); // UIHelp.ShowDialog({ content: error }) } }; PlatformHaiTuoH5.prototype.pay = function (orderId, order10cs, param) { var _this = this; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; this.isGoPay = true; var serverList = GameDataCenter_1.default.user.serverList; var serverName = (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.sid; for (var _i = 0, serverList_1 = serverList; _i < serverList_1.length; _i++) { var iterator = serverList_1[_i]; if (iterator.sid == ((_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.sid)) { serverName = iterator.name; break; } } var payData = { serverId: parseInt((_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.sid), serverName: serverName, roleId: parseInt((_h = (_g = GameDataCenter_1.default.sevBack.userInfo) === null || _g === void 0 ? void 0 : _g.a) === null || _h === void 0 ? void 0 : _h.uuid), roleName: (_k = (_j = GameDataCenter_1.default.sevBack.userInfo) === null || _j === void 0 ? void 0 : _j.a) === null || _k === void 0 ? void 0 : _k.name, roleLevel: (_m = (_l = GameDataCenter_1.default.sevBack.userInfo) === null || _l === void 0 ? void 0 : _l.a) === null || _m === void 0 ? void 0 : _m.level, productId: param.productId, productName: param.productName, productNum: 1, price: param.price * 100, currencyType: "CNY", cpOrderId: orderId, areaId: Config_1.default.pid, areaName: Config_1.default.pid, memo: orderId }; console.log("拉取支付的参数:", JSON.stringify(payData)); window['DHMiniH5SDK'].payment(payData, function (response) { var _a, _b; if (response.code == 0) { // 支付成功 window['DHMiniH5SDK'].analytics.pay({ accountId: window['DHMiniH5SDK'].userInfo.accountId, roleId: window['DHMiniH5SDK'].userInfo.accountId, roleLevel: (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.level, orderId: orderId, itemId: param.productId, payAmount: param.price }, function (params) { console.log(params); }); //电魂sdk漏斗打点 if (window['DHMiniH5SDK']) { window['DHMiniH5SDK'].analytics.log({ eventId: "510000::GAME_CLIENT_PAY_SUCCESS", subEventId: "0", logLevel: "d", logContent: "发放支付道具至玩家", accountId: window['DHMiniH5SDK'].userInfo.accountId }, function (params) { console.log(params); }); } _this.isGoPay = false; if (Config_1.default.paySuccAdokId != null) { clearInterval(Config_1.default.paySuccAdokId); Config_1.default.paySuccAdokId = null; } Config_1.default.paySuccAdokIndex = 0; Config_1.default.paySuccAdokId = setInterval(function () { Config_1.default.paySuccAdokIndex++; if (Config_1.default.paySuccAdokIndex >= 5) { clearInterval(Config_1.default.paySuccAdokId); Config_1.default.paySuccAdokId = null; } GameDataCenter_1.default.time.sendAdok(); }, 1000); } else { // 其他,支付失败 } }); }; // 上报角色数据 PlatformHaiTuoH5.prototype.reportRole = function (event) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z; // • 初始化成功后调⽤. • 进⼊区服、创⻆、⻆⾊等级更新、战⼒更新时调⽤. if (GameDataCenter_1.default.sevBack == null) { return; } if (GameDataCenter_1.default.sevBack.userInfo == null) { return; } console.log("上报角色数据:", event); var onlineTime = 0; if (GameDataCenter_1.default.time.onlineTime > 0) { onlineTime = GameDataCenter_1.default.time.sevTime - GameDataCenter_1.default.time.onlineTime; } var isCreateRole = false; var level = (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.level; var type = ""; switch (event) { case TypeConst_1.ReportRoleType.create: isCreateRole = true; type = "CREATE_ROLE"; //电魂sdk漏斗打点 if (window['DHMiniH5SDK']) { window['DHMiniH5SDK'].analytics.log({ eventId: "450001::GAME_CLIENT_CREATING_A_ROLE", subEventId: "0", logLevel: "d", logContent: "游戏客户端创角成功", accountId: window['DHMiniH5SDK'].userInfo.accountId }, function (params) { console.log(params); }); } // window['DHMiniH5SDK'].analytics.register({accountId: window['DHMiniH5SDK'].userInfo.accountId}, params => { // console.log(params); // }); break; case TypeConst_1.ReportRoleType.levelup: type = "LEVEL_UP"; level++; break; case TypeConst_1.ReportRoleType.offline: break; case TypeConst_1.ReportRoleType.online: type = "LOGIN_GAME"; break; case TypeConst_1.ReportRoleType.other: break; default: break; } var power = 1; if (gameMethod_1.gameMethod.isEmpty(GameDataCenter_1.default.sevBack)) { power = 1; } else { var eps = gameMethod_1.gameMethod.ep_all(GameDataCenter_1.default.sevBack); var power1 = gameMethod_1.gameMethod.ep_power(0, eps); power = power1; } var serverName = GameDataCenter_1.default.user.getServerNameBySid((_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.sid) || ((_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.sid); var roleInfo = { type: type, isCreateRole: isCreateRole, roleCreateTime: (_h = (_g = GameDataCenter_1.default.sevBack.userInfo) === null || _g === void 0 ? void 0 : _g.a) === null || _h === void 0 ? void 0 : _h.regtime, uid: GameDataCenter_1.default.plat.instance.openId, username: (_k = (_j = GameDataCenter_1.default.sevBack.userInfo) === null || _j === void 0 ? void 0 : _j.a) === null || _k === void 0 ? void 0 : _k.name, serverId: (_m = (_l = GameDataCenter_1.default.sevBack.userInfo) === null || _l === void 0 ? void 0 : _l.a) === null || _m === void 0 ? void 0 : _m.sid, serverName: serverName, userRoleName: (_p = (_o = GameDataCenter_1.default.sevBack.userInfo) === null || _o === void 0 ? void 0 : _o.a) === null || _p === void 0 ? void 0 : _p.name, userRoleId: (_r = (_q = GameDataCenter_1.default.sevBack.userInfo) === null || _q === void 0 ? void 0 : _q.a) === null || _r === void 0 ? void 0 : _r.uuid, userRoleBalance: 0, vipLevel: 1, userRoleLevel: level, gameRolePower: power, partyId: 0, partyName: '无', }; var roleInfoJson = JSON.stringify(roleInfo); window['DHMiniH5SDK'].analytics.uploadRoleInfo({ type: type, isCreateRole: isCreateRole, roleCreateTime: (_t = (_s = GameDataCenter_1.default.sevBack.userInfo) === null || _s === void 0 ? void 0 : _s.a) === null || _t === void 0 ? void 0 : _t.regtime, serverId: parseInt((_v = (_u = GameDataCenter_1.default.sevBack.userInfo) === null || _u === void 0 ? void 0 : _u.a) === null || _v === void 0 ? void 0 : _v.sid), serverName: serverName, roleId: parseInt((_x = (_w = GameDataCenter_1.default.sevBack.userInfo) === null || _w === void 0 ? void 0 : _w.a) === null || _x === void 0 ? void 0 : _x.uuid), roleName: (_z = (_y = GameDataCenter_1.default.sevBack.userInfo) === null || _y === void 0 ? void 0 : _y.a) === null || _z === void 0 ? void 0 : _z.name, roleLevel: level, roleBalance: 0, vipLevel: 1, partyId: 0, partyName: '无', rolePower: power, partyRoleId: 1, }, function (response) { console.log(response); }); }; PlatformHaiTuoH5.prototype.openService = function () { var _a, _b, _c, _d, _e, _f; if (window['DHMiniH5SDK'].isDhApp) { window['DHMiniH5SDK'].service({ roleId: parseInt((_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.uuid), nickname: (_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.name, level: (_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.level }); } }; PlatformHaiTuoH5.prototype.checkMsg = function (str, cb) { cb(); }; return PlatformHaiTuoH5; }(PlatformBase_1.default)); exports.default = PlatformHaiTuoH5; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvcGxhdC9QbGF0Zm9ybUhhaVR1b0g1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQSw2Q0FBd0M7QUFDeEMsbURBQWtEO0FBQ2xELHFDQUE2RDtBQUU3RCxvQ0FBK0I7QUFDL0IsdURBQXFEO0FBQ3JELHFEQUErRjtBQUMvRix5REFBb0Q7QUFDcEQsb0RBQStDO0FBQy9DLDZDQUF3QztBQUN4QyxnREFBMkM7QUFDM0MsK0NBQTBDO0FBRTFDO0lBQThDLG9DQUFZO0lBR3REO1FBQUEsWUFDSSxpQkFBTyxTQXVEVjtRQXRERyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ3BCLElBQUksZ0JBQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO29CQUM5QixhQUFhLENBQUMsZ0JBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQkFDbkMsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO2lCQUM5QjtnQkFDRCxnQkFBTSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtnQkFDM0IsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO29CQUMvQixnQkFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUE7b0JBQ3pCLElBQUksZ0JBQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEVBQUU7d0JBQzlCLGFBQWEsQ0FBQyxnQkFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO3dCQUNuQyxnQkFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7cUJBQzlCO29CQUNELHdCQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUNsQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDWDtRQUNM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QyxPQUFPLENBQUMsUUFBUSwwQ0FBRSxDQUFDLDBDQUFFLElBQUk7WUFDbEQsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsS0FBSztZQUNoQixXQUFXLEVBQUUsQ0FBQztTQUNqQixFQUFFLFVBQUMsUUFBUTtZQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0Qsc0NBQVcsR0FBWDs7UUFDSSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDMUIsTUFBTSxFQUFFLFFBQVEsYUFBQyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLDBDQUFFLENBQUMsMENBQUUsSUFBSSxDQUFDO2dCQUMxRCxRQUFRLGNBQUUsd0JBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSwwQ0FBRSxDQUFDLDBDQUFFLElBQUk7Z0JBQ2xELEtBQUssY0FBRSx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLDBDQUFFLENBQUMsMENBQUUsS0FBSzthQUNuRCxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFDRCxtQ0FBUSxHQUFSLFVBQVMsR0FBVyxFQUFFLEVBQVk7UUFDOUIsRUFBRSxFQUFFLENBQUE7SUFDUixDQUFDO0lBQ0wsdUJBQUM7QUFBRCxDQTNUQSxBQTJUQyxDQTNUNkMsc0JBQVksR0EyVHpEIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBoYWl0dW9oNeeJiOacrCBzZGvphY3nva5cbiAqIFxuXG7lvq7kv6HlhoXot7PovazlhaXlj6PmmK9cblxu5ZyobWFpbi5qc+eahOacgOS4iumdolxud2luZG93Ll9femVyb19fID0ge1xuICAgIFwicGFja2FnZUlEXCI6IFwiMTAxXCIsXG59XG7lnKhvblN0YXJ05Yid5aeL5YyWc2RrXG5cbuW8leWFpVNESzrlnKhodG1s5Lit5re75Yqg5LiA5Liqc2NyaXB05qCH562+5bCx5Y+v5Lul5LqGXG4gICAgPCEtLSAvLyBINeW8leWFpeaWueiIn1NESyAtLT5cbiAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodGtTZGtfeHh4eHguanNcIj48L3NjcmlwdD5cbiAgICA8c2NyaXB0ID5cbiAgICAgICAgaGl0YWxrT3BlblNESy5pbml0KGZ1bmN0aW9uKHJlcyl7Ly/liJ3lp4vljJZzZGtcbiAgICAgICAgICAgIGlmKHJlcy5yZXRDb2RlIT0wKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJ3lp4vljJblpLHotKVcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJ3lp4vljJbmiJDlip9cIilcbiAgICAgICAgICAgIC8v6LCD55So55m75b2V5o6l5Y+jXG4gICAgICAgIH0se2dhbWVJZDozMTl9KTsgIC8v5ZCR5rW35ouT55Sz6K+36I635b6XXG4gICAgPC9zY3JpcHQ+XG4gICAgPCEtLSDlvIDlkK92Q29uc29sZSAtLT5cbiAgICA8IS0tIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly91bnBrZy5jb20vdmNvbnNvbGVAbGF0ZXN0L2Rpc3QvdmNvbnNvbGUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPHNjcmlwdD5cbiAgICAvLyBWQ29uc29sZSDpu5jorqTkvJrmjILovb3liLAgYHdpbmRvdy5WQ29uc29sZWAg5LiKXG4gICAgdmFyIHZDb25zb2xlID0gbmV3IHdpbmRvdy5WQ29uc29sZSgpO1xuICAgIDwvc2NyaXB0PiAtLT5cbiAqL1xuaW1wb3J0IE1pbnQgZnJvbSBcIi4uL3V0aWxzL21pbnRGaWx0ZXIvaW5kZXhcIjtcbmltcG9ydCBHYW1lY2ZnIGZyb20gXCIuLi9jb21tb24vZ2FtZUNmZ1wiO1xuaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgUGxheWVyTG9naW4sIFBsYXllckxvZ2luUHJhbSB9IGZyb20gXCIuLi9jb21tb24vWHljXCI7XG5pbXBvcnQgeyBTZXZCYWNrIH0gZnJvbSBcIi4uL2NvbW1vbi9YeXNcIjtcbmltcG9ydCBDb25maWcgZnJvbSBcIi4uL0NvbmZpZ1wiO1xuaW1wb3J0IHsgTG9hZEV2ZW50IH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvRXZlbnRDb25zdFwiO1xuaW1wb3J0IHsgR2FtZUVyckNvZGUsIEluR2FtZSwgUGF5UHJvZHVjdFBhcmFtLCBSZXBvcnRSb2xlVHlwZSB9IGZyb20gXCIuLi9kYXRhL2NvbnN0L1R5cGVDb25zdFwiO1xuaW1wb3J0IEdhbWVEYXRhQ2VudGVyIGZyb20gXCIuLi9kYXRhL0dhbWVEYXRhQ2VudGVyXCI7XG5pbXBvcnQgR2FtZUNvbnRyb2xsZXIgZnJvbSBcIi4uL0dhbWVDb250cm9sbGVyXCI7XG5pbXBvcnQgVUlIZWxwIGZyb20gXCIuLi9sb2dpYy91aS9VSUhlbHBcIjtcbmltcG9ydCBFdmVudE1uZyBmcm9tIFwiLi4vbWFuYWdlci9FdmVudE1uZ1wiO1xuaW1wb3J0IFBsYXRmb3JtQmFzZSBmcm9tIFwiLi9QbGF0Zm9ybUJhc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1IYWlUdW9INSBleHRlbmRzIFBsYXRmb3JtQmFzZSB7XG4gICAgaXNHb1BheTogYm9vbGVhblxuICAgIG1pbnQ6IE1pbnQ7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgY2MuZ2FtZS5vbihjYy5nYW1lLkVWRU5UX1NIT1csICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzR29QYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzR29QYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGlmIChDb25maWcucGF5U3VjY0Fkb2tJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCA9IDBcbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPj0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChDb25maWcucGF5U3VjY0Fkb2tJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2VuZEFkb2soKVxuICAgICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5zZXRTd2l0Y2hBY2NvdW50Tm90aWZpY2F0aW9uKGZ1bmN0aW9uIChjYWxsYmFja0RhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3dpdGNoQWNjb3VudCBkYXRhPT5cIiwgSlNPTi5zdHJpbmdpZnkoY2FsbGJhY2tEYXRhKSlcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5sb2dvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLnNldExvZ291dE5vdGlmaWNhdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5zZXZCYWNrID0gbnVsbFxuICAgICAgICAgICAgQ29uZmlnLmluR2FtZSA9IEluR2FtZS5ub1xuICAgICAgICAgICAgLy8gdGhpcy5yZXN0YXJ0KClcbiAgICAgICAgICAgIGNjLmdhbWUucmVzdGFydCgpXG4gICAgICAgIH0pXG4gICAgICAgIC8v6Ziy5rKJ6L+3XG4gICAgICAgIGlmICh3aW5kb3dbJ0RITWluaUg1U0RLJ10uaXNEaEFwcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLms6jlhozpmLLmsonov7flvLrliLbkuIvnur/nm5HlkKxcIilcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5nYW1lUHJldmVudEFkZGljdGlvbigocmVwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIOWcqOiiq+W8uuWItuS4i+e6v+WQjueahOWbnuiwg+WHveaVsOS4re+8jOeQhuiuuuS4iua4uOaIj+W6lOaMieWmguS4i+atpemqpOaJp+ihjOebuOWFs+aTjeS9nO+8mlxuICAgICAgICAgICAgICAgIC8vIOesrOS4gOatpe+8jOa4hemZpOW9k+WJjeeZu+W9leeahOi0puWPt+inkuiJsuetieS/oeaBr1xuICAgICAgICAgICAgICAgIC8vIOesrOS6jOatpe+8jOmHjeWbnua4uOaIj+i1t+Wni+mhtVxuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8jOWGjeasoeiwg+eUqCBzZGsubG9naW4g5o6l5Y+j5Lul5ouJ6LW355m75b2V56qX5Y+jXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop6blj5HpmLLmsonov7flvLrliLbkuIvnur/vvIzmuLjmiI/ph43lkK9cIilcbiAgICAgICAgICAgICAgICBsZXQgY2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnNldkJhY2sgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5pbkdhbWUgPSBJbkdhbWUubm9cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICAgICAgY2MuZ2FtZS5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgVUlIZWxwLlNob3dEaWFsb2coe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIuagueaNruWbveWutuaWsOmXu+WHuueJiOe9siDjgIrlhbPkuo7pmLLmraLmnKrmiJDlubTkurrmsonov7fnvZHnu5zmuLjmiI/nmoTpgJrnn6XjgIvjgIHjgIrlhbPkuo7ov5vkuIDmraXkuKXmoLznrqHnkIbliIflrp7pmLLmraLmnKrmiJDlubTkurrmsonov7fnvZHnu5zmuLjmiI/nmoTpgJrnn6XjgIvnmoTopoHmsYLvvIzmgqjlt7LotoXlh7rku4rml6XlgaXlurfkvZPpqozml7bpmZDvvIzmuLjmiI/lsIblvLrliLbpgIDlh7rjgIJcIixcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwi6Ziy5rKJ6L+36LCD5pW06YCa55+lXCIsXG4gICAgICAgICAgICAgICAgICAgIHR4dENvbmZpcm06IFwi5oiR55+l6YGT5LqGXCIsXG4gICAgICAgICAgICAgICAgICAgIG9ubHlDb25maXJtOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYkNvbmZpcm06IGNiXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3dMb2dpblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWluaUg15Yid5aeL5YyWJueZu+W9lVNES1wiKVxuICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjI1LCBcImxvZ2luXCIpXG4gICAgICAgIGxldCBwYWNrYWdlSW5mbyA9IEdhbWVjZmcucGFja2FnZUluZm8uZ2V0SXRlbShDb25maWcucGlkKVxuICAgICAgICB2YXIgcHJvZHVjdENvZGUgPSBwYWNrYWdlSW5mby5wYXJhbXNbMF07ICAgICAgICAvL1F1aWNrU0RL5ZCO5Y+w6Ieq5Yqo5YiG6YWNIFxuICAgICAgICB2YXIgcHJvZHVjdEtleSA9IHBhY2thZ2VJbmZvLnBhcmFtc1sxXTsgICAgICAgIC8vUXVpY2tTREvlkI7lj7Doh6rliqjliIbphY1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5sb2dpbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxvZ2luIGRhdGE9XCIsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgLy8gRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9NRVNTQUdFLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY29kZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gcmVzdWx0LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMC43NSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zOiBQbGF5ZXJMb2dpblByYW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTogW2RhdGEuYWNjb3VudElkLCBkYXRhLmxvZ2luVHlwZSwgZGF0YS50b2tlbl1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v55S16a2Cc2Rr5ryP5paX5omT54K5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93WydESE1pbmlINVNESyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBcIjQyMDAwMDo6R0FNRV9DTElFTlRfTE9HSU5fU1RBUlRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRXZlbnRJZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nQ29udGVudDogXCLmuLjmiI/lrqLmiLfnq6/lvIDlp4vor7fmsYLnmbvlvZXmuLjmiI/mnI1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEdhbWVDb250cm9sbGVyLm5ldHdvcmsuc2VuZChQbGF5ZXJMb2dpbi51cmwsIHBhcmFtcywgKHJlc3VsdDogU2V2QmFjaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luKSB8fCBnYW1lTWV0aG9kLmlzRW1wdHkocmVzdWx0Lndpbi5tc2dPdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSA9PSAxICYmIHJlc3VsdC5wbGF0QmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpblBhcmFtcyA9IFtyZXN1bHQucGxhdEJhY2sudG9rZW5dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nlLXprYJzZGvmvI/mlpfmiZPngrlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd1snREhNaW5pSDVTREsnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IFwiNDUwMDAwOjpHQU1FX0NMSUVOVF9MT0dJTl9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRXZlbnRJZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IFwiZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5ri45oiP5a6i5oi356uv55m75b2V5oiQ5YqfXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGxheWVyTG9naW4udXJsIOi/lOWbnuaVsOaNruW8guW4uFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQuc2hvd0VyckRpYWxvZyhHYW1lRXJyQ29kZS5lcnJHYW1lUGxhdExvZ2luKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLnmbvlvZXlpLHotKVcIilcbiAgICAgICAgICAgICAgICAgICAgLy8gR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwiLS0tLVwiICsgZXJyb3IpXG4gICAgICAgICAgICAvLyBVSUhlbHAuU2hvd0RpYWxvZyh7IGNvbnRlbnQ6IGVycm9yIH0pXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHBheShvcmRlcklkOiBzdHJpbmcsIG9yZGVyMTBjczogc3RyaW5nLCBwYXJhbTogUGF5UHJvZHVjdFBhcmFtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNHb1BheSA9IHRydWVcbiAgICAgICAgbGV0IHNlcnZlckxpc3QgPSBHYW1lRGF0YUNlbnRlci51c2VyLnNlcnZlckxpc3RcbiAgICAgICAgbGV0IHNlcnZlck5hbWUgPSBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWRcbiAgICAgICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiBzZXJ2ZXJMaXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlcmF0b3Iuc2lkID09IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnNpZCkge1xuICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgPSBpdGVyYXRvci5uYW1lXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5RGF0YSA9IHtcbiAgICAgICAgICAgIHNlcnZlcklkOiBwYXJzZUludChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWQpLFxuICAgICAgICAgICAgc2VydmVyTmFtZTogc2VydmVyTmFtZSxcbiAgICAgICAgICAgIHJvbGVJZDogcGFyc2VJbnQoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8udXVpZCksXG4gICAgICAgICAgICByb2xlTmFtZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubmFtZSxcbiAgICAgICAgICAgIHJvbGVMZXZlbDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubGV2ZWwsXG4gICAgICAgICAgICBwcm9kdWN0SWQ6IHBhcmFtLnByb2R1Y3RJZCxcbiAgICAgICAgICAgIHByb2R1Y3ROYW1lOiBwYXJhbS5wcm9kdWN0TmFtZSxcbiAgICAgICAgICAgIHByb2R1Y3ROdW06IDEsXG4gICAgICAgICAgICBwcmljZTogcGFyYW0ucHJpY2UgKiAxMDAsXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGU6IFwiQ05ZXCIsXG4gICAgICAgICAgICBjcE9yZGVySWQ6IG9yZGVySWQsXG4gICAgICAgICAgICBhcmVhSWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICBhcmVhTmFtZTogQ29uZmlnLnBpZCxcbiAgICAgICAgICAgIG1lbW86IG9yZGVySWRcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcIuaLieWPluaUr+S7mOeahOWPguaVsO+8mlwiLCBKU09OLnN0cmluZ2lmeShwYXlEYXRhKSlcbiAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLnBheW1lbnQocGF5RGF0YSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuY29kZSA9PSAwKSB7IC8vIOaUr+S7mOaIkOWKn1xuICAgICAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5hbmFseXRpY3MucGF5KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkLFxuICAgICAgICAgICAgICAgICAgICByb2xlSWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVMZXZlbDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVySWQ6IG9yZGVySWQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFyYW0ucHJvZHVjdElkLFxuICAgICAgICAgICAgICAgICAgICBwYXlBbW91bnQ6IHBhcmFtLnByaWNlXG4gICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL+eUtemtgnNka+a8j+aWl+aJk+eCuVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3dbJ0RITWluaUg1U0RLJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogXCI1MTAwMDA6OkdBTUVfQ0xJRU5UX1BBWV9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJFdmVudElkOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5Y+R5pS+5pSv5LuY6YGT5YW36Iez546p5a62XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzR29QYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGlmIChDb25maWcucGF5U3VjY0Fkb2tJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCA9IDBcbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPj0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChDb25maWcucGF5U3VjY0Fkb2tJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2VuZEFkb2soKVxuICAgICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyDlhbbku5bvvIzmlK/ku5jlpLHotKVcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8g5LiK5oql6KeS6Imy5pWw5o2uXG4gICAgcmVwb3J0Um9sZShldmVudDogUmVwb3J0Um9sZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgLy8g4oCiIOWIneWni+WMluaIkOWKn+WQjuiwg+K9pC4g4oCiIOi/m+K8iuWMuuacjeOAgeWIm+K7huOAgeK7huK+iuetiee6p+abtOaWsOOAgeaImOK8kuabtOaWsOaXtuiwg+K9pC5cbiAgICAgICAgaWYgKEdhbWVEYXRhQ2VudGVyLnNldkJhY2sgPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgICAgICBpZiAoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbyA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql6KeS6Imy5pWw5o2uOlwiLCBldmVudClcbiAgICAgICAgbGV0IG9ubGluZVRpbWUgPSAwXG4gICAgICAgIGlmIChHYW1lRGF0YUNlbnRlci50aW1lLm9ubGluZVRpbWUgPiAwKSB7XG4gICAgICAgICAgICBvbmxpbmVUaW1lID0gR2FtZURhdGFDZW50ZXIudGltZS5zZXZUaW1lIC0gR2FtZURhdGFDZW50ZXIudGltZS5vbmxpbmVUaW1lXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzQ3JlYXRlUm9sZSA9IGZhbHNlXG4gICAgICAgIGxldCBsZXZlbCA9IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LmxldmVsXG4gICAgICAgIGxldCB0eXBlID0gXCJcIlxuICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmNyZWF0ZTpcbiAgICAgICAgICAgICAgICBpc0NyZWF0ZVJvbGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiQ1JFQVRFX1JPTEVcIlxuICAgICAgICAgICAgICAgIC8v55S16a2Cc2Rr5ryP5paX5omT54K5XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd1snREhNaW5pSDVTREsnXSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3dbJ0RITWluaUg1U0RLJ10uYW5hbHl0aWNzLmxvZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBcIjQ1MDAwMTo6R0FNRV9DTElFTlRfQ1JFQVRJTkdfQV9ST0xFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJFdmVudElkOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5ri45oiP5a6i5oi356uv5Yib6KeS5oiQ5YqfXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aW5kb3dbJ0RITWluaUg1U0RLJ10uYW5hbHl0aWNzLnJlZ2lzdGVyKHthY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWR9LCBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmxldmVsdXA6XG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiTEVWRUxfVVBcIlxuICAgICAgICAgICAgICAgIGxldmVsKytcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVwb3J0Um9sZVR5cGUub2ZmbGluZTpcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZXBvcnRSb2xlVHlwZS5vbmxpbmU6XG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiTE9HSU5fR0FNRVwiXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLm90aGVyOlxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3dlciA9IDE7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoR2FtZURhdGFDZW50ZXIuc2V2QmFjaykpIHtcbiAgICAgICAgICAgIHBvd2VyID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVwcyA9IGdhbWVNZXRob2QuZXBfYWxsKEdhbWVEYXRhQ2VudGVyLnNldkJhY2spO1xuICAgICAgICAgICAgbGV0IHBvd2VyMSA9IGdhbWVNZXRob2QuZXBfcG93ZXIoMCwgZXBzKTtcbiAgICAgICAgICAgIHBvd2VyID0gcG93ZXIxXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlcnZlck5hbWUgPSBHYW1lRGF0YUNlbnRlci51c2VyLmdldFNlcnZlck5hbWVCeVNpZChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWQpIHx8IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnNpZDtcbiAgICAgICAgdmFyIHJvbGVJbmZvID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlUm9sZTogaXNDcmVhdGVSb2xlLFxuICAgICAgICAgICAgcm9sZUNyZWF0ZVRpbWU6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnJlZ3RpbWUsXG4gICAgICAgICAgICB1aWQ6IEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2Uub3BlbklkLFxuICAgICAgICAgICAgdXNlcm5hbWU6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/Lm5hbWUsXG4gICAgICAgICAgICBzZXJ2ZXJJZDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8uc2lkLFxuICAgICAgICAgICAgc2VydmVyTmFtZTogc2VydmVyTmFtZSxcbiAgICAgICAgICAgIHVzZXJSb2xlTmFtZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubmFtZSxcbiAgICAgICAgICAgIHVzZXJSb2xlSWQ6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnV1aWQsXG4gICAgICAgICAgICB1c2VyUm9sZUJhbGFuY2U6IDAsXG4gICAgICAgICAgICB2aXBMZXZlbDogMSxcbiAgICAgICAgICAgIHVzZXJSb2xlTGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgZ2FtZVJvbGVQb3dlcjogcG93ZXIsXG4gICAgICAgICAgICBwYXJ0eUlkOiAwLFxuICAgICAgICAgICAgcGFydHlOYW1lOiAn5pegJyxcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcm9sZUluZm9Kc29uID0gSlNPTi5zdHJpbmdpZnkocm9sZUluZm8pO1xuXG4gICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5hbmFseXRpY3MudXBsb2FkUm9sZUluZm8oe1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlUm9sZTogaXNDcmVhdGVSb2xlLCAvLyDku4XliJvlu7rop5LoibLml7bkvKB0cnVlLOabtOaWsOS/oeaBr+aXtuS8oGZhbHNlXG4gICAgICAgICAgICByb2xlQ3JlYXRlVGltZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ucmVndGltZSwgLy8g6KeS6Imy5Yib5bu65pe26Ze077yM5pe26Ze05oiz57K+56Gu5Yiw56eSXG4gICAgICAgICAgICBzZXJ2ZXJJZDogcGFyc2VJbnQoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8uc2lkKSwgLy8g6KeS6Imy5omA5Zyo5ri45oiP5pyN5Yqh5ZmoSURcbiAgICAgICAgICAgIHNlcnZlck5hbWU6IHNlcnZlck5hbWUsIC8vIOinkuiJsuaJgOWcqOa4uOaIj+acjeWKoeWZqOWQjeensFxuICAgICAgICAgICAgcm9sZUlkOiBwYXJzZUludChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy51dWlkKSwgLy8g6KeS6ImySURcbiAgICAgICAgICAgIHJvbGVOYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5uYW1lLCAvLyDop5LoibLlkI1cbiAgICAgICAgICAgIHJvbGVMZXZlbDogbGV2ZWwsIC8vIOinkuiJsuetiee6p1xuICAgICAgICAgICAgcm9sZUJhbGFuY2U6IDAsIC8vIOinkuiJsua4uOaIj+WGhei0p+W4geS9meminVxuICAgICAgICAgICAgdmlwTGV2ZWw6IDEsIC8vIOinkuiJslZJUOetiee6p1xuICAgICAgICAgICAgcGFydHlJZDogMCwgLy8g5YWs5LyaL+ekvuWboklEXG4gICAgICAgICAgICBwYXJ0eU5hbWU6ICfml6AnLCAvLyDlhazkvJov56S+5Zui5ZCN56ewXG4gICAgICAgICAgICByb2xlUG93ZXI6IHBvd2VyLCAvLyDop5LoibLmiJjliptcbiAgICAgICAgICAgIHBhcnR5Um9sZUlkOiAxLCAvLyDop5LoibLlnKjluK7mtL7kuK3nmoRJRFxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9wZW5TZXJ2aWNlKCkge1xuICAgICAgICBpZiAod2luZG93WydESE1pbmlINVNESyddLmlzRGhBcHApIHtcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5zZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICByb2xlSWQ6IHBhcnNlSW50KEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnV1aWQpLFxuICAgICAgICAgICAgICAgIG5pY2tuYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5uYW1lLFxuICAgICAgICAgICAgICAgIGxldmVsOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5sZXZlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tNc2coc3RyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBjYigpXG4gICAgfVxufSJdfQ==