|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/login/login_controller.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, '859a9X1XhRJLaXkg0bNqr0N', 'login_controller');
|
// Scripts/mod/login/login_controller.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 登录控制器
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
// var MainSceneController = require("mainscene_controller");
|
var LoginEvent = require("login_event");
|
|
var RoleController = require("role_controller");
|
|
var LoginPlatform = require("login_platform");
|
|
var LoginController = cc.Class({
|
"extends": BaseController,
|
ctor: function ctor() {},
|
// 初始化配置数据
|
initConfig: function initConfig() {
|
this.finish_loading = false;
|
|
var LoginModel = require("login_model");
|
|
this.model = new LoginModel();
|
this.model.initConfig();
|
this.enable_relogin = true; // 是否允许重连
|
},
|
// 注册监听事件
|
registerEvents: function registerEvents() {
|
gcore.GlobalEvent.bind(LoginEvent.LOGIN_EVENT_ACCOUNT_LOGIN_SUCCESS, function () {
|
this.model.requestDefaultServer();
|
}.bind(this));
|
gcore.GlobalEvent.bind(LoginEvent.LOGIN_EVENT_DEFSERVER_SUCCESS, function () {}.bind(this));
|
gcore.GlobalEvent.bind(gcore.GlobalEvent.EVT_SOCKET_CONNECT, function () {
|
this.enable_relogin = true;
|
|
if (this.reconnect_timer) {
|
gcore.Timer.del(this.reconnect_timer);
|
this.reconnect_timer = null;
|
game.updateWaitingStatus();
|
}
|
|
if (USE_SDK) {
|
SDK.loginGame();
|
} else {
|
this.login();
|
}
|
}.bind(this));
|
gcore.GlobalEvent.bind(gcore.GlobalEvent.EVT_SOCKET_DISCONNECT, function () {
|
this.reconnectServer();
|
}.bind(this));
|
},
|
// 注册协议接受事件
|
registerProtocals: function registerProtocals() {
|
this.RegisterProtocal(1110, this.on1110);
|
this.RegisterProtocal(10310, this.on10310);
|
this.RegisterProtocal(10101, this.on10101);
|
this.RegisterProtocal(10102, this.on10102);
|
this.RegisterProtocal(10103, this.on10103);
|
},
|
// 获取模块
|
getModel: function getModel() {
|
return this.model;
|
},
|
// 打开登录加载
|
openLoginWindow: function openLoginWindow(data) {
|
if (data && data.status) {
|
var LoginWindow = require("login_window");
|
|
if (this.login_window == null) {
|
this.login_window = new LoginWindow();
|
}
|
|
this.login_window.open(data);
|
} else {
|
if (this.login_window) {
|
this.finish_loading = false;
|
game.updateLoadingStatus(true);
|
gcore.GlobalEvent.fire(EventId.LOADING_FINISH);
|
this.login_window.close();
|
this.login_window = null;
|
}
|
}
|
},
|
getTestAccount: function getTestAccount() {
|
if (this.login_window) return this.login_window.getTestAccount();
|
},
|
// 切换登录窗体的面板状态
|
changeLoginWindowIndex: function changeLoginWindowIndex(index) {
|
if (this.login_window) {
|
this.login_window.changeSubPanel(index);
|
}
|
},
|
// 连接服务器
|
connectServer: function connectServer(host, port, ws) {
|
if (NO_SOCKET) {
|
this.openLoginWindow(false);
|
return;
|
}
|
|
var loginInfo = this.model.getLoginInfo();
|
host = host || loginInfo.host;
|
port = port || loginInfo.port;
|
ws = ws || loginInfo.ws;
|
cc.log("建立socket链接");
|
cc.log(loginInfo);
|
|
if (host && port) {
|
gcore.SmartSocket.connect(host, port, ws); // gcore.SmartSocket.connect("localhost", "9001");
|
} else {
|
message("服务器地址信息错误");
|
}
|
},
|
// 断线重线处理
|
reconnectServer: function reconnectServer() {
|
if (!this.reconnect_timer && this.enable_relogin) {
|
this.reconnect_timer = gcore.Timer.set(this.connectServer.bind(this), 3000, -1);
|
game.updateWaitingStatus(WaitingStaus.CONNECT);
|
}
|
},
|
// 登录服务器
|
login: function login() {
|
var loginInfo = this.model.getLoginInfo();
|
var data = [{
|
key: "account",
|
val: loginInfo.account
|
}, {
|
key: "channel",
|
val: CHANNEL
|
}, {
|
key: "idfa",
|
val: "windows"
|
}];
|
this.SendProtocal(1110, {
|
args: data
|
});
|
},
|
sdkLogin: function sdkLogin() {
|
// LoginPlatform
|
var protocal = {};
|
var account = this.model.getLoginData().usrName || "";
|
var srv_id = this.model.getLoginData().srv_id || "";
|
var device_id = "nicai"; // var device_id = device.getDeviceName()
|
|
var timestamp = LoginPlatform.getInstance().getTimestamp();
|
var token = LoginPlatform.getInstance().getToken();
|
var sign = LoginPlatform.getInstance().getSign();
|
var channel = LoginPlatform.getInstance().getChannel();
|
account = channel + "_" + account;
|
var final_channel = LoginPlatform.getInstance().getFinalChannel();
|
var gettui_cid = "meiyou";
|
var device_type = ""; // var gettui_cid = device.getuiId()
|
|
var idfa = "meiyou";
|
var is_emulator = "false";
|
var os_ver = "";
|
var carrier_name = "";
|
var net_type = "";
|
var app_name = GAME_NAME;
|
var package_name = GAME_NAME;
|
var package_version = "1.0.1";
|
var os = "os";
|
var logsign_str = account + device_id + idfa + channel + gettui_cid + is_emulator;
|
|
var MD5 = require("md5.min"); // cc.log("value_1==>", value);
|
|
|
var logsign = MD5(logsign_str);
|
logsign = logsign.toLowerCase();
|
protocal.args = [{
|
key: "account",
|
val: account
|
}, {
|
key: "timestamp",
|
val: timestamp
|
}, {
|
key: "enter_srv_id",
|
val: srv_id
|
}, {
|
key: "platform",
|
val: PLATFORM_NAME
|
}, {
|
key: "device_id",
|
val: device_id
|
}, {
|
key: "device_type",
|
val: device_type
|
}, {
|
key: "gettui_cid",
|
val: gettui_cid
|
}, {
|
key: "idfa",
|
val: idfa
|
}, {
|
key: "token",
|
val: token
|
}, {
|
key: "channel",
|
val: final_channel
|
}, {
|
key: "sign",
|
val: sign
|
}, {
|
key: "logsign",
|
val: logsign
|
}, {
|
key: "os_ver",
|
os_ver: os_ver
|
}, {
|
key: "carrier_name",
|
val: carrier_name
|
}, {
|
key: "net_type",
|
val: net_type
|
}, {
|
key: "os",
|
val: os
|
}, {
|
key: "emulator",
|
val: is_emulator
|
}, {
|
key: "app_name",
|
val: app_name
|
}, {
|
key: "package_name",
|
val: package_name
|
}, {
|
key: "package_version",
|
val: package_version
|
}];
|
this.SendProtocal(1110, protocal);
|
},
|
//自定义参数的SDKLogin
|
cusSDKLogin: function cusSDKLogin(data) {
|
if (!data) return;
|
var srv_id = this.model.getLoginData().srv_id || "";
|
var account = data.account;
|
var rawData = data.rawData;
|
var signature = data.signature;
|
var channel = data.channel;
|
var device_id = "";
|
var idfa = "";
|
var gettui_cid = "";
|
var is_emulator = "";
|
var package_name = data.package_name;
|
var package_version = data.package_version;
|
var app_name = "";
|
var platform = data.platform;
|
var token = data.token || "";
|
var timestamp = data.timestamp || "";
|
var sign = data.sign || "";
|
var logsign_str = account + device_id + idfa + channel + gettui_cid + is_emulator;
|
|
var MD5 = require("md5.min");
|
|
var logsign = MD5(logsign_str);
|
logsign = logsign.toLowerCase();
|
var protocal = {};
|
protocal.args = [{
|
key: "account",
|
val: account
|
}, {
|
key: "enter_srv_id",
|
val: srv_id
|
}, {
|
key: "platform",
|
val: platform
|
}, {
|
key: "device_id",
|
val: device_id
|
}, {
|
key: "gettui_cid",
|
val: gettui_cid
|
}, {
|
key: "idfa",
|
val: idfa
|
}, {
|
key: "channel",
|
val: channel
|
}, {
|
key: "logsign",
|
val: logsign
|
}, {
|
key: "emulator",
|
val: is_emulator
|
}, {
|
key: "app_name",
|
val: app_name
|
}, {
|
key: "package_name",
|
val: package_name
|
}, {
|
key: "package_version",
|
val: package_version
|
}, {
|
key: "rawData",
|
val: rawData
|
}, {
|
key: "signature",
|
val: signature
|
}, {
|
key: "token",
|
val: token
|
}, {
|
key: "timestamp",
|
val: timestamp
|
}, {
|
key: "sign",
|
val: sign
|
}];
|
cc.log(protocal);
|
this.SendProtocal(1110, protocal);
|
},
|
//自定义参数的SDKLogin
|
//data:[] 看不同平台包传入不同的内容;
|
cusSDKLogin_2: function cusSDKLogin_2(data) {
|
if (!data) return;
|
var srv_id = this.model.getLoginData().srv_id || "";
|
var device_id = "";
|
var idfa = "";
|
var gettui_cid = "";
|
var is_emulator = "";
|
var app_name = "";
|
var logsign_str = data.account + device_id + idfa + data.channel + gettui_cid + is_emulator;
|
|
var MD5 = require("md5.min");
|
|
var logsign = MD5(logsign_str);
|
logsign = logsign.toLowerCase();
|
var args = [{
|
key: "enter_srv_id",
|
val: srv_id
|
}, {
|
key: "device_id",
|
val: device_id
|
}, {
|
key: "gettui_cid",
|
val: gettui_cid
|
}, {
|
key: "idfa",
|
val: idfa
|
}, {
|
key: "logsign",
|
val: logsign
|
}, {
|
key: "emulator",
|
val: is_emulator
|
}, {
|
key: "app_name",
|
val: app_name
|
}];
|
var protocal = {};
|
protocal.args = data.concat(args);
|
cc.log("1110--protocal==>", protocal);
|
this.SendProtocal(1110, protocal);
|
},
|
// 账号角色列表信息返回
|
on1110: function on1110(data) {
|
cc.log("1110登录游戏返回");
|
cc.log(data); // 1110返回错误则不需要重连
|
|
if (data.code == 1) {
|
if (this.model.auto_login == false) {
|
//不需要主动进入服务器 比如在服务器列表中选择服
|
return;
|
}
|
|
if (this.model.isSocket) {
|
gcore.GlobalEvent.fire(LoginEvent.LOGIN_EVENT_PLAYER_INFO, data);
|
return;
|
}
|
|
if (data.roles.length == 0) {
|
this.reqCreateRole();
|
} else {
|
var role = this.role = data.roles[0];
|
this.reqLoginRole(role.rid, role.srv_id);
|
} // 提交服务器信息
|
|
|
if ((PLATFORM_TYPR == "WX_SDK" || PLATFORM_TYPR == "QQ_SDK") && USE_SDK) {
|
var loginInfo = this.model.getLoginInfo();
|
SDK.submitLogin(loginInfo.host);
|
}
|
} else if (data.code == 4) {
|
//服务器维护或者被封或者未开服
|
this.enable_relogin = false;
|
|
require("notice_controller").getInstance().openNocticeWindow(true);
|
} else {
|
this.enable_relogin = false;
|
message(data.msg);
|
}
|
},
|
getCurRoleInfo: function getCurRoleInfo() {
|
return this.role;
|
},
|
// 掉线提示, 收到该协议后将不会进行重连
|
on10310: function on10310(data) {
|
this.enable_relogin = false;
|
gcore.SmartSocket.stopHeart();
|
|
if (this.reconnect_timer) {
|
gcore.Timer.del(this.reconnect_timer);
|
this.reconnect_timer = null;
|
game.updateWaitingStatus();
|
}
|
|
if (data.is_show == 1) {
|
message(data.msg);
|
}
|
|
var GuideController = require("guide_controller");
|
|
GuideController.getInstance().setGuideMainRootWnd(false);
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.showItemApply(Utils.TI18N("该账号已在其他地方登录"), null, function () {
|
game.relogin();
|
|
if (PLATFORM_TYPR == "SH_RH") {
|
SDK.logout();
|
}
|
}.bind(this), Utils.TI18N("确定"), null, null, Utils.TI18N("提示"), null, null, true, null, null, null, null, {
|
off_y: -18,
|
close_off: true
|
}); // game.relogin();
|
},
|
// 请求创建新角色
|
reqCreateRole: function reqCreateRole() {
|
if (PLATFORM_TYPR == "SH_RH" || PLATFORM_TYPR == "SH_SDK") {
|
this.SendProtocal(10101, {
|
sex: 0,
|
name: "",
|
career: 1,
|
playform: CHANNEL
|
});
|
} else {
|
this.SendProtocal(10101, {
|
sex: 0,
|
name: "",
|
career: 1,
|
playform: PLATFORM
|
});
|
}
|
},
|
// 创建新角色返回
|
on10101: function on10101(data) {
|
if (data.code == 1) {
|
if (IS_SUBMIT) {
|
SDK.sdkSubmitUserData(2, data);
|
}
|
|
if (PLATFORM_TYPR == "SH_RH" && PLATFORM_NAME == "sh") {
|
SDK.createRole(data);
|
}
|
|
if (PLATFORM_TYPR == "SH_SDK") {
|
SDK.createRole(data);
|
}
|
|
this.model.setFirstRoleData(data);
|
this.reqLoginRole(data.rid, data.srv_id);
|
} else {
|
message(data.msg);
|
}
|
},
|
// 请求登录角色
|
reqLoginRole: function reqLoginRole(rid, srv_id) {
|
var loginInfo = this.model.getLoginInfo();
|
loginInfo.login_rid = rid;
|
loginInfo.login_srv_id = srv_id;
|
cc.log(RoleController.getInstance().init_role);
|
|
if (RoleController.getInstance().init_role) {
|
// 角色已登录 断线重连处理
|
this.SendProtocal(10103, {
|
rid: rid,
|
srv_id: srv_id
|
});
|
} else {
|
this.SendProtocal(10102, {
|
rid: rid,
|
srv_id: srv_id
|
});
|
}
|
},
|
// 角色登录成功返回
|
on10102: function on10102(data) {
|
if (data.code == 1) {
|
if (this.login_window) this.login_window.showLoading();
|
game.initConfigs(function () {
|
this.SendProtocal(10300, {});
|
}.bind(this));
|
RoleController.getInstance().getModel().setWorldLev(data.world_lev || 0);
|
} else {
|
message(data.msg);
|
}
|
|
if (this.serverListWindow) {
|
this.openServerList(false);
|
}
|
},
|
sender10300: function sender10300() {
|
this.SendProtocal(10300, {});
|
},
|
// 角色重连成功返回
|
on10103: function on10103(data) {
|
if (data.code == 1) {
|
var RoleController = require("role_controller");
|
|
RoleController.getInstance().setReconnect(true);
|
this.SendProtocal(10300, {});
|
} else {
|
message(data.msg);
|
}
|
},
|
//打开选区列表
|
openServerList: function openServerList(bool, data, callFunc) {
|
if (bool) {
|
if (!this.serverListWindow) {
|
var serverListWindow = require("server_list_window");
|
|
this.serverListWindow = new serverListWindow();
|
}
|
|
this.serverListWindow.open(data);
|
this.serverListWindow.addCallBack(callFunc);
|
} else {
|
if (this.serverListWindow) {
|
this.serverListWindow.close();
|
this.serverListWindow = null;
|
}
|
}
|
},
|
updateLoading: function updateLoading(progerss) {
|
if (this.login_window) this.login_window.updateLoading(progerss);
|
},
|
updateSeconLoading: function updateSeconLoading(progerss, isinit) {
|
if (this.login_window) this.login_window.updateSeconLoading(progerss, isinit);
|
},
|
loginPlatformRequest: function loginPlatformRequest(data) {
|
var login_data = this.model.getLoginData();
|
|
if (data.usrName != login_data.usrName) {
|
gcore.SysEnv.set("user_name", data.usrName);
|
gcore.SysEnv.set("password", data.password);
|
login_data.usrName = data.usrName;
|
login_data.password = data.password;
|
}
|
|
this.loginNewUserRequest(data);
|
},
|
loginNewUserRequest: function loginNewUserRequest(data) {
|
var info = {};
|
info.code = 1;
|
info.accName = data.usrName;
|
info.platform = PLATFORM_NAME;
|
info.msg = "";
|
this.loginPlatformResult(info);
|
},
|
loginPlatformResult: function loginPlatformResult(data) {
|
if (data.code == 1) {
|
this.model.requestDefaultServerList(data.accName, data.platform);
|
} else {}
|
},
|
//强制下线
|
sender10312: function sender10312() {
|
this.SendProtocal(10312, {});
|
}
|
});
|
module.exports = LoginController;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxsb2dpblxcbG9naW5fY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJMb2dpbkV2ZW50IiwicmVxdWlyZSIsIlJvbGVDb250cm9sbGVyIiwiTG9naW5QbGF0Zm9ybSIsIkxvZ2luQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiZmluaXNoX2xvYWRpbmciLCJMb2dpbk1vZGVsIiwibW9kZWwiLCJlbmFibGVfcmVsb2dpbiIsInJlZ2lzdGVyRXZlbnRzIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJMT0dJTl9FVkVOVF9BQ0NPVU5UX0xPR0lOX1NVQ0NFU1MiLCJyZXF1ZXN0RGVmYXVsdFNlcnZlciIsIkxPR0lOX0VWRU5UX0RFRlNFUlZFUl9TVUNDRVNTIiwiRVZUX1NPQ0tFVF9DT05ORUNUIiwicmVjb25uZWN0X3RpbWVyIiwiVGltZXIiLCJkZWwiLCJnYW1lIiwidXBkYXRlV2FpdGluZ1N0YXR1cyIsIlVTRV9TREsiLCJTREsiLCJsb2dpbkdhbWUiLCJsb2dpbiIsIkVWVF9TT0NLRVRfRElTQ09OTkVDVCIsInJlY29ubmVjdFNlcnZlciIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsIm9uMTExMCIsIm9uMTAzMTAiLCJvbjEwMTAxIiwib24xMDEwMiIsIm9uMTAxMDMiLCJnZXRNb2RlbCIsIm9wZW5Mb2dpbldpbmRvdyIsImRhdGEiLCJzdGF0dXMiLCJMb2dpbldpbmRvdyIsImxvZ2luX3dpbmRvdyIsIm9wZW4iLCJ1cGRhdGVMb2FkaW5nU3RhdHVzIiwiZmlyZSIsIkV2ZW50SWQiLCJMT0FESU5HX0ZJTklTSCIsImNsb3NlIiwiZ2V0VGVzdEFjY291bnQiLCJjaGFuZ2VMb2dpbldpbmRvd0luZGV4IiwiaW5kZXgiLCJjaGFuZ2VTdWJQYW5lbCIsImNvbm5lY3RTZXJ2ZXIiLCJob3N0IiwicG9ydCIsIndzIiwiTk9fU09DS0VUIiwibG9naW5JbmZvIiwiZ2V0TG9naW5JbmZvIiwibG9nIiwiU21hcnRTb2NrZXQiLCJjb25uZWN0IiwibWVzc2FnZSIsInNldCIsIldhaXRpbmdTdGF1cyIsIkNPTk5FQ1QiLCJrZXkiLCJ2YWwiLCJhY2NvdW50IiwiQ0hBTk5FTCIsIlNlbmRQcm90b2NhbCIsImFyZ3MiLCJzZGtMb2dpbiIsInByb3RvY2FsIiwiZ2V0TG9naW5EYXRhIiwidXNyTmFtZSIsInNydl9pZCIsImRldmljZV9pZCIsInRpbWVzdGFtcCIsImdldEluc3RhbmNlIiwiZ2V0VGltZXN0YW1wIiwidG9rZW4iLCJnZXRUb2tlbiIsInNpZ24iLCJnZXRTaWduIiwiY2hhbm5lbCIsImdldENoYW5uZWwiLCJmaW5hbF9jaGFubmVsIiwiZ2V0RmluYWxDaGFubmVsIiwiZ2V0dHVpX2NpZCIsImRldmljZV90eXBlIiwiaWRmYSIsImlzX2VtdWxhdG9yIiwib3NfdmVyIiwiY2Fycmllcl9uYW1lIiwibmV0X3R5cGUiLCJhcHBfbmFtZSIsIkdBTUVfTkFNRSIsInBhY2thZ2VfbmFtZSIsInBhY2thZ2VfdmVyc2lvbiIsIm9zIiwibG9nc2lnbl9zdHIiLCJNRDUiLCJsb2dzaWduIiwidG9Mb3dlckNhc2UiLCJQTEFURk9STV9OQU1FIiwiY3VzU0RLTG9naW4iLCJyYXdEYXRhIiwic2lnbmF0dXJlIiwicGxhdGZvcm0iLCJjdXNTREtMb2dpbl8yIiwiY29uY2F0IiwiY29kZSIsImF1dG9fbG9naW4iLCJpc1NvY2tldCIsIkxPR0lOX0VWRU5UX1BMQVlFUl9JTkZPIiwicm9sZXMiLCJsZW5ndGgiLCJyZXFDcmVhdGVSb2xlIiwicm9sZSIsInJlcUxvZ2luUm9sZSIsInJpZCIsIlBMQVRGT1JNX1RZUFIiLCJzdWJtaXRMb2dpbiIsIm9wZW5Ob2N0aWNlV2luZG93IiwibXNnIiwiZ2V0Q3VyUm9sZUluZm8iLCJzdG9wSGVhcnQiLCJpc19zaG93IiwiR3VpZGVDb250cm9sbGVyIiwic2V0R3VpZGVNYWluUm9vdFduZCIsIkNvbW1vbkFsZXJ0Iiwic2hvd0l0ZW1BcHBseSIsIlV0aWxzIiwiVEkxOE4iLCJyZWxvZ2luIiwibG9nb3V0Iiwib2ZmX3kiLCJjbG9zZV9vZmYiLCJzZXgiLCJuYW1lIiwiY2FyZWVyIiwicGxheWZvcm0iLCJQTEFURk9STSIsIklTX1NVQk1JVCIsInNka1N1Ym1pdFVzZXJEYXRhIiwiY3JlYXRlUm9sZSIsInNldEZpcnN0Um9sZURhdGEiLCJsb2dpbl9yaWQiLCJsb2dpbl9zcnZfaWQiLCJpbml0X3JvbGUiLCJzaG93TG9hZGluZyIsImluaXRDb25maWdzIiwic2V0V29ybGRMZXYiLCJ3b3JsZF9sZXYiLCJzZXJ2ZXJMaXN0V2luZG93Iiwib3BlblNlcnZlckxpc3QiLCJzZW5kZXIxMDMwMCIsInNldFJlY29ubmVjdCIsImJvb2wiLCJjYWxsRnVuYyIsImFkZENhbGxCYWNrIiwidXBkYXRlTG9hZGluZyIsInByb2dlcnNzIiwidXBkYXRlU2Vjb25Mb2FkaW5nIiwiaXNpbml0IiwibG9naW5QbGF0Zm9ybVJlcXVlc3QiLCJsb2dpbl9kYXRhIiwiU3lzRW52IiwicGFzc3dvcmQiLCJsb2dpbk5ld1VzZXJSZXF1ZXN0IiwiaW5mbyIsImFjY05hbWUiLCJsb2dpblBsYXRmb3JtUmVzdWx0IiwicmVxdWVzdERlZmF1bHRTZXJ2ZXJMaXN0Iiwic2VuZGVyMTAzMTIiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EsSUFBSUEsVUFBVSxHQUFHQyxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFFQSxJQUFJRyxlQUFlLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzNCLGFBQVNDLGNBRGtCO0FBRTNCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FD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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOeZu+W9leaOp+WItuWZqFxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gdmFyIE1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG52YXIgTG9naW5FdmVudCA9IHJlcXVpcmUoXCJsb2dpbl9ldmVudFwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIilcbnZhciBMb2dpblBsYXRmb3JtID0gcmVxdWlyZShcImxvZ2luX3BsYXRmb3JtXCIpO1xuXG52YXIgTG9naW5Db250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmZpbmlzaF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBMb2dpbk1vZGVsID0gcmVxdWlyZShcImxvZ2luX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgTG9naW5Nb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICAgICAgdGhpcy5lbmFibGVfcmVsb2dpbiA9IHRydWU7ICAgICAgICAgICAvLyDmmK/lkKblhYHorrjph43ov55cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX0FDQ09VTlRfTE9HSU5fU1VDQ0VTUywgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVxdWVzdERlZmF1bHRTZXJ2ZXIoKTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX0RFRlNFUlZFUl9TVUNDRVNTLCAoZnVuY3Rpb24gKCkge1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKGdjb3JlLkdsb2JhbEV2ZW50LkVWVF9TT0NLRVRfQ09OTkVDVCwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlX3JlbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25uZWN0X3RpbWVyKSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMucmVjb25uZWN0X3RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgZ2FtZS51cGRhdGVXYWl0aW5nU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoVVNFX1NESykge1xuICAgICAgICAgICAgICAgIFNESy5sb2dpbkdhbWUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5iaW5kKGdjb3JlLkdsb2JhbEV2ZW50LkVWVF9TT0NLRVRfRElTQ09OTkVDVCwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0U2VydmVyKCk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTExMCwgdGhpcy5vbjExMTApO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTAzMTAsIHRoaXMub24xMDMxMCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMDEwMSwgdGhpcy5vbjEwMTAxKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwMTAyLCB0aGlzLm9uMTAxMDIpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTAxMDMsIHRoaXMub24xMDEwMyk7XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaooeWdl1xuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDnmbvlvZXliqDovb1cbiAgICBvcGVuTG9naW5XaW5kb3c6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgTG9naW5XaW5kb3cgPSByZXF1aXJlKFwibG9naW5fd2luZG93XCIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93ID0gbmV3IExvZ2luV2luZG93KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93Lm9wZW4oZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaF9sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZ2FtZS51cGRhdGVMb2FkaW5nU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoRXZlbnRJZC5MT0FESU5HX0ZJTklTSClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRUZXN0QWNjb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dpbl93aW5kb3cpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbl93aW5kb3cuZ2V0VGVzdEFjY291bnQoKTtcbiAgICB9LFxuXG4gICAgLy8g5YiH5o2i55m75b2V56qX5L2T55qE6Z2i5p2/54q25oCBXG4gICAgY2hhbmdlTG9naW5XaW5kb3dJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5sb2dpbl93aW5kb3cuY2hhbmdlU3ViUGFuZWwoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi/nuaOpeacjeWKoeWZqFxuICAgIGNvbm5lY3RTZXJ2ZXI6IGZ1bmN0aW9uIChob3N0LCBwb3J0LCB3cykge1xuICAgICAgICBpZiAoTk9fU09DS0VUKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5Mb2dpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxvZ2luSW5mbyA9IHRoaXMubW9kZWwuZ2V0TG9naW5JbmZvKCk7XG4gICAgICAgIGhvc3QgPSBob3N0IHx8IGxvZ2luSW5mby5ob3N0O1xuICAgICAgICBwb3J0ID0gcG9ydCB8fCBsb2dpbkluZm8ucG9ydDtcbiAgICAgICAgd3MgPSB3cyB8fCBsb2dpbkluZm8ud3M7XG5cbiAgICAgICAgY2MubG9nKFwi5bu656uLc29ja2V06ZO+5o6lXCIpO1xuICAgICAgICBjYy5sb2cobG9naW5JbmZvKTtcblxuICAgICAgICBpZiAoaG9zdCAmJiBwb3J0KSB7XG4gICAgICAgICAgICBnY29yZS5TbWFydFNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQsIHdzKTtcbiAgICAgICAgICAgIC8vIGdjb3JlLlNtYXJ0U29ja2V0LmNvbm5lY3QoXCJsb2NhbGhvc3RcIiwgXCI5MDAxXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZShcIuacjeWKoeWZqOWcsOWdgOS/oeaBr+mUmeivr1wiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmlq3nur/ph43nur/lpITnkIZcbiAgICByZWNvbm5lY3RTZXJ2ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlY29ubmVjdF90aW1lciAmJiB0aGlzLmVuYWJsZV9yZWxvZ2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IGdjb3JlLlRpbWVyLnNldCh0aGlzLmNvbm5lY3RTZXJ2ZXIuYmluZCh0aGlzKSwgMzAwMCwgLTEpO1xuICAgICAgICAgICAgZ2FtZS51cGRhdGVXYWl0aW5nU3RhdHVzKFdhaXRpbmdTdGF1cy5DT05ORUNUKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnmbvlvZXmnI3liqHlmahcbiAgICBsb2dpbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbG9naW5JbmZvID0gdGhpcy5tb2RlbC5nZXRMb2dpbkluZm8oKTtcbiAgICAgICAgdmFyIGRhdGEgPSBbXG4gICAgICAgICAgICB7IGtleTogXCJhY2NvdW50XCIsIHZhbDogbG9naW5JbmZvLmFjY291bnQgfVxuICAgICAgICAgICAgLCB7IGtleTogXCJjaGFubmVsXCIsIHZhbDogQ0hBTk5FTCB9XG4gICAgICAgICAgICAsIHsga2V5OiBcImlkZmFcIiwgdmFsOiBcIndpbmRvd3NcIiB9XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMTAsIHsgYXJnczogZGF0YSB9KTtcbiAgICB9LFxuXG4gICAgc2RrTG9naW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTG9naW5QbGF0Zm9ybVxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fVxuICAgICAgICB2YXIgYWNjb3VudCA9IHRoaXMubW9kZWwuZ2V0TG9naW5EYXRhKCkudXNyTmFtZSB8fCBcIlwiO1xuICAgICAgICB2YXIgc3J2X2lkID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKS5zcnZfaWQgfHwgXCJcIjtcbiAgICAgICAgdmFyIGRldmljZV9pZCA9IFwibmljYWlcIlxuICAgICAgICAvLyB2YXIgZGV2aWNlX2lkID0gZGV2aWNlLmdldERldmljZU5hbWUoKVxuICAgICAgICB2YXIgdGltZXN0YW1wID0gTG9naW5QbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICB2YXIgdG9rZW4gPSBMb2dpblBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0VG9rZW4oKTtcbiAgICAgICAgdmFyIHNpZ24gPSBMb2dpblBsYXRmb3JtLmdldEluc3RhbmNlKCkuZ2V0U2lnbigpO1xuICAgICAgICB2YXIgY2hhbm5lbCA9IExvZ2luUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRDaGFubmVsKCk7XG4gICAgICAgIGFjY291bnQgPSBjaGFubmVsICsgXCJfXCIgKyBhY2NvdW50O1xuICAgICAgICB2YXIgZmluYWxfY2hhbm5lbCA9IExvZ2luUGxhdGZvcm0uZ2V0SW5zdGFuY2UoKS5nZXRGaW5hbENoYW5uZWwoKTtcbiAgICAgICAgdmFyIGdldHR1aV9jaWQgPSBcIm1laXlvdVwiO1xuICAgICAgICB2YXIgZGV2aWNlX3R5cGUgPSBcIlwiO1xuICAgICAgICAvLyB2YXIgZ2V0dHVpX2NpZCA9IGRldmljZS5nZXR1aUlkKClcbiAgICAgICAgdmFyIGlkZmEgPSBcIm1laXlvdVwiO1xuICAgICAgICB2YXIgaXNfZW11bGF0b3IgPSBcImZhbHNlXCI7XG4gICAgICAgIHZhciBvc192ZXIgPSBcIlwiO1xuICAgICAgICB2YXIgY2Fycmllcl9uYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIG5ldF90eXBlID0gXCJcIjtcbiAgICAgICAgdmFyIGFwcF9uYW1lID0gR0FNRV9OQU1FO1xuICAgICAgICB2YXIgcGFja2FnZV9uYW1lID0gR0FNRV9OQU1FO1xuICAgICAgICB2YXIgcGFja2FnZV92ZXJzaW9uID0gXCIxLjAuMVwiO1xuICAgICAgICB2YXIgb3MgPSBcIm9zXCI7XG5cbiAgICAgICAgdmFyIGxvZ3NpZ25fc3RyID0gYWNjb3VudCArIGRldmljZV9pZCArIGlkZmEgKyBjaGFubmVsICsgZ2V0dHVpX2NpZCArIGlzX2VtdWxhdG9yO1xuICAgICAgICB2YXIgTUQ1ID0gcmVxdWlyZShcIm1kNS5taW5cIik7XG4gICAgICAgIC8vIGNjLmxvZyhcInZhbHVlXzE9PT5cIiwgdmFsdWUpO1xuICAgICAgICB2YXIgbG9nc2lnbiA9IE1ENShsb2dzaWduX3N0cik7XG4gICAgICAgIGxvZ3NpZ24gPSBsb2dzaWduLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgcHJvdG9jYWwuYXJncyA9IFtcbiAgICAgICAgICAgIHsga2V5OiBcImFjY291bnRcIiwgdmFsOiBhY2NvdW50IH0sXG4gICAgICAgICAgICB7IGtleTogXCJ0aW1lc3RhbXBcIiwgdmFsOiB0aW1lc3RhbXAgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImVudGVyX3Nydl9pZFwiLCB2YWw6IHNydl9pZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwicGxhdGZvcm1cIiwgdmFsOiBQTEFURk9STV9OQU1FIH0sXG4gICAgICAgICAgICB7IGtleTogXCJkZXZpY2VfaWRcIiwgdmFsOiBkZXZpY2VfaWQgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImRldmljZV90eXBlXCIsIHZhbDogZGV2aWNlX3R5cGUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImdldHR1aV9jaWRcIiwgdmFsOiBnZXR0dWlfY2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJpZGZhXCIsIHZhbDogaWRmYSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidG9rZW5cIiwgdmFsOiB0b2tlbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2hhbm5lbFwiLCB2YWw6IGZpbmFsX2NoYW5uZWwgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInNpZ25cIiwgdmFsOiBzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJsb2dzaWduXCIsIHZhbDogbG9nc2lnbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwib3NfdmVyXCIsIG9zX3ZlciB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2Fycmllcl9uYW1lXCIsIHZhbDogY2Fycmllcl9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJuZXRfdHlwZVwiLCB2YWw6IG5ldF90eXBlIH0sXG4gICAgICAgICAgICB7IGtleTogXCJvc1wiLCB2YWw6IG9zIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwYWNrYWdlX25hbWVcIiwgdmFsOiBwYWNrYWdlX25hbWUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInBhY2thZ2VfdmVyc2lvblwiLCB2YWw6IHBhY2thZ2VfdmVyc2lvbiB9XG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+iHquWumuS5ieWPguaVsOeahFNES0xvZ2luXG4gICAgY3VzU0RLTG9naW46IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBzcnZfaWQgPSB0aGlzLm1vZGVsLmdldExvZ2luRGF0YSgpLnNydl9pZCB8fCBcIlwiO1xuICAgICAgICB2YXIgYWNjb3VudCA9IGRhdGEuYWNjb3VudDtcbiAgICAgICAgdmFyIHJhd0RhdGEgPSBkYXRhLnJhd0RhdGE7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSBkYXRhLnNpZ25hdHVyZTtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBkYXRhLmNoYW5uZWw7XG4gICAgICAgIHZhciBkZXZpY2VfaWQgPSBcIlwiO1xuICAgICAgICB2YXIgaWRmYSA9IFwiXCI7XG4gICAgICAgIHZhciBnZXR0dWlfY2lkID0gXCJcIjtcbiAgICAgICAgdmFyIGlzX2VtdWxhdG9yID0gXCJcIjtcbiAgICAgICAgdmFyIHBhY2thZ2VfbmFtZSA9IGRhdGEucGFja2FnZV9uYW1lO1xuICAgICAgICB2YXIgcGFja2FnZV92ZXJzaW9uID0gZGF0YS5wYWNrYWdlX3ZlcnNpb247XG4gICAgICAgIHZhciBhcHBfbmFtZSA9IFwiXCI7XG4gICAgICAgIHZhciBwbGF0Zm9ybSA9IGRhdGEucGxhdGZvcm07XG4gICAgICAgIHZhciB0b2tlbiA9IGRhdGEudG9rZW4gfHxcIlwiO1xuICAgICAgICB2YXIgdGltZXN0YW1wID0gZGF0YS50aW1lc3RhbXAgfHwgXCJcIjtcbiAgICAgICAgdmFyIHNpZ24gPSBkYXRhLnNpZ24gfHwgXCJcIjtcblxuICAgICAgICB2YXIgbG9nc2lnbl9zdHIgPSBhY2NvdW50ICsgZGV2aWNlX2lkICsgaWRmYSArIGNoYW5uZWwgKyBnZXR0dWlfY2lkICsgaXNfZW11bGF0b3I7XG4gICAgICAgIHZhciBNRDUgPSByZXF1aXJlKFwibWQ1Lm1pblwiKTtcbiAgICAgICAgdmFyIGxvZ3NpZ24gPSBNRDUobG9nc2lnbl9zdHIpO1xuICAgICAgICBsb2dzaWduID0gbG9nc2lnbi50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLmFyZ3MgPSBbXG4gICAgICAgICAgICB7IGtleTogXCJhY2NvdW50XCIsIHZhbDogYWNjb3VudCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiZW50ZXJfc3J2X2lkXCIsIHZhbDogc3J2X2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwbGF0Zm9ybVwiLCB2YWw6IHBsYXRmb3JtIH0sXG4gICAgICAgICAgICB7IGtleTogXCJkZXZpY2VfaWRcIiwgdmFsOiBkZXZpY2VfaWQgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImdldHR1aV9jaWRcIiwgdmFsOiBnZXR0dWlfY2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJpZGZhXCIsIHZhbDogaWRmYSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiY2hhbm5lbFwiLCB2YWw6IGNoYW5uZWwgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImxvZ3NpZ25cIiwgdmFsOiBsb2dzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgICAgICB7IGtleTogXCJwYWNrYWdlX25hbWVcIiwgdmFsOiBwYWNrYWdlX25hbWUgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInBhY2thZ2VfdmVyc2lvblwiLCB2YWw6IHBhY2thZ2VfdmVyc2lvbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwicmF3RGF0YVwiLCB2YWw6IHJhd0RhdGEgfSxcbiAgICAgICAgICAgIHsga2V5OiBcInNpZ25hdHVyZVwiLCB2YWw6IHNpZ25hdHVyZSB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidG9rZW5cIiwgdmFsOiB0b2tlbiB9LFxuICAgICAgICAgICAgeyBrZXk6IFwidGltZXN0YW1wXCIsIHZhbDogdGltZXN0YW1wIH0sXG4gICAgICAgICAgICB7IGtleTogXCJzaWduXCIsIHZhbDogc2lnbiB9XG4gICAgICAgIF07XG5cbiAgICAgICAgY2MubG9nKHByb3RvY2FsKTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL+iHquWumuS5ieWPguaVsOeahFNES0xvZ2luXG4gICAgLy9kYXRhOltdICDnnIvkuI3lkIzlubPlj7DljIXkvKDlhaXkuI3lkIznmoTlhoXlrrnvvJtcbiAgICBjdXNTREtMb2dpbl8yOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVyblxuICAgICAgICB2YXIgc3J2X2lkID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKS5zcnZfaWQgfHwgXCJcIjtcbiAgICAgICAgdmFyIGRldmljZV9pZCA9IFwiXCI7XG4gICAgICAgIHZhciBpZGZhID0gXCJcIjtcbiAgICAgICAgdmFyIGdldHR1aV9jaWQgPSBcIlwiO1xuICAgICAgICB2YXIgaXNfZW11bGF0b3IgPSBcIlwiO1xuICAgICAgICB2YXIgYXBwX25hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgbG9nc2lnbl9zdHIgPSBkYXRhLmFjY291bnQgKyBkZXZpY2VfaWQgKyBpZGZhICsgZGF0YS5jaGFubmVsICsgZ2V0dHVpX2NpZCArIGlzX2VtdWxhdG9yO1xuICAgICAgICB2YXIgTUQ1ID0gcmVxdWlyZShcIm1kNS5taW5cIik7XG4gICAgICAgIHZhciBsb2dzaWduID0gTUQ1KGxvZ3NpZ25fc3RyKTtcbiAgICAgICAgbG9nc2lnbiA9IGxvZ3NpZ24udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICB2YXIgYXJncyA9IFtcbiAgICAgICAgICAgIHsga2V5OiBcImVudGVyX3Nydl9pZFwiLCB2YWw6IHNydl9pZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiZGV2aWNlX2lkXCIsIHZhbDogZGV2aWNlX2lkIH0sXG4gICAgICAgICAgICB7IGtleTogXCJnZXR0dWlfY2lkXCIsIHZhbDogZ2V0dHVpX2NpZCB9LFxuICAgICAgICAgICAgeyBrZXk6IFwiaWRmYVwiLCB2YWw6IGlkZmEgfSxcbiAgICAgICAgICAgIHsga2V5OiBcImxvZ3NpZ25cIiwgdmFsOiBsb2dzaWduIH0sXG4gICAgICAgICAgICB7IGtleTogXCJlbXVsYXRvclwiLCB2YWw6IGlzX2VtdWxhdG9yIH0sXG4gICAgICAgICAgICB7IGtleTogXCJhcHBfbmFtZVwiLCB2YWw6IGFwcF9uYW1lIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmFyZ3MgPSBkYXRhLmNvbmNhdChhcmdzKVxuXG4gICAgICAgIGNjLmxvZyhcIjExMTAtLXByb3RvY2FsPT0+XCIsIHByb3RvY2FsKTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTExMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyDotKblj7fop5LoibLliJfooajkv6Hmga/ov5Tlm55cbiAgICBvbjExMTA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhcIjExMTDnmbvlvZXmuLjmiI/ov5Tlm55cIik7XG4gICAgICAgIGNjLmxvZyhkYXRhKTtcblxuICAgICAgICAvLyAxMTEw6L+U5Zue6ZSZ6K+v5YiZ5LiN6ZyA6KaB6YeN6L+eXG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuYXV0b19sb2dpbiA9PSBmYWxzZSkgey8v5LiN6ZyA6KaB5Li75Yqo6L+b5YWl5pyN5Yqh5ZmoIOavlOWmguWcqOacjeWKoeWZqOWIl+ihqOS4remAieaLqeacjVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmlzU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShMb2dpbkV2ZW50LkxPR0lOX0VWRU5UX1BMQVlFUl9JTkZPLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEucm9sZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcUNyZWF0ZVJvbGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJvbGUgPSB0aGlzLnJvbGUgPSBkYXRhLnJvbGVzWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxTG9naW5Sb2xlKHJvbGUucmlkLCByb2xlLnNydl9pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOaPkOS6pOacjeWKoeWZqOS/oeaBr1xuICAgICAgICAgICAgaWYgKChQTEFURk9STV9UWVBSID09IFwiV1hfU0RLXCIgfHwgUExBVEZPUk1fVFlQUiA9PSBcIlFRX1NES1wiKSAmJiBVU0VfU0RLKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvZ2luSW5mbyA9IHRoaXMubW9kZWwuZ2V0TG9naW5JbmZvKCk7XG4gICAgICAgICAgICAgICAgU0RLLnN1Ym1pdExvZ2luKGxvZ2luSW5mby5ob3N0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvZGUgPT0gNCkgeyAvL+acjeWKoeWZqOe7tOaKpOaIluiAheiiq+WwgeaIluiAheacquW8gOacjVxuICAgICAgICAgICAgdGhpcy5lbmFibGVfcmVsb2dpbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmVxdWlyZShcIm5vdGljZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3Blbk5vY3RpY2VXaW5kb3codHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZV9yZWxvZ2luID0gZmFsc2U7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRDdXJSb2xlSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfSxcblxuICAgIC8vIOaOiee6v+aPkOekuu+8jCDmlLbliLDor6XljY/orq7lkI7lsIbkuI3kvJrov5vooYzph43ov55cbiAgICBvbjEwMzEwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmVuYWJsZV9yZWxvZ2luID0gZmFsc2U7XG4gICAgICAgIGdjb3JlLlNtYXJ0U29ja2V0LnN0b3BIZWFydCgpO1xuICAgICAgICBpZiAodGhpcy5yZWNvbm5lY3RfdGltZXIpIHtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnJlY29ubmVjdF90aW1lcik7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdF90aW1lciA9IG51bGw7XG4gICAgICAgICAgICBnYW1lLnVwZGF0ZVdhaXRpbmdTdGF0dXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmlzX3Nob3cgPT0gMSkge1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgR3VpZGVDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWRlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEd1aWRlTWFpblJvb3RXbmQoZmFsc2UpO1xuICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG4gICAgICAgIENvbW1vbkFsZXJ0LnNob3dJdGVtQXBwbHkoVXRpbHMuVEkxOE4oXCLor6XotKblj7flt7LlnKjlhbbku5blnLDmlrnnmbvlvZVcIiksbnVsbCxmdW5jdGlvbigpe1xuICAgICAgICAgICAgZ2FtZS5yZWxvZ2luKCk7XG4gICAgICAgICAgICBpZihQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIil7XG4gICAgICAgICAgICAgICAgU0RLLmxvZ291dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksbnVsbCxudWxsLFV0aWxzLlRJMThOKFwi5o+Q56S6XCIpLG51bGwsbnVsbCx0cnVlLG51bGwsIG51bGwsbnVsbCxudWxsLHtvZmZfeTotMTgsY2xvc2Vfb2ZmOnRydWV9KVxuICAgICAgICAvLyBnYW1lLnJlbG9naW4oKTtcbiAgICB9LFxuXG4gICAgLy8g6K+35rGC5Yib5bu65paw6KeS6ImyXG4gICAgcmVxQ3JlYXRlUm9sZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZihQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIiB8fCBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpe1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDEsIHsgc2V4OiAwLCBuYW1lOiBcIlwiLCBjYXJlZXI6IDEsIHBsYXlmb3JtOiBDSEFOTkVMfSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDEsIHsgc2V4OiAwLCBuYW1lOiBcIlwiLCBjYXJlZXI6IDEsIHBsYXlmb3JtOiBQTEFURk9STSB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rmlrDop5LoibLov5Tlm55cbiAgICBvbjEwMTAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIGlmIChJU19TVUJNSVQpIHtcbiAgICAgICAgICAgICAgICBTREsuc2RrU3VibWl0VXNlckRhdGEoMiwgZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIiAmJiBQTEFURk9STV9OQU1FID09IFwic2hcIil7XG4gICAgICAgICAgICAgICAgU0RLLmNyZWF0ZVJvbGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKXtcbiAgICAgICAgICAgICAgICBTREsuY3JlYXRlUm9sZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0Rmlyc3RSb2xlRGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRoaXMucmVxTG9naW5Sb2xlKGRhdGEucmlkLCBkYXRhLnNydl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDor7fmsYLnmbvlvZXop5LoibJcbiAgICByZXFMb2dpblJvbGU6IGZ1bmN0aW9uIChyaWQsIHNydl9pZCkge1xuICAgICAgICB2YXIgbG9naW5JbmZvID0gdGhpcy5tb2RlbC5nZXRMb2dpbkluZm8oKTtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luX3JpZCA9IHJpZDtcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luX3Nydl9pZCA9IHNydl9pZDtcbiAgICAgICAgY2MubG9nKFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaW5pdF9yb2xlKTtcbiAgICAgICAgaWYgKFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaW5pdF9yb2xlKSB7Ly8g6KeS6Imy5bey55m75b2VIOaWree6v+mHjei/nuWkhOeQhlxuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDMsIHsgcmlkOiByaWQsIHNydl9pZDogc3J2X2lkIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAxMDIsIHsgcmlkOiByaWQsIHNydl9pZDogc3J2X2lkIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOinkuiJsueZu+W9leaIkOWKn+i/lOWbnlxuICAgIG9uMTAxMDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9naW5fd2luZG93KVxuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnNob3dMb2FkaW5nKCk7XG5cbiAgICAgICAgICAgIGdhbWUuaW5pdENvbmZpZ3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEwMzAwLCB7fSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLnNldFdvcmxkTGV2KGRhdGEud29ybGRfbGV2IHx8IDApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJMaXN0V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TZXJ2ZXJMaXN0KGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjEwMzAwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAzMDAsIHt9KTtcbiAgICB9LFxuXG4gICAgLy8g6KeS6Imy6YeN6L+e5oiQ5Yqf6L+U5ZueXG4gICAgb24xMDEwMzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldFJlY29ubmVjdCh0cnVlKVxuICAgICAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTAzMDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA6YCJ5Yy65YiX6KGoXG4gICAgb3BlblNlcnZlckxpc3QoYm9vbCwgZGF0YSwgY2FsbEZ1bmMpIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2ZXJMaXN0V2luZG93KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlcnZlckxpc3RXaW5kb3cgPSByZXF1aXJlKFwic2VydmVyX2xpc3Rfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJMaXN0V2luZG93ID0gbmV3IHNlcnZlckxpc3RXaW5kb3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXJMaXN0V2luZG93Lm9wZW4oZGF0YSlcbiAgICAgICAgICAgIHRoaXMuc2VydmVyTGlzdFdpbmRvdy5hZGRDYWxsQmFjayhjYWxsRnVuYylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlckxpc3RXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckxpc3RXaW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckxpc3RXaW5kb3cgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlTG9hZGluZzogZnVuY3Rpb24gKHByb2dlcnNzKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdylcbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnVwZGF0ZUxvYWRpbmcocHJvZ2Vyc3MpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTZWNvbkxvYWRpbmc6IGZ1bmN0aW9uIChwcm9nZXJzcywgaXNpbml0KSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luX3dpbmRvdylcbiAgICAgICAgICAgIHRoaXMubG9naW5fd2luZG93LnVwZGF0ZVNlY29uTG9hZGluZyhwcm9nZXJzcywgaXNpbml0KTtcbiAgICB9LFxuXG4gICAgbG9naW5QbGF0Zm9ybVJlcXVlc3Q6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBsb2dpbl9kYXRhID0gdGhpcy5tb2RlbC5nZXRMb2dpbkRhdGEoKTtcbiAgICAgICAgaWYgKGRhdGEudXNyTmFtZSAhPSBsb2dpbl9kYXRhLnVzck5hbWUpIHtcbiAgICAgICAgICAgIGdjb3JlLlN5c0Vudi5zZXQoXCJ1c2VyX25hbWVcIiwgZGF0YS51c3JOYW1lKTtcbiAgICAgICAgICAgIGdjb3JlLlN5c0Vudi5zZXQoXCJwYXNzd29yZFwiLCBkYXRhLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGxvZ2luX2RhdGEudXNyTmFtZSA9IGRhdGEudXNyTmFtZTtcbiAgICAgICAgICAgIGxvZ2luX2RhdGEucGFzc3dvcmQgPSBkYXRhLnBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9naW5OZXdVc2VyUmVxdWVzdChkYXRhKVxuICAgIH0sXG5cbiAgICBsb2dpbk5ld1VzZXJSZXF1ZXN0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgaW5mbyA9IHt9XG4gICAgICAgIGluZm8uY29kZSA9IDE7XG4gICAgICAgIGluZm8uYWNjTmFtZSA9IGRhdGEudXNyTmFtZTtcbiAgICAgICAgaW5mby5wbGF0Zm9ybSA9IFBMQVRGT1JNX05BTUU7XG4gICAgICAgIGluZm8ubXNnID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dpblBsYXRmb3JtUmVzdWx0KGluZm8pO1xuICAgIH0sXG5cbiAgICBsb2dpblBsYXRmb3JtUmVzdWx0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVxdWVzdERlZmF1bHRTZXJ2ZXJMaXN0KGRhdGEuYWNjTmFtZSwgZGF0YS5wbGF0Zm9ybSlcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5by65Yi25LiL57q/XG4gICAgc2VuZGVyMTAzMTI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMDMxMiwge30pO1xuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMb2dpbkNvbnRyb2xsZXI7XG4iXX0=
|