(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/sdks/sh_rh.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, 'bb8cdDrxjFMc6VG/GonQwMt', 'sh_rh'); // Scripts/sdks/sh_rh.js "use strict"; var _SH_RH$chargeData, _SH_RH$chargeData2; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // window.PACKAGE_VERSION = "0.1.19"; // window.CHANNEL = ""; // 深海融合的爱微游、疯狂游乐园的渠道 window.PACKAGE_NAME = "闪烁之光口袋版"; // 渠道号 window.SH_RH_PID = "0"; //深海融合区别爱微游,游乐园的pid , // window.AIWEIYOU_PID = "PM001163"; //爱微游PID:PM001163 // window.YOULECHANG_PID = "PM001164"; //游乐场PID:PM001164 window.SH_RH_IS_SUBSCRIBE = false; //是否关注过了 window.SH_RH_IS_SHARE = false; //是否分享过了 window.SH_RH_IS_REALNAME = false; //是否实名过了 window.SH_RH_IS_WALLOW = true; //是否防沉迷 window.SH_RH_IS_SHOW_SUBSCRIBE = false; //是否显示关注功能 window.SH_RH_IS_SHOW_SHARE = false; //是否显示分享功能 window.SH_RH_IS_SHOW_REALNAME = false; //是否显示实名功能 window.SH_RH_IS_SHOW_BINDPHONE = false; //是否显示手机绑定功能 var LoginController = require("login_controller"); var RoleController = require("role_controller"); var WelfareController = require("welfare_controller"); var SH_RH = function SH_RH() { this.uid = null; }; //游戏加载完成、初始化SDK SH_RH.initSDK = function () { cli_log.log_activate_device(); //加载文件开始上报激活设备 cli_log.log_flash(); this.login(); }; //调起SDK登录界面 SH_RH.login = function () { console.log("PACKAGE_VERSION=====>", PACKAGE_VERSION); console.log("调用深海融合SDK登录"); if (!window.ShSdk) return; console.log(ShSdk); // message("登录成功!"); //游戏加载完成上报 if (cli_log && cli_log.log_loading_end) { cli_log.log_loading_end(); } ; if (!ShSdk) return; ShSdk.login(function (data) { console.log("深海融合SDK登录结果"); window.SH_RH_TOKENID = data.tokenid; var href = window.location.href; var arr = href.split("?"); var list = {}; for (var i = 0; i < arr.length; i++) { var pair = arr[i].split("&"); for (var j = 0; j < pair.length; j++) { var _arr = pair[j].split("="); list[_arr[0]] = _arr[1]; } } window.SH_RH_PID = list["pid"]; window.CHANNEL = window.SH_RH_PID; if (window.CHANNEL == "PM001318") { //大混服 window.PLATFORM_NAME = "shmix"; } else { //爱微游,疯狂游乐场 window.PLATFORM_NAME = "sh"; } // console.log("list==》", list); if (list["focus"] != null) { window.SH_RH_IS_SUBSCRIBE = Number(list["focus"]) == 1; } if (list["verify"] != null) { window.SH_RH_IS_REALNAME = Number(list["verify"]) == 1; } if (list["wallow" != null]) { window.SH_RH_IS_WALLOW = Number(list["wallow"]) == 1; } // console.log("获取到的window.SH_RH_PID==>", window.SH_RH_PID) this.postFunc(function (result) { this.uid = result.msg.uid; this.sign = result.msg.sign; // this.qd_uid = result.msg.uid; var login_data = {}; login_data.usrName = "shrh_" + this.uid; login_data.password = "wx123456"; //注册账号完成上报 if (cli_log && cli_log.log_reg_account) { cli_log.log_reg_account(login_data.usrName); } ; // console.log("深海融合初始化成功,开始请求服务器列表", result); LoginController.getInstance().loginPlatformRequest(login_data); }.bind(this)); // if (window.SH_RH_PID == "PM001164") { // this.subscribe({ apiType: 'isSubscribe' }); // } // this.subscribe({ apiType: 'isSubscribe' }); this.subscribe({ apiType: 'enabled' }); this.share({ apiType: 'enabled' }); if (PLATFORM_NAME == "shmix") { this.bindphone({ apiType: 'enabled' }); this.realname({ apiType: 'enabled' }); } }.bind(this)); }; SH_RH.postFunc = function (callback) { var xhr = cc.loader.getXMLHttpRequest(); var url = "https://s1-h5mlf-h5sszg.shiyuegame.com/api.php/pf/diai/login/"; url = url + "?tokenid=" + SH_RH_TOKENID; url = url + "&cps=" + SH_RH_PID; xhr.open("POST", url); //xhr.open("GET", ServerLink+link+"?"+parm,false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status <= 207) { var result = JSON.parse(xhr.responseText); // console.log("result==>", result) if (result["error"] == -1) { message(result["msg"]); return; } callback(result); } }; }; SH_RH.sdkBackLogin = function () {}; SH_RH.getCurrChannel = function () { return window.CHANNEL; }; SH_RH.getSubChannel = function () {}; SH_RH.getSign = function () { return this.sign || ""; }; SH_RH.getUid = function () { return this.uid || ""; }; // 链接游戏服,登陆游戏 SH_RH.loginGame = function () { var login_data = []; var _account = "shrh_" + this.uid; var sign = this.sign; // console.log("_account==>", _account); login_data = [{ key: "channel", val: SH_RH_PID }, { key: "package_name", val: PACKAGE_NAME }, { key: "package_version", val: PACKAGE_VERSION }, { key: "platform", val: PLATFORM }, { key: "account", val: _account }, { key: "token", val: SH_RH_TOKENID }, { key: "sign", val: sign }]; // console.log("login_data==>", login_data); LoginController.getInstance().cusSDKLogin_2(login_data); }; //充值 SH_RH.pay = function (money, buyNum, prodId, productName, productDesc, extension, coinNum) { var payCallFunc = function () { var loginData = LoginController.getInstance().getModel().getLoginData(); if (loginData.srv_id == "") return; var roleVo = RoleController.getInstance().getRoleVo(); if (roleVo == null) return; var srv_id = ""; if (roleVo && roleVo.srv_id) { srv_id = roleVo.srv_id; } else if (loginData.srv_id) { srv_id = loginData.srv_id; } var index = srv_id.indexOf("_"); if (index != -1) { srv_id = Number(srv_id.slice(index + 1, srv_id.length)); } else { srv_id = 0; } // productName = productName || (money * 10) + "钻石"; var p_name = this.chargeData[Number(money)]; if (PLATFORM_NAME == "shmix") { p_name = this.chargeData2[Number(money)]; } productName = p_name; // productDesc = productDesc || productName; //时间戳 var date_time = Math.ceil(Date.now() / 1000); //充值订单号 var game_number = SH_RH_PID; //游戏编号PM******; game_number = game_number + "_" + this.uid; //uid game_number = game_number + "_" + date_time; //时间戳 // console.log("充值订单号game_number==>", game_number) //充值拓展内容 var severInfo = roleVo.srv_id.split("_"); var platform = severInfo[0] || ""; var zone_id = severInfo[1]; var cps = SH_RH_PID; var channel = SH_RH_PID; var _extension = roleVo.rid + "$$" + platform + "$$" + zone_id + "$$" + channel + "$$" + prodId + "$$" + productName + "$$" + cps + "$$" + date_time; // console.log("拓展参数_extension==>", _extension) var base_64 = require("base64").Base64; _extension = base_64.encode(_extension); // console.log("base64拓展参数_extension==>", _extension); var params = { game_no: game_number, //游戏订单号,由前端拼接 order_money: money * 100, //充值金额,单位 分 order_name: productName, //订单名称 role_name: roleVo.name, //角色名, role_id: roleVo.rid, //角色ID role_level: roleVo.lev, //角色等级 server_id: srv_id, //区服编号 server_name: loginData.srv_name, //区服名称 ext: _extension //扩展信息,通知发货时会原样返回 }; // console.log("充值params==>", params); ShSdk.pay(params, function (data) { var msg = ""; // console.log("充值返回data==>", data) if (data.ret == "SUCCESS") { //前端通知,不能做为实际发货的凭证,真实情况以服务端通知为准 msg = "充值完成"; } else { msg = "关闭充值"; } message("充值返回:" + msg); }.bind(this)); }.bind(this); require("tips_controller").getInstance().showFirstCharge(payCallFunc); //'game_code','channel_code','ifa','system','sys_ver','uid','game_no','order_money','order_name','role_name','server_id' ,'ext' }; SH_RH.setRoleInfo = function (data) { var loginData = LoginController.getInstance().getModel().getLoginData(); if (loginData.srv_id == "") return; var roleVo = RoleController.getInstance().getRoleVo() || data; // console.log("roleVo,data===", roleVo, data) var srv_id = ""; if (roleVo && roleVo.srv_id) { srv_id = roleVo.srv_id; } else if (loginData.srv_id) { srv_id = loginData.srv_id; } var index = srv_id.indexOf("_"); if (index != -1) { srv_id = Number(srv_id.slice(index + 1, srv_id.length)); } else { srv_id = 0; } var r_id = roleVo.rid; if (PLATFORM_NAME == "sh") { r_id = this.uid; } this.role_info = { role_id: r_id || 0, //角色ID role_name: roleVo && roleVo.name || "", //角色名 role_level: roleVo && roleVo.lev || 1, //角色等级 server_id: srv_id, //区服编号 server_name: loginData.srv_name, //区服名称 has_gold: roleVo && roleVo.gold || 0, //角色所持有货币数 vip_level: roleVo && roleVo.vip_lev || 0, //角色vip等级 没有可以不传或传0 role_power: roleVo && roleVo.power || 0, //int 战力、武力之类角色的核心数值,没有可以传0(尽量上传) create_time: roleVo && roleVo.reg_time || 0 //角色创建时间,时间戳,单位:秒 }; // console.log("role_info==>", this.role_info, roleVo); }; //创建角色 SH_RH.createRole = function (data) { this.setRoleInfo(data); // console.log("创角提交一次上报---->", this.role_info); ShSdk.createRole(this.role_info); }; //创建角色2次提交 SH_RH.createRole2 = function (data) { // this.setRoleInfo(data); console.log("创角提交二次上报---->", data); ShSdk.createRole(data); }; //角色登录提交 SH_RH.submitLogin = function () { // if (gcore.SysEnv.get("shrh_account") == this.uid) { // return // } // gcore.SysEnv.set("shrh_account", this.uid); // if (this.role_info && this.role_info.rid == 0 || this.role_info.reg_time == 0) { this.setRoleInfo(); // } console.log("角色登录提交一次--role_info==>", this.role_info); if (PLATFORM_TYPR == "SH_RH") { try { ShSdk.enterGame(this.role_info); //try是为了兼容历史版本 console.log("登录上报方法成功-----"); } catch (err) { ShSdk.neterGame(this.role_info); console.log("登录上报方法成功------"); } } }; //角色升级 SH_RH.roleUpLevel = function (value) { this.setRoleInfo(); if (this.role_info && this.role_info.reg_time == 0) return; if (value != null && value > 1) { this.role_info.role_level = value; ShSdk.roleUpLevel(this.role_info); // console.log("角色升级上报提交--->", this.role_info); } else {// console.log("角色升级上报提交失败--->", this.role_info, value); } }; //关注 //传入param SH_RH.subscribe = function (obj) { //var params = { apiType: 'enabled' };//apiType 请求类型:enabled:获取关注功能是否允许设置,isSubscribe:是否已关注,askShow:请求调起关注二维码 var params = obj; try { ShSdk.subscribe(params, function (data) { //data= {cpStatus:0}; //cpStatus:0 失败,1成功 console.log("关注回调:", params, data); // message("关注回调data.cpStatus=" + data.cpStatus) if (params.apiType == "enabled") { if (Number(data.cpStatus) == 0) { //不允许 window.SH_RH_IS_SHOW_SUBSCRIBE = false; console.log("关注回调:不允许"); } else { // 已关注 window.SH_RH_IS_SHOW_SUBSCRIBE = true; console.log("关注回调:允许"); this.subscribe({ apiType: 'isSubscribe' }); } } else if (params.apiType == "isSubscribe") { // console.log("请求到的关注状态:", data) // message("获取到的关注状态:" + data.cpStatus); if (Number(data.cpStatus) == 0) { //未关注 window.SH_RH_IS_SUBSCRIBE = false; // message("未关注"); } else { // 已关注 window.SH_RH_IS_SUBSCRIBE = true; // message("已关注"); } } else if (params.apiType == "askShow") { if (data.cpStatus == 0) {//失败 // console.log("调用未成功,未关注", data) } else {// 调用成功 // console.log("调用成功", data) } } params = { apiType: "null" }; }.bind(this)); } catch (err) { console.log("subscribe_err:", err); } }; //分享配置 SH_RH.share = function (params) { // var params = { apiType: "enabled", shareParam: "" }; /*说明: 1.params 中apiType(enabled|setShare)表示: enabled:获取关注功能是否允许设置 setShare:设置(请求)分享 2.params 中shareParam,设置分享的内容,setShare时,并且需要配置分享内容配置有效,具体内容格式: shareParam={ title: string;//标题 desc: string;//描述 imgUrl: string;//选填,分享的图片url(类图文) } */ try { ShSdk.shareSdk(params, function (data) { //data= {cpStatus:0}; //cpStatus:0 失败,1成功 console.log("分享回调params", params, data); if (params.apiType == "enabled") { if (Number(data.cpStatus) == 0) { //不允许 window.SH_RH_IS_SHOW_SHARE = false; console.log("分享回调:不允许"); } else { window.SH_RH_IS_SHOW_SHARE = true; console.log("分享回调:允许"); } } if (data.cpStatus == 0) {// 失败 // console.log("分享调起失败!", data); } else {//成功 // console.log("分享调起成功!", data) } params = { apiType: "null" }; }.bind(this)); } catch (err) { console.log("shareSdk_err:", err); } if (this.share_callback == null) { this.shareCallback(); this.share_callback = true; } }; //分享回调 SH_RH.shareCallback = function () { // console.log("分享回调方法加载") try { ShSdk.setShareCallback(function (data) { // console.log(data) //data= {type:"timeline","msg":"success"}; /*说明: type(timeline|friend) 分享类型:timeline 朋友圈,friend 好友; msg 分享结果:success表示分享成功,cancel表示取消或失败; */ if (data.msg == "success") { window.SH_RH_IS_SHARE = true; WelfareController.getInstance().shrhShareStatus(); if (data.type == "timeline") { message("分享朋友圈成功!"); } else { message("分享好友成功!"); } } else { message("分享失败!"); } }); } catch (err) { console.log("shareCallback_err:", err); } }; //实名认证 SH_RH.realname = function (params) { // console.log("实名认证进入", params) ShSdk.realname(params, function (data) { console.log("实名data", params, data); if (data.ret == 'SUCCESS') { if (params.apiType == "enabled") { window.SH_RH_IS_SHOW_REALNAME = true; console.log("需要实名。。。"); } else { window.SH_RH_IS_REALNAME = true; console.log("实名成功==>", data); } WelfareController.getInstance().shrhRealNameStatus(true); } else { //未实名 // console.log("关闭实名认证==>", data); if (params.apiType == "enabled") { ////大混服屏蔽实名 window.SH_RH_IS_REALNAME = true; window.SH_RH_IS_SHOW_REALNAME = false; // WelfareController.getInstance().shrhRealNameStatus(true); console.log("不需要实名。。。"); } } params = { apiType: "null" }; }); }; //绑定手机 SH_RH.bindphone = function (params) { console.log("手机绑定回调:", params); ShSdk.bindphone(params, function (data) { console.log("手机绑定回调:", params, data); if (data.ret == 'SUCCESS') { if (params.apiType == "enabled") { //允许 window.SH_RH_IS_SHOW_BINDPHONE = true; console.log("手机绑定回调:允许"); } else if (params.apiType == "askShow") { WelfareController.getInstance().send16698(); } } else { if (params.apiType == "enabled") { window.SH_RH_IS_SHOW_BINDPHONE = false; console.log("手机绑定回调:不允许"); } else if (params.apiType == "askShow") {} } params = { apiType: "null" }; }); }; SH_RH.logout = function () { ShSdk.logout(); }; //聊天室监控 SH_RH.chatMonitor = function (data) { return; var loginData = LoginController.getInstance().getModel().getLoginData(); if (loginData.srv_id == "") return; var roleVo = RoleController.getInstance().getRoleVo() || data; var srv_id = ""; if (roleVo && roleVo.srv_id) { srv_id = roleVo.srv_id; } else if (loginData.srv_id) { srv_id = loginData.srv_id; } var index = srv_id.indexOf("_"); if (index != -1) { srv_id = Number(srv_id.slice(index + 1, srv_id.length)); } else { srv_id = 0; } var gameid = ""; var key = ""; var _sign = "gameid=" + gameid + "&type=" + data.type + "&uid=" + this.qd_uid + "&key=" + key; ShSdk.chatMonitor({ type: data.type || 4, //聊天类型, //(1:私聊,2:房间,3:区服(单服),4:世界(全服),5:帮会) serverid: srv_id, //消息发送者区服id, //(选服界面的显示的区服id,数字部分) uid: this.qd_uid, //消息发送者平台uid, nick: roleVo.name, //消息发送者角色名, fromch: "爱微游", //消息发送者渠道名称(爱微游用户填:爱微游), touid: data.to_srv_id, //消息接收者平台uid,房间聊天时为房间id,其他情况可以为空, tonick: data.to_name, //消息接收者角色名,私聊不能为空,其他情况可以为空, toch: "爱微游", //消息接收者渠道名称,私聊不能为空,其他情况可以为空, msg: data.msg, //消息内容, ip: 1, //用户IP, sign: 1 //MD5(gameid={gameid}&type={type}&uid={uid}&key={key}), key通过平台分配 }); }; //选择服务器 dataType为1;创建角色的时候,dataType为2;进入游戏时,dataType为3;等级提升时,dataType为4;退出游戏时, SH_RH.sdkSubmitUserData = function (dataType, rdata) { return; var loginData = LoginController.getInstance().getModel().getLoginData(); if (loginData && loginData.srv_id == "") return; if (dataType == 1) { if (cli_log && cli_log.log_select_server) { cli_log.log_select_server(loginData.usrName); } ; if (!this.log_select_flag) return; this.log_select_flag = true; } else if (dataType == 2) { if (cli_log && cli_log.log_create_role) { cli_log.log_create_role(loginData.usrName); } ; } // let account = LoginPlatForm.getInstance().getInfo().openid; // let roleVo = RoleController.getInstance().getRoleVo() || rdata; // let srv_id; // if (roleVo && roleVo.srv_id) { // srv_id = roleVo.srv_id; // } else if (loginData.srv_id) { // srv_id = loginData.srv_id; // } // let index = srv_id.indexOf("_"); // if (index != -1) { // srv_id = Number(srv_id.slice(index + 1, srv_id.length)); // } else { // srv_id = 0; // } // let serverId = srv_id; //serverId(roleVo && roleVo.srv_id || loginData.srv_id) // let serverName = loginData.srv_name; // let roleId = roleVo && roleVo.rid || 0; // let roleName = roleVo && roleVo.name || ""; // let roleCTime = roleVo && roleVo.reg_time || 0; // let roleLev = roleVo && roleVo.lev || 1; // let vipLev = roleVo && roleVo.vip_lev || 0; // let gold = roleVo && roleVo.gold || 0; // let power = roleVo && roleVo.power || 0; // var data_info = { dataType: dataType, gold: gold, roleId: roleID, roleName: roleName, roleLev: roleLev, serverId: serverId, vipLev: vipLev, roleCTime: roleCTime, }; }; //充值常量表 gold->name SH_RH.chargeData = (_SH_RH$chargeData = {}, _defineProperty(_SH_RH$chargeData, 6, "普通充值6元"), _defineProperty(_SH_RH$chargeData, 30, "普通充值30元"), _defineProperty(_SH_RH$chargeData, 68, "普通充值68元"), _defineProperty(_SH_RH$chargeData, 98, "普通充值98元"), _defineProperty(_SH_RH$chargeData, 128, "普通充值128元"), _defineProperty(_SH_RH$chargeData, 198, "普通充值198元"), _defineProperty(_SH_RH$chargeData, 328, "普通充值328元"), _defineProperty(_SH_RH$chargeData, 648, "普通充值648元"), _defineProperty(_SH_RH$chargeData, 18, "等级礼包"), _defineProperty(_SH_RH$chargeData, 1, "1元礼包"), _defineProperty(_SH_RH$chargeData, 3, "3元礼包"), _defineProperty(_SH_RH$chargeData, 12, "v2礼包"), _defineProperty(_SH_RH$chargeData, 448, "每周常驻礼包"), _defineProperty(_SH_RH$chargeData, 50, "中档红包"), _SH_RH$chargeData); SH_RH.chargeData2 = (_SH_RH$chargeData2 = {}, _defineProperty(_SH_RH$chargeData2, 6, "60钻石"), _defineProperty(_SH_RH$chargeData2, 30, "300钻石"), _defineProperty(_SH_RH$chargeData2, 68, "680钻石"), _defineProperty(_SH_RH$chargeData2, 98, "980钻石"), _defineProperty(_SH_RH$chargeData2, 128, "1280钻石"), _defineProperty(_SH_RH$chargeData2, 198, "1980钻石"), _defineProperty(_SH_RH$chargeData2, 328, "3280钻石"), _defineProperty(_SH_RH$chargeData2, 648, "6480钻石"), _defineProperty(_SH_RH$chargeData2, 18, "等级礼包"), _defineProperty(_SH_RH$chargeData2, 1, "1元礼包"), _defineProperty(_SH_RH$chargeData2, 3, "3元礼包"), _defineProperty(_SH_RH$chargeData2, 12, "v2礼包"), _defineProperty(_SH_RH$chargeData2, 448, "每周常驻礼包"), _defineProperty(_SH_RH$chargeData2, 50, "中档红包"), _SH_RH$chargeData2); module.exports = SH_RH; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcc2Rrc1xcc2hfcmguanMiXSwibmFtZXMiOlsid2luZG93IiwiUEFDS0FHRV9OQU1FIiwiU0hfUkhfUElEIiwiU0hfUkhfSVNfU1VCU0NSSUJFIiwiU0hfUkhfSVNfU0hBUkUiLCJTSF9SSF9JU19SRUFMTkFNRSIsIlNIX1JIX0lTX1dBTExPVyIsIlNIX1JIX0lTX1NIT1dfU1VCU0NSSUJFIiwiU0hfUkhfSVNfU0hPV19TSEFSRSIsIlNIX1JIX0lTX1NIT1dfUkVBTE5BTUUiLCJTSF9SSF9JU19TSE9XX0JJTkRQSE9ORSIsIkxvZ2luQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIldlbGZhcmVDb250cm9sbGVyIiwiU0hfUkgiLCJ1aWQiLCJpbml0U0RLIiwiY2xpX2xvZyIsImxvZ19hY3RpdmF0ZV9kZXZpY2UiLCJsb2dfZmxhc2giLCJsb2dpbiIsImNvbnNvbGUiLCJsb2ciLCJQQUNLQUdFX1ZFUlNJT04iLCJTaFNkayIsImxvZ19sb2FkaW5nX2VuZCIsImRhdGEiLCJTSF9SSF9UT0tFTklEIiwidG9rZW5pZCIsImhyZWYiLCJsb2NhdGlvbiIsImFyciIsInNwbGl0IiwibGlzdCIsImkiLCJsZW5ndGgiLCJwYWlyIiwiaiIsIl9hcnIiLCJDSEFOTkVMIiwiUExBVEZPUk1fTkFNRSIsIk51bWJlciIsInBvc3RGdW5jIiwicmVzdWx0IiwibXNnIiwic2lnbiIsImxvZ2luX2RhdGEiLCJ1c3JOYW1lIiwicGFzc3dvcmQiLCJsb2dfcmVnX2FjY291bnQiLCJnZXRJbnN0YW5jZSIsImxvZ2luUGxhdGZvcm1SZXF1ZXN0IiwiYmluZCIsInN1YnNjcmliZSIsImFwaVR5cGUiLCJzaGFyZSIsImJpbmRwaG9uZSIsInJlYWxuYW1lIiwiY2FsbGJhY2siLCJ4aHIiLCJjYyIsImxvYWRlciIsImdldFhNTEh0dHBSZXF1ZXN0IiwidXJsIiwib3BlbiIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm1lc3NhZ2UiLCJzZGtCYWNrTG9naW4iLCJnZXRDdXJyQ2hhbm5lbCIsImdldFN1YkNoYW5uZWwiLCJnZXRTaWduIiwiZ2V0VWlkIiwibG9naW5HYW1lIiwiX2FjY291bnQiLCJrZXkiLCJ2YWwiLCJQTEFURk9STSIsImN1c1NES0xvZ2luXzIiLCJwYXkiLCJtb25leSIsImJ1eU51bSIsInByb2RJZCIsInByb2R1Y3ROYW1lIiwicHJvZHVjdERlc2MiLCJleHRlbnNpb24iLCJjb2luTnVtIiwicGF5Q2FsbEZ1bmMiLCJsb2dpbkRhdGEiLCJnZXRNb2RlbCIsImdldExvZ2luRGF0YSIsInNydl9pZCIsInJvbGVWbyIsImdldFJvbGVWbyIsImluZGV4IiwiaW5kZXhPZiIsInNsaWNlIiwicF9uYW1lIiwiY2hhcmdlRGF0YSIsImNoYXJnZURhdGEyIiwiZGF0ZV90aW1lIiwiTWF0aCIsImNlaWwiLCJEYXRlIiwibm93IiwiZ2FtZV9udW1iZXIiLCJzZXZlckluZm8iLCJwbGF0Zm9ybSIsInpvbmVfaWQiLCJjcHMiLCJjaGFubmVsIiwiX2V4dGVuc2lvbiIsInJpZCIsImJhc2VfNjQiLCJCYXNlNjQiLCJlbmNvZGUiLCJwYXJhbXMiLCJnYW1lX25vIiwib3JkZXJfbW9uZXkiLCJvcmRlcl9uYW1lIiwicm9sZV9uYW1lIiwibmFtZSIsInJvbGVfaWQiLCJyb2xlX2xldmVsIiwibGV2Iiwic2VydmVyX2lkIiwic2VydmVyX25hbWUiLCJzcnZfbmFtZSIsImV4dCIsInJldCIsInNob3dGaXJzdENoYXJnZSIsInNldFJvbGVJbmZvIiwicl9pZCIsInJvbGVfaW5mbyIsImhhc19nb2xkIiwiZ29sZCIsInZpcF9sZXZlbCIsInZpcF9sZXYiLCJyb2xlX3Bvd2VyIiwicG93ZXIiLCJjcmVhdGVfdGltZSIsInJlZ190aW1lIiwiY3JlYXRlUm9sZSIsImNyZWF0ZVJvbGUyIiwic3VibWl0TG9naW4iLCJQTEFURk9STV9UWVBSIiwiZW50ZXJHYW1lIiwiZXJyIiwibmV0ZXJHYW1lIiwicm9sZVVwTGV2ZWwiLCJ2YWx1ZSIsIm9iaiIsImNwU3RhdHVzIiwic2hhcmVTZGsiLCJzaGFyZV9jYWxsYmFjayIsInNoYXJlQ2FsbGJhY2siLCJzZXRTaGFyZUNhbGxiYWNrIiwic2hyaFNoYXJlU3RhdHVzIiwidHlwZSIsInNocmhSZWFsTmFtZVN0YXR1cyIsInNlbmQxNjY5OCIsImxvZ291dCIsImNoYXRNb25pdG9yIiwiZ2FtZWlkIiwiX3NpZ24iLCJxZF91aWQiLCJzZXJ2ZXJpZCIsIm5pY2siLCJmcm9tY2giLCJ0b3VpZCIsInRvX3Nydl9pZCIsInRvbmljayIsInRvX25hbWUiLCJ0b2NoIiwiaXAiLCJzZGtTdWJtaXRVc2VyRGF0YSIsImRhdGFUeXBlIiwicmRhdGEiLCJsb2dfc2VsZWN0X3NlcnZlciIsImxvZ19zZWxlY3RfZmxhZyIsImxvZ19jcmVhdGVfcm9sZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQUEsTUFBTSxDQUFDQyxZQUFQLEdBQXNCLFNBQXRCLEVBQWtDOztBQUNsQ0QsTUFBTSxDQUFDRSxTQUFQLEdBQW1CLEdBQW5CLEVBQXdDO0FBQ3hDO0FBQ0E7O0FBQ0FGLE1BQU0sQ0FBQ0csa0JBQVAsR0FBNEIsS0FBNUIsRUFBMEM7O0FBQzFDSCxNQUFNLENBQUNJLGNBQVAsR0FBd0IsS0FBeEIsRUFBc0M7O0FBQ3RDSixNQUFNLENBQUNLLGlCQUFQLEdBQTJCLEtBQTNCLEVBQXlDOztBQUN6Q0wsTUFBTSxDQUFDTSxlQUFQLEdBQXlCLElBQXpCLEVBQXdDOztBQUN4Q04sTUFBTSxDQUFDTyx1QkFBUCxHQUFpQyxLQUFqQyxFQUE2Qzs7QUFDN0NQLE1BQU0sQ0FBQ1EsbUJBQVAsR0FBNkIsS0FBN0IsRUFBNkM7O0FBQzdDUixNQUFNLENBQUNTLHNCQUFQLEdBQWdDLEtBQWhDLEVBQTZDOztBQUM3Q1QsTUFBTSxDQUFDVSx1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LEVBYVcsUUFiWCxzQ0FjSyxFQWRMLEVBY1UsTUFkVjtBQWlCQTFGLEtBQUssQ0FBQzJGLFdBQU4saUVBQ0ssQ0FETCxFQUNTLE1BRFQsdUNBRUssRUFGTCxFQUVVLE9BRlYsdUNBR0ssRUFITCxFQUdVLE9BSFYsdUNBSUssRUFKTCxFQUlVLE9BSlYsdUNBS0ssR0FMTCxFQUtXLFFBTFgsdUNBTUssR0FOTCxFQU1XLFFBTlgsdUNBT0ssR0FQTCxFQU9XLFFBUFgsdUNBUUssR0FSTCxFQVFXLFFBUlgsdUNBU0ssRUFUTCxFQVNVLE1BVFYsdUNBVUssQ0FWTCxFQVVTLE1BVlQsdUNBV0ssQ0FYTCxFQVdTLE1BWFQsdUNBWUssRUFaTCxFQVlVLE1BWlYsdUNBYUssR0FiTCxFQWFXLFFBYlgsdUNBY0ssRUFkTCxFQWNVLE1BZFY7QUFpQkFrRixNQUFNLENBQUNDLE9BQVAsR0FBaUI5SyxLQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gd2luZG93LlBBQ0tBR0VfVkVSU0lPTiA9IFwiMC4xLjE5XCI7XHJcbi8vIHdpbmRvdy5DSEFOTkVMID0gXCJcIjsgICAgICAgICAgICAgICAvLyDmt7Hmtbfono3lkIjnmoTniLHlvq7muLjjgIHnlq/ni4LmuLjkuZDlm63nmoTmuKDpgZNcclxud2luZG93LlBBQ0tBR0VfTkFNRSA9IFwi6Zeq54OB5LmL5YWJ5Y+j6KKL54mIXCI7ICAvLyDmuKDpgZPlj7dcclxud2luZG93LlNIX1JIX1BJRCA9IFwiMFwiOyAgICAgICAgICAgICAgICAgLy/mt7Hmtbfono3lkIjljLrliKvniLHlvq7muLjvvIzmuLjkuZDlm63nmoRwaWQg77yMIFxyXG4vLyB3aW5kb3cuQUlXRUlZT1VfUElEID0gXCJQTTAwMTE2M1wiOyAgICAgICAgLy/niLHlvq7muLhQSUTvvJpQTTAwMTE2MyAgIFxyXG4vLyB3aW5kb3cuWU9VTEVDSEFOR19QSUQgPSBcIlBNMDAxMTY0XCI7ICAgICAgLy/muLjkuZDlnLpQSUTvvJpQTTAwMTE2NFxyXG53aW5kb3cuU0hfUkhfSVNfU1VCU0NSSUJFID0gZmFsc2UgICAgICAgICAvL+aYr+WQpuWFs+azqOi/h+S6hlxyXG53aW5kb3cuU0hfUkhfSVNfU0hBUkUgPSBmYWxzZSAgICAgICAgIC8v5piv5ZCm5YiG5Lqr6L+H5LqGXHJcbndpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9IGZhbHNlICAgICAgICAgLy/mmK/lkKblrp7lkI3ov4fkuoZcclxud2luZG93LlNIX1JIX0lTX1dBTExPVyA9IHRydWUgICAgICAgICAgIC8v5piv5ZCm6Ziy5rKJ6L+3XHJcbndpbmRvdy5TSF9SSF9JU19TSE9XX1NVQlNDUklCRSA9IGZhbHNlICAgICAgIC8v5piv5ZCm5pi+56S65YWz5rOo5Yqf6IO9XHJcbndpbmRvdy5TSF9SSF9JU19TSE9XX1NIQVJFID0gZmFsc2UgICAgICAgICAgIC8v5piv5ZCm5pi+56S65YiG5Lqr5Yqf6IO9XHJcbndpbmRvdy5TSF9SSF9JU19TSE9XX1JFQUxOQU1FID0gZmFsc2UgICAgICAgIC8v5piv5ZCm5pi+56S65a6e5ZCN5Yqf6IO9XHJcbndpbmRvdy5TSF9SSF9JU19TSE9XX0JJTkRQSE9ORSA9IGZhbHNlICAgICAgICAvL+aYr+WQpuaYvuekuuaJi+acuue7keWumuWKn+iDvVxyXG5cclxudmFyIExvZ2luQ29udHJvbGxlciA9IHJlcXVpcmUoXCJsb2dpbl9jb250cm9sbGVyXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgV2VsZmFyZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwid2VsZmFyZV9jb250cm9sbGVyXCIpO1xyXG5cclxudmFyIFNIX1JIID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy51aWQgPSBudWxsO1xyXG59O1xyXG5cclxuLy/muLjmiI/liqDovb3lrozmiJDjgIHliJ3lp4vljJZTREtcclxuU0hfUkguaW5pdFNESyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNsaV9sb2cubG9nX2FjdGl2YXRlX2RldmljZSgpOyAvL+WKoOi9veaWh+S7tuW8gOWni+S4iuaKpea/gOa0u+iuvuWkh1xyXG4gICAgY2xpX2xvZy5sb2dfZmxhc2goKTtcclxuICAgIHRoaXMubG9naW4oKTtcclxufTtcclxuXHJcbi8v6LCD6LW3U0RL55m75b2V55WM6Z2iXHJcblNIX1JILmxvZ2luID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJQQUNLQUdFX1ZFUlNJT049PT09PT5cIiwgUEFDS0FHRV9WRVJTSU9OKTtcclxuICAgIGNvbnNvbGUubG9nKFwi6LCD55So5rex5rW36J6N5ZCIU0RL55m75b2VXCIpO1xyXG4gICAgaWYgKCF3aW5kb3cuU2hTZGspIHJldHVyblxyXG4gICAgY29uc29sZS5sb2coU2hTZGspO1xyXG4gICAgLy8gbWVzc2FnZShcIueZu+W9leaIkOWKn++8gVwiKTtcclxuXHJcbiAgICAvL+a4uOaIj+WKoOi9veWujOaIkOS4iuaKpVxyXG4gICAgaWYgKGNsaV9sb2cgJiYgY2xpX2xvZy5sb2dfbG9hZGluZ19lbmQpIHtcclxuICAgICAgICBjbGlfbG9nLmxvZ19sb2FkaW5nX2VuZCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIVNoU2RrKSByZXR1cm47XHJcbiAgICBTaFNkay5sb2dpbihmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5rex5rW36J6N5ZCIU0RL55m75b2V57uT5p6cXCIpXHJcbiAgICAgICAgd2luZG93LlNIX1JIX1RPS0VOSUQgPSBkYXRhLnRva2VuaWQ7XHJcbiAgICAgICAgdmFyIGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICB2YXIgYXJyID0gaHJlZi5zcGxpdChcIj9cIik7XHJcbiAgICAgICAgbGV0IGxpc3QgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcGFpciA9IGFycltpXS5zcGxpdChcIiZcIik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFpci5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIF9hcnIgPSBwYWlyW2pdLnNwbGl0KFwiPVwiKTtcclxuICAgICAgICAgICAgICAgIGxpc3RbX2FyclswXV0gPSBfYXJyWzFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdpbmRvdy5TSF9SSF9QSUQgPSBsaXN0W1wicGlkXCJdO1xyXG4gICAgICAgIHdpbmRvdy5DSEFOTkVMID0gd2luZG93LlNIX1JIX1BJRDtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5DSEFOTkVMID09IFwiUE0wMDEzMThcIikgeyAgICAgICAvL+Wkp+a3t+acjVxyXG4gICAgICAgICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwic2htaXhcIjtcclxuICAgICAgICB9IGVsc2UgeyAgICAgICAgICAvL+eIseW+rua4uO+8jOeWr+eLgua4uOS5kOWculxyXG4gICAgICAgICAgICB3aW5kb3cuUExBVEZPUk1fTkFNRSA9IFwic2hcIlxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3Q9PeOAi1wiLCBsaXN0KTtcclxuXHJcbiAgICAgICAgaWYgKGxpc3RbXCJmb2N1c1wiXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19TVUJTQ1JJQkUgPSBOdW1iZXIobGlzdFtcImZvY3VzXCJdKSA9PSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlzdFtcInZlcmlmeVwiXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9IE51bWJlcihsaXN0W1widmVyaWZ5XCJdKSA9PSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGlzdFtcIndhbGxvd1wiICE9IG51bGxdKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19XQUxMT1cgPSBOdW1iZXIobGlzdFtcIndhbGxvd1wiXSkgPT0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCLojrflj5bliLDnmoR3aW5kb3cuU0hfUkhfUElEPT0+XCIsIHdpbmRvdy5TSF9SSF9QSUQpXHJcblxyXG4gICAgICAgIHRoaXMucG9zdEZ1bmMoZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLnVpZCA9IHJlc3VsdC5tc2cudWlkO1xyXG4gICAgICAgICAgICB0aGlzLnNpZ24gPSByZXN1bHQubXNnLnNpZ247XHJcbiAgICAgICAgICAgIC8vIHRoaXMucWRfdWlkID0gcmVzdWx0Lm1zZy51aWQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgbG9naW5fZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBsb2dpbl9kYXRhLnVzck5hbWUgPSBcInNocmhfXCIgKyB0aGlzLnVpZDtcclxuICAgICAgICAgICAgbG9naW5fZGF0YS5wYXNzd29yZCA9IFwid3gxMjM0NTZcIjtcclxuXHJcbiAgICAgICAgICAgIC8v5rOo5YaM6LSm5Y+35a6M5oiQ5LiK5oqlXHJcbiAgICAgICAgICAgIGlmIChjbGlfbG9nICYmIGNsaV9sb2cubG9nX3JlZ19hY2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGlfbG9nLmxvZ19yZWdfYWNjb3VudChsb2dpbl9kYXRhLnVzck5hbWUpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLmt7Hmtbfono3lkIjliJ3lp4vljJbmiJDlip/vvIzlvIDlp4vor7fmsYLmnI3liqHlmajliJfooahcIiwgcmVzdWx0KTtcclxuICAgICAgICAgICAgTG9naW5Db250cm9sbGVyLmdldEluc3RhbmNlKCkubG9naW5QbGF0Zm9ybVJlcXVlc3QobG9naW5fZGF0YSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG5cclxuXHJcbiAgICAgICAgLy8gaWYgKHdpbmRvdy5TSF9SSF9QSUQgPT0gXCJQTTAwMTE2NFwiKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc3Vic2NyaWJlKHsgYXBpVHlwZTogJ2lzU3Vic2NyaWJlJyB9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5zdWJzY3JpYmUoeyBhcGlUeXBlOiAnaXNTdWJzY3JpYmUnIH0pO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKHsgYXBpVHlwZTogJ2VuYWJsZWQnIH0pO1xyXG4gICAgICAgIHRoaXMuc2hhcmUoeyBhcGlUeXBlOiAnZW5hYmxlZCcgfSk7XHJcbiAgICAgICAgaWYgKFBMQVRGT1JNX05BTUUgPT0gXCJzaG1peFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmluZHBob25lKHsgYXBpVHlwZTogJ2VuYWJsZWQnIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnJlYWxuYW1lKHsgYXBpVHlwZTogJ2VuYWJsZWQnIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0uYmluZCh0aGlzKSk7XHJcbn1cclxuXHJcblNIX1JILnBvc3RGdW5jID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICB2YXIgeGhyID0gY2MubG9hZGVyLmdldFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICB2YXIgdXJsID0gXCJodHRwczovL3MxLWg1bWxmLWg1c3N6Zy5zaGl5dWVnYW1lLmNvbS9hcGkucGhwL3BmL2RpYWkvbG9naW4vXCI7XHJcbiAgICB1cmwgPSB1cmwgKyBcIj90b2tlbmlkPVwiICsgU0hfUkhfVE9LRU5JRDtcclxuICAgIHVybCA9IHVybCArIFwiJmNwcz1cIiArIFNIX1JIX1BJRDtcclxuICAgIHhoci5vcGVuKFwiUE9TVFwiLCB1cmwpO1xyXG4gICAgLy94aHIub3BlbihcIkdFVFwiLCBTZXJ2ZXJMaW5rK2xpbmsrXCI/XCIrcGFybSxmYWxzZSk7XHJcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcclxuICAgIHhoci5zZW5kKCk7XHJcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0ICYmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDw9IDIwNykpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzdWx0PT0+XCIsIHJlc3VsdClcclxuICAgICAgICAgICAgaWYgKHJlc3VsdFtcImVycm9yXCJdID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlKHJlc3VsdFtcIm1zZ1wiXSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5TSF9SSC5zZGtCYWNrTG9naW4gPSBmdW5jdGlvbiAoKSB7XHJcbn1cclxuXHJcblNIX1JILmdldEN1cnJDaGFubmVsID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5DSEFOTkVMXHJcbn1cclxuXHJcblNIX1JILmdldFN1YkNoYW5uZWwgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG59XHJcblxyXG5TSF9SSC5nZXRTaWduID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2lnbiB8fCBcIlwiXHJcbn1cclxuXHJcblNIX1JILmdldFVpZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiB0aGlzLnVpZCB8fCBcIlwiO1xyXG59XHJcblxyXG5cclxuLy8g6ZO+5o6l5ri45oiP5pyN77yM55m76ZmG5ri45oiPXHJcblNIX1JILmxvZ2luR2FtZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBsb2dpbl9kYXRhID0gW107XHJcbiAgICB2YXIgX2FjY291bnQgPSBcInNocmhfXCIgKyB0aGlzLnVpZDtcclxuICAgIHZhciBzaWduID0gdGhpcy5zaWduO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJfYWNjb3VudD09PlwiLCBfYWNjb3VudCk7XHJcblxyXG4gICAgbG9naW5fZGF0YSA9IFtcclxuICAgICAgICB7IGtleTogXCJjaGFubmVsXCIsIHZhbDogU0hfUkhfUElEIH0sXHJcbiAgICAgICAgeyBrZXk6IFwicGFja2FnZV9uYW1lXCIsIHZhbDogUEFDS0FHRV9OQU1FIH0sXHJcbiAgICAgICAgeyBrZXk6IFwicGFja2FnZV92ZXJzaW9uXCIsIHZhbDogUEFDS0FHRV9WRVJTSU9OIH0sXHJcbiAgICAgICAgeyBrZXk6IFwicGxhdGZvcm1cIiwgdmFsOiBQTEFURk9STSB9LFxyXG4gICAgICAgIHsga2V5OiBcImFjY291bnRcIiwgdmFsOiBfYWNjb3VudCB9LFxyXG4gICAgICAgIHsga2V5OiBcInRva2VuXCIsIHZhbDogU0hfUkhfVE9LRU5JRCB9LFxyXG4gICAgICAgIHsga2V5OiBcInNpZ25cIiwgdmFsOiBzaWduIH1cclxuICAgIF07XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coXCJsb2dpbl9kYXRhPT0+XCIsIGxvZ2luX2RhdGEpO1xyXG5cclxuICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmN1c1NES0xvZ2luXzIobG9naW5fZGF0YSk7XHJcbn1cclxuXHJcbi8v5YWF5YC8XHJcblNIX1JILnBheSA9IGZ1bmN0aW9uIChtb25leSwgYnV5TnVtLCBwcm9kSWQsIHByb2R1Y3ROYW1lLCBwcm9kdWN0RGVzYywgZXh0ZW5zaW9uLCBjb2luTnVtKSB7XHJcbiAgICB2YXIgcGF5Q2FsbEZ1bmMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGxvZ2luRGF0YSA9IExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0TG9naW5EYXRhKCk7XHJcbiAgICAgICAgaWYgKGxvZ2luRGF0YS5zcnZfaWQgPT0gXCJcIikgcmV0dXJuO1xyXG4gICAgICAgIHZhciByb2xlVm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xyXG4gICAgICAgIGlmIChyb2xlVm8gPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzcnZfaWQgPSBcIlwiO1xyXG4gICAgICAgIGlmIChyb2xlVm8gJiYgcm9sZVZvLnNydl9pZCkge1xyXG4gICAgICAgICAgICBzcnZfaWQgPSByb2xlVm8uc3J2X2lkO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobG9naW5EYXRhLnNydl9pZCkge1xyXG4gICAgICAgICAgICBzcnZfaWQgPSBsb2dpbkRhdGEuc3J2X2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5kZXggPSBzcnZfaWQuaW5kZXhPZihcIl9cIik7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHNydl9pZCA9IE51bWJlcihzcnZfaWQuc2xpY2UoaW5kZXggKyAxLCBzcnZfaWQubGVuZ3RoKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3J2X2lkID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWUgfHwgKG1vbmV5ICogMTApICsgXCLpkrvnn7NcIjtcclxuICAgICAgICBsZXQgcF9uYW1lID0gdGhpcy5jaGFyZ2VEYXRhW051bWJlcihtb25leSldO1xyXG4gICAgICAgIGlmKFBMQVRGT1JNX05BTUUgPT0gXCJzaG1peFwiKXtcclxuICAgICAgICAgICAgcF9uYW1lID0gdGhpcy5jaGFyZ2VEYXRhMltOdW1iZXIobW9uZXkpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvZHVjdE5hbWUgPSBwX25hbWU7XHJcbiAgICAgICAgLy8gcHJvZHVjdERlc2MgPSBwcm9kdWN0RGVzYyB8fCBwcm9kdWN0TmFtZTtcclxuXHJcbiAgICAgICAgLy/ml7bpl7TmiLNcclxuICAgICAgICB2YXIgZGF0ZV90aW1lID0gTWF0aC5jZWlsKERhdGUubm93KCkgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgLy/lhYXlgLzorqLljZXlj7dcclxuICAgICAgICB2YXIgZ2FtZV9udW1iZXIgPSBTSF9SSF9QSUQ7Ly/muLjmiI/nvJblj7dQTSoqKioqKjtcclxuICAgICAgICBnYW1lX251bWJlciA9IGdhbWVfbnVtYmVyICsgXCJfXCIgKyB0aGlzLnVpZDsgICAgLy91aWRcclxuICAgICAgICBnYW1lX251bWJlciA9IGdhbWVfbnVtYmVyICsgXCJfXCIgKyBkYXRlX3RpbWU7ICAgIC8v5pe26Ze05oizXHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5YWF5YC86K6i5Y2V5Y+3Z2FtZV9udW1iZXI9PT5cIiwgZ2FtZV9udW1iZXIpXHJcblxyXG4gICAgICAgIC8v5YWF5YC85ouT5bGV5YaF5a65XHJcbiAgICAgICAgdmFyIHNldmVySW5mbyA9IHJvbGVWby5zcnZfaWQuc3BsaXQoXCJfXCIpO1xyXG4gICAgICAgIHZhciBwbGF0Zm9ybSA9IHNldmVySW5mb1swXSB8fCBcIlwiO1xyXG4gICAgICAgIHZhciB6b25lX2lkID0gc2V2ZXJJbmZvWzFdO1xyXG4gICAgICAgIHZhciBjcHMgPSBTSF9SSF9QSUQ7XHJcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBTSF9SSF9QSUQ7XHJcblxyXG4gICAgICAgIHZhciBfZXh0ZW5zaW9uID0gcm9sZVZvLnJpZCArIFwiJCRcIiArIHBsYXRmb3JtICsgXCIkJFwiICsgem9uZV9pZCArXHJcbiAgICAgICAgICAgIFwiJCRcIiArIGNoYW5uZWwgKyBcIiQkXCIgKyBwcm9kSWQgKyBcIiQkXCIgKyBwcm9kdWN0TmFtZSArIFwiJCRcIiArIGNwcyArIFwiJCRcIiArIGRhdGVfdGltZTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuaLk+WxleWPguaVsF9leHRlbnNpb249PT5cIiwgX2V4dGVuc2lvbilcclxuICAgICAgICB2YXIgYmFzZV82NCA9IHJlcXVpcmUoXCJiYXNlNjRcIikuQmFzZTY0O1xyXG4gICAgICAgIF9leHRlbnNpb24gPSBiYXNlXzY0LmVuY29kZShfZXh0ZW5zaW9uKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJhc2U2NOaLk+WxleWPguaVsF9leHRlbnNpb249PT5cIiwgX2V4dGVuc2lvbik7XHJcbiAgICAgICAgdmFyIHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgZ2FtZV9ubzogZ2FtZV9udW1iZXIsLy/muLjmiI/orqLljZXlj7fvvIznlLHliY3nq6/mi7zmjqVcclxuICAgICAgICAgICAgb3JkZXJfbW9uZXk6IG1vbmV5ICogMTAwLC8v5YWF5YC86YeR6aKd77yM5Y2V5L2NIOWIhlxyXG4gICAgICAgICAgICBvcmRlcl9uYW1lOiBwcm9kdWN0TmFtZSwvL+iuouWNleWQjeensFxyXG4gICAgICAgICAgICByb2xlX25hbWU6IHJvbGVWby5uYW1lLC8v6KeS6Imy5ZCNLFxyXG4gICAgICAgICAgICByb2xlX2lkOiByb2xlVm8ucmlkLC8v6KeS6ImySURcclxuICAgICAgICAgICAgcm9sZV9sZXZlbDogcm9sZVZvLmxldiwvL+inkuiJsuetiee6p1xyXG4gICAgICAgICAgICBzZXJ2ZXJfaWQ6IHNydl9pZCwvL+WMuuacjee8luWPt1xyXG4gICAgICAgICAgICBzZXJ2ZXJfbmFtZTogbG9naW5EYXRhLnNydl9uYW1lLCAvL+WMuuacjeWQjeensFxyXG4gICAgICAgICAgICBleHQ6IF9leHRlbnNpb24gIC8v5omp5bGV5L+h5oGv77yM6YCa55+l5Y+R6LSn5pe25Lya5Y6f5qC36L+U5ZueXHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuWFheWAvHBhcmFtcz09PlwiLCBwYXJhbXMpO1xyXG5cclxuICAgICAgICBTaFNkay5wYXkocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgbXNnID0gXCJcIjtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLlhYXlgLzov5Tlm55kYXRhPT0+XCIsIGRhdGEpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLnJldCA9PSBcIlNVQ0NFU1NcIikgeyAgICAgIC8v5YmN56uv6YCa55+l77yM5LiN6IO95YGa5Li65a6e6ZmF5Y+R6LSn55qE5Yet6K+B77yM55yf5a6e5oOF5Ya15Lul5pyN5Yqh56uv6YCa55+l5Li65YeGXHJcbiAgICAgICAgICAgICAgICBtc2cgPSBcIuWFheWAvOWujOaIkFwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbXNnID0gXCLlhbPpl63lhYXlgLxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtZXNzYWdlKFwi5YWF5YC86L+U5Zue77yaXCIgKyBtc2cpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgIH0uYmluZCh0aGlzKVxyXG4gICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dGaXJzdENoYXJnZShwYXlDYWxsRnVuYylcclxuICAgIC8vJ2dhbWVfY29kZScsJ2NoYW5uZWxfY29kZScsJ2lmYScsJ3N5c3RlbScsJ3N5c192ZXInLCd1aWQnLCdnYW1lX25vJywnb3JkZXJfbW9uZXknLCdvcmRlcl9uYW1lJywncm9sZV9uYW1lJywnc2VydmVyX2lkJyAsJ2V4dCdcclxuXHJcbn1cclxuXHJcblNIX1JILnNldFJvbGVJbmZvID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgIGxldCBsb2dpbkRhdGEgPSBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldExvZ2luRGF0YSgpO1xyXG4gICAgaWYgKGxvZ2luRGF0YS5zcnZfaWQgPT0gXCJcIikgcmV0dXJuO1xyXG4gICAgbGV0IHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCkgfHwgZGF0YTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwicm9sZVZvLGRhdGE9PT1cIiwgcm9sZVZvLCBkYXRhKVxyXG4gICAgbGV0IHNydl9pZCA9IFwiXCI7XHJcbiAgICBpZiAocm9sZVZvICYmIHJvbGVWby5zcnZfaWQpIHtcclxuICAgICAgICBzcnZfaWQgPSByb2xlVm8uc3J2X2lkO1xyXG4gICAgfSBlbHNlIGlmIChsb2dpbkRhdGEuc3J2X2lkKSB7XHJcbiAgICAgICAgc3J2X2lkID0gbG9naW5EYXRhLnNydl9pZDtcclxuICAgIH1cclxuICAgIGxldCBpbmRleCA9IHNydl9pZC5pbmRleE9mKFwiX1wiKTtcclxuICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHNydl9pZCA9IE51bWJlcihzcnZfaWQuc2xpY2UoaW5kZXggKyAxLCBzcnZfaWQubGVuZ3RoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNydl9pZCA9IDA7XHJcbiAgICB9XHJcbiAgICBsZXQgcl9pZCA9IHJvbGVWby5yaWQ7XHJcbiAgICBpZiAoUExBVEZPUk1fTkFNRSA9PSBcInNoXCIpIHtcclxuICAgICAgICByX2lkID0gdGhpcy51aWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvbGVfaW5mbyA9IHtcclxuICAgICAgICByb2xlX2lkOiByX2lkIHx8IDAsLy/op5LoibJJRFxyXG4gICAgICAgIHJvbGVfbmFtZTogcm9sZVZvICYmIHJvbGVWby5uYW1lIHx8IFwiXCIsLy/op5LoibLlkI1cclxuICAgICAgICByb2xlX2xldmVsOiByb2xlVm8gJiYgcm9sZVZvLmxldiB8fCAxLC8v6KeS6Imy562J57qnXHJcbiAgICAgICAgc2VydmVyX2lkOiBzcnZfaWQsLy/ljLrmnI3nvJblj7dcclxuICAgICAgICBzZXJ2ZXJfbmFtZTogbG9naW5EYXRhLnNydl9uYW1lLCAvL+WMuuacjeWQjeensFxyXG4gICAgICAgIGhhc19nb2xkOiByb2xlVm8gJiYgcm9sZVZvLmdvbGQgfHwgMCwvL+inkuiJsuaJgOaMgeaciei0p+W4geaVsFxyXG4gICAgICAgIHZpcF9sZXZlbDogcm9sZVZvICYmIHJvbGVWby52aXBfbGV2IHx8IDAsLy/op5LoibJ2aXDnrYnnuqcg5rKh5pyJ5Y+v5Lul5LiN5Lyg5oiW5LygMFxyXG4gICAgICAgIHJvbGVfcG93ZXI6IHJvbGVWbyAmJiByb2xlVm8ucG93ZXIgfHwgMCwgLy9pbnQg5oiY5Yqb44CB5q2m5Yqb5LmL57G76KeS6Imy55qE5qC45b+D5pWw5YC877yM5rKh5pyJ5Y+v5Lul5LygMO+8iOWwvemHj+S4iuS8oO+8iVxyXG4gICAgICAgIGNyZWF0ZV90aW1lOiByb2xlVm8gJiYgcm9sZVZvLnJlZ190aW1lIHx8IDAgLy/op5LoibLliJvlu7rml7bpl7TvvIzml7bpl7TmiLPvvIzljZXkvY3vvJrnp5JcclxuICAgIH07XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInJvbGVfaW5mbz09PlwiLCB0aGlzLnJvbGVfaW5mbywgcm9sZVZvKTtcclxufVxyXG5cclxuLy/liJvlu7rop5LoibJcclxuU0hfUkguY3JlYXRlUm9sZSA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICB0aGlzLnNldFJvbGVJbmZvKGRhdGEpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKFwi5Yib6KeS5o+Q5Lqk5LiA5qyh5LiK5oqlLS0tLT5cIiwgdGhpcy5yb2xlX2luZm8pO1xyXG4gICAgU2hTZGsuY3JlYXRlUm9sZSh0aGlzLnJvbGVfaW5mbyk7XHJcbn1cclxuXHJcbi8v5Yib5bu66KeS6ImyMuasoeaPkOS6pFxyXG5TSF9SSC5jcmVhdGVSb2xlMiA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAvLyB0aGlzLnNldFJvbGVJbmZvKGRhdGEpO1xyXG4gICAgY29uc29sZS5sb2coXCLliJvop5Lmj5DkuqTkuozmrKHkuIrmiqUtLS0tPlwiLCBkYXRhKTtcclxuICAgIFNoU2RrLmNyZWF0ZVJvbGUoZGF0YSk7XHJcbn1cclxuXHJcbi8v6KeS6Imy55m75b2V5o+Q5LqkXHJcblNIX1JILnN1Ym1pdExvZ2luID0gZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gaWYgKGdjb3JlLlN5c0Vudi5nZXQoXCJzaHJoX2FjY291bnRcIikgPT0gdGhpcy51aWQpIHtcclxuICAgIC8vICAgICByZXR1cm5cclxuICAgIC8vIH1cclxuICAgIC8vIGdjb3JlLlN5c0Vudi5zZXQoXCJzaHJoX2FjY291bnRcIiwgdGhpcy51aWQpO1xyXG5cclxuXHJcbiAgICAvLyBpZiAodGhpcy5yb2xlX2luZm8gJiYgdGhpcy5yb2xlX2luZm8ucmlkID09IDAgfHwgdGhpcy5yb2xlX2luZm8ucmVnX3RpbWUgPT0gMCkge1xyXG4gICAgdGhpcy5zZXRSb2xlSW5mbygpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwi6KeS6Imy55m75b2V5o+Q5Lqk5LiA5qyhLS1yb2xlX2luZm89PT5cIiwgdGhpcy5yb2xlX2luZm8pO1xyXG5cclxuICAgIGlmIChQTEFURk9STV9UWVBSID09IFwiU0hfUkhcIikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIFNoU2RrLmVudGVyR2FtZSh0aGlzLnJvbGVfaW5mbyk7XHRcdC8vdHJ55piv5Li65LqG5YW85a655Y6G5Y+y54mI5pysXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V5LiK5oql5pa55rOV5oiQ5YqfLS0tLS1cIilcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgU2hTZGsubmV0ZXJHYW1lKHRoaXMucm9sZV9pbmZvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmbvlvZXkuIrmiqXmlrnms5XmiJDlip8tLS0tLS1cIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8v6KeS6Imy5Y2H57qnXHJcblNIX1JILnJvbGVVcExldmVsID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICB0aGlzLnNldFJvbGVJbmZvKCk7XHJcbiAgICBpZiAodGhpcy5yb2xlX2luZm8gJiYgdGhpcy5yb2xlX2luZm8ucmVnX3RpbWUgPT0gMCkgcmV0dXJuXHJcbiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA+IDEpIHtcclxuICAgICAgICB0aGlzLnJvbGVfaW5mby5yb2xlX2xldmVsID0gdmFsdWU7XHJcbiAgICAgICAgU2hTZGsucm9sZVVwTGV2ZWwodGhpcy5yb2xlX2luZm8pO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6KeS6Imy5Y2H57qn5LiK5oql5o+Q5LqkLS0tPlwiLCB0aGlzLnJvbGVfaW5mbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6KeS6Imy5Y2H57qn5LiK5oql5o+Q5Lqk5aSx6LSlLS0tPlwiLCB0aGlzLnJvbGVfaW5mbywgdmFsdWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vL+WFs+azqFxyXG4vL+S8oOWFpXBhcmFtXHJcblNIX1JILnN1YnNjcmliZSA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgIC8vdmFyIHBhcmFtcyA9IHsgYXBpVHlwZTogJ2VuYWJsZWQnIH07Ly9hcGlUeXBlIOivt+axguexu+WeizplbmFibGVkOuiOt+WPluWFs+azqOWKn+iDveaYr+WQpuWFgeiuuOiuvue9ru+8jGlzU3Vic2NyaWJlOuaYr+WQpuW3suWFs+azqO+8jGFza1Nob3c66K+35rGC6LCD6LW35YWz5rOo5LqM57u056CBXHJcbiAgICB2YXIgcGFyYW1zID0gb2JqO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBTaFNkay5zdWJzY3JpYmUocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAvL2RhdGE9IHtjcFN0YXR1czowfTtcclxuICAgICAgICAgICAgLy9jcFN0YXR1czowIOWksei0pe+8jDHmiJDlip9cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLlhbPms6jlm57osIPvvJpcIixwYXJhbXMsIGRhdGEpO1xyXG4gICAgICAgICAgICAvLyBtZXNzYWdlKFwi5YWz5rOo5Zue6LCDZGF0YS5jcFN0YXR1cz1cIiArIGRhdGEuY3BTdGF0dXMpXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImVuYWJsZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihkYXRhLmNwU3RhdHVzKSA9PSAwKSB7ICAgICAvL+S4jeWFgeiuuFxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19TSE9XX1NVQlNDUklCRSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YWz5rOo5Zue6LCD77ya5LiN5YWB6K64XCIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgLy8gICAgICDlt7LlhbPms6hcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuU0hfUkhfSVNfU0hPV19TVUJTQ1JJQkUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YWz5rOo5Zue6LCD77ya5YWB6K64XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoeyBhcGlUeXBlOiAnaXNTdWJzY3JpYmUnIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5hcGlUeXBlID09IFwiaXNTdWJzY3JpYmVcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLor7fmsYLliLDnmoTlhbPms6jnirbmgIHvvJpcIiwgZGF0YSlcclxuICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UoXCLojrflj5bliLDnmoTlhbPms6jnirbmgIHvvJpcIiArIGRhdGEuY3BTdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihkYXRhLmNwU3RhdHVzKSA9PSAwKSB7ICAgICAvL+acquWFs+azqFxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19TVUJTQ1JJQkUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKFwi5pyq5YWz5rOoXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgIC8vICAgICAg5bey5YWz5rOoXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LlNIX1JIX0lTX1NVQlNDUklCRSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZShcIuW3suWFs+azqFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImFza1Nob3dcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuY3BTdGF0dXMgPT0gMCkgeyAgICAgLy/lpLHotKVcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuiwg+eUqOacquaIkOWKnyzmnKrlhbPms6hcIiwgZGF0YSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAvLyAgICAgIOiwg+eUqOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6LCD55So5oiQ5YqfXCIsIGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyYW1zID0ge2FwaVR5cGU6XCJudWxsXCJ9O1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliZV9lcnI6XCIsIGVycik7XHJcbiAgICB9XHJcbn1cclxuLy/liIbkuqvphY3nva5cclxuU0hfUkguc2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XHJcbiAgICAvLyB2YXIgcGFyYW1zID0geyBhcGlUeXBlOiBcImVuYWJsZWRcIiwgc2hhcmVQYXJhbTogXCJcIiB9O1xyXG4gICAgLyror7TmmI46XHJcbiAgICAgICAgMS5wYXJhbXMg5LitYXBpVHlwZe+8iGVuYWJsZWR8c2V0U2hhcmXvvInooajnpLo6XHJcbiAgICAgICAgZW5hYmxlZO+8muiOt+WPluWFs+azqOWKn+iDveaYr+WQpuWFgeiuuOiuvue9rlxyXG4gICAgICAgIHNldFNoYXJlOuiuvue9ru+8iOivt+axgu+8ieWIhuS6q1xyXG5cclxuICAgICAgICAyLnBhcmFtcyDkuK1zaGFyZVBhcmFtLOiuvue9ruWIhuS6q+eahOWGheWuue+8jHNldFNoYXJl5pe277yM5bm25LiU6ZyA6KaB6YWN572u5YiG5Lqr5YaF5a656YWN572u5pyJ5pWI77yM5YW35L2T5YaF5a655qC85byP77yaXHJcbiAgICAgICAgICAgIHNoYXJlUGFyYW09e1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7Ly/moIfpopggXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogc3RyaW5nOy8v5o+P6L+wXHJcbiAgICAgICAgICAgICAgICAgICAgaW1nVXJsOiBzdHJpbmc7Ly/pgInloavvvIzliIbkuqvnmoTlm77niYd1cmzvvIjnsbvlm77mlofvvIlcclxuICAgICAgICAgICAgfVxyXG4gICAgKi9cclxuICAgIHRyeSB7XHJcbiAgICAgICAgU2hTZGsuc2hhcmVTZGsocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAvL2RhdGE9IHtjcFN0YXR1czowfTtcclxuICAgICAgICAgICAgLy9jcFN0YXR1czowIOWksei0pe+8jDHmiJDlip9cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvlm57osINwYXJhbXNcIixwYXJhbXMsZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImVuYWJsZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihkYXRhLmNwU3RhdHVzKSA9PSAwKSB7ICAgICAvL+S4jeWFgeiuuFxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19TSE9XX1NIQVJFID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliIbkuqvlm57osIPvvJrkuI3lhYHorrhcIilcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LlNIX1JIX0lTX1NIT1dfU0hBUkUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5YiG5Lqr5Zue6LCD77ya5YWB6K64XCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEuY3BTdGF0dXMgPT0gMCkgeyAgICAgLy8gICAgICDlpLHotKVcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5YiG5Lqr6LCD6LW35aSx6LSl77yBXCIsIGRhdGEpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAgICAgIC8v5oiQ5YqfXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuWIhuS6q+iwg+i1t+aIkOWKn++8gVwiLCBkYXRhKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHthcGlUeXBlOlwibnVsbFwifTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaGFyZVNka19lcnI6XCIsIGVycik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2hhcmVfY2FsbGJhY2sgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc2hhcmVDYWxsYmFjaygpO1xyXG4gICAgICAgIHRoaXMuc2hhcmVfY2FsbGJhY2sgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vL+WIhuS6q+Wbnuiwg1xyXG5TSF9SSC5zaGFyZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCLliIbkuqvlm57osIPmlrnms5XliqDovb1cIilcclxuICAgIHRyeSB7XHJcbiAgICAgICAgU2hTZGsuc2V0U2hhcmVDYWxsYmFjayhmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhKVxyXG4gICAgICAgICAgICAvL2RhdGE9IHt0eXBlOlwidGltZWxpbmVcIixcIm1zZ1wiOlwic3VjY2Vzc1wifTtcclxuICAgICAgICAgICAgLyror7TmmI7vvJpcclxuICAgICAgICAgICAgICAgIHR5cGXvvIh0aW1lbGluZXxmcmllbmTvvIkg5YiG5Lqr57G75Z6L77yadGltZWxpbmUg5pyL5Y+L5ZyI77yMZnJpZW5kIOWlveWPiztcclxuICAgICAgICAgICAgICAgIG1zZyDliIbkuqvnu5PmnpzvvJpzdWNjZXNz6KGo56S65YiG5Lqr5oiQ5Yqf77yMY2FuY2Vs6KGo56S65Y+W5raI5oiW5aSx6LSlO1xyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5tc2cgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19TSEFSRSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBXZWxmYXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNocmhTaGFyZVN0YXR1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PSBcInRpbWVsaW5lXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFwi5YiG5Lqr5pyL5Y+L5ZyI5oiQ5YqfIVwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShcIuWIhuS6q+WlveWPi+aIkOWKnyFcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFwi5YiG5Lqr5aSx6LSl77yBXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwic2hhcmVDYWxsYmFja19lcnI6XCIsIGVycik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8v5a6e5ZCN6K6k6K+BXHJcblNIX1JILnJlYWxuYW1lID0gZnVuY3Rpb24gKHBhcmFtcykge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCLlrp7lkI3orqTor4Hov5vlhaVcIiwgcGFyYW1zKVxyXG4gICAgU2hTZGsucmVhbG5hbWUocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5a6e5ZCNZGF0YVwiLHBhcmFtcyxkYXRhKVxyXG4gICAgICAgIGlmIChkYXRhLnJldCA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5hcGlUeXBlID09IFwiZW5hYmxlZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuU0hfUkhfSVNfU0hPV19SRUFMTkFNRSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumcgOimgeWunuWQjeOAguOAguOAglwiKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWunuWQjeaIkOWKnz09PlwiLCBkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBXZWxmYXJlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNocmhSZWFsTmFtZVN0YXR1cyh0cnVlKTtcclxuICAgICAgICB9IGVsc2UgeyAgICAvL+acquWunuWQjVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuWFs+mXreWunuWQjeiupOivgT09PlwiLCBkYXRhKTtcclxuICAgICAgICAgICAgaWYgKHBhcmFtcy5hcGlUeXBlID09IFwiZW5hYmxlZFwiKSB7ICAgIC8vLy/lpKfmt7fmnI3lsY/olL3lrp7lkI1cclxuICAgICAgICAgICAgICAgIHdpbmRvdy5TSF9SSF9JU19SRUFMTkFNRSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuU0hfUkhfSVNfU0hPV19SRUFMTkFNRSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gV2VsZmFyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zaHJoUmVhbE5hbWVTdGF0dXModHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4jemcgOimgeWunuWQjeOAguOAguOAglwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmFtcyA9IHthcGlUeXBlOlwibnVsbFwifTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vL+e7keWumuaJi+aculxyXG5TSF9SSC5iaW5kcGhvbmUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIuaJi+acuue7keWumuWbnuiwg++8mlwiLCBwYXJhbXMpXHJcbiAgICBTaFNkay5iaW5kcGhvbmUocGFyYW1zLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5omL5py657uR5a6a5Zue6LCD77yaXCIsIHBhcmFtcywgZGF0YSlcclxuICAgICAgICBpZiAoZGF0YS5yZXQgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImVuYWJsZWRcIikgey8v5YWB6K64XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuU0hfUkhfSVNfU0hPV19CSU5EUEhPTkUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmiYvmnLrnu5Hlrprlm57osIPvvJrlhYHorrhcIilcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImFza1Nob3dcIikge1xyXG4gICAgICAgICAgICAgICAgV2VsZmFyZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZW5kMTY2OTgoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMuYXBpVHlwZSA9PSBcImVuYWJsZWRcIikge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LlNIX1JIX0lTX1NIT1dfQklORFBIT05FID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaJi+acuue7keWumuWbnuiwg++8muS4jeWFgeiuuFwiKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5hcGlUeXBlID09IFwiYXNrU2hvd1wiKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyYW1zID0ge2FwaVR5cGU6XCJudWxsXCJ9O1xyXG4gICAgfSk7XHJcbn1cclxuXHJcblNIX1JILmxvZ291dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIFNoU2RrLmxvZ291dCgpO1xyXG59XHJcblxyXG4vL+iBiuWkqeWupOebkeaOp1xyXG5TSF9SSC5jaGF0TW9uaXRvciA9IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBsb2dpbkRhdGEgPSBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldExvZ2luRGF0YSgpO1xyXG4gICAgaWYgKGxvZ2luRGF0YS5zcnZfaWQgPT0gXCJcIikgcmV0dXJuO1xyXG4gICAgbGV0IHJvbGVWbyA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCkgfHwgZGF0YTtcclxuICAgIGxldCBzcnZfaWQgPSBcIlwiO1xyXG4gICAgaWYgKHJvbGVWbyAmJiByb2xlVm8uc3J2X2lkKSB7XHJcbiAgICAgICAgc3J2X2lkID0gcm9sZVZvLnNydl9pZDtcclxuICAgIH0gZWxzZSBpZiAobG9naW5EYXRhLnNydl9pZCkge1xyXG4gICAgICAgIHNydl9pZCA9IGxvZ2luRGF0YS5zcnZfaWQ7XHJcbiAgICB9XHJcbiAgICBsZXQgaW5kZXggPSBzcnZfaWQuaW5kZXhPZihcIl9cIik7XHJcbiAgICBpZiAoaW5kZXggIT0gLTEpIHtcclxuICAgICAgICBzcnZfaWQgPSBOdW1iZXIoc3J2X2lkLnNsaWNlKGluZGV4ICsgMSwgc3J2X2lkLmxlbmd0aCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzcnZfaWQgPSAwO1xyXG4gICAgfVxyXG4gICAgbGV0IGdhbWVpZCA9IFwiXCI7XHJcbiAgICBsZXQga2V5ID0gXCJcIjtcclxuICAgIGxldCBfc2lnbiA9IFwiZ2FtZWlkPVwiICsgZ2FtZWlkICsgXCImdHlwZT1cIiArIGRhdGEudHlwZSArIFwiJnVpZD1cIiArIHRoaXMucWRfdWlkICsgXCIma2V5PVwiICsga2V5O1xyXG5cclxuICAgIFNoU2RrLmNoYXRNb25pdG9yKHtcclxuICAgICAgICB0eXBlOiBkYXRhLnR5cGUgfHwgNCwvL+iBiuWkqeexu+WeiywgLy8oMTrnp4HogYrvvIwyOuaIv+mXtO+8jDM65Yy65pyNKOWNleacjSnvvIw0OuS4lueVjCjlhajmnI0p77yMNTrluK7kvJopXHJcbiAgICAgICAgc2VydmVyaWQ6IHNydl9pZCwvL+a2iOaBr+WPkemAgeiAheWMuuacjWlkLCAvLyjpgInmnI3nlYzpnaLnmoTmmL7npLrnmoTljLrmnI1pZO+8jOaVsOWtl+mDqOWIhilcclxuICAgICAgICB1aWQ6IHRoaXMucWRfdWlkLC8v5raI5oGv5Y+R6YCB6ICF5bmz5Y+wdWlkLFxyXG4gICAgICAgIG5pY2s6IHJvbGVWby5uYW1lLC8v5raI5oGv5Y+R6YCB6ICF6KeS6Imy5ZCNLFxyXG4gICAgICAgIGZyb21jaDogXCLniLHlvq7muLhcIiwvL+a2iOaBr+WPkemAgeiAhea4oOmBk+WQjeensO+8iOeIseW+rua4uOeUqOaIt+Whq++8mueIseW+rua4uO+8iSxcclxuICAgICAgICB0b3VpZDogZGF0YS50b19zcnZfaWQsLy/mtojmga/mjqXmlLbogIXlubPlj7B1aWTvvIzmiL/pl7TogYrlpKnml7bkuLrmiL/pl7RpZO+8jOWFtuS7luaDheWGteWPr+S7peS4uuepuixcclxuICAgICAgICB0b25pY2s6IGRhdGEudG9fbmFtZSwvL+a2iOaBr+aOpeaUtuiAheinkuiJsuWQje+8jOengeiBiuS4jeiDveS4uuepuu+8jOWFtuS7luaDheWGteWPr+S7peS4uuepuixcclxuICAgICAgICB0b2NoOiBcIueIseW+rua4uFwiLC8v5raI5oGv5o6l5pS26ICF5rig6YGT5ZCN56ew77yM56eB6IGK5LiN6IO95Li656m677yM5YW25LuW5oOF5Ya15Y+v5Lul5Li656m6LFxyXG4gICAgICAgIG1zZzogZGF0YS5tc2csLy/mtojmga/lhoXlrrksXHJcbiAgICAgICAgaXA6IDEsLy/nlKjmiLdJUCxcclxuICAgICAgICBzaWduOiAxLC8vTUQ1KGdhbWVpZD17Z2FtZWlkfSZ0eXBlPXt0eXBlfSZ1aWQ9e3VpZH0ma2V5PXtrZXl9KSwga2V56YCa6L+H5bmz5Y+w5YiG6YWNXHJcbiAgICB9KVxyXG59XHJcblxyXG4vL+mAieaLqeacjeWKoeWZqCBkYXRhVHlwZeS4ujHvvJvliJvlu7rop5LoibLnmoTml7blgJnvvIxkYXRhVHlwZeS4ujLvvJvov5vlhaXmuLjmiI/ml7bvvIxkYXRhVHlwZeS4ujPvvJvnrYnnuqfmj5DljYfml7bvvIxkYXRhVHlwZeS4ujTvvJvpgIDlh7rmuLjmiI/ml7bvvIxcclxuU0hfUkguc2RrU3VibWl0VXNlckRhdGEgPSBmdW5jdGlvbiAoZGF0YVR5cGUsIHJkYXRhKSB7XHJcbiAgICByZXR1cm5cclxuICAgIGxldCBsb2dpbkRhdGEgPSBMb2dpbkNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldExvZ2luRGF0YSgpO1xyXG4gICAgaWYgKGxvZ2luRGF0YSAmJiBsb2dpbkRhdGEuc3J2X2lkID09IFwiXCIpIHJldHVybjtcclxuICAgIGlmIChkYXRhVHlwZSA9PSAxKSB7XHJcbiAgICAgICAgaWYgKGNsaV9sb2cgJiYgY2xpX2xvZy5sb2dfc2VsZWN0X3NlcnZlcikge1xyXG4gICAgICAgICAgICBjbGlfbG9nLmxvZ19zZWxlY3Rfc2VydmVyKGxvZ2luRGF0YS51c3JOYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghdGhpcy5sb2dfc2VsZWN0X2ZsYWcpIHJldHVyblxyXG4gICAgICAgIHRoaXMubG9nX3NlbGVjdF9mbGFnID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gMikge1xyXG4gICAgICAgIGlmIChjbGlfbG9nICYmIGNsaV9sb2cubG9nX2NyZWF0ZV9yb2xlKSB7XHJcbiAgICAgICAgICAgIGNsaV9sb2cubG9nX2NyZWF0ZV9yb2xlKGxvZ2luRGF0YS51c3JOYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLy8gbGV0IGFjY291bnQgPSBMb2dpblBsYXRGb3JtLmdldEluc3RhbmNlKCkuZ2V0SW5mbygpLm9wZW5pZDtcclxuICAgIC8vIGxldCByb2xlVm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpIHx8IHJkYXRhO1xyXG4gICAgLy8gbGV0IHNydl9pZDtcclxuICAgIC8vIGlmIChyb2xlVm8gJiYgcm9sZVZvLnNydl9pZCkge1xyXG4gICAgLy8gICAgIHNydl9pZCA9IHJvbGVWby5zcnZfaWQ7XHJcbiAgICAvLyB9IGVsc2UgaWYgKGxvZ2luRGF0YS5zcnZfaWQpIHtcclxuICAgIC8vICAgICBzcnZfaWQgPSBsb2dpbkRhdGEuc3J2X2lkO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gbGV0IGluZGV4ID0gc3J2X2lkLmluZGV4T2YoXCJfXCIpO1xyXG4gICAgLy8gaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAvLyAgICAgc3J2X2lkID0gTnVtYmVyKHNydl9pZC5zbGljZShpbmRleCArIDEsIHNydl9pZC5sZW5ndGgpKTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgc3J2X2lkID0gMDtcclxuICAgIC8vIH1cclxuICAgIC8vIGxldCBzZXJ2ZXJJZCA9IHNydl9pZDsgIC8vc2VydmVySWQocm9sZVZvICYmIHJvbGVWby5zcnZfaWQgfHwgbG9naW5EYXRhLnNydl9pZClcclxuICAgIC8vIGxldCBzZXJ2ZXJOYW1lID0gbG9naW5EYXRhLnNydl9uYW1lO1xyXG4gICAgLy8gbGV0IHJvbGVJZCA9IHJvbGVWbyAmJiByb2xlVm8ucmlkIHx8IDA7XHJcbiAgICAvLyBsZXQgcm9sZU5hbWUgPSByb2xlVm8gJiYgcm9sZVZvLm5hbWUgfHwgXCJcIjtcclxuICAgIC8vIGxldCByb2xlQ1RpbWUgPSByb2xlVm8gJiYgcm9sZVZvLnJlZ190aW1lIHx8IDA7XHJcbiAgICAvLyBsZXQgcm9sZUxldiA9IHJvbGVWbyAmJiByb2xlVm8ubGV2IHx8IDE7XHJcbiAgICAvLyBsZXQgdmlwTGV2ID0gcm9sZVZvICYmIHJvbGVWby52aXBfbGV2IHx8IDA7XHJcbiAgICAvLyBsZXQgZ29sZCA9IHJvbGVWbyAmJiByb2xlVm8uZ29sZCB8fCAwO1xyXG4gICAgLy8gbGV0IHBvd2VyID0gcm9sZVZvICYmIHJvbGVWby5wb3dlciB8fCAwO1xyXG4gICAgLy8gdmFyIGRhdGFfaW5mbyA9IHsgZGF0YVR5cGU6IGRhdGFUeXBlLCBnb2xkOiBnb2xkLCByb2xlSWQ6IHJvbGVJRCwgcm9sZU5hbWU6IHJvbGVOYW1lLCByb2xlTGV2OiByb2xlTGV2LCBzZXJ2ZXJJZDogc2VydmVySWQsIHZpcExldjogdmlwTGV2LCByb2xlQ1RpbWU6IHJvbGVDVGltZSwgfTtcclxufVxyXG5cclxuLy/lhYXlgLzluLjph4/ooaggZ29sZC0+bmFtZVxyXG5TSF9SSC5jaGFyZ2VEYXRhID0ge1xyXG4gICAgWzZdOiBcIuaZrumAmuWFheWAvDblhYNcIixcclxuICAgIFszMF06IFwi5pmu6YCa5YWF5YC8MzDlhYNcIixcclxuICAgIFs2OF06IFwi5pmu6YCa5YWF5YC8NjjlhYNcIixcclxuICAgIFs5OF06IFwi5pmu6YCa5YWF5YC8OTjlhYNcIixcclxuICAgIFsxMjhdOiBcIuaZrumAmuWFheWAvDEyOOWFg1wiLFxyXG4gICAgWzE5OF06IFwi5pmu6YCa5YWF5YC8MTk45YWDXCIsXHJcbiAgICBbMzI4XTogXCLmma7pgJrlhYXlgLwzMjjlhYNcIixcclxuICAgIFs2NDhdOiBcIuaZrumAmuWFheWAvDY0OOWFg1wiLFxyXG4gICAgWzE4XTogXCLnrYnnuqfnpLzljIVcIixcclxuICAgIFsxXTogXCIx5YWD56S85YyFXCIsXHJcbiAgICBbM106IFwiM+WFg+ekvOWMhVwiLFxyXG4gICAgWzEyXTogXCJ2MuekvOWMhVwiLFxyXG4gICAgWzQ0OF06IFwi5q+P5ZGo5bi46am756S85YyFXCIsXHJcbiAgICBbNTBdOiBcIuS4reaho+e6ouWMhVwiLFxyXG59XHJcblxyXG5TSF9SSC5jaGFyZ2VEYXRhMiA9IHtcclxuICAgIFs2XTogXCI2MOmSu+efs1wiLFxyXG4gICAgWzMwXTogXCIzMDDpkrvnn7NcIixcclxuICAgIFs2OF06IFwiNjgw6ZK755+zXCIsXHJcbiAgICBbOThdOiBcIjk4MOmSu+efs1wiLFxyXG4gICAgWzEyOF06IFwiMTI4MOmSu+efs1wiLFxyXG4gICAgWzE5OF06IFwiMTk4MOmSu+efs1wiLFxyXG4gICAgWzMyOF06IFwiMzI4MOmSu+efs1wiLFxyXG4gICAgWzY0OF06IFwiNjQ4MOmSu+efs1wiLFxyXG4gICAgWzE4XTogXCLnrYnnuqfnpLzljIVcIixcclxuICAgIFsxXTogXCIx5YWD56S85YyFXCIsXHJcbiAgICBbM106IFwiM+WFg+ekvOWMhVwiLFxyXG4gICAgWzEyXTogXCJ2MuekvOWMhVwiLFxyXG4gICAgWzQ0OF06IFwi5q+P5ZGo5bi46am756S85YyFXCIsXHJcbiAgICBbNTBdOiBcIuS4reaho+e6ouWMhVwiLFxyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFNIX1JIOyJdfQ==