(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/vip/vip_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, 'fc753Pu5ktBOZoyuaPREqO7', 'vip_controller'); // Scripts/mod/vip/vip_controller.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2019-02-26 21:07:32 // -------------------------------------------------------------------- var RoleController = require("role_controller"); var VipEvent = require("vip_event"); var VipController = cc.Class({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { var VipModel = require("vip_model"); this.model = new VipModel(); this.model.initConfig(); this.vip_redpoint_status = {}; this.vip_privilege_redpoint = {}; //vip特权 item 红点 this.is_first = true; }, // 返回当前的model getModel: function getModel() { return this.model; }, // 注册监听事件 registerEvents: function registerEvents() { if (this.login_event_success == null) { this.login_event_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () { gcore.GlobalEvent.unbind(this.login_event_success); this.login_event_success = null; this.role_vo = RoleController.getInstance().getRoleVo(); if (this.role_vo) { if (this.role_assets_event == null) { this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) { if (key == "vip_lev") { this.setIsFirst(true); var get_list = this.model.getGetGiftList(); var item_status = get_list[this.role_vo.vip_lev] == null && this.getIsFirst(); this.setTipsVIPStstus(VIPREDPOINT.VIP_TAB, item_status); gcore.GlobalEvent.fire(VipEvent.UPDATA_ITEM_REDPOINT); } }.bind(this)); } } // this.sender16707() //月卡领取 // this.sender16710() //VIP礼包红点用 // this.sender16712() //累充红点 // this.sender21006() //每日礼包 // this.sender24502() //特权礼包 }, this); } if (this.re_link_game_event == null) { this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {// this.sender21006(); }, this); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(16700, this.handle16700); //获取充值列表信息 this.RegisterProtocal(16710, this.handle16710); //VIP礼包领取信息 this.RegisterProtocal(16711, this.handle16711); //VIP等级奖励领取 this.RegisterProtocal(16712, this.handle16712); //获取永久累充信息 this.RegisterProtocal(16713, this.handle16713); //领取累充奖励 this.RegisterProtocal(21005, this.handle21005); //三倍返利信息 this.RegisterProtocal(21006, this.handle21006); //每日礼包数据 this.RegisterProtocal(24501, this.handle24501); //购买VIP特权礼包 this.RegisterProtocal(24502, this.handle24502); //VIP特权礼包数据 this.RegisterProtocal(16707, this.handle16707); this.RegisterProtocal(16708, this.handle16708); this.RegisterProtocal(16730, this.handle16730); this.RegisterProtocal(16731, this.handle16731); this.RegisterProtocal(21020, this.handle21020); //每日一元红点 }, setPrivilegeRedpoint: function setPrivilegeRedpoint(index, status) { this.vip_privilege_redpoint[index] = status; }, getPrivilegeRedpoint: function getPrivilegeRedpoint(index) { var status = this.vip_privilege_redpoint[index]; return status; }, getIsFirst: function getIsFirst() { return this.is_first; }, setIsFirst: function setIsFirst(status) { this.is_first = status; }, //获取充值列表信息 sender16700: function sender16700() { this.SendProtocal(16700, {}); }, handle16700: function handle16700(data) { gcore.GlobalEvent.fire(VipEvent.UPDATE_CHARGE_LIST, data.list); }, //三倍返利信息 sender21005: function sender21005() { this.SendProtocal(21005, {}); }, handle21005: function handle21005(data) { gcore.GlobalEvent.fire(VipEvent.THREE_RECHARGE, data); }, //请求每次礼包数据 sender21006: function sender21006() { this.SendProtocal(21006, {}); }, handle21006: function handle21006(data) { if (data) { this.model.setDailyGiftData(data.first_gift); gcore.GlobalEvent.fire(VipEvent.DAILY_GIFT_INFO); } }, //请求购买VIP特权礼包 sender24501: function sender24501(id) { var protocal = {}; protocal.id = id; this.SendProtocal(24501, protocal); }, handle24501: function handle24501(data) { if (data.msg) { message(data.msg); } }, //请求VIP特权礼包数据 sender24502: function sender24502() { this.SendProtocal(24502, {}); }, handle24502: function handle24502(data) { if (data) { this.model.setPrivilegeList(data.list); var status = this.model.getPrivilegeRedStatus(); this.setTipsVIPStstus(VIPREDPOINT.PRIVILEGE, status); gcore.GlobalEvent.fire(VipEvent.PRIVILEGE_INFO); } }, //VIP界面月卡领取 sender16707: function sender16707() { this.SendProtocal(16707, {}); }, handle16707: function handle16707(data) { var status = false; if (data.status == 1) { status = true; } this.model.setMonthCard(data.status); this.setTipsVIPStstus(VIPREDPOINT.MONTH_CARD, status); gcore.GlobalEvent.fire(VipEvent.SUPRE_CARD_GET, data.status); }, sender16708: function sender16708() { this.SendProtocal(16708, {}); }, handle16708: function handle16708(data) { message(data.msg); }, //VIP礼包领取信息 sender16710: function sender16710() { this.SendProtocal(16710, {}); }, handle16710: function handle16710(data) { this.model.setGetGiftList(data.list); if (this.role_vo == null) { this.role_vo = RoleController.getInstance().getRoleVo(); } var get_list = this.model.getGetGiftList(); var item_status = get_list[this.role_vo.vip_lev] == null && this.getIsFirst(); this.setTipsVIPStstus(VIPREDPOINT.VIP_TAB, item_status); gcore.GlobalEvent.fire(VipEvent.UPDATA_ITEM_REDPOINT); }, //红点 setTipsVIPStstus: function setTipsVIPStstus(bid, status) { this.vip_redpoint_status[bid] = status; var redpoint = false; for (var i in this.vip_redpoint_status) { var v = this.vip_redpoint_status[i]; if (v == true) { redpoint = true; break; } } var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.charge, redpoint); }, //VIP等级奖励领取 sender16711: function sender16711(lev) { var protocal = {}; protocal.lev = lev; this.SendProtocal(16711, protocal); }, handle16711: function handle16711(data) { message(data.msg); }, //累充奖励信息 sender16712: function sender16712() { this.SendProtocal(16712, {}); }, handle16712: function handle16712(data) { this.charge_sum = data.charge_sum; //当前总充值数 this.model.setAccList(data.list); gcore.GlobalEvent.fire(VipEvent.ACC_RECHARGE_INFO, data); }, getChargeSum: function getChargeSum() { return this.charge_sum || 0; }, //领取累充奖励 sender16713: function sender16713(id) { var protocal = {}; protocal.id = id; this.SendProtocal(16713, protocal); }, handle16713: function handle16713(data) { message(data.msg); }, // sender16730: function sender16730() { var protocal = {}; this.SendProtocal(16730, protocal); }, // time // state handle16730: function handle16730(data) { this.model.setGiveVipInfo(data); this.model.setGiveVipStatus(); gcore.GlobalEvent.fire(VipEvent.GIVE_VIP_UPDATE); }, // sender16731: function sender16731() { var protocal = {}; this.SendProtocal(16731, protocal); }, //领取vip handle16731: function handle16731(data) { message(data.msg); if (data.code == 1) { this.openVipAwardWindow(); this.sender16730(); } }, //index是大标签页 VIPTABCONST //sub_type是vip特权界面的 要跳哪个等级就传哪个等级 openVipMainWindow: function openVipMainWindow(status, index, sub_type, callFunc) { if (status) { if (IS_SHOW_CHARGE == false) { message(Utils.TI18N("功能暂未开放,敬请期待")); return; } var charge_cfg = gdata("charge_data", "data_constant", ["open_lv"]); if (charge_cfg) { if (this.role_vo && this.role_vo.lev < charge_cfg.val) { message(charge_cfg.desc); return; } } if (!this.vip_window) { this.vip_window = Utils.createClass("vip_main_window"); } index = index || 1; if (this.vip_window) { this.vip_window.open(index, sub_type); } if (callFunc) { this.deleteCallFunc = callFunc; } } else { if (this.vip_window) { this.vip_window.close(); this.vip_window = null; if (this.deleteCallFunc) { this.deleteCallFunc(); this.deleteCallFunc = null; } } } }, // 打开奖励VIP界面 openVipAwardWindow: function openVipAwardWindow(status) { if (status == true) { if (!this.vip_award_window) { this.vip_award_window = Utils.createClass("vip_award_window", this); } if (this.vip_award_window && this.vip_award_window.isOpen() == false) { this.vip_award_window.open(); } } else { if (this.vip_award_window) { this.vip_award_window.close(); this.vip_award_window = null; } } }, //切换vip面板的标签页 changeMainWindowTab: function changeMainWindowTab(index) { if (this.vip_window) { this.vip_window.changeTabView(index); } }, handle21020: function handle21020(data) { var status = false; if (data.code == 1) { status = true; } var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.one_gift, status); } }); module.exports = VipController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx2aXBcXHZpcF9jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbIlJvbGVDb250cm9sbGVyIiwicmVxdWlyZSIsIlZpcEV2ZW50IiwiVmlwQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiVmlwTW9kZWwiLCJtb2RlbCIsInZpcF9yZWRwb2ludF9zdGF0dXMiLCJ2aXBfcHJpdmlsZWdlX3JlZHBvaW50IiwiaXNfZmlyc3QiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwibG9naW5fZXZlbnRfc3VjY2VzcyIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTIiwidW5iaW5kIiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwicm9sZV9hc3NldHNfZXZlbnQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsInNldElzRmlyc3QiLCJnZXRfbGlzdCIsImdldEdldEdpZnRMaXN0IiwiaXRlbV9zdGF0dXMiLCJ2aXBfbGV2IiwiZ2V0SXNGaXJzdCIsInNldFRpcHNWSVBTdHN0dXMiLCJWSVBSRURQT0lOVCIsIlZJUF9UQUIiLCJmaXJlIiwiVVBEQVRBX0lURU1fUkVEUE9JTlQiLCJyZV9saW5rX2dhbWVfZXZlbnQiLCJFVlRfUkVfTElOS19HQU1FIiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMTY3MDAiLCJoYW5kbGUxNjcxMCIsImhhbmRsZTE2NzExIiwiaGFuZGxlMTY3MTIiLCJoYW5kbGUxNjcxMyIsImhhbmRsZTIxMDA1IiwiaGFuZGxlMjEwMDYiLCJoYW5kbGUyNDUwMSIsImhhbmRsZTI0NTAyIiwiaGFuZGxlMTY3MDciLCJoYW5kbGUxNjcwOCIsImhhbmRsZTE2NzMwIiwiaGFuZGxlMTY3MzEiLCJoYW5kbGUyMTAyMCIsInNldFByaXZpbGVnZVJlZHBvaW50IiwiaW5kZXgiLCJzdGF0dXMiLCJnZXRQcml2aWxlZ2VSZWRwb2ludCIsInNlbmRlcjE2NzAwIiwiU2VuZFByb3RvY2FsIiwiZGF0YSIsIlVQREFURV9DSEFSR0VfTElTVCIsImxpc3QiLCJzZW5kZXIyMTAwNSIsIlRIUkVFX1JFQ0hBUkdFIiwic2VuZGVyMjEwMDYiLCJzZXREYWlseUdpZnREYXRhIiwiZmlyc3RfZ2lmdCIsIkRBSUxZX0dJRlRfSU5GTyIsInNlbmRlcjI0NTAxIiwiaWQiLCJwcm90b2NhbCIsIm1zZyIsIm1lc3NhZ2UiLCJzZW5kZXIyNDUwMiIsInNldFByaXZpbGVnZUxpc3QiLCJnZXRQcml2aWxlZ2VSZWRTdGF0dXMiLCJQUklWSUxFR0UiLCJQUklWSUxFR0VfSU5GTyIsInNlbmRlcjE2NzA3Iiwic2V0TW9udGhDYXJkIiwiTU9OVEhfQ0FSRCIsIlNVUFJFX0NBUkRfR0VUIiwic2VuZGVyMTY3MDgiLCJzZW5kZXIxNjcxMCIsInNldEdldEdpZnRMaXN0IiwiYmlkIiwicmVkcG9pbnQiLCJpIiwidiIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsInNldEZ1bmN0aW9uVGlwc1N0YXR1cyIsImljb24iLCJjaGFyZ2UiLCJzZW5kZXIxNjcxMSIsImxldiIsInNlbmRlcjE2NzEyIiwiY2hhcmdlX3N1bSIsInNldEFjY0xpc3QiLCJBQ0NfUkVDSEFSR0VfSU5GTyIsImdldENoYXJnZVN1bSIsInNlbmRlcjE2NzEzIiwic2VuZGVyMTY3MzAiLCJzZXRHaXZlVmlwSW5mbyIsInNldEdpdmVWaXBTdGF0dXMiLCJHSVZFX1ZJUF9VUERBVEUiLCJzZW5kZXIxNjczMSIsImNvZGUiLCJvcGVuVmlwQXdhcmRXaW5kb3ciLCJvcGVuVmlwTWFpbldpbmRvdyIsInN1Yl90eXBlIiwiY2FsbEZ1bmMiLCJJU19TSE9XX0NIQVJHRSIsIlV0aWxzIiwiVEkxOE4iLCJjaGFyZ2VfY2ZnIiwiZ2RhdGEiLCJ2YWwiLCJkZXNjIiwidmlwX3dpbmRvdyIsImNyZWF0ZUNsYXNzIiwib3BlbiIsImRlbGV0ZUNhbGxGdW5jIiwiY2xvc2UiLCJ2aXBfYXdhcmRfd2luZG93IiwiaXNPcGVuIiwiY2hhbmdlTWFpbldpbmRvd1RhYiIsImNoYW5nZVRhYlZpZXciLCJvbmVfZ2lmdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsY0FBYyxHQUFHQyxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUMsUUFBUSxHQUFHRCxPQUFPLENBQUMsV0FBRCxDQUF0Qjs7QUFFQSxJQUFJRSxhQUFhLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3pCLGFBQVNDLGNBRGdCO0FBRXpCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FDakIsQ0FId0I7QUFLekI7QUFDQUMsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFFBQUlDLFFBQVEsR0FBR1IsT0FBTyxDQUFDLFdBQUQsQ0FBdEI7O0FBRUEsU0FBS1MsS0FBTCxHQUFhLElBQUlELFFBQUosRUFBYjtBQUNBLFNBQUtDLEtBQUwsQ0FBV0YsVUFBWDtBQUVBLFNBQUtHLG1CQUFMLEdBQTJCLEVBQTNCO0FBQ0EsU0FBS0Msc0JBQUwsR0FBOEIsRUFBOUIsQ0FQb0IsQ0FPYTs7QUFDakMsU0FBS0MsUUFBTCxHQUFnQixJQUFoQjtBQUNILEdBZndCO0FBaUJ6QjtBQUNBQyxFQUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDbEIsV0FBTyxLQUFLSixLQUFaO0FBQ0gsR0FwQndCO0FBc0J6QjtBQUNBSyxFQUFBQSxjQUFjLEVBQUUsMEJBQVk7QUFDeEIsUUFBSSxLQUFLQyxtQkFBTCxJQUE0QixJQUFoQyxFQUFzQztBQUNsQyxXQUFLQSxtQkFBTCxHQUEyQkMsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QkMsT0FBTyxDQUFDQyx1QkFBL0IsRUFBd0QsWUFBWTtBQUMzRkosUUFBQUEsS0FB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a0JBQWxCLEVBQXFDLElBQXJDLENBQXhCO0FBQ0g7O0FBQ0QsVUFBRyxLQUFLSSxnQkFBTCxJQUF5QixLQUFLQSxnQkFBTCxDQUFzQkMsTUFBdEIsTUFBa0MsS0FBOUQsRUFBb0U7QUFDaEUsYUFBS0QsZ0JBQUwsQ0FBc0JILElBQXRCO0FBQ0g7QUFFSixLQVJELE1BUUs7QUFDRCxVQUFHLEtBQUtHLGdCQUFSLEVBQTRCO0FBQ3hCLGFBQUtBLGdCQUFMLENBQXNCRCxLQUF0QjtBQUNBLGFBQUtDLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDSjtBQUNKLEdBeFV3QjtBQTBVekI7QUFDQUUsRUFBQUEsbUJBQW1CLEVBQUUsNkJBQVV4RSxLQUFWLEVBQWlCO0FBQ2xDLFFBQUksS0FBS2lFLFVBQVQsRUFBcUI7QUFDakIsV0FBS0EsVUFBTCxDQUFnQlEsYUFBaEIsQ0FBOEJ6RSxLQUE5QjtBQUNIO0FBQ0osR0EvVXdCO0FBaVZ6QkYsRUFBQUEsV0FqVnlCLHVCQWlWYk8sSUFqVmEsRUFpVlI7QUFDYixRQUFJSixNQUFNLEdBQUcsS0FBYjs7QUFDQSxRQUFHSSxJQUFJLENBQUNnRCxJQUFMLElBQWEsQ0FBaEIsRUFBa0I7QUFDZHBELE1BQUFBLE1BQU0sR0FBRyxJQUFUO0FBQ0g7O0FBQ0QsUUFBSWtDLGdCQUFnQixHQUFHOUYsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLFFBQUkrRixXQUFXLEdBQUcvRixPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQThGLElBQUFBLGdCQUFnQixDQUFDdkUsV0FBakIsR0FBK0J5RSxxQkFBL0IsQ0FBcURELFdBQVcsQ0FBQ0UsSUFBWixDQUFpQm9DLFFBQXRFLEVBQWdGekUsTUFBaEY7QUFDSDtBQXpWd0IsQ0FBVCxDQUFwQjtBQTRWQTBFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJJLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAyLTI2IDIxOjA3OjMyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBWaXBFdmVudCA9IHJlcXVpcmUoXCJ2aXBfZXZlbnRcIik7XG5cbnZhciBWaXBDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVmlwTW9kZWwgPSByZXF1aXJlKFwidmlwX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgVmlwTW9kZWwoKTtcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0Q29uZmlnKCk7XG5cbiAgICAgICAgdGhpcy52aXBfcmVkcG9pbnRfc3RhdHVzID0ge307XG4gICAgICAgIHRoaXMudmlwX3ByaXZpbGVnZV9yZWRwb2ludCA9IHt9Oy8vdmlw54m55p2DIGl0ZW0g57qi54K5XG4gICAgICAgIHRoaXMuaXNfZmlyc3QgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyDov5Tlm57lvZPliY3nmoRtb2RlbFxuICAgIGdldE1vZGVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhoznm5HlkKzkuovku7ZcbiAgICByZWdpc3RlckV2ZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dpbl9ldmVudF9zdWNjZXNzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwidmlwX2xldlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNGaXJzdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldF9saXN0ID0gdGhpcy5tb2RlbC5nZXRHZXRHaWZ0TGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbV9zdGF0dXMgPSAoZ2V0X2xpc3RbdGhpcy5yb2xlX3ZvLnZpcF9sZXZdID09IG51bGwpICYmIHRoaXMuZ2V0SXNGaXJzdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuVklQX1RBQiwgaXRlbV9zdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9JVEVNX1JFRFBPSU5UKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzA3KCkgLy/mnIjljaHpooblj5ZcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzEwKCkgLy9WSVDnpLzljIXnuqLngrnnlKhcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjE2NzEyKCkgLy/ntK/lhYXnuqLngrlcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjIxMDA2KCkgLy/mr4/ml6XnpLzljIVcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNlbmRlcjI0NTAyKCkgLy/nibnmnYPnpLzljIVcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JFX0xJTktfR0FNRSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuc2VuZGVyMjEwMDYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NzAwLCB0aGlzLmhhbmRsZTE2NzAwKSAvL+iOt+WPluWFheWAvOWIl+ihqOS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MTAsIHRoaXMuaGFuZGxlMTY3MTApIC8vVklQ56S85YyF6aKG5Y+W5L+h5oGvXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjcxMSwgdGhpcy5oYW5kbGUxNjcxMSkgLy9WSVDnrYnnuqflpZblirHpooblj5ZcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NzEyLCB0aGlzLmhhbmRsZTE2NzEyKSAvL+iOt+WPluawuOS5hee0r+WFheS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MTMsIHRoaXMuaGFuZGxlMTY3MTMpIC8v6aKG5Y+W57Sv5YWF5aWW5YqxXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMTAwNSwgdGhpcy5oYW5kbGUyMTAwNSkgLy/kuInlgI3ov5TliKnkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMDA2LCB0aGlzLmhhbmRsZTIxMDA2KSAvL+avj+aXpeekvOWMheaVsOaNrlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjQ1MDEsIHRoaXMuaGFuZGxlMjQ1MDEpIC8v6LSt5LmwVklQ54m55p2D56S85YyFXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyNDUwMiwgdGhpcy5oYW5kbGUyNDUwMikgLy9WSVDnibnmnYPnpLzljIXmlbDmja5cblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTY3MDcsIHRoaXMuaGFuZGxlMTY3MDcpXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjcwOCwgdGhpcy5oYW5kbGUxNjcwOClcbiAgICAgICAgXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjczMCwgdGhpcy5oYW5kbGUxNjczMCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxNjczMSwgdGhpcy5oYW5kbGUxNjczMSk7XG4gICAgICBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIxMDIwLCB0aGlzLmhhbmRsZTIxMDIwKTsvL+avj+aXpeS4gOWFg+e6oueCuVxuICAgIH0sXG5cbiAgICBzZXRQcml2aWxlZ2VSZWRwb2ludDogZnVuY3Rpb24gKGluZGV4LCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy52aXBfcHJpdmlsZWdlX3JlZHBvaW50W2luZGV4XSA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0UHJpdmlsZWdlUmVkcG9pbnQ6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgc3RhdHVzID0gdGhpcy52aXBfcHJpdmlsZWdlX3JlZHBvaW50W2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgIH0sXG5cbiAgICBnZXRJc0ZpcnN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX2ZpcnN0XG4gICAgfSxcblxuICAgIHNldElzRmlyc3Q6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5pc19maXJzdCA9IHN0YXR1c1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluWFheWAvOWIl+ihqOS/oeaBr1xuICAgIHNlbmRlcjE2NzAwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2NzAwLCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MDA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuVVBEQVRFX0NIQVJHRV9MSVNULCBkYXRhLmxpc3QpO1xuICAgIH0sXG5cbiAgICAvL+S4ieWAjei/lOWIqeS/oeaBr1xuICAgIHNlbmRlcjIxMDA1OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMDA1LCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEwMDU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuVEhSRUVfUkVDSEFSR0UsIGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+ivt+axguavj+asoeekvOWMheaVsOaNrlxuICAgIHNlbmRlcjIxMDA2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIxMDA2LCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjEwMDY6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldERhaWx5R2lmdERhdGEoZGF0YS5maXJzdF9naWZ0KTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuREFJTFlfR0lGVF9JTkZPKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+ivt+axgui0reS5sFZJUOeJueadg+ekvOWMhVxuICAgIHNlbmRlcjI0NTAxOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDI0NTAxLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTI0NTAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5tc2cpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K+35rGCVklQ54m55p2D56S85YyF5pWw5o2uXG4gICAgc2VuZGVyMjQ1MDI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjQ1MDIsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjQ1MDI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldFByaXZpbGVnZUxpc3QoZGF0YS5saXN0KTtcbiAgICAgICAgICAgIHZhciBzdGF0dXMgPSB0aGlzLm1vZGVsLmdldFByaXZpbGVnZVJlZFN0YXR1cygpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaXBzVklQU3RzdHVzKFZJUFJFRFBPSU5ULlBSSVZJTEVHRSwgc3RhdHVzKTtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuUFJJVklMRUdFX0lORk8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vVklQ55WM6Z2i5pyI5Y2h6aKG5Y+WXG4gICAgc2VuZGVyMTY3MDc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MDcsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MDc6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRNb250aENhcmQoZGF0YS5zdGF0dXMpO1xuICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuTU9OVEhfQ0FSRCwgc3RhdHVzKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShWaXBFdmVudC5TVVBSRV9DQVJEX0dFVCwgZGF0YS5zdGF0dXMpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIxNjcwODogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjcwOCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjcwODogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICB9LFxuXG4gICAgLy9WSVDnpLzljIXpooblj5bkv6Hmga9cbiAgICBzZW5kZXIxNjcxMDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjcxMCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxNjcxMDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHZXRHaWZ0TGlzdChkYXRhLmxpc3QpO1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdldF9saXN0ID0gdGhpcy5tb2RlbC5nZXRHZXRHaWZ0TGlzdCgpO1xuICAgICAgICB2YXIgaXRlbV9zdGF0dXMgPSAoZ2V0X2xpc3RbdGhpcy5yb2xlX3ZvLnZpcF9sZXZdID09IG51bGwpICYmIHRoaXMuZ2V0SXNGaXJzdCgpO1xuICAgICAgICB0aGlzLnNldFRpcHNWSVBTdHN0dXMoVklQUkVEUE9JTlQuVklQX1RBQiwgaXRlbV9zdGF0dXMpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFZpcEV2ZW50LlVQREFUQV9JVEVNX1JFRFBPSU5UKVxuICAgIH0sXG5cbiAgICAvL+e6oueCuVxuICAgIHNldFRpcHNWSVBTdHN0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xuICAgICAgICB0aGlzLnZpcF9yZWRwb2ludF9zdGF0dXNbYmlkXSA9IHN0YXR1c1xuICAgICAgICBsZXQgcmVkcG9pbnQgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMudmlwX3JlZHBvaW50X3N0YXR1cykge1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnZpcF9yZWRwb2ludF9zdGF0dXNbaV1cbiAgICAgICAgICAgIGlmICh2ID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZWRwb2ludCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIilcbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLmNoYXJnZSwgcmVkcG9pbnQpXG4gICAgfSxcblxuICAgIC8vVklQ562J57qn5aWW5Yqx6aKG5Y+WXG4gICAgc2VuZGVyMTY3MTE6IGZ1bmN0aW9uIChsZXYpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmxldiA9IGxldjtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgfSxcblxuICAgIC8v57Sv5YWF5aWW5Yqx5L+h5oGvXG4gICAgc2VuZGVyMTY3MTI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTIsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMuY2hhcmdlX3N1bSA9IGRhdGEuY2hhcmdlX3N1bSAvL+W9k+WJjeaAu+WFheWAvOaVsFxuICAgICAgICB0aGlzLm1vZGVsLnNldEFjY0xpc3QoZGF0YS5saXN0KTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShWaXBFdmVudC5BQ0NfUkVDSEFSR0VfSU5GTywgZGF0YSk7XG4gICAgfSxcblxuICAgIGdldENoYXJnZVN1bTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFyZ2Vfc3VtIHx8IDA7XG4gICAgfSxcblxuICAgIC8v6aKG5Y+W57Sv5YWF5aWW5YqxXG4gICAgc2VuZGVyMTY3MTM6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MTMsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTY3MTM6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgIH0sXG5cbiAgICAvL1xuICAgIHNlbmRlcjE2NzMwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxNjczMCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvLyB0aW1lXG4gICAgLy8gc3RhdGVcbiAgICBoYW5kbGUxNjczMDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHaXZlVmlwSW5mbyhkYXRhKTtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRHaXZlVmlwU3RhdHVzKCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVmlwRXZlbnQuR0lWRV9WSVBfVVBEQVRFKTtcbiAgICB9LFxuXG4gICAgLy9cbiAgICBzZW5kZXIxNjczMTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY3MzEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy/pooblj5Z2aXBcbiAgICBoYW5kbGUxNjczMTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmKGRhdGEuY29kZSA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMub3BlblZpcEF3YXJkV2luZG93KCk7XG4gICAgICAgICAgICB0aGlzLnNlbmRlcjE2NzMwKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy9pbmRleOaYr+Wkp+agh+etvumhtSBWSVBUQUJDT05TVFxuICAgIC8vc3ViX3R5cGXmmK92aXDnibnmnYPnlYzpnaLnmoQg6KaB6Lez5ZOq5Liq562J57qn5bCx5Lyg5ZOq5Liq562J57qnXG4gICAgb3BlblZpcE1haW5XaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGluZGV4LCBzdWJfdHlwZSAsY2FsbEZ1bmMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKElTX1NIT1dfQ0hBUkdFID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWKn+iDveaaguacquW8gOaUvu+8jOaVrOivt+acn+W+hVwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjaGFyZ2VfY2ZnID0gZ2RhdGEoXCJjaGFyZ2VfZGF0YVwiLCBcImRhdGFfY29uc3RhbnRcIiwgW1wib3Blbl9sdlwiXSk7XG4gICAgICAgICAgICBpZiAoY2hhcmdlX2NmZykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8gJiYgdGhpcy5yb2xlX3ZvLmxldiA8IGNoYXJnZV9jZmcudmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY2hhcmdlX2NmZy5kZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMudmlwX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwidmlwX21haW5fd2luZG93XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggPSBpbmRleCB8fCAxO1xuICAgICAgICAgICAgaWYgKHRoaXMudmlwX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdy5vcGVuKGluZGV4LCBzdWJfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihjYWxsRnVuYyl7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVDYWxsRnVuYyA9IGNhbGxGdW5jXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aXBfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmRlbGV0ZUNhbGxGdW5jKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVDYWxsRnVuYygpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlQ2FsbEZ1bmMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDlpZblirFWSVDnlYzpnaJcbiAgICBvcGVuVmlwQXdhcmRXaW5kb3c6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYoc3RhdHVzID09IHRydWUpe1xuICAgICAgICAgICAgaWYoIXRoaXMudmlwX2F3YXJkX3dpbmRvdyl7XG4gICAgICAgICAgICAgICAgdGhpcy52aXBfYXdhcmRfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJ2aXBfYXdhcmRfd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLnZpcF9hd2FyZF93aW5kb3cgJiYgdGhpcy52aXBfYXdhcmRfd2luZG93LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cub3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy52aXBfYXdhcmRfd2luZG93KSAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcF9hd2FyZF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5YiH5o2idmlw6Z2i5p2/55qE5qCH562+6aG1XG4gICAgY2hhbmdlTWFpbldpbmRvd1RhYjogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnZpcF93aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMudmlwX3dpbmRvdy5jaGFuZ2VUYWJWaWV3KGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoYW5kbGUyMTAyMChkYXRhKXtcbiAgICAgICAgdmFyIHN0YXR1cyA9IGZhbHNlO1xuICAgICAgICBpZihkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICBzdGF0dXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIHZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIilcbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLm9uZV9naWZ0LCBzdGF0dXMpXG4gICAgfSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpcENvbnRyb2xsZXI7Il19