|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_skin_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, '0ad81sQHl9CU6uwSVzuqOoK', 'hero_skin_window');
|
// Scripts/mod/hero/view/hero_skin_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 英雄查看皮肤立绘界面
|
// <br/>Create: 2019-09-11 20:22:43
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var HeroController = require("hero_controller");
|
|
var CommonScrollViewSingleLayout = require("common_scrollview_single");
|
|
var BackPackConst = require("backpack_const");
|
|
var BackpackController = require("backpack_controller");
|
|
var CommonAlert = require("commonalert");
|
|
var ActionController = require("action_controller");
|
|
var MallConst = require("mall_const");
|
|
var MallController = require("mall_controller");
|
|
var BaseRole = require("baserole");
|
|
var HeroEvent = require("hero_event");
|
|
var MainUIController = require("mainui_controller");
|
|
var MainuiConst = require("mainui_const");
|
|
var Hero_skinWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("hero", "hero_skin_window");
|
this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
|
|
this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
|
},
|
// 初始化一些配置数据,可以用于声明一些变量之类的
|
initConfig: function initConfig() {
|
//能否点击头像
|
this.can_click_btn = true;
|
this.ctrl = HeroController.getInstance();
|
this.model = this.ctrl.getModel();
|
this.color_1 = new cc.Color(0x64, 0x32, 0x23, 0xff);
|
},
|
// 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild("background", cc.Sprite);
|
this.background.node.scale = FIT_SCALE;
|
this.loadRes(PathTool.getBigBg("hero_draw_bg", null, "hero"), function (sp) {
|
this.background.spriteFrame = sp;
|
}.bind(this));
|
this.main_container = this.seekChild("main_container"); //英雄名字
|
|
this.hero_name_lb = this.seekChild("hero_name", cc.Label);
|
this.hero_name_lb.string = "";
|
this.title_name_lb = this.seekChild("title_name", cc.Label);
|
this.title_name_lb.string = ""; //英雄立绘
|
|
this.hero_draw_icon_nd = this.seekChild(this.main_container, "hero_draw_icon");
|
this.hero_draw_icon_sp = this.seekChild(this.main_container, "hero_draw_icon", cc.Sprite);
|
this.hero_draw_icon_x = this.hero_draw_icon_nd.x;
|
this.hero_draw_icon_y = this.hero_draw_icon_nd.y; //底部面板
|
|
this.bottom_panel = this.seekChild(this.main_container, "bottom_panel"); //英雄信息面板
|
|
this.hero_panel = this.seekChild(this.bottom_panel, "hero_panel");
|
this.hero_panel_x = this.hero_panel.x;
|
this.hero_panel.x += cc.winSize.width * 2;
|
this.hero_panel.active = true;
|
this.mode_node = this.seekChild(this.hero_panel, "model_node");
|
this.hero_panel_bg_nd = this.seekChild(this.hero_panel, "bg");
|
this.line_nd = this.seekChild(this.hero_panel, "line");
|
this.name_lb = this.seekChild(this.hero_panel, "name", cc.Label); //属性面板
|
|
this.attr_panel = this.seekChild(this.bottom_panel, "attr_panel");
|
this.attr_panel_x = this.attr_panel.x;
|
this.attr_panel.x += cc.winSize.width * 2;
|
this.attr_panel.active = true;
|
var time_key = this.seekChild(this.attr_panel, "time_key", cc.Label);
|
time_key.string = Utils.TI18N("有效时间:");
|
var attr_key = this.seekChild(this.attr_panel, "attr_key", cc.Label);
|
attr_key.string = Utils.TI18N("属性加成:"); //时间
|
|
this.time_val_lb = this.seekChild(this.attr_panel, "time_val", cc.Label);
|
this.attr_item_list = {};
|
this.show_btn = this.seekChild(this.bottom_panel, "show_btn");
|
this.show_btn_icon_nd = this.seekChild(this.show_btn, "icon");
|
this.left_btn = this.seekChild(this.bottom_panel, "left_btn");
|
this.right_btn = this.seekChild(this.bottom_panel, "right_btn");
|
this.lay_scrollview = this.seekChild(this.bottom_panel, "lay_scrollview");
|
},
|
// 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
|
registerEvent: function registerEvent() {
|
Utils.onTouchEnd(this.left_btn, function () {
|
this.ctrl.openHeroSkinWindow(false);
|
}.bind(this), 2);
|
Utils.onTouchEnd(this.right_btn, function () {
|
//确定选择当前皮肤做作为显示皮肤
|
if (!this.hero_vo) return;
|
if (!this.skin_data_list) return;
|
var skin_data = this.skin_data_list[this.select_skin_index];
|
|
if (skin_data && skin_data.is_skin_data) {
|
//换成其他皮肤
|
if (this.hero_vo.use_skin != skin_data.skin_id) {
|
this.ctrl.sender11019(this.hero_vo.partner_id, skin_data.skin_id);
|
}
|
} else {
|
if (this.hero_vo.use_skin != 0) {
|
//换回原来皮肤
|
this.ctrl.sender11019(this.hero_vo.partner_id, 0);
|
}
|
}
|
}.bind(this), 1);
|
Utils.onTouchEnd(this.show_btn, function () {
|
//显示
|
if (!this.hero_vo) return;
|
if (!this.skin_data_list) return;
|
|
if (this.is_show_attr) {
|
this.is_show_attr = false;
|
this.attr_panel.x += cc.winSize.width * 2;
|
this.hero_panel.x = this.hero_panel_x;
|
this.updateHeroInfo(1);
|
|
if (this.show_btn_icon_nd) {
|
this.show_btn_icon_nd.setScale(-1);
|
}
|
} else {
|
this.is_show_attr = true;
|
var skin_data = this.skin_data_list[this.select_skin_index];
|
this.hero_panel.x += cc.winSize.width * 2;
|
|
if (skin_data && skin_data.is_skin_data) {
|
this.attr_panel.x = this.attr_panel_x;
|
this.updateAttrInfo();
|
} else {
|
this.attr_panel.x += cc.winSize.width * 2;
|
}
|
|
if (this.show_btn_icon_nd) {
|
this.show_btn_icon_nd.setScale(1);
|
}
|
}
|
}.bind(this), 2);
|
this.addGlobalEvent(HeroEvent.Hero_Skin_Info_Event, function () {
|
if (this.select_skin_index == null) return;
|
if (!this.skin_data_list) return;
|
|
for (var i in this.skin_data_list) {
|
var v = this.skin_data_list[i];
|
|
if (this.model.isUnlockHeroSkin(v.skin_id)) {
|
v.is_lock = false;
|
} else {
|
v.is_lock = true;
|
}
|
}
|
|
if (this.use_skin_index != null) {
|
this.updateSkinList(this.use_skin_index);
|
this.use_skin_index = null;
|
} else {
|
this.updateSkinList(this.select_skin_index);
|
}
|
}, this);
|
},
|
// 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
|
openRootWnd: function openRootWnd(hero_vo) {
|
if (!hero_vo) return;
|
this.hero_vo = hero_vo;
|
var bid_config = Config.partner_skin_data.data_partner_bid_info[this.hero_vo.bid];
|
if (!bid_config) return;
|
var partner_config = Config.partner_data.data_partner_base[this.hero_vo.bid];
|
|
if (partner_config) {
|
this.hero_name_lb.string = partner_config.name;
|
} //皮肤数据
|
|
|
this.skin_data_list = [];
|
|
for (var skin_id in bid_config) {
|
var v = bid_config[skin_id];
|
var data = {};
|
data.is_skin_data = true; //表示是皮肤数据
|
|
if (this.model.isUnlockHeroSkin(v.skin_id)) {
|
data.is_lock = false;
|
} else {
|
data.is_lock = true;
|
}
|
|
data.skin_id = skin_id;
|
data.config = Config.partner_skin_data.data_skin_info[v.skin_id];
|
this.skin_data_list.push(data);
|
}
|
|
this.skin_data_list.sort(Utils.tableLowerSorter(["skin_id"])); //第一个肯定是本体
|
|
this.skin_data_list.unshift(this.hero_vo);
|
var select_index = 0;
|
var use_skin = this.hero_vo.use_skin || 0;
|
|
if (use_skin != 0) {
|
for (var i in this.skin_data_list) {
|
var _v = this.skin_data_list[i];
|
|
if (_v.skin_id == use_skin) {
|
select_index = i;
|
}
|
}
|
}
|
|
this.is_show_attr = true;
|
this.updateSkinList(select_index);
|
},
|
updateSkinList: function updateSkinList(select_index) {
|
if (this.scroll_view == null) {
|
var scroll_view_size = this.lay_scrollview.getContentSize();
|
var list_setting = {
|
start_x: 0,
|
space_x: 0,
|
start_y: 0,
|
space_y: 0,
|
item_width: 120,
|
item_height: 120,
|
row: 1,
|
col: 1,
|
need_dynamic: true
|
};
|
this.scroll_view = new CommonScrollViewSingleLayout();
|
this.scroll_view.createScroll(this.lay_scrollview, cc.v2(0, 0), ScrollViewDir.horizontal, ScrollViewStartPos.top, scroll_view_size, list_setting, cc.v2(0.5, 0.5));
|
this.scroll_view.registerScriptHandlerSingle(this.createNewCell.bind(this), ScrollViewFuncType.CreateNewCell);
|
this.scroll_view.registerScriptHandlerSingle(this.numberOfCells.bind(this), ScrollViewFuncType.NumberOfCells);
|
this.scroll_view.registerScriptHandlerSingle(this.updateCellByIndex.bind(this), ScrollViewFuncType.UpdateCellByIndex);
|
this.scroll_view.registerScriptHandlerSingle(this.onCellTouched.bind(this), ScrollViewFuncType.OnCellTouched);
|
var max_count = Math.floor(scroll_view_size.width / list_setting.item_width);
|
|
if (this.skin_data_list.length <= max_count) {
|
this.scroll_view.setClickEnabled(false);
|
}
|
}
|
|
var select_index = select_index || 0;
|
this.scroll_view.reloadData(select_index);
|
},
|
// --创建cell
|
// --@width 是setting.item_width
|
// --@height 是setting.item_height
|
createNewCell: function createNewCell(width, height) {
|
var cell = ItemsPool.getInstance().getItem("backpack_item");
|
cell.initConfig(false, 1, false, true);
|
cell.show();
|
cell.setDefaultTip();
|
cell.setQualityBG(BackPackConst.quality.orange);
|
cell.addCallBack(function () {
|
this.onCellTouched(cell);
|
}.bind(this));
|
return cell;
|
},
|
//获取数据数量
|
numberOfCells: function numberOfCells() {
|
if (!this.skin_data_list) return 0;
|
return this.skin_data_list.length;
|
},
|
// --更新cell(拖动的时候.刷新数据时候会执行次方法)
|
// --cell :createNewCell的返回的对象
|
// --index :数据的索引
|
updateCellByIndex: function updateCellByIndex(cell, index) {
|
this.startUpdate(100, function () {
|
cell.index = index;
|
var skin_data = this.skin_data_list[index];
|
if (!skin_data) return;
|
var icon_res = null;
|
|
if (skin_data.is_skin_data) {
|
icon_res = PathTool.getHeadRes(skin_data.config.head_id);
|
cell.setItemIcon(icon_res);
|
|
if (skin_data.is_lock) {
|
cell.setItemIconUnEnabled(true);
|
} else {
|
cell.setItemIconUnEnabled(false);
|
}
|
} else {
|
var key = Utils.getNorKey(skin_data.bid, skin_data.star);
|
var star_config = gdata("partner_data", "data_partner_star", [key]);
|
|
if (star_config) {
|
icon_res = PathTool.getHeadRes(star_config.head_id);
|
cell.setItemIcon(icon_res);
|
}
|
|
cell.setItemIconUnEnabled(false);
|
}
|
|
if (this.select_skin_index != null && this.select_skin_index == index) {
|
cell.setSelected(true);
|
} else {
|
cell.setSelected(false);
|
}
|
}.bind(this), 1);
|
},
|
//点击cell .需要在 createNewCell 设置点击事件
|
onCellTouched: function onCellTouched(cell) {
|
if (!this.can_click_btn) return;
|
if (cell.index == null) return;
|
var index = cell.index;
|
var skin_data = this.skin_data_list[index];
|
if (!skin_data) return;
|
|
if (skin_data.is_skin_data) {
|
if (skin_data.is_lock) {
|
this.setLockInfo(skin_data, index);
|
return;
|
}
|
}
|
|
if (this.select_cell != null) {
|
this.select_cell.setSelected(false);
|
}
|
|
this.select_cell = cell;
|
this.select_cell.setSelected(true);
|
this.updateSelectSkinInfo(index);
|
},
|
//更新选中的皮肤信息
|
updateSelectSkinInfo: function updateSelectSkinInfo(index) {
|
if (!this.select_skin_index && this.select_skin_index == index) return;
|
this.select_skin_index = index;
|
var skin_data = this.skin_data_list[this.select_skin_index];
|
var name_str = "";
|
|
if (skin_data.config) {
|
name_str = skin_data.config.skin_name;
|
} else {
|
var config = gdata("partner_data", "data_partner_library", [skin_data.bid]);
|
|
if (config) {
|
name_str = config.title;
|
}
|
}
|
|
this.title_name_lb.string = name_str;
|
|
if (skin_data.is_skin_data) {
|
this.skin_config = skin_data.config;
|
|
if (this.is_show_attr) {
|
this.attr_panel.x = this.attr_panel_x;
|
this.updateAttrInfo();
|
} else {
|
this.attr_panel.x += cc.winSize.width * 2;
|
}
|
} else {
|
//英雄对象
|
this.skin_config = gdata("partner_data", "data_partner_library", [skin_data.bid]);
|
this.attr_panel.x += cc.winSize.width * 2;
|
}
|
|
this.updateDrawInfo();
|
|
if (!this.is_show_attr) {
|
this.updateHeroInfo(2);
|
}
|
},
|
setLockInfo: function setLockInfo(skin_data, index) {
|
var dic_item_id = {};
|
|
for (var i in skin_data.config.item_id_list) {
|
var id = skin_data.config.item_id_list[i];
|
dic_item_id[id] = true;
|
}
|
|
var have_item = null;
|
var have_list = [];
|
var list = BackpackController.getInstance().getModel().getBagItemList(BackPackConst.Bag_Code.BACKPACK) || {};
|
|
for (var _i in list) {
|
var item = list[_i];
|
|
if (item && item.config && dic_item_id[item.config.id]) {
|
//背包上有道具
|
var data = {};
|
|
if (item.config.client_effect[0] && item.config.client_effect[0][1]) {
|
data.time = item.config.client_effect[0][1];
|
} else {
|
data.time = 1;
|
}
|
|
if (data.time == 0) {
|
//表示有永久的皮肤
|
have_item = item;
|
break;
|
}
|
|
data.item_info = item;
|
have_list.push(data);
|
}
|
}
|
|
if (have_item) {
|
//表示有永久的皮肤
|
this.useSkinItemByID(have_item, index);
|
return;
|
}
|
|
if (have_list.length > 0) {
|
have_list.sort(Utils.tableUpperSorter(["time"]));
|
this.useSkinItemByID(have_list[0].item_info, index);
|
} else {
|
//说明该皮肤不能同商城获取
|
// if (skin_data.config.is_shop == 0) {
|
// message(Utils.TI18N("暂未获取此皮肤,请前往相关活动或玩法中获取!"));
|
// } else {
|
this.gotoSkinAction(skin_data.config); // }
|
}
|
},
|
//使用皮肤道具
|
useSkinItemByID: function useSkinItemByID(have_item, index) {
|
if (have_item.config) {
|
var color = BackPackConst.getWhiteQualityColorStr(have_item.config.quality);
|
var str = cc.js.formatStr(Utils.TI18N("已拥有解锁道具,是否消耗<div fontcolor=#%s>%s</div>解锁该皮肤?"), color, have_item.config.name);
|
|
var callback = function () {
|
this.use_skin_index = index;
|
BackpackController.getInstance().sender10515(have_item.id, 1);
|
}.bind(this);
|
|
CommonAlert.show(str, Utils.TI18N("确定"), callback, Utils.TI18N("取消"), null, 2, null, {
|
title: Utils.TI18N("解锁皮肤")
|
});
|
}
|
},
|
//跳转活动id
|
gotoSkinAction: function gotoSkinAction(config) {
|
var callback = function () {
|
//优先找皮肤活动
|
if (config.action_bid != 0) {
|
//是否存在
|
var is_exist = ActionController.getInstance().checkActionExistByActionBid(config.action_bid);
|
|
if (is_exist) {
|
Utils.closeAllWindow();
|
this.startUpdate(100, function () {
|
ActionController.getInstance().openActionMainPanel(true, null, config.action_bid);
|
}.bind(this), 1);
|
return;
|
}
|
}
|
|
if (config.main_id != null) {
|
var is_has = MainUIController.getInstance().getFucntionIconVoById(config.main_id);
|
|
if (is_has) {
|
Utils.closeAllWindow();
|
this.startUpdate(100, function () {
|
ActionController.getInstance().openBuySkinWindow(true);
|
}.bind(this), 1);
|
return;
|
}
|
} //没有皮肤活动 找活动商城
|
|
|
var shop_config = Config.exchange_data.data_shop_list[MallConst.MallType.HeroSkin];
|
|
if (config.is_shop == 1 && shop_config && shop_config.sort != 0) {
|
MallController.getInstance().openMallPanel(true, MallConst.MallType.HeroSkin);
|
return;
|
} //没有活动商城 提示:
|
|
|
message(Utils.TI18N("暂无该皮肤获取途径"));
|
}.bind(this);
|
|
var str = Utils.TI18N("当前暂未拥有该皮肤,是否前往获取?");
|
CommonAlert.show(str, Utils.TI18N("确定"), callback, Utils.TI18N("取消"), null, null, null, {
|
title: Utils.TI18N("解锁皮肤")
|
});
|
},
|
//更新立绘信息
|
updateDrawInfo: function updateDrawInfo() {
|
if (!this.skin_config) return;
|
var draw_res_id = this.skin_config.draw_res;
|
|
if (draw_res_id == null || draw_res_id == "") {
|
draw_res_id = this.getDefaultDrawRes();
|
}
|
|
if (draw_res_id) {
|
var bg_res = PathTool.getIconPath("herodraw/herodrawres", draw_res_id);
|
|
if (this.hero_draw_icon_sp) {
|
this.loadRes(bg_res, function (sp) {
|
this.hero_draw_icon_sp.spriteFrame = sp;
|
}.bind(this));
|
}
|
|
if (this.skin_config.scale == 0) {
|
this.hero_draw_icon_nd.scale = 1;
|
} else {
|
this.hero_draw_icon_nd.scale = this.skin_config.scale / 100;
|
}
|
|
if (this.skin_config.draw_offset && Utils.next(this.skin_config.draw_offset) != null) {
|
var offset_x = this.skin_config.draw_offset[0][0] || 0;
|
var offset_y = this.skin_config.draw_offset[0][1] || 0;
|
this.hero_draw_icon_nd.setPosition(this.hero_draw_icon_x + offset_x, this.hero_draw_icon_y + offset_y);
|
}
|
}
|
},
|
//显示属性
|
updateAttrInfo: function updateAttrInfo() {
|
var _this = this;
|
|
if (!this.skin_config) return;
|
var end_time = this.model.getHeroSkinInfoBySkinID(this.skin_config.skin_id);
|
|
if (end_time != null) {
|
if (end_time == 0) {
|
this.time_val_lb.string = Utils.TI18N("永久");
|
this.time_val_lb.node.stopAllActions();
|
} else {
|
var time = end_time - gcore.SmartSocket.getTime();
|
|
if (time <= 0) {
|
this.time_val_lb.string = Utils.TI18N("00:00:00");
|
} else {
|
Utils.commonCountDownTime(this.time_val_lb, time);
|
}
|
}
|
}
|
|
var y = 27;
|
var width_item = 150;
|
var offset_x = 150;
|
var size = cc.size(width_item, 35);
|
|
for (var i in this.attr_item_list) {
|
var v = this.attr_item_list[i];
|
v.bg_sp.node.active = false;
|
v.key_rt.node.active = false;
|
}
|
|
var _loop = function _loop(_i2) {
|
var v = _this.skin_config.skin_attr[_i2];
|
var x = 200 + (_i2 - 1) * width_item + offset_x;
|
|
if (_this.attr_item_list[_i2] == null) {
|
_this.attr_item_list[_i2] = _this.createAttrItem(x, y, size);
|
} else {
|
_this.attr_item_list[_i2].bg_sp.node.active = true;
|
_this.attr_item_list[_i2].key_rt.node.active = true;
|
}
|
|
var arr = Utils.commonGetAttrInfoByKeyValue(v[0], v[1]);
|
var str = cc.js.formatStr("<img src='%s'/> %s + %s", arr.icon, arr.attr_name, arr.attr_val);
|
_this.attr_item_list[_i2].key_rt.string = str;
|
|
_this.loadRes(arr.res, function (resObject) {
|
this.attr_item_list[_i2].key_rt.addSpriteFrame(resObject);
|
}.bind(_this));
|
};
|
|
for (var _i2 in this.skin_config.skin_attr) {
|
_loop(_i2);
|
}
|
},
|
//创建属性item
|
createAttrItem: function createAttrItem(x, y, size) {
|
var item = {};
|
var res = PathTool.getUIIconPath("hero", "partner_skin_03");
|
item.bg_sp = Utils.createImage(this.attr_panel, null, x, y, cc.v2(0, 0.5), null, 0, true);
|
this.loadRes(res, function (sp) {
|
item.bg_sp.spriteFrame = sp;
|
});
|
item.bg_sp.node.setContentSize(size);
|
item.key_rt = Utils.createRichLabel(22, this.color_1, cc.v2(0, 0.5), cc.v2(x + 10, y), 24, 380, this.attr_panel, "left");
|
return item;
|
},
|
//更新英雄信息
|
//来源位置 1 表示 按show_btn 的 2 表示 按皮肤头像的
|
updateHeroInfo: function updateHeroInfo(form_type) {
|
var skin_data = this.skin_data_list[this.select_skin_index];
|
var hero_config = null;
|
var skin_id = 0;
|
var hero_vo = this.skin_data_list[0];
|
|
if (skin_data.is_skin_data) {
|
hero_config = gdata("partner_skin_data", "data_hero_info", [skin_data.skin_id]);
|
skin_id = skin_data.config.skin_id;
|
}
|
|
this.updateSpine(hero_vo, skin_id, form_type); //说明有传记
|
|
if (hero_config) {// this.line_nd.active = true;
|
// this.name_lb.node.active = true;
|
}
|
},
|
//更新模型,也是初始化模型
|
//@is_refresh 是否需要检测
|
updateSpine: function updateSpine(hero_vo, skin_id, form_type) {
|
if (this.record_skin_id != null && this.record_skin_id == skin_id) return;
|
this.record_skin_id = skin_id;
|
|
var fun = function () {
|
if (!this.spine) {
|
this.spine = new BaseRole();
|
this.spine.setParent(this.mode_node);
|
this.spine.setPosition(0, 104);
|
this.spine.setData(BaseRole.type.partner, hero_vo, PlayerAction.show, true, 0.45, {
|
skin_id: skin_id
|
});
|
this.spine.showShadowUI(true);
|
var action = cc.fadeIn(0.2);
|
this.spine.node.runAction(action);
|
}
|
}.bind(this);
|
|
var callback = function () {
|
this.spine.node.stopAllActions();
|
this.spine.node.removeFromParent();
|
this.spine = null;
|
this.can_click_btn = true;
|
fun();
|
}.bind(this);
|
|
if (this.spine) {
|
this.can_click_btn = false;
|
|
if (form_type == 2) {
|
var action = cc.fadeOut(0.2);
|
this.spine.node.runAction(cc.sequence(action, cc.callFunc(callback)));
|
} else {
|
callback();
|
}
|
} else {
|
fun();
|
}
|
},
|
//获取缺省的模型id
|
getDefaultModeRes: function getDefaultModeRes() {
|
var partner_config = this.getPartnerConfig()[0];
|
var star_config = this.getPartnerConfig()[1];
|
|
if (partner_config && star_config) {
|
return star_config.res_id;
|
}
|
},
|
//获取缺省的模型立绘
|
getDefaultDrawRes: function getDefaultDrawRes() {
|
var partner_config = this.getPartnerConfig()[0];
|
var star_config = this.getPartnerConfig()[1];
|
|
if (partner_config && star_config) {
|
return partner_config.draw_res;
|
}
|
},
|
//获取英雄对应配置
|
getPartnerConfig: function getPartnerConfig() {
|
if (!this.hero_vo) return;
|
|
if (this.partner_config == null) {
|
this.partner_config = Config.partner_data.data_partner_base[this.hero_vo.bid];
|
}
|
|
if (this.partner_config && this.star_config == null) {
|
var key = Utils.getNorKey(this.partner_config.bid, this.partner_config.init_star);
|
this.star_config = gdata("partner_data", "data_partner_star", [key]);
|
}
|
|
return [this.partner_config, this.star_config];
|
},
|
// 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
|
closeCallBack: function closeCallBack() {
|
if (this.scroll_view) {
|
this.scroll_view.deleteMe();
|
this.scroll_view = null;
|
}
|
|
this.time_val_lb.node.stopAllActions();
|
this.ctrl.openHeroSkinWindow();
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX3NraW5fd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkhlcm9Db250cm9sbGVyIiwiQ29tbW9uU2Nyb2xsVmlld1NpbmdsZUxheW91dCIsIkJhY2tQYWNrQ29uc3QiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJDb21tb25BbGVydCIsIkFjdGlvbkNvbnRyb2xsZXIiLCJNYWxsQ29uc3QiLCJNYWxsQ29udHJvbGxlciIsIkJhc2VSb2xlIiwiSGVyb0V2ZW50IiwiTWFpblVJQ29udHJvbGxlciIsIk1haW51aUNvbnN0IiwiSGVyb19za2luV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImluaXRDb25maWciLCJjYW5fY2xpY2tfYnRuIiwiY3RybCIsImdldEluc3RhbmNlIiwibW9kZWwiLCJnZXRNb2RlbCIsImNvbG9yXzEiLCJDb2xvciIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJTcHJpdGUiLCJub2RlIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJzcCIsInNwcml0ZUZyYW1lIiwiYmluZCIsIm1haW5fY29udGFpbmVyIiwiaGVyb19uYW1lX2xiIiwiTGFiZWwiLCJzdHJpbmciLCJ0aXRsZV9uYW1lX2xiIiwiaGVyb19kcmF3X2ljb25fbmQiLCJoZXJvX2RyYXdfaWNvbl9zcCIsImhlcm9fZHJhd19pY29uX3giLCJ4IiwiaGVyb19kcmF3X2ljb25feSIsInkiLCJib3R0b21fcGFuZWwiLCJoZXJvX3BhbmVsIiwiaGVyb19wYW5lbF94Iiwid2luU2l6ZSIsIndpZHRoIiwiYWN0aXZlIiwibW9kZV9ub2RlIiwiaGVyb19wYW5lbF9iZ19uZCIsImxpbmVfbmQiLCJuYW1lX2xiIiwiYXR0cl9wYW5lbCIsImF0dHJfcGFuZWxfeCIsInRpbWVfa2V5IiwiVXRpbHMiLCJUSTE4TiIsImF0dHJfa2V5IiwidGltZV92YWxfbGIiLCJhdHRyX2l0ZW1fbGlzdCIsInNob3dfYnRuIiwic2hvd19idG5faWNvbl9uZCIsImxlZnRfYnRuIiwicmlnaHRfYnRuIiwibGF5X3Njcm9sbHZpZXciLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5IZXJvU2tpbldpbmRvdyIsImhlcm9fdm8iLCJza2luX2RhdGFfbGlzdCIsInNraW5fZGF0YSIsInNlbGVjdF9za2luX2luZGV4IiwiaXNfc2tpbl9kYXRhIiwidXNlX3NraW4iLCJza2luX2lkIiwic2VuZGVyMTEwMTkiLCJwYXJ0bmVyX2lkIiwiaXNfc2hvd19hdHRyIiwidXBkYXRlSGVyb0luZm8iLCJzZXRTY2FsZSIsInVwZGF0ZUF0dHJJbmZvIiwiYWRkR2xvYmFsRXZlbnQiLCJIZXJvX1NraW5fSW5mb19FdmVudCIsImkiLCJ2IiwiaXNVbmxvY2tIZXJvU2tpbiIsImlzX2xvY2siLCJ1c2Vfc2tpbl9pbmRleCIsInVwZGF0ZVNraW5MaXN0Iiwib3BlblJvb3RXbmQiLCJiaWRfY29uZmlnIiwiQ29uZmlnIiwicGFydG5lcl9za2luX2RhdGEiLCJkYXRhX3BhcnRuZXJfYmlkX2luZm8iLCJiaWQiLCJwYXJ0bmVyX2NvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfcGFydG5lcl9iYXNlIiwibmFtZSIsImRhdGEiLCJjb25maWciLCJkYXRhX3NraW5faW5mbyIsInB1c2giLCJzb3J0IiwidGFibGVMb3dlclNvcnRlciIsInVuc2hpZnQiLCJzZWxlY3RfaW5kZXgiLCJzY3JvbGxfdmlldyIsInNjcm9sbF92aWV3X3NpemUiLCJnZXRDb250ZW50U2l6ZSIsImxpc3Rfc2V0dGluZyIsInN0YXJ0X3giLCJzcGFjZV94Iiwic3RhcnRfeSIsInNwYWNlX3kiLCJpdGVtX3dpZHRoIiwiaXRlbV9oZWlnaHQiLCJyb3ciLCJjb2wiLCJuZWVkX2R5bmFtaWMiLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJob3Jpem9udGFsIiwiU2Nyb2xsVmlld1N0YXJ0UG9zIiwidG9wIiwicmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlIiwiY3JlYXRlTmV3Q2VsbCIsIlNjcm9sbFZpZXdGdW5jVHlwZSIsIkNyZWF0ZU5ld0NlbGwiLCJudW1iZXJPZkNlbGxzIiwiTnVtYmVyT2ZDZWxscyIsInVwZGF0ZUNlbGxCeUluZGV4IiwiVXBkYXRlQ2VsbEJ5SW5kZXgiLCJvbkNlbGxUb3VjaGVkIiwiT25DZWxsVG91Y2hlZCIsIm1heF9jb3VudCIsIk1hdGgiLCJmbG9vciIsImxlbmd0aCIsInNldENsaWNrRW5hYmxlZCIsInJlbG9hZERhdGEiLCJoZWlnaHQiLCJjZWxsIiwiSXRlbXNQb29sIiwiZ2V0SXRlbSIsInNob3ciLCJzZXREZWZhdWx0VGlwIiwic2V0UXVhbGl0eUJHIiwicXVhbGl0eSIsIm9yYW5nZSIsImFkZENhbGxCYWNrIiwiaW5kZXgiLCJzdGFydFVwZGF0ZSIsImljb25fcmVzIiwiZ2V0SGVhZFJlcyIsImhlYWRfaWQiLCJzZXRJdGVtSWNvbiIsInNldEl0ZW1JY29uVW5FbmFibGVkIiwia2V5IiwiZ2V0Tm9yS2V5Iiwic3RhciIsInN0YXJfY29uZmlnIiwiZ2RhdGEiLCJzZXRTZWxlY3RlZCIsInNldExvY2tJbmZvIiwic2VsZWN0X2NlbGwiLCJ1cGRhdGVTZWxlY3RTa2luSW5mbyIsIm5hbWVfc3RyIiwic2tpbl9uYW1lIiwidGl0bGUiLCJza2luX2NvbmZpZyIsInVwZGF0ZURyYXdJbmZvIiwiZGljX2l0ZW1faWQiLCJpdGVtX2lkX2xpc3QiLCJpZCIsImhhdmVfaXRlbSIsImhhdmVfbGlzdCIsImxpc3QiLCJnZXRCYWdJdGVtTGlzdCIsIkJhZ19Db2RlIiwiQkFDS1BBQ0siLCJpdGVtIiwiY2xpZW50X2VmZmVjdCIsInRpbWUiLCJpdGVtX2luZm8iLCJ1c2VTa2luSXRlbUJ5SUQiLCJ0YWJsZVVwcGVyU29ydGVyIiwiZ290b1NraW5BY3Rpb24iLCJjb2xvciIsImdldFdoaXRlUXVhbGl0eUNvbG9yU3RyIiwic3RyIiwianMiLCJmb3JtYXRTdHIiLCJjYWxsYmFjayIsInNlbmRlcjEwNTE1IiwiYWN0aW9uX2JpZCIsImlzX2V4aXN0IiwiY2hlY2tBY3Rpb25FeGlzdEJ5QWN0aW9uQmlkIiwiY2xvc2VBbGxXaW5kb3ciLCJvcGVuQWN0aW9uTWFpblBhbmVsIiwibWFpbl9pZCIsImlzX2hhcyIsImdldEZ1Y250aW9uSWNvblZvQnlJZCIsIm9wZW5CdXlTa2luV2luZG93Iiwic2hvcF9jb25maWciLCJleGNoYW5nZV9kYXRhIiwiZGF0YV9zaG9wX2xpc3QiLCJNYWxsVHlwZSIsIkhlcm9Ta2luIiwiaXNfc2hvcCIsIm9wZW5NYWxsUGFuZWwiLCJtZXNzYWdlIiwiZHJhd19yZXNfaWQiLCJkcmF3X3JlcyIsImdldERlZmF1bHREcmF3UmVzIiwiYmdfcmVzIiwiZ2V0SWNvblBhdGgiLCJkcmF3X29mZnNldCIsIm5leHQiLCJvZmZzZXRfeCIsIm9mZnNldF95Iiwic2V0UG9zaXRpb24iLCJlbmRfdGltZSIsImdldEhlcm9Ta2luSW5mb0J5U2tpbklEIiwic3RvcEFsbEFjdGlvbnMiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImNvbW1vbkNvdW50RG93blRpbWUiLCJ3aWR0aF9pdGVtIiwic2l6ZSIsImJnX3NwIiwia2V5X3J0Iiwic2tpbl9hdHRyIiwiY3JlYXRlQXR0ckl0ZW0iLCJhcnIiLCJjb21tb25HZXRBdHRySW5mb0J5S2V5VmFsdWUiLCJpY29uIiwiYXR0cl9uYW1lIiwiYXR0cl92YWwiLCJyZXMiLCJyZXNPYmplY3QiLCJhZGRTcHJpdGVGcmFtZSIsImdldFVJSWNvblBhdGgiLCJjcmVhdGVJbWFnZSIsInNldENvbnRlbnRTaXplIiwiY3JlYXRlUmljaExhYmVsIiwiZm9ybV90eXBlIiwiaGVyb19jb25maWciLCJ1cGRhdGVTcGluZSIsInJlY29yZF9za2luX2lkIiwiZnVuIiwic3BpbmUiLCJzZXRQYXJlbnQiLCJzZXREYXRhIiwidHlwZSIsInBhcnRuZXIiLCJQbGF5ZXJBY3Rpb24iLCJzaG93U2hhZG93VUkiLCJhY3Rpb24iLCJmYWRlSW4iLCJydW5BY3Rpb24iLCJyZW1vdmVGcm9tUGFyZW50IiwiZmFkZU91dCIsInNlcXVlbmNlIiwiY2FsbEZ1bmMiLCJnZXREZWZhdWx0TW9kZVJlcyIsImdldFBhcnRuZXJDb25maWciLCJyZXNfaWQiLCJpbml0X3N0YXIiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsUUFBUSxHQUFHQyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJQyxjQUFjLEdBQUdELE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRSw0QkFBNEIsR0FBR0YsT0FBTyxDQUFDLDBCQUFELENBQTFDOztBQUNBLElBQUlHLGFBQWEsR0FBR0gsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQUlJLGtCQUFrQixHQUFHSixPQUFPLENBQUMscUJBQUQsQ0FBaEM7O0FBQ0EsSUFBSUssV0FBVyxHQUFHTCxPQUFPLENBQUMsYUFBRCxDQUF6Qjs7QUFDQSxJQUFJTSxnQkFBZ0IsR0FBR04sT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlPLFNBQVMsR0FBR1AsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSVEsY0FBYyxHQUFHUixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSVMsUUFBUSxHQUFHVCxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxJQUFJVSxTQUFTLEdBQUdWLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlXLGdCQUFnQixHQUFHWCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSVksV0FBVyxHQUFHWixPQUFPLENBQUMsY0FB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SSxLQUFLQyxjQUFMLElBQXVCLEtBQUttRSxXQUFMLElBQW9CLElBQS9DLEVBQXFEO0FBQ2pELFVBQUlILEdBQUcsR0FBR3hHLEtBQUssQ0FBQ3lHLFNBQU4sQ0FBZ0IsS0FBS2pFLGNBQUwsQ0FBb0JELEdBQXBDLEVBQXlDLEtBQUtDLGNBQUwsQ0FBb0IrSyxTQUE3RCxDQUFWO0FBQ0EsV0FBSzVHLFdBQUwsR0FBbUJDLEtBQUssQ0FBQyxjQUFELEVBQWlCLG1CQUFqQixFQUFzQyxDQUFDSixHQUFELENBQXRDLENBQXhCO0FBQ0g7O0FBQ0QsV0FBTyxDQUFDLEtBQUtoRSxjQUFOLEVBQXNCLEtBQUttRSxXQUEzQixDQUFQO0FBQ0gsR0F2bUIwQjtBQXltQjNCO0FBQ0E2RyxFQUFBQSxhQUFhLEVBQUUseUJBQVk7QUFDdkIsUUFBSSxLQUFLcEssV0FBVCxFQUFzQjtBQUNsQixXQUFLQSxXQUFMLENBQWlCcUssUUFBakI7QUFDQSxXQUFLckssV0FBTCxHQUFtQixJQUFuQjtBQUNIOztBQUNELFNBQUtqRCxXQUFMLENBQWlCbkMsSUFBakIsQ0FBc0IwTSxjQUF0QjtBQUNBLFNBQUtwTixJQUFMLENBQVVzRCxrQkFBVjtBQUNIO0FBam5CMEIsQ0FBVCxDQUF0QiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOiLsembhOafpeeci+earuiCpOeri+e7mOeVjOmdolxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDktMTEgMjA6MjI6NDNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpO1xudmFyIENvbW1vblNjcm9sbFZpZXdTaW5nbGVMYXlvdXQgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdfc2luZ2xlXCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XG52YXIgQmFja3BhY2tDb250cm9sbGVyID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIik7XG52YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XG52YXIgQWN0aW9uQ29udHJvbGxlciA9IHJlcXVpcmUoXCJhY3Rpb25fY29udHJvbGxlclwiKTtcbnZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKTtcbnZhciBNYWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWxsX2NvbnRyb2xsZXJcIik7XG52YXIgQmFzZVJvbGUgPSByZXF1aXJlKFwiYmFzZXJvbGVcIik7XG52YXIgSGVyb0V2ZW50ID0gcmVxdWlyZShcImhlcm9fZXZlbnRcIik7XG52YXIgTWFpblVJQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG5cblxudmFyIEhlcm9fc2tpbldpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJoZXJvXCIsIFwiaGVyb19za2luX3dpbmRvd1wiKTtcbiAgICAgICAgdGhpcy52aWV3VGFnID0gU0NFTkVfVEFHLmRpYWxvZ3VlOyAgICAgICAgICAgICAgICAvL+ivpeeql+S9k+aJgOWxnnVp5bGC57qnLOWFqOWxj3Vp6ZyA6KaB5ZyodWnlsYIs6Z2e5YWo5bGPdWnlnKhkaWFsb2d1ZeWxgizov5nkuKropoHms6jmhI9cbiAgICAgICAgdGhpcy53aW5fdHlwZSA9IFdpblR5cGUuRnVsbDsgICAgICAgICAgICAgICAvL+aYr+WQpuaYr+WFqOWxj+eql+S9kyAgV2luVHlwZS5GdWxsLCBXaW5UeXBlLkJpZywgV2luVHlwZS5NaW5pLCBXaW5UeXBlLlRpcHNcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5LiA5Lqb6YWN572u5pWw5o2uLOWPr+S7peeUqOS6juWjsOaYjuS4gOS6m+WPmOmHj+S5i+exu+eahFxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy/og73lkKbngrnlh7vlpLTlg49cbiAgICAgICAgdGhpcy5jYW5fY2xpY2tfYnRuID0gdHJ1ZVxuICAgICAgICB0aGlzLmN0cmwgPSBIZXJvQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jdHJsLmdldE1vZGVsKCk7XG4gICAgICAgIHRoaXMuY29sb3JfMSA9IG5ldyBjYy5Db2xvcigweDY0LCAweDMyLCAweDIzLCAweGZmKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiLCBjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQubm9kZS5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiaGVyb19kcmF3X2JnXCIsIG51bGwsIFwiaGVyb1wiKSwgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChcIm1haW5fY29udGFpbmVyXCIpO1xuXG4gICAgICAgIC8v6Iux6ZuE5ZCN5a2XXG4gICAgICAgIHRoaXMuaGVyb19uYW1lX2xiID0gdGhpcy5zZWVrQ2hpbGQoXCJoZXJvX25hbWVcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmhlcm9fbmFtZV9sYi5zdHJpbmcgPSBcIlwiO1xuICAgICAgICB0aGlzLnRpdGxlX25hbWVfbGIgPSB0aGlzLnNlZWtDaGlsZChcInRpdGxlX25hbWVcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnRpdGxlX25hbWVfbGIuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgLy/oi7Hpm4Tnq4vnu5hcbiAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwiaGVyb19kcmF3X2ljb25cIik7XG4gICAgICAgIHRoaXMuaGVyb19kcmF3X2ljb25fc3AgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImhlcm9fZHJhd19pY29uXCIsIGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuaGVyb19kcmF3X2ljb25feCA9IHRoaXMuaGVyb19kcmF3X2ljb25fbmQueDtcbiAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl95ID0gdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC55O1xuXG4gICAgICAgIC8v5bqV6YOo6Z2i5p2/XG4gICAgICAgIHRoaXMuYm90dG9tX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJib3R0b21fcGFuZWxcIik7XG5cbiAgICAgICAgLy/oi7Hpm4Tkv6Hmga/pnaLmnb9cbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwiaGVyb19wYW5lbFwiKTtcbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsX3ggPSB0aGlzLmhlcm9fcGFuZWwueDtcbiAgICAgICAgdGhpcy5oZXJvX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgIHRoaXMuaGVyb19wYW5lbC5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMubW9kZV9ub2RlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5oZXJvX3BhbmVsLCBcIm1vZGVsX25vZGVcIik7XG4gICAgICAgIHRoaXMuaGVyb19wYW5lbF9iZ19uZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuaGVyb19wYW5lbCwgXCJiZ1wiKTtcbiAgICAgICAgdGhpcy5saW5lX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5oZXJvX3BhbmVsLCBcImxpbmVcIik7XG4gICAgICAgIHRoaXMubmFtZV9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuaGVyb19wYW5lbCwgXCJuYW1lXCIsIGNjLkxhYmVsKTtcblxuXG4gICAgICAgIC8v5bGe5oCn6Z2i5p2/XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImF0dHJfcGFuZWxcIik7XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbF94ID0gdGhpcy5hdHRyX3BhbmVsLng7XG4gICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ICs9IGNjLndpblNpemUud2lkdGggKiAyO1xuICAgICAgICB0aGlzLmF0dHJfcGFuZWwuYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBsZXQgdGltZV9rZXkgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmF0dHJfcGFuZWwsIFwidGltZV9rZXlcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aW1lX2tleS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuacieaViOaXtumXtDpcIik7XG4gICAgICAgIGxldCBhdHRyX2tleSA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYXR0cl9wYW5lbCwgXCJhdHRyX2tleVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGF0dHJfa2V5LnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5bGe5oCn5Yqg5oiQOlwiKTtcblxuICAgICAgICAvL+aXtumXtFxuICAgICAgICB0aGlzLnRpbWVfdmFsX2xiID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5hdHRyX3BhbmVsLCBcInRpbWVfdmFsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdCA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2hvd19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJzaG93X2J0blwiKTtcbiAgICAgICAgdGhpcy5zaG93X2J0bl9pY29uX25kID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zaG93X2J0biwgXCJpY29uXCIpO1xuICAgICAgICB0aGlzLmxlZnRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwibGVmdF9idG5cIik7XG4gICAgICAgIHRoaXMucmlnaHRfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5ib3R0b21fcGFuZWwsIFwicmlnaHRfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMubGF5X3Njcm9sbHZpZXcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJsYXlfc2Nyb2xsdmlld1wiKTtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu255uR5ZCs55qE5o6l5Y+jLOS4jemcgOimgeaJi+WKqOiwg+eUqCzlpoLmnpzmmK/kvb/nlKhnY29yZS5HbG9iYWxFdmVudOebkeWQrCzlj6/ku6Xnm7TmjqXosIPnlKhhZGRHbG9iYWxFdmVudFxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmxlZnRfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9Ta2luV2luZG93KGZhbHNlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5yaWdodF9idG4sIGZ1bmN0aW9uICgpIHsgLy/noa7lrprpgInmi6nlvZPliY3nmq7ogqTlgZrkvZzkuLrmmL7npLrnmq7ogqRcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgICAgIGlmICghdGhpcy5za2luX2RhdGFfbGlzdCkgcmV0dXJuXG4gICAgICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgICAgIGlmIChza2luX2RhdGEgJiYgc2tpbl9kYXRhLmlzX3NraW5fZGF0YSkge1xuICAgICAgICAgICAgICAgIC8v5o2i5oiQ5YW25LuW55qu6IKkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVyb192by51c2Vfc2tpbiAhPSBza2luX2RhdGEuc2tpbl9pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMTEwMTkodGhpcy5oZXJvX3ZvLnBhcnRuZXJfaWQsIHNraW5fZGF0YS5za2luX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVyb192by51c2Vfc2tpbiAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8v5o2i5Zue5Y6f5p2l55qu6IKkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIxMTAxOSh0aGlzLmhlcm9fdm8ucGFydG5lcl9pZCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLnNob3dfYnRuLCBmdW5jdGlvbiAoKSB7ICAgLy/mmL7npLpcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgICAgIGlmICghdGhpcy5za2luX2RhdGFfbGlzdCkgcmV0dXJuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3Nob3dfYXR0cikge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3BhbmVsLnggPSB0aGlzLmhlcm9fcGFuZWxfeDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUhlcm9JbmZvKDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dfYnRuX2ljb25fbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93X2J0bl9pY29uX25kLnNldFNjYWxlKC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fcGFuZWwueCArPSBjYy53aW5TaXplLndpZHRoICogMjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpbl9kYXRhICYmIHNraW5fZGF0YS5pc19za2luX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggPSB0aGlzLmF0dHJfcGFuZWxfeDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRySW5mbygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ICs9IGNjLndpblNpemUud2lkdGggKiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93X2J0bl9pY29uX25kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd19idG5faWNvbl9uZC5zZXRTY2FsZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMilcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhlcm9FdmVudC5IZXJvX1NraW5fSW5mb19FdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X3NraW5faW5kZXggPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2tpbl9kYXRhX2xpc3QpIHJldHVyblxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnNraW5fZGF0YV9saXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnNraW5fZGF0YV9saXN0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmlzVW5sb2NrSGVyb1NraW4odi5za2luX2lkKSkge1xuICAgICAgICAgICAgICAgICAgICB2LmlzX2xvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2LmlzX2xvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnVzZV9za2luX2luZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraW5MaXN0KHRoaXMudXNlX3NraW5faW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3NraW5faW5kZXggPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNraW5MaXN0KHRoaXMuc2VsZWN0X3NraW5faW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKGhlcm9fdm8pIHtcbiAgICAgICAgaWYgKCFoZXJvX3ZvKSByZXR1cm5cbiAgICAgICAgdGhpcy5oZXJvX3ZvID0gaGVyb192bztcblxuICAgICAgICBsZXQgYmlkX2NvbmZpZyA9IENvbmZpZy5wYXJ0bmVyX3NraW5fZGF0YS5kYXRhX3BhcnRuZXJfYmlkX2luZm9bdGhpcy5oZXJvX3ZvLmJpZF07XG4gICAgICAgIGlmICghYmlkX2NvbmZpZykgcmV0dXJuXG5cbiAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVt0aGlzLmhlcm9fdm8uYmlkXTtcbiAgICAgICAgaWYgKHBhcnRuZXJfY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLmhlcm9fbmFtZV9sYi5zdHJpbmcgPSBwYXJ0bmVyX2NvbmZpZy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIC8v55qu6IKk5pWw5o2uXG4gICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBza2luX2lkIGluIGJpZF9jb25maWcpIHtcbiAgICAgICAgICAgIGxldCB2ID0gYmlkX2NvbmZpZ1tza2luX2lkXTtcbiAgICAgICAgICAgIGxldCBkYXRhID0ge307XG4gICAgICAgICAgICBkYXRhLmlzX3NraW5fZGF0YSA9IHRydWU7ICAgLy/ooajnpLrmmK/nmq7ogqTmlbDmja5cblxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuaXNVbmxvY2tIZXJvU2tpbih2LnNraW5faWQpKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5pc19sb2NrID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEuaXNfbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLnNraW5faWQgPSBza2luX2lkO1xuICAgICAgICAgICAgZGF0YS5jb25maWcgPSBDb25maWcucGFydG5lcl9za2luX2RhdGEuZGF0YV9za2luX2luZm9bdi5za2luX2lkXTtcbiAgICAgICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QucHVzaChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraW5fZGF0YV9saXN0LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJza2luX2lkXCJdKSk7XG4gICAgICAgIC8v56ys5LiA5Liq6IKv5a6a5piv5pys5L2TXG4gICAgICAgIHRoaXMuc2tpbl9kYXRhX2xpc3QudW5zaGlmdCh0aGlzLmhlcm9fdm8pO1xuXG4gICAgICAgIGxldCBzZWxlY3RfaW5kZXggPSAwO1xuICAgICAgICBsZXQgdXNlX3NraW4gPSB0aGlzLmhlcm9fdm8udXNlX3NraW4gfHwgMDtcbiAgICAgICAgaWYgKHVzZV9za2luICE9IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5za2luX2RhdGFfbGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCB2ID0gdGhpcy5za2luX2RhdGFfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodi5za2luX2lkID09IHVzZV9za2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNfc2hvd19hdHRyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTa2luTGlzdChzZWxlY3RfaW5kZXgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTa2luTGlzdDogZnVuY3Rpb24gKHNlbGVjdF9pbmRleCkge1xuXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbF92aWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxfdmlld19zaXplID0gdGhpcy5sYXlfc2Nyb2xsdmlldy5nZXRDb250ZW50U2l6ZSgpO1xuICAgICAgICAgICAgbGV0IGxpc3Rfc2V0dGluZyA9IHtcbiAgICAgICAgICAgICAgICBzdGFydF94OiAwLFxuICAgICAgICAgICAgICAgIHNwYWNlX3g6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRfeTogMCxcbiAgICAgICAgICAgICAgICBzcGFjZV95OiAwLFxuICAgICAgICAgICAgICAgIGl0ZW1fd2lkdGg6IDEyMCxcbiAgICAgICAgICAgICAgICBpdGVtX2hlaWdodDogMTIwLFxuICAgICAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgICAgICBjb2w6IDEsXG4gICAgICAgICAgICAgICAgbmVlZF9keW5hbWljOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXdTaW5nbGVMYXlvdXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMubGF5X3Njcm9sbHZpZXcsIGNjLnYyKDAsIDApLCBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwsIFNjcm9sbFZpZXdTdGFydFBvcy50b3AsIHNjcm9sbF92aWV3X3NpemUsIGxpc3Rfc2V0dGluZywgY2MudjIoMC41LCAwLjUpKVxuXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLmNyZWF0ZU5ld0NlbGwuYmluZCh0aGlzKSwgU2Nyb2xsVmlld0Z1bmNUeXBlLkNyZWF0ZU5ld0NlbGwpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLm51bWJlck9mQ2VsbHMuYmluZCh0aGlzKSwgU2Nyb2xsVmlld0Z1bmNUeXBlLk51bWJlck9mQ2VsbHMpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnJlZ2lzdGVyU2NyaXB0SGFuZGxlclNpbmdsZSh0aGlzLnVwZGF0ZUNlbGxCeUluZGV4LmJpbmQodGhpcyksIFNjcm9sbFZpZXdGdW5jVHlwZS5VcGRhdGVDZWxsQnlJbmRleClcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcucmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlKHRoaXMub25DZWxsVG91Y2hlZC5iaW5kKHRoaXMpLCBTY3JvbGxWaWV3RnVuY1R5cGUuT25DZWxsVG91Y2hlZClcbiAgICAgICAgICAgIGxldCBtYXhfY291bnQgPSBNYXRoLmZsb29yKHNjcm9sbF92aWV3X3NpemUud2lkdGggLyBsaXN0X3NldHRpbmcuaXRlbV93aWR0aCk7XG4gICAgICAgICAgICBpZiAodGhpcy5za2luX2RhdGFfbGlzdC5sZW5ndGggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5zZXRDbGlja0VuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzZWxlY3RfaW5kZXggPSBzZWxlY3RfaW5kZXggfHwgMDtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5yZWxvYWREYXRhKHNlbGVjdF9pbmRleCk7XG4gICAgfSxcblxuICAgIC8vICAgICAtLeWIm+W7umNlbGwgXG4gICAgLy8gLS1Ad2lkdGgg5pivc2V0dGluZy5pdGVtX3dpZHRoXG4gICAgLy8gLS1AaGVpZ2h0IOaYr3NldHRpbmcuaXRlbV9oZWlnaHRcbiAgICBjcmVhdGVOZXdDZWxsOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBsZXQgY2VsbCA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICBjZWxsLmluaXRDb25maWcoZmFsc2UsIDEsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgY2VsbC5zaG93KCk7XG4gICAgICAgIGNlbGwuc2V0RGVmYXVsdFRpcCgpO1xuICAgICAgICBjZWxsLnNldFF1YWxpdHlCRyhCYWNrUGFja0NvbnN0LnF1YWxpdHkub3JhbmdlKTtcbiAgICAgICAgY2VsbC5hZGRDYWxsQmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2VsbFRvdWNoZWQoY2VsbClcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICByZXR1cm4gY2VsbFxuICAgIH0sXG5cbiAgICAvL+iOt+WPluaVsOaNruaVsOmHj1xuICAgIG51bWJlck9mQ2VsbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNraW5fZGF0YV9saXN0KSByZXR1cm4gMFxuICAgICAgICByZXR1cm4gdGhpcy5za2luX2RhdGFfbGlzdC5sZW5ndGhcbiAgICB9LFxuXG4gICAgLy8gLS3mm7TmlrBjZWxsKOaLluWKqOeahOaXtuWAmS7liLfmlrDmlbDmja7ml7blgJnkvJrmiafooYzmrKHmlrnms5UpXG4gICAgLy8gLS1jZWxsIDpjcmVhdGVOZXdDZWxs55qE6L+U5Zue55qE5a+56LGhXG4gICAgLy8gLS1pbmRleCA65pWw5o2u55qE57Si5byVXG4gICAgdXBkYXRlQ2VsbEJ5SW5kZXg6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICB0aGlzLnN0YXJ0VXBkYXRlKDEwMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2VsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFza2luX2RhdGEpIHJldHVyblxuICAgICAgICAgICAgbGV0IGljb25fcmVzID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWNvbl9yZXMgPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHNraW5fZGF0YS5jb25maWcuaGVhZF9pZCk7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRJdGVtSWNvbihpY29uX3Jlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHNraW5fZGF0YS5pc19sb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbGwuc2V0SXRlbUljb25VbkVuYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5zZXRJdGVtSWNvblVuRW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gVXRpbHMuZ2V0Tm9yS2V5KHNraW5fZGF0YS5iaWQsIHNraW5fZGF0YS5zdGFyKTtcbiAgICAgICAgICAgICAgICBsZXQgc3Rhcl9jb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9zdGFyXCIsIFtrZXldKTtcbiAgICAgICAgICAgICAgICBpZiAoc3Rhcl9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWNvbl9yZXMgPSBQYXRoVG9vbC5nZXRIZWFkUmVzKHN0YXJfY29uZmlnLmhlYWRfaWQpO1xuICAgICAgICAgICAgICAgICAgICBjZWxsLnNldEl0ZW1JY29uKGljb25fcmVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjZWxsLnNldEl0ZW1JY29uVW5FbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0X3NraW5faW5kZXggIT0gbnVsbCAmJiB0aGlzLnNlbGVjdF9za2luX2luZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSk7XG4gICAgfSxcblxuICAgIC8v54K55Ye7Y2VsbCAu6ZyA6KaB5ZyoIGNyZWF0ZU5ld0NlbGwg6K6+572u54K55Ye75LqL5Lu2XG4gICAgb25DZWxsVG91Y2hlZDogZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbl9jbGlja19idG4pIHJldHVyblxuICAgICAgICBpZiAoY2VsbC5pbmRleCA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgbGV0IGluZGV4ID0gY2VsbC5pbmRleDtcbiAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbaW5kZXhdO1xuICAgICAgICBpZiAoIXNraW5fZGF0YSkgcmV0dXJuXG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICBpZiAoc2tpbl9kYXRhLmlzX2xvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExvY2tJbmZvKHNraW5fZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0X2NlbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RfY2VsbC5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RfY2VsbCA9IGNlbGw7XG4gICAgICAgIHRoaXMuc2VsZWN0X2NlbGwuc2V0U2VsZWN0ZWQodHJ1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0U2tpbkluZm8oaW5kZXgpXG4gICAgfSxcblxuICAgIC8v5pu05paw6YCJ5Lit55qE55qu6IKk5L+h5oGvXG4gICAgdXBkYXRlU2VsZWN0U2tpbkluZm86IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0X3NraW5faW5kZXggJiYgdGhpcy5zZWxlY3Rfc2tpbl9pbmRleCA9PSBpbmRleCkgcmV0dXJuXG4gICAgICAgIHRoaXMuc2VsZWN0X3NraW5faW5kZXggPSBpbmRleDtcbiAgICAgICAgbGV0IHNraW5fZGF0YSA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbdGhpcy5zZWxlY3Rfc2tpbl9pbmRleF07XG5cbiAgICAgICAgbGV0IG5hbWVfc3RyID0gXCJcIjtcblxuICAgICAgICBpZiAoc2tpbl9kYXRhLmNvbmZpZykge1xuICAgICAgICAgICAgbmFtZV9zdHIgPSBza2luX2RhdGEuY29uZmlnLnNraW5fbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBnZGF0YShcInBhcnRuZXJfZGF0YVwiLCBcImRhdGFfcGFydG5lcl9saWJyYXJ5XCIsIFtza2luX2RhdGEuYmlkXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgbmFtZV9zdHIgPSBjb25maWcudGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXRsZV9uYW1lX2xiLnN0cmluZyA9IG5hbWVfc3RyO1xuXG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNraW5fY29uZmlnID0gc2tpbl9kYXRhLmNvbmZpZztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3Nob3dfYXR0cikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0cl9wYW5lbC54ID0gdGhpcy5hdHRyX3BhbmVsX3g7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRySW5mbygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfcGFuZWwueCArPSBjYy53aW5TaXplLndpZHRoICogMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v6Iux6ZuE5a+56LGhXG4gICAgICAgICAgICB0aGlzLnNraW5fY29uZmlnID0gZ2RhdGEoXCJwYXJ0bmVyX2RhdGFcIiwgXCJkYXRhX3BhcnRuZXJfbGlicmFyeVwiLCBbc2tpbl9kYXRhLmJpZF0pO1xuICAgICAgICAgICAgdGhpcy5hdHRyX3BhbmVsLnggKz0gY2Mud2luU2l6ZS53aWR0aCAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZURyYXdJbmZvKCk7XG4gICAgICAgIGlmICghdGhpcy5pc19zaG93X2F0dHIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSGVyb0luZm8oMik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0TG9ja0luZm86IGZ1bmN0aW9uIChza2luX2RhdGEsIGluZGV4KSB7XG4gICAgICAgIGxldCBkaWNfaXRlbV9pZCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpIGluIHNraW5fZGF0YS5jb25maWcuaXRlbV9pZF9saXN0KSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBza2luX2RhdGEuY29uZmlnLml0ZW1faWRfbGlzdFtpXTtcbiAgICAgICAgICAgIGRpY19pdGVtX2lkW2lkXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGF2ZV9pdGVtID0gbnVsbDtcbiAgICAgICAgbGV0IGhhdmVfbGlzdCA9IFtdO1xuICAgICAgICBsZXQgbGlzdCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFnSXRlbUxpc3QoQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSykgfHwge307XG4gICAgICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jb25maWcgJiYgZGljX2l0ZW1faWRbaXRlbS5jb25maWcuaWRdKSB7XG4gICAgICAgICAgICAgICAgLy/og4zljIXkuIrmnInpgZPlhbdcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbmZpZy5jbGllbnRfZWZmZWN0WzBdICYmIGl0ZW0uY29uZmlnLmNsaWVudF9lZmZlY3RbMF1bMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50aW1lID0gaXRlbS5jb25maWcuY2xpZW50X2VmZmVjdFswXVsxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRpbWUgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50aW1lID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy/ooajnpLrmnInmsLjkuYXnmoTnmq7ogqRcbiAgICAgICAgICAgICAgICAgICAgaGF2ZV9pdGVtID0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YS5pdGVtX2luZm8gPSBpdGVtO1xuICAgICAgICAgICAgICAgIGhhdmVfbGlzdC5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXZlX2l0ZW0pIHtcbiAgICAgICAgICAgIC8v6KGo56S65pyJ5rC45LmF55qE55qu6IKkXG4gICAgICAgICAgICB0aGlzLnVzZVNraW5JdGVtQnlJRChoYXZlX2l0ZW0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhdmVfbGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBoYXZlX2xpc3Quc29ydChVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInRpbWVcIl0pKTtcbiAgICAgICAgICAgIHRoaXMudXNlU2tpbkl0ZW1CeUlEKGhhdmVfbGlzdFswXS5pdGVtX2luZm8sIGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v6K+05piO6K+l55qu6IKk5LiN6IO95ZCM5ZWG5Z+O6I635Y+WXG4gICAgICAgICAgICAvLyBpZiAoc2tpbl9kYXRhLmNvbmZpZy5pc19zaG9wID09IDApIHtcbiAgICAgICAgICAgIC8vICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5pqC5pyq6I635Y+W5q2k55qu6IKk77yM6K+35YmN5b6A55u45YWz5rS75Yqo5oiW546p5rOV5Lit6I635Y+W77yBXCIpKTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdvdG9Ta2luQWN0aW9uKHNraW5fZGF0YS5jb25maWcpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5L2/55So55qu6IKk6YGT5YW3XG4gICAgdXNlU2tpbkl0ZW1CeUlEOiBmdW5jdGlvbiAoaGF2ZV9pdGVtLCBpbmRleCkge1xuICAgICAgICBpZiAoaGF2ZV9pdGVtLmNvbmZpZykge1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gQmFja1BhY2tDb25zdC5nZXRXaGl0ZVF1YWxpdHlDb2xvclN0cihoYXZlX2l0ZW0uY29uZmlnLnF1YWxpdHkpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW3suaLpeacieino+mUgemBk+WFtyzmmK/lkKbmtojogJc8ZGl2IGZvbnRjb2xvcj0jJXM+JXM8L2Rpdj7op6PplIHor6Xnmq7ogqTvvJ9cIiksIGNvbG9yLCBoYXZlX2l0ZW0uY29uZmlnLm5hbWUpO1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlX3NraW5faW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZW5kZXIxMDUxNShoYXZlX2l0ZW0uaWQsIDEpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICBDb21tb25BbGVydC5zaG93KHN0ciwgVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIGNhbGxiYWNrLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMiwgbnVsbCwgeyB0aXRsZTogVXRpbHMuVEkxOE4oXCLop6PplIHnmq7ogqRcIikgfSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+i3s+i9rOa0u+WKqGlkXG4gICAgZ290b1NraW5BY3Rpb246IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy/kvJjlhYjmib7nmq7ogqTmtLvliqhcbiAgICAgICAgICAgIGlmIChjb25maWcuYWN0aW9uX2JpZCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgLy/mmK/lkKblrZjlnKhcbiAgICAgICAgICAgICAgICBsZXQgaXNfZXhpc3QgPSBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkuY2hlY2tBY3Rpb25FeGlzdEJ5QWN0aW9uQmlkKGNvbmZpZy5hY3Rpb25fYmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNfZXhpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFVwZGF0ZSgxMDAsIGZ1bmN0aW9uICgpIHsgQWN0aW9uQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5BY3Rpb25NYWluUGFuZWwodHJ1ZSwgbnVsbCwgY29uZmlnLmFjdGlvbl9iaWQpOyB9LmJpbmQodGhpcyksIDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5tYWluX2lkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNfaGFzID0gTWFpblVJQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEZ1Y250aW9uSWNvblZvQnlJZChjb25maWcubWFpbl9pZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzX2hhcykge1xuICAgICAgICAgICAgICAgICAgICBVdGlscy5jbG9zZUFsbFdpbmRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBkYXRlKDEwMCwgZnVuY3Rpb24gKCkgeyBBY3Rpb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkJ1eVNraW5XaW5kb3codHJ1ZSk7IH0uYmluZCh0aGlzKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+ayoeacieearuiCpOa0u+WKqCDmib7mtLvliqjllYbln45cbiAgICAgICAgICAgIGxldCBzaG9wX2NvbmZpZyA9IENvbmZpZy5leGNoYW5nZV9kYXRhLmRhdGFfc2hvcF9saXN0W01hbGxDb25zdC5NYWxsVHlwZS5IZXJvU2tpbl07XG4gICAgICAgICAgICBpZiAoY29uZmlnLmlzX3Nob3AgPT0gMSAmJiBzaG9wX2NvbmZpZyAmJiBzaG9wX2NvbmZpZy5zb3J0ICE9IDApIHtcbiAgICAgICAgICAgICAgICBNYWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5NYWxsUGFuZWwodHJ1ZSwgTWFsbENvbnN0Lk1hbGxUeXBlLkhlcm9Ta2luKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+ayoeaciea0u+WKqOWVhuWfjiDmj5DnpLo6XG4gICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5pqC5peg6K+l55qu6IKk6I635Y+W6YCU5b6EXCIpKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpXG5cbiAgICAgICAgbGV0IHN0ciA9IFV0aWxzLlRJMThOKFwi5b2T5YmN5pqC5pyq5oul5pyJ6K+l55qu6IKkLOaYr+WQpuWJjeW+gOiOt+WPlu+8n1wiKTtcbiAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHIsIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBjYWxsYmFjaywgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIG51bGwsIG51bGwsIHsgdGl0bGU6IFV0aWxzLlRJMThOKFwi6Kej6ZSB55qu6IKkXCIpIH0pO1xuICAgIH0sXG5cbiAgICAvL+abtOaWsOeri+e7mOS/oeaBr1xuICAgIHVwZGF0ZURyYXdJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5za2luX2NvbmZpZykgcmV0dXJuXG4gICAgICAgIGxldCBkcmF3X3Jlc19pZCA9IHRoaXMuc2tpbl9jb25maWcuZHJhd19yZXM7XG4gICAgICAgIGlmIChkcmF3X3Jlc19pZCA9PSBudWxsIHx8IGRyYXdfcmVzX2lkID09IFwiXCIpIHtcbiAgICAgICAgICAgIGRyYXdfcmVzX2lkID0gdGhpcy5nZXREZWZhdWx0RHJhd1JlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcmF3X3Jlc19pZCkge1xuICAgICAgICAgICAgbGV0IGJnX3JlcyA9IFBhdGhUb29sLmdldEljb25QYXRoKFwiaGVyb2RyYXcvaGVyb2RyYXdyZXNcIiwgZHJhd19yZXNfaWQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19kcmF3X2ljb25fc3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMoYmdfcmVzLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9zcC5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNraW5fY29uZmlnLnNjYWxlID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fZHJhd19pY29uX25kLnNjYWxlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC5zY2FsZSA9IHRoaXMuc2tpbl9jb25maWcuc2NhbGUgLyAxMDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNraW5fY29uZmlnLmRyYXdfb2Zmc2V0ICYmIFV0aWxzLm5leHQodGhpcy5za2luX2NvbmZpZy5kcmF3X29mZnNldCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRfeCA9IHRoaXMuc2tpbl9jb25maWcuZHJhd19vZmZzZXRbMF1bMF0gfHwgMDtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X3kgPSB0aGlzLnNraW5fY29uZmlnLmRyYXdfb2Zmc2V0WzBdWzFdIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2RyYXdfaWNvbl9uZC5zZXRQb3NpdGlvbih0aGlzLmhlcm9fZHJhd19pY29uX3ggKyBvZmZzZXRfeCwgdGhpcy5oZXJvX2RyYXdfaWNvbl95ICsgb2Zmc2V0X3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pi+56S65bGe5oCnXG4gICAgdXBkYXRlQXR0ckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNraW5fY29uZmlnKSByZXR1cm5cbiAgICAgICAgbGV0IGVuZF90aW1lID0gdGhpcy5tb2RlbC5nZXRIZXJvU2tpbkluZm9CeVNraW5JRCh0aGlzLnNraW5fY29uZmlnLnNraW5faWQpO1xuICAgICAgICBpZiAoZW5kX3RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVuZF90aW1lID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVfdmFsX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5rC45LmFXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV92YWxfbGIubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZSA9IGVuZF90aW1lIC0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX3ZhbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIjAwOjAwOjAwXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLmNvbW1vbkNvdW50RG93blRpbWUodGhpcy50aW1lX3ZhbF9sYiwgdGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB5ID0gMjc7XG4gICAgICAgIGxldCB3aWR0aF9pdGVtID0gMTUwO1xuICAgICAgICBsZXQgb2Zmc2V0X3ggPSAxNTA7XG4gICAgICAgIGxldCBzaXplID0gY2Muc2l6ZSh3aWR0aF9pdGVtLCAzNSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmF0dHJfaXRlbV9saXN0KSB7XG4gICAgICAgICAgICBsZXQgdiA9IHRoaXMuYXR0cl9pdGVtX2xpc3RbaV07XG4gICAgICAgICAgICB2LmJnX3NwLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB2LmtleV9ydC5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnNraW5fY29uZmlnLnNraW5fYXR0cikge1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLnNraW5fY29uZmlnLnNraW5fYXR0cltpXTtcbiAgICAgICAgICAgIGxldCB4ID0gMjAwICsgKGkgLSAxKSAqIHdpZHRoX2l0ZW0gKyBvZmZzZXRfeDtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJfaXRlbV9saXN0W2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfaXRlbV9saXN0W2ldID0gdGhpcy5jcmVhdGVBdHRySXRlbSh4LCB5LCBzaXplKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5iZ19zcC5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYXJyID0gVXRpbHMuY29tbW9uR2V0QXR0ckluZm9CeUtleVZhbHVlKHZbMF0sIHZbMV0pO1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNjLmpzLmZvcm1hdFN0cihcIjxpbWcgc3JjPSclcycvPiAlcyArICVzXCIsIGFyci5pY29uLCBhcnIuYXR0cl9uYW1lLCBhcnIuYXR0cl92YWwpO1xuICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQuc3RyaW5nID0gc3RyO1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKGFyci5yZXMsIChmdW5jdGlvbiAocmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyX2l0ZW1fbGlzdFtpXS5rZXlfcnQuYWRkU3ByaXRlRnJhbWUocmVzT2JqZWN0KTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Yib5bu65bGe5oCnaXRlbVxuICAgIGNyZWF0ZUF0dHJJdGVtOiBmdW5jdGlvbiAoeCwgeSwgc2l6ZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHt9O1xuICAgICAgICBsZXQgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhlcm9cIiwgXCJwYXJ0bmVyX3NraW5fMDNcIik7XG4gICAgICAgIGl0ZW0uYmdfc3AgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLmF0dHJfcGFuZWwsIG51bGwsIHgsIHksIGNjLnYyKDAsIDAuNSksIG51bGwsIDAsIHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgIGl0ZW0uYmdfc3Auc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgfSlcbiAgICAgICAgaXRlbS5iZ19zcC5ub2RlLnNldENvbnRlbnRTaXplKHNpemUpO1xuICAgICAgICBpdGVtLmtleV9ydCA9IFV0aWxzLmNyZWF0ZVJpY2hMYWJlbCgyMiwgdGhpcy5jb2xvcl8xLCBjYy52MigwLCAwLjUpLCBjYy52Mih4ICsgMTAsIHkpLCAyNCwgMzgwLCB0aGlzLmF0dHJfcGFuZWwsIFwibGVmdFwiKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgLy/mm7TmlrDoi7Hpm4Tkv6Hmga9cbiAgICAvL+adpea6kOS9jee9riAxIOihqOekuiDmjIlzaG93X2J0biDnmoQgICAyIOihqOekuiDmjInnmq7ogqTlpLTlg4/nmoRcbiAgICB1cGRhdGVIZXJvSW5mbzogZnVuY3Rpb24gKGZvcm1fdHlwZSkge1xuICAgICAgICBsZXQgc2tpbl9kYXRhID0gdGhpcy5za2luX2RhdGFfbGlzdFt0aGlzLnNlbGVjdF9za2luX2luZGV4XTtcbiAgICAgICAgbGV0IGhlcm9fY29uZmlnID0gbnVsbDtcbiAgICAgICAgbGV0IHNraW5faWQgPSAwO1xuICAgICAgICBsZXQgaGVyb192byA9IHRoaXMuc2tpbl9kYXRhX2xpc3RbMF07XG4gICAgICAgIGlmIChza2luX2RhdGEuaXNfc2tpbl9kYXRhKSB7XG4gICAgICAgICAgICBoZXJvX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9za2luX2RhdGFcIiwgXCJkYXRhX2hlcm9faW5mb1wiLCBbc2tpbl9kYXRhLnNraW5faWRdKTtcbiAgICAgICAgICAgIHNraW5faWQgPSBza2luX2RhdGEuY29uZmlnLnNraW5faWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTcGluZShoZXJvX3ZvLCBza2luX2lkLCBmb3JtX3R5cGUpO1xuXG4gICAgICAgIC8v6K+05piO5pyJ5Lyg6K6wXG4gICAgICAgIGlmIChoZXJvX2NvbmZpZykge1xuICAgICAgICAgICAgLy8gdGhpcy5saW5lX25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0aGlzLm5hbWVfbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5qih5Z6LLOS5n+aYr+WIneWni+WMluaooeWei1xuICAgIC8vQGlzX3JlZnJlc2ggIOaYr+WQpumcgOimgeajgOa1i1xuICAgIHVwZGF0ZVNwaW5lOiBmdW5jdGlvbiAoaGVyb192bywgc2tpbl9pZCwgZm9ybV90eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZF9za2luX2lkICE9IG51bGwgJiYgdGhpcy5yZWNvcmRfc2tpbl9pZCA9PSBza2luX2lkKSByZXR1cm5cbiAgICAgICAgdGhpcy5yZWNvcmRfc2tpbl9pZCA9IHNraW5faWQ7XG5cbiAgICAgICAgbGV0IGZ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zcGluZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lLnNldFBhcmVudCh0aGlzLm1vZGVfbm9kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5zZXRQb3NpdGlvbigwLCAxMDQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUuc2V0RGF0YShCYXNlUm9sZS50eXBlLnBhcnRuZXIsIGhlcm9fdm8sIFBsYXllckFjdGlvbi5zaG93LCB0cnVlLCAwLjQ1LCB7IHNraW5faWQ6IHNraW5faWQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGluZS5zaG93U2hhZG93VUkodHJ1ZSk7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGNjLmZhZGVJbigwLjIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BpbmUubm9kZS5ydW5BY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5zcGluZS5ub2RlLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc3BpbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jYW5fY2xpY2tfYnRuID0gdHJ1ZTtcbiAgICAgICAgICAgIGZ1bigpO1xuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgaWYgKHRoaXMuc3BpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuX2NsaWNrX2J0biA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGZvcm1fdHlwZSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGNjLmZhZGVPdXQoMC4yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lLm5vZGUucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGFjdGlvbiwgY2MuY2FsbEZ1bmMoY2FsbGJhY2spKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZ1bigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57y655yB55qE5qih5Z6LaWRcbiAgICBnZXREZWZhdWx0TW9kZVJlczogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcGFydG5lcl9jb25maWcgPSB0aGlzLmdldFBhcnRuZXJDb25maWcoKVswXTtcbiAgICAgICAgbGV0IHN0YXJfY29uZmlnID0gdGhpcy5nZXRQYXJ0bmVyQ29uZmlnKClbMV07XG4gICAgICAgIGlmIChwYXJ0bmVyX2NvbmZpZyAmJiBzdGFyX2NvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJfY29uZmlnLnJlc19pZFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W57y655yB55qE5qih5Z6L56uL57uYXG4gICAgZ2V0RGVmYXVsdERyYXdSZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHBhcnRuZXJfY29uZmlnID0gdGhpcy5nZXRQYXJ0bmVyQ29uZmlnKClbMF07XG4gICAgICAgIGxldCBzdGFyX2NvbmZpZyA9IHRoaXMuZ2V0UGFydG5lckNvbmZpZygpWzFdO1xuICAgICAgICBpZiAocGFydG5lcl9jb25maWcgJiYgc3Rhcl9jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0bmVyX2NvbmZpZy5kcmF3X3Jlc1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W6Iux6ZuE5a+55bqU6YWN572uXG4gICAgZ2V0UGFydG5lckNvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVyb192bykgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLnBhcnRuZXJfY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFydG5lcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9iYXNlW3RoaXMuaGVyb192by5iaWRdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcnRuZXJfY29uZmlnICYmIHRoaXMuc3Rhcl9jb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleSA9IFV0aWxzLmdldE5vcktleSh0aGlzLnBhcnRuZXJfY29uZmlnLmJpZCwgdGhpcy5wYXJ0bmVyX2NvbmZpZy5pbml0X3N0YXIpO1xuICAgICAgICAgICAgdGhpcy5zdGFyX2NvbmZpZyA9IGdkYXRhKFwicGFydG5lcl9kYXRhXCIsIFwiZGF0YV9wYXJ0bmVyX3N0YXJcIiwgW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5wYXJ0bmVyX2NvbmZpZywgdGhpcy5zdGFyX2NvbmZpZ11cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZV92YWxfbGIubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xuICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9Ta2luV2luZG93KCk7XG4gICAgfSxcbn0pIl19
|