|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/hallows/view/hallows_task_window.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, '73916WkaclNb4/zAzsuqnIG', 'hallows_task_window');
|
// Scripts/mod/hallows/view/hallows_task_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-02-18 17:52:10
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var MainuiConst = require("mainui_const");
|
|
var MainuiController = require("mainui_controller");
|
|
var HallowsEvent = require("hallows_event");
|
|
var CommonScrollView = require("common_scrollview");
|
|
var HallowsTaskItem = require("hallows_task_item_panel");
|
|
var PartnerCalculate = require("partner_calculate");
|
|
var Hallows_taskWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("hallows", "hallows_task_window");
|
this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
|
this.ctrl = arguments[0];
|
this.model = this.ctrl.getModel();
|
this.rleasePrefab = false;
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.attr_bgs = [];
|
this.base_attr_list = {};
|
this.all_hallows_id = []; // 所有神器id(有序,翻页按钮用)
|
|
this.cur_index = 0; //当前选中的神器在all_hallows_id的下标
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild(this.root_wnd, "background");
|
this.background.scale = FIT_SCALE;
|
this.bg = this.seekChild(this.root_wnd, "background", cc.Sprite);
|
this.loadRes(PathTool.getBigBg("bigbg_68", "jpg"), function (resObject) {
|
this.bg.spriteFrame = resObject;
|
}.bind(this));
|
this.main_panel = this.seekChild("main_panel");
|
this.title_bg = this.main_panel.getChildByName("title_bg").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_2015"), function (resObject) {
|
this.title_bg.spriteFrame = resObject;
|
}.bind(this));
|
this.skill_bg = this.main_panel.getChildByName("skill_bg");
|
this.skill_bg_img = this.skill_bg.getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_1092"), function (resObject) {
|
this.skill_bg_img.spriteFrame = resObject;
|
}.bind(this));
|
this.bottom_bg = this.main_panel.getChildByName("bottom_bg").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1001"), function (resObject) {
|
this.bottom_bg.spriteFrame = resObject;
|
}.bind(this));
|
this.task_panel = this.seekChild(this.main_panel, "task_panel");
|
this.attr_panel = this.seekChild(this.main_panel, "attr_panel");
|
this.attr_panel.active = false;
|
this.attr_bg_1 = this.attr_panel.getChildByName("attr_bg_1").getComponent(cc.Sprite);
|
this.attr_bg_2 = this.attr_panel.getChildByName("attr_bg_2").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1007"), function (resObject) {
|
this.attr_bg_1.spriteFrame = resObject;
|
this.attr_bg_2.spriteFrame = resObject;
|
}.bind(this));
|
this.max_bg_l = this.attr_panel.getChildByName("max_bg_l").getComponent(cc.Sprite);
|
this.max_bg_r = this.attr_panel.getChildByName("max_bg_r").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getUIIconPath("hallows", "hallows_1005"), function (resObject) {
|
this.max_bg_l.spriteFrame = resObject;
|
this.max_bg_r.spriteFrame = resObject;
|
}.bind(this));
|
this.bottom_bg_2 = this.attr_panel.getChildByName("bottom_bg_2").getComponent(cc.Sprite);
|
this.loadRes(PathTool.getCommonIcomPath("common_2007"), function (resObject) {
|
this.bottom_bg_2.spriteFrame = resObject;
|
}.bind(this));
|
this.desc_label = this.attr_panel.getChildByName("desc_label").getComponent(cc.Label);
|
this.desc_label.string = Utils.TI18N("出战界面选择穿戴激活神器技能和主属性");
|
this.go_battle_btn = this.seekChild(this.attr_panel, "go_battle_btn");
|
this.hallows_name = this.seekChild(this.main_panel, "hallows_name", cc.Label);
|
this.explain_btn = this.seekChild(this.main_panel, "explain_btn");
|
this.artifact_btn = this.seekChild(this.main_panel, "artifact_btn");
|
this.touch_layout = this.seekChild(this.main_panel, "touch_layout");
|
this.progress = this.seekChild(this.main_panel, "progress").getComponent(cc.ProgressBar);
|
this.progress_value = this.seekChild(this.main_panel, "value").getComponent(cc.Label);
|
this.left_btn = this.seekChild(this.main_panel, "left_btn");
|
this.right_btn = this.seekChild(this.main_panel, "right_btn");
|
this.list_view = this.seekChild(this.main_panel, "list_view");
|
|
for (var i = 1; i < 3; i++) {
|
var attr_bg = this.seekChild(this.main_panel, "attr_bg_" + i);
|
this.attr_bgs[i] = attr_bg;
|
}
|
|
this.hallows_eff_node = this.seekChild("hallows_eff_node");
|
this.hallows_eff_sk = this.seekChild("hallows_eff_node", sp.Skeleton);
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
this.artifact_btn.on("click", function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
this.ctrl.openHallowsPreviewWindow(true);
|
}, this);
|
this.go_battle_btn.on("click", function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
MainuiController.getInstance().changeMainUIStatus(MainuiConst.btn_index.drama_scene);
|
this.ctrl.openHallowsMainWindow(false);
|
}, this);
|
this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(ButtonSound.Normal);
|
var config = config = Config.hallows_data.data_const.game_rule;
|
var pos = event.touch.getLocation();
|
|
require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500);
|
}, this);
|
this.left_btn.on("click", function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickBtnLeft();
|
}, this);
|
this.right_btn.on("click", function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
this._onClickBtnRight();
|
}, this);
|
this.touch_layout.on(cc.Node.EventType.TOUCH_END, function () {
|
Utils.playButtonSound(ButtonSound.Normal);
|
|
if (this.hallows_id) {
|
var max_vo = this.model.makeHighestHallowVo(this.hallows_id);
|
this.ctrl.openHallowsTips(true, max_vo);
|
}
|
}, this); //任务变化
|
|
this.addGlobalEvent(HallowsEvent.UpdateHallowsTaskEvent, function () {
|
this.updateHallowsTaskInfo();
|
}.bind(this)); //神器数据更新
|
|
this.addGlobalEvent(HallowsEvent.HallowsUpdateEvent, function (id) {
|
if (id == this.hallows_id) {
|
this.refreshView();
|
}
|
}.bind(this)); //激活圣器
|
|
this.addGlobalEvent(HallowsEvent.HallowsActivityEvent, function () {
|
var hallows_id = this.model.getCurActivityHallowsId();
|
|
if (hallows_id) {
|
this.hallows_id = hallows_id;
|
this.initUnlockHallowsData(hallows_id);
|
this.refreshView();
|
}
|
}.bind(this)); //显示为某一神器(从所有神器预览界面打开)
|
|
this.addGlobalEvent(HallowsEvent.UndateHallowsInfoEvent, function (id) {
|
if (id && this.hallows_id != id) {
|
this.hallows_id = id;
|
this.initUnlockHallowsData(id);
|
this.refreshView();
|
}
|
}.bind(this));
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(hallows_id) {
|
var hallows_id = hallows_id || this.model.getCurActivityHallowsId();
|
|
if (hallows_id) {
|
this.hallows_id = hallows_id;
|
this.initUnlockHallowsData(hallows_id);
|
this.refreshView();
|
}
|
},
|
//设置已解锁和正在进行的神器数据
|
initUnlockHallowsData: function initUnlockHallowsData(hallows_id) {
|
this.all_hallows_id = [];
|
var activity_id = this.model.getCurActivityHallowsId(); // 正在进行中的神器id
|
|
for (var i in Config.hallows_data.data_base) {
|
var tempCfg = Config.hallows_data.data_base[i];
|
|
if (this.model.getHallowsById(tempCfg.id) || tempCfg.id == activity_id) {
|
this.all_hallows_id.push(tempCfg.id);
|
|
if (hallows_id && tempCfg.id == hallows_id) {
|
this.cur_index = this.all_hallows_id.length - 1;
|
}
|
}
|
}
|
|
this.left_btn.active = this.all_hallows_id.length > 1;
|
this.right_btn.active = this.all_hallows_id.length > 1;
|
},
|
updateHallowsBaseInfo: function updateHallowsBaseInfo() {
|
if (!this.hallows_id) return;
|
var hallows_config = Config.hallows_data.data_base[this.hallows_id];
|
if (!hallows_config) return;
|
|
if (this.hallows_model_id != hallows_config.effect) {
|
this.hallows_model_id = hallows_config.effect;
|
|
if (this.hallows_eff_sk) {
|
this.hallows_eff_sk.setToSetupPose();
|
this.hallows_eff_sk.clearTracks();
|
}
|
}
|
|
this.hallows_name.string = hallows_config.name;
|
|
if (this.model.getHallowsById(this.hallows_id)) {
|
// setChildUnEnabled(false, this.hallows_model)
|
this.hallows_eff_node.color = new cc.Color(255, 255, 255, 255);
|
var anima_path = PathTool.getSpinePath(this.hallows_model_id, "action");
|
this.loadRes(anima_path, function (ske_data) {
|
this.hallows_eff_sk.skeletonData = ske_data;
|
this.hallows_eff_sk.setAnimation(0, PlayerAction.action_2, true);
|
}.bind(this));
|
} else {
|
// setChildUnEnabled(true, this.hallows_model)
|
this.hallows_eff_node.color = new cc.Color(169, 169, 169, 255);
|
var anima_path = PathTool.getSpinePath(this.hallows_model_id, "action");
|
this.loadRes(anima_path, function (ske_data) {
|
this.hallows_eff_sk.skeletonData = ske_data;
|
this.hallows_eff_sk.setAnimation(0, PlayerAction.action_1, true);
|
}.bind(this));
|
}
|
},
|
updateHallowsTaskInfo: function updateHallowsTaskInfo() {
|
if (!this.hallows_id) return; //判断是否已获得
|
|
if (this.model.getHallowsById(this.hallows_id)) {
|
this.attr_panel.active = true;
|
this.task_panel.active = false;
|
this.progress.progress = 1;
|
this.progress_value.string = Utils.TI18N("已完成");
|
|
for (var i in this.base_attr_list) {
|
this.base_attr_list[i].active = false;
|
}
|
|
var hallows_base = gdata("hallows_data", "data_info", Utils.getNorKey(this.hallows_id, 1));
|
|
if (hallows_base) {
|
for (var j in hallows_base.attr) {
|
if (j > 2) break; //UI只支持显示两个技能
|
|
var attr_key = hallows_base.attr[j][0];
|
var attr_val = hallows_base.attr[j][1] || 0;
|
var attr_name = Config.attr_data.data_key_to_name[attr_key];
|
|
if (attr_name) {
|
var attr_text = this.base_attr_list[j];
|
|
if (!attr_text) {
|
attr_text = Utils.createRichLabel(24, new cc.Color(100, 50, 35, 255), cc.v2(0, 0.5), cc.v2(20, 20), 30, 380);
|
attr_text.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
var attr_bg = this.attr_bgs[parseInt(j) + 1];
|
attr_bg.addChild(attr_text.node);
|
this.base_attr_list[j] = attr_text;
|
}
|
|
attr_text.active = true;
|
var icon = PathTool.getAttrIconByStr(attr_key);
|
var is_per = PartnerCalculate.isShowPerByStr(attr_key);
|
|
if (is_per == true) {
|
attr_val = attr_val / 10 + "%";
|
}
|
|
var attr_str = cc.js.formatStr("<img src='%s'/> <color=#643223> %s%s:</c><color=#643223>%s</c>", icon, Utils.TI18N("全队"), attr_name, attr_val);
|
attr_text.string = attr_str;
|
this.loadRes(PathTool.getCommonIcomPath(icon), function (attr_text, resObject) {
|
attr_text.addSpriteFrame(resObject);
|
}.bind(this, attr_text));
|
}
|
}
|
}
|
} else {
|
this.attr_panel.active = false;
|
this.task_panel.active = true;
|
var task_list = this.model.getHallowsTaskList(this.hallows_id);
|
|
if (task_list) {
|
var max_num = task_list.length;
|
var cur_num = 0;
|
|
for (var k in task_list) {
|
if (task_list[k].finish == 2) {
|
cur_num = cur_num + 1;
|
}
|
}
|
|
var percent = cur_num / max_num;
|
this.progress.progress = percent;
|
this.progress_value.string = cur_num + "/" + max_num;
|
}
|
|
if (this.scroll_view == null) {
|
var size = this.list_view.getContentSize();
|
var setting = {
|
item_class: HallowsTaskItem,
|
// 单元类
|
start_x: 0,
|
// 第一个单元的X起点
|
space_x: 10,
|
// x方向的间隔
|
start_y: 0,
|
// 第一个单元的Y起点
|
space_y: 4,
|
// y方向的间隔
|
item_width: 331,
|
// 单元的尺寸width
|
item_height: 139,
|
// 单元的尺寸height
|
row: 0,
|
// 行数,作用于水平滚动类型
|
col: 2,
|
// 列数,作用于垂直滚动类型
|
need_dynamic: true
|
};
|
this.scroll_view = new CommonScrollView();
|
this.scroll_view.createScroll(this.list_view, null, null, null, size, setting);
|
}
|
|
this.scroll_view.setData(task_list);
|
}
|
},
|
// 神器技能
|
updateHallowsSkillInfo: function updateHallowsSkillInfo() {
|
if (!this.hallows_id) return;
|
var hallows_skill = gdata("hallows_data", "data_skill_up", Utils.getNorKey(this.hallows_id, 1)); // 显示1级时的技能
|
|
if (hallows_skill && hallows_skill.skill_bid != 0) {
|
var config = gdata("skill_data", "data_get_skill", hallows_skill.skill_bid) || {};
|
|
if (!this.skill_icon) {
|
var SkillItem = require("skill_item");
|
|
this.skill_icon = new SkillItem(); //true,true,true,0.9
|
|
this.skill_icon.setParent(this.skill_bg);
|
this.skill_icon.setScale(0.9);
|
this.skill_icon.setLeveStatus(false);
|
this.skill_icon.setPosition(cc.v2(75, 70));
|
}
|
|
this.skill_icon.setData(config.bid);
|
|
if (!this.skill_name) {
|
//颜色需修改
|
this.skill_name = Utils.createLabel(24, new cc.Color(255, 238, 194, 255), null, 135, 80, "", this.skill_bg, 1, cc.v2(0, 0));
|
}
|
|
this.skill_name.string = config.name;
|
|
if (!this.skill_desc) {
|
//颜色需修改
|
this.skill_desc = Utils.createRichLabel(20, new cc.Color(255, 238, 194, 255), cc.v2(0, 1), cc.v2(135, 80), 30, 500);
|
this.skill_desc.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
this.skill_bg.addChild(this.skill_desc.node);
|
}
|
|
this.skill_desc.string = config.des;
|
}
|
},
|
// 向左翻页
|
_onClickBtnLeft: function _onClickBtnLeft() {
|
this.cur_index = this.cur_index - 1;
|
|
if (this.cur_index < 0) {
|
this.cur_index = this.all_hallows_id.length - 1;
|
}
|
|
this.hallows_id = this.all_hallows_id[this.cur_index];
|
this.refreshView();
|
},
|
// -- 向右翻页
|
_onClickBtnRight: function _onClickBtnRight() {
|
this.cur_index = this.cur_index + 1;
|
|
if (this.cur_index >= this.all_hallows_id.length) {
|
this.cur_index = 0;
|
}
|
|
this.hallows_id = this.all_hallows_id[this.cur_index];
|
this.refreshView();
|
},
|
// 刷新界面
|
refreshView: function refreshView() {
|
this.updateHallowsBaseInfo();
|
this.updateHallowsTaskInfo();
|
this.updateHallowsSkillInfo();
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.scroll_view) {
|
this.scroll_view.deleteMe();
|
this.scroll_view = null;
|
}
|
|
if (this.skill_icon) {
|
this.skill_icon.deleteMe();
|
this.skill_icon = null;
|
}
|
|
if (this.hallows_eff_sk) {
|
this.hallows_eff_sk.setToSetupPose();
|
this.hallows_eff_sk.clearTracks();
|
}
|
|
this.ctrl.openHallowsMainWindow(false);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFx2aWV3XFxoYWxsb3dzX3Rhc2tfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIk1haW51aUNvbnN0IiwiTWFpbnVpQ29udHJvbGxlciIsIkhhbGxvd3NFdmVudCIsIkNvbW1vblNjcm9sbFZpZXciLCJIYWxsb3dzVGFza0l0ZW0iLCJQYXJ0bmVyQ2FsY3VsYXRlIiwiSGFsbG93c190YXNrV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwicmxlYXNlUHJlZmFiIiwiaW5pdENvbmZpZyIsImF0dHJfYmdzIiwiYmFzZV9hdHRyX2xpc3QiLCJhbGxfaGFsbG93c19pZCIsImN1cl9pbmRleCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJyb290X3duZCIsInNjYWxlIiwiRklUX1NDQUxFIiwiYmciLCJTcHJpdGUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJyZXNPYmplY3QiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJtYWluX3BhbmVsIiwidGl0bGVfYmciLCJnZXRDaGlsZEJ5TmFtZSIsImdldENvbXBvbmVudCIsImdldENvbW1vbkljb21QYXRoIiwic2tpbGxfYmciLCJza2lsbF9iZ19pbWciLCJib3R0b21fYmciLCJnZXRVSUljb25QYXRoIiwidGFza19wYW5lbCIsImF0dHJfcGFuZWwiLCJhY3RpdmUiLCJhdHRyX2JnXzEiLCJhdHRyX2JnXzIiLCJtYXhfYmdfbCIsIm1heF9iZ19yIiwiYm90dG9tX2JnXzIiLCJkZXNjX2xhYmVsIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiZ29fYmF0dGxlX2J0biIsImhhbGxvd3NfbmFtZSIsImV4cGxhaW5fYnRuIiwiYXJ0aWZhY3RfYnRuIiwidG91Y2hfbGF5b3V0IiwicHJvZ3Jlc3MiLCJQcm9ncmVzc0JhciIsInByb2dyZXNzX3ZhbHVlIiwibGVmdF9idG4iLCJyaWdodF9idG4iLCJsaXN0X3ZpZXciLCJpIiwiYXR0cl9iZyIsImhhbGxvd3NfZWZmX25vZGUiLCJoYWxsb3dzX2VmZl9zayIsInNwIiwiU2tlbGV0b24iLCJyZWdpc3RlckV2ZW50Iiwib24iLCJwbGF5QnV0dG9uU291bmQiLCJCdXR0b25Tb3VuZCIsIk5vcm1hbCIsIm9wZW5IYWxsb3dzUHJldmlld1dpbmRvdyIsImdldEluc3RhbmNlIiwiY2hhbmdlTWFpblVJU3RhdHVzIiwiYnRuX2luZGV4IiwiZHJhbWFfc2NlbmUiLCJvcGVuSGFsbG93c01haW5XaW5kb3ciLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJjb25maWciLCJDb25maWciLCJoYWxsb3dzX2RhdGEiLCJkYXRhX2NvbnN0IiwiZ2FtZV9ydWxlIiwicG9zIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwiZGVzYyIsIl9vbkNsaWNrQnRuTGVmdCIsIl9vbkNsaWNrQnRuUmlnaHQiLCJoYWxsb3dzX2lkIiwibWF4X3ZvIiwibWFrZUhpZ2hlc3RIYWxsb3dWbyIsIm9wZW5IYWxsb3dzVGlwcyIsImFkZEdsb2JhbEV2ZW50IiwiVXBkYXRlSGFsbG93c1Rhc2tFdmVudCIsInVwZGF0ZUhhbGxvd3NUYXNrSW5mbyIsIkhhbGxvd3NVcGRhdGVFdmVudCIsImlkIiwicmVmcmVzaFZpZXciLCJIYWxsb3dzQWN0aXZpdHlFdmVudCIsImdldEN1ckFjdGl2aXR5SGFsbG93c0lkIiwiaW5pdFVubG9ja0hhbGxvd3NEYXRhIiwiVW5kYXRlSGFsbG93c0luZm9FdmVudCIsIm9wZW5Sb290V25kIiwiYWN0aXZpdHlfaWQiLCJkYXRhX2Jhc2UiLCJ0ZW1wQ2ZnIiwiZ2V0SGFsbG93c0J5SWQiLCJwdXNoIiwibGVuZ3RoIiwidXBkYXRlSGFsbG93c0Jhc2VJbmZvIiwiaGFsbG93c19jb25maWciLCJoYWxsb3dzX21vZGVsX2lkIiwiZWZmZWN0Iiwic2V0VG9TZXR1cFBvc2UiLCJjbGVhclRyYWNrcyIsIm5hbWUiLCJjb2xvciIsIkNvbG9yIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInNrZV9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uXzIiLCJhY3Rpb25fMSIsImhhbGxvd3NfYmFzZSIsImdkYXRhIiwiZ2V0Tm9yS2V5IiwiaiIsImF0dHIiLCJhdHRyX2tleSIsImF0dHJfdmFsIiwiYXR0cl9uYW1lIiwiYXR0cl9kYXRhIiwiZGF0YV9rZXlfdG9fbmFtZSIsImF0dHJfdGV4dCIsImNyZWF0ZVJpY2hMYWJlbCIsInYyIiwiaG9yaXpvbnRhbEFsaWduIiwibWFjcm8iLCJUZXh0QWxpZ25tZW50IiwiTEVGVCIsInBhcnNlSW50IiwiYWRkQ2hpbGQiLCJub2RlIiwiaWNvbiIsImdldEF0dHJJY29uQnlTdHIiLCJpc19wZXIiLCJpc1Nob3dQZXJCeVN0ciIsImF0dHJfc3RyIiwianMiLCJmb3JtYXRTdHIiLCJhZGRTcHJpdGVGcmFtZSIsInRhc2tfbGlzdCIsImdldEhhbGxvd3NUYXNrTGlzdCIsIm1heF9udW0iLCJjdXJfbnVtIiwiayIsImZpbmlzaCIsInBlcmNlbnQiLCJzY3JvbGxfdmlldyIsInNpemUiLCJnZXRDb250ZW50U2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm5lZWRfZHluYW1pYyIsImNyZWF0ZVNjcm9sbCIsInNldERhdGEiLCJ1cGRhdGVIYWxsb3dzU2tpbGxJbmZvIiwiaGFsbG93c19za2lsbCIsInNraWxsX2JpZCIsInNraWxsX2ljb24iLCJTa2lsbEl0ZW0iLCJzZXRQYXJlbnQiLCJzZXRTY2FsZSIsInNldExldmVTdGF0dXMiLCJzZXRQb3NpdGlvbiIsImJpZCIsInNraWxsX25hbWUiLCJjcmVhdGVMYWJlbCIsInNraWxsX2Rlc2MiLCJkZXMiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxXQUFXLEdBQUdELE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlFLGdCQUFnQixHQUFHRixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsWUFBWSxHQUFHSCxPQUFPLENBQUMsZUFBRCxDQUExQjs7QUFDQSxJQUFJSSxnQkFBZ0IsR0FBR0osT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlLLGVBQWUsR0FBR0wsT0FBTyxDQUFDLHlCQUFELENBQTdCOztBQUNBLElBQUlNLGdCQUFnQixHQUFHTixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBRUEsSUFBSU8sa0JBQWtCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzlCLGFBQVNDLFFBRHFCO0FBRTlCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMLEdBQWtCYixRQUFRLENBQUNjLGFBQVQsQ0FBdUIsU0FBdkIsRUFBa0MscUJBQWxDLENBQWxCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQyxTQUFTLENBQUNDLEVBQXpCLENBRmMsQ0FFOEI7O0FBQzVDLFNBQUtDLFFBQUwsR0FBZ0JDLE9BQU8sQ0FBQ0MsSUFBeEIsQ0FIYyxDQUc4Qjs7QUFFNUMsU0FBS0MsSUFBTCxHQUFZQyxTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxLQUFLRixJQUFMLENBQVVHLFFBQVYsRUFBYjtBQUNBLFNBQUtDLFlBQUwsR0FBb0IsS0FBcEI7QUFD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QSxTQUFLeUYsV0FBTDtBQUNILEdBL1c2QjtBQWlYOUI7QUFDQUEsRUFBQUEsV0FBVyxFQUFDLHVCQUFVO0FBQ2xCLFNBQUtZLHFCQUFMO0FBQ0EsU0FBS2YscUJBQUw7QUFDQSxTQUFLbUYsc0JBQUw7QUFFSCxHQXZYNkI7QUF5WDlCO0FBQ0FjLEVBQUFBLGFBQWEsRUFBQyx5QkFBVTtBQUNwQixRQUFHLEtBQUs5QixXQUFSLEVBQW9CO0FBQ2hCLFdBQUtBLFdBQUwsQ0FBaUIrQixRQUFqQjtBQUNBLFdBQUsvQixXQUFMLEdBQW1CLElBQW5CO0FBQ0g7O0FBQ0QsUUFBRyxLQUFLbUIsVUFBUixFQUFtQjtBQUNmLFdBQUtBLFVBQUwsQ0FBZ0JZLFFBQWhCO0FBQ0EsV0FBS1osVUFBTCxHQUFrQixJQUFsQjtBQUNIOztBQUVELFFBQUcsS0FBSzFILGNBQVIsRUFBdUI7QUFDbkIsV0FBS0EsY0FBTCxDQUFvQnVELGNBQXBCO0FBQ0EsV0FBS3ZELGNBQUwsQ0FBb0J3RCxXQUFwQjtBQUVIOztBQUNBLFNBQUtuSCxJQUFMLENBQVV3RSxxQkFBVixDQUFnQyxLQUFoQztBQUNKO0FBMVk2QixDQUFULENBQXpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMi0xOCAxNzo1MjoxMFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBIYWxsb3dzRXZlbnQgPSByZXF1aXJlKFwiaGFsbG93c19ldmVudFwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIEhhbGxvd3NUYXNrSXRlbSA9IHJlcXVpcmUoXCJoYWxsb3dzX3Rhc2tfaXRlbV9wYW5lbFwiKTtcbnZhciBQYXJ0bmVyQ2FsY3VsYXRlID0gcmVxdWlyZShcInBhcnRuZXJfY2FsY3VsYXRlXCIpO1xuXG52YXIgSGFsbG93c190YXNrV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImhhbGxvd3NcIiwgXCJoYWxsb3dzX3Rhc2tfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLnJsZWFzZVByZWZhYiA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmF0dHJfYmdzID0gW107XG4gICAgICAgIHRoaXMuYmFzZV9hdHRyX2xpc3QgPSB7fVxuICAgICAgICB0aGlzLmFsbF9oYWxsb3dzX2lkID0gW107IC8vIOaJgOacieelnuWZqGlkKOacieW6j++8jOe/u+mhteaMiemSrueUqClcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSAwIFx0XHQgLy/lvZPliY3pgInkuK3nmoTnpZ7lmajlnKhhbGxfaGFsbG93c19pZOeahOS4i+agh1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucm9vdF93bmQsIFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLmJnID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5yb290X3duZCwgXCJiYWNrZ3JvdW5kXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRCaWdCZyhcImJpZ2JnXzY4XCIsXCJqcGdcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIFxuXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9wYW5lbFwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGl0bGVfYmcgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZV9iZ1wiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzIwMTVcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy50aXRsZV9iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5za2lsbF9iZyA9IHRoaXMubWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNraWxsX2JnXCIpO1xuXG4gICAgICAgIHRoaXMuc2tpbGxfYmdfaW1nID0gdGhpcy5za2lsbF9iZy5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzEwOTJcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5za2lsbF9iZ19pbWcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYm90dG9tX2JnXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhhbGxvd3NcIixcImhhbGxvd3NfMTAwMVwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9iZy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhc2tfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJ0YXNrX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJhdHRyX3BhbmVsXCIpO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hdHRyX2JnXzEgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJhdHRyX2JnXzFcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuYXR0cl9iZ18yID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9iZ18yXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhhbGxvd3NcIixcImhhbGxvd3NfMTAwN1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLmF0dHJfYmdfMS5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMuYXR0cl9iZ18yLnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLm1heF9iZ19sID0gdGhpcy5hdHRyX3BhbmVsLmdldENoaWxkQnlOYW1lKFwibWF4X2JnX2xcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubWF4X2JnX3IgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJtYXhfYmdfclwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoYWxsb3dzXCIsXCJoYWxsb3dzXzEwMDVcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5tYXhfYmdfbC5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMubWF4X2JnX3Iuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX2JnXzIgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJib3R0b21fYmdfMlwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldENvbW1vbkljb21QYXRoKFwiY29tbW9uXzIwMDdcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5ib3R0b21fYmdfMi5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICB0aGlzLmRlc2NfbGFiZWwgPSB0aGlzLmF0dHJfcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJkZXNjX2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuZGVzY19sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWHuuaImOeVjOmdoumAieaLqeepv+aItOa/gOa0u+elnuWZqOaKgOiDveWSjOS4u+WxnuaAp1wiKTtcblxuICAgICAgICB0aGlzLmdvX2JhdHRsZV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmF0dHJfcGFuZWwsXCJnb19iYXR0bGVfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMuaGFsbG93c19uYW1lID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwiaGFsbG93c19uYW1lXCIsY2MuTGFiZWwpO1xuXG4gICAgICAgIHRoaXMuZXhwbGFpbl9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJleHBsYWluX2J0blwiKTtcblxuICAgICAgICB0aGlzLmFydGlmYWN0X2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCxcImFydGlmYWN0X2J0blwiKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMudG91Y2hfbGF5b3V0ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwidG91Y2hfbGF5b3V0XCIpO1xuXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fcGFuZWwsXCJwcm9ncmVzc1wiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xuICAgICAgICB0aGlzLnByb2dyZXNzX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwidmFsdWVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLmxlZnRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwibGVmdF9idG5cIik7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwicmlnaHRfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMubGlzdF92aWV3ID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX3BhbmVsLFwibGlzdF92aWV3XCIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cl9iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9wYW5lbCxcImF0dHJfYmdfXCIraSk7XG4gICAgICAgICAgICB0aGlzLmF0dHJfYmdzW2ldID0gYXR0cl9iZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsbG93c19lZmZfbm9kZSA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiKTtcbiAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zayAgICA9IHRoaXMuc2Vla0NoaWxkKFwiaGFsbG93c19lZmZfbm9kZVwiLCBzcC5Ta2VsZXRvbik7XG5cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5hcnRpZmFjdF9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1ByZXZpZXdXaW5kb3codHJ1ZSk7XG4gICAgICAgIH0sdGhpcyk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmdvX2JhdHRsZV9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGFuZ2VNYWluVUlTdGF0dXMoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c01haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2NvbnN0LmdhbWVfcnVsZVxuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoY29uZmlnLmRlc2MsIHBvcyxudWxsLG51bGwsNTAwKTsgICAgICAgICAgICBcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLmxlZnRfYnRuLm9uKFwiY2xpY2tcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLk5vcm1hbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrQnRuTGVmdCgpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yaWdodF9idG4ub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tCdG5SaWdodCgpO1xuICAgICAgICB9LHRoaXMpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy50b3VjaF9sYXlvdXQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIGlmKHRoaXMuaGFsbG93c19pZCl7XG4gICAgICAgICAgICAgICAgdmFyIG1heF92byA9IHRoaXMubW9kZWwubWFrZUhpZ2hlc3RIYWxsb3dWbyh0aGlzLmhhbGxvd3NfaWQpXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5IYWxsb3dzVGlwcyh0cnVlLG1heF92byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgLy/ku7vliqHlj5jljJZcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuVXBkYXRlSGFsbG93c1Rhc2tFdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIYWxsb3dzVGFza0luZm8oKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvL+elnuWZqOaVsOaNruabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhhbGxvd3NFdmVudC5IYWxsb3dzVXBkYXRlRXZlbnQsIGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgaWYoaWQgPT0gdGhpcy5oYWxsb3dzX2lkKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/mv4DmtLvlnKPlmahcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuSGFsbG93c0FjdGl2aXR5RXZlbnQsZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBoYWxsb3dzX2lkID0gdGhpcy5tb2RlbC5nZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCgpO1xuICAgICAgICAgICAgaWYoaGFsbG93c19pZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2lkID0gaGFsbG93c19pZDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRVbmxvY2tIYWxsb3dzRGF0YShoYWxsb3dzX2lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/mmL7npLrkuLrmn5DkuIDnpZ7lmajvvIjku47miYDmnInnpZ7lmajpooTop4jnlYzpnaLmiZPlvIDvvIlcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIYWxsb3dzRXZlbnQuVW5kYXRlSGFsbG93c0luZm9FdmVudCxmdW5jdGlvbihpZCl7XG4gICAgICAgICAgICBpZihpZCAmJiB0aGlzLmhhbGxvd3NfaWQgIT0gaWQpe1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19pZCA9IGlkO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFVubG9ja0hhbGxvd3NEYXRhKGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKGhhbGxvd3NfaWQpe1xuICAgICAgICB2YXIgaGFsbG93c19pZCA9IGhhbGxvd3NfaWQgfHwgdGhpcy5tb2RlbC5nZXRDdXJBY3Rpdml0eUhhbGxvd3NJZCgpO1xuICAgICAgICBpZihoYWxsb3dzX2lkKXtcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19pZCA9IGhhbGxvd3NfaWQ7XG4gICAgICAgICAgICB0aGlzLmluaXRVbmxvY2tIYWxsb3dzRGF0YShoYWxsb3dzX2lkKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuvue9ruW3suino+mUgeWSjOato+WcqOi/m+ihjOeahOelnuWZqOaVsOaNrlxuICAgIGluaXRVbmxvY2tIYWxsb3dzRGF0YTpmdW5jdGlvbihoYWxsb3dzX2lkKXtcbiAgICAgICAgdGhpcy5hbGxfaGFsbG93c19pZCA9IFtdO1xuICAgICAgICB2YXIgYWN0aXZpdHlfaWQgPSB0aGlzLm1vZGVsLmdldEN1ckFjdGl2aXR5SGFsbG93c0lkKCkgLy8g5q2j5Zyo6L+b6KGM5Lit55qE56We5ZmoaWRcbiAgICAgICAgZm9yICh2YXIgaSBpbiBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfYmFzZSkge1xuICAgICAgICAgICAgdmFyIHRlbXBDZmcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfYmFzZVtpXTtcbiAgICAgICAgICAgIGlmKHRoaXMubW9kZWwuZ2V0SGFsbG93c0J5SWQodGVtcENmZy5pZCkgfHwgdGVtcENmZy5pZCA9PSBhY3Rpdml0eV9pZCl7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxfaGFsbG93c19pZC5wdXNoKHRlbXBDZmcuaWQpO1xuICAgICAgICAgICAgICAgIGlmKGhhbGxvd3NfaWQgJiYgdGVtcENmZy5pZCA9PSBoYWxsb3dzX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfaW5kZXggPSB0aGlzLmFsbF9oYWxsb3dzX2lkLmxlbmd0aC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRfYnRuLmFjdGl2ZSA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoPjE7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuLmFjdGl2ZSA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoPjE7XG4gICAgfSxcblxuICAgIHVwZGF0ZUhhbGxvd3NCYXNlSW5mbzpmdW5jdGlvbigpe1xuICAgICAgICBpZighdGhpcy5oYWxsb3dzX2lkKXJldHVybjtcbiAgICAgICAgdmFyIGhhbGxvd3NfY29uZmlnID0gQ29uZmlnLmhhbGxvd3NfZGF0YS5kYXRhX2Jhc2VbdGhpcy5oYWxsb3dzX2lkXTtcbiAgICAgICAgaWYoIWhhbGxvd3NfY29uZmlnKXJldHVybjtcbiAgICAgICAgaWYodGhpcy5oYWxsb3dzX21vZGVsX2lkICE9IGhhbGxvd3NfY29uZmlnLmVmZmVjdCl7XG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfbW9kZWxfaWQgPSBoYWxsb3dzX2NvbmZpZy5lZmZlY3Q7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGxvd3NfZWZmX3NrKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX3NrLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYWxsb3dzX25hbWUuc3RyaW5nID0gaGFsbG93c19jb25maWcubmFtZTtcbiAgICAgICAgaWYodGhpcy5tb2RlbC5nZXRIYWxsb3dzQnlJZCh0aGlzLmhhbGxvd3NfaWQpKXtcbiAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKGZhbHNlLCB0aGlzLmhhbGxvd3NfbW9kZWwpXG4gICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX25vZGUuY29sb3IgPSBuZXcgY2MuQ29sb3IoMjU1LDI1NSwyNTUsMjU1KTtcbiAgICAgICAgICAgIHZhciBhbmltYV9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKHRoaXMuaGFsbG93c19tb2RlbF9pZCwgXCJhY3Rpb25cIik7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMoYW5pbWFfcGF0aCwgZnVuY3Rpb24oc2tlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbGxvd3NfZWZmX3NrLnNrZWxldG9uRGF0YSA9IHNrZV9kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suc2V0QW5pbWF0aW9uKDAsIFBsYXllckFjdGlvbi5hY3Rpb25fMiwgdHJ1ZSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKHRydWUsIHRoaXMuaGFsbG93c19tb2RlbClcbiAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfbm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcigxNjksMTY5LDE2OSwyNTUpO1xuICAgICAgICAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgodGhpcy5oYWxsb3dzX21vZGVsX2lkLCBcImFjdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhhbmltYV9wYXRoLCBmdW5jdGlvbihza2VfZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFsbG93c19lZmZfc2suc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRBbmltYXRpb24oMCwgUGxheWVyQWN0aW9uLmFjdGlvbl8xLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlSGFsbG93c1Rhc2tJbmZvOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKCF0aGlzLmhhbGxvd3NfaWQpcmV0dXJuO1xuICAgICAgICAvL+WIpOaWreaYr+WQpuW3suiOt+W+l1xuICAgICAgICBpZih0aGlzLm1vZGVsLmdldEhhbGxvd3NCeUlkKHRoaXMuaGFsbG93c19pZCkpe1xuICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRhc2tfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gMTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NfdmFsdWUuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlt7LlrozmiJBcIik7XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5iYXNlX2F0dHJfbGlzdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdFtpXS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGhhbGxvd3NfYmFzZSA9IGdkYXRhKFwiaGFsbG93c19kYXRhXCIsXCJkYXRhX2luZm9cIixVdGlscy5nZXROb3JLZXkodGhpcy5oYWxsb3dzX2lkLCAxKSk7XG4gICAgICAgICAgICBpZihoYWxsb3dzX2Jhc2Upe1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBoYWxsb3dzX2Jhc2UuYXR0cil7XG4gICAgICAgICAgICAgICAgICAgIGlmKGo+MilicmVhazsvL1VJ5Y+q5pSv5oyB5pi+56S65Lik5Liq5oqA6IO9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyX2tleSA9IGhhbGxvd3NfYmFzZS5hdHRyW2pdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl92YWwgPSBoYWxsb3dzX2Jhc2UuYXR0cltqXVsxXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9uYW1lID0gQ29uZmlnLmF0dHJfZGF0YS5kYXRhX2tleV90b19uYW1lW2F0dHJfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYoYXR0cl9uYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyX3RleHQgPSB0aGlzLmJhc2VfYXR0cl9saXN0W2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWF0dHJfdGV4dCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl90ZXh0ID0gVXRpbHMuY3JlYXRlUmljaExhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMTAwLDUwLDM1LDI1NSksIGNjLnYyKDAsIDAuNSksIGNjLnYyKDIwLCAyMCksIDMwLCAzODApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl90ZXh0Lmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cl9iZyA9IHRoaXMuYXR0cl9iZ3NbcGFyc2VJbnQoaikrMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9iZy5hZGRDaGlsZChhdHRyX3RleHQubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXNlX2F0dHJfbGlzdFtqXSA9IGF0dHJfdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfdGV4dC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGljb24gPSBQYXRoVG9vbC5nZXRBdHRySWNvbkJ5U3RyKGF0dHJfa2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzX3BlciA9IFBhcnRuZXJDYWxjdWxhdGUuaXNTaG93UGVyQnlTdHIoYXR0cl9rZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpc19wZXIgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl92YWwgPSAoYXR0cl92YWwvMTApK1wiJVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJfc3RyID0gY2MuanMuZm9ybWF0U3RyKFwiPGltZyBzcmM9JyVzJy8+IDxjb2xvcj0jNjQzMjIzPiAlcyVz77yaPC9jPjxjb2xvcj0jNjQzMjIzPiVzPC9jPlwiLCBpY29uLCBVdGlscy5USTE4TihcIuWFqOmYn1wiKSwgYXR0cl9uYW1lLCBhdHRyX3ZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQuc3RyaW5nID0gYXR0cl9zdHI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoaWNvbiksIChmdW5jdGlvbihhdHRyX3RleHQscmVzT2JqZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3RleHQuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyxhdHRyX3RleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRhc2tfcGFuZWwuYWN0aXZlID0gdHJ1ZTtcbiAgICBcbiAgICAgICAgICAgIHZhciB0YXNrX2xpc3QgPSB0aGlzLm1vZGVsLmdldEhhbGxvd3NUYXNrTGlzdCh0aGlzLmhhbGxvd3NfaWQpXG4gICAgICAgICAgICBpZiAodGFza19saXN0KXtcbiAgICAgICAgICAgICAgICB2YXIgbWF4X251bSA9IHRhc2tfbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGN1cl9udW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvcih2YXIgayBpbiB0YXNrX2xpc3Qpe1xuICAgICAgICAgICAgICAgICAgICBpZih0YXNrX2xpc3Rba10uZmluaXNoID09IDIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX251bSA9IGN1cl9udW0gKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gY3VyX251bSAvIG1heF9udW07XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzcy5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc192YWx1ZS5zdHJpbmcgPSBjdXJfbnVtK1wiL1wiK21heF9udW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMuc2Nyb2xsX3ZpZXcgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLmxpc3Rfdmlldy5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtX2NsYXNzOiBIYWxsb3dzVGFza0l0ZW0sIC8vIOWNleWFg+exuyBcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfeDogMCwgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgICAgICAgICBzcGFjZV94OiAxMCwgLy8geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgICAgICAgICBzdGFydF95OiAwLCAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlX3k6IDQsIC8vIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgICAgICAgICAgaXRlbV93aWR0aDogMzMxLCAvLyDljZXlhYPnmoTlsLrlr7h3aWR0aFxuICAgICAgICAgICAgICAgICAgICBpdGVtX2hlaWdodDogMTM5LCAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgcm93OiAwLCAvLyDooYzmlbDvvIzkvZznlKjkuo7msLTlubPmu5rliqjnsbvlnotcbiAgICAgICAgICAgICAgICAgICAgY29sOiAyLCAvLyDliJfmlbDvvIzkvZznlKjkuo7lnoLnm7Tmu5rliqjnsbvlnotcbiAgICAgICAgICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5jcmVhdGVTY3JvbGwodGhpcy5saXN0X3ZpZXcsIG51bGwsIG51bGwsIG51bGwsIHNpemUsIHNldHRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldERhdGEodGFza19saXN0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8vIOelnuWZqOaKgOiDvVxuICAgIHVwZGF0ZUhhbGxvd3NTa2lsbEluZm86ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMuaGFsbG93c19pZClyZXR1cm47XG4gICAgICAgIHZhciBoYWxsb3dzX3NraWxsID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfc2tpbGxfdXBcIixVdGlscy5nZXROb3JLZXkodGhpcy5oYWxsb3dzX2lkLCAxKSkgLy8g5pi+56S6Mee6p+aXtueahOaKgOiDvVxuICAgICAgICBpZihoYWxsb3dzX3NraWxsICYmIGhhbGxvd3Nfc2tpbGwuc2tpbGxfYmlkICE9IDApe1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwic2tpbGxfZGF0YVwiLFwiZGF0YV9nZXRfc2tpbGxcIixoYWxsb3dzX3NraWxsLnNraWxsX2JpZCkgfHwge307XG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9pY29uKXtcbiAgICAgICAgICAgICAgICB2YXIgU2tpbGxJdGVtID0gcmVxdWlyZShcInNraWxsX2l0ZW1cIilcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2ljb24gICA9IG5ldyBTa2lsbEl0ZW0oKTsvL3RydWUsdHJ1ZSx0cnVlLDAuOVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXRQYXJlbnQodGhpcy5za2lsbF9iZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uLnNldFNjYWxlKDAuOSk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uLnNldExldmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXRQb3NpdGlvbihjYy52Mig3NSwgNzApKSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5zZXREYXRhKGNvbmZpZy5iaWQpO1xuXG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9uYW1lKXsvL+minOiJsumcgOS/ruaUuVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfbmFtZSA9IFV0aWxzLmNyZWF0ZUxhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMjU1LDIzOCwxOTQsMjU1KSwgbnVsbCwgMTM1LCA4MCwgXCJcIiwgdGhpcy5za2lsbF9iZywgMSwgY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5za2lsbF9uYW1lLnN0cmluZyA9IGNvbmZpZy5uYW1lO1xuXG4gICAgICAgICAgICBpZighdGhpcy5za2lsbF9kZXNjKXsvL+minOiJsumcgOS/ruaUuVxuICAgICAgICAgICAgICAgIHRoaXMuc2tpbGxfZGVzYyA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMCwgbmV3IGNjLkNvbG9yKDI1NSwyMzgsMTk0LDI1NSksY2MudjIoMCwxKSwgY2MudjIoMTM1LDgwKSwgMzAsIDUwMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF9kZXNjLmhvcml6b250YWxBbGlnbiA9IGNjLm1hY3JvLlRleHRBbGlnbm1lbnQuTEVGVDtcbiAgICAgICAgICAgICAgICB0aGlzLnNraWxsX2JnLmFkZENoaWxkKHRoaXMuc2tpbGxfZGVzYy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpbGxfZGVzYy5zdHJpbmcgPSBjb25maWcuZGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy8g5ZCR5bem57+76aG1XG4gICAgX29uQ2xpY2tCdG5MZWZ0OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuY3VyX2luZGV4ID0gdGhpcy5jdXJfaW5kZXggLSAxXG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4IDwgMCl7XG4gICAgICAgICAgICB0aGlzLmN1cl9pbmRleCA9IHRoaXMuYWxsX2hhbGxvd3NfaWQubGVuZ3RoLTFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbGxvd3NfaWQgPSB0aGlzLmFsbF9oYWxsb3dzX2lkW3RoaXMuY3VyX2luZGV4XVxuICAgICAgICB0aGlzLnJlZnJlc2hWaWV3KClcbiAgICB9LFxuICAgIFxuICAgIFxuICAgIC8vIC0tIOWQkeWPs+e/u+mhtVxuICAgIF9vbkNsaWNrQnRuUmlnaHQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSB0aGlzLmN1cl9pbmRleCArIDFcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPj0gdGhpcy5hbGxfaGFsbG93c19pZC5sZW5ndGgpe1xuICAgICAgICAgICAgdGhpcy5jdXJfaW5kZXggPSAwXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYWxsb3dzX2lkID0gdGhpcy5hbGxfaGFsbG93c19pZFt0aGlzLmN1cl9pbmRleF1cbiAgICAgICAgdGhpcy5yZWZyZXNoVmlldygpXG4gICAgfSxcblxuICAgIC8vIOWIt+aWsOeVjOmdolxuICAgIHJlZnJlc2hWaWV3OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c0Jhc2VJbmZvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1Rhc2tJbmZvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSGFsbG93c1NraWxsSW5mbygpO1xuXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuc2Nyb2xsX3ZpZXcpe1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5za2lsbF9pY29uKXtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxfaWNvbi5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5za2lsbF9pY29uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuaGFsbG93c19lZmZfc2spe1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5oYWxsb3dzX2VmZl9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c01haW5XaW5kb3coZmFsc2UpXG4gICAgfSxcbiAgICBcbn0pIl19
|