(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/battle/battle_model.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, '046a3v0XBJHTaPPjX3IPd0Q', 'battle_model'); // Scripts/mod/battle/battle_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 战战斗数据控制器,其中包括了战斗场景的创建 // flyItem attack hideUI showUI fadeOut fadeIn moveBack moveTo noActAttack 暂时实现的播报动作只有这一些 // blackScreen blackScreen2 blackScreen3 hide show shadow 这一些已经废弃的 //
Create: 2018-11-28 19:19:19 // -------------------------------------------------------------------- var BattleData = require("battle_data"); var BattleConst = require("battle_const"); var LoaderManager = require("loadermanager"); var BattleResPool = require("battle_res_pool"); var AniRes = ["hit_effect_list", // 受击点特效 "area_effect_list", // 范围特效 "act_effect_list", // 出手点特效 "bact_effect_list", // 施法特效 "trc_effect_list" // 弹道特效 ]; var BattleModel = cc.Class({ ctor: function ctor() {}, properties: { init_fight_status: false }, initConfig: function initConfig() { this.battle_controller = require("battle_controller").getInstance(); this.hook_model = this.battle_controller.getHookModel(); this.skill_act = require("skill_act"); this.battle_pools = require("battle_role_pool").getInstance(); // 现在这个对象池主要是存放buff飘字以及主动技能飘字等,退出战斗没有移除掉这个对象池 this.battle_dmg_cache_list = {}; // 战斗伤害数字的缓存纹理数据,现在退出战斗没有移除掉 this.battle_effect_list = {}; // 当前战斗存在的非挂接角色的特效,这里存放的,退出战斗就会移除掉 this.battle_effect_pool = {}; // 已经播放过的特效缓存对象,退出战斗就会移除掉 this.role_time_scale = 1.1; // 二倍速下面的模型动作速率 this.battle_speed = 1; // 当前战斗速率,服务端速率 this.button_list_panel_time = 0; // 假战斗详情面板关闭的时间戳 this.form_panel_time = 0; // 真战斗对战面板关闭的时间戳 this.is_clear = true; this.resetInitData(); }, // 重设初始化数据 resetInitData: function resetInitData() { this.my_group = 0; // 战斗中我自己的分组,主要区分是否是己方 this.init_fight_status = false; // 是否是初始化进詹欧的,主要是做进场 this.alive_num = 0; // 存活单位 this.create_over_num = 0; // 已经创建完成的单位数量 this.skill_plays_order_list = []; // 当前播放列表 this.round_data_temp = {}; this.order_list = []; this.round_data = {}; this.cur_round_data = {}; this.actor_sum = 0; this.actor_play_sum = 0; this.act_playing = false; this.is_play_round_start = false; this.cur_round = null; this.next_round = null; this.battle_data = null; this.combat_type = BattleConst.Fight_Type.Nil; // 当前战斗类型 this.real_role_list = {}; // 真是战斗单位列表 this.cur_fight_type = 0; // 当前战斗类型,如果是0:没有战斗 1:假战斗 2:真战斗 this.buffs = {}; // 重连buff this.hallows_list = {}; // 神器数据 this.scene_buff_effect_list = {}; // 场景buff特效缓存对象 }, // 创建一个场景特效,主要是群攻之类的,这类特效在退出战斗的时候会移除掉 addBattleEfffect: function addBattleEfffect(parent, scene_pos, reverse, effect_id, action_name) { var BattleEffect = require("battle_effect"); var battle_effect = null; var effect_key = Utils.getNorKey(effect_id, action_name); if (this.battle_effect_pool[effect_key] != null) { if (this.battle_effect_pool[effect_key].length > 0) { battle_effect = this.battle_effect_pool[effect_key].shift(); // 从头取出一个 } } if (battle_effect == null) { battle_effect = new BattleEffect(); battle_effect.createEffect(parent, scene_pos, reverse, effect_id); } else { battle_effect.resetScenePos(scene_pos); battle_effect.resetReverse(reverse); battle_effect.setTimeScale(this.role_time_scale); battle_effect.setActiveEffect(true); } if (this.battle_effect_list[effect_key] == null) { this.battle_effect_list[effect_key] = []; } this.battle_effect_list[effect_key].push(battle_effect); return battle_effect; }, // 移除一个场景战斗特效 delBattleEffect: function delBattleEffect(battle_effect) { var effect_key = battle_effect.getEffectKey(); if (effect_key == "_") return; if (this.battle_effect_pool[effect_key] == null) { this.battle_effect_pool[effect_key] = []; } var array = this.battle_effect_list[effect_key]; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element == battle_effect) { array.splice(index, 1); battle_effect.setActiveEffect(false); this.battle_effect_pool[effect_key].push(battle_effect); break; } } }, // 获取伤害数字的缓存纹理数据 getDmgFontCacheObject: function getDmgFontCacheObject(type, callback) { var res_path = PathTool.getPlistPath("num", "type" + type); var res_object = this.battle_dmg_cache_list[res_path]; if (res_object == null) { LoaderManager.getInstance().loadRes(res_path, function (res_object) { this.battle_dmg_cache_list[res_path] = res_object; callback(res_object); }.bind(this)); } else { callback(res_object); } }, // 释放掉战斗资源,退出战斗场景之后释放掉吧,但是这里可能存在一个问题就是退出战斗场景是即时的,但是伤害数字还在处于动作中,这个时候还是释放不掉,战斗艺术字不是特别大,暂时考虑不清除 releaseDmgFont: function releaseDmgFont() { for (var path in this.battle_dmg_cache_list) { LoaderManager.getInstance().releaseRes(path); } this.battle_dmg_cache_list = {}; }, // 获取一个普通文字.带背景的,暂时退出战斗没有移除对象池 getNormalFont: function getNormalFont() { var pools = this.battle_pools.getFontPools(); var node = null; if (pools.size() > 0) { node = pools.get(); } else { node = new cc.Node(); node.setAnchorPoint(0.5, 0.5); node.width = 176; node.height = 44; var bg_node = new cc.Node(); bg_node.addComponent(cc.Sprite); node.addChild(bg_node); var font_node = new cc.Node(); var font_label = font_node.addComponent(cc.Label); font_label.lineHeight = 20; font_label.fontSize = 20; font_node.addComponent(cc.LabelOutline); font_node.name = "font_label"; node.addChild(font_node); var bg_path = PathTool.getUIIconPath("battle", "battle_buff_name_bg"); LoaderManager.getInstance().loadRes(bg_path, function (bg_node, res_object) { bg_node.getComponent(cc.Sprite).spriteFrame = res_object; }.bind(this, bg_node)); } return node; }, /** * 回收对象池 * @param {*} font */ pushBackBattleFont: function pushBackBattleFont(font) { this.battle_pools.pushBackFont(font); }, /** * 真是战斗的初始化数据.战斗单位可能存在hp为0的时候,这个时候需要特殊处理 */ updateCurBattleData: function updateCurBattleData(data, is_init) { this.deleteCurBattleData(); this.init_fight_status = is_init; if (this.battle_data == null) { this.battle_data = new BattleData(); } this.battle_data.updateData(data); // 保存战斗速度 this.saveSpeed(data.play_speed); // 更新神器数据 for (var index = 0; index < data.hallows_list.length; index++) { var element = data.hallows_list[index]; this.hallows_list[element.group] = element; } // 先判断对战列表中是否有自己的 var RoleController = require("role_controller"); var role_vo = RoleController.getInstance().getRoleVo(); for (var key in this.battle_data.fight_object_list) { var role_data = this.battle_data.fight_object_list[key]; if (Utils.getNorKey(role_data.owner_id, role_data.owner_srv_id) == Utils.getNorKey(role_vo.rid, role_vo.srv_id) && this.my_group == 0) { this.my_group = role_data.group; } if (role_data.hp > 0) { this.alive_num += 1; } // 处理神器的 if (role_data.object_type == BattleConst.Unit_Type.Hallows) { var hallows_data = this.hallows_list[role_data.group]; hallows_data.pos = role_data.pos; role_data.hallows_val = hallows_data.val; role_data.hallows_max = hallows_data.max; } } if (this.my_group == 0) { this.my_group = 1; } }, /** * 创建完成之后通知服务端准备报了 */ addReadySum: function addReadySum() { this.create_over_num += 1; if (this.create_over_num >= this.alive_num) { this.battle_controller.csReadyFightStart(); } }, // 获取所有战斗单位 getAllObject: function getAllObject() { return this.real_role_list; }, // 设置战斗场景可见与否 handleBattleSceneStatus: function handleBattleSceneStatus(status) { if (this.battle_scene) { this.battle_scene.changeVisible(status); // this.battle_scene.setVisible(status) } }, // 是否在战斗中 getFightStatus: function getFightStatus() { return this.is_real_combat; }, // 返回战斗场景 getBattleScene: function getBattleScene() { return this.battle_scene; }, // 是否在真战斗中 isInRealBattle: function isInRealBattle() { return this.is_real_combat; }, /** * 创建战斗场景,这里是唯一的入口,这里需要判断真假战斗切换,等 * @param {*} in_fight_type 0:没有战斗 1:假战斗 2:真战斗 */ createBattleScene: function createBattleScene(in_fight_type, combat_type) { // 不同类的战斗或者不同类的战斗状态类型,都清掉单位 if (this.combat_type != combat_type || this.cur_fight_type != in_fight_type || in_fight_type == 1) { // 假战斗也移除掉单位重新创建吧 this.clearRealRole(); this.hook_model.clearRealRole(); } this.combat_type = combat_type; // 储存当前战斗类型 this.cur_fight_type = in_fight_type; // 保存当前之战斗状态类型 this.is_real_combat = in_fight_type == BattleConst.Battle_In_Type.Real; if (this.battle_scene == null) { this.battle_scene = Utils.createClass("battle_scene"); } this.battle_scene.updateBattleScene(this.is_real_combat); // 只有剧情战斗的时候才需要显示战斗ui var is_show = combat_type == BattleConst.Fight_Type.Darma; this.openDramaFightUI(is_show); // 只有真战斗才需要显示 this.openFormViewUI(this.is_real_combat, combat_type); this.battle_controller.setIsNormaBattle(this.is_real_combat); // 这里把主城设置不可见 require("mainscene_controller").getInstance().handleSceneStatus(false); this.is_clear = false; }, // 剧情战斗的ui部分 openDramaFightUI: function openDramaFightUI(status) { if (this.show_fight_ui_status == status && this.fight_ui_combat == this.is_real_combat) { return; } this.show_fight_ui_status = status; this.fight_ui_combat = this.is_real_combat; if (!status) { if (this.drama_fight_ui) { this.drama_fight_ui.hide(); this.button_list_panel_time = gcore.SmartSocket.getTime(); } } else { if (this.drama_fight_ui == null) { this.drama_fight_ui = Utils.createClass("battle_button_list_panel"); var partner = ViewManager.getInstance().getSceneNode(SCENE_TAG.ui); this.drama_fight_ui.setParent(partner); this.drama_fight_ui.show(this.is_real_combat); this.drama_fight_ui.setZIndex(-2); } else { if (this.drama_fight_ui.is_onshow == false) { this.drama_fight_ui.show(this.is_real_combat); } else { this.drama_fight_ui.changeBattleStatus(this.is_real_combat); } } this.button_list_panel_time = 0; } this.battle_controller.setIsNormaBattle(this.is_real_combat); this.startCountDownToDelete(); }, // 真战斗中的阵型以及其他相关显示部分 openFormViewUI: function openFormViewUI(status, combat_type) { if (!status) { if (this.form_fight_ui) { this.form_fight_ui.hide(); this.form_panel_time = gcore.SmartSocket.getTime(); } } else { if (this.form_fight_ui) { this.form_fight_ui.show(combat_type); } else { this.form_fight_ui = Utils.createClass("battle_form_panel"); var partner = ViewManager.getInstance().getSceneNode(SCENE_TAG.ui); this.form_fight_ui.setAnchorPoint(0, 0); this.form_fight_ui.setPosition(-partner.width * 0.5, -partner.height * 0.5); this.form_fight_ui.setParent(partner); this.form_fight_ui.show(combat_type); this.form_fight_ui.setZIndex(-1); } this.form_panel_time = 0; } this.startCountDownToDelete(); }, // 关闭面板的倒计时 startCountDownToDelete: function startCountDownToDelete() { if (this.form_panel_time == 0 && this.button_list_panel_time == 0) { if (this.close_panel_timer) { gcore.Timer.del(this.close_panel_timer); this.close_panel_timer = null; } } else { if (this.close_panel_timer == null) { this.close_panel_timer = gcore.Timer.set(function () { this.waitDeletePanel(); }.bind(this), 1000, -1); } } }, // 倒计时准备清楚面板 waitDeletePanel: function waitDeletePanel() { if (this.form_panel_time == 0 && this.button_list_panel_time == 0) { this.startCountDownToDelete(); // 移除掉定时器 } else { if (this.button_list_panel_time != 0) { var button_pass_time = gcore.SmartSocket.getTime() - this.button_list_panel_time; if (button_pass_time > 100) { if (this.drama_fight_ui) { this.drama_fight_ui.deleteMe(); this.drama_fight_ui = null; } this.button_list_panel_time = 0; } } if (this.form_panel_time != 0) { var form_pass_time = gcore.SmartSocket.getTime() - this.form_panel_time; if (form_pass_time > 100) { if (this.form_fight_ui) { this.form_fight_ui.deleteMe(); this.form_fight_ui = null; } this.form_panel_time = 0; } } } }, // 引导需要 getDramaFightUI: function getDramaFightUI() { if (this.drama_fight_ui) return this.drama_fight_ui.root_wnd; return null; }, /** * 彻底移除一个战斗场景,比如说切换出战斗,或者非剧情战斗结束,这个结束 */ clearBattleScene: function clearBattleScene() { if (this.battle_scene && !this.is_clear) { // 先移除掉单位定时器 var role_list = this.getAllBattleRoleList(); for (var pos in role_list) { gcore.Timer.del("attackerActTimeout" + pos); } this.combat_type = BattleConst.Fight_Type.Nil; this.cur_fight_type = BattleConst.Battle_In_Type.Nil; // 移除掉战斗类型 this.is_real_combat = false; // 战斗 // 清楚掉场景单位 this.clearRealRole(); this.hook_model.clearRealRole(); // 假战斗模型资源 this.battle_scene.deleteMe(); this.battle_scene = null; this.openDramaFightUI(false); this.openFormViewUI(false); // 移除掉所有的战斗特效--,群攻类和子弹类 this.cleanAllBattleEffect(); // 移除真实战斗场景的数据 this.deleteCurBattleData(); // 这里切回主城音乐 Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true); this.is_clear = true; } }, // 清空所有的场景战斗特效 cleanAllBattleEffect: function cleanAllBattleEffect() { // 回收掉场景特效资源 for (var key in this.battle_effect_list) { var array = this.battle_effect_list[key]; for (var index = 0; index < array.length; index++) { var element = array[index]; element.deleEffect(); } } this.battle_effect_list = {}; // 回收掉场景特效资源 for (var key in this.battle_effect_pool) { var array = this.battle_effect_pool[key]; for (var _index = 0; _index < array.length; _index++) { var _element = array[_index]; _element.deleEffect(); } } this.battle_effect_pool = {}; }, /** * 假战斗定帧移动地图处理,现在卸载gamestart 的update里面 */ mapMovescheduleUpdate: function mapMovescheduleUpdate() { if (this.battle_scene) { this.battle_scene.mapMovescheduleUpdate(); } }, /** * 切换战斗移动状态,比如真实剧情战斗切换到假战斗的时候,就需要开启地图移动 * @param {*} status Bool */ changeMoveMapStatus: function changeMoveMapStatus(status) { if (this.battle_scene) { this.battle_scene.changeMoveMapStatus(status); } }, /** * 进入真实战斗时,是否需要播放进场动作,中途切进去的不需要处理,这个值针对初始化单位的时候需要,战斗创建一个单位不需要 */ needPlayEnterAction: function needPlayEnterAction() { return this.init_fight_status; }, /** * 真实战斗中的单位是否是友方判断 * @param {*} group BattleRoleData.group */ isFriend: function isFriend(group) { return group == this.my_group; }, /** * 当前真实战斗的初始化数据 */ getCurBattleData: function getCurBattleData() { return this.battle_data; }, // 获取当前战斗类型 getCombatType: function getCombatType() { return this.combat_type; }, /** * 退出战斗,清空战斗数据,针对真实战斗 */ deleteCurBattleData: function deleteCurBattleData() { this.resetInitData(); }, // 判断是否可以改变战斗速度 checkIsCanChangeBattleSpeed: function checkIsCanChangeBattleSpeed() { if (this.battle_data == null) { return false; } var next_speed = 1; if (this.battle_speed == 1) { next_speed = 2; } var speed_config = Config.combat_type_data.data_combat_speed[next_speed]; if (speed_config == null) { return false; } var role_vo = require("role_controller").getInstance().getRoleVo(); if (role_vo == null) { return false; } if (speed_config.limit_lev > role_vo.lev && speed_config.limit_vip_lev > role_vo.vip_lev) { var desc = cc.js.formatStr(Utils.TI18N("等级达到%s级或VIP%s开启"), speed_config.limit_lev, speed_config.limit_vip_lev); message(desc); return false; } var fight_config = Config.combat_type_data.data_fight_list[this.battle_data.combat_type]; if (fight_config == null) { return false; } if (fight_config.is_pvp == 1) { message(cc.js.formatStr(Utils.TI18N("%s不能更改速度"), fight_config.desc)); return false; } return true; }, /** * 修改一下当前战斗速度 */ changeSpeed: function changeSpeed() { if (this.battle_speed == 1) { this.saveSpeed(2); this.battle_controller.csFightSpeed(2); } else { this.saveSpeed(1); this.battle_controller.csFightSpeed(1); } }, /** * 当前战斗速度 */ getTimeScale: function getTimeScale() { var time_scale = 1; if (this.isInRealBattle() == true) { time_scale = this.role_time_scale; } // time_scale = 1.5 // 要根据当前帧频调整播放速度 return time_scale; }, // 设置当前动作速度 setBattleTimeScale: function setBattleTimeScale(is_reset) { if (this.battle_time_status == is_reset) return; this.battle_time_status = is_reset; var base_config = null; if (is_reset == true) { // 这个时候是1倍速 base_config = Config.battle_act_data.data_get_act_data.base_speed_scale; } else { base_config = Config.battle_act_data.data_get_act_data.speed_scale; } if (base_config) { this.role_time_scale = base_config.val * 0.01; } this.setRoleTimeScale(); }, // 保存速率之后马上设置模型动作 setRoleTimeScale: function setRoleTimeScale() { if (this.real_role_list) { for (var key in this.real_role_list) { var object = this.real_role_list[key]; if (object) { object.setTimeScale(this.role_time_scale); } } } // 设置场景特效 if (this.battle_effect_list) { for (var key in this.battle_effect_list) { var array = this.battle_effect_list[key]; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element) { element.setTimeScale(this.role_time_scale); } } } } }, // 保存当前战斗速度,这个速度只是为了改变显示 saveSpeed: function saveSpeed(speed) { if (this.battle_speed == speed) return; this.battle_speed = speed; if (this.form_fight_ui) { this.form_fight_ui.setSpeed(speed); } }, // 获取当前速度 getSpeed: function getSpeed() { return this.battle_speed; }, /** * 一个回合播报的动作计数,最后保证值为0就表示播完了当前动作 * @param {*} attacker */ actStart: function actStart(attacker) { // 如果结算面板已经出来了,就不需要播报了 if (this.checkoutIsRightFight(attacker) == true) { attacker.wait_act += 1; gcore.Timer.del("attackerActTimeout" + attacker.pos); gcore.Timer.set(function () { this.actTimeout(attacker); }.bind(this), 3000, 1, "attackerActTimeout" + attacker.pos); } }, /** * 某一个动作播放完成之后,计数 -1,当为0的时候,就表示当前小回合播报结束 * @param {*} attacker */ actFinish: function actFinish(attacker) { if (this.checkoutIsRightFight(attacker) == true) { if (attacker.wait_act > 0) { attacker.wait_act -= 1; if (attacker.wait_act <= 0) { if (attacker.is_real) { this.playOrder(attacker); gcore.Timer.del("attackerActTimeout" + attacker.pos); } else { this.hook_model.playOrder(attacker); } } } } }, /** * 判断是都是正式战斗 * */ checkoutIsRightFight: function checkoutIsRightFight(attacker) { if (attacker.is_real == true) { if (this.battle_data && this.cur_round_data && this.battle_data.combat_type == this.cur_round_data.combat_type) { return true; } } else { var battle_data = this.hook_model.getUnrealBattleData(); if (battle_data && battle_data.combat_type == BattleConst.Fight_Type.Darma) { return true; } } return false; }, /** * 小回合播报超时处理 * @param {*} attacker */ actTimeout: function actTimeout(attacker) { if (attacker == null) return; attacker.wait_act = 1; this.actFinish(attacker); }, /** * 回合开始的播报,包括站位的初始化等,因为有一些是需要在回合开始的时候播放的播报 包含回合开始的buff * @param {*} data 协议 20002 的数据 */ playRoundStart: function playRoundStart(data) { if (this.getBattleScene() == null || this.battle_data == null || this.battle_data.combat_type != data.combat_type) { return; } this.is_play_round_start = true; // 处理回合buff this.dealRoundBuff(data.round_buff); // 处理神器的回合进度 if (data && data.hallows_list) { for (var index = 0; index < data.hallows_list.length; index++) { var element = data.hallows_list[index]; if (element) { var hallows = this.hallows_list[element.group]; if (hallows && hallows.pos) { var role = this.real_role_list[hallows.pos]; if (role) { role.setHallowsRound(element.val); } } } } } // 回合开始也处理掉那些假死的模型 if (data && data.all_alive) { var temp_list = {}; for (var _index2 = 0; _index2 < data.all_alive.length; _index2++) { var _element2 = data.all_alive[_index2]; if (_element2) { temp_list[_element2.pos] = true; } } for (var key in this.real_role_list) { if (!temp_list[key]) { var role = this.real_role_list[key]; if (role && !role.is_die && role.role_data && role.role_data.object_type != BattleConst.Unit_Type.Hallows) { role.doDied(); } } } } // 没有技能播报列表,直接通知服务端结束 if (data == null || data.skill_plays.length == 0) { this.battle_controller.csRoundFightEnd(); // 初始化位置层级等相关信息 this.handlePlayRoundStart(data); } else { this.addRoundData(data); } if (this.form_fight_ui) { this.form_fight_ui.updateRound(data.action_count); } }, /** * 正常回合播报,回合开始播报结束之后,进入正常回合播报 包含回合结束buff和效果播报的buff * @param {*} data 协议 20004 的数据 */ playRoundIn: function playRoundIn(data) { this.is_play_round_start = false; // 回合结束后的buff可能需要处理的 if (data.round_buff && data.round_buff.length > 0) { this.act_after_buff_list = data.round_buff; } else { this.act_after_buff_list = null; } this.addRoundData(data); }, // 更新buff setBuffsList: function setBuffsList(data) { this.buffs = data; }, /** * 更新下一波怪物的数据 * @param {*} data */ upDateNextMon: function upDateNextMon(data) { if (this.real_role_list == null || data == null) return; // 清掉上一回合的死亡对象 for (var key in this.real_role_list) { var role = this.real_role_list[key]; if (role && role.is_die == true) { role.deleteRole(); this.real_role_list[key] = null; } } this.setBuffsList(data.buffs); if (this.getBattleScene()) { for (var index = 0; index < data.objects.length; index++) { var element = data.objects[index]; var role = this.real_role_list[element.pos]; if (this.isFriend(element.group) && role) { role.updataNextBattleRole(element); } else { this.createRole(element, true, null, true); } } } // 更新战斗基本数据 if (this.battle_data) { this.battle_data.updateData(data); if (this.form_fight_ui) { this.form_fight_ui.updateBaseInfo(); } } }, /**addReConnectReadySum * * 处理回合开始的数据 * @param {*} data 协议 20002 的数据 */ handlePlayRoundStart: function handlePlayRoundStart(data) { if (this.battle_data == null || this.battle_data.combat_type != data.combat_type) { return; } if (this.battle_scene == null) { return; } this.resetBattleRoleBaseInfo(); }, // 处理回合buff dealRoundBuff: function dealRoundBuff(buff_list, attacker) { if (buff_list == null || buff_list.length == 0) return; for (var index = 0; index < buff_list.length; index++) { var element = buff_list[index]; var battle_role = this.real_role_list[element.target]; var buff_config = Config.skill_data.data_get_buff[element.buff_bid]; if (battle_role && buff_config) { this.playRoundBuff(battle_role, element, attacker); } } }, /** * 回合中的播报,这个是播报的主入口 * @param {*} data 协议 20004 的数据 */ addRoundData: function addRoundData(data) { if (this.getBattleScene() == null || this.battle_data == null || this.battle_data.combat_type != data.combat_type) { return; } // 更新当前回合数 if (this.form_fight_ui && data.action_count) { this.form_fight_ui.updateRound(data.action_count); } // 播报数据 this.cur_round = null; this.next_round = null; this.cur_round_data = data; this.skill_plays_order_list = []; this.round_data_temp = {}; if (this.form_fight_ui) { this.form_fight_ui.updateRound(data.action_count); } // 技能播报数据, 解析技能数据 for (var j = 0; j < data.skill_plays.length; j++) { var skill_element = data.skill_plays[j]; for (var i = 0; i < skill_element.effect_play.length; i++) { var effect_element = skill_element.effect_play[i]; if (this.round_data_temp[skill_element.order] == null) { this.round_data_temp[skill_element.order] = []; this.skill_plays_order_list.push({ skill_order: skill_element.order, priority: skill_element.order * 1000 + j }); } effect_element.skill_bid = effect_element.skill_bid_of_effect; effect_element.talk_pos = skill_element.talk_pos; effect_element.talk_content = skill_element.talk_content; effect_element.index = i; effect_element.skill_order = skill_element.order; effect_element.priority = effect_element.order * 10000 + j * 100 + i; this.round_data_temp[skill_element.order].push(effect_element); } } // 对出手进行排序 this.skill_plays_order_list.sort(function (a, b) { return a.priority - b.priority; }); // cc.log("HHHHHHHHHHHHHHHHHHHHH"); // cc.log(this.skill_plays_order_list); this.preloadBattleRes(data, function () { this.analyseTempRoundData(); }.bind(this)); }, // 分析当前播报数据 analyseTempRoundData: function analyseTempRoundData() { this.order_list = []; this.round_data = {}; if (Object.keys(this.round_data_temp).length > 0) { for (var index = 0; index < this.skill_plays_order_list.length; index++) { var element = this.skill_plays_order_list[index]; var temp = this.round_data_temp[element.skill_order]; for (var i = 0; i < temp.length; i++) { var one_temp = temp[i]; if (this.round_data[one_temp.order] == null) { this.round_data[one_temp.order] = {}; this.order_list.push({ order: one_temp.order, priority: one_temp.priority }); } if (this.round_data[one_temp.order][one_temp.actor] == null) { this.round_data[one_temp.order][one_temp.actor] = { order: one_temp.order, actor: one_temp.actor, skill_bid: one_temp.skill_bid, talk_content: one_temp.talk_content, talk_pos: one_temp.talk_pos, index: one_temp.index, target_list: [] }; } var object = this.round_data[one_temp.order][one_temp.actor]; object.target_list.push(one_temp); } } // 对出售惊醒排序 this.order_list.sort(function (a, b) { return a.priority - b.priority; }); this.round_data_temp = {}; } // cc.log("出售顺序HHHHH"); // cc.log(Utils.deepCopy(this.order_list)); // cc.log(Utils.deepCopy(this.round_data)); this.round(); }, // 回合播报 round: function round() { if (this.round_num && this.round_num > 0) return; this.round_num = 0; this.actor_sum = 0; this.actor_play_sum = 0; this.cur_round = null; this.next_round = null; // 回合播报之前重置掉所有单位受击状态 if (this.battle_scene) { var role_list = this.getAllBattleRoleList(); for (var key in role_list) { var role = role_list[key]; if (role) { role.dmg_index = 0; role.dmg_aid_y_offset = 0; role.is_hurt_play = false; role.is_big_play = false; } } } if (this.order_list.length == 0) { this.cancleBlackScreen(); // 回合后的buff处理 if (this.act_after_buff_list && this.act_after_buff_list.length > 0) { this.dealRoundBuff(this.act_after_buff_list); this.act_after_buff_list = null; } // 重置一些状态,可能是一些数值类的 if (this.real_role_list) { for (var key in this.real_role_list) { var battle_role = this.real_role_list[key]; if (battle_role) { battle_role.temp_skill_bid = 0; } } } // 通知服务端播报完成,区分回合开始和中间回合播报 if (this.is_play_round_start == true) { this.battle_controller.csRoundFightEnd(); } else { this.battle_controller.csSkillPlayEnd(); } // 这个时候设置所有的单位初始状态 } else { var first_data = this.order_list.shift(); var round_data = this.round_data[first_data.order]; if (this.order_list.length > 0) { var second_order = this.order_list[0].order; var second_data = this.round_data[second_order]; // 找到下一个回合播报,于当前回合播报做比较判断是不是多段攻击,从而在当前播报结束之后,是否需要重置 for (var actor in second_data) { if (this.next_round == null) { this.next_round = second_data[actor]; break; } } } this.round_num = Object.keys(round_data).length; for (var actor in round_data) { this.round_num -= 1; var round_one_temp = round_data[actor]; if (this.cur_round == null) { this.cur_round = round_one_temp; } if (round_one_temp.target_list.length > 0) { var attacker = this.getBattleRoleByPos(round_one_temp.actor); if (attacker) { this.actor_sum = this.actor_sum + 1; this.initOrder(attacker, round_one_temp); } else { this.round(); } } else { this.round(); } } } }, // 播放回合buff,可能是回合开始,效果播报结束,也可能是回合结束, 这个buff是协议数据来的 playRoundBuff: function playRoundBuff(target, buff, attacker, effect_hit) { if (target == null || buff == null) return; this.addBuff(attacker, target, buff); if (buff.change_type == 1) { // 血量变化的时候 this.battleRoleHPChange(target, buff.change_value, buff.is_dead, effect_hit, true); } }, // buff类的气血上号 battleRoleHPChange: function battleRoleHPChange(target, value, is_dead, effect_hit, is_buff, camp_restrain) { if (target == null) return; target.updateHP(value, is_dead, true, 0); this.mutiHurtNum(target, value, effect_hit, is_buff, camp_restrain); }, // 初始化动作列表,准备开战了,初始化一些数据 initOrder: function initOrder(attacker, one) { one.target_list.sort(function (a, b) { return a.priority - b.priority; }); // 这个后续再看看要不要动态设置层级 if (this.cur_round && this.last_round_actor && this.cur_round.actor == this.last_round_actor) {} else { attacker.resetZOrder(); attacker.targe_zorder = 9999; } var list = one.target_list; var col_target = list[0].target; if (col_target > GIRD_POS_OFFSET) { col_target = col_target - GIRD_POS_OFFSET; } var col = Pos_To_Col[col_target - 1]; var target = this.getBattleRoleByPos(col_target); if (target) { target.resetZOrder(); attacker.targe_zorder = target.getLocalZOrder(); } attacker.col = col; attacker.is_round = false; attacker.attacker_info = one; attacker.skill_data = gdata('skill_data', 'data_get_skill', one.skill_bid); attacker.target_pos = attacker.grid_pos; attacker.play_order_index = one.target_list[0].effect_bid; this.calcTargetPos(attacker); // 如果没有效果id则不处理,所有播报驱动都是效果驱动 if (attacker.play_order_index == null || attacker.play_order_index == 0) { this.actor_play_sum += 1; var effect_play = one.target_list[0]; if (effect_play) { if (effect_play.sub_effect_play_list && effect_play.sub_effect_play_list.length > 0) { this.handleSubEffectPlaylist(effect_play, attacker); } this.dealRoundBuff(effect_play.buff_list, attacker); } this.round(); return; } var effect_config = gdata('skill_data', 'data_get_effect', attacker.play_order_index); if (effect_config) { attacker.play_order = Utils.deepCopy(effect_config.action_list); // 动作列表 attacker.shake_id = effect_config.shake_id; // 震屏ID attacker.effect_type = effect_config.effect_type; // 效果类型 attacker.play_stand = effect_config.play_stand; // 是否收招 attacker.anime_res = effect_config.anime_res; // 攻击动作资源 attacker.split_hurt = effect_config.split_hurt; attacker.hit_action = effect_config.hit_action; // 受击处理 attacker.effect_desc = effect_config.effect_desc; // 效果飘字 attacker.is_must_die = effect_config.is_must_die; // 死亡的时候是否移除,这个主要是判断连击中的时候 attacker.anime_user_atk = effect_config.anime_user_atk; // 攻击动作名 attacker.attack_sound = effect_config.attack_sound; // 攻击音效 attacker.ready_sound = effect_config.ready_sound; // 准备音效 attacker.shout_trick = effect_config.shout_trick; // 喊招音效 attacker.hit_sound = effect_config.hit_sound; // 受击音效 attacker.hit_effect_list = Utils.deepCopy(this.getCurEffectList(effect_config.hit_effect_list)); // 记录打击特效列表 attacker.area_effect_list = Utils.deepCopy(this.getCurEffectList(effect_config.area_effect_list)); // 记录范围人物特效 attacker.act_effect_list = Utils.deepCopy(this.getCurEffectList(effect_config.act_effect_list)); // 记录出手点特效 attacker.bact_effect_list = Utils.deepCopy(this.getCurEffectList(effect_config.bact_effect_list)); // 记录施法特效 attacker.trc_effect_list = Utils.deepCopy(this.getCurEffectList(effect_config.trc_effect_list)); // 记录弹道特效 } // 是否有群攻 if (attacker.area_effect_list.length > 0) { attacker.attacker_info.is_calc = false; attacker.in_area_effect = true; attacker.area_hit_num = 1; attacker.area_hit_time = 0; } else { attacker.in_area_effect = false; } var start_attack = function () { this.playOrder(attacker); }.bind(this); // 主动技能和被动技能喊招处理 var show_skill_nme = function () { var skill_type = attacker.skill_data.type; if (skill_type == BattleConst.Skill_Type.PASSIVE_SKILL && attacker.skill_data.passive_skill_show == 1) { this.playFontMessage(attacker, attacker.skill_data.name, null, null, null, null, null, function () { start_attack(); }.bind(this)); } else if (skill_type == BattleConst.Skill_Type.ACTIVE_SKILL) { if (this.form_fight_ui) { this.form_fight_ui.showActiveSkillName(attacker, function () { start_attack(); }); } } else { start_attack(); } }.bind(this); if (attacker.skill_data == null) { this.talk(attacker, start_attack); } else { this.talk(attacker, show_skill_nme); } this.act_playing = true; }, /** * 计算目标点 * @param {*} attacker * @param {*} object_list */ calcTargetPos: function calcTargetPos(attacker, object_list) { if (attacker == null || attacker.attacker_info == null) { return; } var target_list = attacker.attacker_info.target_list; var target = null; for (var index = 0; index < target_list.length; index++) { var element = target_list[index]; if (object_list) { target = object_list[element.target]; } else { target = this.getBattleRoleByPos(element.target); } if (target && target.obj_type != attacker.obj_type) { break; } } if (target) { attacker.target_pos = target.grid_pos; attacker.target_pos_base = target.grid_pos; attacker.target_name = target.role_data.object_name; } }, // 效果列表 getCurEffectList: function getCurEffectList(list) { var effect_list = []; for (var index = 0; index < list.length; index++) { var element = list[index]; var effect_data = Config.skill_data.data_get_effect_data[element]; effect_list.push(effect_data); } return effect_list; }, // 单位喊话 talk: function talk(attacker, callback) { var msg = attacker.attacker_info.talk_content || ""; var actor = attacker.attacker_info.talk_pos; if (msg == "") { if (callback) { callback(); } return; } // 然后播放气泡..... if (callback) { callback(); } }, // 获取播报动作 singleAct: function singleAct(act_data, attacker) { if (act_data instanceof Array) { return this.mutiAct(act_data, attacker); } else { var act_config = Utils.deepCopy(Config.skill_data.data_get_act_data[act_data]); if (act_config) { var args = act_config.act_args; var funname = args[0]; if (funname == null || this[funname] == null) { return; } if (this[funname] instanceof Function) { var params = args[1] || []; params.unshift(attacker); return this[funname].apply(this, params); } else { Log.info("动作错误,动作BID:" + act_data); } } } }, // 获取多段播报动作 mutiAct: function mutiAct(args, attacker) { var acts = []; for (var index = 0; index < args.length; index++) { var element = args[index]; var act = this.singleAct(element, attacker); acts.push(act); } if (acts.length == 1) { return acts[0]; } else { return cc.spawn.apply(null, acts); } }, /** * 技能动作附带糊掉函数 * @param {*} attacker * @param {*} args */ callfun: function callfun(attacker, args) { var funname = ""; var params = null; if (args instanceof Array) { funname = args[0]; params = args[1] || []; } else { funname = args; } if (funname == "") { return; } if (this[funname] instanceof Function) { if (params == null) { params = []; } params.unshift(attacker); this[funname].apply(this, params); } else if (typeof funname == "number") { var act = this.singleAct(funname, attacker); attacker.runAction(act); } }, /** * 普通近战攻击 * @param {*} attack * @param {*} delay_time * @param {*} hit_fun * @param {*} start_fun 攻击开始动作 * @param {*} is_reverse 是否是移动到背面 */ attack: function attack(attacker, delay_time, hit_fun, start_fun, is_reverse) { if (attacker && attacker.anime_user_atk) { delay_time = delay_time || 0; is_reverse = is_reverse == 1; var start_callback = function () { this.callfun(attacker, start_fun); }.bind(this); var hit_callback = function () { this.callfun(attacker, hit_fun); }.bind(this); return this.skill_act.attack(attacker, delay_time, attacker.anime_user_atk, hit_callback, start_callback, is_reverse, null, attacker.anime_res); } }, /** * 远程攻击子弹 * @param {*} attacker * @param {*} delay_time * @param {*} move_time * @param {*} is_back * @param {*} funname * @param {*} start_height */ flyItem: function flyItem(attacker, delay_time, move_time, is_back, funname, start_height) { if (this.checkIsInBattle(attacker) == false) { return; } var effect_list = attacker.trc_effect_list; // 这个效果可能有多个,这个时候主要取第一个吧 if (effect_list == null || effect_list.length == 0) { Log.info("播放远程攻击效果失败,不存在远程的效果,效果id为: " + attacker.play_order_index); this.actStart(attacker); return; } var effect_object = effect_list[0]; // 主要第一个 var is_friend = attacker.is_friend; // 是否是友方 var res_up = effect_object.res_up; // if (is_friend == true && effect_object.spec_res_up != "") { res_up = effect_object.spec_res_up; } var scale = effect_object.scale * 0.001; var x_fix = effect_object.x_fix * attacker.obj_type; var y_fix = effect_object.y_fix == 0 ? 50 : effect_object.y_fix; var anima_name = attacker.anime_user_atk || PlayerAction.action_2; var attack_func = function () { var target_list = attacker.attacker_info.target_list; if (target_list.length <= 1) { // 只有一个攻击对象的时候 var target_pos = this.center_pos(attacker, y_fix); return this.item(attacker, delay_time, res_up, move_time, funname, start_height, target_pos, scale, effect_object.bid, x_fix, y_fix); } else { this.playSelfEffect(); var act_list = []; // 动作列表 var array = attacker.attacker_info.target_list; for (var index = 0; index < array.length; index++) { var element = array[index]; var target = this.getBattleRoleByPos(element.target); if (target) { // 目标 var target_pos = { x: target.scene_pos.x, y: target.scene_pos.y + y_fix }; if (target.group != attacker.group) { var func = this.getItem(attacker, delay_time, res_up, move_time, "hurtOne", start_height, target_pos, scale, effect_object.bid, x_fix, y_fix); act_list.push(func); } } } // 关键数据 var finish_func = cc.callFunc(function () { if (attacker.attacker_info.last_effect) { for (var _index3 = 0; _index3 < attacker.attacker_info.last_effect.length; _index3++) { var _element3 = attacker.attacker_info.last_effect[_index3]; if (attacker.is_real) { this.playMagic(attacker, _element3); } else { this.hook_model.playMagic(attacker, _element3); } } } }.bind(this)); if (act_list.length > 0) { var act_start = this.skill_act.normalStart(attacker); var act_finish = this.skill_act.normalFinish(attacker); var act = cc.sequence(act_start, cc.spawn.apply(null, act_list), act_finish); attacker.runAction(act); } } }.bind(this); return this.skill_act.attack(attacker, delay_time, anima_name, null, null, false, attack_func, attacker.anime_res); }, // 渐隐掉的播报 fadeOut: function fadeOut(attacker, delay_time, time) { time = time || 10; return this.skill_act.fadeOut(attacker, delay_time, time); }, // 渐现出来 fadeIn: function fadeIn(attacker, delay_time, time) { time = time || 1; return this.skill_act.fadeIn(attacker, delay_time, time); }, // 处理友方特效 playSelfEffect: function playSelfEffect(attacker) { if (attacker == null || attacker.attacker_info == null || attacker.attacker_info.target_list == null) return; var last_effect = []; var target = null; for (var index = 0; index < attacker.attacker_info.target_list.length; index++) { var element = attacker.attacker_info.target_list[index]; target = this.getBattleRoleByPos(element.target); if (target && attacker.group == target.group) { last_effect.push(element); } } attacker.attacker_info.effect_play = last_effect; attacker.attacker_info.last_effect = last_effect; }, // 回合播报结束设置施法者战力动作 resetAttackerStandStatus: function resetAttackerStandStatus(attacker) { if (this.battle_scene == null || attacker == null) { return; } var next_round_actor = 0; if (this.next_round) { next_round_actor = this.next_round.actor; } if (this.cur_round) { this.last_round_actor = this.cur_round.actor; } if (next_round_actor == 0 || this.cur_round && this.cur_round.actor != next_round_actor) { this.skill_act.setAnimation(attacker, PlayerAction.battle_stand, true); this.cancleBlackScreen(); attacker.resetZOrder(); } }, /** * 实例化远程子弹动作 * @param {*} attacker * @param {*} delay_time * @param {*} effect_name * @param {*} move_time * @param {*} funname * @param {*} start_height * @param {*} target_pos * @param {*} scale * @param {*} bid * @param {*} x_fix * @param {*} y_fix */ item: function item(attacker, delay_time, effect_name, move_time, funname, start_height, target_pos, scale, bid, x_fix, y_fix) { if (attacker == null || this.battle_scene == null) { return; } start_height = (start_height || 0) * attacker.model_height * 0.01; move_time = move_time || 10; var hit_callback = function () { this.callfun(attacker, funname); // 这里暂时注释掉不知道有没有问题 // if(attacker.attacker_info.target_list.length > 0){ // attacker.attacker_info.target_list.unshift(); // } }.bind(this); if (!attacker.is_real) { hit_callback(); } else { attacker.runAction(this.skill_act.flyItem(attacker, delay_time, effect_name, move_time, hit_callback, start_height, target_pos, scale, bid, x_fix, y_fix)); } }, /** * 获取移动动作 * @param {*} attacker * @param {*} delay_time * @param {*} effect_name * @param {*} move_time * @param {*} funname * @param {*} start_height * @param {*} target_pos * @param {*} scale * @param {*} bid * @param {*} x_fix * @param {*} y_fix */ getItem: function getItem(attacker, delay_time, effect_name, move_time, funname, start_height, target_pos, scale, bid, x_fix, y_fix) { start_height = start_height || 60; move_time = move_time || 10; var hit_callback = function () { this.callfun(attacker, funname); // 这里暂时注释掉不知道有没有问题 // if(attacker.attacker_info.target_list.length > 0){ // attacker.attacker_info.target_list.unshift(); // } }.bind(this); var act = this.skill_act.flyItem(attacker, delay_time, effect_name, move_time, hit_callback, start_height, target_pos, scale, bid, x_fix, y_fix); return act; }, // 播报,动作施法者 playOrder: function playOrder(attacker) { if (attacker == null) return; if (attacker.wait_act && attacker.wait_act != 0) return; // 没有技能效果的时候,直接移除掉 if (attacker.play_order_index == null || attacker.play_order_index == 0) return; // 每个动作的计数器,当一个动作开始之后开始计数,为0标识这个动作做完了 attacker.wait_act = 0; if (attacker.play_order == null || attacker.play_order.length == 0) { this.actor_play_sum += 1; if (!attacker.is_die) { this.resetAttackerStandStatus(attacker); } if (!attacker.is_round) { this.act_playing = false; if (this.actor_play_sum >= this.actor_sum) { this.round(); } } } else { var index = attacker.play_order.shift(); var act = this.singleAct(index, attacker); if (act) { attacker.runAction(act); } } }, // 处理群攻效果,比如说音效不要播太多 batchPlayHurt: function batchPlayHurt(attacker) { if (attacker == null || attacker.attacker_info == null || attacker.attacker_info.target_list == null) { return; } var target_list = attacker.attacker_info.target_list; if (target_list.length == 0) { return; } var had_play = false; // 多个受击音效只需要播放一次 for (var index = 0; index < target_list.length; index++) { var element = target_list[index]; if (attacker.is_real) { var play_effect = false; if (element.hp_changed && element.hp_changed < 0 && had_play == false) { had_play = true; play_effect = true; } this.playMagic(attacker, element, play_effect); } else { this.hook_model.playMagic(attacker, element, play_effect); } } }, /** * 播放普通战斗飘字 * @param {*} target 战斗目标单位 * @param {*} desc 当前文本 * @param {*} parent 父节点,如果没有,则默认是战斗场景特效层1 * @param {*} x x方向的偏移值 * @param {*} y y方向的偏移值 * @param {*} color 文字颜色 * @param {*} outline 文字描边色 */ playFontMessage: function playFontMessage(target, desc, parent, x, y, color, outline, callback) { if (this.checkIsInBattle(target) == false) { return; } if (parent == null) { parent = this.battle_scene.getBattleEffectLayer(1); // 默认放在特效1层上面 } x = x || 0; y = y || 0; var target_x = target.scene_pos.x + x; var target_y = target.scene_pos.y + y + target.model_height / 2; if (color == null) { color = 217; } if (outline == null) { outline = 218; } // 设置字体默认颜色 var normal_node = this.getNormalFont(); normal_node.setPosition(target_x, target_y); var font_node = normal_node.getChildByName("font_label"); var hex = Config.color_data.data_color16[color]; var _color = font_node.color; _color.fromHEX(hex); font_node.color = _color; // 设置描边颜色 var out_hex = Config.color_data.data_color16[outline]; var out_line = font_node.getComponent(cc.LabelOutline); var _color1 = out_line.color; _color1.fromHEX(out_hex); out_line.color = _color1; // 设置字体 var label = font_node.getComponent(cc.Label); label.string = desc; parent.addChild(normal_node); if (target.buff_show_index == null) { target.buff_show_index = 0; } target.buff_show_index = target.buff_show_index + 1; var show = cc.show(); var delay = cc.delayTime(0.3 * target.buff_show_index); var delay_over = cc.callFunc(function () { target.buff_show_index -= 1; }.bind(this)); var scale_to_1 = cc.scaleTo(0.4, 1.2); var move_by_1 = cc.moveBy(0.4, 0, 50); var fade_in = cc.fadeIn(0.4); var scale_to_2 = cc.scaleTo(0.6, 0.9); var fade_out = cc.fadeOut(0.6); var move_by_2 = cc.moveBy(0.6, 0, 25); var hide = cc.hide(); normal_node.runAction(cc.sequence(show, delay, delay_over, cc.spawn(scale_to_1, move_by_1, fade_in), cc.spawn(scale_to_2, fade_out, move_by_2), hide, cc.callFunc(function () { if (callback) { callback(); } this.pushBackBattleFont(normal_node); }.bind(this)))); }, /** * 播放魔法特效 * @param {*} attacker * @param {*} effect_play * @param {*} no_die * @param {*} play_effect */ playMagic: function playMagic(attacker, effect_play, play_effect) { if (this.battle_scene == null) { return; } if (effect_play.target == null) { return; } if (attacker == null) { return; } if (effect_play.play_num != null && effect_play.play_num <= 0) { return; } if (effect_play.play_num == null && attacker.split_hurt) { effect_play.play_num = attacker.split_hurt || 1; if (effect_play.play_num > 1) { effect_play.avg_hp_changed = Math.ceil(effect_play.hp_changed / effect_play.play_num); } } effect_play.play_num = effect_play.play_num || 1; effect_play.play_num -= 1; var effect_hit = 1; var target = this.getBattleRoleByPos(effect_play.target); if (target) { if (effect_play.is_hit == 0 || effect_play.is_blind == 1) { // 闪躲或者未命中 effect_hit = 0; var desc = Utils.TI18N("闪躲"); if (effect_play.is_blind == 1) { desc = Utils.TI18N("未命中"); } if (effect_play.is_dead == 0) { // 非死亡情况下才飘字 this.playFontMessage(target, desc, null, null, null, 227, 228); } } var hp_changed = effect_play.avg_hp_changed || effect_play.hp_changed || 0; var dmg = Math.floor(hp_changed); if (effect_play.is_crit == 1) { // 暴击 effect_hit = 2; } var is_dead = effect_play.is_dead; if (effect_play.play_num > 0) { // 多次伤害的话第一次不能死 is_dead = 0; } // 处理召唤列表 if (effect_play.summon_list.length > 0) { this.addRoleList(effect_play.summon_list, attacker); } // 处理子效果 if (effect_play.sub_effect_play_list.length > 0) { this.handleSubEffectPlaylist(effect_play, attacker); } // 副本中需要的特殊处理 this.handleExtendDungeon(effect_play); // 处理援护 if (effect_play.aid_actor != 0) { this.handleAidActor(effect_play, attacker, effect_hit, target); } // 播放受击处理 this.playBattleRoleHurt(attacker, target, dmg, play_effect); // 飘字处理 if (attacker.effect_desc != "" && effect_play.is_hit != 0 && effect_play.play_num <= 0) { this.showbuffName(target, attacker.effect_desc, 229, 230, attacker.play_order_index); } // 把扣血放到最后,因为有死亡动作 this.updateTargetHp(attacker, target, dmg, is_dead, effect_hit, effect_play); // 处理buff列表,非死亡的时候才处理,如果上面播报已经说死了,不需要处理buff了 if (effect_play.play_num <= 0 && effect_play.buff_list.length > 0) { this.handleBufflist(attacker, effect_play.buff_list, 1); } } }, // 播放受击处理 playBattleRoleHurt: function playBattleRoleHurt(attacker, target, dmg, play_effect) { if (attacker == null || target == null) return; if (target.is_hurt_play == true) return; target.is_hurt_play = true; if (!target.is_big_play) { target.is_big_play = true; this.playHurtEffect(attacker, target); } if (attacker.pos != target.pos && dmg < 0 && attacker.group != target.group) { // 播放受击动作 if (attacker.hit_action != "no-hurt") { this.skill_act.hurt(attacker, target, attacker.hit_action, play_effect); } } }, /** * 更新血条处理 * @param {*} attacker * @param {*} target * @param {*} dmg * @param {*} is_die * @param {*} effect_hit 1是是普通, 2是暴击 * @param {*} is_yuanhu * @param {*} is_normal * @param {*} effect_play */ updateTargetHp: function updateTargetHp(attacker, target, dmg, is_die, effect_hit, effect_play) { if (target == null) return; if (attacker == null) return; if (dmg == 0) return; effect_hit = effect_hit || 1; this.mutiHurtNum(target, dmg, effect_hit, false, effect_play.camp_restrain); // 储存具体数据 target.updateHP(dmg, is_die, false, attacker.is_must_die); }, /** * 播放伤害飘血 * @param {*} tatget * @param {*} dmg * @param {*} effect_hit 1是是普通, 2是暴击 * @param {*} is_normal * @param {*} is_buff * @param {*} camp_restrain */ mutiHurtNum: function mutiHurtNum(target, dmg, effect_hit, is_buff, camp_restrain) { if (this.checkIsInBattle(target) == false || dmg == 0 || target.is_real == false) { return; } // 这个数值用于处理飘血高度的...放置叠加到一起 if (target.dmg_index == null) { target.dmg_index = 0; } target.dmg_index += 1; this.skill_act.playDmgMessage(target, dmg, effect_hit, is_buff, camp_restrain); }, /** * 处理buff效果 * @param {*} attacker * @param {*} list * @param {*} effect_hit 是否是暴击 */ handleBufflist: function handleBufflist(attacker, list, effect_hit) { if (this.checkIsInBattle(attacker) == false) { return; } for (var index = 0; index < list.length; index++) { var buff = list[index]; var target = this.getBattleRoleByPos(buff.target); if (target) { this.playRoundBuff(target, buff, attacker, effect_hit); } } }, /** * 添加一个buf * @param {*} attacker buff的发起者.可能没有 * @param {*} target * @param {*} buff */ addBuff: function addBuff(attacker, target, buff) { if (target == null || buff == null) return; var buff_data = Config.skill_data.data_get_buff[buff.buff_bid]; if (buff_data == null) return; if (buff_data.is_passive == 1) { this.playBuffEffect(attacker, target, buff, buff_data); } if (buff.action_type == 4) return; if (buff.action_type == 2) { this.removeBuff(target, buff, buff_data); } else { if (buff_data.is_passive == 1 || buff_data.group == 3211) { // 不可复活组的buff额外处理 if (buff.action_type == 1 || buff.action_type == 3) { // 主处理新增或者是展示的buff if (buff_data.group != 3211) { if (buff_data.buff_spine && buff_data.buff_data != "") { // 存在变身的buff target.changeSpine(true, buff_data.buff_spine, PlayerAction.battle_stand); } if (buff_data.group == 3703) { // 隐身buff target.setOpacity(true, 155); } } if (buff.action_type == 1 && buff.remain_round != 0) { // 新增buff才处理,这里主要是开始增加血条下面的bufficon target.updateBuffList(buff, buff_data); } } } } }, // 移除一个buff,包含移除一个对象的特效和移除一个buff图标 removeBuff: function removeBuff(target, buff, buff_data) { if (this.getBattleScene() == null || target == null) return; if (buff == null || buff_data == null) return; var had_buff = target.hadBuff(buff.id); if (had_buff == true) { target.removeBuffList(buff.id); // 移除一个buff,并且包含移除buff图标 if (buff_data.group == 3703) { // 隐身buff target.setOpacity(false); } if (buff_data.buff_spine && buff_data.buff_spine != "") { // 移除变身效果 target.changeSpine(false); } // 如果是场景buff,则移除 var effect_config = Config.skill_data.data_get_effect_data[buff_data.res]; if (effect_config && effect_config.play_type == BattleConst.Effect_Play_Type.ROLE_SCENE) { this.removeSceneBuffEffect(target.group, effect_config.bid); } // 移除buff存在的特效绑在自身上的 if (effect_config) { this.removeBattleSpineEffect(target, effect_config); } } }, // 添加一个场景buff特效 addSceneBuffEffect: function addSceneBuffEffect(group, bid, effect_res, effect) { if (group == null || bid == null || effect_res == null || effect == null) return; var key = Utils.getNorKey(group, bid); if (this.scene_buff_effect_list[key] == null) { this.scene_buff_effect_list[key] = {}; } // 如果存在的话,先丢到对象池里面去 if (this.scene_buff_effect_list[key][effect_res]) { this.delBattleEffect(this.scene_buff_effect_list[key][effect_res]); } this.scene_buff_effect_list[key][effect_res] = effect; }, // 移除一个场景buff特效 removeSceneBuffEffect: function removeSceneBuffEffect(group, effect_bid) { if (group == null || effect_bid == null) { if (this.scene_buff_effect_list) { for (var key in this.scene_buff_effect_list) { for (var res in this.scene_buff_effect_list[key]) { var effect = this.scene_buff_effect_list[key][res]; this.delBattleEffect(this.scene_buff_effect_list[key][effect]); } } this.scene_buff_effect_list = {}; } } else { var key = Utils.getNorKey(group, effect_bid); var effect_list = this.scene_buff_effect_list[key]; if (effect_list) { for (var key in effect_list) { this.delBattleEffect(effect_list[key]); } } this.scene_buff_effect_list[key] = null; } }, // 移除一个绑在单位身上的buff特效,这里会根据特效配置去判断上下层特效资源 removeBattleSpineEffect: function removeBattleSpineEffect(target, effect_config) { if (target == null || effect_config == null) return; var action_name = PlayerAction.action; if (effect_config.up_action_name != "") { action_name = effect_config.up_action_name; } target.delBattleEffect(effect_config.res_up, action_name); // 移除上层特效 action_name = PlayerAction.action; if (effect_config.down_action_name != "") { action_name = effect_config.down_action_name; } target.delBattleEffect(effect_config.res_down, action_name); // 移除下层特效 }, // 播放buff效果,以及添加bufficon等 playBuffEffect: function playBuffEffect(attacker, target, buff, buff_data) { if (buff == null || buff_data == null) return; var text_color = null; var outline_color = null; if (buff_data.client_desc != "") { if (buff.action_type == 1 || buff.action_type == 4) { // 增益 if (buff_data.positive_or_negative == 1) { text_color = 221; outline_color = 222; } else if (buff_data.positive_or_negative == 2) { // 减益 text_color = 223; outline_color = 224; } else if (buff_data.positive_or_negative == 3) { // 控制 text_color = 225; outline_color = 226; } this.showbuffName(target, buff_data.client_desc, text_color, outline_color, buff.buff_bid); } } if (attacker == null) return; var hadbuff = target.hadBuff(buff.id); if (!hadbuff && buff.action_type == 1 && buff_data.res != 0) { // 不存在的buff才需要处理 var config = Config.skill_data.data_get_effect_data[buff_data.res]; if (config) { if (config.play_type == BattleConst.Effect_Play_Type.ROLE_SCENE) { var key = Utils.getNorKey(target.group, buff_data.res); if (this.scene_buff_effect_list[key] == null || Utils.next(this.scene_buff_effect_list[key]) == false) { this.effectArea(attacker, [config.res_up, config.res_down], 0, null, config.play_type, config.x_fix, config.y_fix, buff_data.res, config.is_col_effect, false); } } else { this.effectSpineUser(attacker, buff_data.is_release == 1, config.x_fix * target.obj_type, config.y_fix, [config.res_up, config.res_down], target, 1, null, buff_data.bid, buff_data.res); } } } // 一次效果 if (buff.action_type == 3 && buff_data.efftive_effect != 0) { var config = Config.skill_data.data_get_effect_data[buff_data.efftive_effect]; if (config) { this.effectSpineUser(attacker, true, config.x_fix * target.obj_type, config.y_fix, [config.res_up, config.res_down], target, 1, null, buff_data.bid, buff_data.res); } } }, // 播放buff描述文字,这里需要对这个对象做判断,如果bid的飘字存在,则不处理了... showbuffName: function showbuffName(target, desc, color, outline_color, bid) { if (target == null || bid == null) return; if (target.tips_list[bid]) return; target.addTips(bid); var callback = function () { target.removeTips(bid); }.bind(this); this.playFontMessage(target, desc, null, null, null, color, outline_color, callback); }, /** * 添加召唤列表 * @param {*} list * @param {*} attacker */ addRoleList: function addRoleList(list, attacker) { if (list == null || list.length == 0) return; }, /** * 处理子效果 * @param {*} effect_play * @param {*} attacker */ handleSubEffectPlaylist: function handleSubEffectPlaylist(effect_play, attacker) { if (effect_play == null || effect_play.sub_effect_play_list == null || effect_play.sub_effect_play_list.length == 0) return; for (var index = 0; index < effect_play.sub_effect_play_list.length; index++) { var element = effect_play.sub_effect_play_list[index]; var sub_target = this.real_role_list[element.sub_target]; if (sub_target) { // 播放气血变化的 this.battleRoleHPChange(sub_target, element.sub_hp_changed, false, 1, true); if (element.extra_effect && element.extra_effect.length > 0) { for (var n = 0; n < element.extra_effect.length; n++) { var extra = element.extra_effect[n]; if (extra.extra_key == 2) { // 护盾吸收 this.skill_act.playBuffAbsorbHurt(sub_target, extra.extra_param); } } } // 技能效果是否飘字 var effect_config = gdata('skill_data', 'data_get_effect', element.sub_effect_id); if (effect_config && effect_config.effect_desc != "" && element.sub_is_hit != 0) { this.showbuffName(sub_target, effect_config.effect_desc, 229, 230, element.sub_effect_id); } // 被动技能是否飘字 var skill_config = gdata('skill_data', 'data_get_skill', element.sub_skill_id); if (skill_config && skill_config.passive_skill_show == 1) { this.showbuffName(sub_target, skill_config.name, 217, 218, element.sub_skill_id); } // 闪躲处理 if (element.sub_is_hit == 0 && effect_play.is_dead == 0) { this.showbuffName(sub_target, Utils.TI18N("躲闪"), 227, 228, element.sub_effect_id); } } } }, /** * 副本数据特殊处理 * @param {*} effect_play */ handleExtendDungeon: function handleExtendDungeon(effect_play) { if (this.battle_data == null || this.battle_data.combat_type != BattleConst.Fight_Type.GuildDun) return; if (this.form_fight_ui) { this.form_fight_ui.addGuildBossUI(effect_play.total_hurt); } }, /** * 处理援护 * @param {*} effect_play * @param {*} attacker * @param {*} effect_hit 是否暴击 * @param {*} target */ handleAidActor: function handleAidActor(effect_play, attacker, effect_hit, target) { if (effect_play == null || effect_play.aid_actor == 0) return; var aid_target = this.real_role_list[effect_play.aid_actor]; if (aid_target) { var aid_dmg = effect_play.actor_hp_changed; // 援护者血量变化 var friend_pos = target.scene_pos; // var role_width = target.model_width * target.obj_type; var camp_restrain = effect_play.camp_restrain; // 是否是阵营压制 aid_target.setLocalZOrder(target.getLocalZOrder() + 1); // 层级放到上面来 aid_target.setScenePos(cc.v2(friend_pos.x + role_width, friend_pos.y)); // 设置援护坐标 this.actStart(attacker); this.skill_act.aid_hurt(attacker, aid_target, "hurt"); this.battleRoleHPChange(aid_target, aid_dmg, effect_play.actor_is_dead, effect_hit, false, camp_restrain); this.playHurtEffect(attacker, aid_target); } }, /** * 播放伤害特效 * @param {*} attacker * @param {*} target */ playHurtEffect: function playHurtEffect(attacker, target) { if (this.battle_scene == null || attacker == null || attacker.hit_effect_list == null || attacker.hit_effect_list.length == 0) { return; } var array = attacker.hit_effect_list; for (var index = 0; index < array.length; index++) { var element = array[index]; this.effectSpineUser(attacker, true, element.x_fix * attacker.obj_type, element.y_fix, [element.res_up, element.res_down], target, element.scale * 0.001, null, element.bid); } }, /** * 出手前动作 * @param {*} attacker */ attackReady: function attackReady(attacker) { if (attacker == null) { return; } if (attacker.bact_effect_list == null || attacker.bact_effect_list.length == 0) { return; } // 播放出手前音效 if (attacker.ready_sound && attacker.ready_sound != "" && attacker.is_real == true) { Utils.playEffectSound(AUDIO_TYPE.BATTLE, attacker.ready_sound); } var array = attacker.bact_effect_list; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element && element.play_type == BattleConst.Effect_Play_Type.ROLE) { if (element.res_up != "" || element.res_down != "") { this.effectSpineUser(attacker, true, element.x_fix * attacker.obj_type, element.y_fix, [element.res_up, element.res_down], attacker, element.scale * 0.001, null, element.bid); } } } }, /** * 创建单位跟随特效 * @param {*} attacker * @param {*} is_release * @param {*} x_fix * @param {*} height * @param {*} effect_list * @param {*} target 目标对象,也可能是自己,也可能是被攻击者 * @param {*} scale * @param {*} callback * @param {*} bid * @param {*} buff_bid 如果这个值不为0,即最终值 */ effectSpineUser: function effectSpineUser(attacker, is_release, x_fix, height, effect_list, target, scale, callback, bid, buff_bid) { if (buff_bid && buff_bid != 0) { bid = buff_bid; } var obj_type = BattleConst.Battle_Type_Conf.TYPE_ROLE; if (attacker) { obj_type = attacker.obj_type; } this.skill_act.effectSpineUser(attacker, is_release, x_fix, height, effect_list, target, scale, callback, bid, obj_type); }, // 群攻 areaHurt: function areaHurt(attacker) { var hurt_func = function () { if (this.battle_scene) { var role_list = this.getAllBattleRoleList(); for (var key in role_list) { var role = role_list[key]; if (role) { role.is_hurt_play = false; role.is_big_play = false; } } } this.batchPlayHurt(attacker); }.bind(this); this.playSceneAreaEffect(attacker, hurt_func); }, // 播放范围特效 playSceneAreaEffect: function playSceneAreaEffect(attacker, callback) { if (attacker == null || attacker.play_order_index == null || attacker.area_effect_list == null || attacker.area_effect_list.length == 0) { return; } var array = attacker.area_effect_list; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element && (element.res_down != "" || element.res_up != "")) { this.effectArea(attacker, [element.res_up, element.res_down], 0, callback, element.play_type, element.x_fix, element.y_fix, element.bid, element.is_col_effect); } } }, /** * 播放范围特效 * @param {*} attacker * @param {*} effect_list * @param {*} height * @param {*} is_reverse * @param {*} hit_callback * @param {*} play_type * @param {*} x_fix * @param {*} y_fix * @param {*} bid * @param {*} is_col_effect * @param {*} is_release 播完是否释放 */ effectArea: function effectArea(attacker, effect_list, height, hit_callback, play_type, x_fix, y_fix, bid, is_col_effect, is_release) { height = height || 0; var reverse = attacker.obj_type; var is_left = attacker.is_friend; var scene_pos = null; if (is_col_effect == 1) { var temp_list = null; if (is_left) { temp_list = [{ x: 34, y: 17 }, { x: 34, y: 23 }, { x: 34, y: 29 }]; } else { temp_list = [{ x: 44, y: 17 }, { x: 44, y: 23 }, { x: 44, y: 29 }]; } var pos = temp_list[attacker.col]; if (pos) { var temp_pos = this.skill_act.gridPosToScreenPos(pos); scene_pos = { x: temp_pos.x + x_fix, y: temp_pos.y + y_fix }; } } else { if (play_type == BattleConst.Effect_Play_Type.SCENE) { // 暂时看到是作废的 scene_pos = { x: SCREEN_WIDTH * 0.5, y: SCREEN_HEIGHT * 0.5 }; } else if (play_type == BattleConst.Effect_Play_Type.ROLE_SCENE || play_type == BattleConst.Effect_Play_Type.ENEMY_SCENE) { x_fix = attacker.obj_type * x_fix; if (is_left) { if (play_type == BattleConst.Effect_Play_Type.ROLE_SCENE) { // 友方阵型 scene_pos = { x: SCREEN_WIDTH * 22 / 100 + x_fix, y: SCREEN_HEIGHT * 1 / 4 + y_fix }; } else { // 敌方阵型 scene_pos = { x: SCREEN_WIDTH * 78 / 100 + x_fix, y: SCREEN_HEIGHT * 1 / 4 + y_fix }; } } else { if (play_type == BattleConst.Effect_Play_Type.ENEMY_SCENE) { scene_pos = { x: SCREEN_WIDTH * 22 / 100 + x_fix, y: SCREEN_HEIGHT * 1 / 4 + y_fix }; } else { scene_pos = { x: SCREEN_WIDTH * 78 / 100 + x_fix, y: SCREEN_HEIGHT * 1 / 4 + y_fix }; } } } else { scene_pos = this.center_pos(attacker); } } if (scene_pos) { scene_pos.y = scene_pos.y + height; this.skill_act.effectArea(attacker, effect_list, reverse, is_release, scene_pos, hit_callback, bid); } }, // 获取施法者目标对象的中心位置 center_pos: function center_pos(attacker, height_fix) { height_fix = height_fix || 0; var scene_pos = { x: 0, y: 0 }; if (this.battle_scene && attacker && attacker.attacker_info && attacker.attacker_info.target_list && attacker.attacker_info.target_list.length > 0) { var array = attacker.attacker_info.target_list; for (var index = 0; index < array.length; index++) { var element = array[index]; var target = this.getBattleRoleByPos(element.target); if (target && target.scene_pos) { scene_pos.x = target.scene_pos.x; scene_pos.y = target.scene_pos.y + target.model_height * height_fix * 0.01; // 这个计算位置好奇葩..竟然不是直接用偏移高度去算.. break; } } } return scene_pos; }, // 播放攻击动作之类的 actHurt: function actHurt(attacker, is_big) { if (attacker == null || attacker.attacker_info == null || attacker.attacker_info.target_list == null) return; var had_play = false; for (var index = 0; index < attacker.attacker_info.target_list.length; index++) { var effect_list = attacker.attacker_info.target_list[index]; var play_effect = false; if (effect_list.hp_changed && effect_list.hp_changed < 0 && had_play == false) { had_play = true; play_effect = true; } this.playMagic2(attacker, effect_list, is_big, play_effect); } }, // 提前播放受击特效,回播受击动作 playMagic2: function playMagic2(attacker, effect_play, is_big, play_effect) { if (attacker == null || effect_play == null) return; var target = this.real_role_list[effect_play.target]; if (target == null) return; if (is_big == true) { if (!target.is_big_play) { target.is_big_play = true; this.playHurtEffect(attacker, target); } } else { if (attacker.pos != target.pos && attacker.group != target.group) { this.skill_act.hurt(attacker, target, PlayerAction.hurt, play_effect); } } }, // 攻击上层特效处理 attackPoint: function attackPoint(attacker) { if (attacker && attacker.attack_sound != "" && attacker.is_real == true) { Utils.playEffectSound(AUDIO_TYPE.BATTLE, attacker.attack_sound); } if (attacker.act_effect_list == null || attacker.act_effect_list.length == 0) { return; } var is_friend = attacker.is_friend; var array = attacker.act_effect_list; for (var index = 0; index < array.length; index++) { var element = array[index]; var anime_res_up = element.res_up; if (element.spec_res_up != "" && is_friend == true) { anime_res_up = element.spec_res_up; } if (anime_res_up != "" || element.res_down != "") { this.effectSpineUser(attacker, true, element.x_fix * attacker.obj_type, element.y_fix, [anime_res_up, element.res_down], attacker, element.scale * 0.001, null, element.bid); } } }, /** * 处理普通伤害 * @param {*} attacker * @param {*} role_list */ hurt: function hurt(attacker, object_list) { if (this.battle_scene == null || attacker == null) { return; } if (attacker.area_effect_list.length == 0) { var hit_num = !attacker.in_area_effect ? attacker.hit_num : attacker.area_hit_num || 1; var split_hurt = attacker.split_hurt || 1; if (hit_num == 1 || split_hurt > 1) {} else { var role_list = object_list || this.getAllBattleRoleList(); for (var key in role_list) { var role = role_list[key]; if (role) { role.is_hurt_play = false; role.is_big_play = false; } } } this.batchPlayHurt(attacker); } }, /** * 伤害一个人的时候 * @param {*} attacker */ hurtOne: function hurtOne(attacker) { if (this.checkIsInBattle(attacker) == false) { return; } var effect_play_num = attacker.attacker_info.target_list.length; if (effect_play_num > 0) { if (attacker.is_real) { this.playMagic(attacker, attacker.attacker_info.target_list[0]); } else { this.hook_model.playMagic(attacker, attacker.attacker_info.target_list[0]); } } }, // 隐藏血条 hideUI: function hideUI(attacker, delay_time) { if (attacker) { return this.skill_act.hideUI(attacker, delay_time); } }, // 无动作并行攻击 noActAttack: function noActAttack(attacker, delay_time, hit_fun, start_fun, next_delay_time) { if (!this.getBattleScene()) return; if (!attacker) return; var start_callback = function () { this.callfun(attacker, start_fun); }.bind(this); var hit_callback = function () { this.callfun(attacker, hit_fun); }.bind(this); return this.skill_act.noActAttack(attacker, delay_time, hit_callback, start_callback, next_delay_time); }, // 显示血条 showUI: function showUI(attacker, delay_time) { if (attacker) { return this.skill_act.showUI(attacker, delay_time); } }, // 判断是否存在反击buff getBuffTag: function getBuffTag(attacker) { if (attacker == null || attacker.buff_list == null || attacker.buff_list.length == null) { return false; } var array = attacker.buff_list; for (var index = 0; index < array.length; index++) { var element = array[index]; var config = Config.skill_data.data_get_buff[element.bid]; if (config && config.group == 3108) { return true; } } return false; }, // 近战移动归位 moveBack: function moveBack(attacker, delay_time, move_time, grid_pos_x, action_name, is_jump, is_jump_delay, is_get_point, is_move, is_reverse) { if (!this.getBattleScene()) return; if (!attacker) return; var target_pos = attacker.scene_pos; var skill_act = this.skill_act.move(attacker, target_pos, delay_time, move_time); attacker.runAction(skill_act); }, // 移动到指定区域 moveToArea: function moveToArea(attacker, config) { if (!this.getBattleScene()) return; if (!attacker) return; if (!config) return; var grid_pos_x = config.move_model_x * this.skill_act.gridSizeX(); var grid_pos_y = config.move_model_y * this.skill_act.gridSizeY(); var target_pos = { x: SCREEN_WIDTH * 32 / 64 + grid_pos_x * attacker.obj_type, y: SCREEN_HEIGHT * 11 / 36 + grid_pos_y }; var skill_act = this.skill_act.move(attacker, target_pos, config.move_delay_time, config.move_time); attacker.runAction(skill_act); }, // act_args={ [[moveTo]],{ 0, 10,- 7, 0, [[run]], 0, 0, 0, 1, 1}}}, // 移动到目标处 moveTo: function moveTo(attacker, delay_time, move_time, grid_pos_x, grid_pos_y, action_name, is_jump, is_jump_delay, is_get_point, is_move, is_reverse, is_col_act) { if (!this.getBattleScene()) return; if (!attacker) return; move_time = move_time || 30; if (grid_pos_x == null) { grid_pos_x = 0; } if (grid_pos_y == null) { grid_pos_y = 0; } var direct = is_reverse == 1 ? -1 : 1; var target_pos = null; var scene_pos = attacker.scene_pos; if (is_col_act == 1) { var is_left = attacker.is_friend; // 是否是己方,己方就是在左边 var temp_list = null; if (is_left) { temp_list = [{ x: 34, y: 17 }, { x: 34, y: 23 }, { x: 34, y: 29 }]; } else { temp_list = [{ x: 44, y: 17 }, { x: 44, y: 23 }, { x: 44, y: 29 }]; } var pos = temp_list[attacker.col]; if (pos) { var temp_pos = this.skill_act.gridPosToScreenPos(pos); target_pos = { x: temp_pos.x + grid_pos_x, y: temp_pos.y + grid_pos_y }; } } else if (grid_pos_x > 0) { target_pos = { x: scene_pos.x + grid_pos_x * attacker.obj_type * direct, y: scene_pos.y + grid_pos_y }; } else { if (is_reverse == 1 && attacker.target_pos_base) { // 反转 target_pos = this.skill_act.gridPosToScreenPos({ x: attacker.target_pos_base.x + grid_pos_x * attacker.obj_type * direct, y: attacker.target_pos_base.y + grid_pos_y * attacker.obj_type * direct }); } else { target_pos = this.skill_act.gridPosToScreenPos({ x: attacker.target_pos.x + grid_pos_x * attacker.obj_type * direct, y: attacker.target_pos.y + grid_pos_y }); } } if (is_get_point == null || is_get_point == 0) { var skill_act = this.skill_act.move(attacker, target_pos, delay_time, move_time); attacker.runAction(skill_act); } else { return this.skill_act.move(attacker, target_pos, delay_time, move_time); } }, // 一些播报判断 checkIsInBattle: function checkIsInBattle(attacker) { if (this.battle_scene == null || attacker == null) { return false; } return true; }, // -------------------------------创景单位这一块,真是战斗单位 createRoleList: function createRoleList() { var battle_data = this.battle_data; var need_enter = this.needPlayEnterAction(); for (var key in battle_data.fight_object_list) { var role_data = battle_data.fight_object_list[key]; this.createRole(role_data, need_enter, true, true); } }, // 创建具体单位 createRole: function createRole(role_data, enter_run, talk_back, is_real) { if (this.battle_scene == null) return; if (role_data == null || role_data.hp == 0) return; var role_layer = this.battle_scene.getBattleRoleLayer(); if (role_layer == null) return; if (this.real_role_list[role_data.pos] != null) return; var role = Utils.createClass("battle_role"); role.createRole(role_layer, role_data, enter_run, talk_back, is_real); this.real_role_list[role_data.pos] = role; }, // 重置战斗单位初始化信息,比如位置层级和动作状态 resetBattleRoleBaseInfo: function resetBattleRoleBaseInfo() { for (var key in this.real_role_list) { var battle_role = this.real_role_list[key]; if (battle_role) { battle_role.resetBaseInfo(); } } }, // 清楚掉单位 clearRealRole: function clearRealRole() { if (Object.keys(this.real_role_list).length == 0) { return; } for (var key in this.real_role_list) { // 清楚掉定时器 gcore.Timer.del("attackerActTimeout" + key); var battle_role = this.real_role_list[key]; if (battle_role) { battle_role.deleteRole(); battle_role = null; } } this.real_role_list = {}; }, // 当前所有单位 getAllBattleRoleList: function getAllBattleRoleList() { return this.real_role_list; }, // 指定单位上的对象 getBattleRoleByPos: function getBattleRoleByPos(pos) { if (this.real_role_list[pos]) { return this.real_role_list[pos]; } }, // 魅魔技能黑屏,暂时也没配置了 blackScreen: function blackScreen(attacker) {}, // 只显示攻击于被攻击放,暂时都没有配置 blackScreen2: function blackScreen2(attacker) {}, // 黑屏------后续一律使用这个黑屏 blackScreen3: function blackScreen3(attacker, delay_time, time, alpha) { if (time == null) { time = 15; } var begin_fun = function () { if (this.battle_scene) { this.battle_scene.setBlack(true, alpha); } this.is_black = true; }.bind(this); var end_fun = function () {}.bind(this); return this.skill_act.blackScreen(attacker, delay_time, time, begin_fun, end_fun); }, // 取消黑屏 cancleBlackScreen: function cancleBlackScreen() { this.is_black = false; if (this.battle_scene) { this.battle_scene.setBlack(false); } }, // 震屏 playShakeScreen: function playShakeScreen(shake_id) { if (shake_id == null || shake_id == 0) return; if (this.battle_scene) { this.battle_scene.shakeScreen(shake_id); } }, // 隐身,暂时没有配置了 hide: function hide(attacker) {}, // 显示,暂时也没有配置了 show: function show(attacker) {}, // 残影,也是没有配置了 shadow: function shadow(attacker) {}, // 返回主界面控制器 getMainUICtrl: function getMainUICtrl() { if (this.mainui_ctrl == null) { this.mainui_ctrl = require("mainui_controller").getInstance(); } return this.mainui_ctrl; }, // -------------------------战斗结束 //结算界面 showWin: function showWin(data, is_replay) { if (data.show_panel_type == null || data.combat_type == null) return; if (data.show_panel_type == 1) { // 显示战斗结算界面,这个时候不要立即清除掉, if (data.combat_type == this.combat_type && this.battle_controller.getWatchReplayStatus() || is_replay == true) {} // 这个时候都需要显示结算界面 this.setBattleTimeScale(true); this.showWinView(data); } else { if (data.combat_type == this.combat_type) { // if (is_replay == true) { this.clearView(); } else { this.clearBattleScene(); gcore.GlobalEvent.fire(EventId.EXIT_FIGHT, data.combat_type); } } } }, //游戏退出结算 showWinView: function showWinView(data) { if (data == null) return; this.battle_controller.openFinishView(true, data.combat_type, data); }, //战斗结果 result: function result(data, is_self_exit) { if (data == null) return; if (this.cur_fight_type == 2 && this.combat_type == data.combat_type) { this.clearView(); } }, clearView: function clearView() { this.setBattleTimeScale(true); // 还原动作速率 if (this.battle_controller.getWatchReplayStatus() == true) { // 如果是录像状态下,退出录像 this.battle_controller.setWatchReplayStatus(false); } // 派发退出战斗事件,通知各个系统处理 gcore.GlobalEvent.fire(EventId.EXIT_FIGHT, this.combat_type); var MainuiController = require("mainui_controller"); if (this.combat_type == BattleConst.Fight_Type.Darma) { if (MainuiController.getInstance().checkIsInDramaUIFight()) { // 剧情副本中结束战斗,则切到假战斗 this.battle_controller.send20060(BattleConst.Fight_Type.Darma); } } else { if (this.battle_controller.getWatchReplayStatus() == true || this.combat_type == BattleConst.Fight_Type.PK || this.combat_type == BattleConst.Fight_Type.HeroTestWar) { if (MainuiController.getInstance().checkIsInDramaUIFight()) { // 剧情副本中结束战斗,则切到假战斗 this.battle_controller.send20060(BattleConst.Fight_Type.Darma); } else { this.clearBattleScene(); } } else { this.clearBattleScene(); } } }, // 播放资产掉落的动作 playResourceCollect: function playResourceCollect(x, y, pos) { if (this.drama_fight_ui) { this.drama_fight_ui.playResourceCollect(x, y, pos); } }, //获取group getGroup: function getGroup() { return this.my_group; }, getCampIconConfigByIds: function getCampIconConfigByIds(id_list) { if (!id_list || Utils.next(id_list) == null) return; if (id_list.length == 1) { var id = id_list[0]; return Config.combat_halo_data.data_halo_icon[id]; } else { var min_id = Math.min(id_list[0], id_list[1]); var max_id = Math.max(id_list[0], id_list[1]); var _id = min_id * 100 + max_id; return Config.combat_halo_data.data_halo_icon[_id]; } }, getEffectRes: function getEffectRes(effect_id) {}, // 开始准备战斗资源 preloadBattleRes: function preloadBattleRes(data, finish_cb) { // skill_plays var battle_res = {}; for (var skill_i in data.skill_plays) { var skill_data = data.skill_plays[skill_i]; for (var effect_i in skill_data.effect_play) { var effect_data = skill_data.effect_play[effect_i]; if (!effect_data.effect_bid) continue; var effect_config = gdata('skill_data', 'data_get_effect', effect_data.effect_bid); if (!effect_config) { continue; } var actor = this.real_role_list[effect_data.actor]; var target = this.real_role_list[effect_data.target]; // 攻击动作资源 if (effect_config.anime_res && actor) { var anime_res_path = actor.getResPath(effect_config.anime_res); if (anime_res_path) { battle_res[anime_res_path] = true; } } // 受击动作资源 if (effect_config.hit_action && target) { if (effect_config.hit_action != "no-hurt") { var hit_action_path = target.getResPath(effect_config.hit_action); if (hit_action_path) { battle_res[hit_action_path] = true; } } } // 特效资源加载 for (var effect_d in AniRes) { var effct_list = Utils.deepCopy(this.getCurEffectList(effect_config[AniRes[effect_d]])); for (var effect_i in effct_list) { var effect_info = effct_list[effect_i]; if (effect_info.res_up) { var action_name = PlayerAction.action; // if (effect_info.up_action_name) // action_name = effect_info.up_action_name; var res_path = "spine/" + effect_info.res_up + "/" + action_name; battle_res[res_path] = true; } if (effect_info.res_down) { var action_name = PlayerAction.action; // if (effect_info.down_action_name) { // action_name = effect_info.down_action_name; // } var res_path = "spine/" + effect_info.res_down + "/" + action_name; battle_res[res_path] = true; } } } } } var total_num = 0; var finish_num = 0; for (var battle_i in battle_res) { total_num++; } for (var battle_i in battle_res) { var skeleton_path = battle_i + ".atlas"; BattleResPool.getInstance().preLoadRes(skeleton_path, function (skeleton_path, res_object) { finish_num++; if (finish_num == total_num) { if (finish_cb) finish_cb(); } }.bind(this, skeleton_path)); } if (total_num == 0) { if (finish_cb) finish_cb(); } } }); module.exports = BattleModel; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXGJhdHRsZV9tb2RlbC5qcyJdLCJuYW1lcyI6WyJCYXR0bGVEYXRhIiwicmVxdWlyZSIsIkJhdHRsZUNvbnN0IiwiTG9hZGVyTWFuYWdlciIsIkJhdHRsZVJlc1Bvb2wiLCJBbmlSZXMiLCJCYXR0bGVNb2RlbCIsImNjIiwiQ2xhc3MiLCJjdG9yIiwicHJvcGVydGllcyIsImluaXRfZmlnaHRfc3RhdHVzIiwiaW5pdENvbmZpZyIsImJhdHRsZV9jb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJob29rX21vZGVsIiwiZ2V0SG9va01vZGVsIiwic2tpbGxfYWN0IiwiYmF0dGxlX3Bvb2xzIiwiYmF0dGxlX2RtZ19jYWNoZV9saXN0IiwiYmF0dGxlX2VmZmVjdF9saXN0IiwiYmF0dGxlX2VmZmVjdF9wb29sIiwicm9sZV90aW1lX3NjYWxlIiwiYmF0dGxlX3NwZWVkIiwiYnV0dG9uX2xpc3RfcGFuZWxfdGltZSIsImZvcm1fcGFuZWxfdGltZSIsImlzX2NsZWFyIiwicmVzZXRJbml0RGF0YSIsIm15X2dyb3VwIiwiYWxpdmVfbnVtIiwiY3JlYXRlX292ZXJfbnVtIiwic2tpbGxfcGxheXNfb3JkZXJfbGlzdCIsInJvdW5kX2RhdGFfdGVtcCIsIm9yZGVyX2xpc3QiLCJyb3VuZF9kYXRhIiwiY3VyX3JvdW5kX2RhdGEiLCJhY3Rvcl9zdW0iLCJhY3Rvcl9wbGF5X3N1bSIsImFjdF9wbGF5aW5nIiwiaXNfcGxheV9yb3VuZF9zdGFydCIsImN1cl9yb3VuZCIsIm5leHRfcm91bmQiLCJiYXR0bGVfZGF0YSIsImNvbWJhdF90eXBlIiwiRmlnaHRfVHlwZSIsIk5pbCIsInJlYWxfcm9sZV9saXN0IiwiY3VyX2ZpZ2h0X3R5cGUiLCJidWZmcyIsImhhbGxvd3NfbGlzdCIsInNjZW5lX2J1ZmZfZWZmZWN0X2xpc3QiLCJhZGRCYXR0bGVFZmZmZWN0IiwicGFyZW50Iiwic2NlbmVfcG9zIiwicmV2ZXJzZSIsImVmZmVjdF9pZCIsImFjdGlvbl9uYW1lIiwiQmF0dGxlRWZmZWN0IiwiYmF0dGxlX2VmZmVjdCIsImVmZmVjdF9rZXkiLCJVdGlscyIsImdldE5vcktleSIsImxlbmd0aCIsInNoaWZ0IiwiY3JlYXRlRWZmZWN0IiwicmVzZXRTY2VuZVBvcyIsInJlc2V0UmV2ZXJzZSIsInNldFRpbWVTY2FsZSIsInNldEFjdGl2ZUVmZmVjdCIsInB1c2giLCJkZWxCYXR0bGVFZmZlY3QiLCJnZXRFZmZlY3RLZXkiLCJhcnJheSIsImluZGV4IiwiZWxlbWVudCIsInNwbGljZSIsImdldERtZ0ZvbnRDYWNoZU9iamVjdCIsInR5cGUiLCJjYWxsYmFjayIsInJlc19wYXRoIiwiUGF0aFRvb2wiLCJnZXRQbGlzdFBhdGgiLCJyZXNfb2JqZWN0IiwibG9hZFJlcyIsImJpbmQiLCJyZWxlYXNlRG1nRm9udCIsInBhdGgiLCJyZWxlYXNlUmVzIiwiZ2V0Tm9ybWFsRm9udCIsInBvb2xzIiwiZ2V0Rm9udFBvb2xzIiwibm9kZSIsInNpemUiLCJnZXQiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJ3aWR0aCIsImhlaWdodCIsImJnX25vZGUiLCJhZGRDb21wb25lbnQiLCJTcHJpdGUiLCJhZGRDaGlsZCIsImZvbnRfbm9kZSIsImZvbnRfbGFiZWwiLCJMYWJlbCIsImxpbmVIZWlnaHQiLCJmb250U2l6ZSIsIkxhYmVsT3V0bGluZSIsIm5hbWUiLCJiZ19wYXRoIiwiZ2V0VUlJY29uUGF0aCIsImdldENvbXBvbmVudCIsInNwcml0ZUZyYW1lIiwicHVzaEJhY2tCYXR0bGVGb250IiwiZm9udCIsInB1c2hCYWNrRm9udCIsInVwZGF0ZUN1ckJhdHRsZURhdGEiLCJkYXRhIiwiaXNfaW5pdCIsImRlbGV0ZUN1ckJhdHRsZURhdGEiLCJ1cGRhdGVEYXRhIiwic2F2ZVNwZWVkIiwicGxheV9zcGVlZCIsImdyb3VwIiwiUm9sZUNvbnRyb2xsZXIiLCJyb2xlX3ZvIiwiZ2V0Um9sZVZvIiwia2V5IiwiZmlnaHRfb2JqZWN0X2xpc3QiLCJyb2xlX2RhdGEiLCJvd25lcl9pZCIsIm93bmVyX3Nydl9pZCIsInJpZCIsInNydl9pZCIsImhwIiwib2JqZWN0X3R5cGUiLCJVbml0X1R5cGUiLCJIYWxsb3dzIiwiaGFsbG93c19kYXRhIiwicG9zIiwiaGFsbG93c192YWwiLCJ2YWwiLCJoYWxsb3dzX21heCIsIm1heCIsImFkZFJlYWR5U3VtIiwiY3NSZWFkeUZpZ2h0U3RhcnQiLCJnZXRBbGxPYmplY3QiLCJoYW5kbGVCYXR0bGVTY2VuZVN0YXR1cyIsInN0YXR1cyIsImJhdHRsZV9zY2VuZSIsImNoYW5nZVZpc2libGUiLCJnZXRGaWdodFN0YXR1cyIsImlzX3JlYWxfY29tYmF0IiwiZ2V0QmF0dGxlU2NlbmUiLCJpc0luUmVhbEJhdHRsZSIsImNyZWF0ZUJhdHRsZVNjZW5lIiwiaW5fZmlnaHRfdHlwZSIsImNsZWFyUmVhbFJvbGUiLCJCYXR0bGVfSW5fVHlwZSIsIlJlYWwiLCJjcmVhdGVDbGFzcyIsInVwZGF0ZUJhdHRsZVNjZW5lIiwiaXNfc2hvdyIsIkRhcm1hIiwib3BlbkRyYW1hRmlnaHRVSSIsIm9wZW5Gb3JtVmlld1VJIiwic2V0SXNOb3JtYUJhdHRsZSIsImhhbmRsZVNjZW5lU3RhdHVzIiwic2hvd19maWdodF91aV9zdGF0dXMiLCJmaWdodF91aV9jb21iYXQiLCJkcmFtYV9maWdodF91aSIsImhpZGUiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsInBhcnRuZXIiLCJWaWV3TWFuYWdlciIsImdldFNjZW5lTm9kZSIsIlNDRU5FX1RBRyIsInVpIiwic2V0UGFyZW50Iiwic2hvdyIsInNldFpJbmRleCIsImlzX29uc2hvdyIsImNoYW5nZUJhdHRsZVN0YXR1cyIsInN0YXJ0Q291bnREb3duVG9EZWxldGUiLCJmb3JtX2ZpZ2h0X3VpIiwic2V0UG9zaXRpb24iLCJjbG9zZV9wYW5lbF90aW1lciIsIlRpbWVyIiwiZGVsIiwic2V0Iiwid2FpdERlbGV0ZVBhbmVsIiwiYnV0dG9uX3Bhc3NfdGltZSIsImRlbGV0ZU1lIiwiZm9ybV9wYXNzX3RpbWUiLCJnZXREcmFtYUZpZ2h0VUkiLCJyb290X3duZCIsImNsZWFyQmF0dGxlU2NlbmUiLCJyb2xlX2xpc3QiLCJnZXRBbGxCYXR0bGVSb2xlTGlzdCIsImNsZWFuQWxsQmF0dGxlRWZmZWN0IiwicGxheU11c2ljIiwiQVVESU9fVFlQRSIsIlNDRU5FIiwiZGVsZUVmZmVjdCIsIm1hcE1vdmVzY2hlZHVsZVVwZGF0ZSIsImNoYW5nZU1vdmVNYXBTdGF0dXMiLCJuZWVkUGxheUVudGVyQWN0aW9uIiwiaXNGcmllbmQiLCJnZXRDdXJCYXR0bGVEYXRhIiwiZ2V0Q29tYmF0VHlwZSIsImNoZWNrSXNDYW5DaGFuZ2VCYXR0bGVTcGVlZCIsIm5leHRfc3BlZWQiLCJzcGVlZF9jb25maWciLCJDb25maWciLCJjb21iYXRfdHlwZV9kYXRhIiwiZGF0YV9jb21iYXRfc3BlZWQiLCJsaW1pdF9sZXYiLCJsZXYiLCJsaW1pdF92aXBfbGV2IiwidmlwX2xldiIsImRlc2MiLCJqcyIsImZvcm1hdFN0ciIsIlRJMThOIiwibWVzc2FnZSIsImZpZ2h0X2NvbmZpZyIsImRhdGFfZmlnaHRfbGlzdCIsImlzX3B2cCIsImNoYW5nZVNwZWVkIiwiY3NGaWdodFNwZWVkIiwiZ2V0VGltZVNjYWxlIiwidGltZV9zY2FsZSIsInNldEJhdHRsZVRpbWVTY2FsZSIsImlzX3Jlc2V0IiwiYmF0dGxlX3RpbWVfc3RhdHVzIiwiYmFzZV9jb25maWciLCJiYXR0bGVfYWN0X2RhdGEiLCJkYXRhX2dldF9hY3RfZGF0YSIsImJhc2Vfc3BlZWRfc2NhbGUiLCJzcGVlZF9zY2FsZSIsInNldFJvbGVUaW1lU2NhbGUiLCJvYmplY3QiLCJzcGVlZCIsInNldFNwZWVkIiwiZ2V0U3BlZWQiLCJhY3RTdGFydCIsImF0dGFja2VyIiwiY2hlY2tvdXRJc1JpZ2h0RmlnaHQiLCJ3YWl0X2FjdCIsImFjdFRpbWVvdXQiLCJhY3RGaW5pc2giLCJpc19yZWFsIiwicGxheU9yZGVyIiwiZ2V0VW5yZWFsQmF0dGxlRGF0YSIsInBsYXlSb3VuZFN0YXJ0IiwiZGVhbFJvdW5kQnVmZiIsInJvdW5kX2J1ZmYiLCJoYWxsb3dzIiwicm9sZSIsInNldEhhbGxvd3NSb3VuZCIsImFsbF9hbGl2ZSIsInRlbXBfbGlzdCIsImlzX2RpZSIsImRvRGllZCIsInNraWxsX3BsYXlzIiwiY3NSb3VuZEZpZ2h0RW5kIiwiaGFuZGxlUGxheVJvdW5kU3RhcnQiLCJhZGRSb3VuZERhdGEiLCJ1cGRhdGVSb3VuZCIsImFjdGlvbl9jb3VudCIsInBsYXlSb3VuZEluIiwiYWN0X2FmdGVyX2J1ZmZfbGlzdCIsInNldEJ1ZmZzTGlzdCIsInVwRGF0ZU5leHRNb24iLCJkZWxldGVSb2xlIiwib2JqZWN0cyIsInVwZGF0YU5leHRCYXR0bGVSb2xlIiwiY3JlYXRlUm9sZSIsInVwZGF0ZUJhc2VJbmZvIiwicmVzZXRCYXR0bGVSb2xlQmFzZUluZm8iLCJidWZmX2xpc3QiLCJiYXR0bGVfcm9sZSIsInRhcmdldCIsImJ1ZmZfY29uZmlnIiwic2tpbGxfZGF0YSIsImRhdGFfZ2V0X2J1ZmYiLCJidWZmX2JpZCIsInBsYXlSb3VuZEJ1ZmYiLCJqIiwic2tpbGxfZWxlbWVudCIsImkiLCJlZmZlY3RfcGxheSIsImVmZmVjdF9lbGVtZW50Iiwib3JkZXIiLCJza2lsbF9vcmRlciIsInByaW9yaXR5Iiwic2tpbGxfYmlkIiwic2tpbGxfYmlkX29mX2VmZmVjdCIsInRhbGtfcG9zIiwidGFsa19jb250ZW50Iiwic29ydCIsImEiLCJiIiwicHJlbG9hZEJhdHRsZVJlcyIsImFuYWx5c2VUZW1wUm91bmREYXRhIiwiT2JqZWN0Iiwia2V5cyIsInRlbXAiLCJvbmVfdGVtcCIsImFjdG9yIiwidGFyZ2V0X2xpc3QiLCJyb3VuZCIsInJvdW5kX251bSIsImRtZ19pbmRleCIsImRtZ19haWRfeV9vZmZzZXQiLCJpc19odXJ0X3BsYXkiLCJpc19iaWdfcGxheSIsImNhbmNsZUJsYWNrU2NyZWVuIiwidGVtcF9za2lsbF9iaWQiLCJjc1NraWxsUGxheUVuZCIsImZpcnN0X2RhdGEiLCJzZWNvbmRfb3JkZXIiLCJzZWNvbmRfZGF0YSIsInJvdW5kX29uZV90ZW1wIiwiZ2V0QmF0dGxlUm9sZUJ5UG9zIiwiaW5pdE9yZGVyIiwiYnVmZiIsImVmZmVjdF9oaXQiLCJhZGRCdWZmIiwiY2hhbmdlX3R5cGUiLCJiYXR0bGVSb2xlSFBDaGFuZ2UiLCJjaGFuZ2VfdmFsdWUiLCJpc19kZWFkIiwidmFsdWUiLCJpc19idWZmIiwiY2FtcF9yZXN0cmFpbiIsInVwZGF0ZUhQIiwibXV0aUh1cnROdW0iLCJvbmUiLCJsYXN0X3JvdW5kX2FjdG9yIiwicmVzZXRaT3JkZXIiLCJ0YXJnZV96b3JkZXIiLCJsaXN0IiwiY29sX3RhcmdldCIsIkdJUkRfUE9TX09GRlNFVCIsImNvbCIsIlBvc19Ub19Db2wiLCJnZXRMb2NhbFpPcmRlciIsImlzX3JvdW5kIiwiYXR0YWNrZXJfaW5mbyIsImdkYXRhIiwidGFyZ2V0X3BvcyIsImdyaWRfcG9zIiwicGxheV9vcmRlcl9pbmRleCIsImVmZmVjdF9iaWQiLCJjYWxjVGFyZ2V0UG9zIiwic3ViX2VmZmVjdF9wbGF5X2xpc3QiLCJoYW5kbGVTdWJFZmZlY3RQbGF5bGlzdCIsImVmZmVjdF9jb25maWciLCJwbGF5X29yZGVyIiwiZGVlcENvcHkiLCJhY3Rpb25fbGlzdCIsInNoYWtlX2lkIiwiZWZmZWN0X3R5cGUiLCJwbGF5X3N0YW5kIiwiYW5pbWVfcmVzIiwic3BsaXRfaHVydCIsImhpdF9hY3Rpb24iLCJlZmZlY3RfZGVzYyIsImlzX211c3RfZGllIiwiYW5pbWVfdXNlcl9hdGsiLCJhdHRhY2tfc291bmQiLCJyZWFkeV9zb3VuZCIsInNob3V0X3RyaWNrIiwiaGl0X3NvdW5kIiwiaGl0X2VmZmVjdF9saXN0IiwiZ2V0Q3VyRWZmZWN0TGlzdCIsImFyZWFfZWZmZWN0X2xpc3QiLCJhY3RfZWZmZWN0X2xpc3QiLCJiYWN0X2VmZmVjdF9saXN0IiwidHJjX2VmZmVjdF9saXN0IiwiaXNfY2FsYyIsImluX2FyZWFfZWZmZWN0IiwiYXJlYV9oaXRfbnVtIiwiYXJlYV9oaXRfdGltZSIsInN0YXJ0X2F0dGFjayIsInNob3dfc2tpbGxfbm1lIiwic2tpbGxfdHlwZSIsIlNraWxsX1R5cGUiLCJQQVNTSVZFX1NLSUxMIiwicGFzc2l2ZV9za2lsbF9zaG93IiwicGxheUZvbnRNZXNzYWdlIiwiQUNUSVZFX1NLSUxMIiwic2hvd0FjdGl2ZVNraWxsTmFtZSIsInRhbGsiLCJvYmplY3RfbGlzdCIsIm9ial90eXBlIiwidGFyZ2V0X3Bvc19iYXNlIiwidGFyZ2V0X25hbWUiLCJvYmplY3RfbmFtZSIsImVmZmVjdF9saXN0IiwiZWZmZWN0X2RhdGEiLCJkYXRhX2dldF9lZmZlY3RfZGF0YSIsIm1zZyIsInNpbmdsZUFjdCIsImFjdF9kYXRhIiwiQXJyYXkiLCJtdXRpQWN0IiwiYWN0X2NvbmZpZyIsImFyZ3MiLCJhY3RfYXJncyIsImZ1bm5hbWUiLCJGdW5jdGlvbiIsInBhcmFtcyIsInVuc2hpZnQiLCJhcHBseSIsIkxvZyIsImluZm8iLCJhY3RzIiwiYWN0Iiwic3Bhd24iLCJjYWxsZnVuIiwicnVuQWN0aW9uIiwiYXR0YWNrIiwiZGVsYXlfdGltZSIsImhpdF9mdW4iLCJzdGFydF9mdW4iLCJpc19yZXZlcnNlIiwic3RhcnRfY2FsbGJhY2siLCJoaXRfY2FsbGJhY2siLCJmbHlJdGVtIiwibW92ZV90aW1lIiwiaXNfYmFjayIsInN0YXJ0X2hlaWdodCIsImNoZWNrSXNJbkJhdHRsZSIsImVmZmVjdF9vYmplY3QiLCJpc19mcmllbmQiLCJyZXNfdXAiLCJzcGVjX3Jlc191cCIsInNjYWxlIiwieF9maXgiLCJ5X2ZpeCIsImFuaW1hX25hbWUiLCJQbGF5ZXJBY3Rpb24iLCJhY3Rpb25fMiIsImF0dGFja19mdW5jIiwiY2VudGVyX3BvcyIsIml0ZW0iLCJiaWQiLCJwbGF5U2VsZkVmZmVjdCIsImFjdF9saXN0IiwieCIsInkiLCJmdW5jIiwiZ2V0SXRlbSIsImZpbmlzaF9mdW5jIiwiY2FsbEZ1bmMiLCJsYXN0X2VmZmVjdCIsInBsYXlNYWdpYyIsImFjdF9zdGFydCIsIm5vcm1hbFN0YXJ0IiwiYWN0X2ZpbmlzaCIsIm5vcm1hbEZpbmlzaCIsInNlcXVlbmNlIiwiZmFkZU91dCIsInRpbWUiLCJmYWRlSW4iLCJyZXNldEF0dGFja2VyU3RhbmRTdGF0dXMiLCJuZXh0X3JvdW5kX2FjdG9yIiwic2V0QW5pbWF0aW9uIiwiYmF0dGxlX3N0YW5kIiwiZWZmZWN0X25hbWUiLCJtb2RlbF9oZWlnaHQiLCJiYXRjaFBsYXlIdXJ0IiwiaGFkX3BsYXkiLCJwbGF5X2VmZmVjdCIsImhwX2NoYW5nZWQiLCJjb2xvciIsIm91dGxpbmUiLCJnZXRCYXR0bGVFZmZlY3RMYXllciIsInRhcmdldF94IiwidGFyZ2V0X3kiLCJub3JtYWxfbm9kZSIsImdldENoaWxkQnlOYW1lIiwiaGV4IiwiY29sb3JfZGF0YSIsImRhdGFfY29sb3IxNiIsIl9jb2xvciIsImZyb21IRVgiLCJvdXRfaGV4Iiwib3V0X2xpbmUiLCJfY29sb3IxIiwibGFiZWwiLCJzdHJpbmciLCJidWZmX3Nob3dfaW5kZXgiLCJkZWxheSIsImRlbGF5VGltZSIsImRlbGF5X292ZXIiLCJzY2FsZV90b18xIiwic2NhbGVUbyIsIm1vdmVfYnlfMSIsIm1vdmVCeSIsImZhZGVfaW4iLCJzY2FsZV90b18yIiwiZmFkZV9vdXQiLCJtb3ZlX2J5XzIiLCJwbGF5X251bSIsImF2Z19ocF9jaGFuZ2VkIiwiTWF0aCIsImNlaWwiLCJpc19oaXQiLCJpc19ibGluZCIsImRtZyIsImZsb29yIiwiaXNfY3JpdCIsInN1bW1vbl9saXN0IiwiYWRkUm9sZUxpc3QiLCJoYW5kbGVFeHRlbmREdW5nZW9uIiwiYWlkX2FjdG9yIiwiaGFuZGxlQWlkQWN0b3IiLCJwbGF5QmF0dGxlUm9sZUh1cnQiLCJzaG93YnVmZk5hbWUiLCJ1cGRhdGVUYXJnZXRIcCIsImhhbmRsZUJ1ZmZsaXN0IiwicGxheUh1cnRFZmZlY3QiLCJodXJ0IiwicGxheURtZ01lc3NhZ2UiLCJidWZmX2RhdGEiLCJpc19wYXNzaXZlIiwicGxheUJ1ZmZFZmZlY3QiLCJhY3Rpb25fdHlwZSIsInJlbW92ZUJ1ZmYiLCJidWZmX3NwaW5lIiwiY2hhbmdlU3BpbmUiLCJzZXRPcGFjaXR5IiwicmVtYWluX3JvdW5kIiwidXBkYXRlQnVmZkxpc3QiLCJoYWRfYnVmZiIsImhhZEJ1ZmYiLCJpZCIsInJlbW92ZUJ1ZmZMaXN0IiwicmVzIiwicGxheV90eXBlIiwiRWZmZWN0X1BsYXlfVHlwZSIsIlJPTEVfU0NFTkUiLCJyZW1vdmVTY2VuZUJ1ZmZFZmZlY3QiLCJyZW1vdmVCYXR0bGVTcGluZUVmZmVjdCIsImFkZFNjZW5lQnVmZkVmZmVjdCIsImVmZmVjdF9yZXMiLCJlZmZlY3QiLCJhY3Rpb24iLCJ1cF9hY3Rpb25fbmFtZSIsImRvd25fYWN0aW9uX25hbWUiLCJyZXNfZG93biIsInRleHRfY29sb3IiLCJvdXRsaW5lX2NvbG9yIiwiY2xpZW50X2Rlc2MiLCJwb3NpdGl2ZV9vcl9uZWdhdGl2ZSIsImhhZGJ1ZmYiLCJjb25maWciLCJuZXh0IiwiZWZmZWN0QXJlYSIsImlzX2NvbF9lZmZlY3QiLCJlZmZlY3RTcGluZVVzZXIiLCJpc19yZWxlYXNlIiwiZWZmdGl2ZV9lZmZlY3QiLCJ0aXBzX2xpc3QiLCJhZGRUaXBzIiwicmVtb3ZlVGlwcyIsInN1Yl90YXJnZXQiLCJzdWJfaHBfY2hhbmdlZCIsImV4dHJhX2VmZmVjdCIsIm4iLCJleHRyYSIsImV4dHJhX2tleSIsInBsYXlCdWZmQWJzb3JiSHVydCIsImV4dHJhX3BhcmFtIiwic3ViX2VmZmVjdF9pZCIsInN1Yl9pc19oaXQiLCJza2lsbF9jb25maWciLCJzdWJfc2tpbGxfaWQiLCJHdWlsZER1biIsImFkZEd1aWxkQm9zc1VJIiwidG90YWxfaHVydCIsImFpZF90YXJnZXQiLCJhaWRfZG1nIiwiYWN0b3JfaHBfY2hhbmdlZCIsImZyaWVuZF9wb3MiLCJyb2xlX3dpZHRoIiwibW9kZWxfd2lkdGgiLCJzZXRMb2NhbFpPcmRlciIsInNldFNjZW5lUG9zIiwidjIiLCJhaWRfaHVydCIsImFjdG9yX2lzX2RlYWQiLCJhdHRhY2tSZWFkeSIsInBsYXlFZmZlY3RTb3VuZCIsIkJBVFRMRSIsIlJPTEUiLCJCYXR0bGVfVHlwZV9Db25mIiwiVFlQRV9ST0xFIiwiYXJlYUh1cnQiLCJodXJ0X2Z1bmMiLCJwbGF5U2NlbmVBcmVhRWZmZWN0IiwiaXNfbGVmdCIsInRlbXBfcG9zIiwiZ3JpZFBvc1RvU2NyZWVuUG9zIiwiU0NSRUVOX1dJRFRIIiwiU0NSRUVOX0hFSUdIVCIsIkVORU1ZX1NDRU5FIiwiaGVpZ2h0X2ZpeCIsImFjdEh1cnQiLCJpc19iaWciLCJwbGF5TWFnaWMyIiwiYXR0YWNrUG9pbnQiLCJhbmltZV9yZXNfdXAiLCJoaXRfbnVtIiwiaHVydE9uZSIsImVmZmVjdF9wbGF5X251bSIsImhpZGVVSSIsIm5vQWN0QXR0YWNrIiwibmV4dF9kZWxheV90aW1lIiwic2hvd1VJIiwiZ2V0QnVmZlRhZyIsIm1vdmVCYWNrIiwiZ3JpZF9wb3NfeCIsImlzX2p1bXAiLCJpc19qdW1wX2RlbGF5IiwiaXNfZ2V0X3BvaW50IiwiaXNfbW92ZSIsIm1vdmUiLCJtb3ZlVG9BcmVhIiwibW92ZV9tb2RlbF94IiwiZ3JpZFNpemVYIiwiZ3JpZF9wb3NfeSIsIm1vdmVfbW9kZWxfeSIsImdyaWRTaXplWSIsIm1vdmVfZGVsYXlfdGltZSIsIm1vdmVUbyIsImlzX2NvbF9hY3QiLCJkaXJlY3QiLCJjcmVhdGVSb2xlTGlzdCIsIm5lZWRfZW50ZXIiLCJlbnRlcl9ydW4iLCJ0YWxrX2JhY2siLCJyb2xlX2xheWVyIiwiZ2V0QmF0dGxlUm9sZUxheWVyIiwicmVzZXRCYXNlSW5mbyIsImJsYWNrU2NyZWVuIiwiYmxhY2tTY3JlZW4yIiwiYmxhY2tTY3JlZW4zIiwiYWxwaGEiLCJiZWdpbl9mdW4iLCJzZXRCbGFjayIsImlzX2JsYWNrIiwiZW5kX2Z1biIsInBsYXlTaGFrZVNjcmVlbiIsInNoYWtlU2NyZWVuIiwic2hhZG93IiwiZ2V0TWFpblVJQ3RybCIsIm1haW51aV9jdHJsIiwic2hvd1dpbiIsImlzX3JlcGxheSIsInNob3dfcGFuZWxfdHlwZSIsImdldFdhdGNoUmVwbGF5U3RhdHVzIiwic2hvd1dpblZpZXciLCJjbGVhclZpZXciLCJHbG9iYWxFdmVudCIsImZpcmUiLCJFdmVudElkIiwiRVhJVF9GSUdIVCIsIm9wZW5GaW5pc2hWaWV3IiwicmVzdWx0IiwiaXNfc2VsZl9leGl0Iiwic2V0V2F0Y2hSZXBsYXlTdGF0dXMiLCJNYWludWlDb250cm9sbGVyIiwiY2hlY2tJc0luRHJhbWFVSUZpZ2h0Iiwic2VuZDIwMDYwIiwiUEsiLCJIZXJvVGVzdFdhciIsInBsYXlSZXNvdXJjZUNvbGxlY3QiLCJnZXRHcm91cCIsImdldENhbXBJY29uQ29uZmlnQnlJZHMiLCJpZF9saXN0IiwiY29tYmF0X2hhbG9fZGF0YSIsImRhdGFfaGFsb19pY29uIiwibWluX2lkIiwibWluIiwibWF4X2lkIiwiZ2V0RWZmZWN0UmVzIiwiZmluaXNoX2NiIiwiYmF0dGxlX3JlcyIsInNraWxsX2kiLCJlZmZlY3RfaSIsImFuaW1lX3Jlc19wYXRoIiwiZ2V0UmVzUGF0aCIsImhpdF9hY3Rpb25fcGF0aCIsImVmZmVjdF9kIiwiZWZmY3RfbGlzdCIsImVmZmVjdF9pbmZvIiwidG90YWxfbnVtIiwiZmluaXNoX251bSIsImJhdHRsZV9pIiwic2tlbGV0b25fcGF0aCIsInByZUxvYWRSZXMiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxVQUFVLEdBQUdDLE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLElBQUlDLFdBQVcsR0FBR0QsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUUsYUFBYSxHQUFHRixPQUFPLENBQUMsZUFBRCxDQUEzQjs7QUFDQSxJQUFJRyxhQUFhLEdBQUdILE9BQU8sQ0FBQyxpQkFBRCxDQUEzQjs7QUFFQSxJQUFJSSxNQUFNLEdBQUcsQ0FDVCxpQkFEUyxFQUNZO0FBQ3JCLGtCQUZTLEVBRVk7QUFDckIsaUJBSFMsRUFHWTtBQUNyQixr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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaImOaImOaWl+aVsOaNruaOp+WItuWZqCzlhbbkuK3ljIXmi6zkuobmiJjmlpflnLrmma/nmoTliJvlu7pcbi8vICAgICAgZmx5SXRlbSBhdHRhY2sgaGlkZVVJIHNob3dVSSBmYWRlT3V0IGZhZGVJbiBtb3ZlQmFjayBtb3ZlVG8gbm9BY3RBdHRhY2sgIOaaguaXtuWunueOsOeahOaSreaKpeWKqOS9nOWPquaciei/meS4gOS6m1xuLy8gICAgICBibGFja1NjcmVlbiBibGFja1NjcmVlbjIgYmxhY2tTY3JlZW4zIGhpZGUgc2hvdyBzaGFkb3cg6L+Z5LiA5Lqb5bey57uP5bqf5byD55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOC0xMS0yOCAxOToxOToxOVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBCYXR0bGVEYXRhID0gcmVxdWlyZShcImJhdHRsZV9kYXRhXCIpO1xudmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbnZhciBMb2FkZXJNYW5hZ2VyID0gcmVxdWlyZShcImxvYWRlcm1hbmFnZXJcIik7XG52YXIgQmF0dGxlUmVzUG9vbCA9IHJlcXVpcmUoXCJiYXR0bGVfcmVzX3Bvb2xcIik7XG5cbnZhciBBbmlSZXMgPSBbXG4gICAgXCJoaXRfZWZmZWN0X2xpc3RcIiwgICAvLyDlj5flh7vngrnnibnmlYhcbiAgICBcImFyZWFfZWZmZWN0X2xpc3RcIiwgIC8vIOiMg+WbtOeJueaViFxuICAgIFwiYWN0X2VmZmVjdF9saXN0XCIsICAgLy8g5Ye65omL54K554m55pWIXG4gICAgXCJiYWN0X2VmZmVjdF9saXN0XCIsICAvLyDmlr3ms5XnibnmlYhcbiAgICBcInRyY19lZmZlY3RfbGlzdFwiICAgIC8vIOW8uemBk+eJueaViFxuXVxuXG52YXIgQmF0dGxlTW9kZWwgPSBjYy5DbGFzcyh7XG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGluaXRfZmlnaHRfc3RhdHVzOmZhbHNlLFxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOmZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLmhvb2tfbW9kZWwgPSB0aGlzLmJhdHRsZV9jb250cm9sbGVyLmdldEhvb2tNb2RlbCgpO1xuICAgICAgICB0aGlzLnNraWxsX2FjdCA9IHJlcXVpcmUoXCJza2lsbF9hY3RcIik7XG5cbiAgICAgICAgdGhpcy5iYXR0bGVfcG9vbHMgPSByZXF1aXJlKFwiYmF0dGxlX3JvbGVfcG9vbFwiKS5nZXRJbnN0YW5jZSgpOyAgICAgIC8vIOeOsOWcqOi/meS4quWvueixoeaxoOS4u+imgeaYr+WtmOaUvmJ1Zmbpo5jlrZfku6Xlj4rkuLvliqjmioDog73po5jlrZfnrYks6YCA5Ye65oiY5paX5rKh5pyJ56e76Zmk5o6J6L+Z5Liq5a+56LGh5rGgXG4gICAgICAgIFxuICAgICAgICB0aGlzLmJhdHRsZV9kbWdfY2FjaGVfbGlzdCA9IHt9OyAgICAgLy8g5oiY5paX5Lyk5a6z5pWw5a2X55qE57yT5a2Y57q555CG5pWw5o2uLOeOsOWcqOmAgOWHuuaImOaWl+ayoeacieenu+mZpOaOiVxuXG4gICAgICAgIHRoaXMuYmF0dGxlX2VmZmVjdF9saXN0ID0ge307ICAgICAgICAvLyDlvZPliY3miJjmlpflrZjlnKjnmoTpnZ7mjILmjqXop5LoibLnmoTnibnmlYgs6L+Z6YeM5a2Y5pS+55qELOmAgOWHuuaImOaWl+WwseS8muenu+mZpOaOiVxuICAgICAgICB0aGlzLmJhdHRsZV9lZmZlY3RfcG9vbCA9IHt9OyAgICAgICAgLy8g5bey57uP5pKt5pS+6L+H55qE54m55pWI57yT5a2Y5a+56LGhLOmAgOWHuuaImOaWl+WwseS8muenu+mZpOaOiVxuXG4gICAgICAgIHRoaXMucm9sZV90aW1lX3NjYWxlID0gMS4xOyAgICAgICAgICAvLyDkuozlgI3pgJ/kuIvpnaLnmoTmqKHlnovliqjkvZzpgJ/njodcbiAgICAgICAgdGhpcy5iYXR0bGVfc3BlZWQgPSAxOyAgICAgICAgICAgICAgIC8vIOW9k+WJjeaImOaWl+mAn+eOhyzmnI3liqHnq6/pgJ/njodcblxuICAgICAgICB0aGlzLmJ1dHRvbl9saXN0X3BhbmVsX3RpbWUgPSAwOyAgICAgLy8g5YGH5oiY5paX6K+m5oOF6Z2i5p2/5YWz6Zet55qE5pe26Ze05oizXG4gICAgICAgIHRoaXMuZm9ybV9wYW5lbF90aW1lID0gMDsgICAgICAgICAgICAvLyDnnJ/miJjmlpflr7nmiJjpnaLmnb/lhbPpl63nmoTml7bpl7TmiLNcbiAgICAgICAgdGhpcy5pc19jbGVhciA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5yZXNldEluaXREYXRhKCk7XG4gICAgfSxcblxuICAgIC8vIOmHjeiuvuWIneWni+WMluaVsOaNrlxuICAgIHJlc2V0SW5pdERhdGE6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5teV9ncm91cCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8vIOaImOaWl+S4reaIkeiHquW3seeahOWIhue7hCzkuLvopoHljLrliIbmmK/lkKbmmK/lt7HmlrlcbiAgICAgICAgdGhpcy5pbml0X2ZpZ2h0X3N0YXR1cyA9IGZhbHNlOyAgICAgICAgIC8vIOaYr+WQpuaYr+WIneWni+WMlui/m+ipueasp+eahCzkuLvopoHmmK/lgZrov5vlnLpcbiAgICAgICAgdGhpcy5hbGl2ZV9udW0gPSAwICAgICAgICAgICAgICAgICAgICAgIC8vIOWtmOa0u+WNleS9jVxuICAgICAgICB0aGlzLmNyZWF0ZV9vdmVyX251bSA9IDAgICAgICAgICAgICAgICAgLy8g5bey57uP5Yib5bu65a6M5oiQ55qE5Y2V5L2N5pWw6YePXG4gICAgICAgIHRoaXMuc2tpbGxfcGxheXNfb3JkZXJfbGlzdCA9IFtdICAgICAgICAvLyDlvZPliY3mkq3mlL7liJfooahcbiAgICAgICAgdGhpcy5yb3VuZF9kYXRhX3RlbXAgPSB7fVxuICAgICAgICB0aGlzLm9yZGVyX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5yb3VuZF9kYXRhID0ge307XG4gICAgICAgIHRoaXMuY3VyX3JvdW5kX2RhdGEgPSB7fVxuICAgICAgICB0aGlzLmFjdG9yX3N1bSA9IDA7XG4gICAgICAgIHRoaXMuYWN0b3JfcGxheV9zdW0gPSAwO1xuICAgICAgICB0aGlzLmFjdF9wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNfcGxheV9yb3VuZF9zdGFydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cl9yb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dF9yb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmF0dGxlX2RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbWJhdF90eXBlID0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5OaWw7ICAvLyDlvZPliY3miJjmlpfnsbvlnotcbiAgICAgICAgdGhpcy5yZWFsX3JvbGVfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgLy8g55yf5piv5oiY5paX5Y2V5L2N5YiX6KGoXG4gICAgICAgIHRoaXMuY3VyX2ZpZ2h0X3R5cGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjeaImOaWl+exu+WeiyzlpoLmnpzmmK8wOuayoeacieaImOaWlyAxOuWBh+aImOaWlyAyOuecn+aImOaWl1xuICAgICAgICB0aGlzLmJ1ZmZzID0ge307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDph43ov55idWZmXG4gICAgICAgIHRoaXMuaGFsbG93c19saXN0ID0ge307ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOelnuWZqOaVsOaNrlxuICAgICAgICB0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3QgPSB7fTsgICAgICAgICAgICAgICAvLyDlnLrmma9idWZm54m55pWI57yT5a2Y5a+56LGhXG4gICAgfSxcblxuICAgIC8vIOWIm+W7uuS4gOS4quWcuuaZr+eJueaViCzkuLvopoHmmK/nvqTmlLvkuYvnsbvnmoQs6L+Z57G754m55pWI5Zyo6YCA5Ye65oiY5paX55qE5pe25YCZ5Lya56e76Zmk5o6JXG4gICAgYWRkQmF0dGxlRWZmZmVjdDogZnVuY3Rpb24gKHBhcmVudCwgc2NlbmVfcG9zLCByZXZlcnNlLCBlZmZlY3RfaWQsIGFjdGlvbl9uYW1lKXtcbiAgICAgICAgdmFyIEJhdHRsZUVmZmVjdCA9IHJlcXVpcmUoXCJiYXR0bGVfZWZmZWN0XCIpO1xuICAgICAgICB2YXIgYmF0dGxlX2VmZmVjdCA9IG51bGw7XG4gICAgICAgIHZhciBlZmZlY3Rfa2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KGVmZmVjdF9pZCwgYWN0aW9uX25hbWUpXG5cbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX2VmZmVjdF9wb29sW2VmZmVjdF9rZXldICE9IG51bGwpe1xuICAgICAgICAgICAgaWYgKHRoaXMuYmF0dGxlX2VmZmVjdF9wb29sW2VmZmVjdF9rZXldLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmF0dGxlX2VmZmVjdCA9IHRoaXMuYmF0dGxlX2VmZmVjdF9wb29sW2VmZmVjdF9rZXldLnNoaWZ0KCk7ICAgICAgICAgIC8vIOS7juWktOWPluWHuuS4gOS4qlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKGJhdHRsZV9lZmZlY3QgPT0gbnVsbCl7XG4gICAgICAgICAgICBiYXR0bGVfZWZmZWN0ID0gbmV3IEJhdHRsZUVmZmVjdCgpO1xuICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5jcmVhdGVFZmZlY3QocGFyZW50LCBzY2VuZV9wb3MsIHJldmVyc2UsIGVmZmVjdF9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXR0bGVfZWZmZWN0LnJlc2V0U2NlbmVQb3Moc2NlbmVfcG9zKTtcbiAgICAgICAgICAgIGJhdHRsZV9lZmZlY3QucmVzZXRSZXZlcnNlKHJldmVyc2UpO1xuICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5zZXRUaW1lU2NhbGUodGhpcy5yb2xlX3RpbWVfc2NhbGUpO1xuICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5zZXRBY3RpdmVFZmZlY3QodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5iYXR0bGVfZWZmZWN0X2xpc3RbZWZmZWN0X2tleV0gPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9lZmZlY3RfbGlzdFtlZmZlY3Rfa2V5XSA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXR0bGVfZWZmZWN0X2xpc3RbZWZmZWN0X2tleV0ucHVzaChiYXR0bGVfZWZmZWN0KTtcbiAgICAgICAgcmV0dXJuIGJhdHRsZV9lZmZlY3Q7XG4gICAgfSxcblxuICAgIC8vIOenu+mZpOS4gOS4quWcuuaZr+aImOaWl+eJueaViFxuICAgIGRlbEJhdHRsZUVmZmVjdDpmdW5jdGlvbihiYXR0bGVfZWZmZWN0KXtcbiAgICAgICAgdmFyIGVmZmVjdF9rZXkgPSBiYXR0bGVfZWZmZWN0LmdldEVmZmVjdEtleSgpO1xuICAgICAgICBpZiAoZWZmZWN0X2tleSA9PSBcIl9cIikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5iYXR0bGVfZWZmZWN0X3Bvb2xbZWZmZWN0X2tleV0gPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9lZmZlY3RfcG9vbFtlZmZlY3Rfa2V5XSA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycmF5ID0gdGhpcy5iYXR0bGVfZWZmZWN0X2xpc3RbZWZmZWN0X2tleV07XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBiYXR0bGVfZWZmZWN0KXtcbiAgICAgICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIGJhdHRsZV9lZmZlY3Quc2V0QWN0aXZlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9lZmZlY3RfcG9vbFtlZmZlY3Rfa2V5XS5wdXNoKGJhdHRsZV9lZmZlY3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluS8pOWus+aVsOWtl+eahOe8k+WtmOe6ueeQhuaVsOaNrlxuICAgIGdldERtZ0ZvbnRDYWNoZU9iamVjdDpmdW5jdGlvbih0eXBlLCBjYWxsYmFjayl7XG4gICAgICAgIHZhciByZXNfcGF0aCA9IFBhdGhUb29sLmdldFBsaXN0UGF0aChcIm51bVwiLCBcInR5cGVcIiArIHR5cGUpO1xuICAgICAgICB2YXIgcmVzX29iamVjdCA9IHRoaXMuYmF0dGxlX2RtZ19jYWNoZV9saXN0W3Jlc19wYXRoXTtcbiAgICAgICAgaWYocmVzX29iamVjdCA9PSBudWxsKXtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHJlc19wYXRoLCBmdW5jdGlvbihyZXNfb2JqZWN0KXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9kbWdfY2FjaGVfbGlzdFtyZXNfcGF0aF0gPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc19vYmplY3QpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc19vYmplY3QpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmHiuaUvuaOieaImOaWl+i1hOa6kCzpgIDlh7rmiJjmlpflnLrmma/kuYvlkI7ph4rmlL7mjonlkKcs5L2G5piv6L+Z6YeM5Y+v6IO95a2Y5Zyo5LiA5Liq6Zeu6aKY5bCx5piv6YCA5Ye65oiY5paX5Zy65pmv5piv5Y2z5pe255qELOS9huaYr+S8pOWus+aVsOWtl+i/mOWcqOWkhOS6juWKqOS9nOS4rSzov5nkuKrml7blgJnov5jmmK/ph4rmlL7kuI3mjoks5oiY5paX6Im65pyv5a2X5LiN5piv54m55Yir5aSnLOaaguaXtuiAg+iZkeS4jea4hemZpFxuICAgIHJlbGVhc2VEbWdGb250OmZ1bmN0aW9uKCl7XG4gICAgICAgIGZvcih2YXIgcGF0aCBpbiB0aGlzLmJhdHRsZV9kbWdfY2FjaGVfbGlzdCl7XG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyhwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhdHRsZV9kbWdfY2FjaGVfbGlzdCA9IHt9O1xuICAgIH0sXG5cbiAgICAvLyDojrflj5bkuIDkuKrmma7pgJrmloflrZcu5bim6IOM5pmv55qELOaaguaXtumAgOWHuuaImOaWl+ayoeacieenu+mZpOWvueixoeaxoFxuICAgIGdldE5vcm1hbEZvbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHBvb2xzID0gdGhpcy5iYXR0bGVfcG9vbHMuZ2V0Rm9udFBvb2xzKCk7XG4gICAgICAgIHZhciBub2RlID0gbnVsbDtcbiAgICAgICAgaWYgKHBvb2xzLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgIG5vZGUgPSBwb29scy5nZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSk7XG4gICAgICAgICAgICBub2RlLndpZHRoID0gMTc2O1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSA0NDtcblxuICAgICAgICAgICAgdmFyIGJnX25vZGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgYmdfbm9kZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIG5vZGUuYWRkQ2hpbGQoYmdfbm9kZSk7XG5cbiAgICAgICAgICAgIHZhciBmb250X25vZGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdmFyIGZvbnRfbGFiZWwgPSBmb250X25vZGUuYWRkQ29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgICAgIGZvbnRfbGFiZWwubGluZUhlaWdodCA9IDIwO1xuICAgICAgICAgICAgZm9udF9sYWJlbC5mb250U2l6ZSA9IDIwO1xuICAgICAgICAgICAgZm9udF9ub2RlLmFkZENvbXBvbmVudChjYy5MYWJlbE91dGxpbmUpO1xuICAgICAgICAgICAgZm9udF9ub2RlLm5hbWUgPSBcImZvbnRfbGFiZWxcIjtcbiAgICAgICAgICAgIG5vZGUuYWRkQ2hpbGQoZm9udF9ub2RlKTtcblxuICAgICAgICAgICAgdmFyIGJnX3BhdGggPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiYmF0dGxlXCIsIFwiYmF0dGxlX2J1ZmZfbmFtZV9iZ1wiKTtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGJnX3BhdGgsIGZ1bmN0aW9uIChiZ19ub2RlLCByZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgYmdfbm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICB9LmJpbmQodGhpcywgYmdfbm9kZSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlm57mlLblr7nosaHmsaBcbiAgICAgKiBAcGFyYW0geyp9IGZvbnQgXG4gICAgICovXG4gICAgcHVzaEJhY2tCYXR0bGVGb250OiBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICB0aGlzLmJhdHRsZV9wb29scy5wdXNoQmFja0ZvbnQoZm9udClcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog55yf5piv5oiY5paX55qE5Yid5aeL5YyW5pWw5o2uLuaImOaWl+WNleS9jeWPr+iDveWtmOWcqGhw5Li6MOeahOaXtuWAmSzov5nkuKrml7blgJnpnIDopoHnibnmrorlpITnkIZcbiAgICAgKi9cbiAgICB1cGRhdGVDdXJCYXR0bGVEYXRhOmZ1bmN0aW9uKGRhdGEsIGlzX2luaXQpe1xuICAgICAgICB0aGlzLmRlbGV0ZUN1ckJhdHRsZURhdGEoKTtcblxuICAgICAgICB0aGlzLmluaXRfZmlnaHRfc3RhdHVzID0gaXNfaW5pdDsgICAgICAgIFxuICAgICAgICBpZiAodGhpcy5iYXR0bGVfZGF0YSA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2RhdGEgPSBuZXcgQmF0dGxlRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0dGxlX2RhdGEudXBkYXRlRGF0YShkYXRhKTtcblxuICAgICAgICAvLyDkv53lrZjmiJjmlpfpgJ/luqZcbiAgICAgICAgdGhpcy5zYXZlU3BlZWQoZGF0YS5wbGF5X3NwZWVkKTtcblxuICAgICAgICAvLyDmm7TmlrDnpZ7lmajmlbDmja5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEuaGFsbG93c19saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGEuaGFsbG93c19saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19saXN0W2VsZW1lbnQuZ3JvdXBdID0gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWFiOWIpOaWreWvueaImOWIl+ihqOS4reaYr+WQpuacieiHquW3seeahFxuICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xuICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuYmF0dGxlX2RhdGEuZmlnaHRfb2JqZWN0X2xpc3Qpe1xuICAgICAgICAgICAgdmFyIHJvbGVfZGF0YSA9IHRoaXMuYmF0dGxlX2RhdGEuZmlnaHRfb2JqZWN0X2xpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmIChVdGlscy5nZXROb3JLZXkocm9sZV9kYXRhLm93bmVyX2lkLCByb2xlX2RhdGEub3duZXJfc3J2X2lkKSA9PSBVdGlscy5nZXROb3JLZXkocm9sZV92by5yaWQsIHJvbGVfdm8uc3J2X2lkKSAmJiB0aGlzLm15X2dyb3VwID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm15X2dyb3VwID0gcm9sZV9kYXRhLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGVfZGF0YS5ocCA+IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuYWxpdmVfbnVtICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpITnkIbnpZ7lmajnmoRcbiAgICAgICAgICAgIGlmIChyb2xlX2RhdGEub2JqZWN0X3R5cGUgPT0gQmF0dGxlQ29uc3QuVW5pdF9UeXBlLkhhbGxvd3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGFsbG93c19kYXRhID0gdGhpcy5oYWxsb3dzX2xpc3Rbcm9sZV9kYXRhLmdyb3VwXTtcbiAgICAgICAgICAgICAgICBoYWxsb3dzX2RhdGEucG9zID0gcm9sZV9kYXRhLnBvcztcbiAgICAgICAgICAgICAgICByb2xlX2RhdGEuaGFsbG93c192YWwgPSBoYWxsb3dzX2RhdGEudmFsO1xuICAgICAgICAgICAgICAgIHJvbGVfZGF0YS5oYWxsb3dzX21heCA9IGhhbGxvd3NfZGF0YS5tYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5teV9ncm91cCA9PSAwKXtcbiAgICAgICAgICAgIHRoaXMubXlfZ3JvdXAgPSAxO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWIm+W7uuWujOaIkOS5i+WQjumAmuefpeacjeWKoeerr+WHhuWkh+aKpeS6hlxuICAgICAqL1xuICAgIGFkZFJlYWR5U3VtOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuY3JlYXRlX292ZXJfbnVtICs9IDE7XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZV9vdmVyX251bSA+PSB0aGlzLmFsaXZlX251bSl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLmNzUmVhZHlGaWdodFN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5omA5pyJ5oiY5paX5Y2V5L2NXG4gICAgZ2V0QWxsT2JqZWN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWxfcm9sZV9saXN0O1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7miJjmlpflnLrmma/lj6/op4HkuI7lkKZcbiAgICBoYW5kbGVCYXR0bGVTY2VuZVN0YXR1czpmdW5jdGlvbihzdGF0dXMpe1xuICAgICAgICBpZih0aGlzLmJhdHRsZV9zY2VuZSl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9zY2VuZS5jaGFuZ2VWaXNpYmxlKHN0YXR1cylcbiAgICAgICAgICAgIC8vIHRoaXMuYmF0dGxlX3NjZW5lLnNldFZpc2libGUoc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaYr+WQpuWcqOaImOaWl+S4rVxuICAgIGdldEZpZ2h0U3RhdHVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX3JlYWxfY29tYmF0O1xuICAgIH0sXG5cbiAgICAvLyDov5Tlm57miJjmlpflnLrmma9cbiAgICBnZXRCYXR0bGVTY2VuZTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5iYXR0bGVfc2NlbmU7XG4gICAgfSxcblxuICAgIC8vIOaYr+WQpuWcqOecn+aImOaWl+S4rVxuICAgIGlzSW5SZWFsQmF0dGxlOmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmlzX3JlYWxfY29tYmF0O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDliJvlu7rmiJjmlpflnLrmma8s6L+Z6YeM5piv5ZSv5LiA55qE5YWl5Y+jLOi/memHjOmcgOimgeWIpOaWreecn+WBh+aImOaWl+WIh+aNoiznrYlcbiAgICAgKiBAcGFyYW0geyp9IGluX2ZpZ2h0X3R5cGUgMDrmsqHmnInmiJjmlpcgMTrlgYfmiJjmlpcgMjrnnJ/miJjmlpdcbiAgICAgKi9cbiAgICBjcmVhdGVCYXR0bGVTY2VuZTpmdW5jdGlvbihpbl9maWdodF90eXBlLCBjb21iYXRfdHlwZSl7XG4gICAgICAgIC8vIOS4jeWQjOexu+eahOaImOaWl+aIluiAheS4jeWQjOexu+eahOaImOaWl+eKtuaAgeexu+Weiyzpg73muIXmjonljZXkvY1cbiAgICAgICAgaWYodGhpcy5jb21iYXRfdHlwZSAhPSBjb21iYXRfdHlwZSB8fCB0aGlzLmN1cl9maWdodF90eXBlICE9IGluX2ZpZ2h0X3R5cGUgfHwgaW5fZmlnaHRfdHlwZSA9PSAxKXsgIC8vIOWBh+aImOaWl+S5n+enu+mZpOaOieWNleS9jemHjeaWsOWIm+W7uuWQp1xuICAgICAgICAgICAgdGhpcy5jbGVhclJlYWxSb2xlKCk7XG4gICAgICAgICAgICB0aGlzLmhvb2tfbW9kZWwuY2xlYXJSZWFsUm9sZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tYmF0X3R5cGUgPSBjb21iYXRfdHlwZTsgICAgICAgICAvLyDlgqjlrZjlvZPliY3miJjmlpfnsbvlnotcbiAgICAgICAgdGhpcy5jdXJfZmlnaHRfdHlwZSA9IGluX2ZpZ2h0X3R5cGU7ICAgIC8vIOS/neWtmOW9k+WJjeS5i+aImOaWl+eKtuaAgeexu+Wei1xuICAgICAgICB0aGlzLmlzX3JlYWxfY29tYmF0ID0gKGluX2ZpZ2h0X3R5cGUgPT0gQmF0dGxlQ29uc3QuQmF0dGxlX0luX1R5cGUuUmVhbCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX3NjZW5lID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX3NjZW5lID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJiYXR0bGVfc2NlbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXR0bGVfc2NlbmUudXBkYXRlQmF0dGxlU2NlbmUodGhpcy5pc19yZWFsX2NvbWJhdCk7XG5cbiAgICAgICAgLy8g5Y+q5pyJ5Ymn5oOF5oiY5paX55qE5pe25YCZ5omN6ZyA6KaB5pi+56S65oiY5paXdWlcbiAgICAgICAgdmFyIGlzX3Nob3cgPSAoY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYSlcbiAgICAgICAgdGhpcy5vcGVuRHJhbWFGaWdodFVJKGlzX3Nob3cpO1xuXG4gICAgICAgIC8vIOWPquacieecn+aImOaWl+aJjemcgOimgeaYvuekulxuICAgICAgICB0aGlzLm9wZW5Gb3JtVmlld1VJKHRoaXMuaXNfcmVhbF9jb21iYXQsIGNvbWJhdF90eXBlKTtcbiAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5zZXRJc05vcm1hQmF0dGxlKHRoaXMuaXNfcmVhbF9jb21iYXQpO1xuXG4gICAgICAgIC8vIOi/memHjOaKiuS4u+Wfjuiuvue9ruS4jeWPr+ingVxuICAgICAgICByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5oYW5kbGVTY2VuZVN0YXR1cyhmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5pc19jbGVhciA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvLyDliafmg4XmiJjmlpfnmoR1aemDqOWIhlxuICAgIG9wZW5EcmFtYUZpZ2h0VUk6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYgKHRoaXMuc2hvd19maWdodF91aV9zdGF0dXMgPT0gc3RhdHVzICYmIHRoaXMuZmlnaHRfdWlfY29tYmF0ID09IHRoaXMuaXNfcmVhbF9jb21iYXQpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd19maWdodF91aV9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuZmlnaHRfdWlfY29tYmF0ID0gdGhpcy5pc19yZWFsX2NvbWJhdDtcbiAgICAgICAgXG4gICAgICAgIGlmICghc3RhdHVzKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyYW1hX2ZpZ2h0X3VpKXtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZpZ2h0X3VpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbl9saXN0X3BhbmVsX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhbWFfZmlnaHRfdWkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZmlnaHRfdWkgPSBVdGlscy5jcmVhdGVDbGFzcyhcImJhdHRsZV9idXR0b25fbGlzdF9wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgcGFydG5lciA9IFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2NlbmVOb2RlKFNDRU5FX1RBRy51aSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9maWdodF91aS5zZXRQYXJlbnQocGFydG5lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFtYV9maWdodF91aS5zaG93KHRoaXMuaXNfcmVhbF9jb21iYXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZmlnaHRfdWkuc2V0WkluZGV4KC0yKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYW1hX2ZpZ2h0X3VpLmlzX29uc2hvdyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYW1hX2ZpZ2h0X3VpLnNob3codGhpcy5pc19yZWFsX2NvbWJhdCk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZmlnaHRfdWkuY2hhbmdlQmF0dGxlU3RhdHVzKHRoaXMuaXNfcmVhbF9jb21iYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnV0dG9uX2xpc3RfcGFuZWxfdGltZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5zZXRJc05vcm1hQmF0dGxlKHRoaXMuaXNfcmVhbF9jb21iYXQpO1xuXG4gICAgICAgIHRoaXMuc3RhcnRDb3VudERvd25Ub0RlbGV0ZSgpO1xuICAgIH0sXG5cbiAgICAvLyDnnJ/miJjmlpfkuK3nmoTpmLXlnovku6Xlj4rlhbbku5bnm7jlhbPmmL7npLrpg6jliIZcbiAgICBvcGVuRm9ybVZpZXdVSTpmdW5jdGlvbihzdGF0dXMsIGNvbWJhdF90eXBlKXtcbiAgICAgICAgaWYoIXN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLmZvcm1fZmlnaHRfdWkpe1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9maWdodF91aS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX3BhbmVsX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybV9maWdodF91aSl7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnNob3coY29tYmF0X3R5cGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkgPSBVdGlscy5jcmVhdGVDbGFzcyhcImJhdHRsZV9mb3JtX3BhbmVsXCIpO1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0bmVyID0gVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRTY2VuZU5vZGUoU0NFTkVfVEFHLnVpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkuc2V0QW5jaG9yUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnNldFBvc2l0aW9uKC1wYXJ0bmVyLndpZHRoICogMC41LCAtcGFydG5lci5oZWlnaHQgKiAwLjUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnNldFBhcmVudChwYXJ0bmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkuc2hvdyhjb21iYXRfdHlwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnNldFpJbmRleCgtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvcm1fcGFuZWxfdGltZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydENvdW50RG93blRvRGVsZXRlKCk7XG4gICAgfSxcblxuICAgIC8vIOWFs+mXremdouadv+eahOWAkuiuoeaXtlxuICAgIHN0YXJ0Q291bnREb3duVG9EZWxldGU6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMuZm9ybV9wYW5lbF90aW1lID09IDAgJiYgdGhpcy5idXR0b25fbGlzdF9wYW5lbF90aW1lID09IDApe1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VfcGFuZWxfdGltZXIpe1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmNsb3NlX3BhbmVsX3RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlX3BhbmVsX3RpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZV9wYW5lbF90aW1lciA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlX3BhbmVsX3RpbWVyID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdERlbGV0ZVBhbmVsKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwLCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YCS6K6h5pe25YeG5aSH5riF5qWa6Z2i5p2/XG4gICAgd2FpdERlbGV0ZVBhbmVsOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLmZvcm1fcGFuZWxfdGltZSA9PSAwICYmIHRoaXMuYnV0dG9uX2xpc3RfcGFuZWxfdGltZSA9PSAwKXtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDb3VudERvd25Ub0RlbGV0ZSgpOyAgLy8g56e76Zmk5o6J5a6a5pe25ZmoXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYgKHRoaXMuYnV0dG9uX2xpc3RfcGFuZWxfdGltZSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1dHRvbl9wYXNzX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCkgLSB0aGlzLmJ1dHRvbl9saXN0X3BhbmVsX3RpbWU7XG4gICAgICAgICAgICAgICAgaWYgKGJ1dHRvbl9wYXNzX3RpbWUgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhbWFfZmlnaHRfdWkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZmlnaHRfdWkuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhbWFfZmlnaHRfdWkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uX2xpc3RfcGFuZWxfdGltZSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybV9wYW5lbF90aW1lICE9IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybV9wYXNzX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCkgLSB0aGlzLmZvcm1fcGFuZWxfdGltZTtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybV9wYXNzX3RpbWUgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybV9maWdodF91aSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9wYW5lbF90aW1lID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5byV5a+86ZyA6KaBXG4gICAgZ2V0RHJhbWFGaWdodFVJOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYW1hX2ZpZ2h0X3VpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJhbWFfZmlnaHRfdWkucm9vdF93bmQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDlvbvlupXnp7vpmaTkuIDkuKrmiJjmlpflnLrmma8s5q+U5aaC6K+05YiH5o2i5Ye65oiY5paXLOaIluiAhemdnuWJp+aDheaImOaWl+e7k+adnyzov5nkuKrnu5PmnZ9cbiAgICAgKi9cbiAgICBjbGVhckJhdHRsZVNjZW5lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zY2VuZSAmJiAhdGhpcy5pc19jbGVhcikge1xuICAgICAgICAgICAgLy8g5YWI56e76Zmk5o6J5Y2V5L2N5a6a5pe25ZmoXG4gICAgICAgICAgICB2YXIgcm9sZV9saXN0ID0gdGhpcy5nZXRBbGxCYXR0bGVSb2xlTGlzdCgpO1xuICAgICAgICAgICAgZm9yKHZhciBwb3MgaW4gcm9sZV9saXN0KXtcbiAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJhdHRhY2tlckFjdFRpbWVvdXRcIiArIHBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbWJhdF90eXBlID0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5OaWw7XG4gICAgICAgICAgICB0aGlzLmN1cl9maWdodF90eXBlID0gQmF0dGxlQ29uc3QuQmF0dGxlX0luX1R5cGUuTmlsOyAgICAgICAvLyDnp7vpmaTmjonmiJjmlpfnsbvlnotcbiAgICAgICAgICAgIHRoaXMuaXNfcmVhbF9jb21iYXQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaImOaWl1xuXG4gICAgICAgICAgICAvLyDmuIXmpZrmjonlnLrmma/ljZXkvY1cbiAgICAgICAgICAgIHRoaXMuY2xlYXJSZWFsUm9sZSgpO1xuICAgICAgICAgICAgdGhpcy5ob29rX21vZGVsLmNsZWFyUmVhbFJvbGUoKTsgICAgLy8g5YGH5oiY5paX5qih5Z6L6LWE5rqQXG5cbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX3NjZW5lLmRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9zY2VuZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMub3BlbkRyYW1hRmlnaHRVSShmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLm9wZW5Gb3JtVmlld1VJKGZhbHNlKTtcblxuICAgICAgICAgICAgLy8g56e76Zmk5o6J5omA5pyJ55qE5oiY5paX54m55pWILS0s576k5pS757G75ZKM5a2Q5by557G7XG4gICAgICAgICAgICB0aGlzLmNsZWFuQWxsQmF0dGxlRWZmZWN0KCk7XG5cbiAgICAgICAgICAgIC8vIOenu+mZpOecn+WunuaImOaWl+WcuuaZr+eahOaVsOaNrlxuICAgICAgICAgICAgdGhpcy5kZWxldGVDdXJCYXR0bGVEYXRhKCk7XG5cbiAgICAgICAgICAgIC8vIOi/memHjOWIh+WbnuS4u+Wfjumfs+S5kFxuICAgICAgICAgICAgVXRpbHMucGxheU11c2ljKEFVRElPX1RZUEUuU0NFTkUsIFwic18wMDJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmlzX2NsZWFyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmuIXnqbrmiYDmnInnmoTlnLrmma/miJjmlpfnibnmlYhcbiAgICBjbGVhbkFsbEJhdHRsZUVmZmVjdDpmdW5jdGlvbigpe1xuICAgICAgICAvLyDlm57mlLbmjonlnLrmma/nibnmlYjotYTmupBcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuYmF0dGxlX2VmZmVjdF9saXN0KSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmJhdHRsZV9lZmZlY3RfbGlzdFtrZXldXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRlbGVFZmZlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhdHRsZV9lZmZlY3RfbGlzdCA9IHt9O1xuXG4gICAgICAgIC8vIOWbnuaUtuaOieWcuuaZr+eJueaViOi1hOa6kFxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5iYXR0bGVfZWZmZWN0X3Bvb2wpIHtcbiAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMuYmF0dGxlX2VmZmVjdF9wb29sW2tleV1cbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGVsZUVmZmVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0dGxlX2VmZmVjdF9wb29sID0ge307XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWBh+aImOaWl+WumuW4p+enu+WKqOWcsOWbvuWkhOeQhiznjrDlnKjljbjovb1nYW1lc3RhcnQg55qEdXBkYXRl6YeM6Z2iXG4gICAgICovXG4gICAgbWFwTW92ZXNjaGVkdWxlVXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zY2VuZSkge1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfc2NlbmUubWFwTW92ZXNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5YiH5o2i5oiY5paX56e75Yqo54q25oCBLOavlOWmguecn+WunuWJp+aDheaImOaWl+WIh+aNouWIsOWBh+aImOaWl+eahOaXtuWAmSzlsLHpnIDopoHlvIDlkK/lnLDlm77np7vliqhcbiAgICAgKiBAcGFyYW0geyp9IHN0YXR1cyBCb29sXG4gICAgICovXG4gICAgY2hhbmdlTW92ZU1hcFN0YXR1czogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5iYXR0bGVfc2NlbmUpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX3NjZW5lLmNoYW5nZU1vdmVNYXBTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDov5vlhaXnnJ/lrp7miJjmlpfml7Ys5piv5ZCm6ZyA6KaB5pKt5pS+6L+b5Zy65Yqo5L2cLOS4remAlOWIh+i/m+WOu+eahOS4jemcgOimgeWkhOeQhizov5nkuKrlgLzpkojlr7nliJ3lp4vljJbljZXkvY3nmoTml7blgJnpnIDopoEs5oiY5paX5Yib5bu65LiA5Liq5Y2V5L2N5LiN6ZyA6KaBXG4gICAgICovXG4gICAgbmVlZFBsYXlFbnRlckFjdGlvbjpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0X2ZpZ2h0X3N0YXR1cztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog55yf5a6e5oiY5paX5Lit55qE5Y2V5L2N5piv5ZCm5piv5Y+L5pa55Yik5patXG4gICAgICogQHBhcmFtIHsqfSBncm91cCBCYXR0bGVSb2xlRGF0YS5ncm91cFxuICAgICAqL1xuICAgIGlzRnJpZW5kOmZ1bmN0aW9uKGdyb3VwKXtcbiAgICAgICAgcmV0dXJuIChncm91cCA9PSB0aGlzLm15X2dyb3VwKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5b2T5YmN55yf5a6e5oiY5paX55qE5Yid5aeL5YyW5pWw5o2uXG4gICAgICovXG4gICAgZ2V0Q3VyQmF0dGxlRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5iYXR0bGVfZGF0YTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5b2T5YmN5oiY5paX57G75Z6LXG4gICAgZ2V0Q29tYmF0VHlwZTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5jb21iYXRfdHlwZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6YCA5Ye65oiY5paXLOa4heepuuaImOaWl+aVsOaNrizpkojlr7nnnJ/lrp7miJjmlpdcbiAgICAgKi9cbiAgICBkZWxldGVDdXJCYXR0bGVEYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucmVzZXRJbml0RGF0YSgpO1xuICAgIH0sXG5cbiAgICAvLyDliKTmlq3mmK/lkKblj6/ku6XmlLnlj5jmiJjmlpfpgJ/luqZcbiAgICBjaGVja0lzQ2FuQ2hhbmdlQmF0dGxlU3BlZWQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5iYXR0bGVfZGF0YSA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV4dF9zcGVlZCA9IDE7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zcGVlZCA9PSAxKXtcbiAgICAgICAgICAgIG5leHRfc3BlZWQgPSAyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzcGVlZF9jb25maWcgPSBDb25maWcuY29tYmF0X3R5cGVfZGF0YS5kYXRhX2NvbWJhdF9zcGVlZFtuZXh0X3NwZWVkXTtcbiAgICAgICAgaWYgKHNwZWVkX2NvbmZpZyA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcm9sZV92byA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgaWYgKHJvbGVfdm8gPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWVkX2NvbmZpZy5saW1pdF9sZXYgPiByb2xlX3ZvLmxldiAmJiBzcGVlZF9jb25maWcubGltaXRfdmlwX2xldiA+IHJvbGVfdm8udmlwX2xldil7XG4gICAgICAgICAgICB2YXIgZGVzYyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuetiee6p+i+vuWIsCVz57qn5oiWVklQJXPlvIDlkK9cIiksIHNwZWVkX2NvbmZpZy5saW1pdF9sZXYsIHNwZWVkX2NvbmZpZy5saW1pdF92aXBfbGV2KTtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGVzYyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpZ2h0X2NvbmZpZyA9IENvbmZpZy5jb21iYXRfdHlwZV9kYXRhLmRhdGFfZmlnaHRfbGlzdFt0aGlzLmJhdHRsZV9kYXRhLmNvbWJhdF90eXBlXTtcbiAgICAgICAgaWYoZmlnaHRfY29uZmlnID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWdodF9jb25maWcuaXNfcHZwID09IDEpe1xuICAgICAgICAgICAgbWVzc2FnZShjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+S4jeiDveabtOaUuemAn+W6plwiKSwgZmlnaHRfY29uZmlnLmRlc2MpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5L+u5pS55LiA5LiL5b2T5YmN5oiY5paX6YCf5bqmXG4gICAgICovXG4gICAgY2hhbmdlU3BlZWQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX3NwZWVkID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVNwZWVkKDIpO1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5jc0ZpZ2h0U3BlZWQoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVTcGVlZCgxKTtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuY3NGaWdodFNwZWVkKDEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOW9k+WJjeaImOaWl+mAn+W6plxuICAgICAqL1xuICAgIGdldFRpbWVTY2FsZTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgdGltZV9zY2FsZSA9IDFcbiAgICAgICAgaWYgKHRoaXMuaXNJblJlYWxCYXR0bGUoKSA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRpbWVfc2NhbGUgPSB0aGlzLnJvbGVfdGltZV9zY2FsZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aW1lX3NjYWxlID0gMS41XG4gICAgICAgIC8vIOimgeagueaNruW9k+WJjeW4p+mikeiwg+aVtOaSreaUvumAn+W6plxuICAgICAgICByZXR1cm4gdGltZV9zY2FsZVxuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvZPliY3liqjkvZzpgJ/luqZcbiAgICBzZXRCYXR0bGVUaW1lU2NhbGU6IGZ1bmN0aW9uIChpc19yZXNldCkge1xuICAgICAgICBpZih0aGlzLmJhdHRsZV90aW1lX3N0YXR1cyA9PSBpc19yZXNldCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhdHRsZV90aW1lX3N0YXR1cyA9IGlzX3Jlc2V0O1xuICAgICAgICB2YXIgYmFzZV9jb25maWcgPSBudWxsO1xuICAgICAgICBpZiAoaXNfcmVzZXQgPT0gdHJ1ZSl7ICAgICAgLy8g6L+Z5Liq5pe25YCZ5pivMeWAjemAn1xuICAgICAgICAgICAgYmFzZV9jb25maWcgPSBDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmJhc2Vfc3BlZWRfc2NhbGU7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgYmFzZV9jb25maWcgPSBDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLnNwZWVkX3NjYWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGJhc2VfY29uZmlnKXtcbiAgICAgICAgICAgIHRoaXMucm9sZV90aW1lX3NjYWxlID0gYmFzZV9jb25maWcudmFsICogMC4wMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFJvbGVUaW1lU2NhbGUoKTtcbiAgICB9LFxuXG4gICAgLy8g5L+d5a2Y6YCf546H5LmL5ZCO6ams5LiK6K6+572u5qih5Z6L5Yqo5L2cXG4gICAgc2V0Um9sZVRpbWVTY2FsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLnJlYWxfcm9sZV9saXN0KXtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMucmVhbF9yb2xlX2xpc3Qpe1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB0aGlzLnJlYWxfcm9sZV9saXN0W2tleV07XG4gICAgICAgICAgICAgICAgaWYob2JqZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFRpbWVTY2FsZSh0aGlzLnJvbGVfdGltZV9zY2FsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g6K6+572u5Zy65pmv54m55pWIXG4gICAgICAgIGlmKHRoaXMuYmF0dGxlX2VmZmVjdF9saXN0KXtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuYmF0dGxlX2VmZmVjdF9saXN0KXtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmJhdHRsZV9lZmZlY3RfbGlzdFtrZXldXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldFRpbWVTY2FsZSh0aGlzLnJvbGVfdGltZV9zY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5L+d5a2Y5b2T5YmN5oiY5paX6YCf5bqmLOi/meS4qumAn+W6puWPquaYr+S4uuS6huaUueWPmOaYvuekulxuICAgIHNhdmVTcGVlZDogZnVuY3Rpb24gKHNwZWVkKSB7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zcGVlZCA9PSBzcGVlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmJhdHRsZV9zcGVlZCA9IHNwZWVkO1xuICAgICAgICBpZih0aGlzLmZvcm1fZmlnaHRfdWkpe1xuICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnNldFNwZWVkKHNwZWVkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5blvZPliY3pgJ/luqZcbiAgICBnZXRTcGVlZDpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5iYXR0bGVfc3BlZWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOS4gOS4quWbnuWQiOaSreaKpeeahOWKqOS9nOiuoeaVsCzmnIDlkI7kv53or4HlgLzkuLow5bCx6KGo56S65pKt5a6M5LqG5b2T5YmN5Yqo5L2cXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKi9cbiAgICBhY3RTdGFydDpmdW5jdGlvbihhdHRhY2tlcil7XG4gICAgICAgIC8vIOWmguaenOe7k+eul+mdouadv+W3sue7j+WHuuadpeS6hizlsLHkuI3pnIDopoHmkq3miqXkuoZcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRJc1JpZ2h0RmlnaHQoYXR0YWNrZXIpID09IHRydWUpe1xuICAgICAgICAgICAgYXR0YWNrZXIud2FpdF9hY3QgKz0gMTtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChcImF0dGFja2VyQWN0VGltZW91dFwiICsgYXR0YWNrZXIucG9zKTtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0VGltZW91dChhdHRhY2tlcilcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDMwMDAsIDEsIFwiYXR0YWNrZXJBY3RUaW1lb3V0XCIgKyBhdHRhY2tlci5wb3MpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5p+Q5LiA5Liq5Yqo5L2c5pKt5pS+5a6M5oiQ5LmL5ZCOLOiuoeaVsCAtMSzlvZPkuLow55qE5pe25YCZLOWwseihqOekuuW9k+WJjeWwj+WbnuWQiOaSreaKpee7k+adn1xuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICovXG4gICAgYWN0RmluaXNoOmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRJc1JpZ2h0RmlnaHQoYXR0YWNrZXIpID09IHRydWUpe1xuICAgICAgICAgICAgaWYgKGF0dGFja2VyLndhaXRfYWN0ID4gMCkge1xuICAgICAgICAgICAgICAgIGF0dGFja2VyLndhaXRfYWN0IC09IDE7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGFja2VyLndhaXRfYWN0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFja2VyLmlzX3JlYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheU9yZGVyKGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChcImF0dGFja2VyQWN0VGltZW91dFwiICsgYXR0YWNrZXIucG9zKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaG9va19tb2RlbC5wbGF5T3JkZXIoYXR0YWNrZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICog5Yik5pat5piv6YO95piv5q2j5byP5oiY5paXXG4gICAgKlxuICAgICovXG4gICAgY2hlY2tvdXRJc1JpZ2h0RmlnaHQ6ZnVuY3Rpb24oYXR0YWNrZXIpe1xuICAgICAgICBpZihhdHRhY2tlci5pc19yZWFsID09IHRydWUpe1xuICAgICAgICAgICAgaWYodGhpcy5iYXR0bGVfZGF0YSAmJiB0aGlzLmN1cl9yb3VuZF9kYXRhICYmIHRoaXMuYmF0dGxlX2RhdGEuY29tYmF0X3R5cGUgPT0gdGhpcy5jdXJfcm91bmRfZGF0YS5jb21iYXRfdHlwZSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdmFyIGJhdHRsZV9kYXRhID0gdGhpcy5ob29rX21vZGVsLmdldFVucmVhbEJhdHRsZURhdGEoKTtcbiAgICAgICAgICAgIGlmKGJhdHRsZV9kYXRhICYmIGJhdHRsZV9kYXRhLmNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5bCP5Zue5ZCI5pKt5oql6LaF5pe25aSE55CGXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKi9cbiAgICBhY3RUaW1lb3V0OmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYoYXR0YWNrZXIgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBhdHRhY2tlci53YWl0X2FjdCA9IDE7XG4gICAgICAgIHRoaXMuYWN0RmluaXNoKGF0dGFja2VyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Zue5ZCI5byA5aeL55qE5pKt5oqlLOWMheaLrOermeS9jeeahOWIneWni+WMluetiSzlm6DkuLrmnInkuIDkupvmmK/pnIDopoHlnKjlm57lkIjlvIDlp4vnmoTml7blgJnmkq3mlL7nmoTmkq3miqUgIOWMheWQq+WbnuWQiOW8gOWni+eahGJ1ZmZcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEg5Y2P6K6uIDIwMDAyIOeahOaVsOaNrlxuICAgICAqL1xuICAgIHBsYXlSb3VuZFN0YXJ0OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZiAodGhpcy5nZXRCYXR0bGVTY2VuZSgpID09IG51bGwgfHwgdGhpcy5iYXR0bGVfZGF0YSA9PSBudWxsIHx8IHRoaXMuYmF0dGxlX2RhdGEuY29tYmF0X3R5cGUgIT0gZGF0YS5jb21iYXRfdHlwZSl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc19wbGF5X3JvdW5kX3N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgLy8g5aSE55CG5Zue5ZCIYnVmZlxuICAgICAgICB0aGlzLmRlYWxSb3VuZEJ1ZmYoZGF0YS5yb3VuZF9idWZmKTtcblxuICAgICAgICAvLyDlpITnkIbnpZ7lmajnmoTlm57lkIjov5vluqZcbiAgICAgICAgaWYoZGF0YSAmJiBkYXRhLmhhbGxvd3NfbGlzdCl7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5oYWxsb3dzX2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGEuaGFsbG93c19saXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZihlbGVtZW50KXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbGxvd3MgPSB0aGlzLmhhbGxvd3NfbGlzdFtlbGVtZW50Lmdyb3VwXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbGxvd3MgJiYgaGFsbG93cy5wb3Mpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvbGUgPSB0aGlzLnJlYWxfcm9sZV9saXN0W2hhbGxvd3MucG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb2xlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnNldEhhbGxvd3NSb3VuZChlbGVtZW50LnZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Zue5ZCI5byA5aeL5Lmf5aSE55CG5o6J6YKj5Lqb5YGH5q2755qE5qih5Z6LXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEuYWxsX2FsaXZlKXtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmFsbF9hbGl2ZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YS5hbGxfYWxpdmVbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KXtcbiAgICAgICAgICAgICAgICAgICAgdGVtcF9saXN0W2VsZW1lbnQucG9zXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5yZWFsX3JvbGVfbGlzdCl7XG4gICAgICAgICAgICAgICAgaWYgKCAhdGVtcF9saXN0W2tleV0pe1xuICAgICAgICAgICAgICAgICAgICB2YXIgcm9sZSA9IHRoaXMucmVhbF9yb2xlX2xpc3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgJiYgIXJvbGUuaXNfZGllICYmIHJvbGUucm9sZV9kYXRhICYmIHJvbGUucm9sZV9kYXRhLm9iamVjdF90eXBlICE9IEJhdHRsZUNvbnN0LlVuaXRfVHlwZS5IYWxsb3dzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuZG9EaWVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rKh5pyJ5oqA6IO95pKt5oql5YiX6KGoLOebtOaOpemAmuefpeacjeWKoeerr+e7k+adn1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEuc2tpbGxfcGxheXMubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5jc1JvdW5kRmlnaHRFbmQoKTtcbiAgICAgICAgICAgIC8vIOWIneWni+WMluS9jee9ruWxgue6p+etieebuOWFs+S/oeaBr1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQbGF5Um91bmRTdGFydChkYXRhKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmFkZFJvdW5kRGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb3JtX2ZpZ2h0X3VpKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkudXBkYXRlUm91bmQoZGF0YS5hY3Rpb25fY291bnQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOato+W4uOWbnuWQiOaSreaKpSzlm57lkIjlvIDlp4vmkq3miqXnu5PmnZ/kuYvlkI4s6L+b5YWl5q2j5bi45Zue5ZCI5pKt5oqlIOWMheWQq+WbnuWQiOe7k+adn2J1ZmblkozmlYjmnpzmkq3miqXnmoRidWZmXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIOWNj+iuriAyMDAwNCDnmoTmlbDmja5cbiAgICAgKi9cbiAgICBwbGF5Um91bmRJbjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5pc19wbGF5X3JvdW5kX3N0YXJ0ID0gZmFsc2VcbiAgICAgICAgLy8g5Zue5ZCI57uT5p2f5ZCO55qEYnVmZuWPr+iDvemcgOimgeWkhOeQhueahFxuICAgICAgICBpZiAoZGF0YS5yb3VuZF9idWZmICYmIGRhdGEucm91bmRfYnVmZi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdF9hZnRlcl9idWZmX2xpc3QgPSBkYXRhLnJvdW5kX2J1ZmY7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5hY3RfYWZ0ZXJfYnVmZl9saXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFJvdW5kRGF0YShkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8g5pu05pawYnVmZlxuICAgIHNldEJ1ZmZzTGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5idWZmcyA9IGRhdGFcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pu05paw5LiL5LiA5rOi5oCq54mp55qE5pWw5o2uXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFxuICAgICAqL1xuICAgIHVwRGF0ZU5leHRNb246ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIGlmKHRoaXMucmVhbF9yb2xlX2xpc3QgPT0gbnVsbCB8fCBkYXRhID09IG51bGwpIHJldHVybjtcbiAgICAgICAgLy8g5riF5o6J5LiK5LiA5Zue5ZCI55qE5q275Lqh5a+56LGhXG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMucmVhbF9yb2xlX2xpc3Qpe1xuICAgICAgICAgICAgdmFyIHJvbGUgPSB0aGlzLnJlYWxfcm9sZV9saXN0W2tleV07XG4gICAgICAgICAgICBpZiAocm9sZSAmJiByb2xlLmlzX2RpZSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByb2xlLmRlbGV0ZVJvbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWxfcm9sZV9saXN0W2tleV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QnVmZnNMaXN0KGRhdGEuYnVmZnMpO1xuICAgICAgICBpZih0aGlzLmdldEJhdHRsZVNjZW5lKCkpe1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEub2JqZWN0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZGF0YS5vYmplY3RzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgcm9sZSA9IHRoaXMucmVhbF9yb2xlX2xpc3RbZWxlbWVudC5wb3NdXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNGcmllbmQoZWxlbWVudC5ncm91cCkgJiYgcm9sZSl7XG4gICAgICAgICAgICAgICAgICAgIHJvbGUudXBkYXRhTmV4dEJhdHRsZVJvbGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUm9sZShlbGVtZW50LCB0cnVlLCBudWxsLCB0cnVlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOabtOaWsOaImOaWl+WfuuacrOaVsOaNrlxuICAgICAgICBpZih0aGlzLmJhdHRsZV9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2RhdGEudXBkYXRlRGF0YShkYXRhKVxuXG4gICAgICAgICAgICBpZih0aGlzLmZvcm1fZmlnaHRfdWkpe1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9maWdodF91aS51cGRhdGVCYXNlSW5mbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKmFkZFJlQ29ubmVjdFJlYWR5U3VtXG4gICAgICogXG4gICAgICog5aSE55CG5Zue5ZCI5byA5aeL55qE5pWw5o2uXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIOWNj+iuriAyMDAwMiDnmoTmlbDmja5cbiAgICAgKi9cbiAgICBoYW5kbGVQbGF5Um91bmRTdGFydDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX2RhdGEgPT0gbnVsbCB8fCB0aGlzLmJhdHRsZV9kYXRhLmNvbWJhdF90eXBlICE9IGRhdGEuY29tYmF0X3R5cGUpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zY2VuZSA9PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgICB0aGlzLnJlc2V0QmF0dGxlUm9sZUJhc2VJbmZvKCk7XG4gICAgfSxcblxuICAgIC8vIOWkhOeQhuWbnuWQiGJ1ZmZcbiAgICBkZWFsUm91bmRCdWZmOiBmdW5jdGlvbihidWZmX2xpc3QsIGF0dGFja2VyKXtcbiAgICAgICAgaWYgKGJ1ZmZfbGlzdCA9PSBudWxsIHx8IGJ1ZmZfbGlzdC5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYnVmZl9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGJ1ZmZfbGlzdFtpbmRleF07XG4gICAgICAgICAgICB2YXIgYmF0dGxlX3JvbGUgPSB0aGlzLnJlYWxfcm9sZV9saXN0W2VsZW1lbnQudGFyZ2V0XTtcbiAgICAgICAgICAgIHZhciBidWZmX2NvbmZpZyA9IENvbmZpZy5za2lsbF9kYXRhLmRhdGFfZ2V0X2J1ZmZbZWxlbWVudC5idWZmX2JpZF07XG4gICAgICAgICAgICBpZiAoYmF0dGxlX3JvbGUgJiYgYnVmZl9jb25maWcpe1xuICAgICAgICAgICAgICAgIHRoaXMucGxheVJvdW5kQnVmZihiYXR0bGVfcm9sZSwgZWxlbWVudCwgYXR0YWNrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWbnuWQiOS4reeahOaSreaKpSzov5nkuKrmmK/mkq3miqXnmoTkuLvlhaXlj6NcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEg5Y2P6K6uIDIwMDA0IOeahOaVsOaNriBcbiAgICAgKi9cbiAgICBhZGRSb3VuZERhdGE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEJhdHRsZVNjZW5lKCkgPT0gbnVsbCB8fCB0aGlzLmJhdHRsZV9kYXRhID09IG51bGwgfHwgdGhpcy5iYXR0bGVfZGF0YS5jb21iYXRfdHlwZSAhPSBkYXRhLmNvbWJhdF90eXBlKXsgXG4gICAgICAgICAgICByZXR1cm47IFxuICAgICAgICB9XG4gICAgICAgIC8vIOabtOaWsOW9k+WJjeWbnuWQiOaVsFxuICAgICAgICBpZiAodGhpcy5mb3JtX2ZpZ2h0X3VpICYmIGRhdGEuYWN0aW9uX2NvdW50KSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkudXBkYXRlUm91bmQoZGF0YS5hY3Rpb25fY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5pKt5oql5pWw5o2uXG4gICAgICAgIHRoaXMuY3VyX3JvdW5kID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X3JvdW5kID0gbnVsbDtcblxuICAgICAgICB0aGlzLmN1cl9yb3VuZF9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5za2lsbF9wbGF5c19vcmRlcl9saXN0ID0gW107XG4gICAgICAgIHRoaXMucm91bmRfZGF0YV90ZW1wID0ge307XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybV9maWdodF91aSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtX2ZpZ2h0X3VpLnVwZGF0ZVJvdW5kKGRhdGEuYWN0aW9uX2NvdW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmioDog73mkq3miqXmlbDmja4sIOino+aekOaKgOiDveaVsOaNrlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRhdGEuc2tpbGxfcGxheXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNraWxsX2VsZW1lbnQgPSBkYXRhLnNraWxsX3BsYXlzW2pdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBza2lsbF9lbGVtZW50LmVmZmVjdF9wbGF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X2VsZW1lbnQgPSBza2lsbF9lbGVtZW50LmVmZmVjdF9wbGF5W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kX2RhdGFfdGVtcFtza2lsbF9lbGVtZW50Lm9yZGVyXSA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3VuZF9kYXRhX3RlbXBbc2tpbGxfZWxlbWVudC5vcmRlcl0gPSBbXVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraWxsX3BsYXlzX29yZGVyX2xpc3QucHVzaCh7IHNraWxsX29yZGVyOiBza2lsbF9lbGVtZW50Lm9yZGVyLCBwcmlvcml0eTogc2tpbGxfZWxlbWVudC5vcmRlciAqIDEwMDAgKyBqfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWZmZWN0X2VsZW1lbnQuc2tpbGxfYmlkID0gZWZmZWN0X2VsZW1lbnQuc2tpbGxfYmlkX29mX2VmZmVjdFxuICAgICAgICAgICAgICAgIGVmZmVjdF9lbGVtZW50LnRhbGtfcG9zID0gc2tpbGxfZWxlbWVudC50YWxrX3Bvc1xuICAgICAgICAgICAgICAgIGVmZmVjdF9lbGVtZW50LnRhbGtfY29udGVudCA9IHNraWxsX2VsZW1lbnQudGFsa19jb250ZW50XG4gICAgICAgICAgICAgICAgZWZmZWN0X2VsZW1lbnQuaW5kZXggPSBpXG4gICAgICAgICAgICAgICAgZWZmZWN0X2VsZW1lbnQuc2tpbGxfb3JkZXIgPSBza2lsbF9lbGVtZW50Lm9yZGVyXG4gICAgICAgICAgICAgICAgZWZmZWN0X2VsZW1lbnQucHJpb3JpdHkgPSBlZmZlY3RfZWxlbWVudC5vcmRlciAqIDEwMDAwICsgaiAqIDEwMCArIGlcblxuICAgICAgICAgICAgICAgIHRoaXMucm91bmRfZGF0YV90ZW1wW3NraWxsX2VsZW1lbnQub3JkZXJdLnB1c2goZWZmZWN0X2VsZW1lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5a+55Ye65omL6L+b6KGM5o6S5bqPXG4gICAgICAgIHRoaXMuc2tpbGxfcGxheXNfb3JkZXJfbGlzdC5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5IDtcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBjYy5sb2coXCJISEhISEhISEhISEhISEhISEhISEhcIik7XG4gICAgICAgIC8vIGNjLmxvZyh0aGlzLnNraWxsX3BsYXlzX29yZGVyX2xpc3QpO1xuXG4gICAgICAgIHRoaXMucHJlbG9hZEJhdHRsZVJlcyhkYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZVRlbXBSb3VuZERhdGEoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgIH0sXG5cbiAgICAvLyDliIbmnpDlvZPliY3mkq3miqXmlbDmja5cbiAgICBhbmFseXNlVGVtcFJvdW5kRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm9yZGVyX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5yb3VuZF9kYXRhID0ge307XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnJvdW5kX2RhdGFfdGVtcCkubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5za2lsbF9wbGF5c19vcmRlcl9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNraWxsX3BsYXlzX29yZGVyX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLnJvdW5kX2RhdGFfdGVtcFtlbGVtZW50LnNraWxsX29yZGVyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25lX3RlbXAgPSB0ZW1wW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3VuZF9kYXRhW29uZV90ZW1wLm9yZGVyXSA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91bmRfZGF0YVtvbmVfdGVtcC5vcmRlcl0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZXJfbGlzdC5wdXNoKHtvcmRlcjpvbmVfdGVtcC5vcmRlciwgcHJpb3JpdHk6b25lX3RlbXAucHJpb3JpdHl9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3VuZF9kYXRhW29uZV90ZW1wLm9yZGVyXVtvbmVfdGVtcC5hY3Rvcl0gPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdW5kX2RhdGFbb25lX3RlbXAub3JkZXJdW29uZV90ZW1wLmFjdG9yXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogb25lX3RlbXAub3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0b3I6IG9uZV90ZW1wLmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWxsX2JpZDogb25lX3RlbXAuc2tpbGxfYmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGtfY29udGVudDogb25lX3RlbXAudGFsa19jb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbGtfcG9zOiBvbmVfdGVtcC50YWxrX3BvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogb25lX3RlbXAuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xpc3Q6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5yb3VuZF9kYXRhW29uZV90ZW1wLm9yZGVyXVtvbmVfdGVtcC5hY3Rvcl07XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC50YXJnZXRfbGlzdC5wdXNoKG9uZV90ZW1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlr7nlh7rllK7mg4rphpLmjpLluo9cbiAgICAgICAgICAgIHRoaXMub3JkZXJfbGlzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMucm91bmRfZGF0YV90ZW1wID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYy5sb2coXCLlh7rllK7pobrluo9ISEhISFwiKTtcbiAgICAgICAgLy8gY2MubG9nKFV0aWxzLmRlZXBDb3B5KHRoaXMub3JkZXJfbGlzdCkpO1xuICAgICAgICAvLyBjYy5sb2coVXRpbHMuZGVlcENvcHkodGhpcy5yb3VuZF9kYXRhKSk7XG5cbiAgICAgICAgdGhpcy5yb3VuZCgpO1xuICAgIH0sXG5cbiAgICAvLyDlm57lkIjmkq3miqVcbiAgICByb3VuZDpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5yb3VuZF9udW0gJiYgdGhpcy5yb3VuZF9udW0gPiAwKSByZXR1cm47XG4gICAgICAgIHRoaXMucm91bmRfbnVtID0gMFxuICAgICAgICB0aGlzLmFjdG9yX3N1bSA9IDA7XG4gICAgICAgIHRoaXMuYWN0b3JfcGxheV9zdW0gPSAwO1xuICAgICAgICB0aGlzLmN1cl9yb3VuZCA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dF9yb3VuZCA9IG51bGw7XG5cbiAgICAgICAgLy8g5Zue5ZCI5pKt5oql5LmL5YmN6YeN572u5o6J5omA5pyJ5Y2V5L2N5Y+X5Ye754q25oCBXG4gICAgICAgIGlmKHRoaXMuYmF0dGxlX3NjZW5lKXtcbiAgICAgICAgICAgIHZhciByb2xlX2xpc3QgPSB0aGlzLmdldEFsbEJhdHRsZVJvbGVMaXN0KCk7XG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiByb2xlX2xpc3Qpe1xuICAgICAgICAgICAgICAgIHZhciByb2xlID0gcm9sZV9saXN0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZS5kbWdfaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICByb2xlLmRtZ19haWRfeV9vZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgICAgICByb2xlLmlzX2h1cnRfcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByb2xlLmlzX2JpZ19wbGF5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3JkZXJfbGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICB0aGlzLmNhbmNsZUJsYWNrU2NyZWVuKCk7XG4gICAgICAgICAgICAvLyDlm57lkIjlkI7nmoRidWZm5aSE55CGXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RfYWZ0ZXJfYnVmZl9saXN0ICYmIHRoaXMuYWN0X2FmdGVyX2J1ZmZfbGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYWxSb3VuZEJ1ZmYodGhpcy5hY3RfYWZ0ZXJfYnVmZl9saXN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdF9hZnRlcl9idWZmX2xpc3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6YeN572u5LiA5Lqb54q25oCBLOWPr+iDveaYr+S4gOS6m+aVsOWAvOexu+eahFxuICAgICAgICAgICAgaWYodGhpcy5yZWFsX3JvbGVfbGlzdCl7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5yZWFsX3JvbGVfbGlzdCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiYXR0bGVfcm9sZSA9IHRoaXMucmVhbF9yb2xlX2xpc3Rba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYoYmF0dGxlX3JvbGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmF0dGxlX3JvbGUudGVtcF9za2lsbF9iaWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6YCa55+l5pyN5Yqh56uv5pKt5oql5a6M5oiQLOWMuuWIhuWbnuWQiOW8gOWni+WSjOS4remXtOWbnuWQiOaSreaKpVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNfcGxheV9yb3VuZF9zdGFydCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5jc1JvdW5kRmlnaHRFbmQoKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuY3NTa2lsbFBsYXlFbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOi/meS4quaXtuWAmeiuvue9ruaJgOacieeahOWNleS9jeWIneWni+eKtuaAgVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGZpcnN0X2RhdGEgPSB0aGlzLm9yZGVyX2xpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgIHZhciByb3VuZF9kYXRhID0gdGhpcy5yb3VuZF9kYXRhW2ZpcnN0X2RhdGEub3JkZXJdO1xuICAgICAgICAgICAgaWYodGhpcy5vcmRlcl9saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmRfb3JkZXIgPSB0aGlzLm9yZGVyX2xpc3RbMF0ub3JkZXJcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kX2RhdGEgPSB0aGlzLnJvdW5kX2RhdGFbc2Vjb25kX29yZGVyXTtcbiAgICAgICAgICAgICAgICAvLyDmib7liLDkuIvkuIDkuKrlm57lkIjmkq3miqUs5LqO5b2T5YmN5Zue5ZCI5pKt5oql5YGa5q+U6L6D5Yik5pat5piv5LiN5piv5aSa5q615pS75Ye7LOS7juiAjOWcqOW9k+WJjeaSreaKpee7k+adn+S5i+WQjizmmK/lkKbpnIDopoHph43nva5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhY3RvciBpbiBzZWNvbmRfZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMubmV4dF9yb3VuZCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dF9yb3VuZCA9IHNlY29uZF9kYXRhW2FjdG9yXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yb3VuZF9udW0gPSBPYmplY3Qua2V5cyhyb3VuZF9kYXRhKS5sZW5ndGg7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAodmFyIGFjdG9yIGluIHJvdW5kX2RhdGEpe1xuICAgICAgICAgICAgICAgIHRoaXMucm91bmRfbnVtIC09IDE7XG4gICAgICAgICAgICAgICAgdmFyIHJvdW5kX29uZV90ZW1wID0gcm91bmRfZGF0YVthY3Rvcl07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3JvdW5kID09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cl9yb3VuZCA9IHJvdW5kX29uZV90ZW1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm91bmRfb25lX3RlbXAudGFyZ2V0X2xpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRhY2tlciA9IHRoaXMuZ2V0QmF0dGxlUm9sZUJ5UG9zKHJvdW5kX29uZV90ZW1wLmFjdG9yKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNrZXIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rvcl9zdW0gPSB0aGlzLmFjdG9yX3N1bSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcmRlcihhdHRhY2tlciwgcm91bmRfb25lX3RlbXApXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3VuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91bmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pKt5pS+5Zue5ZCIYnVmZizlj6/og73mmK/lm57lkIjlvIDlp4ss5pWI5p6c5pKt5oql57uT5p2fLOS5n+WPr+iDveaYr+WbnuWQiOe7k+adnywg6L+Z5LiqYnVmZuaYr+WNj+iuruaVsOaNruadpeeahFxuICAgIHBsYXlSb3VuZEJ1ZmY6ZnVuY3Rpb24odGFyZ2V0LCBidWZmLCBhdHRhY2tlciwgZWZmZWN0X2hpdCl7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBidWZmID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRCdWZmKGF0dGFja2VyLCB0YXJnZXQsIGJ1ZmYpO1xuXG4gICAgICAgIGlmIChidWZmLmNoYW5nZV90eXBlID09IDEpIHsgLy8g6KGA6YeP5Y+Y5YyW55qE5pe25YCZXG4gICAgICAgICAgICB0aGlzLmJhdHRsZVJvbGVIUENoYW5nZSh0YXJnZXQsIGJ1ZmYuY2hhbmdlX3ZhbHVlLCBidWZmLmlzX2RlYWQsIGVmZmVjdF9oaXQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGJ1ZmbnsbvnmoTmsJTooYDkuIrlj7dcbiAgICBiYXR0bGVSb2xlSFBDaGFuZ2U6ZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSwgaXNfZGVhZCwgZWZmZWN0X2hpdCwgaXNfYnVmZiwgY2FtcF9yZXN0cmFpbil7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB0YXJnZXQudXBkYXRlSFAodmFsdWUsIGlzX2RlYWQsIHRydWUsIDApO1xuICAgICAgICB0aGlzLm11dGlIdXJ0TnVtKHRhcmdldCwgdmFsdWUsIGVmZmVjdF9oaXQsIGlzX2J1ZmYsIGNhbXBfcmVzdHJhaW4pO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbliqjkvZzliJfooags5YeG5aSH5byA5oiY5LqGLOWIneWni+WMluS4gOS6m+aVsOaNrlxuICAgIGluaXRPcmRlcjogZnVuY3Rpb24gKGF0dGFja2VyLCBvbmUpe1xuICAgICAgICBvbmUudGFyZ2V0X2xpc3Quc29ydChmdW5jdGlvbihhLCBiKXtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8g6L+Z5Liq5ZCO57ut5YaN55yL55yL6KaB5LiN6KaB5Yqo5oCB6K6+572u5bGC57qnXG4gICAgICAgIGlmICh0aGlzLmN1cl9yb3VuZCAmJiB0aGlzLmxhc3Rfcm91bmRfYWN0b3IgJiYgdGhpcy5jdXJfcm91bmQuYWN0b3IgPT0gdGhpcy5sYXN0X3JvdW5kX2FjdG9yKXtcblxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGF0dGFja2VyLnJlc2V0Wk9yZGVyKCk7XG4gICAgICAgICAgICBhdHRhY2tlci50YXJnZV96b3JkZXIgPSA5OTk5O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxpc3QgPSBvbmUudGFyZ2V0X2xpc3Q7XG4gICAgICAgIHZhciBjb2xfdGFyZ2V0ID0gbGlzdFswXS50YXJnZXQ7XG4gICAgICAgIGlmIChjb2xfdGFyZ2V0ID4gR0lSRF9QT1NfT0ZGU0VUKSB7XG4gICAgICAgICAgICBjb2xfdGFyZ2V0ID0gY29sX3RhcmdldCAtIEdJUkRfUE9TX09GRlNFVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29sID0gUG9zX1RvX0NvbFtjb2xfdGFyZ2V0IC0gMV07XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLmdldEJhdHRsZVJvbGVCeVBvcyhjb2xfdGFyZ2V0KTtcbiAgICAgICAgaWYgKHRhcmdldCl7XG4gICAgICAgICAgICB0YXJnZXQucmVzZXRaT3JkZXIoKTtcbiAgICAgICAgICAgIGF0dGFja2VyLnRhcmdlX3pvcmRlciA9IHRhcmdldC5nZXRMb2NhbFpPcmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGF0dGFja2VyLmNvbCA9IGNvbDtcbiAgICAgICAgYXR0YWNrZXIuaXNfcm91bmQgPSBmYWxzZTtcbiAgICAgICAgYXR0YWNrZXIuYXR0YWNrZXJfaW5mbyA9IG9uZTtcbiAgICAgICAgYXR0YWNrZXIuc2tpbGxfZGF0YSA9IGdkYXRhKCdza2lsbF9kYXRhJywgJ2RhdGFfZ2V0X3NraWxsJywgb25lLnNraWxsX2JpZCk7IFxuICAgICAgICBhdHRhY2tlci50YXJnZXRfcG9zID0gYXR0YWNrZXIuZ3JpZF9wb3M7XG4gICAgICAgIGF0dGFja2VyLnBsYXlfb3JkZXJfaW5kZXggPSBvbmUudGFyZ2V0X2xpc3RbMF0uZWZmZWN0X2JpZDtcbiAgICAgICAgdGhpcy5jYWxjVGFyZ2V0UG9zKGF0dGFja2VyKTtcblxuICAgICAgICAvLyDlpoLmnpzmsqHmnInmlYjmnpxpZOWImeS4jeWkhOeQhizmiYDmnInmkq3miqXpqbHliqjpg73mmK/mlYjmnpzpqbHliqhcbiAgICAgICAgaWYgKGF0dGFja2VyLnBsYXlfb3JkZXJfaW5kZXggPT0gbnVsbCB8fCBhdHRhY2tlci5wbGF5X29yZGVyX2luZGV4ID09IDApe1xuICAgICAgICAgICAgdGhpcy5hY3Rvcl9wbGF5X3N1bSArPSAxO1xuICAgICAgICAgICAgdmFyIGVmZmVjdF9wbGF5ID0gb25lLnRhcmdldF9saXN0WzBdO1xuICAgICAgICAgICAgaWYgKGVmZmVjdF9wbGF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdF9wbGF5LnN1Yl9lZmZlY3RfcGxheV9saXN0ICYmIGVmZmVjdF9wbGF5LnN1Yl9lZmZlY3RfcGxheV9saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1YkVmZmVjdFBsYXlsaXN0KGVmZmVjdF9wbGF5LCBhdHRhY2tlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGVhbFJvdW5kQnVmZihlZmZlY3RfcGxheS5idWZmX2xpc3QsIGF0dGFja2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm91bmQoKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVmZmVjdF9jb25maWcgPSBnZGF0YSgnc2tpbGxfZGF0YScsICdkYXRhX2dldF9lZmZlY3QnLCBhdHRhY2tlci5wbGF5X29yZGVyX2luZGV4KTtcbiAgICAgICAgaWYgKGVmZmVjdF9jb25maWcpIHtcbiAgICAgICAgICAgIGF0dGFja2VyLnBsYXlfb3JkZXIgPSBVdGlscy5kZWVwQ29weShlZmZlY3RfY29uZmlnLmFjdGlvbl9saXN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliqjkvZzliJfooahcbiAgICAgICAgICAgIGF0dGFja2VyLnNoYWtlX2lkID0gZWZmZWN0X2NvbmZpZy5zaGFrZV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDpnIflsY9JRFxuICAgICAgICAgICAgYXR0YWNrZXIuZWZmZWN0X3R5cGUgPSBlZmZlY3RfY29uZmlnLmVmZmVjdF90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaViOaenOexu+Wei1xuICAgICAgICAgICAgYXR0YWNrZXIucGxheV9zdGFuZCA9IGVmZmVjdF9jb25maWcucGxheV9zdGFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaYr+WQpuaUtuaLm1xuICAgICAgICAgICAgYXR0YWNrZXIuYW5pbWVfcmVzID0gZWZmZWN0X2NvbmZpZy5hbmltZV9yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaUu+WHu+WKqOS9nOi1hOa6kFxuICAgICAgICAgICAgYXR0YWNrZXIuc3BsaXRfaHVydCA9IGVmZmVjdF9jb25maWcuc3BsaXRfaHVydDtcbiAgICAgICAgICAgIGF0dGFja2VyLmhpdF9hY3Rpb24gPSBlZmZlY3RfY29uZmlnLmhpdF9hY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlj5flh7vlpITnkIZcbiAgICAgICAgICAgIGF0dGFja2VyLmVmZmVjdF9kZXNjID0gZWZmZWN0X2NvbmZpZy5lZmZlY3RfZGVzYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlYjmnpzpo5jlrZdcbiAgICAgICAgICAgIGF0dGFja2VyLmlzX211c3RfZGllID0gZWZmZWN0X2NvbmZpZy5pc19tdXN0X2RpZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmrbvkuqHnmoTml7blgJnmmK/lkKbnp7vpmaQs6L+Z5Liq5Li76KaB5piv5Yik5pat6L+e5Ye75Lit55qE5pe25YCZXG4gICAgICAgICAgICBhdHRhY2tlci5hbmltZV91c2VyX2F0ayA9IGVmZmVjdF9jb25maWcuYW5pbWVfdXNlcl9hdGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pS75Ye75Yqo5L2c5ZCNXG4gICAgICAgICAgICBhdHRhY2tlci5hdHRhY2tfc291bmQgPSBlZmZlY3RfY29uZmlnLmF0dGFja19zb3VuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5pS75Ye76Z+z5pWIXG4gICAgICAgICAgICBhdHRhY2tlci5yZWFkeV9zb3VuZCA9IGVmZmVjdF9jb25maWcucmVhZHlfc291bmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YeG5aSH6Z+z5pWIXG4gICAgICAgICAgICBhdHRhY2tlci5zaG91dF90cmljayA9IGVmZmVjdF9jb25maWcuc2hvdXRfdHJpY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5ZaK5oub6Z+z5pWIXG4gICAgICAgICAgICBhdHRhY2tlci5oaXRfc291bmQgPSBlZmZlY3RfY29uZmlnLmhpdF9zb3VuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y+X5Ye76Z+z5pWIXG4gICAgICAgICAgICBhdHRhY2tlci5oaXRfZWZmZWN0X2xpc3QgPSBVdGlscy5kZWVwQ29weSh0aGlzLmdldEN1ckVmZmVjdExpc3QoZWZmZWN0X2NvbmZpZy5oaXRfZWZmZWN0X2xpc3QpKTsgICAgLy8g6K6w5b2V5omT5Ye754m55pWI5YiX6KGoXG4gICAgICAgICAgICBhdHRhY2tlci5hcmVhX2VmZmVjdF9saXN0ID0gVXRpbHMuZGVlcENvcHkodGhpcy5nZXRDdXJFZmZlY3RMaXN0KGVmZmVjdF9jb25maWcuYXJlYV9lZmZlY3RfbGlzdCkpOyAgLy8g6K6w5b2V6IyD5Zu05Lq654mp54m55pWIXG4gICAgICAgICAgICBhdHRhY2tlci5hY3RfZWZmZWN0X2xpc3QgPSBVdGlscy5kZWVwQ29weSh0aGlzLmdldEN1ckVmZmVjdExpc3QoZWZmZWN0X2NvbmZpZy5hY3RfZWZmZWN0X2xpc3QpKTsgICAgLy8g6K6w5b2V5Ye65omL54K554m55pWIXG4gICAgICAgICAgICBhdHRhY2tlci5iYWN0X2VmZmVjdF9saXN0ID0gVXRpbHMuZGVlcENvcHkodGhpcy5nZXRDdXJFZmZlY3RMaXN0KGVmZmVjdF9jb25maWcuYmFjdF9lZmZlY3RfbGlzdCkpOyAgLy8g6K6w5b2V5pa95rOV54m55pWIXG4gICAgICAgICAgICBhdHRhY2tlci50cmNfZWZmZWN0X2xpc3QgPSBVdGlscy5kZWVwQ29weSh0aGlzLmdldEN1ckVmZmVjdExpc3QoZWZmZWN0X2NvbmZpZy50cmNfZWZmZWN0X2xpc3QpKTsgICAgLy8g6K6w5b2V5by56YGT54m55pWIXG4gICAgICAgIH1cbiAgICAgICAgLy8g5piv5ZCm5pyJ576k5pS7XG4gICAgICAgIGlmIChhdHRhY2tlci5hcmVhX2VmZmVjdF9saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby5pc19jYWxjID0gZmFsc2VcbiAgICAgICAgICAgIGF0dGFja2VyLmluX2FyZWFfZWZmZWN0ID0gdHJ1ZVxuICAgICAgICAgICAgYXR0YWNrZXIuYXJlYV9oaXRfbnVtID0gMVxuICAgICAgICAgICAgYXR0YWNrZXIuYXJlYV9oaXRfdGltZSA9IDBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBhdHRhY2tlci5pbl9hcmVhX2VmZmVjdCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0X2F0dGFjayA9IChmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5wbGF5T3JkZXIoYXR0YWNrZXIpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8vIOS4u+WKqOaKgOiDveWSjOiiq+WKqOaKgOiDveWWiuaLm+WkhOeQhlxuICAgICAgICB2YXIgc2hvd19za2lsbF9ubWUgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBza2lsbF90eXBlID0gYXR0YWNrZXIuc2tpbGxfZGF0YS50eXBlXG4gICAgICAgICAgICBpZiAoc2tpbGxfdHlwZSA9PSBCYXR0bGVDb25zdC5Ta2lsbF9UeXBlLlBBU1NJVkVfU0tJTEwgJiYgYXR0YWNrZXIuc2tpbGxfZGF0YS5wYXNzaXZlX3NraWxsX3Nob3cgPT0gMSl7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5Rm9udE1lc3NhZ2UoYXR0YWNrZXIsIGF0dGFja2VyLnNraWxsX2RhdGEubmFtZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfYXR0YWNrKClcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9ZWxzZSBpZihza2lsbF90eXBlID09IEJhdHRsZUNvbnN0LlNraWxsX1R5cGUuQUNUSVZFX1NLSUxMKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmZvcm1fZmlnaHRfdWkpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkuc2hvd0FjdGl2ZVNraWxsTmFtZShhdHRhY2tlciwgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hdHRhY2soKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHN0YXJ0X2F0dGFjaygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYoYXR0YWNrZXIuc2tpbGxfZGF0YSA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMudGFsayhhdHRhY2tlciwgc3RhcnRfYXR0YWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGFsayhhdHRhY2tlciwgc2hvd19za2lsbF9ubWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0X3BsYXlpbmcgPSB0cnVlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOiuoeeul+ebruagh+eCuVxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3RfbGlzdCBcbiAgICAgKi9cbiAgICBjYWxjVGFyZ2V0UG9zOmZ1bmN0aW9uKGF0dGFja2VyLCBvYmplY3RfbGlzdCl7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLmF0dGFja2VyX2luZm8gPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhcmdldF9saXN0ID0gYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdDtcbiAgICAgICAgdmFyIHRhcmdldCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0YXJnZXRfbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0YXJnZXRfbGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAob2JqZWN0X2xpc3Qpe1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IG9iamVjdF9saXN0W2VsZW1lbnQudGFyZ2V0XTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0QmF0dGxlUm9sZUJ5UG9zKGVsZW1lbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0Lm9ial90eXBlICE9IGF0dGFja2VyLm9ial90eXBlKXtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0KXtcbiAgICAgICAgICAgIGF0dGFja2VyLnRhcmdldF9wb3MgPSB0YXJnZXQuZ3JpZF9wb3M7XG4gICAgICAgICAgICBhdHRhY2tlci50YXJnZXRfcG9zX2Jhc2UgPSB0YXJnZXQuZ3JpZF9wb3M7XG4gICAgICAgICAgICBhdHRhY2tlci50YXJnZXRfbmFtZSA9IHRhcmdldC5yb2xlX2RhdGEub2JqZWN0X25hbWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pWI5p6c5YiX6KGoXG4gICAgZ2V0Q3VyRWZmZWN0TGlzdDogZnVuY3Rpb24obGlzdCl7XG4gICAgICAgIHZhciBlZmZlY3RfbGlzdCA9IFtdXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGxpc3RbaW5kZXhdO1xuICAgICAgICAgICAgdmFyIGVmZmVjdF9kYXRhID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbZWxlbWVudF1cbiAgICAgICAgICAgIGVmZmVjdF9saXN0LnB1c2goZWZmZWN0X2RhdGEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVmZmVjdF9saXN0O1xuICAgIH0sXG5cbiAgICAvLyDljZXkvY3lloror51cbiAgICB0YWxrOmZ1bmN0aW9uKGF0dGFja2VyLCBjYWxsYmFjayl7XG4gICAgICAgIHZhciBtc2cgPSBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhbGtfY29udGVudCB8fCBcIlwiXG4gICAgICAgIHZhciBhY3RvciA9IGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFsa19wb3NcbiAgICAgICAgaWYgKG1zZyA9PSBcIlwiKXtcbiAgICAgICAgICAgIGlmKGNhbGxiYWNrKXtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g54S25ZCO5pKt5pS+5rCU5rOhLi4uLi5cbiAgICAgICAgaWYoY2FsbGJhY2spe1xuICAgICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaSreaKpeWKqOS9nFxuICAgIHNpbmdsZUFjdDpmdW5jdGlvbihhY3RfZGF0YSwgYXR0YWNrZXIpe1xuICAgICAgICBpZiAoKGFjdF9kYXRhIGluc3RhbmNlb2YgQXJyYXkpKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm11dGlBY3QoYWN0X2RhdGEsIGF0dGFja2VyKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YXIgYWN0X2NvbmZpZyA9IFV0aWxzLmRlZXBDb3B5KENvbmZpZy5za2lsbF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhW2FjdF9kYXRhXSlcbiAgICAgICAgICAgIGlmIChhY3RfY29uZmlnKXtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFjdF9jb25maWcuYWN0X2FyZ3M7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bm5hbWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYoZnVubmFtZSA9PSBudWxsIHx8IHRoaXNbZnVubmFtZV0gPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodGhpc1tmdW5uYW1lXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtcyA9IGFyZ3NbMV0gfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy51bnNoaWZ0KGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbZnVubmFtZV0uYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBMb2cuaW5mbyhcIuWKqOS9nOmUmeivryzliqjkvZxCSUQ6XCIrYWN0X2RhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5aSa5q615pKt5oql5Yqo5L2cXG4gICAgbXV0aUFjdDpmdW5jdGlvbihhcmdzLCBhdHRhY2tlcil7XG4gICAgICAgIHZhciBhY3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICAgICAgdmFyIGFjdCA9IHRoaXMuc2luZ2xlQWN0KGVsZW1lbnQsIGF0dGFja2VyKTtcbiAgICAgICAgICAgIGFjdHMucHVzaChhY3QpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoYWN0cy5sZW5ndGggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gYWN0c1swXTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICByZXR1cm4gY2Muc3Bhd24uYXBwbHkobnVsbCwgYWN0cyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5oqA6IO95Yqo5L2c6ZmE5bim57OK5o6J5Ye95pWwXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGFyZ3MgXG4gICAgICovXG4gICAgY2FsbGZ1bjogZnVuY3Rpb24gKGF0dGFja2VyLCBhcmdzKXtcbiAgICAgICAgdmFyIGZ1bm5hbWUgPSBcIlwiO1xuICAgICAgICB2YXIgcGFyYW1zID0gbnVsbDtcbiAgICAgICAgaWYoIGFyZ3MgaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgICAgICBmdW5uYW1lID0gYXJnc1swXTtcbiAgICAgICAgICAgIHBhcmFtcyA9IGFyZ3NbMV0gfHwgW107XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZnVubmFtZSA9IGFyZ3NcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnVubmFtZSA9PSBcIlwiKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzW2Z1bm5hbWVdIGluc3RhbmNlb2YgRnVuY3Rpb24pe1xuICAgICAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFtcy51bnNoaWZ0KGF0dGFja2VyKTtcbiAgICAgICAgICAgIHRoaXNbZnVubmFtZV0uYXBwbHkodGhpcywgcGFyYW1zKTtcbiAgICAgICAgfWVsc2UgaWYodHlwZW9mKGZ1bm5hbWUpID09IFwibnVtYmVyXCIpe1xuICAgICAgICAgICAgdmFyIGFjdCA9IHRoaXMuc2luZ2xlQWN0KGZ1bm5hbWUsIGF0dGFja2VyKVxuICAgICAgICAgICAgYXR0YWNrZXIucnVuQWN0aW9uKGFjdCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pmu6YCa6L+R5oiY5pS75Ye7XG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2sgXG4gICAgICogQHBhcmFtIHsqfSBkZWxheV90aW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gaGl0X2Z1biBcbiAgICAgKiBAcGFyYW0geyp9IHN0YXJ0X2Z1biDmlLvlh7vlvIDlp4vliqjkvZxcbiAgICAgKiBAcGFyYW0geyp9IGlzX3JldmVyc2Ug5piv5ZCm5piv56e75Yqo5Yiw6IOM6Z2iXG4gICAgICovXG4gICAgYXR0YWNrOmZ1bmN0aW9uKGF0dGFja2VyLCBkZWxheV90aW1lLCBoaXRfZnVuLCBzdGFydF9mdW4sIGlzX3JldmVyc2Upe1xuICAgICAgICBpZiAoYXR0YWNrZXIgJiYgYXR0YWNrZXIuYW5pbWVfdXNlcl9hdGspIHtcbiAgICAgICAgICAgIGRlbGF5X3RpbWUgPSBkZWxheV90aW1lIHx8IDA7XG4gICAgICAgICAgICBpc19yZXZlcnNlID0gKGlzX3JldmVyc2UgPT0gMSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBzdGFydF9jYWxsYmFjayA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsZnVuKGF0dGFja2VyLCBzdGFydF9mdW4pXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgaGl0X2NhbGxiYWNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxmdW4oYXR0YWNrZXIsIGhpdF9mdW4pXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxfYWN0LmF0dGFjayhhdHRhY2tlciwgZGVsYXlfdGltZSwgYXR0YWNrZXIuYW5pbWVfdXNlcl9hdGssIGhpdF9jYWxsYmFjaywgc3RhcnRfY2FsbGJhY2ssIGlzX3JldmVyc2UsIG51bGwsIGF0dGFja2VyLmFuaW1lX3JlcylcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDov5znqIvmlLvlh7vlrZDlvLlcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gZGVsYXlfdGltZSBcbiAgICAgKiBAcGFyYW0geyp9IG1vdmVfdGltZSBcbiAgICAgKiBAcGFyYW0geyp9IGlzX2JhY2sgXG4gICAgICogQHBhcmFtIHsqfSBmdW5uYW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gc3RhcnRfaGVpZ2h0IFxuICAgICAqL1xuICAgIGZseUl0ZW06IGZ1bmN0aW9uIChhdHRhY2tlciwgZGVsYXlfdGltZSwgbW92ZV90aW1lLCBpc19iYWNrLCBmdW5uYW1lLCBzdGFydF9oZWlnaHQpe1xuICAgICAgICBpZih0aGlzLmNoZWNrSXNJbkJhdHRsZShhdHRhY2tlcikgPT0gZmFsc2Upe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdF9saXN0ID0gYXR0YWNrZXIudHJjX2VmZmVjdF9saXN0OyAgICAgICAvLyDov5nkuKrmlYjmnpzlj6/og73mnInlpJrkuKos6L+Z5Liq5pe25YCZ5Li76KaB5Y+W56ys5LiA5Liq5ZCnXG4gICAgICAgIGlmIChlZmZlY3RfbGlzdCA9PSBudWxsIHx8IGVmZmVjdF9saXN0Lmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICAgIExvZy5pbmZvKFwi5pKt5pS+6L+c56iL5pS75Ye75pWI5p6c5aSx6LSlLOS4jeWtmOWcqOi/nOeoi+eahOaViOaenCzmlYjmnpxpZOS4ujogIFwiICsgYXR0YWNrZXIucGxheV9vcmRlcl9pbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFjdFN0YXJ0KGF0dGFja2VyKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdF9vYmplY3QgPSBlZmZlY3RfbGlzdFswXTsgICAgICAgLy8g5Li76KaB56ys5LiA5LiqXG4gICAgICAgIGNvbnN0IGlzX2ZyaWVuZCA9IGF0dGFja2VyLmlzX2ZyaWVuZDsgICAgICAgLy8g5piv5ZCm5piv5Y+L5pa5XG4gICAgICAgIHZhciByZXNfdXAgPSBlZmZlY3Rfb2JqZWN0LnJlc191cDsgICAgICAgICAgLy9cbiAgICAgICAgaWYgKGlzX2ZyaWVuZCA9PSB0cnVlICYmIGVmZmVjdF9vYmplY3Quc3BlY19yZXNfdXAgIT0gXCJcIil7XG4gICAgICAgICAgICByZXNfdXAgPSBlZmZlY3Rfb2JqZWN0LnNwZWNfcmVzX3VwXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjYWxlID0gZWZmZWN0X29iamVjdC5zY2FsZSAqIDAuMDAxO1xuICAgICAgICBsZXQgeF9maXggPSBlZmZlY3Rfb2JqZWN0LnhfZml4ICogYXR0YWNrZXIub2JqX3R5cGU7XG4gICAgICAgIGxldCB5X2ZpeCA9IChlZmZlY3Rfb2JqZWN0LnlfZml4ID09IDApID8gNTAgOiBlZmZlY3Rfb2JqZWN0LnlfZml4O1xuICAgICAgICBsZXQgYW5pbWFfbmFtZSA9IGF0dGFja2VyLmFuaW1lX3VzZXJfYXRrIHx8IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcbiAgICAgICAgdmFyIGF0dGFja19mdW5jID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRfbGlzdCA9IGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3Q7XG4gICAgICAgICAgICBpZih0YXJnZXRfbGlzdC5sZW5ndGggPD0gMSl7ICAgICAgICAgICAgLy8g5Y+q5pyJ5LiA5Liq5pS75Ye75a+56LGh55qE5pe25YCZXG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldF9wb3MgPSB0aGlzLmNlbnRlcl9wb3MoYXR0YWNrZXIsIHlfZml4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtKGF0dGFja2VyLCBkZWxheV90aW1lLCByZXNfdXAsIG1vdmVfdGltZSwgZnVubmFtZSwgc3RhcnRfaGVpZ2h0LCB0YXJnZXRfcG9zLCBzY2FsZSwgZWZmZWN0X29iamVjdC5iaWQsIHhfZml4LCB5X2ZpeCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlTZWxmRWZmZWN0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGFjdF9saXN0ID0gW107IC8vIOWKqOS9nOWIl+ihqFxuICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3Q7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldEJhdHRsZVJvbGVCeVBvcyhlbGVtZW50LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldCl7ICAgICAvLyDnm67moIdcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRfcG9zID0ge3g6dGFyZ2V0LnNjZW5lX3Bvcy54LCB5OnRhcmdldC5zY2VuZV9wb3MueSArIHlfZml4fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZ3JvdXAgIT0gYXR0YWNrZXIuZ3JvdXApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmdW5jID0gdGhpcy5nZXRJdGVtKGF0dGFja2VyLCBkZWxheV90aW1lLCByZXNfdXAsIG1vdmVfdGltZSwgXCJodXJ0T25lXCIsIHN0YXJ0X2hlaWdodCwgdGFyZ2V0X3Bvcywgc2NhbGUsIGVmZmVjdF9vYmplY3QuYmlkLCB4X2ZpeCwgeV9maXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0X2xpc3QucHVzaChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIOWFs+mUruaVsOaNrlxuICAgICAgICAgICAgICAgIHZhciBmaW5pc2hfZnVuYyA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2tlci5hdHRhY2tlcl9pbmZvLmxhc3RfZWZmZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLmxhc3RfZWZmZWN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLmxhc3RfZWZmZWN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNrZXIuaXNfcmVhbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheU1hZ2ljKGF0dGFja2VyLCBlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaG9va19tb2RlbC5wbGF5TWFnaWMoYXR0YWNrZXIsIGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgICAgICAgICAgaWYoYWN0X2xpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3Rfc3RhcnQgPSB0aGlzLnNraWxsX2FjdC5ub3JtYWxTdGFydChhdHRhY2tlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3RfZmluaXNoID0gdGhpcy5za2lsbF9hY3Qubm9ybWFsRmluaXNoKGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdCA9IGNjLnNlcXVlbmNlKGFjdF9zdGFydCwgY2Muc3Bhd24uYXBwbHkobnVsbCwgYWN0X2xpc3QpLCBhY3RfZmluaXNoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXIucnVuQWN0aW9uKGFjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pLmJpbmQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraWxsX2FjdC5hdHRhY2soYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGFuaW1hX25hbWUsIG51bGwsIG51bGwsIGZhbHNlLCBhdHRhY2tfZnVuYywgYXR0YWNrZXIuYW5pbWVfcmVzKTtcbiAgICB9LFxuXG4gICAgLy8g5riQ6ZqQ5o6J55qE5pKt5oqlXG4gICAgZmFkZU91dDpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSwgdGltZSl7XG4gICAgICAgIHRpbWUgPSB0aW1lIHx8IDEwO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9hY3QuZmFkZU91dChhdHRhY2tlciwgZGVsYXlfdGltZSwgdGltZSk7XG4gICAgfSxcblxuICAgIC8vIOa4kOeOsOWHuuadpVxuICAgIGZhZGVJbjpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSwgdGltZSl7XG4gICAgICAgIHRpbWUgPSB0aW1lIHx8IDE7XG4gICAgICAgIHJldHVybiB0aGlzLnNraWxsX2FjdC5mYWRlSW4oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHRpbWUpO1xuICAgIH0sXG5cbiAgICAvLyDlpITnkIblj4vmlrnnibnmlYhcbiAgICBwbGF5U2VsZkVmZmVjdDpmdW5jdGlvbihhdHRhY2tlcil7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLmF0dGFja2VyX2luZm8gPT0gbnVsbCB8fCBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGxhc3RfZWZmZWN0ID0gW107XG4gICAgICAgIHZhciB0YXJnZXQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0QmF0dGxlUm9sZUJ5UG9zKGVsZW1lbnQudGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgYXR0YWNrZXIuZ3JvdXAgPT0gdGFyZ2V0Lmdyb3VwKXtcbiAgICAgICAgICAgICAgICBsYXN0X2VmZmVjdC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIGF0dGFja2VyLmF0dGFja2VyX2luZm8uZWZmZWN0X3BsYXkgPSBsYXN0X2VmZmVjdDtcbiAgICAgICAgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby5sYXN0X2VmZmVjdCA9IGxhc3RfZWZmZWN0O1xuICAgIH0sXG4gICAgXG4gICAgLy8g5Zue5ZCI5pKt5oql57uT5p2f6K6+572u5pa95rOV6ICF5oiY5Yqb5Yqo5L2cXG4gICAgcmVzZXRBdHRhY2tlclN0YW5kU3RhdHVzOmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYodGhpcy5iYXR0bGVfc2NlbmUgPT0gbnVsbCB8fCBhdHRhY2tlciA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV4dF9yb3VuZF9hY3RvciA9IDA7XG4gICAgICAgIGlmICh0aGlzLm5leHRfcm91bmQpIHtcbiAgICAgICAgICAgIG5leHRfcm91bmRfYWN0b3IgPSB0aGlzLm5leHRfcm91bmQuYWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VyX3JvdW5kKXtcbiAgICAgICAgICAgIHRoaXMubGFzdF9yb3VuZF9hY3RvciA9IHRoaXMuY3VyX3JvdW5kLmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0X3JvdW5kX2FjdG9yID09IDAgfHwgKHRoaXMuY3VyX3JvdW5kICYmIHRoaXMuY3VyX3JvdW5kLmFjdG9yICE9IG5leHRfcm91bmRfYWN0b3IpKSB7XG4gICAgICAgICAgICB0aGlzLnNraWxsX2FjdC5zZXRBbmltYXRpb24oYXR0YWNrZXIsIFBsYXllckFjdGlvbi5iYXR0bGVfc3RhbmQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jYW5jbGVCbGFja1NjcmVlbigpO1xuICAgICAgICAgICAgYXR0YWNrZXIucmVzZXRaT3JkZXIoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDlrp7kvovljJbov5znqIvlrZDlvLnliqjkvZxcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gZGVsYXlfdGltZSBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9uYW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gbW92ZV90aW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gZnVubmFtZSBcbiAgICAgKiBAcGFyYW0geyp9IHN0YXJ0X2hlaWdodCBcbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldF9wb3MgXG4gICAgICogQHBhcmFtIHsqfSBzY2FsZSBcbiAgICAgKiBAcGFyYW0geyp9IGJpZCBcbiAgICAgKiBAcGFyYW0geyp9IHhfZml4IFxuICAgICAqIEBwYXJhbSB7Kn0geV9maXggXG4gICAgICovXG4gICAgaXRlbTpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSwgZWZmZWN0X25hbWUsIG1vdmVfdGltZSwgZnVubmFtZSwgc3RhcnRfaGVpZ2h0LCB0YXJnZXRfcG9zLCBzY2FsZSwgYmlkLCB4X2ZpeCwgeV9maXgpe1xuICAgICAgICBpZihhdHRhY2tlciA9PSBudWxsIHx8IHRoaXMuYmF0dGxlX3NjZW5lID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0X2hlaWdodCA9IChzdGFydF9oZWlnaHQgfHwgMCkgKiBhdHRhY2tlci5tb2RlbF9oZWlnaHQgKiAwLjAxO1xuICAgICAgICBtb3ZlX3RpbWUgPSBtb3ZlX3RpbWUgfHwgMTA7XG4gICAgICAgIHZhciBoaXRfY2FsbGJhY2sgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuY2FsbGZ1bihhdHRhY2tlciwgZnVubmFtZSk7XG4gICAgICAgICAgICAvLyDov5nph4zmmoLml7bms6jph4rmjonkuI3nn6XpgZPmnInmsqHmnInpl67pophcbiAgICAgICAgICAgIC8vIGlmKGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAvLyAgICAgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdC51bnNoaWZ0KCk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYgKCFhdHRhY2tlci5pc19yZWFsKXtcbiAgICAgICAgICAgIGhpdF9jYWxsYmFjaygpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGF0dGFja2VyLnJ1bkFjdGlvbih0aGlzLnNraWxsX2FjdC5mbHlJdGVtKGF0dGFja2VyLCBkZWxheV90aW1lLCBlZmZlY3RfbmFtZSwgbW92ZV90aW1lLCBoaXRfY2FsbGJhY2ssIHN0YXJ0X2hlaWdodCwgdGFyZ2V0X3Bvcywgc2NhbGUsIGJpZCwgeF9maXgsIHlfZml4KSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6I635Y+W56e75Yqo5Yqo5L2cXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGRlbGF5X3RpbWUgXG4gICAgICogQHBhcmFtIHsqfSBlZmZlY3RfbmFtZSBcbiAgICAgKiBAcGFyYW0geyp9IG1vdmVfdGltZSBcbiAgICAgKiBAcGFyYW0geyp9IGZ1bm5hbWUgXG4gICAgICogQHBhcmFtIHsqfSBzdGFydF9oZWlnaHQgXG4gICAgICogQHBhcmFtIHsqfSB0YXJnZXRfcG9zIFxuICAgICAqIEBwYXJhbSB7Kn0gc2NhbGUgXG4gICAgICogQHBhcmFtIHsqfSBiaWQgXG4gICAgICogQHBhcmFtIHsqfSB4X2ZpeCBcbiAgICAgKiBAcGFyYW0geyp9IHlfZml4IFxuICAgICAqL1xuICAgIGdldEl0ZW06ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGVmZmVjdF9uYW1lLCBtb3ZlX3RpbWUsIGZ1bm5hbWUsIHN0YXJ0X2hlaWdodCwgdGFyZ2V0X3Bvcywgc2NhbGUsIGJpZCwgeF9maXgsIHlfZml4KXtcbiAgICAgICAgc3RhcnRfaGVpZ2h0ID0gc3RhcnRfaGVpZ2h0IHx8IDYwO1xuICAgICAgICBtb3ZlX3RpbWUgPSBtb3ZlX3RpbWUgfHwgMTA7XG4gICAgICAgIHZhciBoaXRfY2FsbGJhY2sgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuY2FsbGZ1bihhdHRhY2tlciwgZnVubmFtZSk7XG4gICAgICAgICAgICAvLyDov5nph4zmmoLml7bms6jph4rmjonkuI3nn6XpgZPmnInmsqHmnInpl67pophcbiAgICAgICAgICAgIC8vIGlmKGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAvLyAgICAgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdC51bnNoaWZ0KCk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0pLmJpbmQodGhpcyk7XG4gICAgICAgIHZhciBhY3QgPSB0aGlzLnNraWxsX2FjdC5mbHlJdGVtKGF0dGFja2VyLCBkZWxheV90aW1lLCBlZmZlY3RfbmFtZSwgbW92ZV90aW1lLCBoaXRfY2FsbGJhY2ssIHN0YXJ0X2hlaWdodCwgdGFyZ2V0X3Bvcywgc2NhbGUsIGJpZCwgeF9maXgsIHlfZml4KTtcbiAgICAgICAgcmV0dXJuIGFjdDtcbiAgICB9LFxuXG4gICAgLy8g5pKt5oqlLOWKqOS9nOaWveazleiAhVxuICAgIHBsYXlPcmRlcjpmdW5jdGlvbihhdHRhY2tlcil7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmIChhdHRhY2tlci53YWl0X2FjdCAmJiBhdHRhY2tlci53YWl0X2FjdCAhPSAwKSByZXR1cm47XG4gICAgICAgIC8vIOayoeacieaKgOiDveaViOaenOeahOaXtuWAmSznm7TmjqXnp7vpmaTmjolcbiAgICAgICAgaWYgKGF0dGFja2VyLnBsYXlfb3JkZXJfaW5kZXggPT0gbnVsbCB8fCBhdHRhY2tlci5wbGF5X29yZGVyX2luZGV4ID09IDApIHJldHVybjtcbiAgICAgICAgLy8g5q+P5Liq5Yqo5L2c55qE6K6h5pWw5ZmoLOW9k+S4gOS4quWKqOS9nOW8gOWni+S5i+WQjuW8gOWni+iuoeaVsCzkuLow5qCH6K+G6L+Z5Liq5Yqo5L2c5YGa5a6M5LqGXG4gICAgICAgIGF0dGFja2VyLndhaXRfYWN0ID0gMDtcblxuICAgICAgICBpZiAoYXR0YWNrZXIucGxheV9vcmRlciA9PSBudWxsIHx8IGF0dGFja2VyLnBsYXlfb3JkZXIubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgdGhpcy5hY3Rvcl9wbGF5X3N1bSArPSAxO1xuXG4gICAgICAgICAgICBpZighYXR0YWNrZXIuaXNfZGllKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0QXR0YWNrZXJTdGFuZFN0YXR1cyhhdHRhY2tlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKCFhdHRhY2tlci5pc19yb3VuZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RfcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdG9yX3BsYXlfc3VtID49IHRoaXMuYWN0b3Jfc3VtKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3VuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBhdHRhY2tlci5wbGF5X29yZGVyLnNoaWZ0KCk7XG4gICAgICAgICAgICB2YXIgYWN0ID0gdGhpcy5zaW5nbGVBY3QoaW5kZXgsIGF0dGFja2VyKTtcbiAgICAgICAgICAgIGlmKGFjdCl7XG4gICAgICAgICAgICAgICAgYXR0YWNrZXIucnVuQWN0aW9uKGFjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5aSE55CG576k5pS75pWI5p6cLOavlOWmguivtOmfs+aViOS4jeimgeaSreWkquWkmlxuICAgIGJhdGNoUGxheUh1cnQ6ZnVuY3Rpb24oYXR0YWNrZXIpe1xuICAgICAgICBpZihhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLmF0dGFja2VyX2luZm8gPT0gbnVsbCB8fCBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0ID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXRfbGlzdCA9IGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3Q7XG4gICAgICAgIGlmICh0YXJnZXRfbGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgaGFkX3BsYXkgPSBmYWxzZTsgICAgICAgICAgIC8vIOWkmuS4quWPl+WHu+mfs+aViOWPqumcgOimgeaSreaUvuS4gOasoVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFyZ2V0X2xpc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGFyZ2V0X2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGF0dGFja2VyLmlzX3JlYWwpe1xuICAgICAgICAgICAgICAgIHZhciBwbGF5X2VmZmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmhwX2NoYW5nZWQgJiYgZWxlbWVudC5ocF9jaGFuZ2VkIDwgMCAmJiBoYWRfcGxheSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgICAgIGhhZF9wbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGxheV9lZmZlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlNYWdpYyhhdHRhY2tlciwgZWxlbWVudCwgcGxheV9lZmZlY3QpIFxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rX21vZGVsLnBsYXlNYWdpYyhhdHRhY2tlciwgZWxlbWVudCwgcGxheV9lZmZlY3QpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pKt5pS+5pmu6YCa5oiY5paX6aOY5a2XXG4gICAgICogQHBhcmFtIHsqfSB0YXJnZXQg5oiY5paX55uu5qCH5Y2V5L2NXG4gICAgICogQHBhcmFtIHsqfSBkZXNjIOW9k+WJjeaWh+acrFxuICAgICAqIEBwYXJhbSB7Kn0gcGFyZW50IOeItuiKgueCuSzlpoLmnpzmsqHmnIks5YiZ6buY6K6k5piv5oiY5paX5Zy65pmv54m55pWI5bGCMVxuICAgICAqIEBwYXJhbSB7Kn0geCB45pa55ZCR55qE5YGP56e75YC8XG4gICAgICogQHBhcmFtIHsqfSB5IHnmlrnlkJHnmoTlgY/np7vlgLxcbiAgICAgKiBAcGFyYW0geyp9IGNvbG9yIOaWh+Wtl+minOiJslxuICAgICAqIEBwYXJhbSB7Kn0gb3V0bGluZSDmloflrZfmj4/ovrnoibJcbiAgICAgKi9cbiAgICBwbGF5Rm9udE1lc3NhZ2U6ZnVuY3Rpb24odGFyZ2V0LCBkZXNjLCBwYXJlbnQsIHgsIHksIGNvbG9yLCBvdXRsaW5lLCBjYWxsYmFjayl7XG4gICAgICAgIGlmKHRoaXMuY2hlY2tJc0luQmF0dGxlKHRhcmdldCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKHBhcmVudCA9PSBudWxsKXtcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuYmF0dGxlX3NjZW5lLmdldEJhdHRsZUVmZmVjdExheWVyKDEpICAgICAgLy8g6buY6K6k5pS+5Zyo54m55pWIMeWxguS4iumdolxuICAgICAgICB9XG4gICAgICAgIHggPSB4IHx8IDA7XG4gICAgICAgIHkgPSB5IHx8IDA7XG4gICAgICAgIHZhciB0YXJnZXRfeCA9IHRhcmdldC5zY2VuZV9wb3MueCArIHg7XG4gICAgICAgIHZhciB0YXJnZXRfeSA9IHRhcmdldC5zY2VuZV9wb3MueSArIHkgKyB0YXJnZXQubW9kZWxfaGVpZ2h0LzI7XG4gICAgICAgIGlmIChjb2xvciA9PSBudWxsKXtcbiAgICAgICAgICAgIGNvbG9yID0gMjE3O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRsaW5lID09IG51bGwpe1xuICAgICAgICAgICAgb3V0bGluZSA9IDIxODtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOiuvue9ruWtl+S9k+m7mOiupOminOiJslxuICAgICAgICB2YXIgbm9ybWFsX25vZGUgPSB0aGlzLmdldE5vcm1hbEZvbnQoKTtcbiAgICAgICAgbm9ybWFsX25vZGUuc2V0UG9zaXRpb24odGFyZ2V0X3gsIHRhcmdldF95KTtcblxuICAgICAgICB2YXIgZm9udF9ub2RlID0gbm9ybWFsX25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJmb250X2xhYmVsXCIpO1xuICAgICAgICB2YXIgaGV4ID0gQ29uZmlnLmNvbG9yX2RhdGEuZGF0YV9jb2xvcjE2W2NvbG9yXTtcbiAgICAgICAgdmFyIF9jb2xvciA9IGZvbnRfbm9kZS5jb2xvcjtcbiAgICAgICAgX2NvbG9yLmZyb21IRVgoaGV4KTtcbiAgICAgICAgZm9udF9ub2RlLmNvbG9yID0gX2NvbG9yO1xuXG4gICAgICAgIC8vIOiuvue9ruaPj+i+ueminOiJslxuICAgICAgICB2YXIgb3V0X2hleCA9IENvbmZpZy5jb2xvcl9kYXRhLmRhdGFfY29sb3IxNltvdXRsaW5lXTtcbiAgICAgICAgdmFyIG91dF9saW5lID0gZm9udF9ub2RlLmdldENvbXBvbmVudChjYy5MYWJlbE91dGxpbmUpO1xuICAgICAgICB2YXIgX2NvbG9yMSA9IG91dF9saW5lLmNvbG9yO1xuICAgICAgICBfY29sb3IxLmZyb21IRVgob3V0X2hleCk7XG4gICAgICAgIG91dF9saW5lLmNvbG9yID0gX2NvbG9yMTtcblxuICAgICAgICAvLyDorr7nva7lrZfkvZNcbiAgICAgICAgdmFyIGxhYmVsID0gZm9udF9ub2RlLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIGxhYmVsLnN0cmluZyA9IGRlc2M7XG4gICAgICAgIHBhcmVudC5hZGRDaGlsZChub3JtYWxfbm9kZSk7XG5cbiAgICAgICAgaWYgKHRhcmdldC5idWZmX3Nob3dfaW5kZXggPT0gbnVsbCl7XG4gICAgICAgICAgICB0YXJnZXQuYnVmZl9zaG93X2luZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuYnVmZl9zaG93X2luZGV4ID0gdGFyZ2V0LmJ1ZmZfc2hvd19pbmRleCArIDE7XG5cbiAgICAgICAgdmFyIHNob3cgPSBjYy5zaG93KCk7XG4gICAgICAgIHZhciBkZWxheSA9IGNjLmRlbGF5VGltZSgwLjMgKiB0YXJnZXQuYnVmZl9zaG93X2luZGV4KTtcbiAgICAgICAgdmFyIGRlbGF5X292ZXIgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0YXJnZXQuYnVmZl9zaG93X2luZGV4IC09IDE7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgdmFyIHNjYWxlX3RvXzEgPSBjYy5zY2FsZVRvKDAuNCwgMS4yKTtcbiAgICAgICAgdmFyIG1vdmVfYnlfMSA9IGNjLm1vdmVCeSgwLjQsIDAsIDUwKTtcbiAgICAgICAgdmFyIGZhZGVfaW4gPSBjYy5mYWRlSW4oMC40KTtcblxuICAgICAgICB2YXIgc2NhbGVfdG9fMiA9IGNjLnNjYWxlVG8oMC42LCAwLjkpO1xuICAgICAgICB2YXIgZmFkZV9vdXQgPSBjYy5mYWRlT3V0KDAuNik7XG4gICAgICAgIHZhciBtb3ZlX2J5XzIgPSBjYy5tb3ZlQnkoMC42LCAwLCAyNSk7XG4gICAgICAgIHZhciBoaWRlID0gY2MuaGlkZSgpO1xuXG4gICAgICAgIG5vcm1hbF9ub2RlLnJ1bkFjdGlvbihjYy5zZXF1ZW5jZShzaG93LCBkZWxheSwgZGVsYXlfb3ZlciwgY2Muc3Bhd24oc2NhbGVfdG9fMSwgbW92ZV9ieV8xLCBmYWRlX2luKSwgY2Muc3Bhd24oc2NhbGVfdG9fMiwgZmFkZV9vdXQsIG1vdmVfYnlfMiksIGhpZGUsIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hCYWNrQmF0dGxlRm9udChub3JtYWxfbm9kZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSkpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pKt5pS+6a2U5rOV54m55pWIXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9wbGF5IFxuICAgICAqIEBwYXJhbSB7Kn0gbm9fZGllIFxuICAgICAqIEBwYXJhbSB7Kn0gcGxheV9lZmZlY3QgXG4gICAgICovXG4gICAgcGxheU1hZ2ljOiBmdW5jdGlvbiAoYXR0YWNrZXIsIGVmZmVjdF9wbGF5LCBwbGF5X2VmZmVjdCl7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9zY2VuZSA9PSBudWxsKXsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChlZmZlY3RfcGxheS50YXJnZXQgPT0gbnVsbCl7IHJldHVybjsgfVxuICAgICAgICBpZiAoYXR0YWNrZXIgPT0gbnVsbCl7IHJldHVybjsgfVxuICAgICAgICBpZiAoZWZmZWN0X3BsYXkucGxheV9udW0gIT0gbnVsbCAmJiBlZmZlY3RfcGxheS5wbGF5X251bSA8PSAwKXsgcmV0dXJuOyB9XG4gICAgICAgIGlmIChlZmZlY3RfcGxheS5wbGF5X251bSA9PSBudWxsICYmIGF0dGFja2VyLnNwbGl0X2h1cnQpe1xuICAgICAgICAgICAgZWZmZWN0X3BsYXkucGxheV9udW0gPSBhdHRhY2tlci5zcGxpdF9odXJ0IHx8IDE7XG4gICAgICAgICAgICBpZihlZmZlY3RfcGxheS5wbGF5X251bSA+IDEpe1xuICAgICAgICAgICAgICAgIGVmZmVjdF9wbGF5LmF2Z19ocF9jaGFuZ2VkID0gTWF0aC5jZWlsKGVmZmVjdF9wbGF5LmhwX2NoYW5nZWQgLyBlZmZlY3RfcGxheS5wbGF5X251bSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlZmZlY3RfcGxheS5wbGF5X251bSA9IGVmZmVjdF9wbGF5LnBsYXlfbnVtIHx8IDE7XG4gICAgICAgIGVmZmVjdF9wbGF5LnBsYXlfbnVtIC09IDE7XG4gICAgICAgIHZhciBlZmZlY3RfaGl0ID0gMTtcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuZ2V0QmF0dGxlUm9sZUJ5UG9zKGVmZmVjdF9wbGF5LnRhcmdldCk7XG4gICAgICAgIGlmICh0YXJnZXQpe1xuICAgICAgICAgICAgaWYgKGVmZmVjdF9wbGF5LmlzX2hpdCA9PSAwIHx8IGVmZmVjdF9wbGF5LmlzX2JsaW5kID09IDEpeyAgICAgICAgICAvLyDpl6rourLmiJbogIXmnKrlkb3kuK1cbiAgICAgICAgICAgICAgICBlZmZlY3RfaGl0ID0gMFxuICAgICAgICAgICAgICAgIHZhciBkZXNjID0gVXRpbHMuVEkxOE4oXCLpl6rourJcIik7XG4gICAgICAgICAgICAgICAgaWYoZWZmZWN0X3BsYXkuaXNfYmxpbmQgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBVdGlscy5USTE4TihcIuacquWRveS4rVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoZWZmZWN0X3BsYXkuaXNfZGVhZCA9PSAwKXsgICAgICAgLy8g6Z2e5q275Lqh5oOF5Ya15LiL5omN6aOY5a2XXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUZvbnRNZXNzYWdlKHRhcmdldCwgZGVzYywgbnVsbCwgbnVsbCwgbnVsbCwgMjI3LCAyMjgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBocF9jaGFuZ2VkID0gZWZmZWN0X3BsYXkuYXZnX2hwX2NoYW5nZWQgfHwgZWZmZWN0X3BsYXkuaHBfY2hhbmdlZCB8fCAwO1xuICAgICAgICAgICAgdmFyIGRtZyA9IE1hdGguZmxvb3IoaHBfY2hhbmdlZCk7XG4gICAgICAgICAgICBpZihlZmZlY3RfcGxheS5pc19jcml0ID09IDEpeyAgIC8vIOaatOWHu1xuICAgICAgICAgICAgICAgIGVmZmVjdF9oaXQgPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzX2RlYWQgPSBlZmZlY3RfcGxheS5pc19kZWFkO1xuICAgICAgICAgICAgaWYoZWZmZWN0X3BsYXkucGxheV9udW0gPiAwKXsgICAgICAgLy8g5aSa5qyh5Lyk5a6z55qE6K+d56ys5LiA5qyh5LiN6IO95q27XG4gICAgICAgICAgICAgICAgaXNfZGVhZCA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWkhOeQhuWPrOWUpOWIl+ihqFxuICAgICAgICAgICAgaWYgKGVmZmVjdF9wbGF5LnN1bW1vbl9saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm9sZUxpc3QoZWZmZWN0X3BsYXkuc3VtbW9uX2xpc3QsIGF0dGFja2VyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5aSE55CG5a2Q5pWI5p6cXG4gICAgICAgICAgICBpZiAoZWZmZWN0X3BsYXkuc3ViX2VmZmVjdF9wbGF5X2xpc3QubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJFZmZlY3RQbGF5bGlzdChlZmZlY3RfcGxheSwgYXR0YWNrZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlia/mnKzkuK3pnIDopoHnmoTnibnmrorlpITnkIZcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXh0ZW5kRHVuZ2VvbihlZmZlY3RfcGxheSlcbiAgICAgICAgICAgIC8vIOWkhOeQhuaPtOaKpFxuICAgICAgICAgICAgaWYgKGVmZmVjdF9wbGF5LmFpZF9hY3RvciAhPSAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFpZEFjdG9yKGVmZmVjdF9wbGF5LCBhdHRhY2tlciwgZWZmZWN0X2hpdCwgdGFyZ2V0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5pKt5pS+5Y+X5Ye75aSE55CGXG4gICAgICAgICAgICB0aGlzLnBsYXlCYXR0bGVSb2xlSHVydChhdHRhY2tlciwgdGFyZ2V0LCBkbWcsIHBsYXlfZWZmZWN0KTtcblxuICAgICAgICAgICAgLy8g6aOY5a2X5aSE55CGXG4gICAgICAgICAgICBpZihhdHRhY2tlci5lZmZlY3RfZGVzYyAhPSBcIlwiICYmIGVmZmVjdF9wbGF5LmlzX2hpdCAhPSAwICYmIGVmZmVjdF9wbGF5LnBsYXlfbnVtIDw9IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd2J1ZmZOYW1lKHRhcmdldCwgYXR0YWNrZXIuZWZmZWN0X2Rlc2MsIDIyOSwgMjMwLCBhdHRhY2tlci5wbGF5X29yZGVyX2luZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOaKiuaJo+ihgOaUvuWIsOacgOWQjizlm6DkuLrmnInmrbvkuqHliqjkvZxcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGFyZ2V0SHAoYXR0YWNrZXIsIHRhcmdldCwgZG1nLCBpc19kZWFkLCBlZmZlY3RfaGl0LCBlZmZlY3RfcGxheSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIOWkhOeQhmJ1ZmbliJfooags6Z2e5q275Lqh55qE5pe25YCZ5omN5aSE55CGLOWmguaenOS4iumdouaSreaKpeW3sue7j+ivtOatu+S6hizkuI3pnIDopoHlpITnkIZidWZm5LqGXG4gICAgICAgICAgICBpZiAoZWZmZWN0X3BsYXkucGxheV9udW0gPD0gMCAmJiBlZmZlY3RfcGxheS5idWZmX2xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQnVmZmxpc3QoYXR0YWNrZXIsIGVmZmVjdF9wbGF5LmJ1ZmZfbGlzdCwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmkq3mlL7lj5flh7vlpITnkIZcbiAgICBwbGF5QmF0dGxlUm9sZUh1cnQ6ZnVuY3Rpb24oYXR0YWNrZXIsIHRhcmdldCwgZG1nLCBwbGF5X2VmZmVjdCl7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmICh0YXJnZXQuaXNfaHVydF9wbGF5ID09IHRydWUpIHJldHVybjtcbiAgICAgICAgdGFyZ2V0LmlzX2h1cnRfcGxheSA9IHRydWVcblxuICAgICAgICBpZiAoIXRhcmdldC5pc19iaWdfcGxheSkge1xuICAgICAgICAgICAgdGFyZ2V0LmlzX2JpZ19wbGF5ID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5wbGF5SHVydEVmZmVjdChhdHRhY2tlciwgdGFyZ2V0KVxuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRhY2tlci5wb3MgIT0gdGFyZ2V0LnBvcyAmJiBkbWcgPCAwICYmIGF0dGFja2VyLmdyb3VwICE9IHRhcmdldC5ncm91cCkgeyAgICAvLyDmkq3mlL7lj5flh7vliqjkvZxcbiAgICAgICAgICAgIGlmIChhdHRhY2tlci5oaXRfYWN0aW9uICE9IFwibm8taHVydFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9hY3QuaHVydChhdHRhY2tlciwgdGFyZ2V0LCBhdHRhY2tlci5oaXRfYWN0aW9uLCBwbGF5X2VmZmVjdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmm7TmlrDooYDmnaHlpITnkIZcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFxuICAgICAqIEBwYXJhbSB7Kn0gZG1nIFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfZGllIFxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X2hpdCAx5piv5piv5pmu6YCaLCAy5piv5pq05Ye7XG4gICAgICogQHBhcmFtIHsqfSBpc195dWFuaHUgXG4gICAgICogQHBhcmFtIHsqfSBpc19ub3JtYWwgXG4gICAgICogQHBhcmFtIHsqfSBlZmZlY3RfcGxheSBcbiAgICAgKi9cbiAgICB1cGRhdGVUYXJnZXRIcDpmdW5jdGlvbihhdHRhY2tlciwgdGFyZ2V0LCBkbWcsIGlzX2RpZSwgZWZmZWN0X2hpdCwgZWZmZWN0X3BsYXkpe1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKGF0dGFja2VyID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKGRtZyA9PSAwKSByZXR1cm47XG4gICAgICAgIGVmZmVjdF9oaXQgPSBlZmZlY3RfaGl0IHx8IDE7XG4gICAgICAgIHRoaXMubXV0aUh1cnROdW0odGFyZ2V0LCBkbWcsIGVmZmVjdF9oaXQsIGZhbHNlLCBlZmZlY3RfcGxheS5jYW1wX3Jlc3RyYWluKTtcbiAgICAgICAgLy8g5YKo5a2Y5YW35L2T5pWw5o2uXG4gICAgICAgIHRhcmdldC51cGRhdGVIUChkbWcsIGlzX2RpZSwgZmFsc2UsIGF0dGFja2VyLmlzX211c3RfZGllKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pKt5pS+5Lyk5a6z6aOY6KGAXG4gICAgICogQHBhcmFtIHsqfSB0YXRnZXQgXG4gICAgICogQHBhcmFtIHsqfSBkbWcgXG4gICAgICogQHBhcmFtIHsqfSBlZmZlY3RfaGl0IDHmmK/mmK/mma7pgJosIDLmmK/mmrTlh7tcbiAgICAgKiBAcGFyYW0geyp9IGlzX25vcm1hbCBcbiAgICAgKiBAcGFyYW0geyp9IGlzX2J1ZmYgXG4gICAgICogQHBhcmFtIHsqfSBjYW1wX3Jlc3RyYWluIFxuICAgICAqL1xuICAgIG11dGlIdXJ0TnVtOmZ1bmN0aW9uKHRhcmdldCwgZG1nLCBlZmZlY3RfaGl0LCBpc19idWZmLCBjYW1wX3Jlc3RyYWluKXtcbiAgICAgICAgaWYodGhpcy5jaGVja0lzSW5CYXR0bGUodGFyZ2V0KSA9PSBmYWxzZSB8fCBkbWcgPT0gMCB8fCB0YXJnZXQuaXNfcmVhbCA9PSBmYWxzZSl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g6L+Z5Liq5pWw5YC855So5LqO5aSE55CG6aOY6KGA6auY5bqm55qELi4u5pS+572u5Y+g5Yqg5Yiw5LiA6LW3XG4gICAgICAgIGlmICh0YXJnZXQuZG1nX2luZGV4ID09IG51bGwpe1xuICAgICAgICAgICAgdGFyZ2V0LmRtZ19pbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRtZ19pbmRleCArPSAxO1xuICAgICAgICB0aGlzLnNraWxsX2FjdC5wbGF5RG1nTWVzc2FnZSh0YXJnZXQsIGRtZywgZWZmZWN0X2hpdCwgaXNfYnVmZiwgY2FtcF9yZXN0cmFpbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWkhOeQhmJ1ZmbmlYjmnpxcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gbGlzdCBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9oaXQg5piv5ZCm5piv5pq05Ye7XG4gICAgICovXG4gICAgaGFuZGxlQnVmZmxpc3Q6ZnVuY3Rpb24oYXR0YWNrZXIsbGlzdCxlZmZlY3RfaGl0KXtcbiAgICAgICAgaWYodGhpcy5jaGVja0lzSW5CYXR0bGUoYXR0YWNrZXIpID09IGZhbHNlKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBsaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0QmF0dGxlUm9sZUJ5UG9zKGJ1ZmYudGFyZ2V0KTtcbiAgICAgICAgICAgIGlmKHRhcmdldCl7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5Um91bmRCdWZmKHRhcmdldCwgYnVmZiwgYXR0YWNrZXIsIGVmZmVjdF9oaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOa3u+WKoOS4gOS4qmJ1ZlxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgYnVmZueahOWPkei1t+iAhS7lj6/og73msqHmnIlcbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBcbiAgICAgKiBAcGFyYW0geyp9IGJ1ZmYgXG4gICAgICovXG4gICAgYWRkQnVmZjpmdW5jdGlvbihhdHRhY2tlciwgdGFyZ2V0LCBidWZmKXtcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IGJ1ZmYgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgYnVmZl9kYXRhID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfYnVmZltidWZmLmJ1ZmZfYmlkXTsgXG4gICAgICAgIGlmIChidWZmX2RhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAoYnVmZl9kYXRhLmlzX3Bhc3NpdmUgPT0gMSl7XG4gICAgICAgICAgICB0aGlzLnBsYXlCdWZmRWZmZWN0KGF0dGFja2VyLCB0YXJnZXQsIGJ1ZmYsIGJ1ZmZfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1ZmYuYWN0aW9uX3R5cGUgPT0gNCkgcmV0dXJuO1xuICAgICAgICBpZiAoYnVmZi5hY3Rpb25fdHlwZSA9PSAyKXtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVmZih0YXJnZXQsIGJ1ZmYsIGJ1ZmZfZGF0YSk7XG4gICAgICAgIH1lbHNle1xuXG4gICAgICAgICAgICBpZiAoYnVmZl9kYXRhLmlzX3Bhc3NpdmUgPT0gMSB8fCBidWZmX2RhdGEuZ3JvdXAgPT0gMzIxMSl7ICAgIC8vIOS4jeWPr+Wkjea0u+e7hOeahGJ1Zmbpop3lpJblpITnkIZcbiAgICAgICAgICAgICAgICBpZiAoYnVmZi5hY3Rpb25fdHlwZSA9PSAxIHx8IGJ1ZmYuYWN0aW9uX3R5cGUgPT0gMyl7ICAgIC8vIOS4u+WkhOeQhuaWsOWinuaIluiAheaYr+WxleekuueahGJ1ZmZcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZfZGF0YS5ncm91cCAhPSAzMjExKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZl9kYXRhLmJ1ZmZfc3BpbmUgJiYgYnVmZl9kYXRhLmJ1ZmZfZGF0YSAhPSBcIlwiKSB7ICAgIC8vIOWtmOWcqOWPmOi6q+eahGJ1ZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY2hhbmdlU3BpbmUodHJ1ZSwgYnVmZl9kYXRhLmJ1ZmZfc3BpbmUsIFBsYXllckFjdGlvbi5iYXR0bGVfc3RhbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZfZGF0YS5ncm91cCA9PSAzNzAzKSB7ICAgICAgICAvLyDpmpDouqtidWZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9wYWNpdHkodHJ1ZSwgMTU1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZi5hY3Rpb25fdHlwZSA9PSAxICYmIGJ1ZmYucmVtYWluX3JvdW5kICE9IDApeyAgICAgLy8g5paw5aKeYnVmZuaJjeWkhOeQhizov5nph4zkuLvopoHmmK/lvIDlp4vlop7liqDooYDmnaHkuIvpnaLnmoRidWZmaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnVwZGF0ZUJ1ZmZMaXN0KGJ1ZmYsIGJ1ZmZfZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56e76Zmk5LiA5LiqYnVmZizljIXlkKvnp7vpmaTkuIDkuKrlr7nosaHnmoTnibnmlYjlkoznp7vpmaTkuIDkuKpidWZm5Zu+5qCHXG4gICAgcmVtb3ZlQnVmZjpmdW5jdGlvbih0YXJnZXQsIGJ1ZmYsIGJ1ZmZfZGF0YSl7XG4gICAgICAgIGlmKHRoaXMuZ2V0QmF0dGxlU2NlbmUoKSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmKGJ1ZmYgPT0gbnVsbCB8fCBidWZmX2RhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgaGFkX2J1ZmYgPSB0YXJnZXQuaGFkQnVmZihidWZmLmlkKTtcbiAgICAgICAgaWYgKGhhZF9idWZmID09IHRydWUpe1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUJ1ZmZMaXN0KGJ1ZmYuaWQpOyAvLyDnp7vpmaTkuIDkuKpidWZmLOW5tuS4lOWMheWQq+enu+mZpGJ1Zmblm77moIdcbiAgICAgICAgICAgIGlmIChidWZmX2RhdGEuZ3JvdXAgPT0gMzcwMyl7ICAgLy8g6ZqQ6LqrYnVmZlxuICAgICAgICAgICAgICAgIHRhcmdldC5zZXRPcGFjaXR5KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWZmX2RhdGEuYnVmZl9zcGluZSAmJiBidWZmX2RhdGEuYnVmZl9zcGluZSAhPSBcIlwiKXsgICAgLy8g56e76Zmk5Y+Y6Lqr5pWI5p6cXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmNoYW5nZVNwaW5lKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWmguaenOaYr+WcuuaZr2J1ZmYs5YiZ56e76ZmkXG4gICAgICAgICAgICB2YXIgZWZmZWN0X2NvbmZpZyA9IENvbmZpZy5za2lsbF9kYXRhLmRhdGFfZ2V0X2VmZmVjdF9kYXRhW2J1ZmZfZGF0YS5yZXNdO1xuICAgICAgICAgICAgaWYgKGVmZmVjdF9jb25maWcgJiYgZWZmZWN0X2NvbmZpZy5wbGF5X3R5cGUgPT0gQmF0dGxlQ29uc3QuRWZmZWN0X1BsYXlfVHlwZS5ST0xFX1NDRU5FKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVNjZW5lQnVmZkVmZmVjdCh0YXJnZXQuZ3JvdXAsIGVmZmVjdF9jb25maWcuYmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOenu+mZpGJ1ZmblrZjlnKjnmoTnibnmlYjnu5HlnKjoh6rouqvkuIrnmoRcbiAgICAgICAgICAgIGlmIChlZmZlY3RfY29uZmlnKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUJhdHRsZVNwaW5lRWZmZWN0KHRhcmdldCwgZWZmZWN0X2NvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5re75Yqg5LiA5Liq5Zy65pmvYnVmZueJueaViFxuICAgIGFkZFNjZW5lQnVmZkVmZmVjdDpmdW5jdGlvbihncm91cCwgYmlkLCBlZmZlY3RfcmVzLCBlZmZlY3Qpe1xuICAgICAgICBpZihncm91cCA9PSBudWxsIHx8IGJpZCA9PSBudWxsIHx8IGVmZmVjdF9yZXMgPT0gbnVsbCB8fCBlZmZlY3QgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIga2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KGdyb3VwLCBiaWQpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZV9idWZmX2VmZmVjdF9saXN0W2tleV0gPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Rba2V5XSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOWtmOWcqOeahOivnSzlhYjkuKLliLDlr7nosaHmsaDph4zpnaLljrtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmVfYnVmZl9lZmZlY3RfbGlzdFtrZXldW2VmZmVjdF9yZXNdKXtcbiAgICAgICAgICAgIHRoaXMuZGVsQmF0dGxlRWZmZWN0KHRoaXMuc2NlbmVfYnVmZl9lZmZlY3RfbGlzdFtrZXldW2VmZmVjdF9yZXNdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Rba2V5XVtlZmZlY3RfcmVzXSA9IGVmZmVjdDtcbiAgICB9LFxuXG4gICAgLy8g56e76Zmk5LiA5Liq5Zy65pmvYnVmZueJueaViFxuICAgIHJlbW92ZVNjZW5lQnVmZkVmZmVjdDpmdW5jdGlvbihncm91cCwgZWZmZWN0X2JpZCl7XG4gICAgICAgIGlmKGdyb3VwID09IG51bGwgfHwgZWZmZWN0X2JpZCA9PSBudWxsKXtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Qpe1xuICAgICAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuc2NlbmVfYnVmZl9lZmZlY3RfbGlzdCl7XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgcmVzIGluIHRoaXMuc2NlbmVfYnVmZl9lZmZlY3RfbGlzdFtrZXldKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlZmZlY3QgPSB0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Rba2V5XVtyZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxCYXR0bGVFZmZlY3QodGhpcy5zY2VuZV9idWZmX2VmZmVjdF9saXN0W2tleV1bZWZmZWN0XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZV9idWZmX2VmZmVjdF9saXN0ID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdmFyIGtleSA9IFV0aWxzLmdldE5vcktleShncm91cCwgZWZmZWN0X2JpZCk7XG4gICAgICAgICAgICB2YXIgZWZmZWN0X2xpc3QgPSB0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmIChlZmZlY3RfbGlzdCl7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGVmZmVjdF9saXN0KXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxCYXR0bGVFZmZlY3QoZWZmZWN0X2xpc3Rba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY2VuZV9idWZmX2VmZmVjdF9saXN0W2tleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOenu+mZpOS4gOS4que7keWcqOWNleS9jei6q+S4iueahGJ1ZmbnibnmlYgs6L+Z6YeM5Lya5qC55o2u54m55pWI6YWN572u5Y675Yik5pat5LiK5LiL5bGC54m55pWI6LWE5rqQXG4gICAgcmVtb3ZlQmF0dGxlU3BpbmVFZmZlY3Q6ZnVuY3Rpb24odGFyZ2V0LCBlZmZlY3RfY29uZmlnKXtcbiAgICAgICAgaWYodGFyZ2V0ID09IG51bGwgfHwgZWZmZWN0X2NvbmZpZyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBhY3Rpb25fbmFtZSA9IFBsYXllckFjdGlvbi5hY3Rpb247XG4gICAgICAgIGlmIChlZmZlY3RfY29uZmlnLnVwX2FjdGlvbl9uYW1lICE9IFwiXCIpe1xuICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBlZmZlY3RfY29uZmlnLnVwX2FjdGlvbl9uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxCYXR0bGVFZmZlY3QoZWZmZWN0X2NvbmZpZy5yZXNfdXAsIGFjdGlvbl9uYW1lKTsgIC8vIOenu+mZpOS4iuWxgueJueaViFxuXG4gICAgICAgIGFjdGlvbl9uYW1lID0gUGxheWVyQWN0aW9uLmFjdGlvbjtcbiAgICAgICAgaWYgKGVmZmVjdF9jb25maWcuZG93bl9hY3Rpb25fbmFtZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICBhY3Rpb25fbmFtZSA9IGVmZmVjdF9jb25maWcuZG93bl9hY3Rpb25fbmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsQmF0dGxlRWZmZWN0KGVmZmVjdF9jb25maWcucmVzX2Rvd24sIGFjdGlvbl9uYW1lKTsgIC8vIOenu+mZpOS4i+WxgueJueaViFxuICAgIH0sXG5cbiAgICAvLyDmkq3mlL5idWZm5pWI5p6cLOS7peWPiua3u+WKoGJ1ZmZpY29u562JXG4gICAgcGxheUJ1ZmZFZmZlY3Q6ZnVuY3Rpb24oYXR0YWNrZXIsIHRhcmdldCwgYnVmZiwgYnVmZl9kYXRhKXtcbiAgICAgICAgaWYoYnVmZiA9PSBudWxsIHx8IGJ1ZmZfZGF0YSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciB0ZXh0X2NvbG9yID0gbnVsbDtcbiAgICAgICAgdmFyIG91dGxpbmVfY29sb3IgPSBudWxsO1xuICAgICAgICBpZiAoYnVmZl9kYXRhLmNsaWVudF9kZXNjICE9IFwiXCIpe1xuICAgICAgICAgICAgaWYgKGJ1ZmYuYWN0aW9uX3R5cGUgPT0gMSB8fCBidWZmLmFjdGlvbl90eXBlID09IDQpeyAgICAvLyDlop7nm4pcbiAgICAgICAgICAgICAgICBpZiAoYnVmZl9kYXRhLnBvc2l0aXZlX29yX25lZ2F0aXZlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9jb2xvciA9IDIyMVxuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lX2NvbG9yID0gMjIyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmX2RhdGEucG9zaXRpdmVfb3JfbmVnYXRpdmUgPT0gMikgeyAgICAvLyDlh4/nm4pcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9jb2xvciA9IDIyM1xuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lX2NvbG9yID0gMjI0XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmX2RhdGEucG9zaXRpdmVfb3JfbmVnYXRpdmUgPT0gMykgeyAgICAvLyDmjqfliLZcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9jb2xvciA9IDIyNVxuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lX2NvbG9yID0gMjI2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd2J1ZmZOYW1lKHRhcmdldCwgYnVmZl9kYXRhLmNsaWVudF9kZXNjLCB0ZXh0X2NvbG9yLCBvdXRsaW5lX2NvbG9yLCBidWZmLmJ1ZmZfYmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0YWNrZXIgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgaGFkYnVmZiA9IHRhcmdldC5oYWRCdWZmKGJ1ZmYuaWQpO1xuICAgICAgICBpZiAoIWhhZGJ1ZmYgJiYgYnVmZi5hY3Rpb25fdHlwZSA9PSAxICYmIGJ1ZmZfZGF0YS5yZXMgIT0gMCl7ICAvLyDkuI3lrZjlnKjnmoRidWZm5omN6ZyA6KaB5aSE55CGXG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbYnVmZl9kYXRhLnJlc107XG4gICAgICAgICAgICBpZihjb25maWcpe1xuICAgICAgICAgICAgICAgIGlmKGNvbmZpZy5wbGF5X3R5cGUgPT0gQmF0dGxlQ29uc3QuRWZmZWN0X1BsYXlfVHlwZS5ST0xFX1NDRU5FKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IFV0aWxzLmdldE5vcktleSh0YXJnZXQuZ3JvdXAsIGJ1ZmZfZGF0YS5yZXMpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lX2J1ZmZfZWZmZWN0X2xpc3Rba2V5XSA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5zY2VuZV9idWZmX2VmZmVjdF9saXN0W2tleV0pID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0QXJlYShhdHRhY2tlciwgW2NvbmZpZy5yZXNfdXAsIGNvbmZpZy5yZXNfZG93bl0sIDAsIG51bGwsIGNvbmZpZy5wbGF5X3R5cGUsIGNvbmZpZy54X2ZpeCwgY29uZmlnLnlfZml4LCBidWZmX2RhdGEucmVzLCBjb25maWcuaXNfY29sX2VmZmVjdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0U3BpbmVVc2VyKGF0dGFja2VyLCAoYnVmZl9kYXRhLmlzX3JlbGVhc2UgPT0gMSksIGNvbmZpZy54X2ZpeCAqIHRhcmdldC5vYmpfdHlwZSwgY29uZmlnLnlfZml4LCBbY29uZmlnLnJlc191cCwgY29uZmlnLnJlc19kb3duXSwgdGFyZ2V0LCAxLCBudWxsLCBidWZmX2RhdGEuYmlkLCBidWZmX2RhdGEucmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5LiA5qyh5pWI5p6cXG4gICAgICAgIGlmKGJ1ZmYuYWN0aW9uX3R5cGUgPT0gMyAmJiBidWZmX2RhdGEuZWZmdGl2ZV9lZmZlY3QgIT0gMCl7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbYnVmZl9kYXRhLmVmZnRpdmVfZWZmZWN0XTtcbiAgICAgICAgICAgIGlmKGNvbmZpZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RTcGluZVVzZXIoYXR0YWNrZXIsIHRydWUsIGNvbmZpZy54X2ZpeCAqIHRhcmdldC5vYmpfdHlwZSwgY29uZmlnLnlfZml4LCBbY29uZmlnLnJlc191cCwgY29uZmlnLnJlc19kb3duXSwgdGFyZ2V0LCAxLCBudWxsLCBidWZmX2RhdGEuYmlkLCBidWZmX2RhdGEucmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmkq3mlL5idWZm5o+P6L+w5paH5a2XLOi/memHjOmcgOimgeWvuei/meS4quWvueixoeWBmuWIpOaWrSzlpoLmnpxiaWTnmoTpo5jlrZflrZjlnKgs5YiZ5LiN5aSE55CG5LqGLi4uXG4gICAgc2hvd2J1ZmZOYW1lOmZ1bmN0aW9uKHRhcmdldCwgZGVzYywgY29sb3IsIG91dGxpbmVfY29sb3IsIGJpZCl7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCBiaWQgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAodGFyZ2V0LnRpcHNfbGlzdFtiaWRdKSByZXR1cm47XG4gICAgICAgIHRhcmdldC5hZGRUaXBzKGJpZCk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0YXJnZXQucmVtb3ZlVGlwcyhiaWQpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGxheUZvbnRNZXNzYWdlKHRhcmdldCwgZGVzYywgbnVsbCwgbnVsbCwgbnVsbCwgY29sb3IsIG91dGxpbmVfY29sb3IsIGNhbGxiYWNrKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmt7vliqDlj6zllKTliJfooahcbiAgICAgKiBAcGFyYW0geyp9IGxpc3QgXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKi9cbiAgICBhZGRSb2xlTGlzdDpmdW5jdGlvbihsaXN0LCBhdHRhY2tlcil7XG4gICAgICAgIGlmKGxpc3QgPT0gbnVsbCB8fCBsaXN0Lmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWkhOeQhuWtkOaViOaenFxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X3BsYXkgXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKi9cbiAgICBoYW5kbGVTdWJFZmZlY3RQbGF5bGlzdDpmdW5jdGlvbihlZmZlY3RfcGxheSwgYXR0YWNrZXIpe1xuICAgICAgICBpZiAoZWZmZWN0X3BsYXkgPT0gbnVsbCB8fCBlZmZlY3RfcGxheS5zdWJfZWZmZWN0X3BsYXlfbGlzdCA9PSBudWxsIHx8IGVmZmVjdF9wbGF5LnN1Yl9lZmZlY3RfcGxheV9saXN0Lmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlZmZlY3RfcGxheS5zdWJfZWZmZWN0X3BsYXlfbGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlZmZlY3RfcGxheS5zdWJfZWZmZWN0X3BsYXlfbGlzdFtpbmRleF07XG4gICAgICAgICAgICB2YXIgc3ViX3RhcmdldCA9IHRoaXMucmVhbF9yb2xlX2xpc3RbZWxlbWVudC5zdWJfdGFyZ2V0XTtcbiAgICAgICAgICAgIGlmIChzdWJfdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgLy8g5pKt5pS+5rCU6KGA5Y+Y5YyW55qEXG4gICAgICAgICAgICAgICAgdGhpcy5iYXR0bGVSb2xlSFBDaGFuZ2Uoc3ViX3RhcmdldCwgZWxlbWVudC5zdWJfaHBfY2hhbmdlZCwgZmFsc2UsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmV4dHJhX2VmZmVjdCAmJiBlbGVtZW50LmV4dHJhX2VmZmVjdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBlbGVtZW50LmV4dHJhX2VmZmVjdC5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0cmEgPSBlbGVtZW50LmV4dHJhX2VmZmVjdFtuXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYS5leHRyYV9rZXkgPT0gMil7ICAgLy8g5oqk55u+5ZC45pS2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lsbF9hY3QucGxheUJ1ZmZBYnNvcmJIdXJ0KHN1Yl90YXJnZXQsIGV4dHJhLmV4dHJhX3BhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmioDog73mlYjmnpzmmK/lkKbpo5jlrZdcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0X2NvbmZpZyA9IGdkYXRhKCdza2lsbF9kYXRhJywgJ2RhdGFfZ2V0X2VmZmVjdCcsIGVsZW1lbnQuc3ViX2VmZmVjdF9pZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdF9jb25maWcgJiYgZWZmZWN0X2NvbmZpZy5lZmZlY3RfZGVzYyAhPSBcIlwiICYmIGVsZW1lbnQuc3ViX2lzX2hpdCAhPSAwKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93YnVmZk5hbWUoc3ViX3RhcmdldCwgZWZmZWN0X2NvbmZpZy5lZmZlY3RfZGVzYywgMjI5LCAyMzAsIGVsZW1lbnQuc3ViX2VmZmVjdF9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOiiq+WKqOaKgOiDveaYr+WQpumjmOWtl1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9jb25maWcgPSBnZGF0YSgnc2tpbGxfZGF0YScsICdkYXRhX2dldF9za2lsbCcsIGVsZW1lbnQuc3ViX3NraWxsX2lkKTsgXG4gICAgICAgICAgICAgICAgaWYgKHNraWxsX2NvbmZpZyAmJiBza2lsbF9jb25maWcucGFzc2l2ZV9za2lsbF9zaG93ID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93YnVmZk5hbWUoc3ViX3RhcmdldCwgc2tpbGxfY29uZmlnLm5hbWUsIDIxNywgMjE4LCBlbGVtZW50LnN1Yl9za2lsbF9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOmXqui6suWkhOeQhlxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN1Yl9pc19oaXQgPT0gMCAmJiBlZmZlY3RfcGxheS5pc19kZWFkID09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3didWZmTmFtZShzdWJfdGFyZ2V0LCBVdGlscy5USTE4TihcIui6sumXqlwiKSwgMjI3LCAyMjgsIGVsZW1lbnQuc3ViX2VmZmVjdF9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWJr+acrOaVsOaNrueJueauiuWkhOeQhlxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X3BsYXkgXG4gICAgICovXG4gICAgaGFuZGxlRXh0ZW5kRHVuZ2VvbjpmdW5jdGlvbihlZmZlY3RfcGxheSl7XG4gICAgICAgIGlmICh0aGlzLmJhdHRsZV9kYXRhID09IG51bGwgfHwgdGhpcy5iYXR0bGVfZGF0YS5jb21iYXRfdHlwZSAhPSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkd1aWxkRHVuKSByZXR1cm47XG4gICAgICAgIGlmKHRoaXMuZm9ybV9maWdodF91aSl7XG4gICAgICAgICAgICB0aGlzLmZvcm1fZmlnaHRfdWkuYWRkR3VpbGRCb3NzVUkoZWZmZWN0X3BsYXkudG90YWxfaHVydClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDlpITnkIbmj7TmiqRcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9wbGF5IFxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICogQHBhcmFtIHsqfSBlZmZlY3RfaGl0IOaYr+WQpuaatOWHu1xuICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0XG4gICAgICovXG4gICAgaGFuZGxlQWlkQWN0b3I6ZnVuY3Rpb24oZWZmZWN0X3BsYXksIGF0dGFja2VyLCBlZmZlY3RfaGl0LCB0YXJnZXQpe1xuICAgICAgICBpZiAoZWZmZWN0X3BsYXkgPT0gbnVsbCB8fCBlZmZlY3RfcGxheS5haWRfYWN0b3IgPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgYWlkX3RhcmdldCA9IHRoaXMucmVhbF9yb2xlX2xpc3RbZWZmZWN0X3BsYXkuYWlkX2FjdG9yXTtcbiAgICAgICAgaWYgKGFpZF90YXJnZXQpe1xuICAgICAgICAgICAgdmFyIGFpZF9kbWcgPSBlZmZlY3RfcGxheS5hY3Rvcl9ocF9jaGFuZ2VkOyAgICAgLy8g5o+05oqk6ICF6KGA6YeP5Y+Y5YyWXG4gICAgICAgICAgICB2YXIgZnJpZW5kX3BvcyA9IHRhcmdldC5zY2VuZV9wb3M7ICAgICAgICAgICAgICAvLyBcbiAgICAgICAgICAgIHZhciByb2xlX3dpZHRoID0gdGFyZ2V0Lm1vZGVsX3dpZHRoICogdGFyZ2V0Lm9ial90eXBlO1xuICAgICAgICAgICAgdmFyIGNhbXBfcmVzdHJhaW4gPSBlZmZlY3RfcGxheS5jYW1wX3Jlc3RyYWluOyAgLy8g5piv5ZCm5piv6Zi16JCl5Y6L5Yi2XG4gICAgICAgICAgICBhaWRfdGFyZ2V0LnNldExvY2FsWk9yZGVyKHRhcmdldC5nZXRMb2NhbFpPcmRlcigpICsgMSk7ICAgICAvLyDlsYLnuqfmlL7liLDkuIrpnaLmnaVcbiAgICAgICAgICAgIGFpZF90YXJnZXQuc2V0U2NlbmVQb3MoY2MudjIoZnJpZW5kX3Bvcy54ICsgcm9sZV93aWR0aCwgZnJpZW5kX3Bvcy55KSk7IC8vIOiuvue9ruaPtOaKpOWdkOagh1xuICAgICAgICAgICAgdGhpcy5hY3RTdGFydChhdHRhY2tlcik7XG4gICAgICAgICAgICB0aGlzLnNraWxsX2FjdC5haWRfaHVydChhdHRhY2tlciwgYWlkX3RhcmdldCwgXCJodXJ0XCIpO1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVSb2xlSFBDaGFuZ2UoYWlkX3RhcmdldCwgYWlkX2RtZywgZWZmZWN0X3BsYXkuYWN0b3JfaXNfZGVhZCwgZWZmZWN0X2hpdCwgZmFsc2UsIGNhbXBfcmVzdHJhaW4pO1xuICAgICAgICAgICAgdGhpcy5wbGF5SHVydEVmZmVjdChhdHRhY2tlciwgYWlkX3RhcmdldCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pKt5pS+5Lyk5a6z54m55pWIXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBcbiAgICAgKi9cbiAgICBwbGF5SHVydEVmZmVjdDpmdW5jdGlvbihhdHRhY2tlciwgdGFyZ2V0KXtcbiAgICAgICAgaWYodGhpcy5iYXR0bGVfc2NlbmUgPT0gbnVsbCB8fCBhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLmhpdF9lZmZlY3RfbGlzdCA9PSBudWxsIHx8IGF0dGFja2VyLmhpdF9lZmZlY3RfbGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBhdHRhY2tlci5oaXRfZWZmZWN0X2xpc3Q7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG4gICAgICAgICAgICB0aGlzLmVmZmVjdFNwaW5lVXNlcihhdHRhY2tlciwgdHJ1ZSwgZWxlbWVudC54X2ZpeCAqIGF0dGFja2VyLm9ial90eXBlLCBlbGVtZW50LnlfZml4LCBbZWxlbWVudC5yZXNfdXAsIGVsZW1lbnQucmVzX2Rvd25dLCB0YXJnZXQsIGVsZW1lbnQuc2NhbGUgKiAwLjAwMSwgbnVsbCwgZWxlbWVudC5iaWQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWHuuaJi+WJjeWKqOS9nFxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICovXG4gICAgYXR0YWNrUmVhZHk6ZnVuY3Rpb24oYXR0YWNrZXIpe1xuICAgICAgICBpZihhdHRhY2tlciA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZihhdHRhY2tlci5iYWN0X2VmZmVjdF9saXN0ID09IG51bGwgfHwgYXR0YWNrZXIuYmFjdF9lZmZlY3RfbGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pKt5pS+5Ye65omL5YmN6Z+z5pWIXG4gICAgICAgIGlmIChhdHRhY2tlci5yZWFkeV9zb3VuZCAmJiBhdHRhY2tlci5yZWFkeV9zb3VuZCAhPSBcIlwiICYmIGF0dGFja2VyLmlzX3JlYWwgPT0gdHJ1ZSApIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlFZmZlY3RTb3VuZChBVURJT19UWVBFLkJBVFRMRSwgYXR0YWNrZXIucmVhZHlfc291bmQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gYXR0YWNrZXIuYmFjdF9lZmZlY3RfbGlzdDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5wbGF5X3R5cGUgPT0gQmF0dGxlQ29uc3QuRWZmZWN0X1BsYXlfVHlwZS5ST0xFKXtcbiAgICAgICAgICAgICAgICBpZihlbGVtZW50LnJlc191cCAhPSBcIlwiIHx8IGVsZW1lbnQucmVzX2Rvd24gIT0gXCJcIil7ICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdFNwaW5lVXNlcihhdHRhY2tlciwgdHJ1ZSwgZWxlbWVudC54X2ZpeCphdHRhY2tlci5vYmpfdHlwZSwgZWxlbWVudC55X2ZpeCwgW2VsZW1lbnQucmVzX3VwLCBlbGVtZW50LnJlc19kb3duXSwgYXR0YWNrZXIsIGVsZW1lbnQuc2NhbGUqMC4wMDEsIG51bGwsIGVsZW1lbnQuYmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Yib5bu65Y2V5L2N6Lef6ZqP54m55pWIXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGlzX3JlbGVhc2UgXG4gICAgICogQHBhcmFtIHsqfSB4X2ZpeCBcbiAgICAgKiBAcGFyYW0geyp9IGhlaWdodCBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9saXN0XG4gICAgICogQHBhcmFtIHsqfSB0YXJnZXQg55uu5qCH5a+56LGhLOS5n+WPr+iDveaYr+iHquW3sSzkuZ/lj6/og73mmK/ooqvmlLvlh7vogIUgXG4gICAgICogQHBhcmFtIHsqfSBzY2FsZSBcbiAgICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrIFxuICAgICAqIEBwYXJhbSB7Kn0gYmlkIFxuICAgICAqIEBwYXJhbSB7Kn0gYnVmZl9iaWQg5aaC5p6c6L+Z5Liq5YC85LiN5Li6MCzljbPmnIDnu4jlgLxcbiAgICAgKi9cbiAgICBlZmZlY3RTcGluZVVzZXI6IGZ1bmN0aW9uIChhdHRhY2tlciwgaXNfcmVsZWFzZSwgeF9maXgsIGhlaWdodCwgZWZmZWN0X2xpc3QsIHRhcmdldCwgc2NhbGUsIGNhbGxiYWNrLCBiaWQsIGJ1ZmZfYmlkKXtcbiAgICAgICAgaWYgKGJ1ZmZfYmlkICYmIGJ1ZmZfYmlkICE9IDApe1xuICAgICAgICAgICAgYmlkID0gYnVmZl9iaWRcbiAgICAgICAgfVxuICAgICAgICB2YXIgb2JqX3R5cGUgPSBCYXR0bGVDb25zdC5CYXR0bGVfVHlwZV9Db25mLlRZUEVfUk9MRTtcbiAgICAgICAgaWYgKGF0dGFja2VyKXtcbiAgICAgICAgICAgIG9ial90eXBlID0gYXR0YWNrZXIub2JqX3R5cGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5za2lsbF9hY3QuZWZmZWN0U3BpbmVVc2VyKGF0dGFja2VyLCBpc19yZWxlYXNlLCB4X2ZpeCwgaGVpZ2h0LCBlZmZlY3RfbGlzdCwgdGFyZ2V0LCBzY2FsZSwgY2FsbGJhY2ssIGJpZCwgb2JqX3R5cGUpO1xuICAgIH0sXG5cbiAgICAvLyDnvqTmlLtcbiAgICBhcmVhSHVydDpmdW5jdGlvbihhdHRhY2tlcil7XG4gICAgICAgIHZhciBodXJ0X2Z1bmMgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYmF0dGxlX3NjZW5lKXtcbiAgICAgICAgICAgICAgICB2YXIgcm9sZV9saXN0ID0gdGhpcy5nZXRBbGxCYXR0bGVSb2xlTGlzdCgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiByb2xlX2xpc3Qpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gcm9sZV9saXN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlLmlzX2h1cnRfcGxheSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlLmlzX2JpZ19wbGF5ID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmF0Y2hQbGF5SHVydChhdHRhY2tlcik7XG4gICAgICAgIH0pLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGxheVNjZW5lQXJlYUVmZmVjdChhdHRhY2tlciwgaHVydF9mdW5jKTtcbiAgICB9LFxuXG4gICAgLy8g5pKt5pS+6IyD5Zu054m55pWIXG4gICAgcGxheVNjZW5lQXJlYUVmZmVjdDpmdW5jdGlvbihhdHRhY2tlciwgY2FsbGJhY2spe1xuICAgICAgICBpZihhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLnBsYXlfb3JkZXJfaW5kZXggPT0gbnVsbCB8fCBhdHRhY2tlci5hcmVhX2VmZmVjdF9saXN0ID09IG51bGwgfHwgYXR0YWNrZXIuYXJlYV9lZmZlY3RfbGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycmF5ID0gYXR0YWNrZXIuYXJlYV9lZmZlY3RfbGlzdDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIChlbGVtZW50LnJlc19kb3duICE9IFwiXCIgfHwgZWxlbWVudC5yZXNfdXAgIT0gXCJcIikpe1xuICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0QXJlYShhdHRhY2tlciwgW2VsZW1lbnQucmVzX3VwLCBlbGVtZW50LnJlc19kb3duXSwgMCwgY2FsbGJhY2ssIGVsZW1lbnQucGxheV90eXBlLCBlbGVtZW50LnhfZml4LCBlbGVtZW50LnlfZml4LCBlbGVtZW50LmJpZCwgZWxlbWVudC5pc19jb2xfZWZmZWN0KVxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pKt5pS+6IyD5Zu054m55pWIXG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9saXN0XG4gICAgICogQHBhcmFtIHsqfSBoZWlnaHQgXG4gICAgICogQHBhcmFtIHsqfSBpc19yZXZlcnNlIFxuICAgICAqIEBwYXJhbSB7Kn0gaGl0X2NhbGxiYWNrIFxuICAgICAqIEBwYXJhbSB7Kn0gcGxheV90eXBlIFxuICAgICAqIEBwYXJhbSB7Kn0geF9maXggXG4gICAgICogQHBhcmFtIHsqfSB5X2ZpeCBcbiAgICAgKiBAcGFyYW0geyp9IGJpZCBcbiAgICAgKiBAcGFyYW0geyp9IGlzX2NvbF9lZmZlY3RcbiAgICAgKiBAcGFyYW0geyp9IGlzX3JlbGVhc2Ug5pKt5a6M5piv5ZCm6YeK5pS+XG4gICAgICovXG4gICAgZWZmZWN0QXJlYTpmdW5jdGlvbihhdHRhY2tlciwgZWZmZWN0X2xpc3QsIGhlaWdodCwgaGl0X2NhbGxiYWNrLCBwbGF5X3R5cGUsIHhfZml4LCB5X2ZpeCwgYmlkLCBpc19jb2xfZWZmZWN0LCBpc19yZWxlYXNlKXtcbiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IHx8IDA7XG4gICAgICAgIHZhciByZXZlcnNlID0gYXR0YWNrZXIub2JqX3R5cGU7XG4gICAgICAgIHZhciBpc19sZWZ0ID0gYXR0YWNrZXIuaXNfZnJpZW5kO1xuICAgICAgICB2YXIgc2NlbmVfcG9zID0gbnVsbDtcbiAgICAgICAgaWYgKGlzX2NvbF9lZmZlY3QgPT0gMSl7XG4gICAgICAgICAgICB2YXIgdGVtcF9saXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmKGlzX2xlZnQpe1xuICAgICAgICAgICAgICAgIHRlbXBfbGlzdCA9IFt7eDozNCx5OjE3fSx7eDozNCx5OjIzfSx7eDozNCx5OjI5fV1cbiAgICAgICAgICAgIH1lbHNle1xuXHRcdFx0ICAgIHRlbXBfbGlzdCA9IFt7eDo0NCx5OjE3fSx7eDo0NCx5OjIzfSx7eDo0NCx5OjI5fV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwb3MgPSB0ZW1wX2xpc3RbYXR0YWNrZXIuY29sXVxuICAgICAgICAgICAgaWYocG9zKXtcbiAgICAgICAgICAgICAgICB2YXIgdGVtcF9wb3MgPSB0aGlzLnNraWxsX2FjdC5ncmlkUG9zVG9TY3JlZW5Qb3MocG9zKTtcbiAgICAgICAgICAgICAgICBzY2VuZV9wb3MgPSB7IHg6IHRlbXBfcG9zLnggKyB4X2ZpeCwgeTogdGVtcF9wb3MueSArIHlfZml4fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAocGxheV90eXBlID09IEJhdHRsZUNvbnN0LkVmZmVjdF9QbGF5X1R5cGUuU0NFTkUpeyAgICAgICAgICAgLy8g5pqC5pe255yL5Yiw5piv5L2c5bqf55qEXG4gICAgICAgICAgICAgICAgc2NlbmVfcG9zID0ge3g6IFNDUkVFTl9XSURUSCowLjUsIHk6IFNDUkVFTl9IRUlHSFQqMC41fVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwbGF5X3R5cGUgPT0gQmF0dGxlQ29uc3QuRWZmZWN0X1BsYXlfVHlwZS5ST0xFX1NDRU5FIHx8IHBsYXlfdHlwZSA9PSBCYXR0bGVDb25zdC5FZmZlY3RfUGxheV9UeXBlLkVORU1ZX1NDRU5FKXtcbiAgICAgICAgICAgICAgICB4X2ZpeCA9IGF0dGFja2VyLm9ial90eXBlICogeF9maXg7XG4gICAgICAgICAgICAgICAgaWYoaXNfbGVmdCl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwbGF5X3R5cGUgPT0gQmF0dGxlQ29uc3QuRWZmZWN0X1BsYXlfVHlwZS5ST0xFX1NDRU5FKXsgIC8vICDlj4vmlrnpmLXlnotcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lX3BvcyA9IHt4OiBTQ1JFRU5fV0lEVEggKiAyMiAvIDEwMCArIHhfZml4LCB5OiBTQ1JFRU5fSEVJR0hUICogMSAvIDQgKyB5X2ZpeH1cbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaVjOaWuemYteWei1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmVfcG9zID0ge3g6IFNDUkVFTl9XSURUSCAqIDc4IC8gMTAwICsgeF9maXgsIHk6IFNDUkVFTl9IRUlHSFQgKiAxIC8gNCArIHlfZml4fVxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBpZiAocGxheV90eXBlID09IEJhdHRsZUNvbnN0LkVmZmVjdF9QbGF5X1R5cGUuRU5FTVlfU0NFTkUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmVfcG9zID0ge3g6IFNDUkVFTl9XSURUSCAqIDIyIC8gMTAwICsgeF9maXgsIHk6IFNDUkVFTl9IRUlHSFQgKiAxIC8gNCArIHlfZml4fVxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lX3BvcyA9IHt4OiBTQ1JFRU5fV0lEVEggKiA3OCAvIDEwMCArIHhfZml4LCB5OiBTQ1JFRU5fSEVJR0hUICogMSAvIDQgKyB5X2ZpeH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHNjZW5lX3BvcyA9IHRoaXMuY2VudGVyX3BvcyhhdHRhY2tlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjZW5lX3Bvcyl7XG4gICAgICAgICAgICBzY2VuZV9wb3MueSA9IHNjZW5lX3Bvcy55ICsgaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5za2lsbF9hY3QuZWZmZWN0QXJlYShhdHRhY2tlciwgZWZmZWN0X2xpc3QsIHJldmVyc2UsIGlzX3JlbGVhc2UsIHNjZW5lX3BvcywgaGl0X2NhbGxiYWNrLCBiaWQpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5pa95rOV6ICF55uu5qCH5a+56LGh55qE5Lit5b+D5L2N572uXG4gICAgY2VudGVyX3BvczogZnVuY3Rpb24gKGF0dGFja2VyLCBoZWlnaHRfZml4KXtcbiAgICAgICAgaGVpZ2h0X2ZpeCA9IGhlaWdodF9maXggfHwgMDtcbiAgICAgICAgdmFyIHNjZW5lX3BvcyA9IHt4OjAsIHk6MH1cbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX3NjZW5lICYmIGF0dGFja2VyICYmIGF0dGFja2VyLmF0dGFja2VyX2luZm8gJiYgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdCAmJiBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgdmFyIGFycmF5ID0gYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRCYXR0bGVSb2xlQnlQb3MoZWxlbWVudC50YXJnZXQpXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuc2NlbmVfcG9zKXtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmVfcG9zLnggPSB0YXJnZXQuc2NlbmVfcG9zLng7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lX3Bvcy55ID0gdGFyZ2V0LnNjZW5lX3Bvcy55ICsgdGFyZ2V0Lm1vZGVsX2hlaWdodCAqIGhlaWdodF9maXggKiAwLjAxOyAgIC8vIOi/meS4quiuoeeul+S9jee9ruWlveWlh+iRqS4u56uf54S25LiN5piv55u05o6l55So5YGP56e76auY5bqm5Y67566XLi5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2VuZV9wb3M7XG4gICAgfSxcblxuICAgIC8vIOaSreaUvuaUu+WHu+WKqOS9nOS5i+exu+eahFxuICAgIGFjdEh1cnQ6ZnVuY3Rpb24oYXR0YWNrZXIsIGlzX2JpZyl7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLmF0dGFja2VyX2luZm8gPT0gbnVsbCB8fCBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGhhZF9wbGF5ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWZmZWN0X2xpc3QgPSBhdHRhY2tlci5hdHRhY2tlcl9pbmZvLnRhcmdldF9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIHZhciBwbGF5X2VmZmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVmZmVjdF9saXN0LmhwX2NoYW5nZWQgJiYgZWZmZWN0X2xpc3QuaHBfY2hhbmdlZCA8IDAgJiYgaGFkX3BsYXkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIGhhZF9wbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwbGF5X2VmZmVjdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBsYXlNYWdpYzIoYXR0YWNrZXIsIGVmZmVjdF9saXN0LCBpc19iaWcsIHBsYXlfZWZmZWN0KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaPkOWJjeaSreaUvuWPl+WHu+eJueaViCzlm57mkq3lj5flh7vliqjkvZxcbiAgICBwbGF5TWFnaWMyOmZ1bmN0aW9uKGF0dGFja2VyLCBlZmZlY3RfcGxheSwgaXNfYmlnLCBwbGF5X2VmZmVjdCl7XG4gICAgICAgIGlmKGF0dGFja2VyID09IG51bGwgfHwgZWZmZWN0X3BsYXkgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5yZWFsX3JvbGVfbGlzdFtlZmZlY3RfcGxheS50YXJnZXRdO1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHJldHVybjtcblxuICAgICAgICBpZiAoaXNfYmlnID09IHRydWUpe1xuICAgICAgICAgICAgaWYoIXRhcmdldC5pc19iaWdfcGxheSl7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmlzX2JpZ19wbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlIdXJ0RWZmZWN0KGF0dGFja2VyLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmIChhdHRhY2tlci5wb3MgIT0gdGFyZ2V0LnBvcyAmJiBhdHRhY2tlci5ncm91cCAhPSB0YXJnZXQuZ3JvdXApe1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfYWN0Lmh1cnQoYXR0YWNrZXIsIHRhcmdldCwgUGxheWVyQWN0aW9uLmh1cnQsIHBsYXlfZWZmZWN0KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaUu+WHu+S4iuWxgueJueaViOWkhOeQhlxuICAgIGF0dGFja1BvaW50OmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYgKGF0dGFja2VyICYmIGF0dGFja2VyLmF0dGFja19zb3VuZCAhPSBcIlwiICYmIGF0dGFja2VyLmlzX3JlYWwgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBVdGlscy5wbGF5RWZmZWN0U291bmQoQVVESU9fVFlQRS5CQVRUTEUsIGF0dGFja2VyLmF0dGFja19zb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihhdHRhY2tlci5hY3RfZWZmZWN0X2xpc3QgPT0gbnVsbCB8fCBhdHRhY2tlci5hY3RfZWZmZWN0X2xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc19mcmllbmQgPSBhdHRhY2tlci5pc19mcmllbmQ7XG4gICAgICAgIHZhciBhcnJheSA9IGF0dGFja2VyLmFjdF9lZmZlY3RfbGlzdDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIHZhciBhbmltZV9yZXNfdXAgPSBlbGVtZW50LnJlc191cDtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnNwZWNfcmVzX3VwICE9IFwiXCIgJiYgaXNfZnJpZW5kID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBhbmltZV9yZXNfdXAgPSBlbGVtZW50LnNwZWNfcmVzX3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFuaW1lX3Jlc191cCAhPSBcIlwiIHx8IGVsZW1lbnQucmVzX2Rvd24gIT0gXCJcIil7XG4gICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RTcGluZVVzZXIoYXR0YWNrZXIsIHRydWUsIGVsZW1lbnQueF9maXggKiBhdHRhY2tlci5vYmpfdHlwZSwgZWxlbWVudC55X2ZpeCwgW2FuaW1lX3Jlc191cCwgZWxlbWVudC5yZXNfZG93bl0sIGF0dGFja2VyLCBlbGVtZW50LnNjYWxlICogMC4wMDEsIG51bGwsIGVsZW1lbnQuYmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDlpITnkIbmma7pgJrkvKTlrrNcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gcm9sZV9saXN0IFxuICAgICAqLyBcbiAgICBodXJ0OiBmdW5jdGlvbiAoYXR0YWNrZXIsIG9iamVjdF9saXN0KXtcbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX3NjZW5lID09IG51bGwgfHwgYXR0YWNrZXIgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dGFja2VyLmFyZWFfZWZmZWN0X2xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgdmFyIGhpdF9udW0gPSAoIWF0dGFja2VyLmluX2FyZWFfZWZmZWN0KSA/IGF0dGFja2VyLmhpdF9udW0gOiAoYXR0YWNrZXIuYXJlYV9oaXRfbnVtIHx8IDEpO1xuICAgICAgICAgICAgdmFyIHNwbGl0X2h1cnQgPSBhdHRhY2tlci5zcGxpdF9odXJ0IHx8IDE7XG4gICAgICAgICAgICBpZiAoaGl0X251bSA9PSAxIHx8IHNwbGl0X2h1cnQgPiAxKXtcblxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdmFyIHJvbGVfbGlzdCA9IG9iamVjdF9saXN0IHx8IHRoaXMuZ2V0QWxsQmF0dGxlUm9sZUxpc3QoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm9sZV9saXN0KXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IHJvbGVfbGlzdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5pc19odXJ0X3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuaXNfYmlnX3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmF0Y2hQbGF5SHVydChhdHRhY2tlcilcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDkvKTlrrPkuIDkuKrkurrnmoTml7blgJlcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqL1xuICAgIGh1cnRPbmU6ZnVuY3Rpb24oYXR0YWNrZXIpe1xuICAgICAgICBpZih0aGlzLmNoZWNrSXNJbkJhdHRsZShhdHRhY2tlcikgPT0gZmFsc2Upe1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVmZmVjdF9wbGF5X251bSA9IGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3QubGVuZ3RoO1xuICAgICAgICBpZiAoZWZmZWN0X3BsYXlfbnVtID4gMCl7XG4gICAgICAgICAgICBpZiAoYXR0YWNrZXIuaXNfcmVhbCl7XG5cdFx0XHQgICAgdGhpcy5wbGF5TWFnaWMoYXR0YWNrZXIsIGF0dGFja2VyLmF0dGFja2VyX2luZm8udGFyZ2V0X2xpc3RbMF0pO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rX21vZGVsLnBsYXlNYWdpYyhhdHRhY2tlciwgYXR0YWNrZXIuYXR0YWNrZXJfaW5mby50YXJnZXRfbGlzdFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6ZqQ6JeP6KGA5p2hXG4gICAgaGlkZVVJOmZ1bmN0aW9uKGF0dGFja2VyLCBkZWxheV90aW1lKXtcbiAgICAgICAgaWYoYXR0YWNrZXIpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxfYWN0LmhpZGVVSShhdHRhY2tlciwgZGVsYXlfdGltZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5peg5Yqo5L2c5bm26KGM5pS75Ye7XG4gICAgbm9BY3RBdHRhY2s6ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGhpdF9mdW4sIHN0YXJ0X2Z1biwgbmV4dF9kZWxheV90aW1lKXtcbiAgICAgICAgaWYoIXRoaXMuZ2V0QmF0dGxlU2NlbmUoKSkgcmV0dXJuO1xuICAgICAgICBpZighYXR0YWNrZXIpIHJldHVybjtcbiAgICAgICAgdmFyIHN0YXJ0X2NhbGxiYWNrID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuY2FsbGZ1bihhdHRhY2tlciwgc3RhcnRfZnVuKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHZhciBoaXRfY2FsbGJhY2sgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5jYWxsZnVuKGF0dGFja2VyLCBoaXRfZnVuKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9hY3Qubm9BY3RBdHRhY2soYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGhpdF9jYWxsYmFjaywgc3RhcnRfY2FsbGJhY2ssIG5leHRfZGVsYXlfdGltZSk7XG4gICAgfSxcblxuICAgIC8vIOaYvuekuuihgOadoVxuICAgIHNob3dVSTpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSl7XG4gICAgICAgIGlmKGF0dGFja2VyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNraWxsX2FjdC5zaG93VUkoYXR0YWNrZXIsIGRlbGF5X3RpbWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIpOaWreaYr+WQpuWtmOWcqOWPjeWHu2J1ZmZcbiAgICBnZXRCdWZmVGFnOmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYoYXR0YWNrZXIgPT0gbnVsbCB8fCBhdHRhY2tlci5idWZmX2xpc3QgPT0gbnVsbCB8fCBhdHRhY2tlci5idWZmX2xpc3QubGVuZ3RoID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcnJheSA9IGF0dGFja2VyLmJ1ZmZfbGlzdDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5za2lsbF9kYXRhLmRhdGFfZ2V0X2J1ZmZbZWxlbWVudC5iaWRdXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5ncm91cCA9PSAzMTA4KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBcbiAgICAvLyDov5HmiJjnp7vliqjlvZLkvY1cbiAgICBtb3ZlQmFjazpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSwgbW92ZV90aW1lLCBncmlkX3Bvc194LCBhY3Rpb25fbmFtZSwgaXNfanVtcCwgaXNfanVtcF9kZWxheSwgaXNfZ2V0X3BvaW50LCBpc19tb3ZlLCBpc19yZXZlcnNlKXtcbiAgICAgICAgaWYoIXRoaXMuZ2V0QmF0dGxlU2NlbmUoKSkgcmV0dXJuO1xuICAgICAgICBpZighYXR0YWNrZXIpIHJldHVybjtcbiAgICAgICAgdmFyIHRhcmdldF9wb3MgPSBhdHRhY2tlci5zY2VuZV9wb3M7XG4gICAgICAgIHZhciBza2lsbF9hY3QgPSB0aGlzLnNraWxsX2FjdC5tb3ZlKGF0dGFja2VyLCB0YXJnZXRfcG9zLCBkZWxheV90aW1lLCBtb3ZlX3RpbWUpO1xuICAgICAgICBhdHRhY2tlci5ydW5BY3Rpb24oc2tpbGxfYWN0KTtcbiAgICB9LFxuXG4gICAgLy8g56e75Yqo5Yiw5oyH5a6a5Yy65Z+fXG4gICAgbW92ZVRvQXJlYTpmdW5jdGlvbihhdHRhY2tlciwgY29uZmlnKXtcbiAgICAgICAgaWYoIXRoaXMuZ2V0QmF0dGxlU2NlbmUoKSkgcmV0dXJuO1xuICAgICAgICBpZighYXR0YWNrZXIpIHJldHVybjtcbiAgICAgICAgaWYoIWNvbmZpZykgcmV0dXJuO1xuICAgICAgICB2YXIgZ3JpZF9wb3NfeCA9IGNvbmZpZy5tb3ZlX21vZGVsX3ggKiB0aGlzLnNraWxsX2FjdC5ncmlkU2l6ZVgoKTtcbiAgICAgICAgdmFyIGdyaWRfcG9zX3kgPSBjb25maWcubW92ZV9tb2RlbF95ICogdGhpcy5za2lsbF9hY3QuZ3JpZFNpemVZKCk7XG4gICAgICAgIHZhciB0YXJnZXRfcG9zID0geyB4OiBTQ1JFRU5fV0lEVEggKiAzMiAvIDY0ICsgZ3JpZF9wb3NfeCAqIGF0dGFja2VyLm9ial90eXBlLCB5OiBTQ1JFRU5fSEVJR0hUICogMTEgLyAzNiArIGdyaWRfcG9zX3kgfTtcbiAgICAgICAgdmFyIHNraWxsX2FjdCA9IHRoaXMuc2tpbGxfYWN0Lm1vdmUoYXR0YWNrZXIsIHRhcmdldF9wb3MsIGNvbmZpZy5tb3ZlX2RlbGF5X3RpbWUsIGNvbmZpZy5tb3ZlX3RpbWUpO1xuICAgICAgICBhdHRhY2tlci5ydW5BY3Rpb24oc2tpbGxfYWN0KTtcbiAgICB9LFxuXG4gICAgLy8gYWN0X2FyZ3M9eyBbW21vdmVUb11dLHsgMCwgMTAsLSA3LCAwLCBbW3J1bl1dLCAwLCAwLCAwLCAxLCAxfX19LFxuXG4gICAgLy8g56e75Yqo5Yiw55uu5qCH5aSEXG4gICAgbW92ZVRvOmZ1bmN0aW9uKGF0dGFja2VyLCBkZWxheV90aW1lLCBtb3ZlX3RpbWUsIGdyaWRfcG9zX3gsIGdyaWRfcG9zX3ksIGFjdGlvbl9uYW1lLCBpc19qdW1wLCBpc19qdW1wX2RlbGF5LCBpc19nZXRfcG9pbnQsIGlzX21vdmUsIGlzX3JldmVyc2UsIGlzX2NvbF9hY3Qpe1xuICAgICAgICBpZighdGhpcy5nZXRCYXR0bGVTY2VuZSgpKSByZXR1cm47XG4gICAgICAgIGlmKCFhdHRhY2tlcikgcmV0dXJuO1xuICAgICAgICBtb3ZlX3RpbWUgPSBtb3ZlX3RpbWUgfHwgMzA7XG4gICAgICAgIGlmIChncmlkX3Bvc194ID09IG51bGwpe1xuICAgICAgICAgICAgZ3JpZF9wb3NfeCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyaWRfcG9zX3kgPT0gbnVsbCl7XG4gICAgICAgICAgICBncmlkX3Bvc195ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlyZWN0ID0gKGlzX3JldmVyc2UgPT0gMSkgPyAtMSA6IDE7XG4gICAgICAgIHZhciB0YXJnZXRfcG9zID0gbnVsbDtcbiAgICAgICAgdmFyIHNjZW5lX3BvcyA9IGF0dGFja2VyLnNjZW5lX3BvcztcbiAgICAgICAgaWYgKGlzX2NvbF9hY3QgPT0gMSkge1xuICAgICAgICAgICAgdmFyIGlzX2xlZnQgPSBhdHRhY2tlci5pc19mcmllbmQ7ICAgICAgICAgLy8g5piv5ZCm5piv5bex5pa5LOW3seaWueWwseaYr+WcqOW3pui+uVxuICAgICAgICAgICAgdmFyIHRlbXBfbGlzdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaXNfbGVmdCkge1xuICAgICAgICAgICAgICAgIHRlbXBfbGlzdCA9IFt7IHg6IDM0LCB5OiAxNyB9LCB7IHg6IDM0LCB5OiAyMyB9LCB7IHg6IDM0LCB5OiAyOSB9XVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZW1wX2xpc3QgPSBbeyB4OiA0NCwgeTogMTcgfSwgeyB4OiA0NCwgeTogMjMgfSwgeyB4OiA0NCwgeTogMjkgfV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwb3MgPSB0ZW1wX2xpc3RbYXR0YWNrZXIuY29sXVxuICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wX3BvcyA9IHRoaXMuc2tpbGxfYWN0LmdyaWRQb3NUb1NjcmVlblBvcyhwb3MpO1xuICAgICAgICAgICAgICAgIHRhcmdldF9wb3MgPSB7IHg6IHRlbXBfcG9zLnggKyBncmlkX3Bvc194LCB5OiB0ZW1wX3Bvcy55ICsgZ3JpZF9wb3NfeSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdyaWRfcG9zX3ggPiAwKSB7XG4gICAgICAgICAgICB0YXJnZXRfcG9zID0geyB4OiBzY2VuZV9wb3MueCArIGdyaWRfcG9zX3ggKiBhdHRhY2tlci5vYmpfdHlwZSAqIGRpcmVjdCwgeTogc2NlbmVfcG9zLnkgKyBncmlkX3Bvc195IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNfcmV2ZXJzZSA9PSAxICYmIGF0dGFja2VyLnRhcmdldF9wb3NfYmFzZSkgeyAvLyDlj43ovaxcbiAgICAgICAgICAgICAgICB0YXJnZXRfcG9zID0gdGhpcy5za2lsbF9hY3QuZ3JpZFBvc1RvU2NyZWVuUG9zKHsgeDogYXR0YWNrZXIudGFyZ2V0X3Bvc19iYXNlLnggKyBncmlkX3Bvc194ICogYXR0YWNrZXIub2JqX3R5cGUgKiBkaXJlY3QsIHk6IGF0dGFja2VyLnRhcmdldF9wb3NfYmFzZS55ICsgZ3JpZF9wb3NfeSAqIGF0dGFja2VyLm9ial90eXBlICogZGlyZWN0IH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldF9wb3MgPSB0aGlzLnNraWxsX2FjdC5ncmlkUG9zVG9TY3JlZW5Qb3MoeyB4OiBhdHRhY2tlci50YXJnZXRfcG9zLnggKyBncmlkX3Bvc194ICogYXR0YWNrZXIub2JqX3R5cGUgKiBkaXJlY3QsIHk6IGF0dGFja2VyLnRhcmdldF9wb3MueSArIGdyaWRfcG9zX3kgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIGlzX2dldF9wb2ludCA9PSBudWxsIHx8IGlzX2dldF9wb2ludCA9PSAwKXtcbiAgICAgICAgICAgIHZhciBza2lsbF9hY3QgPSB0aGlzLnNraWxsX2FjdC5tb3ZlKGF0dGFja2VyLCB0YXJnZXRfcG9zLCBkZWxheV90aW1lLCBtb3ZlX3RpbWUpO1xuICAgICAgICAgICAgYXR0YWNrZXIucnVuQWN0aW9uKHNraWxsX2FjdCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpbGxfYWN0Lm1vdmUoYXR0YWNrZXIsIHRhcmdldF9wb3MsIGRlbGF5X3RpbWUsIG1vdmVfdGltZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5LiA5Lqb5pKt5oql5Yik5patXG4gICAgY2hlY2tJc0luQmF0dGxlOmZ1bmN0aW9uKGF0dGFja2VyKXtcbiAgICAgICAgaWYodGhpcy5iYXR0bGVfc2NlbmUgPT0gbnVsbCB8fCBhdHRhY2tlciA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLeWIm+aZr+WNleS9jei/meS4gOWdlyznnJ/mmK/miJjmlpfljZXkvY1cbiAgICBjcmVhdGVSb2xlTGlzdDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgYmF0dGxlX2RhdGEgPSB0aGlzLmJhdHRsZV9kYXRhO1xuICAgICAgICB2YXIgbmVlZF9lbnRlciA9IHRoaXMubmVlZFBsYXlFbnRlckFjdGlvbigpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmF0dGxlX2RhdGEuZmlnaHRfb2JqZWN0X2xpc3QpIHtcbiAgICAgICAgICAgIHZhciByb2xlX2RhdGEgPSBiYXR0bGVfZGF0YS5maWdodF9vYmplY3RfbGlzdFtrZXldO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVSb2xlKHJvbGVfZGF0YSwgbmVlZF9lbnRlciwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rlhbfkvZPljZXkvY1cbiAgICBjcmVhdGVSb2xlOmZ1bmN0aW9uKHJvbGVfZGF0YSwgZW50ZXJfcnVuLCB0YWxrX2JhY2ssIGlzX3JlYWwpe1xuICAgICAgICBpZiAodGhpcy5iYXR0bGVfc2NlbmUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAocm9sZV9kYXRhID09IG51bGwgfHwgcm9sZV9kYXRhLmhwID09IDApIHJldHVybjtcbiAgICAgICAgdmFyIHJvbGVfbGF5ZXIgPSB0aGlzLmJhdHRsZV9zY2VuZS5nZXRCYXR0bGVSb2xlTGF5ZXIoKTtcbiAgICAgICAgaWYgKHJvbGVfbGF5ZXIgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZih0aGlzLnJlYWxfcm9sZV9saXN0W3JvbGVfZGF0YS5wb3NdICE9IG51bGwpIHJldHVybjtcblxuICAgICAgICB2YXIgcm9sZSA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYmF0dGxlX3JvbGVcIik7XG4gICAgICAgIHJvbGUuY3JlYXRlUm9sZShyb2xlX2xheWVyLCByb2xlX2RhdGEsIGVudGVyX3J1biwgdGFsa19iYWNrLCBpc19yZWFsKTtcbiAgICAgICAgdGhpcy5yZWFsX3JvbGVfbGlzdFtyb2xlX2RhdGEucG9zXSA9IHJvbGU7XG4gICAgfSxcblxuICAgIC8vIOmHjee9ruaImOaWl+WNleS9jeWIneWni+WMluS/oeaBryzmr5TlpoLkvY3nva7lsYLnuqflkozliqjkvZznirbmgIFcbiAgICByZXNldEJhdHRsZVJvbGVCYXNlSW5mbzpmdW5jdGlvbigpe1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLnJlYWxfcm9sZV9saXN0KXtcbiAgICAgICAgICAgIHZhciBiYXR0bGVfcm9sZSA9IHRoaXMucmVhbF9yb2xlX2xpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmIChiYXR0bGVfcm9sZSl7XG4gICAgICAgICAgICAgICAgYmF0dGxlX3JvbGUucmVzZXRCYXNlSW5mbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOa4healmuaOieWNleS9jVxuICAgIGNsZWFyUmVhbFJvbGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMucmVhbF9yb2xlX2xpc3QpLmxlbmd0aCA9PSAwKSB7IHJldHVybjsgfVxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5yZWFsX3JvbGVfbGlzdCkge1xuICAgICAgICAgICAgLy8g5riF5qWa5o6J5a6a5pe25ZmoXG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwoXCJhdHRhY2tlckFjdFRpbWVvdXRcIiArIGtleSk7XG5cbiAgICAgICAgICAgIHZhciBiYXR0bGVfcm9sZSA9IHRoaXMucmVhbF9yb2xlX2xpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmKGJhdHRsZV9yb2xlKXtcbiAgICAgICAgICAgICAgICBiYXR0bGVfcm9sZS5kZWxldGVSb2xlKCk7XG4gICAgICAgICAgICAgICAgYmF0dGxlX3JvbGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhbF9yb2xlX2xpc3QgPSB7fTtcbiAgICB9LFxuXG4gICAgLy8g5b2T5YmN5omA5pyJ5Y2V5L2NXG4gICAgZ2V0QWxsQmF0dGxlUm9sZUxpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbF9yb2xlX2xpc3Q7XG4gICAgfSxcblxuICAgIC8vIOaMh+WumuWNleS9jeS4iueahOWvueixoVxuICAgIGdldEJhdHRsZVJvbGVCeVBvczogZnVuY3Rpb24gKHBvcykge1xuICAgICAgICBpZiAodGhpcy5yZWFsX3JvbGVfbGlzdFtwb3NdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFsX3JvbGVfbGlzdFtwb3NdXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6a2F6a2U5oqA6IO96buR5bGPLOaaguaXtuS5n+ayoemFjee9ruS6hlxuICAgIGJsYWNrU2NyZWVuOiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcblxuICAgIH0sXG5cbiAgICAvLyDlj6rmmL7npLrmlLvlh7vkuo7ooqvmlLvlh7vmlL4s5pqC5pe26YO95rKh5pyJ6YWN572uXG4gICAgYmxhY2tTY3JlZW4yOiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcblxuICAgIH0sXG5cbiAgICAvLyDpu5HlsY8tLS0tLS3lkI7nu63kuIDlvovkvb/nlKjov5nkuKrpu5HlsY9cbiAgICBibGFja1NjcmVlbjM6IGZ1bmN0aW9uIChhdHRhY2tlciwgZGVsYXlfdGltZSwgdGltZSwgYWxwaGEpIHtcbiAgICAgICAgaWYodGltZSA9PSBudWxsKXtcbiAgICAgICAgICAgIHRpbWUgPSAxNTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmVnaW5fZnVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKHRoaXMuYmF0dGxlX3NjZW5lKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9zY2VuZS5zZXRCbGFjayh0cnVlLCBhbHBoYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzX2JsYWNrID0gdHJ1ZTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHZhciBlbmRfZnVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9hY3QuYmxhY2tTY3JlZW4oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHRpbWUsIGJlZ2luX2Z1biwgZW5kX2Z1bik7XG4gICAgfSxcblxuICAgIC8vIOWPlua2iOm7keWxj1xuICAgIGNhbmNsZUJsYWNrU2NyZWVuOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuaXNfYmxhY2sgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5iYXR0bGVfc2NlbmUpe1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfc2NlbmUuc2V0QmxhY2soZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmch+Wxj1xuICAgIHBsYXlTaGFrZVNjcmVlbjpmdW5jdGlvbihzaGFrZV9pZCl7XG4gICAgICAgIGlmKHNoYWtlX2lkID09IG51bGwgfHwgc2hha2VfaWQgPT0gMCkgcmV0dXJuO1xuICAgICAgICBpZih0aGlzLmJhdHRsZV9zY2VuZSl7XG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9zY2VuZS5zaGFrZVNjcmVlbihzaGFrZV9pZCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6ZqQ6LqrLOaaguaXtuayoeaciemFjee9ruS6hlxuICAgIGhpZGU6IGZ1bmN0aW9uIChhdHRhY2tlcikge1xuXG4gICAgfSxcblxuICAgIC8vIOaYvuekuizmmoLml7bkuZ/msqHmnInphY3nva7kuoZcbiAgICBzaG93OiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcblxuICAgIH0sXG5cbiAgICAvLyDmrovlvbEs5Lmf5piv5rKh5pyJ6YWN572u5LqGXG4gICAgc2hhZG93OiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcblxuICAgIH0sXG5cbiAgICAvLyDov5Tlm57kuLvnlYzpnaLmjqfliLblmahcbiAgICBnZXRNYWluVUlDdHJsOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMubWFpbnVpX2N0cmwgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jdHJsID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWFpbnVpX2N0cmw7XG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3miJjmlpfnu5PmnZ9cbiAgICAvL+e7k+eul+eVjOmdolxuICAgIHNob3dXaW46IGZ1bmN0aW9uIChkYXRhLCBpc19yZXBsYXkpIHtcbiAgICAgICAgaWYoZGF0YS5zaG93X3BhbmVsX3R5cGUgPT0gbnVsbCB8fCBkYXRhLmNvbWJhdF90eXBlID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKGRhdGEuc2hvd19wYW5lbF90eXBlID09IDEpeyAgICAgLy8g5pi+56S65oiY5paX57uT566X55WM6Z2iLOi/meS4quaXtuWAmeS4jeimgeeri+WNs+a4hemZpOaOiSxcbiAgICAgICAgICAgIGlmICgoZGF0YS5jb21iYXRfdHlwZSA9PSB0aGlzLmNvbWJhdF90eXBlICYmIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuZ2V0V2F0Y2hSZXBsYXlTdGF0dXMoKSkgfHwgaXNfcmVwbGF5ID09IHRydWUpe1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5nkuKrml7blgJnpg73pnIDopoHmmL7npLrnu5PnrpfnlYzpnaJcbiAgICAgICAgICAgIHRoaXMuc2V0QmF0dGxlVGltZVNjYWxlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zaG93V2luVmlldyhkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvbWJhdF90eXBlID09IHRoaXMuY29tYmF0X3R5cGUpeyAgLy8gXG4gICAgICAgICAgICAgICAgaWYgKGlzX3JlcGxheSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclZpZXcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyQmF0dGxlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShFdmVudElkLkVYSVRfRklHSFQsIGRhdGEuY29tYmF0X3R5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+a4uOaIj+mAgOWHuue7k+eul1xuICAgIHNob3dXaW5WaWV3OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZihkYXRhID09IG51bGwpcmV0dXJuXG4gICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIub3BlbkZpbmlzaFZpZXcodHJ1ZSwgZGF0YS5jb21iYXRfdHlwZSxkYXRhKTtcbiAgICB9LFxuXG4gICAgLy/miJjmlpfnu5PmnpxcbiAgICByZXN1bHQ6ZnVuY3Rpb24oZGF0YSxpc19zZWxmX2V4aXQpe1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmN1cl9maWdodF90eXBlID09IDIgJiYgdGhpcy5jb21iYXRfdHlwZSA9PSBkYXRhLmNvbWJhdF90eXBlKXtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJWaWV3KCk7XG4gICAgICAgIH0gXG4gICAgfSxcblxuICAgIGNsZWFyVmlldzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnNldEJhdHRsZVRpbWVTY2FsZSh0cnVlKTsgICAgICAvLyDov5jljp/liqjkvZzpgJ/njodcbiAgICAgICAgaWYgKHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIuZ2V0V2F0Y2hSZXBsYXlTdGF0dXMoKSA9PSB0cnVlKXsgLy8g5aaC5p6c5piv5b2V5YOP54q25oCB5LiLLOmAgOWHuuW9leWDj1xuICAgICAgICAgICAgdGhpcy5iYXR0bGVfY29udHJvbGxlci5zZXRXYXRjaFJlcGxheVN0YXR1cyhmYWxzZSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOa0vuWPkemAgOWHuuaImOaWl+S6i+S7tizpgJrnn6XlkITkuKrns7vnu5/lpITnkIZcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShFdmVudElkLkVYSVRfRklHSFQsIHRoaXMuY29tYmF0X3R5cGUpO1xuXG4gICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgIGlmKHRoaXMuY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EYXJtYSl7XG4gICAgICAgICAgICBpZiAoTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoZWNrSXNJbkRyYW1hVUlGaWdodCgpKSB7ICAgICAgIC8vIOWJp+aDheWJr+acrOS4ree7k+adn+aImOaWlyzliJnliIfliLDlgYfmiJjmlpdcbiAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLnNlbmQyMDA2MChCYXR0bGVDb25zdC5GaWdodF9UeXBlLkRhcm1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXR0bGVfY29udHJvbGxlci5nZXRXYXRjaFJlcGxheVN0YXR1cygpID09IHRydWUgfHwgdGhpcy5jb21iYXRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLlBLIHx8IHRoaXMuY29tYmF0X3R5cGUgPT0gQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5IZXJvVGVzdFdhcikge1xuICAgICAgICAgICAgICAgIGlmIChNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2hlY2tJc0luRHJhbWFVSUZpZ2h0KCkpIHsgICAgICAgLy8g5Ymn5oOF5Ymv5pys5Lit57uT5p2f5oiY5paXLOWImeWIh+WIsOWBh+aImOaWl1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLnNlbmQyMDA2MChCYXR0bGVDb25zdC5GaWdodF9UeXBlLkRhcm1hKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckJhdHRsZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckJhdHRsZVNjZW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pKt5pS+6LWE5Lqn5o6J6JC955qE5Yqo5L2cXG4gICAgcGxheVJlc291cmNlQ29sbGVjdDpmdW5jdGlvbih4LCB5LCBwb3Mpe1xuICAgICAgICBpZiAodGhpcy5kcmFtYV9maWdodF91aSl7XG4gICAgICAgICAgICB0aGlzLmRyYW1hX2ZpZ2h0X3VpLnBsYXlSZXNvdXJjZUNvbGxlY3QoeCwgeSwgcG9zKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy/ojrflj5Zncm91cFxuICAgIGdldEdyb3VwKCl7XG4gICAgICAgIHJldHVybiB0aGlzLm15X2dyb3VwXG4gICAgfSxcbiAgICBnZXRDYW1wSWNvbkNvbmZpZ0J5SWRzKGlkX2xpc3Qpe1xuICAgICAgICBpZighaWRfbGlzdCB8fCBVdGlscy5uZXh0KGlkX2xpc3QpID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYoaWRfbGlzdC5sZW5ndGggPT0gMSl7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZF9saXN0WzBdXG4gICAgICAgICAgICByZXR1cm4gQ29uZmlnLmNvbWJhdF9oYWxvX2RhdGEuZGF0YV9oYWxvX2ljb25baWRdXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbGV0IG1pbl9pZCA9IE1hdGgubWluKGlkX2xpc3RbMF0sIGlkX2xpc3RbMV0pXG4gICAgICAgICAgICBsZXQgbWF4X2lkID0gTWF0aC5tYXgoaWRfbGlzdFswXSwgaWRfbGlzdFsxXSlcbiAgICAgICAgICAgIGxldCBpZCA9IG1pbl9pZCoxMDAgKyBtYXhfaWRcbiAgICAgICAgICAgIHJldHVybiBDb25maWcuY29tYmF0X2hhbG9fZGF0YS5kYXRhX2hhbG9faWNvbltpZF1cbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIGdldEVmZmVjdFJlczogZnVuY3Rpb24oZWZmZWN0X2lkKSB7XG5cbiAgICB9LFxuXG5cbiAgICAvLyDlvIDlp4vlh4blpIfmiJjmlpfotYTmupBcbiAgICBwcmVsb2FkQmF0dGxlUmVzOiBmdW5jdGlvbihkYXRhLCBmaW5pc2hfY2IpIHtcbiAgICAgICAgLy8gc2tpbGxfcGxheXNcbiAgICAgICAgdmFyIGJhdHRsZV9yZXMgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgc2tpbGxfaSBpbiBkYXRhLnNraWxsX3BsYXlzKSB7XG4gICAgICAgICAgICB2YXIgc2tpbGxfZGF0YSA9IGRhdGEuc2tpbGxfcGxheXNbc2tpbGxfaV1cbiAgICAgICAgICAgIGZvciAodmFyIGVmZmVjdF9pIGluIHNraWxsX2RhdGEuZWZmZWN0X3BsYXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0X2RhdGEgPSBza2lsbF9kYXRhLmVmZmVjdF9wbGF5W2VmZmVjdF9pXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVmZmVjdF9kYXRhLmVmZmVjdF9iaWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHZhciBlZmZlY3RfY29uZmlnID0gZ2RhdGEoJ3NraWxsX2RhdGEnLCAnZGF0YV9nZXRfZWZmZWN0JywgZWZmZWN0X2RhdGEuZWZmZWN0X2JpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVmZmVjdF9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGFjdG9yID0gdGhpcy5yZWFsX3JvbGVfbGlzdFtlZmZlY3RfZGF0YS5hY3Rvcl07XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMucmVhbF9yb2xlX2xpc3RbZWZmZWN0X2RhdGEudGFyZ2V0XTtcblxuICAgICAgICAgICAgICAgIC8vIOaUu+WHu+WKqOS9nOi1hOa6kFxuICAgICAgICAgICAgICAgIGlmIChlZmZlY3RfY29uZmlnLmFuaW1lX3JlcyAmJiBhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYW5pbWVfcmVzX3BhdGggPSBhY3Rvci5nZXRSZXNQYXRoKGVmZmVjdF9jb25maWcuYW5pbWVfcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1lX3Jlc19wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXR0bGVfcmVzW2FuaW1lX3Jlc19wYXRoXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyDlj5flh7vliqjkvZzotYTmupBcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0X2NvbmZpZy5oaXRfYWN0aW9uICYmIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0X2NvbmZpZy5oaXRfYWN0aW9uICE9IFwibm8taHVydFwiKSB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoaXRfYWN0aW9uX3BhdGggPSB0YXJnZXQuZ2V0UmVzUGF0aChlZmZlY3RfY29uZmlnLmhpdF9hY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpdF9hY3Rpb25fcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdHRsZV9yZXNbaGl0X2FjdGlvbl9wYXRoXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyDnibnmlYjotYTmupDliqDovb1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlZmZlY3RfZCBpbiBBbmlSZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVmZmN0X2xpc3QgPSBVdGlscy5kZWVwQ29weSh0aGlzLmdldEN1ckVmZmVjdExpc3QoZWZmZWN0X2NvbmZpZ1tBbmlSZXNbZWZmZWN0X2RdXSkpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlZmZlY3RfaSBpbiBlZmZjdF9saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWZmZWN0X2luZm8gPSBlZmZjdF9saXN0W2VmZmVjdF9pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RfaW5mby5yZXNfdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlZmZlY3RfaW5mby51cF9hY3Rpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWN0aW9uX25hbWUgPSBlZmZlY3RfaW5mby51cF9hY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBcInNwaW5lL1wiICsgZWZmZWN0X2luZm8ucmVzX3VwICsgXCIvXCIgKyBhY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXR0bGVfcmVzW3Jlc19wYXRoXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RfaW5mby5yZXNfZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3Rpb25fbmFtZSA9IFBsYXllckFjdGlvbi5hY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVmZmVjdF9pbmZvLmRvd25fYWN0aW9uX25hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWN0aW9uX25hbWUgPSBlZmZlY3RfaW5mby5kb3duX2FjdGlvbl9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBcInNwaW5lL1wiICsgZWZmZWN0X2luZm8ucmVzX2Rvd24gKyBcIi9cIiArIGFjdGlvbl9uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXR0bGVfcmVzW3Jlc19wYXRoXSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsX251bSA9IDA7XG4gICAgICAgIHZhciBmaW5pc2hfbnVtID0gMDtcblxuICAgICAgICBmb3IgKHZhciBiYXR0bGVfaSBpbiBiYXR0bGVfcmVzKSB7XG4gICAgICAgICAgICB0b3RhbF9udW0gKys7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBiYXR0bGVfaSBpbiBiYXR0bGVfcmVzKSB7XG4gICAgICAgICAgICB2YXIgc2tlbGV0b25fcGF0aCA9IGJhdHRsZV9pICsgXCIuYXRsYXNcIjtcbiAgICAgICAgICAgIEJhdHRsZVJlc1Bvb2wuZ2V0SW5zdGFuY2UoKS5wcmVMb2FkUmVzKHNrZWxldG9uX3BhdGgsIGZ1bmN0aW9uIChza2VsZXRvbl9wYXRoLCByZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgZmluaXNoX251bSArKztcbiAgICAgICAgICAgICAgICBpZiAoZmluaXNoX251bSA9PSB0b3RhbF9udW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaF9jYilcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaF9jYigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCBza2VsZXRvbl9wYXRoKSkgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b3RhbF9udW0gPT0gMCkge1xuICAgICAgICAgICAgaWYgKGZpbmlzaF9jYilcbiAgICAgICAgICAgICAgICBmaW5pc2hfY2IoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhdHRsZU1vZGVsO1xuIl19