(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/arena/arena_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, 'dc621YSOudGo7RpjtEKyJw1', 'arena_controller'); // Scripts/mod/arena/arena_controller.js "use strict"; 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; } // //----------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2019-03-06 11:18:06 // -------------------------------------------------------------------- var MainSceneController = require("mainscene_controller"); var MainuiController = require("mainui_controller"); var SceneConst = require("scene_const"); var ArenaConst = require("arena_const"); var RoleController = require("role_controller"); var DramaEvent = require("battle_drama_event"); var ArenaEvent = require("arena_event"); var BattleConst = require("battle_const"); var MainuiEvent = require("mainui_event"); var ArenaController = cc.Class(_defineProperty({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { var ArenaModel = require("arena_model"); var ChampionModel = require("arena_champion_model"); this.model = new ArenaModel(); this.model.initConfig(); this.champion_model = new ChampionModel(); this.champion_model.initConfig(); this.cache_list = []; //缓存登录前打开的界面 }, // 返回当前的model getModel: function getModel() { return this.model; }, getChamPionModel: function getChamPionModel() { return this.champion_model; }, // 注册监听事件 registerEvents: function registerEvents() { if (!this.login_event_success) { this.login_event_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () { gcore.GlobalEvent.unbind(this.login_event_success); // this.role_vo = RoleController.getInstance().getRoleVo(); // if (this.role_vo) { // if (!this.update_self_event) { // this.update_self_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) { // if (key == "lev") // this.requestInitProtocal(); // }.bind(this)) // } // } }.bind(this)); } // if (!this.battle_drama_event) { // this.battle_drama_event = gcore.GlobalEvent.bind(DramaEvent.BattleDrama_Update_Max_Id, function(max_id){ // this.requestInitProtocal(); // }.bind(this)); // } if (!this.re_link_game_event) { this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () { var GuideController = require("guide_controller"); if (!GuideController.getInstance().isInGuide()) this.openArenaLoopMathWindow(false); // this.requestInitProtocal(); }.bind(this)); } if (this.loading_enter_scene == null) { this.loading_enter_scene = gcore.GlobalEvent.bind(MainuiEvent.LOADING_ENTER_SCENE, function () { this.showCachePanel(); }.bind(this)); } }, requestInitProtocal: function requestInitProtocal() { this.sender20208(); // 挑战次数奖励信息 this.SendProtocal(20200, {}); // 竞技场个人信息 this.SendProtocal(20250, {}); // 冠军赛状态信息 this.SendProtocal(20223, {}); // 防守信息 }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(20200, this.handle20200.bind(this)); this.RegisterProtocal(20201, this.handle20201.bind(this)); this.RegisterProtocal(20202, this.handle20202.bind(this)); this.RegisterProtocal(20203, this.handle20203.bind(this)); this.RegisterProtocal(20206, this.handle20206.bind(this)); this.RegisterProtocal(20207, this.handle20207.bind(this)); this.RegisterProtocal(20208, this.handle20208.bind(this)); // 宝箱模式 this.RegisterProtocal(20209, this.handle20209.bind(this)); this.RegisterProtocal(20210, this.handle20210.bind(this)); this.RegisterProtocal(20220, this.handle20220.bind(this)); this.RegisterProtocal(20221, this.handle20221.bind(this)); this.RegisterProtocal(20222, this.handle20222.bind(this)); this.RegisterProtocal(20223, this.handle20223.bind(this)); // 冠军赛 this.RegisterProtocal(20250, this.handle20250.bind(this)); // 冠军赛赛程状态数据 this.RegisterProtocal(20251, this.handle20251.bind(this)); // 个人排名以及可下注信息 this.RegisterProtocal(20252, this.handle20252.bind(this)); // 我的比赛信息 this.RegisterProtocal(20253, this.handle20253.bind(this)); // 竞猜比赛信息 this.RegisterProtocal(20254, this.handle20254.bind(this)); // 押注返货 this.RegisterProtocal(20255, this.handle20255.bind(this)); // 我的竞猜列表 this.RegisterProtocal(20256, this.handle20256.bind(this)); // 结算展示 this.RegisterProtocal(20257, this.handle20257.bind(this)); // 竞猜实时更新 this.RegisterProtocal(20258, this.handle20258.bind(this)); // 我的战斗日志 this.RegisterProtocal(20260, this.handle20260.bind(this)); // 32强数据 this.RegisterProtocal(20261, this.handle20261.bind(this)); // 4强数据 this.RegisterProtocal(20262, this.handle20262.bind(this)); // 32强或者4强赛竞猜位置信息 this.RegisterProtocal(20263, this.handle20263.bind(this)); // 32强或者4强赛指定位置的信息 this.RegisterProtocal(20280, this.handle20280.bind(this)); // 冠军赛前3名信息 this.RegisterProtocal(20281, this.handle20281.bind(this)); // 冠军赛排行榜信息 this.RegisterProtocal(20282, this.handle20282.bind(this)); // 赛季结算前3 this.RegisterProtocal(20204, this.handle20204.bind(this)); // 查看剧情人数据 }, handle20200: function handle20200(data) { this.model.updateMyLoopData(data); }, sender20201: function sender20201() { // 请求挑战队列 this.SendProtocal(20201, {}); }, handle20201: function handle20201(data) { // 挑战队列更新 this.model.updateLoopChallengeList(data); }, handle20202: function handle20202(data) { if (this.loop_challenge_role_rid != data.rid && this.loop_challenge_role_srv_id != data.srv_id) return; this.openCheckLoopChallengeRole(true, data); }, openCheckLoopChallengeRole: function openCheckLoopChallengeRole(status, data) { var self = this; if (status == false) { if (self.loop_challenge_check_window != null) { self.loop_challenge_check_window.close(); self.loop_challenge_check_window = null; } } else { if (data == null) return; if (self.loop_challenge_check_window == null) { var ArenaLoopChallengeCheckWindow = require("arena_loop_challenge_check_window"); self.loop_challenge_check_window = new ArenaLoopChallengeCheckWindow(); } self.loop_challenge_check_window.open(data); } }, sender20203: function sender20203(rid, srv_id) { // if (!rid || !srv_id) return; var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; this.SendProtocal(20203, protocal); }, handle20203: function handle20203(data) { message(data.msg); }, sender20206: function sender20206() { // 请求刷新挑战队列 this.SendProtocal(20206, {}); }, handle20206: function handle20206(data) { // 请求刷新结果 message(data.msg); }, sender20207: function sender20207(num) { // 购买挑战券 var proto = {}; proto.num = num; this.SendProtocal(20207, proto); }, handle20207: function handle20207(data) { message(data.msg); if (data.code == 1) { gcore.GlobalEvent.fire(ArenaEvent.UpdateArena_Number); } this.openArenaLoopChallengeBuy(false); }, sender20208: function sender20208() { this.SendProtocal(20208, {}); }, handle20208: function handle20208(data) { if (data) this.model.updateChallengeTimesAwards(data); }, sender20209: function sender20209(num) { var protocal = {}; protocal.num = num; this.SendProtocal(20209, protocal); }, handle20209: function handle20209(data) {}, // 战斗计算,收到结算的,就同时请求一下个人信息吧,服务器要求 handle20210: function handle20210(data) { var BattleConst = require("battle_const"); var BattleController = require("battle_controller"); BattleController.getInstance().openFinishView(true, BattleConst.Fight_Type.Arena, data); this.SendProtocal(20200, {}); }, sender20220: function sender20220() { this.SendProtocal(20220, {}); }, handle20220: function handle20220(data) { // 循环赛前三 if (data && data.rank_list) { gcore.GlobalEvent.fire(ArenaEvent.UpdateLoopChallengeStatueList, data.rank_list); } }, sender20221: function sender20221() { this.SendProtocal(20221, {}); }, handle20221: function handle20221(data) { if (data) { gcore.GlobalEvent.fire(ArenaEvent.UpdateLoopChallengeRank, data); } }, sender20222: function sender20222(data) { this.SendProtocal(20222, {}); }, handle20222: function handle20222(data) { if (data) gcore.GlobalEvent.fire(ArenaEvent.UpdateMylogListEvent, data.log_list); }, handle20223: function handle20223(data) { this.model.updateArenaLoopLogStatus(data.flag); }, /********************冠军赛相关********************/ handle20250: function handle20250(data) { // 冠军赛赛程状态 this.champion_model.updateChampionBaseInfo(data); this.sender20251(); // 引导和剧情中不需要弹出 var GuideController = require("guide_controller"); var StoryController = require("story_controller"); if (GuideController.getInstance().isInGuide()) return; if (StoryController.getInstance().isInStory()) return; // 弹窗处理的相关逻辑 var build_vo = MainSceneController.getInstance().getBuildVo(SceneConst.CenterSceneBuild.arena); if (!build_vo || build_vo.is_lock) return; if (IS_LOADING == true) { this.cache_list.push({ "function": function (data) { this.handle20250(data); }.bind(this, data) }); return; } if (data.step_status === ArenaConst.champion_step_status.opened) { var ActivityController = require("activity_controller").getInstance(); var ActivityConst = require("activity_const"); if (!this.champion_window) { if (data.round_status == ArenaConst.champion_round_status.guess) { ActivityController.openSignView(true, ActivityConst.ActivitySignType.arena_champion_guess, { timer: true }); } else { if (!this.had_show_notice) { ActivityController.openSignView(true, ActivityConst.ActivitySignType.arena_champion, { timer: true }); this.had_show_notice = true; } } } } else { if (this.alert_window) { this.alert_window.close(); this.alert_window = null; } } }, sender20251: function sender20251(data) { this.SendProtocal(20251, {}); }, handle20251: function handle20251(data) { // 个人排名以及可 this.champion_model.setRoleInfo(data); }, sender20252: function sender20252() { this.SendProtocal(20252, {}); }, handle20252: function handle20252(data) { // 我的比赛信息 gcore.GlobalEvent.fire(ArenaEvent.UpdateMyMatchInfoEvent, data); }, sender20253: function sender20253() { this.SendProtocal(20253, {}); }, handle20253: function handle20253(data) { // 竞猜比赛信息 gcore.GlobalEvent.fire(ArenaEvent.UpdateGuessMatchInfoEvent, data); }, // 请求押注某一方 sender20254: function sender20254(bet_type, bet_val) { var proto = {}; proto.bet_type = bet_type; proto.bet_val = bet_val; this.SendProtocal(20254, proto); }, handle20254: function handle20254(data) { // 押注返货 message(data.msg); if (data.code == 1) { var role_info = this.champion_model.getRoleInfo(); role_info.can_bet = data.can_bet; gcore.GlobalEvent.fire(ArenaEvent.UpdateRoleInfoBetEvent, data.can_bet, data.bet_type); this.openArenaChampionGuessWindow(false); } }, sender20255: function sender20255() { this.SendProtocal(20255, {}); }, handle20255: function handle20255(data) { // 我的竞猜列表 gcore.GlobalEvent.fire(ArenaEvent.UpdateMyGuessListEvent, data.list); }, handle20256: function handle20256(data) {// 结算展示 }, handle20257: function handle20257(data) { // 竞猜实时更新 gcore.GlobalEvent.fire(ArenaEvent.UpdateBetMatchValueEvent, data); }, handle20258: function handle20258(data) {// 我的战斗日志 }, sender20260: function sender20260() { this.SendProtocal(20260, {}); }, handle20260: function handle20260(data) { // 32强数据 gcore.GlobalEvent.fire(ArenaEvent.UpdateTop32InfoEvent, data); }, sender20261: function sender20261() { this.SendProtocal(20261, {}); }, handle20261: function handle20261(data) { // 4强数据 gcore.GlobalEvent.fire(ArenaEvent.UpdateTop4InfoEvent, data); }, sender20262: function sender20262() { this.SendProtocal(20262, {}); }, handle20262: function handle20262(data) { // 32强或者4强赛竞猜位置信息 if (data) gcore.GlobalEvent.fire(ArenaEvent.UpdateTop324GuessGroupEvent, data.group, data.pos); }, sender20263: function sender20263(group, pos) { var protocal = {}; protocal.group = group; protocal.pos = pos; this.SendProtocal(20263, protocal); }, handle20263: function handle20263(data) { // 32强或者4强赛 if (data) gcore.GlobalEvent.fire(ArenaEvent.UpdateTop324GroupPosEvent, data); }, sender20280: function sender20280() { this.SendProtocal(20280, {}); }, handle20280: function handle20280(data) { // 冠军赛前3名信 if (data && data.rank_list) gcore.GlobalEvent.fire(ArenaEvent.UpdateChampionTop3Event, data.rank_list); }, sender20281: function sender20281() { this.SendProtocal(20281, {}); }, handle20281: function handle20281(data) { // 冠军赛排行榜信 gcore.GlobalEvent.fire(ArenaEvent.UpdateChampionRankEvent, data); }, handle20282: function handle20282(data) {// 赛季结算前3 }, handle20204: function handle20204(data) {// 查看剧情人数据 }, //进入主场景后显示缓存的界面 showCachePanel: function showCachePanel() { if (this.cache_list == null || this.cache_list.length <= 0) return; for (var i in this.cache_list) { if (this.cache_list[i]["function"]) { this.cache_list[i]["function"](); } } this.cache_list = []; }, // ==============================-- // desc:请求打开竞技场面板,这个时候要判断一下,如果是冠军赛开始阶段,就不要直接进竞技场了, // 否则直接进竞技场吧,这个才是对外打开竞技场的请求,因为这里要判断是否在冠军赛七剑 // time:2018-08-01 08:10:21 // extend:扩展参数,如果是冠军赛,则需要判断具体的 // @return // ==============================-- requestOpenArenWindow: function requestOpenArenWindow(status, extend) { var data = MainSceneController.getInstance().getBuildVo(SceneConst.CenterSceneBuild.arena); if (data && data.is_lock) { message(data.desc); return; } // 如果是引导的话,那么这个肯定是进竞技场 // if GuideController:getInstance():isInGuide() then // self:requestOpenArenaLoopMathWindow(true) // else if (extend == ArenaConst.arena_type.rank) { this.openArenaChampionMatchWindow(true); } else { var base_info = this.champion_model.getBaseInfo(); if (!base_info || base_info.step_status != ArenaConst.champion_step_status.opened) { this.requestOpenArenaLoopMathWindow(true); } else { this.openArenaEnterWindow(true, ArenaConst.arena_type.rank); } } }, // ==============================-- // desc:请求打开竞技场界面 // time:2018-08-01 08:19:25 // @status: // @index: // @return // ==============================-- requestOpenArenaLoopMathWindow: function requestOpenArenaLoopMathWindow(status, index) { if (status) { MainuiController.getInstance().requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Arena); } }, // ==============================-- // desc:打开循环赛界面(这个接口外部只有一个,那就是真正的战斗请求回来之后打开的,也就是mainuicontroller里面打开的) // time:2018-07-31 09:52:23 // @status: // @index: // @return // ==============================-- openArenaLoopMathWindow: function openArenaLoopMathWindow(status, index) { if (status) { var build_vo = MainSceneController.getInstance().getBuildVo(SceneConst.CenterSceneBuild.arena); if (build_vo && build_vo.is_lock) { message(build_vo.desc); return; } index = index || ArenaConst.loop_index.challenge; if (!this.loop_match_window) { var ArenaLoopMatchWindow = require("arena_loop_match_window"); this.loop_match_window = new ArenaLoopMatchWindow(this); } if (!this.loop_match_window.isOpen()) this.loop_match_window.open(index); } else { if (this.loop_match_window) { this.loop_match_window.close(); this.loop_match_window = null; } } }, // ==============================-- // desc:打开循环赛或者冠军赛入口界面 // time:2018-07-31 09:52:04 // @status: // @index: // @return // ==============================-- openArenaEnterWindow: function openArenaEnterWindow(status, index) { if (status) { var build_vo = MainSceneController.getInstance().getBuildVo(SceneConst.CenterSceneBuild.arena); if (build_vo && build_vo.is_lock) { message(build_vo.desc); return; } if (!this.enter_window) { var ArenaEnterWindow = require("arena_enter_window"); this.enter_window = new ArenaEnterWindow(this); } index = index || ArenaConst.arena_type.loop; if (!this.enter_window.isOpen()) { this.enter_window.open(index); } } else { if (this.enter_window) { this.enter_window.close(); this.enter_window = null; } } }, // 打开冠军赛主界面 openArenaChampionMatchWindow: function openArenaChampionMatchWindow(status, index) { if (status) { if (!this.champion_window) { var ArenaChampionMatchWindow = require("arena_champion_match_window"); this.champion_window = new ArenaChampionMatchWindow(this); } this.champion_window.open(index); } else { if (this.champion_window) { this.champion_window.close(); this.champion_window = null; } } }, openArenaChampionGuessWindow: function openArenaChampionGuessWindow(status, data) { if (status) { if (!this.guess_window) { var ArenaChampionGuessWindow = require("arena_champion_guess_window"); this.guess_window = new ArenaChampionGuessWindow(this); } this.guess_window.open(data); } else { if (this.guess_window) { this.guess_window.close(); this.guess_window = null; } } }, // 打开循环赛结算界面 openLoopResultWindow: function openLoopResultWindow(status, data) { if (status) { if (!this.loop_result_window) { var LoopResultWindow = require("arena_loop_result_window"); this.loop_result_window = new LoopResultWindow(this); } this.loop_result_window.open(data); } else { if (this.loop_result_window) { this.loop_result_window.close(); this.loop_result_window = null; } } }, openArenaLoopMyLogWindow: function openArenaLoopMyLogWindow(status) { if (status) { if (!this.loop_log_window) { var ArenaLoopMyLogWindow = require("arena_loop_my_log_window"); this.loop_log_window = new ArenaLoopMyLogWindow(this); } this.loop_log_window.open(); } else { if (this.loop_log_window) { this.loop_log_window.close(); this.loop_log_window = null; } } }, openArenaLoopChallengeBuy: function openArenaLoopChallengeBuy(status) { if (status) { if (!this.arena_champion_buy) { var ArenaChampionBuy = require("arena_loop_challenge_buy_window"); this.arena_champion_buy = new ArenaChampionBuy(this); } this.arena_champion_buy.open(); } else { if (this.arena_champion_buy) { this.arena_champion_buy.close(); this.arena_champion_buy = null; } } }, openArenaChampionMyGuessWindow: function openArenaChampionMyGuessWindow(status) { if (status) { if (!this.my_guess_window) { var ArenaChampionMyGuessWindow = require("arena_champion_my_guess_window"); this.my_guess_window = new ArenaChampionMyGuessWindow(this); } this.my_guess_window.open(); } else { if (this.my_guess_window) { this.my_guess_window.close(); this.my_guess_window = null; } } }, //============================== //desc:打开冠军赛排名奖励面板 //time:2018-08-01 02:04:06 //@status: //@return //============================== openArenaChampionRankAwardsWindow: function openArenaChampionRankAwardsWindow(status) { if (status) { if (!this.champion_rank_awards) { var ArenaChampionRankAwardsWindow = require("arena_champion_rank_awards_window"); this.champion_rank_awards = new ArenaChampionRankAwardsWindow(this); } this.champion_rank_awards.open(); } else { if (this.champion_rank_awards) { this.champion_rank_awards.close(); this.champion_rank_awards = null; } } }, //============================== //desc:打开 //time:2018-07-31 05:23:58 //@status: //@data: //@return //============================== openArenaChampionRankWindow: function openArenaChampionRankWindow(status, data) { if (status) { if (!this.champion_rank) { var ArenaChampionRankWindow = require("arena_champion_rank_window"); this.champion_rank = new ArenaChampionRankWindow(this); } this.champion_rank.open(data); } else { if (this.champion_rank) { this.champion_rank.close(); this.champion_rank = null; } } }, getArenaRoot: function getArenaRoot() { if (this.loop_match_window) return this.loop_match_window.root_wnd; }, //============================== //desc:冠军赛战况的窗体 //time:2018-08-03 08:40:54 //@status: //@data: //@return //==============================-- openArenaChampionReportWindow: function openArenaChampionReportWindow(status, data) { if (status) { if (!this.report_window) { var ArenaChampionReportWindow = require("arena_champion_report_window"); this.report_window = new ArenaChampionReportWindow(this); } this.report_window.open(data); } else { if (this.report_window) { this.report_window.close(); this.report_window = null; } } }, updateChampionTab: function updateChampionTab(tab_index) { if (this.champion_window) this.champion_window.updateTab(tab_index); }, requestLoopChallengeRoleInfo: function requestLoopChallengeRoleInfo(rid, srv_id) { if (rid == null || srv_id == null) return; this.loop_challenge_role_rid = rid; //-- 记录一下当前请求查看的角色rid和srv_id this.loop_challenge_role_srv_id = srv_id; var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; this.SendProtocal(20202, protocal); }, requestRabotInfo: function requestRabotInfo(rid, srv_id, pos) { var protocal = {}; protocal.rid = rid; protocal.srv_id = srv_id; protocal.pos = pos; this.SendProtocal(20204, protocal); } }, "handle20204", function handle20204(data) { if (data.code == 0) { message(data.msg); } // var HeroController = require("hero_controller") // HeroController.getInstance().openHeroTipsPanel(true, data); })); module.exports = ArenaController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhcmVuYVxcYXJlbmFfY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJNYWluU2NlbmVDb250cm9sbGVyIiwicmVxdWlyZSIsIk1haW51aUNvbnRyb2xsZXIiLCJTY2VuZUNvbnN0IiwiQXJlbmFDb25zdCIsIlJvbGVDb250cm9sbGVyIiwiRHJhbWFFdmVudCIsIkFyZW5hRXZlbnQiLCJCYXR0bGVDb25zdCIsIk1haW51aUV2ZW50IiwiQXJlbmFDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJBcmVuYU1vZGVsIiwiQ2hhbXBpb25Nb2RlbCIsIm1vZGVsIiwiY2hhbXBpb25fbW9kZWwiLCJjYWNoZV9saXN0IiwiZ2V0TW9kZWwiLCJnZXRDaGFtUGlvbk1vZGVsIiwicmVnaXN0ZXJFdmVudHMiLCJsb2dpbl9ldmVudF9zdWNjZXNzIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJFdmVudElkIiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJ1bmJpbmQiLCJyZV9saW5rX2dhbWVfZXZlbnQiLCJFVlRfUkVfTElOS19HQU1FIiwiR3VpZGVDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJpc0luR3VpZGUiLCJvcGVuQXJlbmFMb29wTWF0aFdpbmRvdyIsImxvYWRpbmdfZW50ZXJfc2NlbmUiLCJMT0FESU5HX0VOVEVSX1NDRU5FIiwic2hvd0NhY2hlUGFuZWwiLCJyZXF1ZXN0SW5pdFByb3RvY2FsIiwic2VuZGVyMjAyMDgiLCJTZW5kUHJvdG9jYWwiLCJyZWdpc3RlclByb3RvY2FscyIsIlJlZ2lzdGVyUHJvdG9jYWwiLCJoYW5kbGUyMDIwMCIsImhhbmRsZTIwMjAxIiwiaGFuZGxlMjAyMDIiLCJoYW5kbGUyMDIwMyIsImhhbmRsZTIwMjA2IiwiaGFuZGxlMjAyMDciLCJoYW5kbGUyMDIwOCIsImhhbmRsZTIwMjA5IiwiaGFuZGxlMjAyMTAiLCJoYW5kbGUyMDIyMCIsImhhbmRsZTIwMjIxIiwiaGFuZGxlMjAyMjIiLCJoYW5kbGUyMDIyMyIsImhhbmRsZTIwMjUwIiwiaGFuZGxlMjAyNTEiLCJoYW5kbGUyMDI1MiIsImhhbmRsZTIwMjUzIiwiaGFuZGxlMjAyNTQiLCJoYW5kbGUyMDI1NSIsImhhbmRsZTIwMjU2IiwiaGFuZGxlMjAyNTciLCJoYW5kbGUyMDI1OCIsImhhbmRsZTIwMjYwIiwiaGFuZGxlMjAyNjEiLCJoYW5kbGUyMDI2MiIsImhhbmRsZTIwMjYzIiwiaGFuZGxlMjAyODAiLCJoYW5kbGUyMDI4MSIsImhhbmRsZTIwMjgyIiwiaGFuZGxlMjAyMDQiLCJkYXRhIiwidXBkYXRlTXlMb29wRGF0YSIsInNlbmRlcjIwMjAxIiwidXBkYXRlTG9vcENoYWxsZW5nZUxpc3QiLCJsb29wX2NoYWxsZW5nZV9yb2xlX3JpZCIsInJpZCIsImxvb3BfY2hhbGxlbmdlX3JvbGVfc3J2X2lkIiwic3J2X2lkIiwib3BlbkNoZWNrTG9vcENoYWxsZW5nZVJvbGUiLCJzdGF0dXMiLCJzZWxmIiwibG9vcF9jaGFsbGVuZ2VfY2hlY2tfd2luZG93IiwiY2xvc2UiLCJBcmVuYUxvb3BDaGFsbGVuZ2VDaGVja1dpbmRvdyIsIm9wZW4iLCJzZW5kZXIyMDIwMyIsInByb3RvY2FsIiwibWVzc2FnZSIsIm1zZyIsInNlbmRlcjIwMjA2Iiwic2VuZGVyMjAyMDciLCJudW0iLCJwcm90byIsImNvZGUiLCJmaXJlIiwiVXBkYXRlQXJlbmFfTnVtYmVyIiwib3BlbkFyZW5hTG9vcENoYWxsZW5nZUJ1eSIsInVwZGF0ZUNoYWxsZW5nZVRpbWVzQXdhcmRzIiwic2VuZGVyMjAyMDkiLCJCYXR0bGVDb250cm9sbGVyIiwib3BlbkZpbmlzaFZpZXciLCJGaWdodF9UeXBlIiwiQXJlbmEiLCJzZW5kZXIyMDIyMCIsInJhbmtfbGlzdCIsIlVwZGF0ZUxvb3BDaGFsbGVuZ2VTdGF0dWVMaXN0Iiwic2VuZGVyMjAyMjEiLCJVcGRhdGVMb29wQ2hhbGxlbmdlUmFuayIsInNlbmRlcjIwMjIyIiwiVXBkYXRlTXlsb2dMaXN0RXZlbnQiLCJsb2dfbGlzdCIsInVwZGF0ZUFyZW5hTG9vcExvZ1N0YXR1cyIsImZsYWciLCJ1cGRhdGVDaGFtcGlvbkJhc2VJbmZvIiwic2VuZGVyMjAyNTEiLCJTdG9yeUNvbnRyb2xsZXIiLCJpc0luU3RvcnkiLCJidWlsZF92byIsImdldEJ1aWxkVm8iLCJDZW50ZXJTY2VuZUJ1aWxkIiwiYXJlbmEiLCJpc19sb2NrIiwiSVNfTE9BRElORyIsInB1c2giLCJzdGVwX3N0YXR1cyIsImNoYW1waW9uX3N0ZXBfc3RhdHVzIiwib3BlbmVkIiwiQWN0aXZpdHlDb250cm9sbGVyIiwiQWN0aXZpdHlDb25zdCIsImNoYW1waW9uX3dpbmRvdyIsInJvdW5kX3N0YXR1cyIsImNoYW1waW9uX3JvdW5kX3N0YXR1cyIsImd1ZXNzIiwib3BlblNpZ25WaWV3IiwiQWN0aXZpdHlTaWduVHlwZSIsImFyZW5hX2NoYW1waW9uX2d1ZXNzIiwidGltZXIiLCJoYWRfc2hvd19ub3RpY2UiLCJhcmVuYV9jaGFtcGlvbiIsImFsZXJ0X3dpbmRvdyIsInNldFJvbGVJbmZvIiwic2VuZGVyMjAyNTIiLCJVcGRhdGVNeU1hdGNoSW5mb0V2ZW50Iiwic2VuZGVyMjAyNTMiLCJVcGRhdGVHdWVzc01hdGNoSW5mb0V2ZW50Iiwic2VuZGVyMjAyNTQiLCJiZXRfdHlwZSIsImJldF92YWwiLCJyb2xlX2luZm8iLCJnZXRSb2xlSW5mbyIsImNhbl9iZXQiLCJVcGRhdGVSb2xlSW5mb0JldEV2ZW50Iiwib3BlbkFyZW5hQ2hhbXBpb25HdWVzc1dpbmRvdyIsInNlbmRlcjIwMjU1IiwiVXBkYXRlTXlHdWVzc0xpc3RFdmVudCIsImxpc3QiLCJVcGRhdGVCZXRNYXRjaFZhbHVlRXZlbnQiLCJzZW5kZXIyMDI2MCIsIlVwZGF0ZVRvcDMySW5mb0V2ZW50Iiwic2VuZGVyMjAyNjEiLCJVcGRhdGVUb3A0SW5mb0V2ZW50Iiwic2VuZGVyMjAyNjIiLCJVcGRhdGVUb3AzMjRHdWVzc0dyb3VwRXZlbnQiLCJncm91cCIsInBvcyIsInNlbmRlcjIwMjYzIiwiVXBkYXRlVG9wMzI0R3JvdXBQb3NFdmVudCIsInNlbmRlcjIwMjgwIiwiVXBkYXRlQ2hhbXBpb25Ub3AzRXZlbnQiLCJzZW5kZXIyMDI4MSIsIlVwZGF0ZUNoYW1waW9uUmFua0V2ZW50IiwibGVuZ3RoIiwiaSIsInJlcXVlc3RPcGVuQXJlbldpbmRvdyIsImV4dGVuZCIsImRlc2MiLCJhcmVuYV90eXBlIiwicmFuayIsIm9wZW5BcmVuYUNoYW1waW9uTWF0Y2hXaW5kb3ciLCJiYXNlX2luZm8iLCJnZXRCYXNlSW5mbyIsInJlcXVlc3RPcGVuQXJlbmFMb29wTWF0aFdpbmRvdyIsIm9wZW5BcmVuYUVudGVyV2luZG93IiwiaW5kZXgiLCJyZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdyIsImxvb3BfaW5kZXgiLCJjaGFsbGVuZ2UiLCJsb29wX21hdGNoX3dpbmRvdyIsIkFyZW5hTG9vcE1hdGNoV2luZG93IiwiaXNPcGVuIiwiZW50ZXJfd2luZG93IiwiQXJlbmFFbnRlcldpbmRvdyIsImxvb3AiLCJBcmVuYUNoYW1waW9uTWF0Y2hXaW5kb3ciLCJndWVzc193aW5kb3ciLCJBcmVuYUNoYW1waW9uR3Vlc3NXaW5kb3ciLCJvcGVuTG9vcFJlc3VsdFdpbmRvdyIsImxvb3BfcmVzdWx0X3dpbmRvdyIsIkxvb3BSZXN1bHRXaW5kb3ciLCJvcGVuQXJlbmFMb29wTXlMb2dXaW5kb3ciLCJsb29wX2xvZ193aW5kb3ciLCJBcmVuYUxvb3BNeUxvZ1dpbmRvdyIsImFyZW5hX2NoYW1waW9uX2J1eSIsIkFyZW5hQ2hhbXBpb25CdXkiLCJvcGVuQXJlbmFDaGFtcGlvbk15R3Vlc3NXaW5kb3ciLCJteV9ndWVzc193aW5kb3ciLCJBcmVuYUNoYW1waW9uTXlHdWVzc1dpbmRvdyIsIm9wZW5BcmVuYUNoYW1waW9uUmFua0F3YXJkc1dpbmRvdyIsImNoYW1waW9uX3JhbmtfYXdhcmRzIiwiQXJlbmFDaGFtcGlvblJhbmtBd2FyZHNXaW5kb3ciLCJvcGVuQXJlbmFDaGFtcGlvblJhbmtXaW5kb3ciLCJjaGFtcGlvbl9yYW5rIiwiQXJlbmFDaGFtcGlvblJhbmtXaW5kb3ciLCJnZXRBcmVuYVJvb3QiLCJyb290X3duZCIsIm9wZW5BcmVuYUNoYW1waW9uUmVwb3J0V2luZG93IiwicmVwb3J0X3dpbmRvdyIsIkFyZW5hQ2hhbXBpb25SZXBvcnRXaW5kb3ciLCJ1cGRhdGVDaGFtcGlvblRhYiIsInRhYl9pbmRleCIsInVwZGF0ZVRhYiIsInJlcXVlc3RMb29wQ2hhbGxlbmdlUm9sZUluZm8iLCJyZXF1ZXN0UmFib3RJbmZvIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLG1CQUFtQixHQUFHQyxPQUFPLENBQUMsc0JBQUQsQ0FBakM7O0FBQ0EsSUFBSUMsZ0JBQWdCLEdBQU1ELE9BQU8sQ0FBQyxtQkFBRCxDQUFqQzs7QUFDQSxJQUFJRSxVQUFVLEdBQVlGLE9BQU8sQ0FBQyxhQUFELENBQWpDOztBQUNBLElBQUlHLFVBQVUsR0FBWUgsT0FBTyxDQUFDLGFBQUQsQ0FBakM7O0FBQ0EsSUFBSUksY0FBYyxHQUFRSixPQUFPLENBQUMsaUJBQUQsQ0FBakM7O0FBQ0EsSUFBSUssVUFBVSxHQUFZTCxPQUFPLENBQUMsb0JBQUQsQ0FBakM7O0FBQ0EsSUFBSU0sVUFBVSxHQUFZTixPQUFPLENBQUMsYUFBRCxDQUFqQzs7QUFDQSxJQUFJTyxXQUFXLEdBQVdQLE9BQU8sQ0FBQyxjQUFELENBQWpDOztBQUNBLElBQUlRLFdBQVcsR0FBR1IsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBRUEsSUFBSVMsZUFBZSxHQUFHQyxFQUFFLENBQUNDLEtBQUg7QUFDbEIsYUFBU0MsY0FEUztBQUVsQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZLENBQ2pCLENBSGlCO0FBS2xCO0FBQ0FDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixRQUFJQyxVQUFVLEdBQUdm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LFFBQUk5RSxRQUFRLEdBQUcsRUFBZjtBQUNBQSxJQUFBQSxRQUFRLENBQUNYLEdBQVQsR0FBZUEsR0FBZjtBQUNBVyxJQUFBQSxRQUFRLENBQUNULE1BQVQsR0FBa0JBLE1BQWxCO0FBQ0FTLElBQUFBLFFBQVEsQ0FBQzhFLEdBQVQsR0FBZUEsR0FBZjtBQUNBLFNBQUsvSCxZQUFMLENBQWtCLEtBQWxCLEVBQXlCaUQsUUFBekI7QUFDSDtBQWhzQmlCLHVDQWtzQk5oQixJQWxzQk0sRUFrc0JEO0FBQ2IsTUFBR0EsSUFBSSxDQUFDdUIsSUFBTCxJQUFhLENBQWhCLEVBQWtCO0FBQ2ROLElBQUFBLE9BQU8sQ0FBQ2pCLElBQUksQ0FBQ2tCLEdBQU4sQ0FBUDtBQUNILEdBSFksQ0FJYjtBQUNBOztBQUNILENBeHNCaUIsRUFBdEI7QUEyc0JBdUksTUFBTSxDQUFDQyxPQUFQLEdBQWlCM04sZUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDov5nph4zloavlhpnor6bnu4bor7TmmI4s5Li76KaB5aGr5YaZ6K+l5qih5Z2X55qE5Yqf6IO9566A6KaBXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0wNiAxMToxODowNlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBNYWluU2NlbmVDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW5zY2VuZV9jb250cm9sbGVyXCIpO1xudmFyIE1haW51aUNvbnRyb2xsZXIgICAgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgU2NlbmVDb25zdCAgICAgICAgICA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbnZhciBBcmVuYUNvbnN0ICAgICAgICAgID0gcmVxdWlyZShcImFyZW5hX2NvbnN0XCIpO1xudmFyIFJvbGVDb250cm9sbGVyICAgICAgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIERyYW1hRXZlbnQgICAgICAgICAgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2V2ZW50XCIpO1xudmFyIEFyZW5hRXZlbnQgICAgICAgICAgPSByZXF1aXJlKFwiYXJlbmFfZXZlbnRcIik7XG52YXIgQmF0dGxlQ29uc3QgICAgICAgICA9IHJlcXVpcmUoXCJiYXR0bGVfY29uc3RcIik7XG52YXIgTWFpbnVpRXZlbnQgPSByZXF1aXJlKFwibWFpbnVpX2V2ZW50XCIpO1xuXG52YXIgQXJlbmFDb250cm9sbGVyID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDb250cm9sbGVyLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW6YWN572u5pWw5o2uXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQXJlbmFNb2RlbCA9IHJlcXVpcmUoXCJhcmVuYV9tb2RlbFwiKTtcbiAgICAgICAgdmFyIENoYW1waW9uTW9kZWwgPSByZXF1aXJlKFwiYXJlbmFfY2hhbXBpb25fbW9kZWxcIik7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IG5ldyBBcmVuYU1vZGVsKCk7XG4gICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNoYW1waW9uX21vZGVsID0gbmV3IENoYW1waW9uTW9kZWwoKTtcbiAgICAgICAgdGhpcy5jaGFtcGlvbl9tb2RlbC5pbml0Q29uZmlnKCk7XG5cbiAgICAgICAgdGhpcy5jYWNoZV9saXN0ID0gW107IC8v57yT5a2Y55m75b2V5YmN5omT5byA55qE55WM6Z2iXG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIGdldENoYW1QaW9uTW9kZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFtcGlvbl9tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5FVlRfUk9MRV9DUkVBVEVfU1VDQ0VTUywgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMubG9naW5fZXZlbnRfc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5yb2xlX3ZvKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmICghdGhpcy51cGRhdGVfc2VsZl9ldmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy51cGRhdGVfc2VsZl9ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGtleSA9PSBcImxldlwiKVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluaXRQcm90b2NhbCgpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmICghdGhpcy5iYXR0bGVfZHJhbWFfZXZlbnQpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYmF0dGxlX2RyYW1hX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChEcmFtYUV2ZW50LkJhdHRsZURyYW1hX1VwZGF0ZV9NYXhfSWQsIGZ1bmN0aW9uKG1heF9pZCl7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdFByb3RvY2FsKCk7XG4gICAgICAgIC8vICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnJlX2xpbmtfZ2FtZV9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yZV9saW5rX2dhbWVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JFX0xJTktfR0FNRSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIGlmICghR3VpZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaXNJbkd1aWRlKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkFyZW5hTG9vcE1hdGhXaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMucmVxdWVzdEluaXRQcm90b2NhbCgpOyAgICAgIFxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ19lbnRlcl9zY2VuZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdfZW50ZXJfc2NlbmUgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKE1haW51aUV2ZW50LkxPQURJTkdfRU5URVJfU0NFTkUsIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2FjaGVQYW5lbCgpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXF1ZXN0SW5pdFByb3RvY2FsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZW5kZXIyMDIwOCgpOyAgICAgICAgICAgICAgLy8g5oyR5oiY5qyh5pWw5aWW5Yqx5L+h5oGvXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjAwLCB7fSk7ICAgIC8vIOernuaKgOWcuuS4quS6uuS/oeaBryBcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyNTAsIHt9KTsgICAgLy8g5Yag5Yab6LWb54q25oCB5L+h5oGvXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjIzLCB7fSk7ICAgIC8vIOmYsuWuiOS/oeaBr1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozljY/orq7mjqXlj5fkuovku7ZcbiAgICByZWdpc3RlclByb3RvY2FsczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyMDAsIHRoaXMuaGFuZGxlMjAyMDAuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDIwMSwgdGhpcy5oYW5kbGUyMDIwMS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjAyLCB0aGlzLmhhbmRsZTIwMjAyLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyMDMsIHRoaXMuaGFuZGxlMjAyMDMuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDIwNiwgdGhpcy5oYW5kbGUyMDIwNi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjA3LCB0aGlzLmhhbmRsZTIwMjA3LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyMDgsIHRoaXMuaGFuZGxlMjAyMDguYmluZCh0aGlzKSk7ICAgICAvLyDlrp3nrrHmqKHlvI9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjA5LCB0aGlzLmhhbmRsZTIwMjA5LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyMTAsIHRoaXMuaGFuZGxlMjAyMTAuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDIyMCwgdGhpcy5oYW5kbGUyMDIyMC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjIxLCB0aGlzLmhhbmRsZTIwMjIxLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyMjIsIHRoaXMuaGFuZGxlMjAyMjIuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDIyMywgdGhpcy5oYW5kbGUyMDIyMy5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyDlhqDlhpvotZtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjUwLCB0aGlzLmhhbmRsZTIwMjUwLmJpbmQodGhpcykpOyAgICAgLy8g5Yag5Yab6LWb6LWb56iL54q25oCB5pWw5o2uXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDI1MSwgdGhpcy5oYW5kbGUyMDI1MS5iaW5kKHRoaXMpKTsgICAgIC8vIOS4quS6uuaOkuWQjeS7peWPiuWPr+S4i+azqOS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyNTIsIHRoaXMuaGFuZGxlMjAyNTIuYmluZCh0aGlzKSk7ICAgICAvLyDmiJHnmoTmr5TotZvkv6Hmga8gXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDI1MywgdGhpcy5oYW5kbGUyMDI1My5iaW5kKHRoaXMpKTsgICAgIC8vIOernueMnOavlOi1m+S/oeaBryBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjU0LCB0aGlzLmhhbmRsZTIwMjU0LmJpbmQodGhpcykpOyAgICAgLy8g5oq85rOo6L+U6LSnXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDI1NSwgdGhpcy5oYW5kbGUyMDI1NS5iaW5kKHRoaXMpKTsgICAgIC8vIOaIkeeahOernueMnOWIl+ihqFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyNTYsIHRoaXMuaGFuZGxlMjAyNTYuYmluZCh0aGlzKSk7ICAgICAvLyDnu5PnrpflsZXnpLpcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjU3LCB0aGlzLmhhbmRsZTIwMjU3LmJpbmQodGhpcykpOyAgICAgLy8g56ue54yc5a6e5pe25pu05pawXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDI1OCwgdGhpcy5oYW5kbGUyMDI1OC5iaW5kKHRoaXMpKTsgICAgIC8vIOaIkeeahOaImOaWl+aXpeW/l1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyNjAsIHRoaXMuaGFuZGxlMjAyNjAuYmluZCh0aGlzKSk7ICAgICAvLyAzMuW8uuaVsOaNrlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyNjEsIHRoaXMuaGFuZGxlMjAyNjEuYmluZCh0aGlzKSk7ICAgICAvLyA05by65pWw5o2uXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDI2MiwgdGhpcy5oYW5kbGUyMDI2Mi5iaW5kKHRoaXMpKTsgICAgIC8vIDMy5by65oiW6ICFNOW8uui1m+ernueMnOS9jee9ruS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyNjMsIHRoaXMuaGFuZGxlMjAyNjMuYmluZCh0aGlzKSk7ICAgICAvLyAzMuW8uuaIluiAhTTlvLrotZvmjIflrprkvY3nva7nmoTkv6Hmga9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDIwMjgwLCB0aGlzLmhhbmRsZTIwMjgwLmJpbmQodGhpcykpOyAgICAgLy8g5Yag5Yab6LWb5YmNM+WQjeS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyODEsIHRoaXMuaGFuZGxlMjAyODEuYmluZCh0aGlzKSk7ICAgICAvLyDlhqDlhpvotZvmjpLooYzmppzkv6Hmga9cblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMjAyODIsIHRoaXMuaGFuZGxlMjAyODIuYmluZCh0aGlzKSk7ICAgICAvLyDotZvlraPnu5PnrpfliY0zXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgyMDIwNCwgdGhpcy5oYW5kbGUyMDIwNC5iaW5kKHRoaXMpKTsgICAgIC8vIOafpeeci+WJp+aDheS6uuaVsOaNriAgICAgICAgXG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjAwOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlTXlMb29wRGF0YShkYXRhKTtcbiAgICB9LFxuICAgIFxuICAgIHNlbmRlcjIwMjAxOiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAgLy8g6K+35rGC5oyR5oiY6Zif5YiXIFxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDIwMSwge30pO1xuICAgIH0sIFxuXG4gICAgaGFuZGxlMjAyMDE6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgICAvLyDmjJHmiJjpmJ/liJfmm7TmlrBcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVMb29wQ2hhbGxlbmdlTGlzdChkYXRhKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyMDI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgaWYodGhpcy5sb29wX2NoYWxsZW5nZV9yb2xlX3JpZCAhPSBkYXRhLnJpZCAmJiB0aGlzLmxvb3BfY2hhbGxlbmdlX3JvbGVfc3J2X2lkICE9IGRhdGEuc3J2X2lkKSAgcmV0dXJuO1xuICAgICAgICB0aGlzLm9wZW5DaGVja0xvb3BDaGFsbGVuZ2VSb2xlKHRydWUsIGRhdGEpXG4gICAgfSxcbiAgICBvcGVuQ2hlY2tMb29wQ2hhbGxlbmdlUm9sZShzdGF0dXMsIGRhdGEpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgaWYoc3RhdHVzID09IGZhbHNlKXtcbiAgICAgICAgICAgIGlmKHNlbGYubG9vcF9jaGFsbGVuZ2VfY2hlY2tfd2luZG93ICE9IG51bGwpe1xuICAgICAgICAgICAgICAgIHNlbGYubG9vcF9jaGFsbGVuZ2VfY2hlY2tfd2luZG93LmNsb3NlKClcbiAgICAgICAgICAgICAgICBzZWxmLmxvb3BfY2hhbGxlbmdlX2NoZWNrX3dpbmRvdyA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihkYXRhID09IG51bGwpIHJldHVybjtcbiAgICAgICAgICAgIGlmKHNlbGYubG9vcF9jaGFsbGVuZ2VfY2hlY2tfd2luZG93ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIGxldCBBcmVuYUxvb3BDaGFsbGVuZ2VDaGVja1dpbmRvdyA9IHJlcXVpcmUoXCJhcmVuYV9sb29wX2NoYWxsZW5nZV9jaGVja193aW5kb3dcIilcbiAgICAgICAgICAgICAgICBzZWxmLmxvb3BfY2hhbGxlbmdlX2NoZWNrX3dpbmRvdyA9IG5ldyBBcmVuYUxvb3BDaGFsbGVuZ2VDaGVja1dpbmRvdygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmxvb3BfY2hhbGxlbmdlX2NoZWNrX3dpbmRvdy5vcGVuKGRhdGEpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VuZGVyMjAyMDM6IGZ1bmN0aW9uKHJpZCwgc3J2X2lkKSB7XG4gICAgICAgIC8vIGlmICghcmlkIHx8ICFzcnZfaWQpIHJldHVybjtcblxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkO1xuICAgICAgICBwcm90b2NhbC5zcnZfaWQgPSBzcnZfaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjAzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjAzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjA2OiBmdW5jdGlvbigpIHsgICAgICAgICAgICAgICAgICAvLyDor7fmsYLliLfmlrDmjJHmiJjpmJ/liJdcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyMDYsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyMDY6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgICAgIC8vIOivt+axguWIt+aWsOe7k+aenFxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgIH0sXG5cbiAgICBzZW5kZXIyMDIwNzogZnVuY3Rpb24obnVtKSB7ICAgICAgICAgICAgICAvLyDotK3kubDmjJHmiJjliLhcbiAgICAgICAgdmFyIHByb3RvID0ge307XG4gICAgICAgIHByb3RvLm51bSA9IG51bTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyMDcsIHByb3RvKVxuICAgIH0sXG5cbiAgICBoYW5kbGUyMDIwNzogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQXJlbmFFdmVudC5VcGRhdGVBcmVuYV9OdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3BlbkFyZW5hTG9vcENoYWxsZW5nZUJ1eShmYWxzZSk7XG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjA4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyMDgsIHt9KVxuICAgIH0sXG5cbiAgICBoYW5kbGUyMDIwODogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSlcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlQ2hhbGxlbmdlVGltZXNBd2FyZHMoZGF0YSk7ICAgICAgICAgICAgXG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjA5OiBmdW5jdGlvbihudW0pIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLm51bSA9IG51bTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyMDksIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyMDk6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB9LFxuXG4gICAgLy8g5oiY5paX6K6h566X77yM5pS25Yiw57uT566X55qE77yM5bCx5ZCM5pe26K+35rGC5LiA5LiL5Liq5Lq65L+h5oGv5ZCn77yM5pyN5Yqh5Zmo6KaB5rGCXG4gICAgaGFuZGxlMjAyMTA6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbiAgICAgICAgdmFyIEJhdHRsZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRmluaXNoVmlldyh0cnVlLCBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkFyZW5hLCBkYXRhKTtcblxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDIwMCwge30pO1xuICAgIH0sXG5cbiAgICBzZW5kZXIyMDIyMDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjIwLCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyMjA6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgICAgLy8g5b6q546v6LWb5YmN5LiJXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmFua19saXN0KSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlTG9vcENoYWxsZW5nZVN0YXR1ZUxpc3QsIGRhdGEucmFua19saXN0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kZXIyMDIyMTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjIxLCB7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjIxOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlTG9vcENoYWxsZW5nZVJhbmssIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjIyOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjIyLCB7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjIyOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBcmVuYUV2ZW50LlVwZGF0ZU15bG9nTGlzdEV2ZW50LCBkYXRhLmxvZ19saXN0KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyMjM6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVBcmVuYUxvb3BMb2dTdGF0dXMoZGF0YS5mbGFnKTtcbiAgICB9LFxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioq5Yag5Yab6LWb55u45YWzKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBoYW5kbGUyMDI1MDogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgLy8g5Yag5Yab6LWb6LWb56iL54q25oCBXG4gICAgICAgIHRoaXMuY2hhbXBpb25fbW9kZWwudXBkYXRlQ2hhbXBpb25CYXNlSW5mbyhkYXRhKTtcbiAgICAgICAgdGhpcy5zZW5kZXIyMDI1MSgpO1xuXG4gICAgICAgIC8vIOW8leWvvOWSjOWJp+aDheS4reS4jemcgOimgeW8ueWHulxuICAgICAgICB2YXIgR3VpZGVDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWRlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgIHZhciBTdG9yeUNvbnRyb2xsZXIgPSByZXF1aXJlKFwic3RvcnlfY29udHJvbGxlclwiKTtcbiAgICAgICAgaWYgKEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzSW5HdWlkZSgpKSByZXR1cm47XG4gICAgICAgIGlmIChTdG9yeUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luU3RvcnkoKSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy8g5by556qX5aSE55CG55qE55u45YWz6YC76L6RXG4gICAgICAgIHZhciBidWlsZF92byA9IE1haW5TY2VuZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWlsZFZvKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hcmVuYSk7XG4gICAgICAgIGlmICghYnVpbGRfdm8gfHwgYnVpbGRfdm8uaXNfbG9jaykgcmV0dXJuO1xuXG4gICAgICAgIGlmKElTX0xPQURJTkcgPT0gdHJ1ZSl7XG4gICAgICAgICAgICB0aGlzLmNhY2hlX2xpc3QucHVzaCh7ZnVuY3Rpb246ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGUyMDI1MChkYXRhKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLGRhdGEpfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5zdGVwX3N0YXR1cyA9PT0gQXJlbmFDb25zdC5jaGFtcGlvbl9zdGVwX3N0YXR1cy5vcGVuZWQpIHtcbiAgICAgICAgICAgIHZhciBBY3Rpdml0eUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYWN0aXZpdHlfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgdmFyIEFjdGl2aXR5Q29uc3QgPSByZXF1aXJlKFwiYWN0aXZpdHlfY29uc3RcIik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hhbXBpb25fd2luZG93KSB7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucm91bmRfc3RhdHVzID09IEFyZW5hQ29uc3QuY2hhbXBpb25fcm91bmRfc3RhdHVzLmd1ZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5Q29udHJvbGxlci5vcGVuU2lnblZpZXcodHJ1ZSwgQWN0aXZpdHlDb25zdC5BY3Rpdml0eVNpZ25UeXBlLmFyZW5hX2NoYW1waW9uX2d1ZXNzLCB7dGltZXI6IHRydWV9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFkX3Nob3dfbm90aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUNvbnRyb2xsZXIub3BlblNpZ25WaWV3KHRydWUsIEFjdGl2aXR5Q29uc3QuQWN0aXZpdHlTaWduVHlwZS5hcmVuYV9jaGFtcGlvbiwge3RpbWVyOiB0cnVlfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFkX3Nob3dfbm90aWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsZXJ0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxlcnRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjUxOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjUxLCB7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjUxOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAvLyDkuKrkurrmjpLlkI3ku6Xlj4rlj69cbiAgICAgICAgdGhpcy5jaGFtcGlvbl9tb2RlbC5zZXRSb2xlSW5mbyhkYXRhKTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMjAyNTI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDI1Miwge30pO1xuICAgIH0sIFxuXG4gICAgaGFuZGxlMjAyNTI6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIOaIkeeahOavlOi1m+S/oeaBryBcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBcmVuYUV2ZW50LlVwZGF0ZU15TWF0Y2hJbmZvRXZlbnQsIGRhdGEpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIyMDI1MzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjUzLCB7fSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjUzOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAvLyDnq57njJzmr5TotZvkv6Hmga8gXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQXJlbmFFdmVudC5VcGRhdGVHdWVzc01hdGNoSW5mb0V2ZW50LCBkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g6K+35rGC5oq85rOo5p+Q5LiA5pa5XG4gICAgc2VuZGVyMjAyNTQ6IGZ1bmN0aW9uKGJldF90eXBlLCBiZXRfdmFsKSB7XG4gICAgICAgIHZhciBwcm90byA9IHt9O1xuICAgICAgICBwcm90by5iZXRfdHlwZSA9IGJldF90eXBlO1xuICAgICAgICBwcm90by5iZXRfdmFsID0gYmV0X3ZhbDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyNTQsIHByb3RvKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNTQ6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIOaKvOazqOi/lOi0p1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEpIHtcbiAgICAgICAgICAgIHZhciByb2xlX2luZm8gPSB0aGlzLmNoYW1waW9uX21vZGVsLmdldFJvbGVJbmZvKClcbiAgICAgICAgICAgIHJvbGVfaW5mby5jYW5fYmV0ID0gZGF0YS5jYW5fYmV0XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlUm9sZUluZm9CZXRFdmVudCwgZGF0YS5jYW5fYmV0LCBkYXRhLmJldF90eXBlKVxuICAgICAgICAgICAgdGhpcy5vcGVuQXJlbmFDaGFtcGlvbkd1ZXNzV2luZG93KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kZXIyMDI1NTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjU1LCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNTU6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIOaIkeeahOernueMnOWIl+ihqFxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlTXlHdWVzc0xpc3RFdmVudCwgZGF0YS5saXN0KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNTY6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIOe7k+eul+WxleekulxuICAgIH0sXG5cbiAgICBoYW5kbGUyMDI1NzogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgLy8g56ue54yc5a6e5pe25pu05pawXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQXJlbmFFdmVudC5VcGRhdGVCZXRNYXRjaFZhbHVlRXZlbnQsIGRhdGEpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUyMDI1ODogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgLy8g5oiR55qE5oiY5paX5pel5b+XXG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjYwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyNjAsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNjA6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIDMy5by65pWw5o2uXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQXJlbmFFdmVudC5VcGRhdGVUb3AzMkluZm9FdmVudCwgZGF0YSk7XG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjYxOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyNjEsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNjE6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIDTlvLrmlbDmja5cbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBcmVuYUV2ZW50LlVwZGF0ZVRvcDRJbmZvRXZlbnQsIGRhdGEpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIyMDI2MjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjYyLCB7fSlcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyNjI6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIDMy5by65oiW6ICFNOW8uui1m+ernueMnOS9jee9ruS/oeaBryAgICAgICAgXG4gICAgICAgIGlmIChkYXRhKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShBcmVuYUV2ZW50LlVwZGF0ZVRvcDMyNEd1ZXNzR3JvdXBFdmVudCwgZGF0YS5ncm91cCwgZGF0YS5wb3MpXG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjYzOiBmdW5jdGlvbihncm91cCwgcG9zKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5ncm91cCA9IGdyb3VwO1xuICAgICAgICBwcm90b2NhbC5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDIwMjYzLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjYzOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAvLyAzMuW8uuaIluiAhTTlvLrotZtcbiAgICAgICAgaWYgKGRhdGEpXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlVG9wMzI0R3JvdXBQb3NFdmVudCwgZGF0YSk7ICAgICAgXG4gICAgfSxcblxuICAgIHNlbmRlcjIwMjgwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMjAyODAsIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMjAyODA6IGZ1bmN0aW9uKGRhdGEpIHsgICAgICAgIC8vIOWGoOWGm+i1m+WJjTPlkI3kv6FcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yYW5rX2xpc3QpXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFyZW5hRXZlbnQuVXBkYXRlQ2hhbXBpb25Ub3AzRXZlbnQsIGRhdGEucmFua19saXN0KTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMjAyODE6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDI4MSwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUyMDI4MTogZnVuY3Rpb24oZGF0YSkgeyAgICAgICAgLy8g5Yag5Yab6LWb5o6S6KGM5qac5L+hXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQXJlbmFFdmVudC5VcGRhdGVDaGFtcGlvblJhbmtFdmVudCwgZGF0YSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjgyOiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAvLyDotZvlraPnu5PnrpfliY0zXG4gICAgfSxcblxuICAgIGhhbmRsZTIwMjA0OiBmdW5jdGlvbihkYXRhKSB7ICAgICAgICAvLyDmn6XnnIvliafmg4XkurrmlbDmja5cblxuICAgIH0sXG5cbiAgICAvL+i/m+WFpeS4u+WcuuaZr+WQjuaYvuekuue8k+WtmOeahOeVjOmdolxuICAgIHNob3dDYWNoZVBhbmVsOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY2FjaGVfbGlzdCA9PSBudWxsIHx8IHRoaXMuY2FjaGVfbGlzdC5sZW5ndGg8PTApcmV0dXJuO1xuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5jYWNoZV9saXN0KXtcbiAgICAgICAgICAgIGlmKHRoaXMuY2FjaGVfbGlzdFtpXS5mdW5jdGlvbil7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZV9saXN0W2ldLmZ1bmN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZV9saXN0ID0gW107XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzror7fmsYLmiZPlvIDnq57mioDlnLrpnaLmnb8s6L+Z5Liq5pe25YCZ6KaB5Yik5pat5LiA5LiLLOWmguaenOaYr+WGoOWGm+i1m+W8gOWni+mYtuautSzlsLHkuI3opoHnm7TmjqXov5vnq57mioDlnLrkuoYsXG4gICAgLy8g5ZCm5YiZ55u05o6l6L+b56ue5oqA5Zy65ZCnLOi/meS4quaJjeaYr+WvueWkluaJk+W8gOernuaKgOWcuueahOivt+axgizlm6DkuLrov5nph4zopoHliKTmlq3mmK/lkKblnKjlhqDlhpvotZvkuIPliZFcbiAgICAvLyB0aW1lOjIwMTgtMDgtMDEgMDg6MTA6MjFcbiAgICAvLyBleHRlbmQ65omp5bGV5Y+C5pWwLOWmguaenOaYr+WGoOWGm+i1myzliJnpnIDopoHliKTmlq3lhbfkvZPnmoRcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgcmVxdWVzdE9wZW5BcmVuV2luZG93OiBmdW5jdGlvbihzdGF0dXMsIGV4dGVuZCkge1xuICAgICAgICB2YXIgZGF0YSA9IE1haW5TY2VuZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWlsZFZvKFNjZW5lQ29uc3QuQ2VudGVyU2NlbmVCdWlsZC5hcmVuYSk7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEuaXNfbG9jaykge1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLmRlc2MpXG4gICAgICAgICAgICByZXR1cm4gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICAvLyDlpoLmnpzmmK/lvJXlr7znmoTor50s6YKj5LmI6L+Z5Liq6IKv5a6a5piv6L+b56ue5oqA5Zy6XG4gICAgICAgIC8vIGlmIEd1aWRlQ29udHJvbGxlcjpnZXRJbnN0YW5jZSgpOmlzSW5HdWlkZSgpIHRoZW4gXG4gICAgICAgIC8vICAgICBzZWxmOnJlcXVlc3RPcGVuQXJlbmFMb29wTWF0aFdpbmRvdyh0cnVlKVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIGlmIChleHRlbmQgPT0gQXJlbmFDb25zdC5hcmVuYV90eXBlLnJhbmspIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkFyZW5hQ2hhbXBpb25NYXRjaFdpbmRvdyh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBiYXNlX2luZm8gPSB0aGlzLmNoYW1waW9uX21vZGVsLmdldEJhc2VJbmZvKCk7XG4gICAgICAgICAgICBpZiAoIWJhc2VfaW5mbyB8fCBiYXNlX2luZm8uc3RlcF9zdGF0dXMgIT0gQXJlbmFDb25zdC5jaGFtcGlvbl9zdGVwX3N0YXR1cy5vcGVuZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RPcGVuQXJlbmFMb29wTWF0aFdpbmRvdyh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQXJlbmFFbnRlcldpbmRvdyh0cnVlLCBBcmVuYUNvbnN0LmFyZW5hX3R5cGUucmFuayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICAvLyBkZXNjOuivt+axguaJk+W8gOernuaKgOWcuueVjOmdolxuICAgIC8vIHRpbWU6MjAxOC0wOC0wMSAwODoxOToyNVxuICAgIC8vIEBzdGF0dXM6XG4gICAgLy8gQGluZGV4OlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICByZXF1ZXN0T3BlbkFyZW5hTG9vcE1hdGhXaW5kb3c6IGZ1bmN0aW9uKHN0YXR1cywgaW5kZXgpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuQXJlbmEpICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrmiZPlvIDlvqrnjq/otZvnlYzpnaIo6L+Z5Liq5o6l5Y+j5aSW6YOo5Y+q5pyJ5LiA5LiqLOmCo+WwseaYr+ecn+ato+eahOaImOaWl+ivt+axguWbnuadpeS5i+WQjuaJk+W8gOeahCzkuZ/lsLHmmK9tYWludWljb250cm9sbGVy6YeM6Z2i5omT5byA55qEKVxuICAgIC8vIHRpbWU6MjAxOC0wNy0zMSAwOTo1MjoyM1xuICAgIC8vIEBzdGF0dXM6XG4gICAgLy8gQGluZGV4OlxuICAgIC8vIEByZXR1cm4gXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS1cbiAgICBvcGVuQXJlbmFMb29wTWF0aFdpbmRvdzogZnVuY3Rpb24oc3RhdHVzLCBpbmRleCkge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgYnVpbGRfdm8gPSBNYWluU2NlbmVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0QnVpbGRWbyhTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuYXJlbmEpXG4gICAgICAgICAgICBpZiAoYnVpbGRfdm8gJiYgYnVpbGRfdm8uaXNfbG9jaykge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UoYnVpbGRfdm8uZGVzYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgaW5kZXggPSBpbmRleCB8fCBBcmVuYUNvbnN0Lmxvb3BfaW5kZXguY2hhbGxlbmdlOyBcbiAgICAgICAgICAgIGlmICghdGhpcy5sb29wX21hdGNoX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUxvb3BNYXRjaFdpbmRvdyA9IHJlcXVpcmUoXCJhcmVuYV9sb29wX21hdGNoX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvb3BfbWF0Y2hfd2luZG93ID0gbmV3IEFyZW5hTG9vcE1hdGNoV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICghdGhpcy5sb29wX21hdGNoX3dpbmRvdy5pc09wZW4oKSkgXG4gICAgICAgICAgICAgICAgdGhpcy5sb29wX21hdGNoX3dpbmRvdy5vcGVuKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvb3BfbWF0Y2hfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29wX21hdGNoX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9vcF9tYXRjaF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gZGVzYzrmiZPlvIDlvqrnjq/otZvmiJbogIXlhqDlhpvotZvlhaXlj6PnlYzpnaJcbiAgICAvLyB0aW1lOjIwMTgtMDctMzEgMDk6NTI6MDRcbiAgICAvLyBAc3RhdHVzOlxuICAgIC8vIEBpbmRleDpcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgb3BlbkFyZW5hRW50ZXJXaW5kb3c6IGZ1bmN0aW9uKHN0YXR1cywgaW5kZXgpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdmFyIGJ1aWxkX3ZvID0gTWFpblNjZW5lQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkVm8oU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLmFyZW5hKVxuICAgICAgICAgICAgaWYgKGJ1aWxkX3ZvICYmIGJ1aWxkX3ZvLmlzX2xvY2spIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKGJ1aWxkX3ZvLmRlc2MpXG4gICAgICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZW50ZXJfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIEFyZW5hRW50ZXJXaW5kb3cgPSByZXF1aXJlKFwiYXJlbmFfZW50ZXJfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW50ZXJfd2luZG93ID0gbmV3IEFyZW5hRW50ZXJXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCA9IGluZGV4IHx8IEFyZW5hQ29uc3QuYXJlbmFfdHlwZS5sb29wO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmVudGVyX3dpbmRvdy5pc09wZW4oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50ZXJfd2luZG93Lm9wZW4oaW5kZXgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lbnRlcl93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGVyX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlcl93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOWGoOWGm+i1m+S4u+eVjOmdolxuICAgIG9wZW5BcmVuYUNoYW1waW9uTWF0Y2hXaW5kb3c6IGZ1bmN0aW9uKHN0YXR1cywgaW5kZXgpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYW1waW9uX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUNoYW1waW9uTWF0Y2hXaW5kb3cgPSByZXF1aXJlKFwiYXJlbmFfY2hhbXBpb25fbWF0Y2hfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbXBpb25fd2luZG93ID0gbmV3IEFyZW5hQ2hhbXBpb25NYXRjaFdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB0aGlzLmNoYW1waW9uX3dpbmRvdy5vcGVuKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYW1waW9uX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbXBpb25fd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFtcGlvbl93aW5kb3cgPSBudWxsOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9LFxuXG4gICAgb3BlbkFyZW5hQ2hhbXBpb25HdWVzc1dpbmRvdzogZnVuY3Rpb24oc3RhdHVzLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ndWVzc193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB2YXIgQXJlbmFDaGFtcGlvbkd1ZXNzV2luZG93ID0gcmVxdWlyZShcImFyZW5hX2NoYW1waW9uX2d1ZXNzX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1ZXNzX3dpbmRvdyA9IG5ldyBBcmVuYUNoYW1waW9uR3Vlc3NXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmd1ZXNzX3dpbmRvdy5vcGVuKGRhdGEpOyAgICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3Vlc3Nfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWVzc193aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1ZXNzX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOW+queOr+i1m+e7k+eul+eVjOmdolxuICAgIG9wZW5Mb29wUmVzdWx0V2luZG93OiBmdW5jdGlvbihzdGF0dXMsIGRhdGEpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxvb3BfcmVzdWx0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBMb29wUmVzdWx0V2luZG93ID0gcmVxdWlyZShcImFyZW5hX2xvb3BfcmVzdWx0X3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvb3BfcmVzdWx0X3dpbmRvdyA9IG5ldyBMb29wUmVzdWx0V2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb29wX3Jlc3VsdF93aW5kb3cub3BlbihkYXRhKTsgICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvb3BfcmVzdWx0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9vcF9yZXN1bHRfd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb29wX3Jlc3VsdF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9wZW5BcmVuYUxvb3BNeUxvZ1dpbmRvdzogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb29wX2xvZ193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB2YXIgQXJlbmFMb29wTXlMb2dXaW5kb3cgPSByZXF1aXJlKFwiYXJlbmFfbG9vcF9teV9sb2dfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9vcF9sb2dfd2luZG93ID0gbmV3IEFyZW5hTG9vcE15TG9nV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb29wX2xvZ193aW5kb3cub3BlbigpOyAgICAgICAgICAgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb29wX2xvZ193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvb3BfbG9nX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9vcF9sb2dfd2luZG93ID0gbnVsbDsgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvcGVuQXJlbmFMb29wQ2hhbGxlbmdlQnV5OiBmdW5jdGlvbihzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFyZW5hX2NoYW1waW9uX2J1eSkge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUNoYW1waW9uQnV5ID0gcmVxdWlyZShcImFyZW5hX2xvb3BfY2hhbGxlbmdlX2J1eV93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmVuYV9jaGFtcGlvbl9idXkgPSBuZXcgQXJlbmFDaGFtcGlvbkJ1eSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXJlbmFfY2hhbXBpb25fYnV5Lm9wZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyZW5hX2NoYW1waW9uX2J1eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJlbmFfY2hhbXBpb25fYnV5LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmVuYV9jaGFtcGlvbl9idXkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9wZW5BcmVuYUNoYW1waW9uTXlHdWVzc1dpbmRvdzogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5teV9ndWVzc193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB2YXIgQXJlbmFDaGFtcGlvbk15R3Vlc3NXaW5kb3cgPSByZXF1aXJlKFwiYXJlbmFfY2hhbXBpb25fbXlfZ3Vlc3Nfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubXlfZ3Vlc3Nfd2luZG93ID0gbmV3IEFyZW5hQ2hhbXBpb25NeUd1ZXNzV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5teV9ndWVzc193aW5kb3cub3BlbigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5teV9ndWVzc193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15X2d1ZXNzX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5teV9ndWVzc193aW5kb3cgPSBudWxsOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy9kZXNjOuaJk+W8gOWGoOWGm+i1m+aOkuWQjeWlluWKsemdouadv1xuICAgIC8vdGltZToyMDE4LTA4LTAxIDAyOjA0OjA2XG4gICAgLy9Ac3RhdHVzOlxuICAgIC8vQHJldHVybiBcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIG9wZW5BcmVuYUNoYW1waW9uUmFua0F3YXJkc1dpbmRvdzogZnVuY3Rpb24oc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGFtcGlvbl9yYW5rX2F3YXJkcykge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUNoYW1waW9uUmFua0F3YXJkc1dpbmRvdyA9IHJlcXVpcmUoXCJhcmVuYV9jaGFtcGlvbl9yYW5rX2F3YXJkc193aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFtcGlvbl9yYW5rX2F3YXJkcyA9IG5ldyBBcmVuYUNoYW1waW9uUmFua0F3YXJkc1dpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hhbXBpb25fcmFua19hd2FyZHMub3BlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hhbXBpb25fcmFua19hd2FyZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW1waW9uX3JhbmtfYXdhcmRzLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW1waW9uX3JhbmtfYXdhcmRzID0gbnVsbDsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvL2Rlc2M65omT5byAXG4gICAgLy90aW1lOjIwMTgtMDctMzEgMDU6MjM6NThcbiAgICAvL0BzdGF0dXM6XG4gICAgLy9AZGF0YTpcbiAgICAvL0ByZXR1cm4gXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBvcGVuQXJlbmFDaGFtcGlvblJhbmtXaW5kb3c6IGZ1bmN0aW9uKHN0YXR1cywgZGF0YSkge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hhbXBpb25fcmFuaykge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUNoYW1waW9uUmFua1dpbmRvdyA9IHJlcXVpcmUoXCJhcmVuYV9jaGFtcGlvbl9yYW5rX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW1waW9uX3JhbmsgPSBuZXcgQXJlbmFDaGFtcGlvblJhbmtXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNoYW1waW9uX3Jhbmsub3BlbihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYW1waW9uX3JhbmspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW1waW9uX3JhbmsuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW1waW9uX3JhbmsgPSBudWxsOyAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0QXJlbmFSb290OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMubG9vcF9tYXRjaF93aW5kb3cpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb29wX21hdGNoX3dpbmRvdy5yb290X3duZDtcbiAgICB9LFxuXG5cbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vZGVzYzrlhqDlhpvotZvmiJjlhrXnmoTnqpfkvZNcbiAgICAvL3RpbWU6MjAxOC0wOC0wMyAwODo0MDo1NFxuICAgIC8vQHN0YXR1czpcbiAgICAvL0BkYXRhOlxuICAgIC8vQHJldHVybiBcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgb3BlbkFyZW5hQ2hhbXBpb25SZXBvcnRXaW5kb3c6IGZ1bmN0aW9uKHN0YXR1cywgZGF0YSkge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVwb3J0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBBcmVuYUNoYW1waW9uUmVwb3J0V2luZG93ID0gcmVxdWlyZShcImFyZW5hX2NoYW1waW9uX3JlcG9ydF93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRfd2luZG93ID0gbmV3IEFyZW5hQ2hhbXBpb25SZXBvcnRXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlcG9ydF93aW5kb3cub3BlbihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlcG9ydF93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydF93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydF93aW5kb3cgPSBudWxsOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgICAgICAgXG4gICAgfSxcblxuICAgIHVwZGF0ZUNoYW1waW9uVGFiOiBmdW5jdGlvbih0YWJfaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbXBpb25fd2luZG93KVxuICAgICAgICAgICAgdGhpcy5jaGFtcGlvbl93aW5kb3cudXBkYXRlVGFiKHRhYl9pbmRleCk7XG4gICAgfSxcblxuICAgIHJlcXVlc3RMb29wQ2hhbGxlbmdlUm9sZUluZm8ocmlkLCBzcnZfaWQpe1xuICAgICAgICBpZihyaWQgPT0gbnVsbCB8fCBzcnZfaWQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIHRoaXMubG9vcF9jaGFsbGVuZ2Vfcm9sZV9yaWQgPSByaWQgICAgICAgICAgICAgIC8vLS0g6K6w5b2V5LiA5LiL5b2T5YmN6K+35rGC5p+l55yL55qE6KeS6Imycmlk5ZKMc3J2X2lkXG4gICAgICAgIHRoaXMubG9vcF9jaGFsbGVuZ2Vfcm9sZV9zcnZfaWQgPSBzcnZfaWRcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwucmlkID0gcmlkXG4gICAgICAgIHByb3RvY2FsLnNydl9pZCA9IHNydl9pZFxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDIwMiwgcHJvdG9jYWwpXG4gICAgfSxcbiAgICBcbiAgICByZXF1ZXN0UmFib3RJbmZvKHJpZCwgc3J2X2lkLCBwb3Mpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5yaWQgPSByaWRcbiAgICAgICAgcHJvdG9jYWwuc3J2X2lkID0gc3J2X2lkXG4gICAgICAgIHByb3RvY2FsLnBvcyA9IHBvc1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgyMDIwNCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUyMDIwNChkYXRhKXtcbiAgICAgICAgaWYoZGF0YS5jb2RlID09IDApe1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgfVxuICAgICAgICAvLyB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpXG4gICAgICAgIC8vIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3Blbkhlcm9UaXBzUGFuZWwodHJ1ZSwgZGF0YSk7IFxuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBcmVuYUNvbnRyb2xsZXI7Il19