|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_role.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, '02f16IcbypK9beOp9b1Xx4L', 'battle_role');
|
// Scripts/mod/battle/view/battle_role.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 战斗单位实例对象
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var BattleRolePool = require("battle_role_pool");
|
|
var BattleResPool = require("battle_res_pool");
|
|
var LoaderManager = require("loadermanager");
|
|
var PathTool = require("pathtool");
|
|
var BattleConst = require("battle_const");
|
|
var BattleEffect = require("battle_effect");
|
|
var BattleRole = cc.Class({
|
"extends": BaseClass,
|
properties: {
|
skelon_cache: {
|
"default": {}
|
}
|
},
|
ctor: function ctor() {
|
// 假战斗才需要,当前这一排是否有其他单位,确定初始位置
|
if (arguments && arguments.length > 0) {
|
this.is_next_offset = arguments[0];
|
} else {
|
this.is_next_offset = false;
|
}
|
|
this.initConfig();
|
},
|
initConfig: function initConfig() {
|
this.role = null;
|
this.parent = null;
|
this.prefabPath = PathTool.getPrefabPath("battle", "battle_real_role");
|
this.role_data = null;
|
this.top_off_y = 45; // 血条向上的偏移量
|
|
this.is_real = false; // 是否是真战斗单位
|
|
this.play_enter = false; // 是否需要播放进场动画
|
|
this.talk_back = false; // 是否需要通知播放完成
|
|
this.grid_pos = null; // 格子坐标,
|
|
this.scene_pos = null; // 场景坐标
|
|
this.is_friend = false; // 是否是友方
|
|
this.obj_type = 0; // 是己方还是敌方
|
// this.skeletonData_list = {} // 动作列表
|
|
this.model_height = 120; // 模型的高度
|
|
this.model_width = 60; // 模型的宽度,暂时先这样,后面加接口计算
|
|
this.pos = 0; // 当前站位
|
|
this.group = 0; // 当前分组
|
|
this.spine_name = ""; // 单位资源名字 ,H10000这种
|
|
this.play_action_name = ""; // 当前动作名字,
|
|
this.is_round = false; // 当前技能播报是否播放完成
|
|
this.effect_list = {}; // 挂在身上的特效列表
|
|
this.hp_show_status = true; // 是否显示或者隐藏血条
|
|
this.is_die = false; // 该单位是否是死亡 == role_data.hp == 0
|
|
this.role_cur_zorder = 0; // 当前单位深度值
|
|
this.in_hurt_act = false; // 是否在播放受击效果中
|
|
this.need_play_die = false; // 需要播放死亡动作
|
|
var BattleController = require("battle_controller");
|
|
this.model = BattleController.getInstance().getModel();
|
this.hook_model = BattleController.getInstance().getHookModel();
|
this.skill_act = require("skill_act");
|
this.wait_action_name = null;
|
this.wait_res_name = null;
|
this.wait_is_loop = null;
|
this.tips_list = {}; // 当前飘字记录
|
|
this.buff_list = {}; // 当前buff列表信息,以唯一id作为key
|
|
this.buff_list_data = {}; // 当前buff信息,以buff_config.icon作为key
|
|
this.buff_list_item = {}; // 当前buff的实例化显示对象,以buff_config.icon作为key
|
|
this.action_call_list = {}; // 制动动作回调
|
|
this.wait_add_effect_list = {}; // 待添加特效
|
|
this.resources_list = {}; // 下载资源
|
|
this.dmg_index = 0; // 当前伤害数字的个数
|
},
|
|
/**
|
* 创建战斗单位
|
* @param {*} parent 所在父节点
|
* @param {*} battle_role_data 对象基础数据,BattleRoleData
|
* @param {*} play_enter 是否需要播放进场动画
|
* @param {*} talk_back 是否需要通知进场完成
|
* @param {*} is_real 是否是真实战斗
|
* @param {*} finish_cb 创建完成之后的回调
|
*/
|
createRole: function createRole(parent, battle_role_data, play_enter, talk_back, is_real, finish_cb) {
|
this.parent = parent;
|
this.role_data = battle_role_data; // this.play_enter = play_enter || false;
|
|
this.play_enter = false;
|
this.finish_cb = finish_cb;
|
if (!is_real) this.play_enter = false;
|
this.talk_back = talk_back || false;
|
this.is_real = is_real || false;
|
this.pos = battle_role_data.pos;
|
this.group = battle_role_data.group;
|
var pools = BattleRolePool.getInstance().getRealPools();
|
var role = null;
|
|
if (pools.size() > 0) {
|
role = pools.get();
|
this.createRootWnd(role);
|
} else {
|
LoaderManager.getInstance().loadRes(this.prefabPath, function (res_object) {
|
role = res_object;
|
this.createRootWnd(role);
|
}.bind(this));
|
}
|
},
|
// 初始化状态
|
resetInitStatus: function resetInitStatus() {
|
if (this.skeleton) {
|
this.skeleton.setToSetupPose();
|
this.skeleton.clearTracks();
|
}
|
},
|
// 初始化创建对象
|
createRootWnd: function createRootWnd(role) {
|
var valid = this.parent && this.parent.isValid && role && role.isValid ? true : false;
|
if (!valid) return;
|
this.role = role;
|
|
if (this.parent) {
|
this.parent.addChild(this.role);
|
}
|
|
this.role_node = this.role.getChildByName("role_node"); // 模型节点
|
|
this.container = this.role_node.getChildByName("container"); // spine节点
|
|
this.top_container = this.role_node.getChildByName("top_container"); // 血条部分
|
|
this.shadow = this.role_node.getChildByName("shadow"); // 脚底阴影
|
|
this.progress = this.top_container.getChildByName("hp").getComponent(cc.ProgressBar);
|
this.level = this.top_container.getChildByName("level").getComponent(cc.Label);
|
this.camp = this.top_container.getChildByName("camp").getComponent(cc.Sprite);
|
this.buff_container = this.top_container.getChildByName("buff_container"); // buff的主节点
|
|
this.hallow_node = this.role.getChildByName("hallow_node"); // 神器节点
|
|
this.round_progress = this.hallow_node.getChildByName("progress").getComponent(cc.ProgressBar); // 回合进度条
|
// 神器和模型区分
|
|
if (this.role_data.object_type == BattleConst.Unit_Type.Hallows) {
|
this.spine = this.hallow_node.getChildByName("spine");
|
this.skeleton = this.spine.getComponent(sp.Skeleton);
|
this.role_node.active = false;
|
this.hallow_node.active = true; // 更新神器
|
|
this.setHallowsRound(this.role_data.hallows_val, this.role_data.hallows_max);
|
} else {
|
this.spine = this.container.getChildByName("spine");
|
this.skeleton = this.spine.getComponent(sp.Skeleton);
|
this.effect = this.container.getChildByName("effect"); // 10星光环特效
|
|
this.hallow_node.active = false;
|
this.role_node.active = true; // this.setActive(true);
|
// 真实战斗才需要显示这些东西
|
|
if (this.is_real) {
|
this.level.string = this.role_data.lev;
|
} else {
|
this.role.active = false;
|
}
|
}
|
|
this.spine_zorder = this.spine.zIndex; // 设置当前的模型速率
|
|
if (this.skeleton_time_scale) {
|
this.skeleton.timeScale = this.skeleton_time_scale;
|
this.setEffectScale(this.skeleton_time_scale);
|
this.skeleton_time_scale = null;
|
} else {
|
var timeScale = this.model.getTimeScale();
|
this.skeleton.timeScale = timeScale;
|
this.setEffectScale(timeScale);
|
} // 监听事件
|
|
|
this.registerEvent(); // 初始化
|
|
this.resetInitStatus(); // 设置当前位置
|
|
this.setGridPos(); // 实例化模型
|
|
this.instantModelRole(); // 设置气血
|
|
this.setHP(0); // 看看有没有待添加的特效
|
|
this.checkEffectNeedAdd();
|
},
|
// 设置10星特效的播放速率
|
setEffectScale: function setEffectScale(time_scale) {
|
if (this.effect_skeleton) {// this.effect_skeleton.timeScale = time_scale;
|
}
|
},
|
registerEvent: function registerEvent() {
|
this.skeleton.setCompleteListener(function (trackEntry, loopCount) {
|
var animationName = trackEntry.animation ? trackEntry.animation.name : "";
|
var action_object = this.action_call_list[animationName];
|
|
if (action_object && action_object.over) {
|
action_object.over(animationName);
|
this.action_call_list[animationName] = null;
|
}
|
}.bind(this));
|
this.skeleton.setEventListener(function (trackEntry, event) {
|
var animationName = trackEntry.animation ? trackEntry.animation.name : "";
|
var action_object = this.action_call_list[animationName];
|
|
if (action_object && action_object.event) {
|
action_object.event(event.data.name);
|
}
|
}.bind(this));
|
},
|
// 设置角色格子位置,这个是要确定站位是在左边还是在右边
|
setGridPos: function setGridPos() {
|
var is_friend = false;
|
|
if (this.role_data == null) {
|
return;
|
}
|
|
if (this.role == null) {
|
return;
|
} // 站位要区分真假战斗
|
|
|
if (this.is_real == true) {
|
is_friend = this.model.isFriend(this.role_data.group);
|
} else {
|
is_friend = this.role_data.group == 1;
|
}
|
|
if (is_friend) {
|
this.obj_type = BattleConst.Battle_Type_Conf.TYPE_ROLE;
|
} else {
|
this.obj_type = BattleConst.Battle_Type_Conf.TYPE_ENEMY;
|
}
|
|
this.is_friend = is_friend; // 非己方的需要反转处理
|
|
if (this.is_friend == false) {
|
this.spine.scaleX = -1;
|
} else {
|
this.spine.scaleX = 1;
|
} // 获取当前格子站位
|
|
|
this.grid_pos = this.skill_act.newPos2Gird(this.role_data.pos, is_friend, this.role_data.group, this.is_real);
|
this.scene_pos = this.skill_act.gridPosToScreenPos(this.grid_pos);
|
this.role.setPosition(this.scene_pos);
|
this.resetZOrder();
|
},
|
// 设置坐标
|
setScenePos: function setScenePos(pos) {
|
this.role.setPosition(pos);
|
},
|
// 是否需要反转劫色,因为可能存在背刺技能
|
reverse: function reverse(rev) {
|
rev = rev || -1;
|
if (this.rev_value == rev) return;
|
this.rev_value = rev;
|
|
if (this.spine) {
|
this.spine.scaleX = rev;
|
}
|
},
|
// 实例化角色模型数据
|
instantModelRole: function instantModelRole() {
|
if (this.role_data == null) {
|
return;
|
} // 去配置表数据
|
|
|
var camp_type = 0; // 当前阵营
|
|
var spine_name = "";
|
var encircle_effect = ""; // 10星英雄特效
|
|
var fashion = 0; // 时装数据
|
|
if (this.role_data.object_type == BattleConst.Unit_Type.Hero) {
|
var key = Utils.getNorKey(this.role_data.object_bid, this.role_data.star);
|
var config_data = gdata("partner_data", "data_partner_star", key);
|
|
if (config_data) {
|
spine_name = config_data.res_id;
|
encircle_effect = config_data.fight_effect;
|
}
|
|
var base_config = Config.partner_data.data_partner_base[this.role_data.object_bid];
|
|
if (base_config) {
|
camp_type = base_config.camp_type;
|
}
|
} else if (this.role_data.object_type == BattleConst.Unit_Type.Hallows) {
|
var config_data = Config.hallows_data.data_base[this.role_data.object_bid];
|
|
if (config_data) {
|
spine_name = config_data.c_res_id;
|
}
|
} else {
|
var config_data = Utils.getUnitConfig(this.role_data.object_bid);
|
|
if (config_data) {
|
spine_name = config_data.body_id;
|
camp_type = config_data.camp_type;
|
encircle_effect = config_data.fight_effect;
|
}
|
} // 真是战斗就从服务端那边去,否则从battleloop2里面去数值
|
|
|
if (this.is_real == true) {
|
fashion = this.getBattleRoleExtendData(5); // 时装数据
|
} else {
|
fashion = this.role_data.fashion;
|
}
|
|
this.role_data.face_id = this.role_data.object_bid;
|
|
if (fashion != 0) {
|
var skin_config = Config.partner_skin_data.data_skin_info[fashion];
|
|
if (skin_config) {
|
spine_name = skin_config.res_id;
|
this.role_data.face_id = skin_config.head_id;
|
|
if (skin_config.fight_effect != "" && encircle_effect != "") {
|
encircle_effect = skin_config.fight_effect;
|
}
|
}
|
}
|
|
if (spine_name == "") {
|
return;
|
}
|
|
this.spine_name = spine_name; // 设置阵营
|
|
if (this.is_real && this.role_data.object_type != BattleConst.Unit_Type.Hallows) {
|
this.setCampIcon(camp_type);
|
} // 设置10星光环特效
|
|
|
if (encircle_effect != "") {
|
this.createEncircleEffect(encircle_effect);
|
} // 设置模型的高度
|
|
|
var config_model = Config.skill_data.data_get_model_data[spine_name];
|
|
if (config_model) {
|
this.model_height = config_model.model_height; // 模型的高度再上浮20个像素
|
}
|
|
this.top_container.y = this.model_height + this.top_off_y; //是否需要播放进场动作
|
|
if (this.play_enter) {
|
this.showEnterAction();
|
} else {
|
if (this.is_real) {
|
this.doStand(function () {
|
this.role.active = true;
|
this.setActive(true);
|
}.bind(this));
|
} else {
|
this.doRun(function () {
|
if (!this.is_real) {
|
this.role.active = true;
|
if (this.finish_cb) this.finish_cb();
|
}
|
|
this.setActive(true);
|
|
if (this.role_data.group == BattleConst.Group_Type.Enemgy) {
|
this.playUnrealEnterAction();
|
}
|
}.bind(this));
|
}
|
}
|
},
|
// 获取指定类型的额外数据
|
getBattleRoleExtendData: function getBattleRoleExtendData(key) {
|
if (this.role_data == null) return 0;
|
|
for (var index = 0; index < this.role_data.extra_data.length; index++) {
|
var element = this.role_data.extra_data[index];
|
|
if (element.extra_key == key) {
|
return element.extra_value;
|
}
|
}
|
|
return 0;
|
},
|
// 设置神器回合进度条
|
setHallowsRound: function setHallowsRound(val, max) {
|
if (this.role_data == null || this.role_data.object_type != BattleConst.Unit_Type.Hallows) return;
|
|
if (val == 0 || val == null) {
|
this.round_progress.progress = 0;
|
} else {
|
if (max == 0 || max == null) {
|
max = 3;
|
}
|
|
var per = Math.min(1, Math.max(val / max));
|
this.round_progress.progress = per;
|
}
|
},
|
// 是否需要播放进场动作
|
showEnterAction: function showEnterAction() {
|
if (this.role_data && this.role_data.object_type == BattleConst.Unit_Type.Hallows) {
|
// 神器不需要走任何处理
|
this.doStand();
|
return;
|
}
|
|
var time = 0.5;
|
var start_x = this.scene_pos.x;
|
var offset_x = SCREEN_WIDTH * 0.25;
|
var move_by = null;
|
|
if (this.is_friend == true) {
|
start_x = start_x - offset_x;
|
move_by = cc.moveTo(time, this.scene_pos.x, this.scene_pos.y);
|
} else {
|
start_x = start_x + offset_x;
|
move_by = cc.moveTo(time, this.scene_pos.x, this.scene_pos.y);
|
}
|
|
this.doRun();
|
this.role.x = start_x;
|
this.role.runAction(cc.sequence(move_by, cc.callFunc(function () {
|
this.doStand();
|
}.bind(this))));
|
},
|
// 设置阵营
|
setCampIcon: function setCampIcon(camp_type) {
|
var camp_icon = PathTool.getBattleCampIconByType(camp_type);
|
this.loadRes(camp_icon, function (icon, res_object) {
|
icon.spriteFrame = res_object;
|
}.bind(this), this.camp);
|
},
|
// 假战斗地方的进场效果
|
playUnrealEnterAction: function playUnrealEnterAction() {
|
if (this.role == null) return;
|
this.clearNextActTimer();
|
this.clearNextCallTimer();
|
var start_point_x = SCREEN_WIDTH * 1.1;
|
|
if (this.is_next_offset) {
|
start_point_x = SCREEN_WIDTH * 1.2;
|
} // var time = 2;
|
// var final_point_x = this.skill_act.gridPosToScreenPos(NormalPosGridRight[0]).x;
|
// var offset_x = final_point_x - start_point_x;
|
|
|
this.role.x = start_point_x; // 下一波怪
|
|
var next_time = 280;
|
|
var call_back = function () {// this.hook_model.updateNextRoundData();
|
// this.clearNextCallTimer();
|
}.bind(this);
|
|
if (this.next_call_mon_timer == null) {
|
this.next_call_mon_timer = gcore.Timer.set(function () {
|
call_back();
|
}.bind(this), next_time, 1);
|
} // 开始播放攻击动作
|
// var wait_time = 1590 - this.hook_model.getFinalMoveTime();
|
// var atk_back = function(){
|
// var skill_plays_data = BattleLoop.play(this.pos);
|
// if (skill_plays_data){
|
// var skill_plays_list = this.hook_model.getSkillPlayData(skill_plays_data.actor);
|
// if (skill_plays_list == null || skill_plays_list.length == 0){
|
// this.hook_model.handleSkillPlayData(skill_plays_data, function() {
|
// }.bind(this));
|
// }
|
// this.hook_model.updateActorPlaysList(skill_plays_data);
|
// }
|
// this.clearNextActTimer();
|
// }.bind(this);
|
// if (this.next_ack_mon_timer == null) {
|
// this.next_ack_mon_timer = gcore.Timer.set(function () {
|
// atk_back();
|
// }.bind(this), wait_time, 1)
|
// }
|
// // 移动
|
// var move_by = cc.moveBy(time, offset_x, 0);
|
// this.role.runAction(move_by);
|
|
|
var skill_plays_data = BattleLoop.play(this.pos);
|
|
if (skill_plays_data) {
|
cc.log("开始准备假战斗");
|
var skill_plays_list = this.hook_model.getSkillPlayData(skill_plays_data.actor);
|
|
if (skill_plays_list == null || skill_plays_list.length == 0) {
|
this.hook_model.handleSkillPlayData(skill_plays_data, function (start_cb) {
|
cc.log("开始进行假战斗0");
|
var wait_time = 1590 - this.hook_model.getFinalMoveTime();
|
|
if (!this.next_ack_mon_timer) {
|
this.next_ack_mon_timer = gcore.Timer.set(function () {
|
cc.log("准备攻击1");
|
if (start_cb) start_cb();
|
this.clearNextActTimer();
|
}.bind(this), wait_time, 1);
|
}
|
|
var time = 2;
|
var final_point_x = this.skill_act.gridPosToScreenPos(NormalPosGridRight[0]).x;
|
var offset_x = final_point_x - start_point_x;
|
this.role.stopAllActions();
|
var move_by = cc.moveBy(time, offset_x, 0);
|
|
if (!this.is_real && this.role_data.group == BattleConst.Group_Type.Enemgy) {
|
this.role.runAction(move_by);
|
}
|
}.bind(this));
|
}
|
|
this.hook_model.updateActorPlaysList(skill_plays_data);
|
}
|
},
|
// 清楚下一个攻击的定时器
|
clearNextActTimer: function clearNextActTimer() {
|
if (this.next_ack_mon_timer) {
|
gcore.Timer.del(this.next_ack_mon_timer);
|
this.next_ack_mon_timer = null;
|
}
|
},
|
// 清除下一波怪物刷新定时器
|
clearNextCallTimer: function clearNextCallTimer() {
|
if (this.next_call_mon_timer) {
|
gcore.Timer.del(this.next_call_mon_timer);
|
this.next_call_mon_timer = null;
|
}
|
},
|
doRun: function doRun(cb) {
|
this.playActionOnce(PlayerAction.run, null, null, null, cb);
|
},
|
doStand: function doStand(finish_cb) {
|
this.playActionOnce(PlayerAction.battle_stand, null, null, null, finish_cb);
|
|
if (this.talk_back == true) {
|
this.talk_back = false;
|
this.model.addReadySum();
|
}
|
},
|
// 设置动作伴随事件和动作结束事件回调
|
setAnimationActionFunc: function setAnimationActionFunc(event_func, over_func, action_name) {
|
if (action_name == null) return;
|
|
if (this.action_call_list[action_name] == null) {
|
this.action_call_list[action_name] = {
|
over: null,
|
event: null
|
};
|
}
|
|
this.action_call_list[action_name].over = over_func;
|
this.action_call_list[action_name].event = event_func;
|
},
|
|
/**
|
* 切换动作,由于处于待机的时候,可能马上切换到其他动作,所以这里要看看要不要处理成待机播放完成之后
|
* @param {*} action_name 目标动作名字
|
* @param {*} res_name 目标资源名字
|
*/
|
playActionOnce: function playActionOnce(action_name, res_name, is_loop, force, load_fini) {
|
res_name = res_name || action_name;
|
|
if (is_loop == null) {
|
is_loop = true;
|
}
|
|
if (this.play_action_res == res_name) {
|
if (this.play_action_name != action_name) {
|
this.play_action_name = action_name;
|
this.skeleton.setToSetupPose();
|
this.skeleton.setAnimation(0, action_name, is_loop);
|
}
|
|
return;
|
}
|
|
this.play_action_res = res_name;
|
var skeleton_path = PathTool.getSpinePath(this.spine_name, res_name);
|
|
if (!this.skelon_cache[skeleton_path]) {
|
BattleResPool.getInstance().getRes(skeleton_path, function (load_fini, res_object) {
|
this.play_action_name = action_name;
|
this.skeleton.skeletonData = res_object;
|
this.skeleton.setAnimation(0, action_name, is_loop);
|
|
if (!this.skelon_cache[skeleton_path]) {
|
this.skelon_cache[skeleton_path] = res_object;
|
}
|
|
if (load_fini) load_fini();
|
}.bind(this, load_fini)); // LoaderManager.getInstance().loadRes(skeleton_path, function (load_fini, res_object) {
|
// this.play_action_name = action_name;
|
// this.skeleton.skeletonData = res_object;
|
// this.skeleton.setAnimation(0, action_name, is_loop);
|
// if (!this.skelon_cache[skeleton_path]) {
|
// this.skelon_cache[skeleton_path] = res_object;
|
// }
|
// if (load_fini)
|
// load_fini();
|
// }.bind(this, load_fini))
|
} else {
|
this.play_action_name = action_name;
|
this.skeleton.skeletonData = this.skelon_cache[skeleton_path];
|
this.skeleton.setToSetupPose();
|
this.skeleton.setAnimation(0, action_name, is_loop);
|
if (load_fini) load_fini();
|
}
|
},
|
// 重设基础数据,包含切换到战力动作等
|
resetBaseInfo: function resetBaseInfo() {
|
this.playActionOnce(PlayerAction.battle_stand);
|
this.role.setPosition(this.scene_pos);
|
this.resetZOrder();
|
this.reverse(this.obj_type);
|
},
|
// 设置深度值
|
resetZOrder: function resetZOrder() {
|
if (this.role_data == null) {
|
return;
|
}
|
|
if (this.role == null) {
|
return;
|
}
|
|
if (this.role_base_zorder) {
|
if (this.role_cur_zorder != this.role_base_zorder) {
|
this.role_cur_zorder = this.role_base_zorder;
|
this.role.zIndex = this.role_base_zorder;
|
}
|
|
return;
|
}
|
|
var zorder = 0;
|
var group = this.role_data.group - 1;
|
var pos = this.role_data.pos - 1;
|
|
if (this.role_data.group == BattleConst.Group_Type.Enemgy) {
|
zorder = BattleRoleZorder[group][pos - GIRD_POS_OFFSET];
|
} else {
|
zorder = BattleRoleZorder[group][pos];
|
}
|
|
this.role_base_zorder = zorder;
|
this.role_cur_zorder = zorder;
|
this.role.zIndex = zorder;
|
},
|
// 设置深度
|
setLocalZOrder: function setLocalZOrder(zIndex) {
|
if (this.role_cur_zorder == zIndex) {
|
return;
|
}
|
|
this.role_cur_zorder = zIndex;
|
|
if (this.role) {
|
this.role.zIndex = zIndex;
|
}
|
},
|
// 当前深度值
|
getLocalZOrder: function getLocalZOrder() {
|
return this.role_cur_zorder || 0;
|
},
|
// 战斗动作播报
|
runAction: function runAction(action) {
|
if (this.role) {
|
// this.role.stopAllActions();
|
if (action) {
|
this.role.runAction(action);
|
}
|
}
|
},
|
// 添加一个战斗特效,可能是buff, index:0 为上层特效 1:为下层特效
|
addBattleEfffect: function addBattleEfffect(fix, fiy, effect_id, action_name, index, obj_type) {
|
if (this.container == null) {
|
if (this.wait_add_effect_list[effect_id] == null) {
|
this.wait_add_effect_list[effect_id] = {};
|
}
|
|
if (this.wait_add_effect_list[effect_id][action_name] == null) {
|
this.wait_add_effect_list[effect_id][action_name] = {
|
fix: fix,
|
fiy: fiy,
|
effect_id: effect_id,
|
action_name: action_name,
|
index: index
|
};
|
}
|
|
return;
|
} // 这个确定是否要反转特效
|
|
|
if (obj_type == null) {
|
obj_type = this.obj_type;
|
}
|
|
if (this.effect_list[effect_id] == null) {
|
this.effect_list[effect_id] = {};
|
}
|
|
if (this.effect_list[effect_id][action_name] == null) {
|
this.effect_list[effect_id][action_name] = {
|
num: 1,
|
object: null
|
};
|
}
|
|
var effect_object = this.effect_list[effect_id][action_name];
|
|
if (effect_object.object == null) {
|
effect_object.object = new BattleEffect();
|
effect_object.object.createEffect(this.container, cc.v2(fix, fiy), obj_type, effect_id);
|
} else {
|
effect_object.num += 1;
|
|
if (effect_object.num > 0) {
|
effect_object.object.setActiveEffect(true);
|
}
|
} // 设置特效的深度值
|
|
|
var zorder = this.spine_zorder + 1;
|
|
if (index == 1) {
|
zorder = this.spine_zorder - 1;
|
}
|
|
effect_object.object.setLocalZOrder(zorder);
|
return effect_object;
|
},
|
// 监测是否有待添加特效
|
checkEffectNeedAdd: function checkEffectNeedAdd() {
|
for (var effect_id in this.wait_add_effect_list) {
|
for (var action_name in this.wait_add_effect_list[effect_id]) {
|
var object = this.wait_add_effect_list[effect_id][action_name];
|
|
if (object && object.effect_id) {
|
this.addBattleEfffect(object.fix, object.fiy, object.effect_id, object.action_name, object.index);
|
}
|
}
|
}
|
|
this.wait_add_effect_list = {};
|
},
|
// 移除一个特效,并不是强制移除,只是把计数器-1,如果计数器为0,才是彻底移除
|
delBattleEffect: function delBattleEffect(effect_id, action_name, force) {
|
if (this.wait_add_effect_list[effect_id]) {
|
if (this.wait_add_effect_list[effect_id][action_name] != null) {
|
this.wait_add_effect_list[effect_id][action_name] = null;
|
}
|
}
|
|
if (this.effect_list[effect_id] == null) {
|
return;
|
}
|
|
var effect_object = this.effect_list[effect_id][action_name];
|
|
if (effect_object == null) {
|
return;
|
}
|
|
effect_object.num -= 1;
|
|
if (effect_object.num <= 0) {
|
effect_object.object.setActiveEffect(false);
|
}
|
},
|
// 显示或者隐藏掉血条
|
showHpRoot: function showHpRoot(status) {
|
if (this.is_real == false) return; // 假战斗不需要管这个
|
|
if (this.hp_show_status == status) {
|
return;
|
}
|
|
this.hp_show_status = status;
|
|
if (this.top_container) {
|
this.top_container.active = status;
|
}
|
},
|
|
/**
|
* 血量变化的值
|
* @param {*} dmg 正数是治疗,负数是扣血
|
* @param {*} is_die 是否死亡
|
* @param {*} without 是否提出掉非死亡状态
|
* @param {*} is_must_die 如果为0,就标识可以移除了.否则就算死了也不移除.因为可能在连击中
|
*/
|
updateHP: function updateHP(dmg, is_die, without, is_must_die) {
|
if (this.role_data == null) {
|
return;
|
}
|
|
if (this.top_container == null) {
|
return;
|
}
|
|
if (this.role_data && this.role_data.object_type == BattleConst.Unit_Type.Hallows) return;
|
this.setHP(dmg);
|
|
if (without == null) {
|
without = false;
|
}
|
|
if (is_die == 1 && is_must_die == 0) {
|
if (this.is_die == false) {
|
this.died();
|
}
|
} else {
|
if (this.is_die == true && without == false) {
|
this.relive();
|
}
|
}
|
},
|
// 处理角色复活
|
relive: function relive() {
|
if (this.is_die == false) {
|
return;
|
}
|
|
;
|
this.is_die = false;
|
this.resetBaseInfo();
|
this.showHpRoot(true);
|
this.setActive(true);
|
var cur_hp = this.role_data.hp;
|
var per = Math.min(1, Math.max(cur_hp / this.role_data.hp_max));
|
this.progress.progress = per;
|
},
|
// 立刻移除对象
|
doDied: function doDied() {
|
if (this.is_die == true) {
|
return;
|
}
|
|
this.is_die = true;
|
this.showHpRoot(false);
|
this.setActive(false);
|
this.clearAllEffect();
|
},
|
// 处理角色死亡
|
died: function died() {
|
// console.trace("1111111111111");
|
if (this.in_hurt_act == true) {
|
this.need_play_die = true;
|
return;
|
}
|
|
if (this.role == null) {
|
return;
|
}
|
|
if (this.is_die == true) {
|
return;
|
}
|
|
this.is_die = true;
|
var delay_time = 0.25;
|
var blink = cc.blink(0.25, 2);
|
var fadeOut = cc.fadeOut(0.25);
|
var callFunc_1 = cc.callFunc(function () {
|
this.showHpRoot(false);
|
this.is_act_die = true;
|
this.setActive(false);
|
|
if (this.is_real == false) {
|
//假战斗怪物死掉了的话,需要通知要创建了
|
this.assetJumpTo();
|
this.hook_model.playEnd(this.pos);
|
this.hook_model.updateNextRoundData();
|
}
|
}.bind(this));
|
var act = cc.sequence(cc.delayTime(delay_time), blink, fadeOut, callFunc_1);
|
this.runAction(act); // 清除所有的特效
|
|
this.clearAllEffect(false); // 回收掉所有buff图标
|
|
this.removeBuffItemRes();
|
this.removeBuffList();
|
},
|
// 设置是否激活
|
setActive: function setActive(status) {
|
if (this.is_real == true) {
|
this.top_container.active = status;
|
} else {
|
this.top_container.active = false;
|
}
|
|
this.role.opacity = 255;
|
this.shadow.active = status;
|
this.skeleton.markForRender(status);
|
|
if (this.effect) {
|
this.effect.active = status;
|
}
|
},
|
// 受击动作播放完成之后的处理
|
checkIsDied: function checkIsDied() {
|
if (this.need_play_die == true) {
|
this.need_play_die = false;
|
this.died();
|
} else {
|
this.doStand();
|
}
|
},
|
// 设置气血
|
setHP: function setHP(dmg) {
|
if (this.role_data == null) {
|
return;
|
}
|
|
var cur_hp = 0;
|
|
if (dmg <= 0) {
|
// 伤害
|
cur_hp = Math.max(0, dmg + this.role_data.hp);
|
} else {
|
// 恢复
|
cur_hp = Math.min(this.role_data.hp_max, dmg + this.role_data.hp);
|
}
|
|
this.role_data.hp = cur_hp;
|
var per = Math.min(1, Math.max(cur_hp / this.role_data.hp_max));
|
this.progress.progress = per;
|
},
|
// 下一波怪如果是己方需要清掉所有的buff之类的
|
updataNextBattleRole: function updataNextBattleRole(data) {
|
if (this.role_data) {
|
this.role_data.updateData(data);
|
this.clearAllEffect(false);
|
|
if (this.role_data.hp <= 0) {
|
this.died();
|
} else {
|
var per = Math.min(1, Math.max(this.role_data.hp / this.role_data.hp_max));
|
this.progress.progress = per;
|
}
|
}
|
},
|
// 变身操作
|
changeSpine: function changeSpine(status, spine_res, action_name) {},
|
// 通知播放假战斗资源掉落
|
assetJumpTo: function assetJumpTo() {
|
var node_root_pos = this.role.convertToWorldSpace(cc.v2(0, 0)); // 转到世界坐标
|
|
this.model.playResourceCollect(node_root_pos.x, node_root_pos.y + this.model_height * 0.5, this.pos); //
|
},
|
// 隐身
|
setOpacity: function setOpacity(status, value) {},
|
// 更新buff,包含更新buff列表
|
updateBuffList: function updateBuffList(buff, buff_cfg) {
|
if (buff == null || buff_cfg == null) {
|
return;
|
}
|
|
this.buff_list[buff.id] = null;
|
this.buff_list[buff.id] = {
|
buff: buff,
|
config: buff_cfg,
|
res_id: buff_cfg.icon
|
};
|
var temp_group_list = {};
|
var res_id = buff_cfg.icon;
|
|
if (res_id != 0) {
|
var buff_data = this.buff_list_data[res_id];
|
|
if (buff_data == null) {
|
buff_data = {
|
res_id: res_id,
|
num: 0,
|
list: []
|
};
|
this.buff_list_data[res_id] = buff_data;
|
}
|
|
if (buff_data.num == 0 || buff_cfg.join_type && buff_cfg.join_type != 3) {
|
buff_data.num += 1;
|
|
if (buff_cfg.group) {
|
temp_group_list[buff_cfg.group] = true;
|
}
|
} else if (buff_cfg.join_type && buff_cfg.join_type == 3 && buff_cfg.group && !temp_group_list[buff_cfg.group]) {
|
temp_group_list[buff_cfg.group] = true;
|
buff_data.num += 1;
|
}
|
|
buff_data.list.push(buff.id);
|
var temp_ary = [];
|
|
for (var key in this.buff_list_data) {
|
var data = this.buff_list_data[key];
|
|
if (data) {
|
temp_ary.push(data);
|
}
|
}
|
|
if (temp_ary.length > 0) {
|
temp_ary.sort(Utils.tableLowerSorter(["res_id"]));
|
var length = Math.min(3, temp_ary.length); // 最多值创建4个
|
|
for (var index = 0; index < length; index++) {
|
var data = temp_ary[index];
|
var buff_object = this.buff_list_item[data.res_id];
|
|
if (buff_object == null) {
|
buff_object = this.createBuffItem();
|
this.buff_list_item[data.res_id] = buff_object;
|
}
|
|
buff_object.label.string = data.num;
|
buff_object.node.x = 22 * index;
|
var buff_path = PathTool.getBuffRes(data.res_id);
|
|
if (buff_object.path != buff_path) {
|
buff_object.path = buff_path;
|
this.loadRes(buff_path, function (icon, res_object) {
|
icon.spriteFrame = res_object;
|
}.bind(this), buff_object.icon);
|
}
|
}
|
}
|
}
|
},
|
// 移除buff没如果没有传参数,就是移除全部
|
removeBuffList: function removeBuffList(buff_id) {
|
if (buff_id == null) {
|
this.buff_list = {};
|
this.buff_list_data = {};
|
|
for (var key in this.buff_list_item) {
|
var buff_object = this.buff_list_item[key];
|
|
if (buff_object && buff_object.node) {
|
BattleRolePool.getInstance().pushBackBuffPools(buff_object.node);
|
}
|
}
|
|
this.buff_list_item = {};
|
} else {
|
var data = this.buff_list[buff_id]; // {buff:buff, config:buff_data, res_id: buff_data.icon};
|
|
if (data) {
|
var buff_object = this.buff_list_item[data.res_id];
|
|
if (buff_object) {
|
var buff_data = this.buff_list_data[data.res_id]; // 取出具体数字
|
|
if (buff_data) {
|
buff_data.num -= 1; // 将该buff从列表中删除
|
|
for (var index = 0; index < buff_data.list.length; index++) {
|
var element = buff_data.list[index];
|
|
if (element == buff_id) {
|
buff_data.list.splice(index, 1);
|
break;
|
}
|
} // 当前没有可用于显示的buff了,把buff节点丢到对象池里面去
|
|
|
if (buff_data.num <= 0) {
|
buff_object.icon.spriteFrame = null; // 回收对象的时候,优先清掉旧的纹理信息
|
|
BattleRolePool.getInstance().pushBackBuffPools(buff_object.node);
|
this.buff_list_item[data.res_id] = null;
|
this.buff_list_data[data.res_id] = null;
|
this.resetBuffPostion();
|
} else {
|
buff_object.label.string = buff_data.num;
|
}
|
}
|
}
|
}
|
|
this.buff_list[buff_id] = null;
|
}
|
},
|
// 回收buff图标的时候,优先清理掉缓存的纹理信息
|
removeBuffItemRes: function removeBuffItemRes() {
|
for (var key in this.buff_list_item) {
|
var buff_object = this.buff_list_item[key];
|
|
if (buff_object && buff_object.icon) {
|
buff_object.icon.spriteFrame = null; // 回收对象的时候,优先清掉旧的纹理信息
|
}
|
}
|
},
|
// 创建10星环绕特效
|
createEncircleEffect: function createEncircleEffect(effect_res) {
|
if (this.encircle_effect == effect_res) return;
|
|
if (this.effect_skeleton == null) {
|
this.effect_skeleton = this.effect.addComponent(sp.Skeleton);
|
}
|
|
this.encircle_effect = effect_res;
|
var skeleton_path = PathTool.getSpinePath(effect_res);
|
this.loadRes(skeleton_path, function (skeleton, res_object) {
|
skeleton.skeletonData = res_object;
|
skeleton.setAnimation(0, PlayerAction.action, true);
|
skeleton.enabled = true;
|
}.bind(this), this.effect_skeleton);
|
},
|
// 创建buff,手动创建,但是对象池获取,包含 node, label, path icon
|
createBuffItem: function createBuffItem() {
|
var pools = BattleRolePool.getInstance().getBuffPools();
|
var buff_object = {
|
node: null,
|
label: null,
|
icon: null,
|
path: ""
|
};
|
var node = null;
|
var label = null;
|
var icon = null;
|
|
if (pools.size() > 0) {
|
node = pools.get();
|
label = node.getChildByName("font_label").getComponent(cc.Label);
|
icon = node.getChildByName("icon_sprite").getComponent(cc.Sprite);
|
} else {
|
node = new cc.Node();
|
node.setAnchorPoint(0, 0.5);
|
node.width = 20;
|
node.height = 20;
|
var icon_node = new cc.Node();
|
icon_node.setAnchorPoint(0, 0.5);
|
icon_node.name = "icon_sprite";
|
node.addChild(icon_node);
|
icon = icon_node.addComponent(cc.Sprite);
|
var font_node = new cc.Node();
|
font_node.color = new cc.Color(cc.Color.WHITE);
|
font_node.setAnchorPoint(1, 0.5);
|
font_node.x = 20;
|
font_node.y = -3;
|
font_node.name = "font_label";
|
node.addChild(font_node);
|
label = font_node.addComponent(cc.Label);
|
label.lineHeight = 14;
|
label.fontSize = 14;
|
label.horizontalAlign = cc.macro.TextAlignment.RIGHT;
|
var outline_label = font_node.addComponent(cc.LabelOutline);
|
outline_label.color = new cc.Color(cc.Color.BLACK);
|
}
|
|
this.buff_container.addChild(node);
|
buff_object.node = node;
|
buff_object.label = label;
|
buff_object.icon = icon;
|
return buff_object;
|
},
|
// 重新设置buff的位置
|
resetBuffPostion: function resetBuffPostion() {
|
if (this.buff_list_item) {
|
var temp_ary = [];
|
|
for (var res_id in this.buff_list_item) {
|
if (this.buff_list_item[res_id]) {
|
temp_ary.push({
|
res_id: res_id,
|
object: this.buff_list_item[res_id]
|
});
|
}
|
}
|
|
if (temp_ary.length > 0) {
|
temp_ary.sort(Utils.tableLowerSorter(["res_id"]));
|
|
for (var index = 0; index < temp_ary.length; index++) {
|
var element = temp_ary[index];
|
|
if (element && element.object && element.object.node) {
|
element.object.node.x = 22 * index;
|
}
|
}
|
}
|
}
|
},
|
// 判断是否拥有当前id的buff
|
hadBuff: function hadBuff(buff_id) {
|
return this.buff_list && this.buff_list[buff_id] != null;
|
},
|
getRoleData: function getRoleData() {
|
return this.role_data;
|
},
|
addTips: function addTips(bid) {
|
this.tips_list[bid] = true;
|
},
|
removeTips: function removeTips(bid) {
|
this.tips_list[bid] = false;
|
},
|
loadRes: function loadRes(res, callback, node) {
|
if (res == null || res == "") return;
|
if (callback == null) return;
|
var temp_object = this.resources_list[res];
|
|
if (temp_object) {
|
callback(node, temp_object);
|
} else {
|
LoaderManager.getInstance().loadRes(res, function (object, res_object) {
|
if (this.resources_list[res] == null) {
|
this.resources_list[res] = res_object;
|
}
|
|
callback(object, res_object);
|
}.bind(this, node));
|
}
|
},
|
// 设置当前模型和绑在模型上面的特效播放速率
|
setTimeScale: function setTimeScale(speed) {
|
if (this.skeleton == null || this.skeleton.skeletonData == null) {
|
this.skeleton_time_scale = speed;
|
} else {
|
if (this.skeleton_timeScale == speed) return;
|
this.skeleton_timeScale = speed;
|
this.skeleton.timeScale = speed;
|
this.setEffectScale(speed); // 设置特效
|
|
for (var effect_id in this.effect_list) {
|
var effect_object = this.effect_list[effect_id];
|
|
for (var action_name in effect_object) {
|
var effect = effect_object[action_name];
|
|
if (effect && effect.object) {
|
effect.object.setTimeScale(speed);
|
}
|
}
|
}
|
}
|
},
|
// 显示聊天气泡
|
showTalkBubble: function showTalkBubble(msg) {},
|
// 清空所有特效
|
clearAllEffect: function clearAllEffect(is_force) {
|
for (var effect_id in this.effect_list) {
|
var effect_object = this.effect_list[effect_id];
|
|
for (var action_name in effect_object) {
|
var effect = effect_object[action_name];
|
|
if (effect && effect.object) {
|
effect.object.deleEffect();
|
}
|
}
|
}
|
|
if (is_force == true) {
|
this.effect_list = null;
|
this.wait_add_effect_list = null;
|
} else {
|
this.effect_list = {};
|
this.wait_add_effect_list = {};
|
}
|
},
|
|
/**
|
* 从场景中移除这个单位,回收掉所有的创建节点和预制,并且删除掉所有的资源纹理信息
|
*/
|
deleteRole: function deleteRole() {
|
if (this.role) {
|
this.role.stopAllActions();
|
}
|
|
this.clearAllEffect(true);
|
this.clearNextActTimer();
|
this.clearNextCallTimer();
|
this.removeBuffItemRes(); // 优先清掉buff缓存的纹理信息
|
// this.skeleton.skeletonData = null; // 释放之前先把节点对象的资源清除
|
|
if (this.effect_skeleton) {
|
this.effect_skeleton.enabled = false; // this.effect.removeComponent(sp.Skeleton);
|
// this.effect_skeleton = null; // 10星光环特效
|
}
|
|
if (this.camp) {
|
this.camp.spriteFrame = null; // 先释放掉节点对象资源引用对象
|
}
|
|
this.action_call_list = {};
|
this.tips_list = {};
|
|
for (var skeletonIndex in this.skelon_cache) {
|
BattleResPool.getInstance().delRes(skeletonIndex);
|
} // 这两处释放res 资源有问题
|
|
|
for (var key in this.resources_list) {
|
LoaderManager.getInstance().releaseRes(key);
|
}
|
|
this.skelon_cache = {}; // 移除掉所有的buff节点,并且丢到对象池中
|
|
this.removeBuffList(); // 把当前节点对象,重新放到缓存池中区
|
|
BattleRolePool.getInstance().pushBackRole(this.role);
|
},
|
getResPath: function getResPath(action_name) {
|
return "spine/" + this.spine_name + "/" + action_name;
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9yb2xlLmpzIl0sIm5hbWVzIjpbIkJhdHRsZVJvbGVQb29sIiwicmVxdWlyZSIsIkJhdHRsZVJlc1Bvb2wiLCJMb2FkZXJNYW5hZ2VyIiwiUGF0aFRvb2wiLCJCYXR0bGVDb25zdCIsIkJhdHRsZUVmZmVjdCIsIkJhdHRsZVJvbGUiLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwicHJvcGVydGllcyIsInNrZWxvbl9jYWNoZSIsImN0b3IiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJpc19uZXh0X29mZnNldCIsImluaXRDb25maWciLCJyb2xlIiwicGFyZW50IiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJyb2xlX2RhdGEiLCJ0b3Bfb2ZmX3kiLCJpc19yZWFsIiwicGxheV9lbnRlciIsInRhbGtfYmFjayIsImdyaWRfcG9zIiwic2NlbmVfcG9zIiwiaXNfZnJpZW5kIiwib2JqX3R5cGUiLCJtb2RlbF9oZWlnaHQiLCJtb2RlbF93aWR0aCIsInBvcyIsImdyb3VwIiwic3BpbmVfbmFtZSIsInBsYXlfYWN0aW9uX25hbWUiLCJpc19yb3VuZCIsImVmZmVjdF9saXN0IiwiaHBfc2hvd19zdGF0dXMiLCJpc19kaWUiLCJyb2xlX2N1cl96b3JkZXIiLCJpbl9odXJ0X2FjdCIsIm5lZWRfcGxheV9kaWUiLCJCYXR0bGVDb250cm9sbGVyIiwibW9kZWwiLCJnZXRJbnN0YW5jZSIsImdldE1vZGVsIiwiaG9va19tb2RlbCIsImdldEhvb2tNb2RlbCIsInNraWxsX2FjdCIsIndhaXRfYWN0aW9uX25hbWUiLCJ3YWl0X3Jlc19uYW1lIiwid2FpdF9pc19sb29wIiwidGlwc19saXN0IiwiYnVmZl9saXN0IiwiYnVmZl9saXN0X2RhdGEiLCJidWZmX2xpc3RfaXRlbSIsImFjdGlvbl9jYWxsX2xpc3QiLCJ3YWl0X2FkZF9lZmZlY3RfbGlzdCIsInJlc291cmNlc19saXN0IiwiZG1nX2luZGV4IiwiY3JlYXRlUm9sZSIsImJhdHRsZV9yb2xlX2RhdGEiLCJmaW5pc2hfY2IiLCJwb29scyIsImdldFJlYWxQb29scyIsInNpemUiLCJnZXQiLCJjcmVhdGVSb290V25kIiwibG9hZFJlcyIsInJlc19vYmplY3QiLCJiaW5kIiwicmVzZXRJbml0U3RhdHVzIiwic2tlbGV0b24iLCJzZXRUb1NldHVwUG9zZSIsImNsZWFyVHJhY2tzIiwidmFsaWQiLCJpc1ZhbGlkIiwiYWRkQ2hpbGQiLCJyb2xlX25vZGUiLCJnZXRDaGlsZEJ5TmFtZSIsImNvbnRhaW5lciIsInRvcF9jb250YWluZXIiLCJzaGFkb3ciLCJwcm9ncmVzcyIsImdldENvbXBvbmVudCIsIlByb2dyZXNzQmFyIiwibGV2ZWwiLCJMYWJlbCIsImNhbXAiLCJTcHJpdGUiLCJidWZmX2NvbnRhaW5lciIsImhhbGxvd19ub2RlIiwicm91bmRfcHJvZ3Jlc3MiLCJvYmplY3RfdHlwZSIsIlVuaXRfVHlwZSIsIkhhbGxvd3MiLCJzcGluZSIsInNwIiwiU2tlbGV0b24iLCJhY3RpdmUiLCJzZXRIYWxsb3dzUm91bmQiLCJoYWxsb3dzX3ZhbCIsImhhbGxvd3NfbWF4IiwiZWZmZWN0Iiwic3RyaW5nIiwibGV2Iiwic3BpbmVfem9yZGVyIiwiekluZGV4Iiwic2tlbGV0b25fdGltZV9zY2FsZSIsInRpbWVTY2FsZSIsInNldEVmZmVjdFNjYWxlIiwiZ2V0VGltZVNjYWxlIiwicmVnaXN0ZXJFdmVudCIsInNldEdyaWRQb3MiLCJpbnN0YW50TW9kZWxSb2xlIiwic2V0SFAiLCJjaGVja0VmZmVjdE5lZWRBZGQiLCJ0aW1lX3NjYWxlIiwiZWZmZWN0X3NrZWxldG9uIiwic2V0Q29tcGxldGVMaXN0ZW5lciIsInRyYWNrRW50cnkiLCJsb29wQ291bnQiLCJhbmltYXRpb25OYW1lIiwiYW5pbWF0aW9uIiwibmFtZSIsImFjdGlvbl9vYmplY3QiLCJvdmVyIiwic2V0RXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiZGF0YSIsImlzRnJpZW5kIiwiQmF0dGxlX1R5cGVfQ29uZiIsIlRZUEVfUk9MRSIsIlRZUEVfRU5FTVkiLCJzY2FsZVgiLCJuZXdQb3MyR2lyZCIsImdyaWRQb3NUb1NjcmVlblBvcyIsInNldFBvc2l0aW9uIiwicmVzZXRaT3JkZXIiLCJzZXRTY2VuZVBvcyIsInJldmVyc2UiLCJyZXYiLCJyZXZfdmFsdWUiLCJjYW1wX3R5cGUiLCJlbmNpcmNsZV9lZmZlY3QiLCJmYXNoaW9uIiwiSGVybyIsImtleSIsIlV0aWxzIiwiZ2V0Tm9yS2V5Iiwib2JqZWN0X2JpZCIsInN0YXIiLCJjb25maWdfZGF0YSIsImdkYXRhIiwicmVzX2lkIiwiZmlnaHRfZWZmZWN0IiwiYmFzZV9jb25maWciLCJDb25maWciLCJwYXJ0bmVyX2RhdGEiLCJkYXRhX3BhcnRuZXJfYmFzZSIsImhhbGxvd3NfZGF0YSIsImRhdGFfYmFzZSIsImNfcmVzX2lkIiwiZ2V0VW5pdENvbmZpZyIsImJvZHlfaWQiLCJnZXRCYXR0bGVSb2xlRXh0ZW5kRGF0YSIsImZhY2VfaWQiLCJza2luX2NvbmZpZyIsInBhcnRuZXJfc2tpbl9kYXRhIiwiZGF0YV9za2luX2luZm8iLCJoZWFkX2lkIiwic2V0Q2FtcEljb24iLCJjcmVhdGVFbmNpcmNsZUVmZmVjdCIsImNvbmZpZ19tb2RlbCIsInNraWxsX2RhdGEiLCJkYXRhX2dldF9tb2RlbF9kYXRhIiwieSIsInNob3dFbnRlckFjdGlvbiIsImRvU3RhbmQiLCJzZXRBY3RpdmUiLCJkb1J1biIsIkdyb3VwX1R5cGUiLCJFbmVtZ3kiLCJwbGF5VW5yZWFsRW50ZXJBY3Rpb24iLCJpbmRleCIsImV4dHJhX2RhdGEiLCJlbGVtZW50IiwiZXh0cmFfa2V5IiwiZXh0cmFfdmFsdWUiLCJ2YWwiLCJtYXgiLCJwZXIiLCJNYXRoIiwibWluIiwidGltZSIsInN0YXJ0X3giLCJ4Iiwib2Zmc2V0X3giLCJTQ1JFRU5fV0lEVEgiLCJtb3ZlX2J5IiwibW92ZVRvIiwicnVuQWN0aW9uIiwic2VxdWVuY2UiLCJjYWxsRnVuYyIsImNhbXBfaWNvbiIsImdldEJhdHRsZUNhbXBJY29uQnlUeXBlIiwiaWNvbiIsInNwcml0ZUZyYW1lIiwiY2xlYXJOZXh0QWN0VGltZXIiLCJjbGVhck5leHRDYWxsVGltZXIiLCJzdGFydF9wb2ludF94IiwibmV4dF90aW1lIiwiY2FsbF9iYWNrIiwibmV4dF9jYWxsX21vbl90aW1lciIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJza2lsbF9wbGF5c19kYXRhIiwiQmF0dGxlTG9vcCIsInBsYXkiLCJsb2ciLCJza2lsbF9wbGF5c19saXN0IiwiZ2V0U2tpbGxQbGF5RGF0YSIsImFjdG9yIiwiaGFuZGxlU2tpbGxQbGF5RGF0YSIsInN0YXJ0X2NiIiwid2FpdF90aW1lIiwiZ2V0RmluYWxNb3ZlVGltZSIsIm5leHRfYWNrX21vbl90aW1lciIsImZpbmFsX3BvaW50X3giLCJOb3JtYWxQb3NHcmlkUmlnaHQiLCJzdG9wQWxsQWN0aW9ucyIsIm1vdmVCeSIsInVwZGF0ZUFjdG9yUGxheXNMaXN0IiwiZGVsIiwiY2IiLCJwbGF5QWN0aW9uT25jZSIsIlBsYXllckFjdGlvbiIsInJ1biIsImJhdHRsZV9zdGFuZCIsImFkZFJlYWR5U3VtIiwic2V0QW5pbWF0aW9uQWN0aW9uRnVuYyIsImV2ZW50X2Z1bmMiLCJvdmVyX2Z1bmMiLCJhY3Rpb25fbmFtZSIsInJlc19uYW1lIiwiaXNfbG9vcCIsImZvcmNlIiwibG9hZF9maW5pIiwicGxheV9hY3Rpb25fcmVzIiwic2V0QW5pbWF0aW9uIiwic2tlbGV0b25fcGF0aCIsImdldFNwaW5lUGF0aCIsImdldFJlcyIsInNrZWxldG9uRGF0YSIsInJlc2V0QmFzZUluZm8iLCJyb2xlX2Jhc2Vfem9yZGVyIiwiem9yZGVyIiwiQmF0dGxlUm9sZVpvcmRlciIsIkdJUkRfUE9TX09GRlNFVCIsInNldExvY2FsWk9yZGVyIiwiZ2V0TG9jYWxaT3JkZXIiLCJhY3Rpb24iLCJhZGRCYXR0bGVFZmZmZWN0IiwiZml4IiwiZml5IiwiZWZmZWN0X2lkIiwibnVtIiwib2JqZWN0IiwiZWZmZWN0X29iamVjdCIsImNyZWF0ZUVmZmVjdCIsInYyIiwic2V0QWN0aXZlRWZmZWN0IiwiZGVsQmF0dGxlRWZmZWN0Iiwic2hvd0hwUm9vdCIsInN0YXR1cyIsInVwZGF0ZUhQIiwiZG1nIiwid2l0aG91dCIsImlzX211c3RfZGllIiwiZGllZCIsInJlbGl2ZSIsImN1cl9ocCIsImhwIiwiaHBfbWF4IiwiZG9EaWVkIiwiY2xlYXJBbGxFZmZlY3QiLCJkZWxheV90aW1lIiwiYmxpbmsiLCJmYWRlT3V0IiwiY2FsbEZ1bmNfMSIsImlzX2FjdF9kaWUiLCJhc3NldEp1bXBUbyIsInBsYXlFbmQiLCJ1cGRhdGVOZXh0Um91bmREYXRhIiwiYWN0IiwiZGVsYXlUaW1lIiwicmVtb3ZlQnVmZkl0ZW1SZXMiLCJyZW1vdmVCdWZmTGlzdCIsIm9wYWNpdHkiLCJtYXJrRm9yUmVuZGVyIiwiY2hlY2tJc0RpZWQiLCJ1cGRhdGFOZXh0QmF0dGxlUm9sZSIsInVwZGF0ZURhdGEiLCJjaGFuZ2VTcGluZSIsInNwaW5lX3JlcyIsIm5vZGVfcm9vdF9wb3MiLCJjb252ZXJ0VG9Xb3JsZFNwYWNlIiwicGxheVJlc291cmNlQ29sbGVjdCIsInNldE9wYWNpdHkiLCJ2YWx1ZSIsInVwZGF0ZUJ1ZmZMaXN0IiwiYnVmZiIsImJ1ZmZfY2ZnIiwiaWQiLCJjb25maWciLCJ0ZW1wX2dyb3VwX2xpc3QiLCJidWZmX2RhdGEiLCJsaXN0Iiwiam9pbl90eXBlIiwicHVzaCIsInRlbXBfYXJ5Iiwic29ydCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJidWZmX29iamVjdCIsImNyZWF0ZUJ1ZmZJdGVtIiwibGFiZWwiLCJub2RlIiwiYnVmZl9wYXRoIiwiZ2V0QnVmZlJlcyIsInBhdGgiLCJidWZmX2lkIiwicHVzaEJhY2tCdWZmUG9vbHMiLCJzcGxpY2UiLCJyZXNldEJ1ZmZQb3N0aW9uIiwiZWZmZWN0X3JlcyIsImFkZENvbXBvbmVudCIsImVuYWJsZWQiLCJnZXRCdWZmUG9vbHMiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJ3aWR0aCIsImhlaWdodCIsImljb25fbm9kZSIsImZvbnRfbm9kZSIsImNvbG9yIiwiQ29sb3IiLCJXSElURSIsImxpbmVIZWlnaHQiLCJmb250U2l6ZSIsImhvcml6b250YWxBbGlnbiIsIm1hY3JvIiwiVGV4dEFsaWdubWVudCIsIlJJR0hUIiwib3V0bGluZV9sYWJlbCIsIkxhYmVsT3V0bGluZSIsIkJMQUNLIiwiaGFkQnVmZiIsImdldFJvbGVEYXRhIiwiYWRkVGlwcyIsImJpZCIsInJlbW92ZVRpcHMiLCJyZXMiLCJjYWxsYmFjayIsInRlbXBfb2JqZWN0Iiwic2V0VGltZVNjYWxlIiwic3BlZWQiLCJza2VsZXRvbl90aW1lU2NhbGUiLCJzaG93VGFsa0J1YmJsZSIsIm1zZyIsImlzX2ZvcmNlIiwiZGVsZUVmZmVjdCIsImRlbGV0ZVJvbGUiLCJza2VsZXRvbkluZGV4IiwiZGVsUmVzIiwicmVsZWFzZVJlcyIsInB1c2hCYWNrUm9sZSIsImdldFJlc1BhdGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsY0FBYyxHQUFHQyxPQUFPLENBQUMsa0JBQUQsQ0FBNUI7O0FBQ0EsSUFBSUMsYUFBYSxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBM0I7O0FBQ0EsSUFBSUUsYUFBYSxHQUFHRixPQUFPLENBQUMsZUFBRCxDQUEzQjs7QUFDQSxJQUFJRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlJLFdBQVcsR0FBR0osT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUssWUFBWSxHQUFHTCxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFFQSxJQUFJTSxVQUFVLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3RCLGFBQVNDLFNBRGE7QUFHdEJDLEVBQUFBLFVBQVUsRUFBRTtBQUNSQyxJQUFBQSxZQUFZLEVBQUU7QUFDVixpQkFBUztBQURDO0FBRE4sR0FIVTtBQVN0QkMsRUFBQUEsSUFBSSxFQUFDLGdCQUFVO0FBQ1g7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LGFBQWEsQ0FBQzRDLFdBQWQsR0FBNEIwVSxNQUE1QixDQUFtQ0QsYUFBbkM7QUFDSCxLQXRCbUIsQ0F1QnBCOzs7QUFDQSxTQUFLLElBQUlsTyxHQUFULElBQWdCLEtBQUt6RixjQUFyQixFQUFxQztBQUNqQ3pELE1BQUFBLGFBQWEsQ0FBQzJDLFdBQWQsR0FBNEIyVSxVQUE1QixDQUF1Q3BPLEdBQXZDO0FBQ0g7O0FBRUQsU0FBS3pJLFlBQUwsR0FBb0IsRUFBcEIsQ0E1Qm9CLENBNkJwQjs7QUFDQSxTQUFLZ1MsY0FBTCxHQTlCb0IsQ0ErQnBCOztBQUNBNVMsSUFBQUEsY0FBYyxDQUFDOEMsV0FBZixHQUE2QjRVLFlBQTdCLENBQTBDLEtBQUt4VyxJQUEvQztBQUNILEdBenJDcUI7QUEyckN0QnlXLEVBQUFBLFVBQVUsRUFBRSxvQkFBU3JJLFdBQVQsRUFBc0I7QUFDOUIsV0FBTyxXQUFXLEtBQUtuTixVQUFoQixHQUE2QixHQUE3QixHQUFtQ21OLFdBQTFDO0FBQ0g7QUE3ckNxQixDQUFULENBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiJjmlpfljZXkvY3lrp7kvovlr7nosaFcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBCYXR0bGVSb2xlUG9vbCA9IHJlcXVpcmUoXCJiYXR0bGVfcm9sZV9wb29sXCIpO1xudmFyIEJhdHRsZVJlc1Bvb2wgPSByZXF1aXJlKFwiYmF0dGxlX3Jlc19wb29sXCIpO1xudmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKVxudmFyIEJhdHRsZUNvbnN0ID0gcmVxdWlyZShcImJhdHRsZV9jb25zdFwiKTtcbnZhciBCYXR0bGVFZmZlY3QgPSByZXF1aXJlKFwiYmF0dGxlX2VmZmVjdFwiKTtcblxudmFyIEJhdHRsZVJvbGUgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBza2Vsb25fY2FjaGU6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3RvcjpmdW5jdGlvbigpe1xuICAgICAgICAvLyDlgYfmiJjmlpfmiY3pnIDopoEs5b2T5YmN6L+Z5LiA5o6S5piv5ZCm5pyJ5YW25LuW5Y2V5L2NLOehruWumuWIneWni+S9jee9rlxuICAgICAgICBpZiAoYXJndW1lbnRzICYmIGFyZ3VtZW50cy5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHRoaXMuaXNfbmV4dF9vZmZzZXQgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5pc19uZXh0X29mZnNldCA9IGZhbHNlO1xuICAgICAgICB9ICAgICAgICAgXG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgIH0sXG4gICAgXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLnJvbGUgPSBudWxsO1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJiYXR0bGVcIiwgXCJiYXR0bGVfcmVhbF9yb2xlXCIpO1xuICAgICAgICB0aGlzLnJvbGVfZGF0YSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy50b3Bfb2ZmX3kgPSA0NTsgICAgICAgICAgICAgICAgICAgIC8vIOihgOadoeWQkeS4iueahOWBj+enu+mHj1xuXG4gICAgICAgIHRoaXMuaXNfcmVhbCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAvLyDmmK/lkKbmmK/nnJ/miJjmlpfljZXkvY1cbiAgICAgICAgdGhpcy5wbGF5X2VudGVyID0gZmFsc2U7ICAgICAgICAgICAgICAgIC8vIOaYr+WQpumcgOimgeaSreaUvui/m+WcuuWKqOeUu1xuICAgICAgICB0aGlzLnRhbGtfYmFjayA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8g5piv5ZCm6ZyA6KaB6YCa55+l5pKt5pS+5a6M5oiQXG5cbiAgICAgICAgdGhpcy5ncmlkX3BvcyA9IG51bGw7ICAgICAgICAgICAgICAgICAgIC8vIOagvOWtkOWdkOaghyxcbiAgICAgICAgdGhpcy5zY2VuZV9wb3MgPSBudWxsOyAgICAgICAgICAgICAgICAgIC8vIOWcuuaZr+WdkOagh1xuICAgICAgICB0aGlzLmlzX2ZyaWVuZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8g5piv5ZCm5piv5Y+L5pa5XG4gICAgICAgIHRoaXMub2JqX3R5cGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvLyDmmK/lt7Hmlrnov5jmmK/mlYzmlrlcbiAgICAgICAgLy8gdGhpcy5za2VsZXRvbkRhdGFfbGlzdCA9IHt9ICAgICAgICAgICAgIC8vIOWKqOS9nOWIl+ihqFxuICAgICAgICB0aGlzLm1vZGVsX2hlaWdodCA9IDEyMDsgICAgICAgICAgICAgICAgLy8g5qih5Z6L55qE6auY5bqmXG4gICAgICAgIHRoaXMubW9kZWxfd2lkdGggPSA2MDsgICAgICAgICAgICAgICAgIC8vIOaooeWei+eahOWuveW6pizmmoLml7blhYjov5nmoLcs5ZCO6Z2i5Yqg5o6l5Y+j6K6h566XXG5cbiAgICAgICAgdGhpcy5wb3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjeermeS9jVxuICAgICAgICB0aGlzLmdyb3VwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5YiG57uEXG5cbiAgICAgICAgdGhpcy5zcGluZV9uYW1lID0gXCJcIjsgICAgICAgICAgICAgICAgICAgLy8g5Y2V5L2N6LWE5rqQ5ZCN5a2XICxIMTAwMDDov5nnp41cbiAgICAgICAgdGhpcy5wbGF5X2FjdGlvbl9uYW1lID0gXCJcIjsgICAgICAgICAgICAgLy8g5b2T5YmN5Yqo5L2c5ZCN5a2XLFxuXG4gICAgICAgIHRoaXMuaXNfcm91bmQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAvLyDlvZPliY3mioDog73mkq3miqXmmK/lkKbmkq3mlL7lrozmiJBcbiAgICAgICAgdGhpcy5lZmZlY3RfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgIC8vIOaMguWcqOi6q+S4iueahOeJueaViOWIl+ihqFxuXG4gICAgICAgIHRoaXMuaHBfc2hvd19zdGF0dXMgPSB0cnVlOyAgICAgICAgICAgICAvLyDmmK/lkKbmmL7npLrmiJbogIXpmpDol4/ooYDmnaFcblxuICAgICAgICB0aGlzLmlzX2RpZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgLy8g6K+l5Y2V5L2N5piv5ZCm5piv5q275LqhID09IHJvbGVfZGF0YS5ocCA9PSAwXG4gICAgICAgIHRoaXMucm9sZV9jdXJfem9yZGVyID0gMDsgICAgICAgICAgICAgICAvLyDlvZPliY3ljZXkvY3mt7HluqblgLxcblxuICAgICAgICB0aGlzLmluX2h1cnRfYWN0ID0gZmFsc2U7ICAgICAgICAgICAgICAgLy8g5piv5ZCm5Zyo5pKt5pS+5Y+X5Ye75pWI5p6c5LitXG4gICAgICAgIHRoaXMubmVlZF9wbGF5X2RpZSA9IGZhbHNlOyAgICAgICAgICAgICAvLyDpnIDopoHmkq3mlL7mrbvkuqHliqjkvZxcblxuICAgICAgICB2YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLmhvb2tfbW9kZWwgPSBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0SG9va01vZGVsKCk7XG4gICAgICAgIHRoaXMuc2tpbGxfYWN0ID0gcmVxdWlyZShcInNraWxsX2FjdFwiKTtcblxuICAgICAgICB0aGlzLndhaXRfYWN0aW9uX25hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLndhaXRfcmVzX25hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLndhaXRfaXNfbG9vcCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy50aXBzX2xpc3QgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjemjmOWtl+iusOW9lVxuICAgICAgICB0aGlzLmJ1ZmZfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmNYnVmZuWIl+ihqOS/oeaBryzku6XllK/kuIBpZOS9nOS4umtleVxuICAgICAgICB0aGlzLmJ1ZmZfbGlzdF9kYXRhID0ge307ICAgICAgICAgICAgICAgLy8g5b2T5YmNYnVmZuS/oeaBryzku6VidWZmX2NvbmZpZy5pY29u5L2c5Li6a2V5XG4gICAgICAgIHRoaXMuYnVmZl9saXN0X2l0ZW0gPSB7fTsgICAgICAgICAgICAgICAvLyDlvZPliY1idWZm55qE5a6e5L6L5YyW5pi+56S65a+56LGhLOS7pWJ1ZmZfY29uZmlnLmljb27kvZzkuLprZXlcblxuICAgICAgICB0aGlzLmFjdGlvbl9jYWxsX2xpc3QgPSB7fTsgICAgICAgICAgICAgLy8g5Yi25Yqo5Yqo5L2c5Zue6LCDXG5cbiAgICAgICAgdGhpcy53YWl0X2FkZF9lZmZlY3RfbGlzdCA9IHt9OyAgICAgICAgIC8vIOW+hea3u+WKoOeJueaViFxuICAgICAgICB0aGlzLnJlc291cmNlc19saXN0ID0ge307ICAgICAgICAgICAgLy8g5LiL6L296LWE5rqQXG5cbiAgICAgICAgdGhpcy5kbWdfaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjeS8pOWus+aVsOWtl+eahOS4quaVsFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDliJvlu7rmiJjmlpfljZXkvY1cbiAgICAgKiBAcGFyYW0geyp9IHBhcmVudCDmiYDlnKjniLboioLngrlcbiAgICAgKiBAcGFyYW0geyp9IGJhdHRsZV9yb2xlX2RhdGEg5a+56LGh5Z+656GA5pWw5o2uLEJhdHRsZVJvbGVEYXRhXG4gICAgICogQHBhcmFtIHsqfSBwbGF5X2VudGVyIOaYr+WQpumcgOimgeaSreaUvui/m+WcuuWKqOeUu1xuICAgICAqIEBwYXJhbSB7Kn0gdGFsa19iYWNrIOaYr+WQpumcgOimgemAmuefpei/m+WcuuWujOaIkFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfcmVhbCDmmK/lkKbmmK/nnJ/lrp7miJjmlpdcbiAgICAgKiBAcGFyYW0geyp9IGZpbmlzaF9jYiDliJvlu7rlrozmiJDkuYvlkI7nmoTlm57osINcbiAgICAgKi9cbiAgICBjcmVhdGVSb2xlOmZ1bmN0aW9uKHBhcmVudCwgYmF0dGxlX3JvbGVfZGF0YSwgcGxheV9lbnRlciwgdGFsa19iYWNrLCBpc19yZWFsLCBmaW5pc2hfY2Ipe1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5yb2xlX2RhdGEgPSBiYXR0bGVfcm9sZV9kYXRhO1xuICAgICAgICAvLyB0aGlzLnBsYXlfZW50ZXIgPSBwbGF5X2VudGVyIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlfZW50ZXIgPSBmYWxzZTsgICAgICAgIFxuICAgICAgICB0aGlzLmZpbmlzaF9jYiA9IGZpbmlzaF9jYjtcbiAgICAgICAgaWYgKCFpc19yZWFsKVxuICAgICAgICAgICAgdGhpcy5wbGF5X2VudGVyID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50YWxrX2JhY2sgPSB0YWxrX2JhY2sgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaXNfcmVhbCA9IGlzX3JlYWwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMucG9zID0gYmF0dGxlX3JvbGVfZGF0YS5wb3M7XG4gICAgICAgIHRoaXMuZ3JvdXAgPSBiYXR0bGVfcm9sZV9kYXRhLmdyb3VwO1xuXG4gICAgICAgIGxldCBwb29scyA9IEJhdHRsZVJvbGVQb29sLmdldEluc3RhbmNlKCkuZ2V0UmVhbFBvb2xzKClcbiAgICAgICAgbGV0IHJvbGUgPSBudWxsO1xuICAgICAgICBpZiAocG9vbHMuc2l6ZSgpID4gMCl7XG4gICAgICAgICAgICByb2xlID0gcG9vbHMuZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQocm9sZSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXModGhpcy5wcmVmYWJQYXRoLCAoZnVuY3Rpb24ocmVzX29iamVjdCl7XG4gICAgICAgICAgICAgICAgcm9sZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSb290V25kKHJvbGUpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8g5Yid5aeL5YyW54q25oCBXG4gICAgcmVzZXRJbml0U3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNrZWxldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5Yib5bu65a+56LGhXG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgbGV0IHZhbGlkICA9IHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmlzVmFsaWQgJiYgcm9sZSAmJiByb2xlLmlzVmFsaWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGlmKCF2YWxpZClyZXR1cm47XG4gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkQ2hpbGQodGhpcy5yb2xlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVfbm9kZSA9IHRoaXMucm9sZS5nZXRDaGlsZEJ5TmFtZShcInJvbGVfbm9kZVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qih5Z6L6IqC54K5XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5yb2xlX25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJjb250YWluZXJcIik7ICAgICAgICAgICAgICAgICAgICAvLyBzcGluZeiKgueCuVxuICAgICAgICB0aGlzLnRvcF9jb250YWluZXIgPSB0aGlzLnJvbGVfbm9kZS5nZXRDaGlsZEJ5TmFtZShcInRvcF9jb250YWluZXJcIik7ICAgICAgICAgICAgLy8g6KGA5p2h6YOo5YiGXG4gICAgICAgIHRoaXMuc2hhZG93ID0gdGhpcy5yb2xlX25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJzaGFkb3dcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDohJrlupXpmLTlvbFcblxuICAgICAgICB0aGlzLnByb2dyZXNzID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaHBcIikuZ2V0Q29tcG9uZW50KGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgdGhpcy5sZXZlbCA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImxldmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuY2FtcCA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNhbXBcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIgPSB0aGlzLnRvcF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidWZmX2NvbnRhaW5lclwiKTsgICAgICAvLyBidWZm55qE5Li76IqC54K5XG5cbiAgICAgICAgdGhpcy5oYWxsb3dfbm9kZSA9IHRoaXMucm9sZS5nZXRDaGlsZEJ5TmFtZShcImhhbGxvd19ub2RlXCIpOyAgICAgICAgICAgICAvLyDnpZ7lmajoioLngrlcbiAgICAgICAgdGhpcy5yb3VuZF9wcm9ncmVzcyA9IHRoaXMuaGFsbG93X25vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJwcm9ncmVzc1wiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpOyAvLyDlm57lkIjov5vluqbmnaFcblxuICAgICAgICAvLyDnpZ7lmajlkozmqKHlnovljLrliIZcbiAgICAgICAgaWYgKHRoaXMucm9sZV9kYXRhLm9iamVjdF90eXBlID09IEJhdHRsZUNvbnN0LlVuaXRfVHlwZS5IYWxsb3dzKXtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUgPSB0aGlzLmhhbGxvd19ub2RlLmdldENoaWxkQnlOYW1lKFwic3BpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uID0gdGhpcy5zcGluZS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAgICAgdGhpcy5yb2xlX25vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd19ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyDmm7TmlrDnpZ7lmahcbiAgICAgICAgICAgIHRoaXMuc2V0SGFsbG93c1JvdW5kKHRoaXMucm9sZV9kYXRhLmhhbGxvd3NfdmFsLCB0aGlzLnJvbGVfZGF0YS5oYWxsb3dzX21heCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zcGluZSA9IHRoaXMuY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwic3BpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uID0gdGhpcy5zcGluZS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAgICAgdGhpcy5lZmZlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImVmZmVjdFwiKTsgICAgICAgICAgLy8gMTDmmJ/lhYnnjq/nibnmlYhcblxuICAgICAgICAgICAgdGhpcy5oYWxsb3dfbm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0aGlzLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgICAgICAgIC8vIOecn+WunuaImOaWl+aJjemcgOimgeaYvuekuui/meS6m+S4nOilv1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNfcmVhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV2ZWwuc3RyaW5nID0gdGhpcy5yb2xlX2RhdGEubGV2O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zcGluZV96b3JkZXIgPSB0aGlzLnNwaW5lLnpJbmRleDtcblxuICAgICAgICAvLyDorr7nva7lvZPliY3nmoTmqKHlnovpgJ/njodcbiAgICAgICAgaWYgKHRoaXMuc2tlbGV0b25fdGltZV9zY2FsZSl7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLnRpbWVTY2FsZSA9IHRoaXMuc2tlbGV0b25fdGltZV9zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuc2V0RWZmZWN0U2NhbGUodGhpcy5za2VsZXRvbl90aW1lX3NjYWxlKTtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25fdGltZV9zY2FsZSA9IG51bGw7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdmFyIHRpbWVTY2FsZSA9IHRoaXMubW9kZWwuZ2V0VGltZVNjYWxlKCk7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcbiAgICAgICAgICAgIHRoaXMuc2V0RWZmZWN0U2NhbGUodGltZVNjYWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOebkeWQrOS6i+S7tlxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoKTtcbiAgICAgICAgLy8g5Yid5aeL5YyWXG4gICAgICAgIHRoaXMucmVzZXRJbml0U3RhdHVzKCk7XG4gICAgICAgIC8vIOiuvue9ruW9k+WJjeS9jee9rlxuICAgICAgICB0aGlzLnNldEdyaWRQb3MoKTtcbiAgICAgICAgLy8g5a6e5L6L5YyW5qih5Z6LXG4gICAgICAgIHRoaXMuaW5zdGFudE1vZGVsUm9sZSgpO1xuICAgICAgICAvLyDorr7nva7msJTooYBcbiAgICAgICAgdGhpcy5zZXRIUCgwKTtcbiAgICAgICAgLy8g55yL55yL5pyJ5rKh5pyJ5b6F5re75Yqg55qE54m55pWIXG4gICAgICAgIHRoaXMuY2hlY2tFZmZlY3ROZWVkQWRkKCk7XG4gICAgfSxcblxuICAgIC8vIOiuvue9rjEw5pif54m55pWI55qE5pKt5pS+6YCf546HXG4gICAgc2V0RWZmZWN0U2NhbGU6ZnVuY3Rpb24odGltZV9zY2FsZSl7XG4gICAgICAgIGlmICh0aGlzLmVmZmVjdF9za2VsZXRvbil7XG4gICAgICAgICAgICAvLyB0aGlzLmVmZmVjdF9za2VsZXRvbi50aW1lU2NhbGUgPSB0aW1lX3NjYWxlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRDb21wbGV0ZUxpc3RlbmVyKChmdW5jdGlvbiAodHJhY2tFbnRyeSwgbG9vcENvdW50KSB7XG4gICAgICAgICAgICB2YXIgYW5pbWF0aW9uTmFtZSA9IHRyYWNrRW50cnkuYW5pbWF0aW9uID8gdHJhY2tFbnRyeS5hbmltYXRpb24ubmFtZSA6IFwiXCI7XG4gICAgICAgICAgICB2YXIgYWN0aW9uX29iamVjdCA9IHRoaXMuYWN0aW9uX2NhbGxfbGlzdFthbmltYXRpb25OYW1lXTtcbiAgICAgICAgICAgIGlmIChhY3Rpb25fb2JqZWN0ICYmIGFjdGlvbl9vYmplY3Qub3Zlcil7XG4gICAgICAgICAgICAgICAgYWN0aW9uX29iamVjdC5vdmVyKGFuaW1hdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uX2NhbGxfbGlzdFthbmltYXRpb25OYW1lXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRFdmVudExpc3RlbmVyKChmdW5jdGlvbiAodHJhY2tFbnRyeSwgZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBhbmltYXRpb25OYW1lID0gdHJhY2tFbnRyeS5hbmltYXRpb24gPyB0cmFja0VudHJ5LmFuaW1hdGlvbi5uYW1lIDogXCJcIjtcbiAgICAgICAgICAgIHZhciBhY3Rpb25fb2JqZWN0ID0gdGhpcy5hY3Rpb25fY2FsbF9saXN0W2FuaW1hdGlvbk5hbWVdO1xuICAgICAgICAgICAgaWYgKGFjdGlvbl9vYmplY3QgJiYgYWN0aW9uX29iamVjdC5ldmVudCl7XG4gICAgICAgICAgICAgICAgYWN0aW9uX29iamVjdC5ldmVudChldmVudC5kYXRhLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICAvLyDorr7nva7op5LoibLmoLzlrZDkvY3nva4s6L+Z5Liq5piv6KaB56Gu5a6a56uZ5L2N5piv5Zyo5bem6L656L+Y5piv5Zyo5Y+z6L65XG4gICAgc2V0R3JpZFBvczpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgaXNfZnJpZW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfZGF0YSA9PSBudWxsKXsgcmV0dXJuOyB9XG4gICAgICAgIGlmICh0aGlzLnJvbGUgPT0gbnVsbCl7IHJldHVybjsgfVxuICAgICAgICAvLyDnq5nkvY3opoHljLrliIbnnJ/lgYfmiJjmlpdcbiAgICAgICAgaWYgKHRoaXMuaXNfcmVhbCA9PSB0cnVlKXtcbiAgICAgICAgICAgIGlzX2ZyaWVuZCA9IHRoaXMubW9kZWwuaXNGcmllbmQodGhpcy5yb2xlX2RhdGEuZ3JvdXApO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlzX2ZyaWVuZCA9ICh0aGlzLnJvbGVfZGF0YS5ncm91cCA9PSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZihpc19mcmllbmQpe1xuICAgICAgICAgICAgdGhpcy5vYmpfdHlwZSA9IEJhdHRsZUNvbnN0LkJhdHRsZV9UeXBlX0NvbmYuVFlQRV9ST0xFXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5vYmpfdHlwZSA9IEJhdHRsZUNvbnN0LkJhdHRsZV9UeXBlX0NvbmYuVFlQRV9FTkVNWVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNfZnJpZW5kID0gaXNfZnJpZW5kO1xuXG4gICAgICAgIC8vIOmdnuW3seaWueeahOmcgOimgeWPjei9rOWkhOeQhlxuICAgICAgICBpZiAodGhpcy5pc19mcmllbmQgPT0gZmFsc2Upe1xuICAgICAgICAgICAgdGhpcy5zcGluZS5zY2FsZVggPSAtMTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLnNwaW5lLnNjYWxlWCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8g6I635Y+W5b2T5YmN5qC85a2Q56uZ5L2NXG4gICAgICAgIHRoaXMuZ3JpZF9wb3MgPSB0aGlzLnNraWxsX2FjdC5uZXdQb3MyR2lyZCh0aGlzLnJvbGVfZGF0YS5wb3MsIGlzX2ZyaWVuZCwgdGhpcy5yb2xlX2RhdGEuZ3JvdXAsIHRoaXMuaXNfcmVhbCk7XG4gICAgICAgIHRoaXMuc2NlbmVfcG9zID0gdGhpcy5za2lsbF9hY3QuZ3JpZFBvc1RvU2NyZWVuUG9zKHRoaXMuZ3JpZF9wb3MpO1xuICAgICAgICB0aGlzLnJvbGUuc2V0UG9zaXRpb24odGhpcy5zY2VuZV9wb3MpO1xuICAgICAgICB0aGlzLnJlc2V0Wk9yZGVyKCk7XG4gICAgfSxcblxuICAgIC8vIOiuvue9ruWdkOagh1xuICAgIHNldFNjZW5lUG9zOmZ1bmN0aW9uKHBvcyl7XG4gICAgICAgIHRoaXMucm9sZS5zZXRQb3NpdGlvbihwb3MpO1xuICAgIH0sXG5cbiAgICAvLyDmmK/lkKbpnIDopoHlj43ovazliqvoibIs5Zug5Li65Y+v6IO95a2Y5Zyo6IOM5Yi65oqA6IO9XG4gICAgcmV2ZXJzZTpmdW5jdGlvbihyZXYpe1xuICAgICAgICByZXYgPSByZXYgfHwgLTE7XG4gICAgICAgIGlmICh0aGlzLnJldl92YWx1ZSA9PSByZXYpIHJldHVybjtcbiAgICAgICAgdGhpcy5yZXZfdmFsdWUgPSByZXY7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zcGluZSl7XG4gICAgICAgICAgICB0aGlzLnNwaW5lLnNjYWxlWCA9IHJldjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlrp7kvovljJbop5LoibLmqKHlnovmlbDmja5cbiAgICBpbnN0YW50TW9kZWxSb2xlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfZGF0YSA9PSBudWxsKXsgcmV0dXJuOyB9XG4gICAgICAgIC8vIOWOu+mFjee9ruihqOaVsOaNrlxuICAgICAgICB2YXIgY2FtcF90eXBlID0gMDsgICAgICAgICAgLy8g5b2T5YmN6Zi16JClXG4gICAgICAgIHZhciBzcGluZV9uYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGVuY2lyY2xlX2VmZmVjdCA9IFwiXCI7ICAgLy8gMTDmmJ/oi7Hpm4TnibnmlYhcbiAgICAgICAgdmFyIGZhc2hpb24gPSAwOyAgICAgICAgICAgIC8vIOaXtuijheaVsOaNrlxuICAgICAgICBpZiAodGhpcy5yb2xlX2RhdGEub2JqZWN0X3R5cGUgPT0gQmF0dGxlQ29uc3QuVW5pdF9UeXBlLkhlcm8pe1xuICAgICAgICAgICAgdmFyIGtleSA9IFV0aWxzLmdldE5vcktleSh0aGlzLnJvbGVfZGF0YS5vYmplY3RfYmlkLCB0aGlzLnJvbGVfZGF0YS5zdGFyKTtcbiAgICAgICAgICAgIHZhciBjb25maWdfZGF0YSA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwga2V5KTtcbiAgICAgICAgICAgIGlmIChjb25maWdfZGF0YSl7XG4gICAgICAgICAgICAgICAgc3BpbmVfbmFtZSA9IGNvbmZpZ19kYXRhLnJlc19pZDtcbiAgICAgICAgICAgICAgICBlbmNpcmNsZV9lZmZlY3QgPSBjb25maWdfZGF0YS5maWdodF9lZmZlY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmFzZV9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW3RoaXMucm9sZV9kYXRhLm9iamVjdF9iaWRdO1xuICAgICAgICAgICAgaWYoYmFzZV9jb25maWcpe1xuICAgICAgICAgICAgICAgIGNhbXBfdHlwZSA9IGJhc2VfY29uZmlnLmNhbXBfdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYodGhpcy5yb2xlX2RhdGEub2JqZWN0X3R5cGUgPT0gQmF0dGxlQ29uc3QuVW5pdF9UeXBlLkhhbGxvd3Mpe1xuICAgICAgICAgICAgdmFyIGNvbmZpZ19kYXRhID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2Jhc2VbdGhpcy5yb2xlX2RhdGEub2JqZWN0X2JpZF1cbiAgICAgICAgICAgIGlmIChjb25maWdfZGF0YSl7XG4gICAgICAgICAgICAgICAgc3BpbmVfbmFtZSA9IGNvbmZpZ19kYXRhLmNfcmVzX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBjb25maWdfZGF0YSA9IFV0aWxzLmdldFVuaXRDb25maWcodGhpcy5yb2xlX2RhdGEub2JqZWN0X2JpZCk7XG4gICAgICAgICAgICBpZihjb25maWdfZGF0YSl7XG4gICAgICAgICAgICAgICAgc3BpbmVfbmFtZSA9IGNvbmZpZ19kYXRhLmJvZHlfaWQ7XG4gICAgICAgICAgICAgICAgY2FtcF90eXBlID0gY29uZmlnX2RhdGEuY2FtcF90eXBlO1xuICAgICAgICAgICAgICAgIGVuY2lyY2xlX2VmZmVjdCA9IGNvbmZpZ19kYXRhLmZpZ2h0X2VmZmVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDnnJ/mmK/miJjmlpflsLHku47mnI3liqHnq6/pgqPovrnljrss5ZCm5YiZ5LuOYmF0dGxlbG9vcDLph4zpnaLljrvmlbDlgLxcbiAgICAgICAgaWYodGhpcy5pc19yZWFsID09IHRydWUpe1xuICAgICAgICAgICAgZmFzaGlvbiA9IHRoaXMuZ2V0QmF0dGxlUm9sZUV4dGVuZERhdGEoNSk7IC8vIOaXtuijheaVsOaNrlxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGZhc2hpb24gPSB0aGlzLnJvbGVfZGF0YS5mYXNoaW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9kYXRhLmZhY2VfaWQgPSB0aGlzLnJvbGVfZGF0YS5vYmplY3RfYmlkO1xuICAgICAgICBpZihmYXNoaW9uICE9IDApe1xuICAgICAgICAgICAgbGV0IHNraW5fY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfc2tpbl9kYXRhLmRhdGFfc2tpbl9pbmZvW2Zhc2hpb25dO1xuICAgICAgICAgICAgaWYoc2tpbl9jb25maWcpe1xuICAgICAgICAgICAgICAgIHNwaW5lX25hbWUgPSBza2luX2NvbmZpZy5yZXNfaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX2RhdGEuZmFjZV9pZCA9IHNraW5fY29uZmlnLmhlYWRfaWQ7XG4gICAgICAgICAgICAgICAgaWYoc2tpbl9jb25maWcuZmlnaHRfZWZmZWN0ICE9IFwiXCIgJiYgZW5jaXJjbGVfZWZmZWN0ICE9IFwiXCIpe1xuICAgICAgICAgICAgICAgICAgICBlbmNpcmNsZV9lZmZlY3QgPSBza2luX2NvbmZpZy5maWdodF9lZmZlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwaW5lX25hbWUgPT0gXCJcIil7cmV0dXJuO31cbiAgICAgICAgdGhpcy5zcGluZV9uYW1lID0gc3BpbmVfbmFtZTtcblxuICAgICAgICAvLyDorr7nva7pmLXokKVcbiAgICAgICAgaWYgKHRoaXMuaXNfcmVhbCAmJiB0aGlzLnJvbGVfZGF0YS5vYmplY3RfdHlwZSAhPSBCYXR0bGVDb25zdC5Vbml0X1R5cGUuSGFsbG93cyl7XG4gICAgICAgICAgICB0aGlzLnNldENhbXBJY29uKGNhbXBfdHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDorr7nva4xMOaYn+WFieeOr+eJueaViFxuICAgICAgICBpZiAoZW5jaXJjbGVfZWZmZWN0ICE9IFwiXCIpe1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVFbmNpcmNsZUVmZmVjdChlbmNpcmNsZV9lZmZlY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6K6+572u5qih5Z6L55qE6auY5bqmXG4gICAgICAgIHZhciBjb25maWdfbW9kZWwgPSBDb25maWcuc2tpbGxfZGF0YS5kYXRhX2dldF9tb2RlbF9kYXRhW3NwaW5lX25hbWVdO1xuICAgICAgICBpZiAoY29uZmlnX21vZGVsKXtcbiAgICAgICAgICAgIHRoaXMubW9kZWxfaGVpZ2h0ID0gY29uZmlnX21vZGVsLm1vZGVsX2hlaWdodCA7IC8vIOaooeWei+eahOmrmOW6puWGjeS4iua1rjIw5Liq5YOP57SgXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3BfY29udGFpbmVyLnkgPSB0aGlzLm1vZGVsX2hlaWdodCArIHRoaXMudG9wX29mZl95O1xuICAgICAgICAvL+aYr+WQpumcgOimgeaSreaUvui/m+WcuuWKqOS9nFxuICAgICAgICBpZiAodGhpcy5wbGF5X2VudGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFbnRlckFjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNfcmVhbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5kb1N0YW5kKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmUodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgdGhpcy5kb1J1bihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzX3JlYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluaXNoX2NiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoX2NiKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfZGF0YS5ncm91cCA9PSBCYXR0bGVDb25zdC5Hcm91cF9UeXBlLkVuZW1neSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlVbnJlYWxFbnRlckFjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluaMh+Wumuexu+Wei+eahOmineWkluaVsOaNrlxuICAgIGdldEJhdHRsZVJvbGVFeHRlbmREYXRhOmZ1bmN0aW9uKGtleSl7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfZGF0YSA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucm9sZV9kYXRhLmV4dHJhX2RhdGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5yb2xlX2RhdGEuZXh0cmFfZGF0YVtpbmRleF07XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5leHRyYV9rZXkgPT0ga2V5KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5leHRyYV92YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u56We5Zmo5Zue5ZCI6L+b5bqm5p2hXG4gICAgc2V0SGFsbG93c1JvdW5kOmZ1bmN0aW9uKHZhbCwgbWF4KXtcbiAgICAgICAgaWYodGhpcy5yb2xlX2RhdGEgPT0gbnVsbCB8fCB0aGlzLnJvbGVfZGF0YS5vYmplY3RfdHlwZSAhPSBCYXR0bGVDb25zdC5Vbml0X1R5cGUuSGFsbG93cykgcmV0dXJuO1xuICAgICAgICBpZih2YWwgPT0gMCB8fCB2YWwgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnJvdW5kX3Byb2dyZXNzLnByb2dyZXNzID0gMDtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAobWF4ID09IDAgfHwgbWF4ID09IG51bGwpe1xuICAgICAgICAgICAgICAgIG1heCA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGVyID0gTWF0aC5taW4oMSwgTWF0aC5tYXgodmFsIC8gbWF4KSlcbiAgICAgICAgICAgIHRoaXMucm91bmRfcHJvZ3Jlc3MucHJvZ3Jlc3MgPSBwZXI7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5piv5ZCm6ZyA6KaB5pKt5pS+6L+b5Zy65Yqo5L2cXG4gICAgc2hvd0VudGVyQWN0aW9uOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMucm9sZV9kYXRhICYmIHRoaXMucm9sZV9kYXRhLm9iamVjdF90eXBlID09IEJhdHRsZUNvbnN0LlVuaXRfVHlwZS5IYWxsb3dzKXsgIC8vIOelnuWZqOS4jemcgOimgei1sOS7u+S9leWkhOeQhlxuICAgICAgICAgICAgdGhpcy5kb1N0YW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGltZSA9IDAuNTtcbiAgICAgICAgdmFyIHN0YXJ0X3ggPSB0aGlzLnNjZW5lX3Bvcy54XG4gICAgICAgIHZhciBvZmZzZXRfeCA9IFNDUkVFTl9XSURUSCAqIDAuMjVcbiAgICAgICAgdmFyIG1vdmVfYnkgPSBudWxsXG4gICAgICAgIGlmICh0aGlzLmlzX2ZyaWVuZCA9PSB0cnVlKXtcbiAgICAgICAgICAgIHN0YXJ0X3ggPSBzdGFydF94IC0gb2Zmc2V0X3hcbiAgICAgICAgICAgIG1vdmVfYnkgPSBjYy5tb3ZlVG8odGltZSwgdGhpcy5zY2VuZV9wb3MueCwgdGhpcy5zY2VuZV9wb3MueSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0X3ggPSBzdGFydF94ICsgb2Zmc2V0X3hcbiAgICAgICAgICAgIG1vdmVfYnkgPSBjYy5tb3ZlVG8odGltZSwgdGhpcy5zY2VuZV9wb3MueCwgdGhpcy5zY2VuZV9wb3MueSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZG9SdW4oKTtcbiAgICAgICAgdGhpcy5yb2xlLnggPSBzdGFydF94O1xuICAgICAgICB0aGlzLnJvbGUucnVuQWN0aW9uKGNjLnNlcXVlbmNlKG1vdmVfYnksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZG9TdGFuZCgpO1xuICAgICAgICB9LmJpbmQodGhpcykpKSlcbiAgICB9LFxuXG4gICAgLy8g6K6+572u6Zi16JClXG4gICAgc2V0Q2FtcEljb246ZnVuY3Rpb24oY2FtcF90eXBlKXtcbiAgICAgICAgdmFyIGNhbXBfaWNvbiA9IFBhdGhUb29sLmdldEJhdHRsZUNhbXBJY29uQnlUeXBlKGNhbXBfdHlwZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhjYW1wX2ljb24sIGZ1bmN0aW9uIChpY29uLCByZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICBpY29uLnNwcml0ZUZyYW1lID0gcmVzX29iamVjdDtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCB0aGlzLmNhbXApXG4gICAgfSxcblxuICAgIC8vIOWBh+aImOaWl+WcsOaWueeahOi/m+WcuuaViOaenFxuICAgIHBsYXlVbnJlYWxFbnRlckFjdGlvbjpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5yb2xlID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5jbGVhck5leHRBY3RUaW1lcigpO1xuICAgICAgICB0aGlzLmNsZWFyTmV4dENhbGxUaW1lcigpO1xuXG4gICAgICAgIHZhciBzdGFydF9wb2ludF94ID0gU0NSRUVOX1dJRFRIICogMS4xO1xuICAgICAgICBpZiAodGhpcy5pc19uZXh0X29mZnNldCl7XG4gICAgICAgICAgICBzdGFydF9wb2ludF94ID0gU0NSRUVOX1dJRFRIICogMS4yO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZhciB0aW1lID0gMjtcbiAgICAgICAgLy8gdmFyIGZpbmFsX3BvaW50X3ggPSB0aGlzLnNraWxsX2FjdC5ncmlkUG9zVG9TY3JlZW5Qb3MoTm9ybWFsUG9zR3JpZFJpZ2h0WzBdKS54O1xuICAgICAgICAvLyB2YXIgb2Zmc2V0X3ggPSBmaW5hbF9wb2ludF94IC0gc3RhcnRfcG9pbnRfeDtcbiAgICAgICAgdGhpcy5yb2xlLnggPSBzdGFydF9wb2ludF94O1xuXG4gICAgICAgIC8vIOS4i+S4gOazouaAqlxuICAgICAgICB2YXIgbmV4dF90aW1lID0gMjgwXG4gICAgICAgIHZhciBjYWxsX2JhY2sgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgLy8gdGhpcy5ob29rX21vZGVsLnVwZGF0ZU5leHRSb3VuZERhdGEoKTtcbiAgICAgICAgICAgIC8vIHRoaXMuY2xlYXJOZXh0Q2FsbFRpbWVyKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMubmV4dF9jYWxsX21vbl90aW1lciA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMubmV4dF9jYWxsX21vbl90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGNhbGxfYmFjaygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCBuZXh0X3RpbWUsIDEpXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlvIDlp4vmkq3mlL7mlLvlh7vliqjkvZxcbiAgICAgICAgLy8gdmFyIHdhaXRfdGltZSA9IDE1OTAgLSB0aGlzLmhvb2tfbW9kZWwuZ2V0RmluYWxNb3ZlVGltZSgpO1xuICAgICAgICAvLyB2YXIgYXRrX2JhY2sgPSBmdW5jdGlvbigpe1xuICAgICAgICAvLyAgICAgdmFyIHNraWxsX3BsYXlzX2RhdGEgPSBCYXR0bGVMb29wLnBsYXkodGhpcy5wb3MpO1xuICAgICAgICAvLyAgICAgaWYgKHNraWxsX3BsYXlzX2RhdGEpe1xuICAgICAgICAvLyAgICAgICAgIHZhciBza2lsbF9wbGF5c19saXN0ID0gdGhpcy5ob29rX21vZGVsLmdldFNraWxsUGxheURhdGEoc2tpbGxfcGxheXNfZGF0YS5hY3Rvcik7XG4gICAgICAgIC8vICAgICAgICAgaWYgKHNraWxsX3BsYXlzX2xpc3QgPT0gbnVsbCB8fCBza2lsbF9wbGF5c19saXN0Lmxlbmd0aCA9PSAwKXtcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5ob29rX21vZGVsLmhhbmRsZVNraWxsUGxheURhdGEoc2tpbGxfcGxheXNfZGF0YSwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgLy8gICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ob29rX21vZGVsLnVwZGF0ZUFjdG9yUGxheXNMaXN0KHNraWxsX3BsYXlzX2RhdGEpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdGhpcy5jbGVhck5leHRBY3RUaW1lcigpO1xuICAgICAgICAvLyB9LmJpbmQodGhpcyk7XG4gICAgICAgIC8vIGlmICh0aGlzLm5leHRfYWNrX21vbl90aW1lciA9PSBudWxsKSB7XG4gICAgICAgIC8vICAgICB0aGlzLm5leHRfYWNrX21vbl90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICAgICAgICAgYXRrX2JhY2soKTtcbiAgICAgICAgLy8gICAgIH0uYmluZCh0aGlzKSwgd2FpdF90aW1lLCAxKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8g56e75YqoXG4gICAgICAgIC8vIHZhciBtb3ZlX2J5ID0gY2MubW92ZUJ5KHRpbWUsIG9mZnNldF94LCAwKTtcbiAgICAgICAgLy8gdGhpcy5yb2xlLnJ1bkFjdGlvbihtb3ZlX2J5KTtcblxuXG4gICAgICAgIHZhciBza2lsbF9wbGF5c19kYXRhID0gQmF0dGxlTG9vcC5wbGF5KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKHNraWxsX3BsYXlzX2RhdGEpIHtcbiAgICAgICAgICAgIGNjLmxvZyhcIuW8gOWni+WHhuWkh+WBh+aImOaWl1wiKTtcbiAgICAgICAgICAgIHZhciBza2lsbF9wbGF5c19saXN0ID0gdGhpcy5ob29rX21vZGVsLmdldFNraWxsUGxheURhdGEoc2tpbGxfcGxheXNfZGF0YS5hY3Rvcik7XG4gICAgICAgICAgICBpZiAoc2tpbGxfcGxheXNfbGlzdCA9PSBudWxsIHx8IHNraWxsX3BsYXlzX2xpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tfbW9kZWwuaGFuZGxlU2tpbGxQbGF5RGF0YShza2lsbF9wbGF5c19kYXRhLCBmdW5jdGlvbihzdGFydF9jYikge1xuICAgICAgICAgICAgICAgICAgICBjYy5sb2coXCLlvIDlp4vov5vooYzlgYfmiJjmlpcwXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdF90aW1lID0gMTU5MCAtIHRoaXMuaG9va19tb2RlbC5nZXRGaW5hbE1vdmVUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZXh0X2Fja19tb25fdGltZXIpIHsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0X2Fja19tb25fdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvZyhcIuWHhuWkh+aUu+WHuzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJOZXh0QWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgd2FpdF90aW1lLCAxKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSAyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmluYWxfcG9pbnRfeCA9IHRoaXMuc2tpbGxfYWN0LmdyaWRQb3NUb1NjcmVlblBvcyhOb3JtYWxQb3NHcmlkUmlnaHRbMF0pLng7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXRfeCA9IGZpbmFsX3BvaW50X3ggLSBzdGFydF9wb2ludF94O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZV9ieSA9IGNjLm1vdmVCeSh0aW1lLCBvZmZzZXRfeCwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzX3JlYWwgJiYgdGhpcy5yb2xlX2RhdGEuZ3JvdXAgPT0gQmF0dGxlQ29uc3QuR3JvdXBfVHlwZS5FbmVtZ3kpeyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGUucnVuQWN0aW9uKG1vdmVfYnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9va19tb2RlbC51cGRhdGVBY3RvclBsYXlzTGlzdChza2lsbF9wbGF5c19kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmuIXmpZrkuIvkuIDkuKrmlLvlh7vnmoTlrprml7blmahcbiAgICBjbGVhck5leHRBY3RUaW1lcjpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5uZXh0X2Fja19tb25fdGltZXIpe1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMubmV4dF9hY2tfbW9uX3RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMubmV4dF9hY2tfbW9uX3RpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmuIXpmaTkuIvkuIDms6LmgKrnianliLfmlrDlrprml7blmahcbiAgICBjbGVhck5leHRDYWxsVGltZXI6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMubmV4dF9jYWxsX21vbl90aW1lcikge1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMubmV4dF9jYWxsX21vbl90aW1lcik7XG4gICAgICAgICAgICB0aGlzLm5leHRfY2FsbF9tb25fdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRvUnVuOmZ1bmN0aW9uKGNiKXtcbiAgICAgICAgdGhpcy5wbGF5QWN0aW9uT25jZShQbGF5ZXJBY3Rpb24ucnVuLCBudWxsLCBudWxsLCBudWxsLCBjYilcbiAgICB9LFxuXG4gICAgZG9TdGFuZDpmdW5jdGlvbihmaW5pc2hfY2Ipe1xuICAgICAgICB0aGlzLnBsYXlBY3Rpb25PbmNlKFBsYXllckFjdGlvbi5iYXR0bGVfc3RhbmQsIG51bGwsIG51bGwsIG51bGwsIGZpbmlzaF9jYik7XG4gICAgICAgIGlmICh0aGlzLnRhbGtfYmFjayA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMudGFsa19iYWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmFkZFJlYWR5U3VtKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6K6+572u5Yqo5L2c5Ly06ZqP5LqL5Lu25ZKM5Yqo5L2c57uT5p2f5LqL5Lu25Zue6LCDXG4gICAgc2V0QW5pbWF0aW9uQWN0aW9uRnVuYzpmdW5jdGlvbihldmVudF9mdW5jLCBvdmVyX2Z1bmMsIGFjdGlvbl9uYW1lKXtcbiAgICAgICAgaWYgKGFjdGlvbl9uYW1lID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYodGhpcy5hY3Rpb25fY2FsbF9saXN0W2FjdGlvbl9uYW1lXSA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uX2NhbGxfbGlzdFthY3Rpb25fbmFtZV0gPSB7b3ZlcjpudWxsLCBldmVudDpudWxsfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGlvbl9jYWxsX2xpc3RbYWN0aW9uX25hbWVdLm92ZXIgPSBvdmVyX2Z1bmM7XG4gICAgICAgIHRoaXMuYWN0aW9uX2NhbGxfbGlzdFthY3Rpb25fbmFtZV0uZXZlbnQgPSBldmVudF9mdW5jO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDliIfmjaLliqjkvZws55Sx5LqO5aSE5LqO5b6F5py655qE5pe25YCZLOWPr+iDvemprOS4iuWIh+aNouWIsOWFtuS7luWKqOS9nCzmiYDku6Xov5nph4zopoHnnIvnnIvopoHkuI3opoHlpITnkIbmiJDlvoXmnLrmkq3mlL7lrozmiJDkuYvlkI5cbiAgICAgKiBAcGFyYW0geyp9IGFjdGlvbl9uYW1lIOebruagh+WKqOS9nOWQjeWtl1xuICAgICAqIEBwYXJhbSB7Kn0gcmVzX25hbWUg55uu5qCH6LWE5rqQ5ZCN5a2XXG4gICAgICovXG4gICAgcGxheUFjdGlvbk9uY2U6ZnVuY3Rpb24oYWN0aW9uX25hbWUsIHJlc19uYW1lLCBpc19sb29wLCBmb3JjZSwgbG9hZF9maW5pKXtcbiAgICAgICAgcmVzX25hbWUgPSByZXNfbmFtZSB8fCBhY3Rpb25fbmFtZTtcbiAgICAgICAgXG4gICAgICAgIGlmKGlzX2xvb3AgPT0gbnVsbCl7XG4gICAgICAgICAgICBpc19sb29wID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBsYXlfYWN0aW9uX3JlcyA9PSByZXNfbmFtZSl7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5X2FjdGlvbl9uYW1lICE9IGFjdGlvbl9uYW1lKXtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIGlzX2xvb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGxheV9hY3Rpb25fcmVzID0gcmVzX25hbWU7XG4gICAgICAgIHZhciBza2VsZXRvbl9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKHRoaXMuc3BpbmVfbmFtZSwgcmVzX25hbWUpO1xuICAgICAgICBpZiAoIXRoaXMuc2tlbG9uX2NhY2hlW3NrZWxldG9uX3BhdGhdKSB7XG4gICAgICAgICAgICBCYXR0bGVSZXNQb29sLmdldEluc3RhbmNlKCkuZ2V0UmVzKHNrZWxldG9uX3BhdGgsIGZ1bmN0aW9uIChsb2FkX2ZpbmksIHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlfYWN0aW9uX25hbWUgPSBhY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNrZWxldG9uLnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgYWN0aW9uX25hbWUsIGlzX2xvb3ApO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5za2Vsb25fY2FjaGVbc2tlbGV0b25fcGF0aF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2Vsb25fY2FjaGVbc2tlbGV0b25fcGF0aF0gPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobG9hZF9maW5pKVxuICAgICAgICAgICAgICAgICAgICBsb2FkX2ZpbmkoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCBsb2FkX2ZpbmkpKVxuXG4gICAgICAgICAgICAvLyBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhza2VsZXRvbl9wYXRoLCBmdW5jdGlvbiAobG9hZF9maW5pLCByZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5wbGF5X2FjdGlvbl9uYW1lID0gYWN0aW9uX25hbWU7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5za2VsZXRvbi5za2VsZXRvbkRhdGEgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBpc19sb29wKTtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIXRoaXMuc2tlbG9uX2NhY2hlW3NrZWxldG9uX3BhdGhdKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuc2tlbG9uX2NhY2hlW3NrZWxldG9uX3BhdGhdID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgaWYgKGxvYWRfZmluaSlcbiAgICAgICAgICAgIC8vICAgICAgICAgbG9hZF9maW5pKCk7XG4gICAgICAgICAgICAvLyB9LmJpbmQodGhpcywgbG9hZF9maW5pKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheV9hY3Rpb25fbmFtZSA9IGFjdGlvbl9uYW1lO1xuICAgICAgICAgICAgdGhpcy5za2VsZXRvbi5za2VsZXRvbkRhdGEgPSB0aGlzLnNrZWxvbl9jYWNoZVtza2VsZXRvbl9wYXRoXTtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIGFjdGlvbl9uYW1lLCBpc19sb29wKTtcbiAgICAgICAgICAgIGlmIChsb2FkX2ZpbmkpXG4gICAgICAgICAgICAgICAgbG9hZF9maW5pKCk7ICAgICAgICAgXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6YeN6K6+5Z+656GA5pWw5o2uLOWMheWQq+WIh+aNouWIsOaImOWKm+WKqOS9nOetiVxuICAgIHJlc2V0QmFzZUluZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5wbGF5QWN0aW9uT25jZShQbGF5ZXJBY3Rpb24uYmF0dGxlX3N0YW5kKTtcbiAgICAgICAgdGhpcy5yb2xlLnNldFBvc2l0aW9uKHRoaXMuc2NlbmVfcG9zKTtcbiAgICAgICAgdGhpcy5yZXNldFpPcmRlcigpO1xuICAgICAgICB0aGlzLnJldmVyc2UodGhpcy5vYmpfdHlwZSk7XG4gICAgfSxcblxuICAgIC8vIOiuvue9rua3seW6puWAvFxuICAgIHJlc2V0Wk9yZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfZGF0YSA9PSBudWxsKSB7IHJldHVybjsgfVxuICAgICAgICBpZiAodGhpcy5yb2xlID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICh0aGlzLnJvbGVfYmFzZV96b3JkZXIpe1xuICAgICAgICAgICAgaWYodGhpcy5yb2xlX2N1cl96b3JkZXIgIT0gdGhpcy5yb2xlX2Jhc2Vfem9yZGVyKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfY3VyX3pvcmRlciA9IHRoaXMucm9sZV9iYXNlX3pvcmRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUuekluZGV4ID0gdGhpcy5yb2xlX2Jhc2Vfem9yZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHpvcmRlciA9IDBcbiAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5yb2xlX2RhdGEuZ3JvdXAgLSAxO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5yb2xlX2RhdGEucG9zIC0gMTtcbiAgICAgICAgaWYgKHRoaXMucm9sZV9kYXRhLmdyb3VwID09IEJhdHRsZUNvbnN0Lkdyb3VwX1R5cGUuRW5lbWd5KXtcbiAgICAgICAgICAgIHpvcmRlciA9IEJhdHRsZVJvbGVab3JkZXJbZ3JvdXBdW3Bvcy1HSVJEX1BPU19PRkZTRVRdO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHpvcmRlciA9IEJhdHRsZVJvbGVab3JkZXJbZ3JvdXBdW3Bvc11cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVfYmFzZV96b3JkZXIgPSB6b3JkZXI7XG4gICAgICAgIHRoaXMucm9sZV9jdXJfem9yZGVyID0gem9yZGVyO1xuICAgICAgICB0aGlzLnJvbGUuekluZGV4ID0gem9yZGVyO1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7mt7HluqZcbiAgICBzZXRMb2NhbFpPcmRlcjpmdW5jdGlvbih6SW5kZXgpe1xuICAgICAgICBpZih0aGlzLnJvbGVfY3VyX3pvcmRlciA9PSB6SW5kZXgpeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy5yb2xlX2N1cl96b3JkZXIgPSB6SW5kZXg7XG4gICAgICAgIGlmKHRoaXMucm9sZSl7XG4gICAgICAgICAgICB0aGlzLnJvbGUuekluZGV4ID0gekluZGV4O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOW9k+WJjea3seW6puWAvFxuICAgIGdldExvY2FsWk9yZGVyOmZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGVfY3VyX3pvcmRlciB8fCAwO1xuICAgIH0sXG5cbiAgICAvLyDmiJjmlpfliqjkvZzmkq3miqVcbiAgICBydW5BY3Rpb246ZnVuY3Rpb24oYWN0aW9uKXtcbiAgICAgICAgaWYodGhpcy5yb2xlKXtcbiAgICAgICAgICAgIC8vIHRoaXMucm9sZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZS5ydW5BY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmt7vliqDkuIDkuKrmiJjmlpfnibnmlYgs5Y+v6IO95pivYnVmZiwgaW5kZXg6MCDkuLrkuIrlsYLnibnmlYggMTrkuLrkuIvlsYLnibnmlYhcbiAgICBhZGRCYXR0bGVFZmZmZWN0OmZ1bmN0aW9uKGZpeCwgZml5LCBlZmZlY3RfaWQsIGFjdGlvbl9uYW1lLCBpbmRleCwgb2JqX3R5cGUpe1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgPT0gbnVsbCl7XG4gICAgICAgICAgICBpZiAodGhpcy53YWl0X2FkZF9lZmZlY3RfbGlzdFtlZmZlY3RfaWRdID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3RbZWZmZWN0X2lkXSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3RbZWZmZWN0X2lkXVthY3Rpb25fbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3RbZWZmZWN0X2lkXVthY3Rpb25fbmFtZV0gPSB7IGZpeDogZml4LCBmaXk6IGZpeSwgZWZmZWN0X2lkOiBlZmZlY3RfaWQsIGFjdGlvbl9uYW1lOiBhY3Rpb25fbmFtZSwgaW5kZXg6IGluZGV4IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyDov5nkuKrnoa7lrprmmK/lkKbopoHlj43ovaznibnmlYhcbiAgICAgICAgaWYgKG9ial90eXBlID09IG51bGwpe1xuICAgICAgICAgICAgb2JqX3R5cGUgPSB0aGlzLm9ial90eXBlO1xuICAgICAgICB9ICAgICAgICBcbiAgICAgICAgaWYodGhpcy5lZmZlY3RfbGlzdFtlZmZlY3RfaWRdID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5lZmZlY3RfbGlzdFtlZmZlY3RfaWRdID0ge31cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZmZlY3RfbGlzdFtlZmZlY3RfaWRdW2FjdGlvbl9uYW1lXSA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X2xpc3RbZWZmZWN0X2lkXVthY3Rpb25fbmFtZV0gPSB7bnVtOjEsIG9iamVjdDpudWxsfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlZmZlY3Rfb2JqZWN0ID0gdGhpcy5lZmZlY3RfbGlzdFtlZmZlY3RfaWRdW2FjdGlvbl9uYW1lXTtcbiAgICAgICAgaWYgKGVmZmVjdF9vYmplY3Qub2JqZWN0ID09IG51bGwpe1xuICAgICAgICAgICAgZWZmZWN0X29iamVjdC5vYmplY3QgPSBuZXcgQmF0dGxlRWZmZWN0KCk7XG4gICAgICAgICAgICBlZmZlY3Rfb2JqZWN0Lm9iamVjdC5jcmVhdGVFZmZlY3QodGhpcy5jb250YWluZXIsIGNjLnYyKGZpeCwgZml5KSwgb2JqX3R5cGUsIGVmZmVjdF9pZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZWZmZWN0X29iamVjdC5udW0gKz0gMTtcbiAgICAgICAgICAgIGlmKGVmZmVjdF9vYmplY3QubnVtID4gMCl7XG4gICAgICAgICAgICAgICAgZWZmZWN0X29iamVjdC5vYmplY3Quc2V0QWN0aXZlRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOiuvue9rueJueaViOeahOa3seW6puWAvFxuICAgICAgICB2YXIgem9yZGVyID0gdGhpcy5zcGluZV96b3JkZXIgKyAxO1xuICAgICAgICBpZiAoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICB6b3JkZXIgPSB0aGlzLnNwaW5lX3pvcmRlciAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWZmZWN0X29iamVjdC5vYmplY3Quc2V0TG9jYWxaT3JkZXIoem9yZGVyKTtcblxuICAgICAgICByZXR1cm4gZWZmZWN0X29iamVjdDtcbiAgICB9LFxuXG4gICAgLy8g55uR5rWL5piv5ZCm5pyJ5b6F5re75Yqg54m55pWIXG4gICAgY2hlY2tFZmZlY3ROZWVkQWRkOmZ1bmN0aW9uKCl7XG4gICAgICAgIGZvcih2YXIgZWZmZWN0X2lkIGluIHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3Qpe1xuICAgICAgICAgICAgZm9yICh2YXIgYWN0aW9uX25hbWUgaW4gdGhpcy53YWl0X2FkZF9lZmZlY3RfbGlzdFtlZmZlY3RfaWRdKXtcbiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy53YWl0X2FkZF9lZmZlY3RfbGlzdFtlZmZlY3RfaWRdW2FjdGlvbl9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5lZmZlY3RfaWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEJhdHRsZUVmZmZlY3Qob2JqZWN0LmZpeCwgb2JqZWN0LmZpeSwgb2JqZWN0LmVmZmVjdF9pZCwgb2JqZWN0LmFjdGlvbl9uYW1lLCBvYmplY3QuaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhaXRfYWRkX2VmZmVjdF9saXN0ID0ge307XG4gICAgfSxcblxuICAgIC8vIOenu+mZpOS4gOS4queJueaViCzlubbkuI3mmK/lvLrliLbnp7vpmaQs5Y+q5piv5oqK6K6h5pWw5ZmoLTEs5aaC5p6c6K6h5pWw5Zmo5Li6MCzmiY3mmK/lvbvlupXnp7vpmaRcbiAgICBkZWxCYXR0bGVFZmZlY3Q6ZnVuY3Rpb24oZWZmZWN0X2lkLCBhY3Rpb25fbmFtZSwgZm9yY2Upe1xuICAgICAgICBpZiAodGhpcy53YWl0X2FkZF9lZmZlY3RfbGlzdFtlZmZlY3RfaWRdKXtcbiAgICAgICAgICAgIGlmICh0aGlzLndhaXRfYWRkX2VmZmVjdF9saXN0W2VmZmVjdF9pZF1bYWN0aW9uX25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRfYWRkX2VmZmVjdF9saXN0W2VmZmVjdF9pZF1bYWN0aW9uX25hbWVdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuZWZmZWN0X2xpc3RbZWZmZWN0X2lkXSA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWZmZWN0X29iamVjdCA9IHRoaXMuZWZmZWN0X2xpc3RbZWZmZWN0X2lkXVthY3Rpb25fbmFtZV07XG4gICAgICAgIGlmKGVmZmVjdF9vYmplY3QgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWZmZWN0X29iamVjdC5udW0gLT0gMTtcbiAgICAgICAgaWYgKGVmZmVjdF9vYmplY3QubnVtIDw9IDApIHtcbiAgICAgICAgICAgIGVmZmVjdF9vYmplY3Qub2JqZWN0LnNldEFjdGl2ZUVmZmVjdChmYWxzZSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmmL7npLrmiJbogIXpmpDol4/mjonooYDmnaFcbiAgICBzaG93SHBSb290OmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmICh0aGlzLmlzX3JlYWwgPT0gZmFsc2UgKSByZXR1cm47ICAgICAgICAgLy8g5YGH5oiY5paX5LiN6ZyA6KaB566h6L+Z5LiqXG4gICAgICAgIGlmKHRoaXMuaHBfc2hvd19zdGF0dXMgPT0gc3RhdHVzKXsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuaHBfc2hvd19zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGlmKHRoaXMudG9wX2NvbnRhaW5lcil7XG4gICAgICAgICAgICB0aGlzLnRvcF9jb250YWluZXIuYWN0aXZlID0gc3RhdHVzXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6KGA6YeP5Y+Y5YyW55qE5YC8XG4gICAgICogQHBhcmFtIHsqfSBkbWcg5q2j5pWw5piv5rK755aXLOi0n+aVsOaYr+aJo+ihgCBcbiAgICAgKiBAcGFyYW0geyp9IGlzX2RpZSDmmK/lkKbmrbvkuqFcbiAgICAgKiBAcGFyYW0geyp9IHdpdGhvdXQg5piv5ZCm5o+Q5Ye65o6J6Z2e5q275Lqh54q25oCBXG4gICAgICogQHBhcmFtIHsqfSBpc19tdXN0X2RpZSDlpoLmnpzkuLowLOWwseagh+ivhuWPr+S7peenu+mZpOS6hi7lkKbliJnlsLHnrpfmrbvkuobkuZ/kuI3np7vpmaQu5Zug5Li65Y+v6IO95Zyo6L+e5Ye75LitXG4gICAgICovXG4gICAgdXBkYXRlSFA6ZnVuY3Rpb24oZG1nLCBpc19kaWUsIHdpdGhvdXQsIGlzX211c3RfZGllKXtcbiAgICAgICAgaWYodGhpcy5yb2xlX2RhdGEgPT0gbnVsbCkgeyByZXR1cm47IH1cbiAgICAgICAgaWYodGhpcy50b3BfY29udGFpbmVyID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmKHRoaXMucm9sZV9kYXRhICYmIHRoaXMucm9sZV9kYXRhLm9iamVjdF90eXBlID09IEJhdHRsZUNvbnN0LlVuaXRfVHlwZS5IYWxsb3dzKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZXRIUChkbWcpO1xuICAgICAgICBpZiAod2l0aG91dCA9PSBudWxsKXtcbiAgICAgICAgICAgIHdpdGhvdXQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc19kaWUgPT0gMSAmJiBpc19tdXN0X2RpZSA9PSAwKXtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX2RpZSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWVkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmlzX2RpZSA9PSB0cnVlICYmIHdpdGhvdXQgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMucmVsaXZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlpITnkIbop5LoibLlpI3mtLtcbiAgICByZWxpdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNfZGllID09IGZhbHNlKSB7IHJldHVybiB9O1xuICAgICAgICB0aGlzLmlzX2RpZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0QmFzZUluZm8oKTtcbiAgICAgICAgdGhpcy5zaG93SHBSb290KHRydWUpO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZSh0cnVlKVxuICAgICAgICB2YXIgY3VyX2hwID0gdGhpcy5yb2xlX2RhdGEuaHA7XG4gICAgICAgIHZhciBwZXIgPSBNYXRoLm1pbigxLCBNYXRoLm1heChjdXJfaHAgLyB0aGlzLnJvbGVfZGF0YS5ocF9tYXgpKVxuICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gcGVyO1xuICAgIH0sXG5cbiAgICAvLyDnq4vliLvnp7vpmaTlr7nosaFcbiAgICBkb0RpZWQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5pc19kaWUgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNfZGllID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93SHBSb290KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmUoZmFsc2UpXG4gICAgICAgIHRoaXMuY2xlYXJBbGxFZmZlY3QoKTtcbiAgICB9LFxuXG4gICAgLy8g5aSE55CG6KeS6Imy5q275LqhXG4gICAgZGllZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLnRyYWNlKFwiMTExMTExMTExMTExMVwiKTtcblxuICAgICAgICBpZih0aGlzLmluX2h1cnRfYWN0ID09IHRydWUpe1xuICAgICAgICAgICAgdGhpcy5uZWVkX3BsYXlfZGllID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnJvbGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuaXNfZGllID09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzX2RpZSA9IHRydWU7XG4gICAgICAgIHZhciBkZWxheV90aW1lID0gMC4yNTtcbiAgICAgICAgdmFyIGJsaW5rID0gY2MuYmxpbmsoMC4yNSwyKTtcbiAgICAgICAgdmFyIGZhZGVPdXQgPSBjYy5mYWRlT3V0KDAuMjUpO1xuICAgICAgICB2YXIgY2FsbEZ1bmNfMSA9IGNjLmNhbGxGdW5jKChmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5zaG93SHBSb290KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaXNfYWN0X2RpZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgICAgICAgICBpZih0aGlzLmlzX3JlYWwgPT0gZmFsc2UpeyAgLy/lgYfmiJjmlpfmgKrnianmrbvmjonkuobnmoTor50s6ZyA6KaB6YCa55+l6KaB5Yib5bu65LqGXG4gICAgICAgICAgICAgICAgdGhpcy5hc3NldEp1bXBUbygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va19tb2RlbC5wbGF5RW5kKHRoaXMucG9zKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tfbW9kZWwudXBkYXRlTmV4dFJvdW5kRGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgICAgICB2YXIgYWN0ID0gY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKGRlbGF5X3RpbWUpLCBibGluaywgZmFkZU91dCwgY2FsbEZ1bmNfMSk7XG4gICAgICAgIHRoaXMucnVuQWN0aW9uKGFjdCk7XG4gICAgICAgIC8vIOa4hemZpOaJgOacieeahOeJueaViFxuICAgICAgICB0aGlzLmNsZWFyQWxsRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgLy8g5Zue5pS25o6J5omA5pyJYnVmZuWbvuagh1xuICAgICAgICB0aGlzLnJlbW92ZUJ1ZmZJdGVtUmVzKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQnVmZkxpc3QoKTtcbiAgICB9LFxuXG4gICAgLy8g6K6+572u5piv5ZCm5r+A5rS7XG4gICAgc2V0QWN0aXZlOmZ1bmN0aW9uKHN0YXR1cyl7XG4gICAgICAgIGlmICh0aGlzLmlzX3JlYWwgPT0gdHJ1ZSl7XG4gICAgICAgICAgICB0aGlzLnRvcF9jb250YWluZXIuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMudG9wX2NvbnRhaW5lci5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGUub3BhY2l0eSA9IDI1NTtcbiAgICAgICAgdGhpcy5zaGFkb3cuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnNrZWxldG9uLm1hcmtGb3JSZW5kZXIoc3RhdHVzKTtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0KXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0LmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlj5flh7vliqjkvZzmkq3mlL7lrozmiJDkuYvlkI7nmoTlpITnkIZcbiAgICBjaGVja0lzRGllZDpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5uZWVkX3BsYXlfZGllID09IHRydWUpe1xuICAgICAgICAgICAgdGhpcy5uZWVkX3BsYXlfZGllID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRpZWQoKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmRvU3RhbmQoKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiuvue9ruawlOihgFxuICAgIHNldEhQOmZ1bmN0aW9uKGRtZyl7XG4gICAgICAgIGlmKHRoaXMucm9sZV9kYXRhID09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgICAgIHZhciBjdXJfaHAgPSAwXG4gICAgICAgIGlmKGRtZyA8PSAwKXsgICAgICAgLy8g5Lyk5a6zXG4gICAgICAgICAgICBjdXJfaHAgPSBNYXRoLm1heCgwLCBkbWcgKyB0aGlzLnJvbGVfZGF0YS5ocCk7XG4gICAgICAgIH1lbHNleyAgICAgICAgICAgICAgLy8g5oGi5aSNXG4gICAgICAgICAgICBjdXJfaHAgPSBNYXRoLm1pbih0aGlzLnJvbGVfZGF0YS5ocF9tYXgsIGRtZyArIHRoaXMucm9sZV9kYXRhLmhwKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9kYXRhLmhwID0gY3VyX2hwO1xuICAgICAgICB2YXIgcGVyID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoY3VyX2hwIC8gdGhpcy5yb2xlX2RhdGEuaHBfbWF4KSlcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHBlcjtcbiAgICB9LFxuXG4gICAgLy8g5LiL5LiA5rOi5oCq5aaC5p6c5piv5bex5pa56ZyA6KaB5riF5o6J5omA5pyJ55qEYnVmZuS5i+exu+eahFxuICAgIHVwZGF0YU5leHRCYXR0bGVSb2xlOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZiAodGhpcy5yb2xlX2RhdGEpe1xuICAgICAgICAgICAgdGhpcy5yb2xlX2RhdGEudXBkYXRlRGF0YShkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJBbGxFZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgaWYodGhpcy5yb2xlX2RhdGEuaHAgPD0gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWVkKCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICB2YXIgcGVyID0gTWF0aC5taW4oMSwgTWF0aC5tYXgodGhpcy5yb2xlX2RhdGEuaHAgLyB0aGlzLnJvbGVfZGF0YS5ocF9tYXgpKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSBwZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Y+Y6Lqr5pON5L2cXG4gICAgY2hhbmdlU3BpbmU6ZnVuY3Rpb24oc3RhdHVzLCBzcGluZV9yZXMsIGFjdGlvbl9uYW1lKXtcblxuICAgIH0sXG5cbiAgICAvLyDpgJrnn6Xmkq3mlL7lgYfmiJjmlpfotYTmupDmjonokL1cbiAgICBhc3NldEp1bXBUbzpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbm9kZV9yb290X3BvcyA9IHRoaXMucm9sZS5jb252ZXJ0VG9Xb3JsZFNwYWNlKGNjLnYyKDAsIDApKTsgICAgIC8vIOi9rOWIsOS4lueVjOWdkOagh1xuICAgICAgICB0aGlzLm1vZGVsLnBsYXlSZXNvdXJjZUNvbGxlY3Qobm9kZV9yb290X3Bvcy54LCBub2RlX3Jvb3RfcG9zLnkgKyB0aGlzLm1vZGVsX2hlaWdodCAqIDAuNSwgdGhpcy5wb3MpOyAgICAgICAgIC8vIFxuICAgIH0sXG5cbiAgICAvLyDpmpDouqtcbiAgICBzZXRPcGFjaXR5OmZ1bmN0aW9uKHN0YXR1cywgdmFsdWUpe1xuXG4gICAgfSxcblxuICAgIC8vIOabtOaWsGJ1ZmYs5YyF5ZCr5pu05pawYnVmZuWIl+ihqFxuICAgIHVwZGF0ZUJ1ZmZMaXN0OmZ1bmN0aW9uKGJ1ZmYsIGJ1ZmZfY2ZnKXtcbiAgICAgICAgaWYoYnVmZiA9PSBudWxsIHx8IGJ1ZmZfY2ZnID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZl9saXN0W2J1ZmYuaWRdID0gbnVsbDtcbiAgICAgICAgdGhpcy5idWZmX2xpc3RbYnVmZi5pZF0gPSB7YnVmZjpidWZmLCBjb25maWc6YnVmZl9jZmcsIHJlc19pZDogYnVmZl9jZmcuaWNvbn07XG5cbiAgICAgICAgdmFyIHRlbXBfZ3JvdXBfbGlzdCA9IHt9O1xuICAgICAgICB2YXIgcmVzX2lkID0gYnVmZl9jZmcuaWNvbjtcbiAgICAgICAgaWYocmVzX2lkICE9IDApe1xuICAgICAgICAgICAgdmFyIGJ1ZmZfZGF0YSA9IHRoaXMuYnVmZl9saXN0X2RhdGFbcmVzX2lkXTtcbiAgICAgICAgICAgIGlmIChidWZmX2RhdGEgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgYnVmZl9kYXRhID0ge3Jlc19pZDogcmVzX2lkLCBudW06IDAsIGxpc3Q6IFtdfTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF9kYXRhW3Jlc19pZF0gPSBidWZmX2RhdGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChidWZmX2RhdGEubnVtID09IDAgfHwgKGJ1ZmZfY2ZnLmpvaW5fdHlwZSAmJiBidWZmX2NmZy5qb2luX3R5cGUgIT0gMykpIHtcbiAgICAgICAgICAgICAgICBidWZmX2RhdGEubnVtICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZfY2ZnLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBfZ3JvdXBfbGlzdFtidWZmX2NmZy5ncm91cF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZl9jZmcuam9pbl90eXBlICYmIGJ1ZmZfY2ZnLmpvaW5fdHlwZSA9PSAzICYmIGJ1ZmZfY2ZnLmdyb3VwICYmICF0ZW1wX2dyb3VwX2xpc3RbYnVmZl9jZmcuZ3JvdXBdKSB7XG4gICAgICAgICAgICAgICAgdGVtcF9ncm91cF9saXN0W2J1ZmZfY2ZnLmdyb3VwXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnVmZl9kYXRhLm51bSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZl9kYXRhLmxpc3QucHVzaChidWZmLmlkKTtcblxuICAgICAgICAgICAgdmFyIHRlbXBfYXJ5ID0gW11cbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuYnVmZl9saXN0X2RhdGEpe1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5idWZmX2xpc3RfZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIGlmKGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICB0ZW1wX2FyeS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZW1wX2FyeS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB0ZW1wX2FyeS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wicmVzX2lkXCJdKSk7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWluKDMsIHRlbXBfYXJ5Lmxlbmd0aCk7ICAvLyDmnIDlpJrlgLzliJvlu7o05LiqXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRlbXBfYXJ5W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZfb2JqZWN0ID0gdGhpcy5idWZmX2xpc3RfaXRlbVtkYXRhLnJlc19pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWZmX29iamVjdCA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfb2JqZWN0ID0gdGhpcy5jcmVhdGVCdWZmSXRlbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX2xpc3RfaXRlbVtkYXRhLnJlc19pZF0gPSBidWZmX29iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBidWZmX29iamVjdC5sYWJlbC5zdHJpbmcgPSBkYXRhLm51bTtcbiAgICAgICAgICAgICAgICAgICAgYnVmZl9vYmplY3Qubm9kZS54ID0gMjIgKiBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZfcGF0aCA9IFBhdGhUb29sLmdldEJ1ZmZSZXMoZGF0YS5yZXNfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZihidWZmX29iamVjdC5wYXRoICE9IGJ1ZmZfcGF0aCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmX29iamVjdC5wYXRoID0gYnVmZl9wYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGJ1ZmZfcGF0aCwgZnVuY3Rpb24oaWNvbiwgcmVzX29iamVjdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIGJ1ZmZfb2JqZWN0Lmljb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56e76ZmkYnVmZuayoeWmguaenOayoeacieS8oOWPguaVsCzlsLHmmK/np7vpmaTlhajpg6hcbiAgICByZW1vdmVCdWZmTGlzdDpmdW5jdGlvbihidWZmX2lkKXtcbiAgICAgICAgaWYoYnVmZl9pZCA9PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuYnVmZl9saXN0ID0ge307XG4gICAgICAgICAgICB0aGlzLmJ1ZmZfbGlzdF9kYXRhID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5idWZmX2xpc3RfaXRlbSl7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZfb2JqZWN0ID0gdGhpcy5idWZmX2xpc3RfaXRlbVtrZXldO1xuICAgICAgICAgICAgICAgIGlmKGJ1ZmZfb2JqZWN0ICYmIGJ1ZmZfb2JqZWN0Lm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICBCYXR0bGVSb2xlUG9vbC5nZXRJbnN0YW5jZSgpLnB1c2hCYWNrQnVmZlBvb2xzKGJ1ZmZfb2JqZWN0Lm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnVmZl9saXN0X2l0ZW0gPSB7fTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuYnVmZl9saXN0W2J1ZmZfaWRdOyAgICAgICAgIC8vIHtidWZmOmJ1ZmYsIGNvbmZpZzpidWZmX2RhdGEsIHJlc19pZDogYnVmZl9kYXRhLmljb259O1xuICAgICAgICAgICAgaWYoZGF0YSl7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZfb2JqZWN0ID0gdGhpcy5idWZmX2xpc3RfaXRlbVtkYXRhLnJlc19pZF07XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZfb2JqZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZfZGF0YSA9IHRoaXMuYnVmZl9saXN0X2RhdGFbZGF0YS5yZXNfaWRdOyAgIC8vIOWPluWHuuWFt+S9k+aVsOWtl1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZl9kYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfZGF0YS5udW0gLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWwhuivpWJ1Zmbku47liJfooajkuK3liKDpmaRcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBidWZmX2RhdGEubGlzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYnVmZl9kYXRhLmxpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGJ1ZmZfaWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmX2RhdGEubGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3msqHmnInlj6/nlKjkuo7mmL7npLrnmoRidWZm5LqGLOaKimJ1ZmboioLngrnkuKLliLDlr7nosaHmsaDph4zpnaLljrtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmX2RhdGEubnVtIDw9IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfb2JqZWN0Lmljb24uc3ByaXRlRnJhbWUgPSBudWxsOyAgICAgICAgLy8g5Zue5pS25a+56LGh55qE5pe25YCZLOS8mOWFiOa4heaOieaXp+eahOe6ueeQhuS/oeaBr1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdHRsZVJvbGVQb29sLmdldEluc3RhbmNlKCkucHVzaEJhY2tCdWZmUG9vbHMoYnVmZl9vYmplY3Qubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX2xpc3RfaXRlbVtkYXRhLnJlc19pZF0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9saXN0X2RhdGFbZGF0YS5yZXNfaWRdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0QnVmZlBvc3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfb2JqZWN0LmxhYmVsLnN0cmluZyA9IGJ1ZmZfZGF0YS5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnVmZl9saXN0W2J1ZmZfaWRdID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlm57mlLZidWZm5Zu+5qCH55qE5pe25YCZLOS8mOWFiOa4heeQhuaOiee8k+WtmOeahOe6ueeQhuS/oeaBr1xuICAgIHJlbW92ZUJ1ZmZJdGVtUmVzOmZ1bmN0aW9uKCl7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmJ1ZmZfbGlzdF9pdGVtKSB7XG4gICAgICAgICAgICB2YXIgYnVmZl9vYmplY3QgPSB0aGlzLmJ1ZmZfbGlzdF9pdGVtW2tleV07XG4gICAgICAgICAgICBpZiAoYnVmZl9vYmplY3QgJiYgYnVmZl9vYmplY3QuaWNvbikge1xuICAgICAgICAgICAgICAgIGJ1ZmZfb2JqZWN0Lmljb24uc3ByaXRlRnJhbWUgPSBudWxsOyAgICAgICAgLy8g5Zue5pS25a+56LGh55qE5pe25YCZLOS8mOWFiOa4heaOieaXp+eahOe6ueeQhuS/oeaBr1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIm+W7ujEw5pif546v57uV54m55pWIXG4gICAgY3JlYXRlRW5jaXJjbGVFZmZlY3Q6ZnVuY3Rpb24oZWZmZWN0X3Jlcyl7XG4gICAgICAgIGlmICh0aGlzLmVuY2lyY2xlX2VmZmVjdCA9PSBlZmZlY3RfcmVzKSByZXR1cm47XG4gICAgICAgIGlmKHRoaXMuZWZmZWN0X3NrZWxldG9uID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5lZmZlY3Rfc2tlbGV0b24gPSB0aGlzLmVmZmVjdC5hZGRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbmNpcmNsZV9lZmZlY3QgPSBlZmZlY3RfcmVzO1xuICAgICAgICB2YXIgc2tlbGV0b25fcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChlZmZlY3RfcmVzKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKHNrZWxldG9uX3BhdGgsIGZ1bmN0aW9uIChza2VsZXRvbiwgcmVzX29iamVjdCkge1xuICAgICAgICAgICAgc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIHNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uYWN0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIHNrZWxldG9uLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuZWZmZWN0X3NrZWxldG9uKVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7pidWZmLOaJi+WKqOWIm+W7uizkvYbmmK/lr7nosaHmsaDojrflj5Ys5YyF5ZCrIG5vZGUsIGxhYmVsLCBwYXRoIGljb25cbiAgICBjcmVhdGVCdWZmSXRlbTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgcG9vbHMgPSBCYXR0bGVSb2xlUG9vbC5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZQb29scygpO1xuICAgICAgICB2YXIgYnVmZl9vYmplY3QgPSB7bm9kZTpudWxsLCBsYWJlbDpudWxsLCBpY29uOm51bGwsIHBhdGg6XCJcIn07XG4gICAgICAgIHZhciBub2RlID0gbnVsbDtcbiAgICAgICAgdmFyIGxhYmVsID0gbnVsbDtcbiAgICAgICAgdmFyIGljb24gPSBudWxsO1xuICAgICAgICBpZiAocG9vbHMuc2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgbm9kZSA9IHBvb2xzLmdldCgpO1xuICAgICAgICAgICAgbGFiZWwgPSBub2RlLmdldENoaWxkQnlOYW1lKFwiZm9udF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICAgICAgaWNvbiA9IG5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJpY29uX3Nwcml0ZVwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludCgwLCAwLjUpO1xuICAgICAgICAgICAgbm9kZS53aWR0aCA9IDIwO1xuICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSAyMDtcblxuICAgICAgICAgICAgdmFyIGljb25fbm9kZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICBpY29uX25vZGUuc2V0QW5jaG9yUG9pbnQoMCwgMC41KTtcbiAgICAgICAgICAgIGljb25fbm9kZS5uYW1lID0gXCJpY29uX3Nwcml0ZVwiO1xuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChpY29uX25vZGUpO1xuICAgICAgICAgICAgaWNvbiA9IGljb25fbm9kZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcblxuICAgICAgICAgICAgdmFyIGZvbnRfbm9kZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICBmb250X25vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoY2MuQ29sb3IuV0hJVEUpO1xuICAgICAgICAgICAgZm9udF9ub2RlLnNldEFuY2hvclBvaW50KDEsIDAuNSk7XG4gICAgICAgICAgICBmb250X25vZGUueCA9IDIwO1xuICAgICAgICAgICAgZm9udF9ub2RlLnkgPSAtMztcbiAgICAgICAgICAgIGZvbnRfbm9kZS5uYW1lID0gXCJmb250X2xhYmVsXCI7XG4gICAgICAgICAgICBub2RlLmFkZENoaWxkKGZvbnRfbm9kZSk7XG5cbiAgICAgICAgICAgIGxhYmVsID0gZm9udF9ub2RlLmFkZENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgICAgICBsYWJlbC5saW5lSGVpZ2h0ID0gMTQ7XG4gICAgICAgICAgICBsYWJlbC5mb250U2l6ZSA9IDE0O1xuICAgICAgICAgICAgbGFiZWwuaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5SSUdIVDtcblxuICAgICAgICAgICAgdmFyIG91dGxpbmVfbGFiZWwgPSBmb250X25vZGUuYWRkQ29tcG9uZW50KGNjLkxhYmVsT3V0bGluZSk7XG4gICAgICAgICAgICBvdXRsaW5lX2xhYmVsLmNvbG9yID0gbmV3IGNjLkNvbG9yKGNjLkNvbG9yLkJMQUNLKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZfY29udGFpbmVyLmFkZENoaWxkKG5vZGUpO1xuXG4gICAgICAgIGJ1ZmZfb2JqZWN0Lm5vZGUgPSBub2RlO1xuICAgICAgICBidWZmX29iamVjdC5sYWJlbCA9IGxhYmVsO1xuICAgICAgICBidWZmX29iamVjdC5pY29uID0gaWNvbjtcbiAgICAgICAgcmV0dXJuIGJ1ZmZfb2JqZWN0O1xuICAgIH0sXG5cbiAgICAvLyDph43mlrDorr7nva5idWZm55qE5L2N572uXG4gICAgcmVzZXRCdWZmUG9zdGlvbjpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5idWZmX2xpc3RfaXRlbSl7XG4gICAgICAgICAgICB2YXIgdGVtcF9hcnkgPSBbXVxuICAgICAgICAgICAgZm9yICh2YXIgcmVzX2lkIGluIHRoaXMuYnVmZl9saXN0X2l0ZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWZmX2xpc3RfaXRlbVtyZXNfaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBfYXJ5LnB1c2goeyByZXNfaWQ6IHJlc19pZCwgb2JqZWN0OiB0aGlzLmJ1ZmZfbGlzdF9pdGVtW3Jlc19pZF0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlbXBfYXJ5Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgIHRlbXBfYXJ5LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJyZXNfaWRcIl0pKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGVtcF9hcnkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0ZW1wX2FyeVtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQub2JqZWN0ICYmIGVsZW1lbnQub2JqZWN0Lm5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub2JqZWN0Lm5vZGUueCA9IDIyICogaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Yik5pat5piv5ZCm5oul5pyJ5b2T5YmNaWTnmoRidWZmXG4gICAgaGFkQnVmZjpmdW5jdGlvbihidWZmX2lkKXtcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1ZmZfbGlzdCAmJiB0aGlzLmJ1ZmZfbGlzdFtidWZmX2lkXSAhPSBudWxsKVxuICAgIH0sXG5cbiAgICBnZXRSb2xlRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xlX2RhdGE7XG4gICAgfSxcblxuICAgIGFkZFRpcHM6ZnVuY3Rpb24oYmlkKXtcbiAgICAgICAgdGhpcy50aXBzX2xpc3RbYmlkXSA9IHRydWU7XG4gICAgfSxcblxuICAgIHJlbW92ZVRpcHM6ZnVuY3Rpb24oYmlkKXtcbiAgICAgICAgdGhpcy50aXBzX2xpc3RbYmlkXSA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBsb2FkUmVzOiBmdW5jdGlvbiAocmVzLCBjYWxsYmFjaywgbm9kZSkge1xuICAgICAgICBpZiAocmVzID09IG51bGwgfHwgcmVzID09IFwiXCIpIHJldHVybjtcbiAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHRlbXBfb2JqZWN0ID0gdGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNdO1xuICAgICAgICBpZiAodGVtcF9vYmplY3Qpe1xuICAgICAgICAgICAgY2FsbGJhY2sobm9kZSwgdGVtcF9vYmplY3QpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHJlcywgKGZ1bmN0aW9uIChvYmplY3QsIHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNdID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sob2JqZWN0LCByZXNfb2JqZWN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcywgbm9kZSkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOiuvue9ruW9k+WJjeaooeWei+WSjOe7keWcqOaooeWei+S4iumdoueahOeJueaViOaSreaUvumAn+eOh1xuICAgIHNldFRpbWVTY2FsZTpmdW5jdGlvbihzcGVlZCl7XG4gICAgICAgIGlmICh0aGlzLnNrZWxldG9uID09IG51bGwgfHwgdGhpcy5za2VsZXRvbi5za2VsZXRvbkRhdGEgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uX3RpbWVfc2NhbGUgPSBzcGVlZDtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAodGhpcy5za2VsZXRvbl90aW1lU2NhbGUgPT0gc3BlZWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25fdGltZVNjYWxlID0gc3BlZWRcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b24udGltZVNjYWxlID0gc3BlZWQ7XG4gICAgICAgICAgICB0aGlzLnNldEVmZmVjdFNjYWxlKHNwZWVkKTtcbiAgICAgICAgICAgIC8vIOiuvue9rueJueaViFxuICAgICAgICAgICAgZm9yICh2YXIgZWZmZWN0X2lkIGluIHRoaXMuZWZmZWN0X2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0X29iamVjdCA9IHRoaXMuZWZmZWN0X2xpc3RbZWZmZWN0X2lkXVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGFjdGlvbl9uYW1lIGluIGVmZmVjdF9vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdF9vYmplY3RbYWN0aW9uX25hbWVdXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3QgJiYgZWZmZWN0Lm9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Lm9iamVjdC5zZXRUaW1lU2NhbGUoc3BlZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaYvuekuuiBiuWkqeawlOazoVxuICAgIHNob3dUYWxrQnViYmxlOmZ1bmN0aW9uKG1zZyl7XG5cbiAgICB9LFxuXG4gICAgLy8g5riF56m65omA5pyJ54m55pWIXG4gICAgY2xlYXJBbGxFZmZlY3Q6ZnVuY3Rpb24oaXNfZm9yY2Upe1xuICAgICAgICBmb3IgKHZhciBlZmZlY3RfaWQgaW4gdGhpcy5lZmZlY3RfbGlzdCkge1xuICAgICAgICAgICAgdmFyIGVmZmVjdF9vYmplY3QgPSB0aGlzLmVmZmVjdF9saXN0W2VmZmVjdF9pZF1cbiAgICAgICAgICAgIGZvciAodmFyIGFjdGlvbl9uYW1lIGluIGVmZmVjdF9vYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZWZmZWN0X29iamVjdFthY3Rpb25fbmFtZV1cbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0ICYmIGVmZmVjdC5vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Lm9iamVjdC5kZWxlRWZmZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc19mb3JjZSA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmVmZmVjdF9saXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3QgPSBudWxsO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X2xpc3QgPSB7fTtcbiAgICAgICAgICAgIHRoaXMud2FpdF9hZGRfZWZmZWN0X2xpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDku47lnLrmma/kuK3np7vpmaTov5nkuKrljZXkvY0s5Zue5pS25o6J5omA5pyJ55qE5Yib5bu66IqC54K55ZKM6aKE5Yi2LOW5tuS4lOWIoOmZpOaOieaJgOacieeahOi1hOa6kOe6ueeQhuS/oeaBr1xuICAgICAqL1xuICAgIGRlbGV0ZVJvbGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYodGhpcy5yb2xlKXtcbiAgICAgICAgICAgIHRoaXMucm9sZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJBbGxFZmZlY3QodHJ1ZSk7XG4gICAgICAgIHRoaXMuY2xlYXJOZXh0QWN0VGltZXIoKTtcbiAgICAgICAgdGhpcy5jbGVhck5leHRDYWxsVGltZXIoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVCdWZmSXRlbVJlcygpOyAgICAgICAgICAgICAgICAgICAgICAgLy8g5LyY5YWI5riF5o6JYnVmZue8k+WtmOeahOe6ueeQhuS/oeaBr1xuICAgICAgICAvLyB0aGlzLnNrZWxldG9uLnNrZWxldG9uRGF0YSA9IG51bGw7ICAgICAgICAgICAgICAvLyDph4rmlL7kuYvliY3lhYjmioroioLngrnlr7nosaHnmoTotYTmupDmuIXpmaRcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3NrZWxldG9uKXtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3NrZWxldG9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHRoaXMuZWZmZWN0LnJlbW92ZUNvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgICAgICAvLyB0aGlzLmVmZmVjdF9za2VsZXRvbiA9IG51bGw7ICAgICAgIC8vIDEw5pif5YWJ546v54m55pWIXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5jYW1wKXtcbiAgICAgICAgICAgIHRoaXMuY2FtcC5zcHJpdGVGcmFtZSA9IG51bGw7ICAgICAgICAgICAgICAgICAgIC8vIOWFiOmHiuaUvuaOieiKgueCueWvueixoei1hOa6kOW8leeUqOWvueixoVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aW9uX2NhbGxfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnRpcHNfbGlzdCA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIHNrZWxldG9uSW5kZXggaW4gdGhpcy5za2Vsb25fY2FjaGUpIHtcbiAgICAgICAgICAgIEJhdHRsZVJlc1Bvb2wuZ2V0SW5zdGFuY2UoKS5kZWxSZXMoc2tlbGV0b25JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g6L+Z5Lik5aSE6YeK5pS+cmVzIOi1hOa6kOaciemXrumimFxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5yZXNvdXJjZXNfbGlzdCkge1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXMoa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2tlbG9uX2NhY2hlID0ge307XG4gICAgICAgIC8vIOenu+mZpOaOieaJgOacieeahGJ1ZmboioLngrks5bm25LiU5Lii5Yiw5a+56LGh5rGg5LitXG4gICAgICAgIHRoaXMucmVtb3ZlQnVmZkxpc3QoKTtcbiAgICAgICAgLy8g5oqK5b2T5YmN6IqC54K55a+56LGhLOmHjeaWsOaUvuWIsOe8k+WtmOaxoOS4reWMulxuICAgICAgICBCYXR0bGVSb2xlUG9vbC5nZXRJbnN0YW5jZSgpLnB1c2hCYWNrUm9sZSh0aGlzLnJvbGUpO1xuICAgIH0sXG5cbiAgICBnZXRSZXNQYXRoOiBmdW5jdGlvbihhY3Rpb25fbmFtZSkge1xuICAgICAgICByZXR1cm4gXCJzcGluZS9cIiArIHRoaXMuc3BpbmVfbmFtZSArIFwiL1wiICsgYWN0aW9uX25hbWU7XG4gICAgfSxcblxufSk7Il19
|