|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/voyage/view/voyage_main_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, '09a99xrtDJLHpoJEKE75Ygs', 'voyage_main_window');
|
// Scripts/mod/voyage/view/voyage_main_window.js
|
|
"use strict";
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里是描述这个窗体的作用的
|
// <br/>Create: 2019-03-07 11:23:08
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var RoleController = require("role_controller");
|
|
var CommonScrollView = require("common_scrollview");
|
|
var VoyageController = require("voyage_controller");
|
|
var VoyageEvent = require("voyage_event");
|
|
var BackPackConst = require("backpack_const");
|
|
var BackpackController = require("backpack_controller");
|
|
var VoyageOrderItem = require("voyage_order_item");
|
|
var VoyageConst = require("voyage_const");
|
|
var Voyage_mainWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("voyage", "voyage_main_window");
|
this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Big; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
this.ctrl = VoyageController.getInstance();
|
this.model = this.ctrl.getModel();
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild("background");
|
this.background.scale = FIT_SCALE;
|
this.main_container = this.seekChild("main_container");
|
this.top_bg_sp = this.seekChild(this.main_container, "top_bg", cc.Sprite);
|
this.loadRes(PathTool.getBigBg("txt_cn_bigbg_22"), function (res) {
|
this.top_bg_sp.spriteFrame = res;
|
}.bind(this));
|
this.refresh_btn_nd = this.seekChild("refresh_btn");
|
this.refresh_btn_lb = this.seekChild(this.refresh_btn_nd, "label", cc.Label);
|
this.refresh_btn_img_sp = this.seekChild(this.refresh_btn_nd, "img", cc.Sprite);
|
this.refresh_btn_img_sp.node.active = false;
|
this.special_btn_nd = this.seekChild("special_btn");
|
this.explain_btn_nd = this.seekChild("explain_btn");
|
this.special_sk = this.seekChild(this.special_btn_nd, "special_sk", sp.Skeleton);
|
this.progress_pb = this.seekChild(this.main_container, "progress", cc.ProgressBar);
|
this.progress_pb.progress = 0;
|
this.progress_value_lb = this.seekChild(this.main_container, "progress_value", cc.Label);
|
this.no_order_image_nd = this.seekChild(this.main_container, "no_order_image"); //刷新道具消耗
|
|
var cost_config = Config.shipping_data.data_const["refresh_cost"];
|
this.cost_item_bid = cost_config.val[0][0];
|
this.cost_item_num = cost_config.val[0][1];
|
this.item_count_lb = this.seekChild(this.main_container, "item_count", cc.Label);
|
var item_config = Utils.getItemConfig(this.cost_item_bid);
|
var res_icon_sp = this.seekChild(this.main_container, "res_icon", cc.Sprite);
|
var item_icon_sp = this.seekChild(this.main_container, "item_icon", cc.Sprite);
|
this.loadRes(PathTool.getItemRes(7), function (sf_obj) {
|
res_icon_sp.spriteFrame = sf_obj;
|
}.bind(this));
|
this.loadRes(PathTool.getItemRes(item_config.icon), function (sf_obj) {
|
item_icon_sp.spriteFrame = sf_obj;
|
}.bind(this));
|
var order_list_nd = this.seekChild(this.main_container, "order_list");
|
var bgSize = order_list_nd.getContentSize();
|
var tab_size = cc.size(bgSize.width - 10, bgSize.height - 10);
|
var setting = {
|
item_class: VoyageOrderItem,
|
// 单元类
|
start_x: 5,
|
// 第一个单元的X起点
|
space_x: 0,
|
// x方向的间隔
|
start_y: 0,
|
// 第一个单元的Y起点
|
space_y: 0,
|
// y方向的间隔
|
item_width: 631,
|
// 单元的尺寸width
|
item_height: 171,
|
// 单元的尺寸height
|
row: 0,
|
// 行数,作用于水平滚动类型
|
col: 1,
|
// 列数,作用于垂直滚动类型
|
need_dynamic: true
|
};
|
this.order_scrollview = new CommonScrollView();
|
this.order_scrollview.createScroll(order_list_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, tab_size, setting, cc.v2(0.5, 0.5));
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
Utils.onTouchEnd(this.background, function () {
|
this.ctrl.openVoyageMainWindow(false);
|
}.bind(this), 2);
|
this.explain_btn_nd.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(1);
|
var explain_config = Config.shipping_data.data_explain[1];
|
var pos = event.touch.getLocation();
|
if (explain_config) require("tips_controller").getInstance().showCommonTips(StringUtil.parse(explain_config.desc), pos);
|
});
|
this.special_btn_nd.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(1);
|
var pos = event.touch.getLocation();
|
|
this._onClickSpecialBtn(pos);
|
}, this);
|
Utils.onTouchEnd(this.refresh_btn_nd, function () {
|
var is_first = this.model.getFirstFresh();
|
var p_1 = RoleController.getInstance().getModel().checkPrivilegeStatus(3);
|
var p_2 = RoleController.getInstance().getModel().checkPrivilegeStatus(2);
|
|
if (is_first && !p_1 && !p_2) {
|
var refresh_config = Config.shipping_data.data_refresh[this.role_vo.vip_lev];
|
if (!refresh_config) return;
|
var free_times = this.model.getFreeTimes();
|
var free_count = refresh_config.free_times; //免费刷新上限
|
|
if (free_times >= free_count) {
|
this.ctrl.send23820();
|
|
var fun = function () {
|
require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.PRIVILEGE);
|
|
this.ctrl.openVoyageMainWindow(false);
|
}.bind(this);
|
|
var str = cc.js.formatStr(Utils.TI18N("获取远航特权,<color=#c92606>每日首次</c>钻石、刷新券刷新必出<color=#c92606>高品质</c>远航任务,完成可获高额奖励!!!"));
|
|
require("commonalert").show(str, Utils.TI18N("立即前往"), fun, Utils.TI18N("残忍拒绝"), null, 1);
|
|
return;
|
}
|
}
|
|
if (this.model.checkIsHaveHigherEpicOrder()) {
|
var fun = function () {
|
this.ctrl.requestRefreshOrder();
|
}.bind(this);
|
|
var str = cc.js.formatStr(Utils.TI18N("有紫色以上的远航任务未接取,是否继续?"));
|
|
require("commonalert").show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 1);
|
} else {
|
this.ctrl.requestRefreshOrder();
|
}
|
}.bind(this), 1); //更新所有订单数据
|
|
this.addGlobalEvent(VoyageEvent.UpdateVoyageDataEvent, function () {
|
this.refreshOrderList();
|
this.refreshBtnStatus();
|
}, this); //删除订单
|
|
this.addGlobalEvent(VoyageEvent.DeleteOrderDataEvent, function () {
|
this.refreshOrderList();
|
}, this);
|
|
if (this.role_assets_event == null) {
|
if (this.role_vo == null) {
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
}
|
|
this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
|
if (key == "energy") {
|
this.refreshProgressInfo();
|
} else if (key == "vip_lev") {
|
this.refreshBtnStatus();
|
}
|
}, this);
|
} //刷新道具数量更新
|
|
|
this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}, this);
|
this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}, this);
|
this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, item_list) {
|
if (bag_code != BackPackConst.Bag_Code.BACKPACK) return;
|
this.checkNeedUpdateItemNum(item_list);
|
}, this);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd() {
|
//判断本地是否有订单缓存数据,没有则请求
|
if (this.model.checkIsHaveOrderData()) {
|
this.refreshOrderList();
|
this.refreshBtnStatus();
|
} else {
|
this.ctrl.requestVoyageInfo();
|
}
|
|
this.refreshProgressInfo();
|
this.refreshItemNum();
|
this.updateSpecialEffectStatus();
|
},
|
//更新所有订单列表
|
refreshOrderList: function refreshOrderList() {
|
var order_data = this.model.getAllOrderList();
|
|
if (!order_data || Utils.next(order_data) == null) {
|
// this.no_order_image_nd.active = true;
|
this.no_order_image_nd.setPosition(0, 0);
|
|
if (this.no_order_image_sp == null) {
|
this.no_order_image_sp = this.no_order_image_nd.getComponent(cc.Sprite);
|
this.loadRes(PathTool.getBigBg("bigbg_3"), function (sp) {
|
this.no_order_image_sp.spriteFrame = sp;
|
}.bind(this));
|
}
|
|
this.order_scrollview.setData([]);
|
} else {
|
var _temp_sort_index;
|
|
//排序规则 已完成>可接取>进行中
|
var temp_sort_index = (_temp_sort_index = {}, _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Finish, 1), _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Unget, 2), _defineProperty(_temp_sort_index, VoyageConst.Order_Status.Underway, 3), _temp_sort_index);
|
|
var sortFunc = function sortFunc(objA, objB) {
|
var sort_index_a = temp_sort_index[objA.status];
|
var sort_index_b = temp_sort_index[objB.status]; //引导需要订单号为1的放在最前面
|
|
if (objA.order_id == 1 && objA.status == VoyageConst.Order_Status.Unget && objB.order_id != 1) {
|
return -1;
|
} else if (objA.order_id != 1 && objB.order_id == 1 && objB.status == VoyageConst.Order_Status.Unget) {
|
return 1;
|
} else if (sort_index_a == sort_index_b) {
|
//未接取的按照品质排序,已接取和已完成的按照完成时间排序
|
if (objA.status == VoyageConst.Order_Status.Unget) {
|
return objB.config.quality - objA.config.quality;
|
} else {
|
return objA.end_time - objB.end_time;
|
}
|
} else {
|
return sort_index_a - sort_index_b;
|
}
|
};
|
|
order_data.sort(sortFunc);
|
|
for (var i in order_data) {
|
order_data[i].index = i;
|
}
|
|
this.order_scrollview.setData(order_data); // this.no_order_image_nd.active = false;
|
|
this.no_order_image_nd.setPosition(1000, 0);
|
}
|
},
|
//更新刷新按钮状态
|
refreshBtnStatus: function refreshBtnStatus() {
|
var refresh_config = Config.shipping_data.data_refresh[this.role_vo.vip_lev];
|
if (!refresh_config) return;
|
var free_times = this.model.getFreeTimes();
|
var free_count = refresh_config.free_times; //免费刷新上限
|
|
if (free_times < free_count) {
|
this.refresh_btn_lb.string = Utils.TI18N("免费刷新");
|
this.refresh_btn_img_sp.node.active = false;
|
return;
|
} //道具
|
|
|
var count = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_item_bid);
|
|
if (count >= this.cost_item_num) {
|
var item_config = Utils.getItemConfig(this.cost_item_bid);
|
var res = PathTool.getItemRes(item_config.icon);
|
this.refresh_btn_lb.string = cc.js.formatStr(" %d 刷新", this.cost_item_num);
|
this.loadRes(res, function (sf_obj) {
|
this.refresh_btn_img_sp.spriteFrame = sf_obj;
|
}.bind(this));
|
this.refresh_btn_img_sp.node.active = true;
|
return;
|
} //钻石
|
|
|
var coin_times = this.model.getCoinTimes();
|
var coin_count = refresh_config.all_times;
|
|
if (coin_times < coin_count) {
|
var bid = refresh_config.expend[0][0];
|
var num = refresh_config.expend[0][1];
|
var item_config = Utils.getItemConfig(bid);
|
var res = PathTool.getItemRes(item_config.icon);
|
this.refresh_btn_lb.string = cc.js.formatStr(" %d 刷新", num);
|
this.loadRes(res, function (sf_obj) {
|
this.refresh_btn_img_sp.spriteFrame = sf_obj;
|
}.bind(this));
|
this.refresh_btn_img_sp.node.active = true;
|
return;
|
}
|
|
this.refresh_btn_lb.string = Utils.TI18N("刷新");
|
this.refresh_btn_img_sp.node.active = false;
|
},
|
//更新冒险情报进度
|
refreshProgressInfo: function refreshProgressInfo() {
|
if (this.role_vo) {
|
var cur_energy = this.role_vo.energy;
|
var max_energy = this.role_vo.energy_max;
|
var percent = cur_energy / max_energy;
|
this.progress_value_lb.string = cur_energy + "/" + max_energy;
|
this.progress_pb.progress = percent;
|
}
|
},
|
//更新刷新道具数量
|
refreshItemNum: function refreshItemNum() {
|
var count = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_item_bid);
|
this.item_count_lb.string = count;
|
},
|
checkNeedUpdateItemNum: function checkNeedUpdateItemNum(item_list) {
|
if (item_list == null || Utils.next(item_list) == null) return;
|
|
for (var k in item_list) {
|
var v = item_list[k];
|
|
if (v.config) {
|
var bid = v.config.id;
|
|
if (this.cost_item_bid && bid == this.cost_item_bid) {
|
this.refreshItemNum();
|
this.refreshBtnStatus();
|
break;
|
}
|
}
|
}
|
},
|
//刷新特效显示状态
|
updateSpecialEffectStatus: function updateSpecialEffectStatus() {
|
var one_time_pri = RoleController.getInstance().getModel().checkPrivilegeStatus(2);
|
var three_time_pri = RoleController.getInstance().getModel().checkPrivilegeStatus(3);
|
|
if (one_time_pri || three_time_pri) {
|
this.handleEffect(true);
|
} else {
|
this.handleEffect(false);
|
}
|
},
|
//激活特权特效显示
|
handleEffect: function handleEffect(status) {
|
if (status == false) {
|
if (this.special_sk) {
|
this.special_sk.setToSetupPose();
|
this.special_sk.clearTracks();
|
}
|
} else {
|
if (this.special_sk) {
|
var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(628));
|
this.loadRes(res, function (res_object) {
|
this.special_sk.skeletonData = res_object;
|
this.special_sk.setAnimation(1, PlayerAction.action, true);
|
}.bind(this));
|
}
|
}
|
},
|
_onClickSpecialBtn: function _onClickSpecialBtn(pos) {
|
var tips_str = "";
|
|
for (var i = 1; i <= 2; i++) {
|
var explain_config = Config.shipping_data.data_explain[i + 1];
|
|
if (explain_config) {
|
var status = RoleController.getInstance().getModel().checkPrivilegeStatus(i + 1);
|
var str = StringUtil.parse(explain_config.desc || "");
|
|
if (status) {
|
str = str + Utils.TI18N("<color=#249003> (已激活)</c>");
|
} else {
|
str = str + Utils.TI18N("<color=#c92606> (未激活)</c>");
|
}
|
|
if (i == 1) {
|
tips_str = str;
|
} else {
|
tips_str = tips_str + "\n\n\n" + str;
|
}
|
}
|
}
|
|
require("tips_controller").getInstance().showCommonTips(tips_str, cc.v2(pos.x, pos.y - 80));
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.order_scrollview) {
|
this.order_scrollview.deleteMe();
|
this.order_scrollview = null;
|
}
|
|
if (this.role_assets_event) {
|
this.role_vo.unbind(this.role_assets_event);
|
this.role_assets_event = null;
|
this.role_vo = null;
|
}
|
|
this.handleEffect(false);
|
|
var GuideEvent = require("guide_event");
|
|
gcore.GlobalEvent.fire(GuideEvent.CloseTaskEffect);
|
this.ctrl.openVoyageMainWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx2b3lhZ2VcXHZpZXdcXHZveWFnZV9tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkNvbW1vblNjcm9sbFZpZXciLCJWb3lhZ2VDb250cm9sbGVyIiwiVm95YWdlRXZlbnQiLCJCYWNrUGFja0NvbnN0IiwiQmFja3BhY2tDb250cm9sbGVyIiwiVm95YWdlT3JkZXJJdGVtIiwiVm95YWdlQ29uc3QiLCJWb3lhZ2VfbWFpbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJkaWFsb2d1ZSIsIndpbl90eXBlIiwiV2luVHlwZSIsIkJpZyIsImluaXRDb25maWciLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsIm1haW5fY29udGFpbmVyIiwidG9wX2JnX3NwIiwiU3ByaXRlIiwibG9hZFJlcyIsImdldEJpZ0JnIiwicmVzIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwicmVmcmVzaF9idG5fbmQiLCJyZWZyZXNoX2J0bl9sYiIsIkxhYmVsIiwicmVmcmVzaF9idG5faW1nX3NwIiwibm9kZSIsImFjdGl2ZSIsInNwZWNpYWxfYnRuX25kIiwiZXhwbGFpbl9idG5fbmQiLCJzcGVjaWFsX3NrIiwic3AiLCJTa2VsZXRvbiIsInByb2dyZXNzX3BiIiwiUHJvZ3Jlc3NCYXIiLCJwcm9ncmVzcyIsInByb2dyZXNzX3ZhbHVlX2xiIiwibm9fb3JkZXJfaW1hZ2VfbmQiLCJjb3N0X2NvbmZpZyIsIkNvbmZpZyIsInNoaXBwaW5nX2RhdGEiLCJkYXRhX2NvbnN0IiwiY29zdF9pdGVtX2JpZCIsInZhbCIsImNvc3RfaXRlbV9udW0iLCJpdGVtX2NvdW50X2xiIiwiaXRlbV9jb25maWciLCJVdGlscyIsImdldEl0ZW1Db25maWciLCJyZXNfaWNvbl9zcCIsIml0ZW1faWNvbl9zcCIsImdldEl0ZW1SZXMiLCJzZl9vYmoiLCJpY29uIiwib3JkZXJfbGlzdF9uZCIsImJnU2l6ZSIsImdldENvbnRlbnRTaXplIiwidGFiX3NpemUiLCJzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJzZXR0aW5nIiwiaXRlbV9jbGFzcyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJvcmRlcl9zY3JvbGx2aWV3IiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5Wb3lhZ2VNYWluV2luZG93Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJwbGF5QnV0dG9uU291bmQiLCJleHBsYWluX2NvbmZpZyIsImRhdGFfZXhwbGFpbiIsInBvcyIsInRvdWNoIiwiZ2V0TG9jYXRpb24iLCJzaG93Q29tbW9uVGlwcyIsIlN0cmluZ1V0aWwiLCJwYXJzZSIsImRlc2MiLCJfb25DbGlja1NwZWNpYWxCdG4iLCJpc19maXJzdCIsImdldEZpcnN0RnJlc2giLCJwXzEiLCJjaGVja1ByaXZpbGVnZVN0YXR1cyIsInBfMiIsInJlZnJlc2hfY29uZmlnIiwiZGF0YV9yZWZyZXNoIiwidmlwX2xldiIsImZyZWVfdGltZXMiLCJnZXRGcmVlVGltZXMiLCJmcmVlX2NvdW50Iiwic2VuZDIzODIwIiwiZnVuIiwib3BlblZpcE1haW5XaW5kb3ciLCJWSVBUQUJDT05TVCIsIlBSSVZJTEVHRSIsInN0ciIsImpzIiwiZm9ybWF0U3RyIiwiVEkxOE4iLCJzaG93IiwiY2hlY2tJc0hhdmVIaWdoZXJFcGljT3JkZXIiLCJyZXF1ZXN0UmVmcmVzaE9yZGVyIiwiYWRkR2xvYmFsRXZlbnQiLCJVcGRhdGVWb3lhZ2VEYXRhRXZlbnQiLCJyZWZyZXNoT3JkZXJMaXN0IiwicmVmcmVzaEJ0blN0YXR1cyIsIkRlbGV0ZU9yZGVyRGF0YUV2ZW50Iiwicm9sZV9hc3NldHNfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJyZWZyZXNoUHJvZ3Jlc3NJbmZvIiwiQUREX0dPT0RTIiwiYmFnX2NvZGUiLCJpdGVtX2xpc3QiLCJCYWdfQ29kZSIsIkJBQ0tQQUNLIiwiY2hlY2tOZWVkVXBkYXRlSXRlbU51bSIsIk1PRElGWV9HT09EU19OVU0iLCJERUxFVEVfR09PRFMiLCJvcGVuUm9vdFduZCIsImNoZWNrSXNIYXZlT3JkZXJEYXRhIiwicmVxdWVzdFZveWFnZUluZm8iLCJyZWZyZXNoSXRlbU51bSIsInVwZGF0ZVNwZWNpYWxFZmZlY3RTdGF0dXMiLCJvcmRlcl9kYXRhIiwiZ2V0QWxsT3JkZXJMaXN0IiwibmV4dCIsInNldFBvc2l0aW9uIiwibm9fb3JkZXJfaW1hZ2Vfc3AiLCJnZXRDb21wb25lbnQiLCJzZXREYXRhIiwidGVtcF9zb3J0X2luZGV4IiwiT3JkZXJfU3RhdHVzIiwiRmluaXNoIiwiVW5nZXQiLCJVbmRlcndheSIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJzb3J0X2luZGV4X2EiLCJzdGF0dXMiLCJzb3J0X2luZGV4X2IiLCJvcmRlcl9pZCIsImNvbmZpZyIsInF1YWxpdHkiLCJlbmRfdGltZSIsInNvcnQiLCJpIiwiaW5kZXgiLCJzdHJpbmciLCJjb3VudCIsImdldEl0ZW1OdW1CeUJpZCIsImNvaW5fdGltZXMiLCJnZXRDb2luVGltZXMiLCJjb2luX2NvdW50IiwiYWxsX3RpbWVzIiwiYmlkIiwiZXhwZW5kIiwibnVtIiwiY3VyX2VuZXJneSIsImVuZXJneSIsIm1heF9lbmVyZ3kiLCJlbmVyZ3lfbWF4IiwicGVyY2VudCIsImsiLCJ2IiwiaWQiLCJvbmVfdGltZV9wcmkiLCJ0aHJlZV90aW1lX3ByaSIsImhhbmRsZUVmZmVjdCIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJnZXRFZmZlY3RSZXMiLCJyZXNfb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiUGxheWVyQWN0aW9uIiwiYWN0aW9uIiwidGlwc19zdHIiLCJ4IiwieSIsImNsb3NlQ2FsbEJhY2siLCJkZWxldGVNZSIsInVuYmluZCIsIkd1aWRlRXZlbnQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkNsb3NlVGFza0VmZmVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUdGLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLFdBQVcsR0FBR0osT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUssYUFBYSxHQUFHTCxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSU0sa0JBQWtCLEdBQUdOLE9BQU8sQ0FBQyxxQkFBRCxDQUFoQzs7QUFDQSxJQUFJTyxlQUFlLEdBQUdQLE9BQU8sQ0FBQyxtQkFBRCxDQUE3Qjs7QUFDQSxJQUFJUSxXQUFXLEdBQUdSLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUVBLElBQUlTLGlCQUFpQixHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUM3QixhQUFTQyxRQURvQjtBQUU3QkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTCxHQUFrQmYsUUFBUSxD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LCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDov5nph4zmmK/mj4/ov7Dov5nkuKrnqpfkvZPnmoTkvZznlKjnmoRcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTA3IDExOjIzOjA4XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xudmFyIFZveWFnZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwidm95YWdlX2NvbnRyb2xsZXJcIik7XG52YXIgVm95YWdlRXZlbnQgPSByZXF1aXJlKFwidm95YWdlX2V2ZW50XCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgVm95YWdlT3JkZXJJdGVtID0gcmVxdWlyZShcInZveWFnZV9vcmRlcl9pdGVtXCIpO1xudmFyIFZveWFnZUNvbnN0ID0gcmVxdWlyZShcInZveWFnZV9jb25zdFwiKTtcblxudmFyIFZveWFnZV9tYWluV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcInZveWFnZVwiLCBcInZveWFnZV9tYWluX3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuQmlnOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLmN0cmwgPSBWb3lhZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9jb250YWluZXJcIik7XG5cbiAgICAgICAgdGhpcy50b3BfYmdfc3AgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRvcF9iZ1wiLCBjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJ0eHRfY25fYmlnYmdfMjJcIiksIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMudG9wX2JnX3NwLnNwcml0ZUZyYW1lID0gcmVzXG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX25kID0gdGhpcy5zZWVrQ2hpbGQoXCJyZWZyZXNoX2J0blwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG5fbmQsIFwibGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG5fbmQsIFwiaW1nXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX2J0bl9uZCA9IHRoaXMuc2Vla0NoaWxkKFwic3BlY2lhbF9idG5cIik7XG4gICAgICAgIHRoaXMuZXhwbGFpbl9idG5fbmQgPSB0aGlzLnNlZWtDaGlsZChcImV4cGxhaW5fYnRuXCIpO1xuICAgICAgICB0aGlzLnNwZWNpYWxfc2sgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNwZWNpYWxfYnRuX25kLCBcInNwZWNpYWxfc2tcIiwgc3AuU2tlbGV0b24pO1xuXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfcGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInByb2dyZXNzXCIsIGNjLlByb2dyZXNzQmFyKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IDA7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NfdmFsdWVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInByb2dyZXNzX3ZhbHVlXCIsIGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLm5vX29yZGVyX2ltYWdlX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJub19vcmRlcl9pbWFnZVwiKTtcblxuICAgICAgICAvL+WIt+aWsOmBk+WFt+a2iOiAl1xuICAgICAgICB2YXIgY29zdF9jb25maWcgPSBDb25maWcuc2hpcHBpbmdfZGF0YS5kYXRhX2NvbnN0W1wicmVmcmVzaF9jb3N0XCJdO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbV9iaWQgPSBjb3N0X2NvbmZpZy52YWxbMF1bMF07XG4gICAgICAgIHRoaXMuY29zdF9pdGVtX251bSA9IGNvc3RfY29uZmlnLnZhbFswXVsxXTtcbiAgICAgICAgdGhpcy5pdGVtX2NvdW50X2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJpdGVtX2NvdW50XCIsIGNjLkxhYmVsKTtcblxuICAgICAgICB2YXIgaXRlbV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKHRoaXMuY29zdF9pdGVtX2JpZCk7XG5cbiAgICAgICAgdmFyIHJlc19pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJyZXNfaWNvblwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB2YXIgaXRlbV9pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJpdGVtX2ljb25cIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEl0ZW1SZXMoNyksIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgIHJlc19pY29uX3NwLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKGl0ZW1fY29uZmlnLmljb24pLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICBpdGVtX2ljb25fc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB2YXIgb3JkZXJfbGlzdF9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwib3JkZXJfbGlzdFwiKVxuICAgICAgICB2YXIgYmdTaXplID0gb3JkZXJfbGlzdF9uZC5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICB2YXIgdGFiX3NpemUgPSBjYy5zaXplKGJnU2l6ZS53aWR0aCAtIDEwLCBiZ1NpemUuaGVpZ2h0IC0gMTApO1xuICAgICAgICB2YXIgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IFZveWFnZU9yZGVySXRlbSwgICAgICAvLyDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3g6IDUsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XG4gICAgICAgICAgICBzcGFjZV94OiAwLCAgICAgICAgICAgICAgICAgICAgLy8geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgc3RhcnRfeTogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFnotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3k6IDAsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIGl0ZW1fd2lkdGg6IDYzMSwgICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7h3aWR0aFxuICAgICAgICAgICAgaXRlbV9oZWlnaHQ6IDE3MSwgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuGhlaWdodFxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xuICAgICAgICAgICAgY29sOiAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIl+aVsO+8jOS9nOeUqOS6juWeguebtOa7muWKqOexu+Wei1xuICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmRlcl9zY3JvbGx2aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKVxuICAgICAgICB0aGlzLm9yZGVyX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKG9yZGVyX2xpc3RfbmQsIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCB0YWJfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LCAwLjUpKVxuXG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5iYWNrZ3JvdW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlblZveWFnZU1haW5XaW5kb3coZmFsc2UpXG4gICAgICAgIH0uYmluZCh0aGlzKSwgMilcblxuICAgICAgICB0aGlzLmV4cGxhaW5fYnRuX25kLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSk7XG4gICAgICAgICAgICB2YXIgZXhwbGFpbl9jb25maWcgPSBDb25maWcuc2hpcHBpbmdfZGF0YS5kYXRhX2V4cGxhaW5bMV07XG4gICAgICAgICAgICB2YXIgcG9zID0gZXZlbnQudG91Y2guZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgICAgIGlmIChleHBsYWluX2NvbmZpZylcbiAgICAgICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoU3RyaW5nVXRpbC5wYXJzZShleHBsYWluX2NvbmZpZy5kZXNjKSwgcG9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zcGVjaWFsX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKDEpO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrU3BlY2lhbEJ0bihwb3MpXG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMucmVmcmVzaF9idG5fbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpc19maXJzdCA9IHRoaXMubW9kZWwuZ2V0Rmlyc3RGcmVzaCgpO1xuICAgICAgICAgICAgdmFyIHBfMSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jaGVja1ByaXZpbGVnZVN0YXR1cygzKTtcbiAgICAgICAgICAgIHZhciBwXzIgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoMik7XG4gICAgICAgICAgICBpZiAoaXNfZmlyc3QgJiYgIXBfMSAmJiAhcF8yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZnJlc2hfY29uZmlnID0gQ29uZmlnLnNoaXBwaW5nX2RhdGEuZGF0YV9yZWZyZXNoW3RoaXMucm9sZV92by52aXBfbGV2XTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hfY29uZmlnKSByZXR1cm5cbiAgICAgICAgICAgICAgICB2YXIgZnJlZV90aW1lcyA9IHRoaXMubW9kZWwuZ2V0RnJlZVRpbWVzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZWVfY291bnQgPSByZWZyZXNoX2NvbmZpZy5mcmVlX3RpbWVzOy8v5YWN6LS55Yi35paw5LiK6ZmQXG4gICAgICAgICAgICAgICAgaWYgKGZyZWVfdGltZXMgPj0gZnJlZV9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZDIzODIwKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5QUklWSUxFR0UpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlblZveWFnZU1haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuiOt+WPlui/nOiIqueJueadg++8jDxjb2xvcj0jYzkyNjA2Puavj+aXpemmluasoTwvYz7pkrvnn7PjgIHliLfmlrDliLjliLfmlrDlv4Xlh7o8Y29sb3I9I2M5MjYwNj7pq5jlk4HotKg8L2M+6L+c6Iiq5Lu75Yqh77yM5a6M5oiQ5Y+v6I636auY6aKd5aWW5Yqx77yB77yB77yBXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpLnNob3coc3RyLCBVdGlscy5USTE4TihcIueri+WNs+WJjeW+gFwiKSwgZnVuLCBVdGlscy5USTE4TihcIuaui+W/jeaLkue7nVwiKSwgbnVsbCwgMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuY2hlY2tJc0hhdmVIaWdoZXJFcGljT3JkZXIoKSkge1xuICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0UmVmcmVzaE9yZGVyKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaciee0q+iJsuS7peS4iueahOi/nOiIquS7u+WKoeacquaOpeWPlu+8jOaYr+WQpue7p+e7re+8n1wiKSk7XG4gICAgICAgICAgICAgICAgcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpLnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RSZWZyZXNoT3JkZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/mm7TmlrDmiYDmnInorqLljZXmlbDmja5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChWb3lhZ2VFdmVudC5VcGRhdGVWb3lhZ2VEYXRhRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE9yZGVyTGlzdCgpXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hCdG5TdGF0dXMoKVxuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v5Yig6Zmk6K6i5Y2VXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoVm95YWdlRXZlbnQuRGVsZXRlT3JkZXJEYXRhRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE9yZGVyTGlzdCgpXG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92byA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwiZW5lcmd5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoUHJvZ3Jlc3NJbmZvKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gXCJ2aXBfbGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy/liLfmlrDpgZPlhbfmlbDph4/mm7TmlrBcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKSByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tOZWVkVXBkYXRlSXRlbU51bShpdGVtX2xpc3QpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGl0ZW1fbGlzdCkge1xuICAgICAgICAgICAgaWYgKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuQkFDS1BBQ0spIHJldHVyblxuICAgICAgICAgICAgdGhpcy5jaGVja05lZWRVcGRhdGVJdGVtTnVtKGl0ZW1fbGlzdCk7XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkRFTEVURV9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChiYWdfY29kZSAhPSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkJBQ0tQQUNLKSByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tOZWVkVXBkYXRlSXRlbU51bShpdGVtX2xpc3QpO1xuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL+WIpOaWreacrOWcsOaYr+WQpuacieiuouWNlee8k+WtmOaVsOaNru+8jOayoeacieWImeivt+axglxuICAgICAgICBpZiAodGhpcy5tb2RlbC5jaGVja0lzSGF2ZU9yZGVyRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hPcmRlckxpc3QoKVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0Vm95YWdlSW5mbygpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hQcm9ncmVzc0luZm8oKVxuICAgICAgICB0aGlzLnJlZnJlc2hJdGVtTnVtKClcbiAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsRWZmZWN0U3RhdHVzKClcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDmiYDmnInorqLljZXliJfooahcbiAgICByZWZyZXNoT3JkZXJMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcmRlcl9kYXRhID0gdGhpcy5tb2RlbC5nZXRBbGxPcmRlckxpc3QoKTtcbiAgICAgICAgaWYgKCFvcmRlcl9kYXRhIHx8IFV0aWxzLm5leHQob3JkZXJfZGF0YSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5zZXRQb3NpdGlvbigwLCAwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vX29yZGVyX2ltYWdlX3NwID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vX29yZGVyX2ltYWdlX3NwID0gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0QmlnQmcoXCJiaWdiZ18zXCIpLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub19vcmRlcl9pbWFnZV9zcC5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5zZXREYXRhKFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5o6S5bqP6KeE5YiZIOW3suWujOaIkD7lj6/mjqXlj5Y+6L+b6KGM5LitXG4gICAgICAgICAgICB2YXIgdGVtcF9zb3J0X2luZGV4ID0ge1xuICAgICAgICAgICAgICAgIFtWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuRmluaXNoXTogMSxcbiAgICAgICAgICAgICAgICBbVm95YWdlQ29uc3QuT3JkZXJfU3RhdHVzLlVuZ2V0XTogMixcbiAgICAgICAgICAgICAgICBbVm95YWdlQ29uc3QuT3JkZXJfU3RhdHVzLlVuZGVyd2F5XTogMyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzb3J0RnVuYyA9IGZ1bmN0aW9uIChvYmpBLCBvYmpCKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvcnRfaW5kZXhfYSA9IHRlbXBfc29ydF9pbmRleFtvYmpBLnN0YXR1c107XG4gICAgICAgICAgICAgICAgdmFyIHNvcnRfaW5kZXhfYiA9IHRlbXBfc29ydF9pbmRleFtvYmpCLnN0YXR1c107XG4gICAgICAgICAgICAgICAgLy/lvJXlr7zpnIDopoHorqLljZXlj7fkuLox55qE5pS+5Zyo5pyA5YmN6Z2iXG4gICAgICAgICAgICAgICAgaWYgKG9iakEub3JkZXJfaWQgPT0gMSAmJiBvYmpBLnN0YXR1cyA9PSBWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuVW5nZXQgJiYgb2JqQi5vcmRlcl9pZCAhPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqQS5vcmRlcl9pZCAhPSAxICYmIG9iakIub3JkZXJfaWQgPT0gMSAmJiBvYmpCLnN0YXR1cyA9PSBWb3lhZ2VDb25zdC5PcmRlcl9TdGF0dXMuVW5nZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvcnRfaW5kZXhfYSA9PSBzb3J0X2luZGV4X2IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mnKrmjqXlj5bnmoTmjInnhaflk4HotKjmjpLluo/vvIzlt7LmjqXlj5blkozlt7LlrozmiJDnmoTmjInnhaflrozmiJDml7bpl7TmjpLluo9cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iakEuc3RhdHVzID09IFZveWFnZUNvbnN0Lk9yZGVyX1N0YXR1cy5VbmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iakIuY29uZmlnLnF1YWxpdHkgLSBvYmpBLmNvbmZpZy5xdWFsaXR5XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqQS5lbmRfdGltZSAtIG9iakIuZW5kX3RpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0X2luZGV4X2EgLSBzb3J0X2luZGV4X2JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcmRlcl9kYXRhLnNvcnQoc29ydEZ1bmMpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9yZGVyX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBvcmRlcl9kYXRhW2ldLmluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5zZXREYXRhKG9yZGVyX2RhdGEpO1xuICAgICAgICAgICAgLy8gdGhpcy5ub19vcmRlcl9pbWFnZV9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubm9fb3JkZXJfaW1hZ2VfbmQuc2V0UG9zaXRpb24oMTAwMCwgMCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDliLfmlrDmjInpkq7nirbmgIFcbiAgICByZWZyZXNoQnRuU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZWZyZXNoX2NvbmZpZyA9IENvbmZpZy5zaGlwcGluZ19kYXRhLmRhdGFfcmVmcmVzaFt0aGlzLnJvbGVfdm8udmlwX2xldl07XG4gICAgICAgIGlmICghcmVmcmVzaF9jb25maWcpIHJldHVyblxuICAgICAgICB2YXIgZnJlZV90aW1lcyA9IHRoaXMubW9kZWwuZ2V0RnJlZVRpbWVzKCk7XG4gICAgICAgIHZhciBmcmVlX2NvdW50ID0gcmVmcmVzaF9jb25maWcuZnJlZV90aW1lczsvL+WFjei0ueWIt+aWsOS4iumZkFxuICAgICAgICBpZiAoZnJlZV90aW1lcyA8IGZyZWVfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlhY3otLnliLfmlrBcIilcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8v6YGT5YW3XG4gICAgICAgIHZhciBjb3VudCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0SXRlbU51bUJ5QmlkKHRoaXMuY29zdF9pdGVtX2JpZCk7XG4gICAgICAgIGlmIChjb3VudCA+PSB0aGlzLmNvc3RfaXRlbV9udW0pIHtcbiAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcodGhpcy5jb3N0X2l0ZW1fYmlkKTtcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKGl0ZW1fY29uZmlnLmljb24pO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoXCIgICAgJWQg5Yi35pawXCIsIHRoaXMuY29zdF9pdGVtX251bSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9pbWdfc3Auc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvL+mSu+efs1xuICAgICAgICB2YXIgY29pbl90aW1lcyA9IHRoaXMubW9kZWwuZ2V0Q29pblRpbWVzKCk7XG4gICAgICAgIHZhciBjb2luX2NvdW50ID0gcmVmcmVzaF9jb25maWcuYWxsX3RpbWVzO1xuICAgICAgICBpZiAoY29pbl90aW1lcyA8IGNvaW5fY291bnQpIHtcbiAgICAgICAgICAgIHZhciBiaWQgPSByZWZyZXNoX2NvbmZpZy5leHBlbmRbMF1bMF07XG4gICAgICAgICAgICB2YXIgbnVtID0gcmVmcmVzaF9jb25maWcuZXhwZW5kWzBdWzFdO1xuICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhiaWQpO1xuICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbik7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihcIiAgICAlZCDliLfmlrBcIiwgbnVtKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2ltZ19zcC5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5faW1nX3NwLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIt+aWsFwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9pbWdfc3Aubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy/mm7TmlrDlhpLpmanmg4XmiqXov5vluqZcbiAgICByZWZyZXNoUHJvZ3Jlc3NJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVfdm8pIHtcbiAgICAgICAgICAgIHZhciBjdXJfZW5lcmd5ID0gdGhpcy5yb2xlX3ZvLmVuZXJneTtcbiAgICAgICAgICAgIHZhciBtYXhfZW5lcmd5ID0gdGhpcy5yb2xlX3ZvLmVuZXJneV9tYXg7XG4gICAgICAgICAgICB2YXIgcGVyY2VudCA9IGN1cl9lbmVyZ3kgLyBtYXhfZW5lcmd5O1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc192YWx1ZV9sYi5zdHJpbmcgPSBjdXJfZW5lcmd5ICsgXCIvXCIgKyBtYXhfZW5lcmd5O1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc19wYi5wcm9ncmVzcyA9IHBlcmNlbnQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDliLfmlrDpgZPlhbfmlbDph49cbiAgICByZWZyZXNoSXRlbU51bTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY291bnQgPSBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEl0ZW1OdW1CeUJpZCh0aGlzLmNvc3RfaXRlbV9iaWQpO1xuICAgICAgICB0aGlzLml0ZW1fY291bnRfbGIuc3RyaW5nID0gY291bnQ7XG4gICAgfSxcblxuICAgIGNoZWNrTmVlZFVwZGF0ZUl0ZW1OdW06IGZ1bmN0aW9uIChpdGVtX2xpc3QpIHtcbiAgICAgICAgaWYgKGl0ZW1fbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQoaXRlbV9saXN0KSA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gaXRlbV9saXN0W2tdO1xuICAgICAgICAgICAgaWYgKHYuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpZCA9IHYuY29uZmlnLmlkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvc3RfaXRlbV9iaWQgJiYgYmlkID09IHRoaXMuY29zdF9pdGVtX2JpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hJdGVtTnVtKClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnRuU3RhdHVzKClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/liLfmlrDnibnmlYjmmL7npLrnirbmgIFcbiAgICB1cGRhdGVTcGVjaWFsRWZmZWN0U3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbmVfdGltZV9wcmkgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoMik7XG4gICAgICAgIHZhciB0aHJlZV90aW1lX3ByaSA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5jaGVja1ByaXZpbGVnZVN0YXR1cygzKTtcbiAgICAgICAgaWYgKG9uZV90aW1lX3ByaSB8fCB0aHJlZV90aW1lX3ByaSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFZmZlY3QodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/mv4DmtLvnibnmnYPnibnmlYjmmL7npLpcbiAgICBoYW5kbGVFZmZlY3Q6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5jbGVhclRyYWNrcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlY2lhbF9zaykge1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBjYy5qcy5mb3JtYXRTdHIoXCJzcGluZS8lcy9hY3Rpb24uYXRsYXNcIiwgUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDYyOCkpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5zZXRBbmltYXRpb24oMSwgUGxheWVyQWN0aW9uLmFjdGlvbiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uQ2xpY2tTcGVjaWFsQnRuOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIHZhciB0aXBzX3N0ciA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IDI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGV4cGxhaW5fY29uZmlnID0gQ29uZmlnLnNoaXBwaW5nX2RhdGEuZGF0YV9leHBsYWluW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChleHBsYWluX2NvbmZpZykge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tQcml2aWxlZ2VTdGF0dXMoaSArIDEpO1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBTdHJpbmdVdGlsLnBhcnNlKGV4cGxhaW5fY29uZmlnLmRlc2MgfHwgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIgKyBVdGlscy5USTE4TihcIjxjb2xvcj0jMjQ5MDAzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIO+8iOW3sua/gOa0u++8iTwvYz5cIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIgKyBVdGlscy5USTE4TihcIjxjb2xvcj0jYzkyNjA2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIO+8iOacqua/gOa0u++8iTwvYz5cIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IHN0cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IHRpcHNfc3RyICsgXCJcXG5cXG5cXG5cIiArIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWlyZShcInRpcHNfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLnNob3dDb21tb25UaXBzKHRpcHNfc3RyLCBjYy52Mihwb3MueCwgcG9zLnkgLSA4MCkpXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yZGVyX3Njcm9sbHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMub3JkZXJfc2Nyb2xsdmlldy5kZWxldGVNZSgpO1xuICAgICAgICAgICAgdGhpcy5vcmRlcl9zY3JvbGx2aWV3ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb2xlX2Fzc2V0c19ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50KTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yb2xlX3ZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZUVmZmVjdChmYWxzZSk7XG4gICAgICAgIHZhciBHdWlkZUV2ZW50ID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWRlRXZlbnQuQ2xvc2VUYXNrRWZmZWN0KTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5Wb3lhZ2VNYWluV2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=
|