|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/mainscene/view/mainscene.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, '693f99CVQFBN5FORw91LWR9', 'mainscene');
|
// Scripts/mod/mainscene/view/mainscene.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 主城
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var LoaderManager = require("loadermanager");
|
|
var SceneCtrl = require("mainscene_controller");
|
|
var SceneEvent = require("mainscene_event");
|
|
var SceneConst = require("scene_const");
|
|
var BuildItem = require("build_item");
|
|
var GuideController = require("guide_controller");
|
|
var MainScene = cc.Class({
|
"extends": BaseClass,
|
properties: {
|
build_list: null,
|
effect_render_list: [],
|
config: null,
|
cur_time_type: 1,
|
// 当前时间类型
|
map_type: null,
|
last_map_res: [],
|
// 存储地图的资源路径
|
scene_effect: [],
|
get_build_cb: {
|
"default": {}
|
},
|
build_items: {
|
"default": {}
|
}
|
},
|
ctor: function ctor() {
|
this.config = arguments[0];
|
this.initConfig();
|
this.createRootWnd();
|
this.registerEvent();
|
this.createScene();
|
},
|
// 初始化一些配置数据
|
initConfig: function initConfig() {
|
this.size = cc.size(1440, 1280); // 地图尺寸
|
|
this.layer_num = 4; // 当前地图层数
|
|
this.map_layer = []; // 地图层级
|
|
this.speed_list = [0.2, 0, -0.15, 0]; // 各层地图相对一定的速度
|
|
this.init_x = 0;
|
this.init_y = 0;
|
this.map_cache = []; // 带创建的地图列表
|
|
this.layer_img_list = ["1.png", "2.png", "3.png", "4.jpg"];
|
this.last_point = null;
|
},
|
setTimeType: function setTimeType(timevalue) {
|
var cur_type;
|
|
if (timevalue >= 6 && timevalue < 18) {
|
cur_type = 1;
|
} else {
|
cur_type = 2;
|
}
|
|
if (this.cur_time_type !== cur_type) {
|
this.cur_time_type = cur_type;
|
if (this.root.active) this.changeSceneMap();
|
}
|
},
|
getTiemType: function getTiemType() {
|
var myDate = new Date();
|
var curTime = myDate.getHours();
|
var cur_time_type = 2;
|
|
if (curTime >= 6 && curTime <= 18) {
|
cur_time_type = 1;
|
}
|
|
return cur_time_type;
|
},
|
// 创建主城相关节点
|
createRootWnd: function createRootWnd() {
|
this.root = new cc.Node("base_root");
|
this.root.setAnchorPoint(0, 0);
|
var scene_scale = this.scene_scale = 1;
|
var width_scale = this.width_scale = 1;
|
|
if (window.FIT_HEIDGHT) {
|
width_scale = FIT_SCALE;
|
}
|
|
if (window.FIT_WIDTH) {
|
scene_scale = FIT_SCALE;
|
}
|
|
this.root.setContentSize(SCREEN_WIDTH * width_scale, SCREEN_HEIGHT);
|
this.root.setPosition(-SCREEN_WIDTH * 0.5 * width_scale, -SCREEN_HEIGHT * 0.5 * scene_scale);
|
this.root.addComponent(cc.Mask); // 设置剪辑区域
|
|
ViewManager.getInstance().addToSceneNode(this.root, SCENE_TAG.scene);
|
this.root.scale = scene_scale;
|
this.rootShowY = this.root.y;
|
this.rootHideY = -this.root.height * 2; // 主的操作节点
|
|
this.root_wnd = new cc.Node("handle_root");
|
this.root_wnd.setAnchorPoint(0, 0);
|
this.root_wnd.setContentSize(this.size);
|
this.root_wnd.parent = this.root; // 地图层级
|
|
for (var index = 0; index < this.layer_num; index++) {
|
var map_layer = new cc.Node("map_layer" + index);
|
map_layer.setAnchorPoint(0, 0);
|
map_layer.setContentSize(this.size);
|
this.root_wnd.addChild(map_layer, 10 - index);
|
this.map_layer[index] = {
|
node: map_layer,
|
index: index,
|
sprite: null,
|
frame: null,
|
res: null
|
};
|
} // 初始化坐标
|
|
|
this.init_x = (SCREEN_WIDTH - this.size.width) * 0.5;
|
this.init_y = (SCREEN_HEIGHT - this.size.height) * 0.5;
|
this.updateMainScene(this.init_x, this.init_y);
|
this.playBackgroundMusic();
|
},
|
// 注册监听事件,这里包含场景的
|
registerEvent: function registerEvent() {
|
var self = this;
|
this.root.on(cc.Node.EventType.TOUCH_START, function (event) {
|
self.last_point = null;
|
var _iteratorNormalCompletion = true;
|
var _didIteratorError = false;
|
var _iteratorError = undefined;
|
|
try {
|
for (var _iterator = self.map_layer[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
var iterator = _step.value;
|
|
if (iterator.node) {
|
iterator.node.stopAllActions();
|
}
|
}
|
} catch (err) {
|
_didIteratorError = true;
|
_iteratorError = err;
|
} finally {
|
try {
|
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
|
_iterator["return"]();
|
}
|
} finally {
|
if (_didIteratorError) {
|
throw _iteratorError;
|
}
|
}
|
}
|
|
self.root_wnd.stopAllActions();
|
}, this);
|
this.root.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
|
var touches = event.getTouches();
|
self.last_point = touches[0].getDelta();
|
self.moveMainScene(self.last_point.x);
|
}, this);
|
this.root.on(cc.Node.EventType.TOUCH_END, function (event) {
|
if (self.last_point == null) {
|
return;
|
}
|
|
var interval_x = self.last_point.x * 3; // var interval_x = (self.last_point.x/Math.abs(self.last_point.x)) * 30;
|
|
var temp_x = self.root_wnd.getPosition().x + interval_x;
|
var target_x = self.scaleCheckPoint(temp_x);
|
var _iteratorNormalCompletion2 = true;
|
var _didIteratorError2 = false;
|
var _iteratorError2 = undefined;
|
|
try {
|
for (var _iterator2 = self.map_layer[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
var iterator = _step2.value;
|
|
if (iterator.node) {
|
var speed = self.speed_list[iterator.index];
|
var move_to = cc.moveTo(2, (target_x - self.init_x) * speed, 0).easing(cc.easeBackOut());
|
iterator.node.runAction(move_to);
|
}
|
}
|
} catch (err) {
|
_didIteratorError2 = true;
|
_iteratorError2 = err;
|
} finally {
|
try {
|
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
|
_iterator2["return"]();
|
}
|
} finally {
|
if (_didIteratorError2) {
|
throw _iteratorError2;
|
}
|
}
|
}
|
|
var root_move_to = cc.moveTo(2, target_x, self.init_y);
|
self.root_wnd.runAction(root_move_to.easing(cc.easeBackOut()));
|
}, this);
|
},
|
// 设置主城是否可见
|
setVisible: function setVisible(status) {
|
if (!status) {
|
// this.rootY = this.root.y;
|
this.root.y = this.rootHideY; // this.root.active = status;
|
} else {
|
var cur_time_type = this.getTiemType();
|
|
if (cur_time_type !== this.cur_time_type) {
|
this.changeSceneMap();
|
}
|
|
this.root.y = this.rootShowY;
|
}
|
},
|
// 移动主城位置
|
updateMainScene: function updateMainScene(x, y) {
|
y = y ? y : this.init_y;
|
|
for (var index = 0; index < this.map_layer.length; index++) {
|
var element = this.map_layer[index];
|
var speed = this.speed_list[index];
|
element.node.setPosition((x - this.init_x) * speed, y - this.init_y);
|
}
|
|
this.root_wnd.setPosition(x, y);
|
},
|
// 创建具体显示数据,包括背景,马赛克等
|
createScene: function createScene() {
|
this.cur_time_type = this.getTiemType(); // this.changeSceneMap();
|
|
this.renderSmallPic();
|
gcore.Timer.set(function () {
|
this.changeSceneMap();
|
}.bind(this), 2000, 1);
|
var build_list = SceneCtrl.getInstance().getBuildList();
|
|
if (Utils.isEmpty(build_list) && !this.wait_create_build_event) {
|
this.create_build_vo = gcore.GlobalEvent.bind(SceneEvent.CreateBuildVoOver, function () {
|
this.wait_create_build_event = null;
|
gcore.GlobalEvent.unbind(this.create_build_vo);
|
this.beforeCreateBuild();
|
}.bind(this));
|
} else {
|
this.beforeCreateBuild();
|
} // this.quequeCreateEffect();
|
// 开始预加载资源
|
|
|
DownloadManager.getInstance().checkAnimaCache();
|
},
|
// 延迟创建地图
|
mainLoop: function mainLoop() {
|
if (this.map_cache && this.map_cache.length > 0) {
|
var map_info = this.map_cache.shift();
|
|
if (map_info.res) {
|
LoaderManager.getInstance().loadRes(map_info.res, function (limit_num, res_object) {
|
var map_layer = this.map_layer[map_info.layer];
|
|
if (map_layer && map_layer.node) {
|
if (map_layer.sprite == null) {
|
map_layer.sprite = new cc.Node();
|
map_layer.sprite.setPosition(map_info.pos);
|
map_layer.sprite.setAnchorPoint(map_info.ap);
|
|
if (map_info.layer == 3) {
|
//最后一层的时候需要放大4倍
|
if (this.cur_time_type == 1) {
|
map_layer.sprite.setScale(4);
|
} else {
|
map_layer.sprite.setScale(1);
|
}
|
}
|
|
map_layer.node.addChild(map_layer.sprite, -1);
|
map_layer.frame = map_layer.sprite.addComponent(cc.Sprite);
|
}
|
|
map_layer.frame.spriteFrame = res_object;
|
|
if (map_layer.res) {
|
LoaderManager.getInstance().releaseRes(map_layer.res);
|
}
|
|
map_layer.res = map_info.res; // 储存资源,到时候切换时间的时候要释放掉的
|
}
|
|
if (limit_num == 0) {
|
if (this.small_sprite) {
|
this.small_sprite.destroy();
|
this.small_sprite = null;
|
LoaderManager.getInstance().deleteRes("res/centerscene/preview/centercity_1");
|
}
|
}
|
}.bind(this, this.map_cache.length));
|
}
|
}
|
|
if (this.effect_render_list.length > 0) this.quequeCreateEffect();
|
|
if (this.effect_render_list == 0 && this.map_cache.length == 0) {
|
gcore.Timer.del(this.timer);
|
this.timer = null;
|
}
|
},
|
// 创建马赛克地图
|
renderSmallPic: function renderSmallPic() {
|
var small_path = "res/centerscene/preview/centercity_" + this.cur_time_type + ".jpg";
|
if (small_path && this.small_path) return;
|
LoaderManager.getInstance().loadRes(small_path, function (res_object) {
|
this.small_sprite = new cc.Node();
|
this.small_sprite.setPosition(0, 0);
|
this.small_sprite.setAnchorPoint(0, 0);
|
this.root_wnd.addChild(this.small_sprite, 1);
|
var sprite = this.small_sprite.addComponent(cc.Sprite);
|
sprite.spriteFrame = res_object;
|
var size = this.small_sprite.getContentSize();
|
this.small_sprite.setScale(this.size.width / size.width, this.size.height / size.height);
|
}.bind(this));
|
this.small_path = small_path;
|
},
|
// 设置待创建资源
|
renderMapPic: function renderMapPic() {
|
var map_res = "res/centerscene/centercity/" + this.map_type;
|
|
for (var index = 0; index < this.layer_img_list.length; index++) {
|
var pos = cc.v2(0, 0);
|
var ap = cc.v2(0, 0);
|
var element = this.layer_img_list[index]; // var res_path = map_res + "/" + (index + 1) + "/" + element;
|
|
var res_path = map_res + "/" + element;
|
|
if (index == 0) {
|
pos.x = -80;
|
} else if (index == 1) {} else if (index == 2) {
|
pos.x = 59;
|
pos.y = 472;
|
} else {
|
pos.y = this.size.height;
|
ap.y = 1;
|
}
|
|
this.map_cache.push({
|
res: res_path,
|
layer: index,
|
pos: pos,
|
ap: ap
|
});
|
}
|
},
|
// 地图移动
|
moveMainScene: function moveMainScene(x) {
|
if (GuideController.getInstance().isInGuide()) return;
|
x = this.root_wnd.getPosition().x + x;
|
|
var _x = this.scaleCheckPoint(x);
|
|
this.updateMainScene(_x);
|
},
|
moveToBuild: function moveToBuild(id) {
|
if (this.build_items[id]) {
|
var build_nd = this.build_items[id].root_wnd;
|
var build_word_pos = build_nd.convertToWorldSpaceAR(cc.v2(0, 0));
|
var final_pso = this.root_wnd.convertToNodeSpaceAR(build_word_pos); // var _x = this.scaleCheckPoint(-(final_pso.x - cc.winSize.width * 0.5));
|
|
var _x = this.scaleCheckPoint(-(final_pso.x - SCREEN_WIDTH * 0.5));
|
|
this.updateMainScene(_x);
|
}
|
},
|
// 判断点是否越界
|
scaleCheckPoint: function scaleCheckPoint(x) {
|
var _x = x;
|
|
if (x > 0) {
|
_x = 0;
|
} else if (x < this.root.width - this.size.width) {
|
_x = this.root.width - this.size.width;
|
}
|
|
return _x;
|
},
|
beforeCreateBuild: function beforeCreateBuild() {
|
var build_list = SceneCtrl.getInstance().getBuildList();
|
var listNum = Object.keys(build_list).length;
|
var scheIndex = 0;
|
var createItemSche = gcore.Timer.set(function () {
|
var buildKey = Object.keys(build_list)[scheIndex];
|
var buildInfo = build_list[buildKey];
|
this.createBuildItem(buildInfo);
|
|
if (scheIndex == listNum - 1) {
|
gcore.Timer.del(createItemSche);
|
}
|
|
scheIndex++;
|
}.bind(this), 100, listNum); // var battle_drama_model = require("battle_drama_controller").getInstance().getModel();
|
// battle_drama_model.preloadDramaScene();
|
},
|
createBuildItem: function createBuildItem(buildInfo) {
|
var build_item = new BuildItem(buildInfo, SceneConst.BuildItemType.build);
|
var layerIndex = buildInfo.config.layer;
|
this.map_layer[layerIndex - 1].node.addChild(build_item.root_wnd, 999); // 判断节点
|
|
this.build_items[buildInfo.config.bid] = build_item;
|
|
if (this.get_build_cb[buildInfo.config.bid]) {
|
var calbacks = this.get_build_cb[buildInfo.config.bid];
|
|
for (var cb_i in calbacks) {
|
calbacks[cb_i](build_item);
|
}
|
}
|
},
|
changeSceneMap: function changeSceneMap() {
|
if (!this.map_type || this.map_type !== this.cur_time_type) {
|
this.map_type = this.cur_time_type;
|
this.renderSmallPic();
|
this.renderMapPic();
|
this.changeSceneEffect(); // 开始创建地图
|
|
if (!this.timer) {
|
this.timer = gcore.Timer.set(function () {
|
this.mainLoop();
|
}.bind(this), 400, -1);
|
}
|
}
|
},
|
// 改变当前场景的一些特效
|
changeSceneEffect: function changeSceneEffect() {
|
if (this.effect_render_list.length > 0) {
|
this.effect_render_list.length = [];
|
}
|
|
for (var effectIndex in this.scene_effect) {
|
this.scene_effect[effectIndex].deleteMe(); // var effectIten = this.scene_effect.shift();
|
// effectIten.deleteMe();
|
}
|
|
this.analysisEffect();
|
},
|
// 解析特效数据
|
analysisEffect: function analysisEffect() {
|
this.effect_render_list = [];
|
|
if (this.config && this.config.building_list) {
|
for (var buildIndex in this.config.building_list) {
|
var buildItem = this.config.building_list[buildIndex];
|
|
if (buildItem.dun_id == 0 || this.cur_time_type == buildItem.dun_id) {
|
if (buildItem.type !== SceneConst.BuildItemType.build) {
|
if (buildItem && buildItem.res) {
|
if (buildItem.res == "E54539" || buildItem.res == "E54540") {
|
continue;
|
}
|
}
|
|
this.effect_render_list.push(buildItem);
|
}
|
}
|
}
|
}
|
},
|
// 创建场景特效
|
quequeCreateEffect: function quequeCreateEffect() {
|
// for (var effectIndx = 0; effectIndx < this.effect_render_list.length; effectIndx ++) {
|
var effectConf = this.effect_render_list.shift();
|
var buildItem = new BuildItem(effectConf, effectConf.type);
|
this.map_layer[effectConf.layer - 1].node.addChild(buildItem.root_wnd);
|
this.scene_effect.push(buildItem); // }
|
},
|
playBackgroundMusic: function playBackgroundMusic() {
|
Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true);
|
},
|
getBuildById: function getBuildById(id, finish_cb) {
|
if (this.build_items[id]) {
|
finish_cb(this.build_items[id]);
|
} else {
|
if (!this.get_build_cb[id]) this.get_build_cb[id] = [];
|
this.get_build_cb[id].push(finish_cb);
|
}
|
|
cc.log(this.get_build_cb);
|
}
|
});
|
module.exports = MainScene;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWluc2NlbmVcXHZpZXdcXG1haW5zY2VuZS5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlNjZW5lQ3RybCIsIlNjZW5lRXZlbnQiLCJTY2VuZUNvbnN0IiwiQnVpbGRJdGVtIiwiR3VpZGVDb250cm9sbGVyIiwiTWFpblNjZW5lIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsInByb3BlcnRpZXMiLCJidWlsZF9saXN0IiwiZWZmZWN0X3JlbmRlcl9saXN0IiwiY29uZmlnIiwiY3VyX3RpbWVfdHlwZSIsIm1hcF90eXBlIiwibGFzdF9tYXBfcmVzIiwic2NlbmVfZWZmZWN0IiwiZ2V0X2J1aWxkX2NiIiwiYnVpbGRfaXRlbXMiLCJjdG9yIiwiYXJndW1lbnRzIiwiaW5pdENvbmZpZyIsImNyZWF0ZVJvb3RXbmQiLCJyZWdpc3RlckV2ZW50IiwiY3JlYXRlU2NlbmUiLCJzaXplIiwibGF5ZXJfbnVtIiwibWFwX2xheWVyIiwic3BlZWRfbGlzdCIsImluaXRfeCIsImluaXRfeSIsIm1hcF9jYWNoZSIsImxheWVyX2ltZ19saXN0IiwibGFzdF9wb2ludCIsInNldFRpbWVUeXBlIiwidGltZXZhbHVlIiwiY3VyX3R5cGUiLCJyb290IiwiYWN0aXZlIiwiY2hhbmdlU2NlbmVNYXAiLCJnZXRUaWVtVHlwZSIsIm15RGF0ZSIsIkRhdGUiLCJjdXJUaW1lIiwiZ2V0SG91cnMiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJzY2VuZV9zY2FsZSIsIndpZHRoX3NjYWxlIiwid2luZG93IiwiRklUX0hFSURHSFQiLCJGSVRfU0NBTEUiLCJGSVRfV0lEVEgiLCJzZXRDb250ZW50U2l6ZSIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJzZXRQb3NpdGlvbiIsImFkZENvbXBvbmVudCIsIk1hc2siLCJWaWV3TWFuYWdlciIsImdldEluc3RhbmNlIiwiYWRkVG9TY2VuZU5vZGUiLCJTQ0VORV9UQUciLCJzY2VuZSIsInNjYWxlIiwicm9vdFNob3dZIiwieSIsInJvb3RIaWRlWSIsImhlaWdodCIsInJvb3Rfd25kIiwicGFyZW50IiwiaW5kZXgiLCJhZGRDaGlsZCIsIm5vZGUiLCJzcHJpdGUiLCJmcmFtZSIsInJlcyIsIndpZHRoIiwidXBkYXRlTWFpblNjZW5lIiwicGxheUJhY2tncm91bmRNdXNpYyIsInNlbGYiLCJvbiIsIkV2ZW50VHlwZSIsIlRPVUNIX1NUQVJUIiwiZXZlbnQiLCJpdGVyYXRvciIsInN0b3BBbGxBY3Rpb25zIiwiVE9VQ0hfTU9WRSIsInRvdWNoZXMiLCJnZXRUb3VjaGVzIiwiZ2V0RGVsdGEiLCJtb3ZlTWFpblNjZW5lIiwieCIsIlRPVUNIX0VORCIsImludGVydmFsX3giLCJ0ZW1wX3giLCJnZXRQb3NpdGlvbiIsInRhcmdldF94Iiwic2NhbGVDaGVja1BvaW50Iiwic3BlZWQiLCJtb3ZlX3RvIiwibW92ZVRvIiwiZWFzaW5nIiwiZWFzZUJhY2tPdXQiLCJydW5BY3Rpb24iLCJyb290X21vdmVfdG8iLCJzZXRWaXNpYmxlIiwic3RhdHVzIiwibGVuZ3RoIiwiZWxlbWVudCIsInJlbmRlclNtYWxsUGljIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImJpbmQiLCJnZXRCdWlsZExpc3QiLCJVdGlscyIsImlzRW1wdHkiLCJ3YWl0X2NyZWF0ZV9idWlsZF9ldmVudCIsImNyZWF0ZV9idWlsZF92byIsIkdsb2JhbEV2ZW50IiwiQ3JlYXRlQnVpbGRWb092ZXIiLCJ1bmJpbmQiLCJiZWZvcmVDcmVhdGVCdWlsZCIsIkRvd25sb2FkTWFuYWdlciIsImNoZWNrQW5pbWFDYWNoZSIsIm1haW5Mb29wIiwibWFwX2luZm8iLCJzaGlmdCIsImxvYWRSZXMiLCJsaW1pdF9udW0iLCJyZXNfb2JqZWN0IiwibGF5ZXIiLCJwb3MiLCJhcCIsInNldFNjYWxlIiwiU3ByaXRlIiwic3ByaXRlRnJhbWUiLCJyZWxlYXNlUmVzIiwic21hbGxfc3ByaXRlIiwiZGVzdHJveSIsImRlbGV0ZVJlcyIsInF1ZXF1ZUNyZWF0ZUVmZmVjdCIsImRlbCIsInRpbWVyIiwic21hbGxfcGF0aCIsImdldENvbnRlbnRTaXplIiwicmVuZGVyTWFwUGljIiwibWFwX3JlcyIsInYyIiwicmVzX3BhdGgiLCJwdXNoIiwiaXNJbkd1aWRlIiwiX3giLCJtb3ZlVG9CdWlsZCIsImlkIiwiYnVpbGRfbmQiLCJidWlsZF93b3JkX3BvcyIsImNvbnZlcnRUb1dvcmxkU3BhY2VBUiIsImZpbmFsX3BzbyIsImNvbnZlcnRUb05vZGVTcGFjZUFSIiwibGlzdE51bSIsIk9iamVjdCIsImtleXMiLCJzY2hlSW5kZXgiLCJjcmVhdGVJdGVtU2NoZSIsImJ1aWxkS2V5IiwiYnVpbGRJbmZvIiwiY3JlYXRlQnVpbGRJdGVtIiwiYnVpbGRfaXRlbSIsIkJ1aWxkSXRlbVR5cGUiLCJidWlsZCIsImxheWVySW5kZXgiLCJiaWQiLCJjYWxiYWNrcyIsImNiX2kiLCJjaGFuZ2VTY2VuZUVmZmVjdCIsImVmZmVjdEluZGV4IiwiZGVsZXRlTWUiLCJhbmFseXNpc0VmZmVjdCIsImJ1aWxkaW5nX2xpc3QiLCJidWlsZEluZGV4IiwiYnVpbGRJdGVtIiwiZHVuX2lkIiwidHlwZSIsImVmZmVjdENvbmYiLCJwbGF5TXVzaWMiLCJBVURJT19UWVBFIiwiU0NFTkUiLCJnZXRCdWlsZEJ5SWQiLCJmaW5pc2hfY2IiLCJsb2ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLGFBQWEsR0FBR0MsT0FBTyxDQUFDLGVBQUQsQ0FBM0I7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsc0JBQUQsQ0FBdkI7O0FBQ0EsSUFBSUUsVUFBVSxHQUFHRixPQUFPLENBQUMsaUJBQUQsQ0FBeEI7O0FBQ0EsSUFBSUcsVUFBVSxHQUFHSCxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlLLGVBQWUsR0FBR0wsT0FBTyxDQUFDLGtCQUFELENBQTdCOztBQUVBLElBQUlNLFNBQVMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDckIsYUFBU0MsU0FEWTtBQUdyQkMsRUFBQUEsVUFBVSxFQUFFO0FBQ1JDLElBQUFBLFVBQVUsRUFBRSxJQURKO0FBRVJDLElBQUFBLGtCQUFrQixFQUFFLEVBRlo7QUFHUkMsSUFBQUEsTUFBTSxFQUFFLElBSEE7QUFJUkMsSUFBQUEsYUFBYSxFQUFFLENBSlA7QUFJb0I7QUFDNUJDLElBQUFBLFFBQVEsRUFBRSxJQUxGO0FBTVJDLElBQUFBLFlBQVksRUFBRSxFQU5OO0FBTW9CO0FBQzVCQyxJQUFBQSxZQUFZLEVBQUUsRUFQTjtBQVFSQyxJQUFBQSxZQUFZLEVBQUU7QUFDVixpQkFBUztBQURDLEtBUk47QUFXUkMsSUFBQUEsV0FBVyxFQUFFO0FBQ1QsaUJBQVM7QUFEQTtBQVhMLEdBSFM7QUFtQnJCQyxFQUFBQSxJQUFJLEVBQUMsZ0JBQVU7QUFDWCxTQUFLUCxNQUFMLEdBQWNRLFNBQVMsQ0FBQyxDQUFELENBQXZCO0FBQ0EsU0FBS0MsVUFBTDtBQUNBLFNBQUtDLGFBQUw7QUFDQSxTQUFLQyxhQUFMO0FBQ0EsU0FBS0MsV0FBTDtBQUNILEdBekJvQjtBQTJCckI7QUFDQUgsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFNBQUtJLElBQUwsR0FBWW5CLEVBQUUsQ0FBQ21CLElBQUgsQ0FBUSxJQUFSLEVBQWMsSUFBZCxDQUFaLENBRG9CLENBQ3dCOztBQUM1QyxTQUFLQyxTQUFMLEdBQWlCLENBQWpCLENBRm9CLENBRXdCOztBQUM1QyxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBSG9CLENBR3dCOztBQUM1QyxTQUFLQyxVQUFMLEdBQWtCLENBQUMsR0FBRCxFQUFNLENBQU4sRUFBUyxDQUFDLElBQVYsRUFBZ0IsQ0FBaEIsQ0FBbEIsQ0FKb0IsQ0FJb0I7O0FBQ3hDLFNBQUtDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsU0FBS0MsTUFBTCxHQUFjLENBQWQ7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBUG9CLENBT3dCOztBQUM1QyxTQUFLQyxjQUFMLEdBQXNCLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEIsT0FBNUIsQ0FBdEI7QUFFQSxTQUFLQyxVQUFMLEdBQWtCLElBQWxCO0FBQ0gsR0F2Q29CO0FBeUNyQkMsRUFBQUEsV0FBVyxFQUFFLHFCQUFTQyxTQUFULEVBQW9CO0FBQzdCLFFBQUlDLFFBQUo7O0FBQ0EsUUFBSUQsU0FBUyxJQUFJLENBQWIsSUFBa0JBLFNBQVMsR0FBRyxFQUFsQyxFQUFzQztBQUNsQ0MsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDSCxLQUZELE1BRU87QUFDSEEsTUFBQUEsUUFBUSxHQUFHLENBQVg7QUFDSDs7QUFFRCxRQUFJLEtBQUt2QixhQUFMLEtBQXVCdUIsUUFBM0IsRUFBcUM7QUFDakMsV0FBS3ZCLGFBQUwsR0FBcUJ1QixRQUFyQjtBQUNBLFVBQUksS0FBS0MsSUFBTCxDQUFVQyxNQUFkLEVBQXNCLEtBQUtDLGNBQUw7QUFDekI7QUFDSixHQXJEb0I7QUF1RHJCQyxFQUFBQSxXQUFXLEVBQUUsdUJBQVc7QUFDcEIsUUFBSUMsTUFBTSxHQUFHLElBQUlDLElBQUosRUFBYjtBQUNBLFFBQUlDLE9BQU8sR0FBR0YsTUFBTSxDQUFDRyxRQUFQLEVBQWQ7QUFDQSxRQUFJL0IsYUFBYSxHQUFHLENBQXBCOztBQUNBLFFBQUk4QixPQUFPLElBQUksQ0FBWCxJQUFnQkEsT0FBTyxJQUFJLEVBQS9CLEVBQW1DO0FBQy9COUIsTUFBQUEsYUFBYSxHQUFHLENBQWhCO0FBQ0g7O0FBQ0QsV0FBT0EsYUFBUDtBQUNILEdBL0RvQjtBQWlFckI7QUFDQVMsRUFBQUEsYUFBYSxFQUFFLHlCQUFVO0FBQ3JCLFNBQUtlLElBQUwsR0FBWSxJQUFJL0IsRUFBRSxDQUFDdUMsSUFBUCxDQUFZLFdBQVosQ0FBWjtBQUNBLFNBQUtSLElBQUwsQ0FBVVMsY0FBVixDQUF5QixDQUF6QixFQUE0QixDQUE1QjtBQUNBLFFBQUlDLFdBQVcsR0FBRyxLQUFLQSxXQUFMLEdBQW1CLENBQXJDO0FBQ0EsUUFBSUMsV0FBVyxHQUFHLEtBQUtBLFdBQUwsR0FBbUIsQ0FBckM7O0FBRUEsUUFBSUMsTUFBTSxDQUFDQyxXQUFYLEVBQXdCO0FBQ3BCRixNQUFBQSxXQUFXLEdBQUdHLFNBQWQ7QUFDSDs7QUFFRCxRQUFJRixNQUFNLENBQUNHLFNBQVgsRUFBc0I7QUFDbEJMLE1BQUFBLFdBQVcsR0FBR0ksU0FBZDtBQUNIOztBQUVELFNBQUtkLElBQUwsQ0FBVWdCLGNBQVYsQ0FBeUJDLFlBQVksR0FBR04sV0FBeEMsRUFBcURPLGFBQXJEO0FBQ0EsU0FBS2xCLElBQUwsQ0FBVW1CLFdBQVYsQ0FBc0IsQ0FBQ0YsWUFBRCxHQUFnQixHQUFoQixHQUFzQk4sV0FBNUMsRUFBeUQsQ0FBQ08sYUFBRCxHQUFpQixHQUFqQixHQUF1QlIsV0FBaEY7QUFDQSxTQUFLVixJQUFMLENBQVVvQixZQUFWLENBQXVCbkQsRUFBRSxDQUFDb0QsSUFBMUIsRUFoQnFCLENBZ0JlOztBQUVwQ0MsSUFBQUEsV0FBVyxDQUFDQyxXQUFaLEdBQTBCQyxjQUExQixDQUF5QyxLQUFLeEIsSUFBOUMsRUFBb0R5QixTQUFTLENBQUNDLEtBQTlEO0FBQ0EsU0FBSzFCLElBQUwsQ0FBVTJCLEtBQVYsR0FBa0JqQixXQUFsQjtBQUVBLFNBQUtrQixTQUFMLEdBQWlCLEtBQUs1QixJQUFMLENBQVU2QixDQUEzQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsQ0FBRSxLQUFLOUIsSUFBTCxDQUFVK0IsTUFBWixHQUFxQixDQUF0QyxDQXRCcUIsQ0F3QnJCOztBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsSUFBSS9ELEVBQUUsQ0FBQ3VDLElBQVAsQ0FBWSxhQUFaLENBQWhCO0FBQ0EsU0FBS3dCLFFBQUwsQ0FBY3ZCLGNBQWQsQ0FBNkIsQ0FBN0IsRUFBZ0MsQ0FBaEM7QUFDQSxTQUFLdUIsUUFBTCxDQUFjaEIsY0FBZCxDQUE2QixLQUFLNUIsSUFBbEM7QUFDQSxTQUFLNEMsUUFBTCxDQUFjQyxNQUFkLEdBQXVCLEtBQUtqQyxJQUE1QixDQTVCcUIsQ0E4QnJCOztBQUNBLFNBQUssSUFBSWtDLEtBQUssR0FBRyxDQUFqQixFQUFvQkEsS0FBSyxHQUFHLEtBQUs3QyxTQUFqQyxFQUE0QzZDLEtBQUssRUFBakQsRUFBcUQ7QUFDakQsVUFBSTVDLFNBQVMsR0FBRyxJQUFJckIsRUFBRSxDQUFDdUMsSUFBUCxDQUFZLGNBQVkwQixLQUF4QixDQUFoQjtBQUNBNUMsTUFBQUEsU0FBUyxDQUFDbUIsY0FBVixDQUF5QixDQUF6QixFQUE0QixDQUE1QjtBQUNBbkIsTUFBQUEsU0FBUyxDQUFDMEIsY0FBVixDQUF5QixLQUFLNUIsSUFBOUI7QUFDQSxXQUFLNEMsUUFBTCxDQUFjRyxRQUFkLENBQXVCN0MsU0FBdkIsRUFBbUMsS0FBRzRDLEtBQXRDO0FBQ0EsV0FBSzVDLFNBQUwsQ0FBZTRDLEtBQWYsSUFBd0I7QUFBQ0UsUUFBQUEsSUFBSSxFQUFDOUMsU0FBTjtBQUFpQjRDLFFBQUFBLEtBQUssRUFBQ0EsS0FBdkI7QUFBOEJHLFFBQUFBLE1BQU0sRUFBQyxJQUFyQztBQUEyQ0MsUUFBQUEsS0FBSyxFQUFDLElBQWpEO0FBQXVEQyxRQUFBQSxHQUFHLEVBQUM7QUFBM0QsT0FBeEI7QUFDSCxLQXJDb0IsQ0F1Q3JCOzs7QUFDQSxTQUFLL0MsTUFBTCxHQUFjLENBQUN5QixZQUFZLEdBQUcsS0FBSzdCLElBQUwsQ0FBVW9ELEtBQTFCLElBQW1DLEdBQWpEO0FBQ0EsU0FBSy9DLE1BQUwsR0FBYyxDQUFDeUIsYUFBYSxHQUFHLEtBQUs5QixJQUFMLENBQVUyQyxNQUEzQixJQUFxQyxHQUFuRDtBQUNBLFNBQUtVLGVBQUwsQ0FBcUIsS0FBS2pELE1BQTFCLEVBQWtDLEtBQUtDLE1BQXZDO0FBRUEsU0FBS2lELG1CQUFMO0FBQ0gsR0EvR29CO0FBaUhyQjtBQUNBeEQsRUFBQUEsYUFBYSxFQUFFLHlCQUFVO0FBQ3JCLFFBQUl5RCxJQUFJLEdBQUcsSUFBWDtBQUNBLFNBQUszQyxJQUFMLENBQVU0QyxFQUFWLENBQWEzRSxFQUFFLENBQUN1QyxJQUFILENBQVFxQyxTQUFSLENBQWtCQyxXQUEvQixFQUE0QyxVQUFVQyxLQUFWLEVBQWlCO0FBQ3pESixNQUFBQSxJQUFJLENBQUMvQyxVQUFMLEdBQWtCLElBQWxCO0FBRHlEO0FBQUE7QUFBQTs7QUFBQTtBQUV6RCw2QkFBdUIrQyxJQUFJLENBQUNyRCxTQUE1Qiw4SEFBdUM7QUFBQSxjQUE1QjBELFFBQTRCOztBQUNuQyxjQUFJQSxRQUFRLENBQUNaLElBQWIsRUFBa0I7QUFDZFksWUFBQUEsUUFBUSxDQUFDWixJQUFULENBQWNhLGNBQWQ7QUFDSDtBQUNKO0FBTndEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT3pETixNQUFBQSxJQUFJLENBQUNYLFFBQUwsQ0FBY2lCLGNBQWQ7QUFDSCxLQVJELEVBUUcsSUFSSDtBQVVBLFNBQUtqRCxJQUFMLENBQVU0QyxFQUFWLENBQWEzRSxFQUFFLENBQUN1QyxJQUFILENBQVFxQyxTQUFSLENBQWtCSyxVQUEvQixFQUEyQyxVQUFTSCxLQUFULEVBQWU7QUFDdEQsVUFBSUksT0FBTyxHQUFHSixLQUFLLENBQUNLLFVBQU4sRUFBZDtBQUNBVCxNQUFBQSxJQUFJLENBQUMvQyxVQUFMLEdBQWtCdUQsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRSxRQUFYLEVBQWxCO0FBQ0FWLE1BQUFBLElBQUksQ0FBQ1csYUFBTCxDQUFtQlgsSUFBSSxDQUFDL0MsVUFBTCxDQUFnQjJELENBQW5DO0FBQ0gsS0FKRCxFQUlHLElBSkg7QUFNQSxTQUFLdkQsSUFBTCxDQUFVNEMsRUFBVixDQUFhM0UsRUFBRSxDQUFDdUMsSUFBSCxDQUFRcUMsU0FBUixDQUFrQlcsU0FBL0IsRUFBMEMsVUFBU1QsS0FBVCxFQUFlO0FBQ3JELFVBQUlKLElBQUksQ0FBQy9DLFVBQUwsSUFBbUIsSUFBdkIsRUFBNEI7QUFDeEI7QUFDSDs7QUFDRCxVQUFJNkQsVUFBVSxHQUFHZCxJQUFJLENBQUMvQyxVQUFMLENBQWdCMkQsQ0FBaEIsR0FBb0IsQ0FBckMsQ0FKcUQsQ0FLckQ7O0FBQ0EsVUFBSUcsTUFBTSxHQUFHZixJQUFJLENBQUNYLFFBQUwsQ0FBYzJCLFdBQWQsR0FBNEJKLENBQTVCLEdBQWdDRSxVQUE3QztBQUNBLFVBQUlHLFFBQVEsR0FBR2pCLElBQUksQ0FBQ2tCLGVBQUwsQ0FBcUJILE1BQXJCLENBQWY7QUFQcUQ7QUFBQTtBQUFBOztBQUFBO0FBUXJELDhCQUF1QmYsSUFBSSxDQUFDckQsU0FBNUIsbUlBQXVDO0FBQUEsY0FBNUIwRCxRQUE0Qjs7QUFDbkMsY0FBSUEsUUFBUSxDQUFDWixJQUFiLEVBQWtCO0FBQ2QsZ0JBQUkwQixLQUFLLEdBQUduQixJQUFJLENBQUNwRCxVQUFMLENBQWdCeUQsUUFBUSxDQUFDZCxLQUF6QixDQUFaO0FBQ0EsZ0JBQUk2QixPQUFPLEdBQUc5RixFQUFFLENBQUMrRixNQUFILENBQVUsQ0FBVixFQUFhLENBQUNKLFFBQVEsR0FBR2pCLElBQUksQ0FBQ25ELE1BQWpCLElBQTJCc0UsS0FBeEMsRUFBK0MsQ0FBL0MsRUFBa0RHLE1BQWxELENBQXlEaEcsRUFBRSxDQUFDaUcsV0FBSCxFQUF6RCxDQUFkO0FBQ0FsQixZQUFBQSxRQUFRLENBQUNaLElBQVQsQ0FBYytCLFNBQWQsQ0FBd0JKLE9BQXhCO0FBQ0g7QUFDSjtBQWRvRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWVyRCxVQUFJSyxZQUFZLEdBQUduRyxFQUFFLENBQUMrRixNQUFILENBQVUsQ0FBVixFQUFhSixRQUFiLEVBQXVCakIsSUFBSSxDQUFDbEQsTUFBNUIsQ0FBbkI7QUFDQWtELE1BQUFBLElBQUksQ0FBQ1gsUUFBTCxDQUFjbUMsU0FBZCxDQUF3QkMsWUFBWSxDQUFDSCxNQUFiLENBQW9CaEcsRUFBRSxDQUFDaUcsV0FBSCxFQUFwQixDQUF4QjtBQUVILEtBbEJELEVBa0JHLElBbEJIO0FBbUJILEdBdkpvQjtBQXlKckI7QUFDQUcsRUFBQUEsVUFBVSxFQUFDLG9CQUFTQyxNQUFULEVBQWdCO0FBQ3ZCLFFBQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1Q7QUFDQSxXQUFLdEUsSUFBTCxDQUFVNkIsQ0FBVixHQUFjLEtBQUtDLFNBQW5CLENBRlMsQ0FHVDtBQUNILEtBSkQsTUFJTztBQUNILFVBQUl0RCxhQUFhLEdBQUcsS0FBSzJCLFdBQUwsRUFBcEI7O0FBQ0EsVUFBSTNCLGFBQWEsS0FBSyxLQUFLQSxhQUEzQixFQUEwQztBQUN0QyxhQUFLMEIsY0FBTDtBQUNIOztBQUNELFdBQUtGLElBQUwsQ0FBVTZCLENBQVYsR0FBYyxLQUFLRCxTQUFuQjtBQUNIO0FBQ0osR0F0S29CO0FBd0tyQjtBQUNBYSxFQUFBQSxlQUFlLEVBQUMseUJBQVNjLENBQVQsRUFBWTFCLENBQVosRUFBYztBQUMxQkEsSUFBQUEsQ0FBQyxHQUFHQSxDQUFDLEdBQUdBLENBQUgsR0FBTyxLQUFLcEMsTUFBakI7O0FBQ0EsU0FBSyxJQUFJeUMsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcsS0FBSzVDLFNBQUwsQ0FBZWlGLE1BQTNDLEVBQW1EckMsS0FBSyxFQUF4RCxFQUE0RDtBQUN4RCxVQUFNc0MsT0FBTyxHQUFHLEtBQUtsRixTQUFMLENBQWU0QyxLQUFmLENBQWhCO0FBQ0EsVUFBTTRCLEtBQUssR0FBRyxLQUFLdkUsVUFBTCxDQUFnQjJDLEtBQWhCLENBQWQ7QUFDQXNDLE1BQUFBLE9BQU8sQ0FBQ3BDLElBQVIsQ0FBYWpCLFdBQWIsQ0FBeUIsQ0FBQ29DLENBQUMsR0FBQyxLQUFLL0QsTUFBUixJQUFrQnNFLEtBQTNDLEVBQWtEakMsQ0FBQyxHQUFHLEtBQUtwQyxNQUEzRDtBQUNIOztBQUNELFNBQUt1QyxRQUFMLENBQWNiLFdBQWQsQ0FBMEJvQyxDQUExQixFQUE2QjFCLENBQTdCO0FBQ0gsR0FqTG9CO0FBbUxyQjtBQUNBMUMsRUFBQUEsV0FBVyxFQUFDLHVCQUFVO0FBQ2xCLFNBQUtYLGFBQUwsR0FBcUIsS0FBSzJCLFdBQUwsRUFBckIsQ0FEa0IsQ0FFbEI7O0FBQ0EsU0FBS3NFLGNBQUw7QUFDQUMsSUFBQUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLEdBQVosQ0FBZ0IsWUFBVztBQUN2QixXQUFLMUUsY0FBTDtBQUNILEtBRmUsQ0FFZDJFLElBRmMsQ0FFVCxJQUZTLENBQWhCLEVBRWMsSUFGZCxFQUVvQixDQUZwQjtBQUlBLFFBQUl4RyxVQUFVLEdBQUdWLFNBQVMsQ0FBQzRELFdBQVYsR0FBd0J1RCxZQUF4QixFQUFqQjs7QUFDQSxRQUFJQyxLQUFLLENBQUNDLE9BQU4sQ0FBYzNHLFVBQWQsS0FBNkIsQ0FBQyxLQUFLNEcsdUJBQXZDLEVBQWdFO0FBQzVELFdBQUtDLGVBQUwsR0FBdUJSLEtBQUssQ0FBQ1MsV0FBTixDQUFrQk4sSUFBbEIsQ0FBdUJqSCxVQUFVLENBQUN3SCxpQkFBbEMsRUFBc0QsWUFBVTtBQUNuRixhQUFLSCx1QkFBTCxHQUErQixJQUEvQjtBQUNBUCxRQUFBQSxLQUFLLENBQUNTLFdBQU4sQ0FBa0JFLE1BQWxCLENBQXlCLEtBQUtILGVBQTlCO0FBQ0EsYUFBS0ksaUJBQUw7QUFDSCxPQUoyRSxDQUl6RVQsSUFKeUUsQ0FJcEUsSUFKb0UsQ0FBckQsQ0FBdkI7QUFLSCxLQU5ELE1BTU87QUFDSCxXQUFLUyxpQkFBTDtBQUNILEtBakJpQixDQWtCbEI7QUFDQTs7O0FBQ0FDLElBQUFBLGVBQWUsQ0FBQ2hFLFdBQWhCLEdBQThCaUUsZUFBOUI7QUFDSCxHQXpNb0I7QUEyTXJCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBQyxvQkFBVTtBQUNmLFFBQUksS0FBSy9GLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlNkUsTUFBZixHQUF3QixDQUE5QyxFQUFnRDtBQUM1QyxVQUFJbUIsUUFBUSxHQUFHLEtBQUtoRyxTQUFMLENBQWVpRyxLQUFmLEVBQWY7O0FBQ0EsVUFBSUQsUUFBUSxDQUFDbkQsR0FBYixFQUFpQjtBQUNiOUUsUUFBQUEsYUFBYSxDQUFDOEQsV0FBZCxHQUE0QnFFLE9BQTVCLENBQW9DRixRQUFRLENBQUNuRCxHQUE3QyxFQUFrRCxVQUFTc0QsU0FBVCxFQUFvQkMsVUFBcEIsRUFBK0I7QUFDN0UsY0FBSXhHLFNBQVMsR0FBRyxLQUFLQSxTQUFMLENBQWVvRyxRQUFRLENBQUNLLEtBQXhCLENBQWhCOztBQUNBLGNBQUl6RyxTQUFTLElBQUlBLFNBQVMsQ0FBQzhDLElBQTNCLEVBQWdDO0FBQzVCLGdCQUFJOUMsU0FBUyxDQUFDK0MsTUFBVixJQUFvQixJQUF4QixFQUE2QjtBQUN6Qi9DLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsR0FBbUIsSUFBSXBFLEVBQUUsQ0FBQ3VDLElBQVAsRUFBbkI7QUFDQWxCLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUJsQixXQUFqQixDQUE2QnVFLFFBQVEsQ0FBQ00sR0FBdEM7QUFDQTFHLGNBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUI1QixjQUFqQixDQUFnQ2lGLFFBQVEsQ0FBQ08sRUFBekM7O0FBQ0Esa0JBQUlQLFFBQVEsQ0FBQ0ssS0FBVCxJQUFrQixDQUF0QixFQUF5QjtBQUFJO0FBQ3pCLG9CQUFJLEtBQUt2SCxhQUFMLElBQXNCLENBQTFCLEVBQTZCO0FBQ3pCYyxrQkFBQUEsU0FBUyxDQUFDK0MsTUFBVixDQUFpQjZELFFBQWpCLENBQTBCLENBQTFCO0FBQ0gsaUJBRkQsTUFFTztBQUNINUcsa0JBQUFBLFNBQVMsQ0FBQytDLE1BQVYsQ0FBaUI2RCxRQUFqQixDQUEwQixDQUExQjtBQUNIO0FBQ0o7O0FBQ0Q1RyxjQUFBQSxTQUFTLENBQUM4QyxJQUFWLENBQWVELFFBQWYsQ0FBd0I3QyxTQUFTLENBQUMrQyxNQUFsQyxFQUEwQyxDQUFDLENBQTNDO0FBQ0EvQyxjQUFBQSxTQUFTLENBQUNnRCxLQUFWLEdBQWtCaEQsU0FBUyxDQUFDK0MsTUFBVixDQUFpQmpCLFlBQWpCLENBQThCbkQsRUFBRSxDQUFDa0ksTUFBakMsQ0FBbEI7QUFDSDs7QUFDRDdHLFlBQUFBLFNBQVMsQ0FBQ2dELEtBQVYsQ0FBZ0I4RCxXQUFoQixHQUE4Qk4sVUFBOUI7O0FBQ0EsZ0JBQUl4RyxTQUFTLENBQUNpRCxHQUFkLEVBQW1CO0FBQ2Y5RSxjQUFBQSxhQUFhLENBQUM4RCxXQUFkLEdBQTRCOEUsVUFBNUIsQ0FBdUMvRyxTQUFTLENBQUNpRCxHQUFqRDtBQUNIOztBQUNEakQsWUFBQUEsU0FBUyxDQUFDaUQsR0FBVixHQUFnQm1ELFFBQVEsQ0FBQ25ELEdBQXpCLENBbkI0QixDQW1CUTtBQUN2Qzs7QUFDRCxjQUFJc0QsU0FBUyxJQUFJLENBQWpCLEVBQW9CO0FBQ2hCLGdCQUFJLEtBQUtTLFlBQVQsRUFBc0I7QUFDbEIsbUJBQUtBLFlBQUwsQ0FBa0JDLE9BQWxCO0FBQ0EsbUJBQUtELFlBQUwsR0FBb0IsSUFBcEI7QUFDQTdJLGNBQUFBLGFBQWEsQ0FBQzhELFdBQWQsR0FBNEJpRixTQUE1QixDQUFzQyxzQ0FBdEM7QUFDSDtBQUNKO0FBQ0osU0E5QmlELENBOEJoRDNCLElBOUJnRCxDQThCM0MsSUE5QjJDLEVBOEJyQyxLQUFLbkYsU0FBTCxDQUFlNkUsTUE5QnNCLENBQWxEO0FBK0JIO0FBQ0o7O0FBRUQsUUFBSSxLQUFLakcsa0JBQUwsQ0FBd0JpRyxNQUF4QixHQUFpQyxDQUFyQyxFQUNJLEtBQUtrQyxrQkFBTDs7QUFFSixRQUFJLEtBQUtuSSxrQkFBTCxJQUEyQixDQUEzQixJQUFnQyxLQUFLb0IsU0FBTCxDQUFlNkUsTUFBZixJQUF5QixDQUE3RCxFQUFnRTtBQUM1REcsTUFBQUEsS0FBSyxDQUFDQyxLQUFOLENBQVkrQixHQUFaLENBQWdCLEtBQUtDLEtBQXJCO0FBQ0EsV0FBS0EsS0FBTCxHQUFhLElBQWI7QUFDSDtBQUNKLEdBelBvQjtBQTJQckI7QUFDQWxDLEVBQUFBLGNBQWMsRUFBQywwQkFBVTtBQUNyQixRQUFJbUMsVUFBVSxHQUFJLHdDQUF3QyxLQUFLcEksYUFBN0MsR0FBNkQsTUFBL0U7QUFDQSxRQUFJb0ksVUFBVSxJQUFJLEtBQUtBLFVBQXZCLEVBQ0k7QUFFSm5KLElBQUFBLGFBQWEsQ0FBQzhELFdBQWQsR0FBNEJxRSxPQUE1QixDQUFvQ2dCLFVBQXBDLEVBQWdELFVBQVVkLFVBQVYsRUFBc0I7QUFDbEUsV0FBS1EsWUFBTCxHQUFvQixJQUFJckksRUFBRSxDQUFDdUMsSUFBUCxFQUFwQjtBQUNBLFdBQUs4RixZQUFMLENBQWtCbkYsV0FBbEIsQ0FBOEIsQ0FBOUIsRUFBaUMsQ0FBakM7QUFDQSxXQUFLbUYsWUFBTCxDQUFrQjdGLGNBQWxCLENBQWlDLENBQWpDLEVBQW9DLENBQXBDO0FBQ0EsV0FBS3VCLFFBQUwsQ0FBY0csUUFBZCxDQUF1QixLQUFLbUUsWUFBNUIsRUFBMEMsQ0FBMUM7QUFFQSxVQUFNakUsTUFBTSxHQUFHLEtBQUtpRSxZQUFMLENBQWtCbEYsWUFBbEIsQ0FBK0JuRCxFQUFFLENBQUNrSSxNQUFsQyxDQUFmO0FBQ0E5RCxNQUFBQSxNQUFNLENBQUMrRCxXQUFQLEdBQXFCTixVQUFyQjtBQUNBLFVBQUkxRyxJQUFJLEdBQUcsS0FBS2tILFlBQUwsQ0FBa0JPLGNBQWxCLEVBQVg7QUFDQSxXQUFLUCxZQUFMLENBQWtCSixRQUFsQixDQUEyQixLQUFLOUcsSUFBTCxDQUFVb0QsS0FBVixHQUFrQnBELElBQUksQ0FBQ29ELEtBQWxELEVBQXlELEtBQUtwRCxJQUFMLENBQVUyQyxNQUFWLEdBQW1CM0MsSUFBSSxDQUFDMkMsTUFBakY7QUFDSCxLQVYrQyxDQVU5QzhDLElBVjhDLENBVXpDLElBVnlDLENBQWhEO0FBV0EsU0FBSytCLFVBQUwsR0FBa0JBLFVBQWxCO0FBQ0gsR0E3UW9CO0FBK1FyQjtBQUNBRSxFQUFBQSxZQUFZLEVBQUUsd0JBQVU7QUFDcEIsUUFBSUMsT0FBTyxHQUFHLGdDQUFnQyxLQUFLdEksUUFBbkQ7O0FBQ0EsU0FBSyxJQUFJeUQsS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUcsS0FBS3ZDLGNBQUwsQ0FBb0I0RSxNQUFoRCxFQUF3RHJDLEtBQUssRUFBN0QsRUFBaUU7QUFDN0QsVUFBSThELEdBQUcsR0FBRy9ILEVBQUUsQ0FBQytJLEVBQUgsQ0FBTSxDQUFOLEVBQVMsQ0FBVCxDQUFWO0FBQ0EsVUFBSWYsRUFBRSxHQUFHaEksRUFBRSxDQUFDK0ksRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQVQ7QUFDQSxVQUFNeEMsT0FBTyxHQUFHLEtBQUs3RSxjQUFMLENBQW9CdUMsS0FBcEIsQ0FBaEIsQ0FINkQsQ0FJN0Q7O0FBQ0EsVUFBSStFLFFBQVEsR0FBR0YsT0FBTyxHQUFHLEdBQVYsR0FBaUJ2QyxPQUFoQzs7QUFFQSxVQUFJdEMsS0FBSyxJQUFJLENBQWIsRUFBZ0I7QUFDWjhELFFBQUFBLEdBQUcsQ0FBQ3pDLENBQUosR0FBUSxDQUFDLEVBQVQ7QUFDSCxPQUZELE1BRU0sSUFBSXJCLEtBQUssSUFBSSxDQUFiLEVBQWUsQ0FFcEIsQ0FGSyxNQUVBLElBQUlBLEtBQUssSUFBSSxDQUFiLEVBQWU7QUFDakI4RCxRQUFBQSxHQUFHLENBQUN6QyxDQUFKLEdBQVEsRUFBUjtBQUNBeUMsUUFBQUEsR0FBRyxDQUFDbkUsQ0FBSixHQUFRLEdBQVI7QUFDSCxPQUhLLE1BR0Q7QUFDRG1FLFFBQUFBLEdBQUcsQ0FBQ25FLENBQUosR0FBUSxLQUFLekMsSUFBTCxDQUFVMkMsTUFBbEI7QUFDQWtFLFFBQUFBLEVBQUUsQ0FBQ3BFLENBQUgsR0FBTyxDQUFQO0FBQ0g7O0FBQ0QsV0FBS25DLFNBQUwsQ0FBZXdILElBQWYsQ0FBb0I7QUFBQzNFLFFBQUFBLEdBQUcsRUFBQzBFLFFBQUw7QUFBZWxCLFFBQUFBLEtBQUssRUFBQzdELEtBQXJCO0FBQTRCOEQsUUFBQUEsR0FBRyxFQUFDQSxHQUFoQztBQUFxQ0MsUUFBQUEsRUFBRSxFQUFDQTtBQUF4QyxPQUFwQjtBQUNIO0FBQ0osR0F0U29CO0FBd1NyQjtBQUNBM0MsRUFBQUEsYUFBYSxFQUFFLHVCQUFVQyxDQUFWLEVBQWE7QUFDeEIsUUFBSXhGLGVBQWUsQ0FBQ3dELFdBQWhCLEdBQThCNEYsU0FBOUIsRUFBSixFQUNJO0FBRUo1RCxJQUFBQSxDQUFDLEdBQUcsS0FBS3ZCLFFBQUwsQ0FBYzJCLFdBQWQsR0FBNEJKLENBQTVCLEdBQWdDQSxDQUFwQzs7QUFDQSxRQUFJNkQsRUFBRSxHQUFHLEtBQUt2RCxlQUFMLENBQXFCTixDQUFyQixDQUFUOztBQUNBLFNBQUtkLGVBQUwsQ0FBcUIyRSxFQUFyQjtBQUNILEdBaFRvQjtBQWtUckJDLEVBQUFBLFdBQVcsRUFBRSxxQkFBU0MsRUFBVCxFQUFhO0FBQ3RCLFFBQUksS0FBS3pJLFdBQUwsQ0FBaUJ5SSxFQUFqQixDQUFKLEVBQTBCO0FBQ3RCLFVBQUlDLFFBQVEsR0FBRyxLQUFLMUksV0FBTCxDQUFpQnlJLEVBQWpCLEVBQXFCdEYsUUFBcEM7QUFDQSxVQUFJd0YsY0FBYyxHQUFHRCxRQUFRLENBQUNFLHFCQUFULENBQStCeEosRUFBRSxDQUFDK0ksRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQS9CLENBQXJCO0FBQ0EsVUFBSVUsU0FBUyxHQUFHLEtBQUsxRixRQUFMLENBQWMyRixvQkFBZCxDQUFtQ0gsY0FBbkMsQ0FBaEIsQ0FIc0IsQ0FLdEI7O0FBQ0EsVUFBSUosRUFBRSxHQUFHLEtBQUt2RCxlQUFMLENBQXFCLEVBQUU2RCxTQUFTLENBQUNuRSxDQUFWLEdBQWN0QyxZQUFZLEdBQUcsR0FBL0IsQ0FBckIsQ0FBVDs7QUFDQSxXQUFLd0IsZUFBTCxDQUFxQjJFLEVBQXJCO0FBQ0g7QUFDSixHQTVUb0I7QUE4VHJCO0FBQ0F2RCxFQUFBQSxlQUFlLEVBQUUseUJBQVVOLENBQVYsRUFBYTtBQUMxQixRQUFJNkQsRUFBRSxHQUFHN0QsQ0FBVDs7QUFDQSxRQUFJQSxDQUFDLEdBQUcsQ0FBUixFQUFXO0FBQ1A2RCxNQUFBQSxFQUFFLEdBQUcsQ0FBTDtBQUNILEtBRkQsTUFFTyxJQUFJN0QsQ0FBQyxHQUFJLEtBQUt2RCxJQUFMLENBQVV3QyxLQUFWLEdBQWtCLEtBQUtwRCxJQUFMLENBQVVvRCxLQUFyQyxFQUE2QztBQUNoRDRFLE1BQUFBLEVBQUUsR0FBRyxLQUFLcEgsSUFBTCxDQUFVd0MsS0FBVixHQUFrQixLQUFLcEQsSUFBTCxDQUFVb0QsS0FBakM7QUFDSDs7QUFDRCxXQUFPNEUsRUFBUDtBQUNILEdBdlVvQjtBQXlVckI5QixFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixRQUFJakgsVUFBVSxHQUFHVixTQUFTLENBQUM0RCxXQUFWLEdBQXdCdUQsWUFBeEIsRUFBakI7QUFDQSxRQUFJOEMsT0FBTyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWXpKLFVBQVosRUFBd0JrRyxNQUF0QztBQUNBLFFBQUl3RCxTQUFTLEdBQUcsQ0FBaEI7QUFDQSxRQUFJQyxjQUFjLEdBQUd0RCxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsR0FBWixDQUFpQixZQUFVO0FBQzVDLFVBQUlxRCxRQUFRLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZekosVUFBWixFQUF3QjBKLFNBQXhCLENBQWY7QUFDQSxVQUFJRyxTQUFTLEdBQUc3SixVQUFVLENBQUM0SixRQUFELENBQTFCO0FBQ0EsV0FBS0UsZUFBTCxDQUFxQkQsU0FBckI7O0FBQ0EsVUFBSUgsU0FBUyxJQUFJSCxPQUFPLEdBQUcsQ0FBM0IsRUFBOEI7QUFDMUJsRCxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWStCLEdBQVosQ0FBZ0JzQixjQUFoQjtBQUNIOztBQUNERCxNQUFBQSxTQUFTO0FBQ1osS0FSb0MsQ0FRbENsRCxJQVJrQyxDQVE3QixJQVI2QixDQUFoQixFQVFOLEdBUk0sRUFRRCtDLE9BUkMsQ0FBckIsQ0FKMEIsQ0FlMUI7QUFDQTtBQUNILEdBMVZvQjtBQTZWckJPLEVBQUFBLGVBQWUsRUFBRSx5QkFBU0QsU0FBVCxFQUFvQjtBQUNqQyxRQUFJRSxVQUFVLEdBQUcsSUFBSXRLLFNBQUosQ0FBY29LLFNBQWQsRUFBeUJySyxVQUFVLENBQUN3SyxhQUFYLENBQXlCQyxLQUFsRCxDQUFqQjtBQUNBLFFBQUlDLFVBQVUsR0FBR0wsU0FBUyxDQUFDM0osTUFBVixDQUFpQndILEtBQWxDO0FBQ0EsU0FBS3pHLFNBQUwsQ0FBZWlKLFVBQVUsR0FBRyxDQUE1QixFQUErQm5HLElBQS9CLENBQW9DRCxRQUFwQyxDQUE2Q2lHLFVBQVUsQ0FBQ3BHLFFBQXhELEVBQWtFLEdBQWxFLEVBSGlDLENBS2pDOztBQUNBLFNBQUtuRCxXQUFMLENBQWlCcUosU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQWxDLElBQXlDSixVQUF6Qzs7QUFDQSxRQUFJLEtBQUt4SixZQUFMLENBQWtCc0osU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQW5DLENBQUosRUFBNkM7QUFDekMsVUFBSUMsUUFBUSxHQUFHLEtBQUs3SixZQUFMLENBQWtCc0osU0FBUyxDQUFDM0osTUFBVixDQUFpQmlLLEdBQW5DLENBQWY7O0FBQ0EsV0FBSyxJQUFJRSxJQUFULElBQWlCRCxRQUFqQixFQUEyQjtBQUN2QkEsUUFBQUEsUUFBUSxDQUFDQyxJQUFELENBQVIsQ0FBZU4sVUFBZjtBQUNIO0FBQ0o7QUFDSixHQTFXb0I7QUE0V3JCbEksRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLekIsUUFBTixJQUFrQixLQUFLQSxRQUFMLEtBQWtCLEtBQUtELGFBQTdDLEVBQTREO0FBQ3hELFdBQUtDLFFBQUwsR0FBZ0IsS0FBS0QsYUFBckI7QUFDQSxXQUFLaUcsY0FBTDtBQUNBLFdBQUtxQyxZQUFMO0FBQ0EsV0FBSzZCLGlCQUFMLEdBSndELENBS3hEOztBQUNBLFVBQUksQ0FBQyxLQUFLaEMsS0FBVixFQUFnQjtBQUNaLGFBQUtBLEtBQUwsR0FBYWpDLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxHQUFaLENBQWlCLFlBQVU7QUFDcEMsZUFBS2EsUUFBTDtBQUNILFNBRjRCLENBRTFCWixJQUYwQixDQUVyQixJQUZxQixDQUFoQixFQUVFLEdBRkYsRUFFTyxDQUFDLENBRlIsQ0FBYjtBQUdIO0FBQ0o7QUFDSixHQXpYb0I7QUEyWHJCO0FBQ0E4RCxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBVztBQUMxQixRQUFJLEtBQUtySyxrQkFBTCxDQUF3QmlHLE1BQXhCLEdBQWlDLENBQXJDLEVBQXdDO0FBQ3BDLFdBQUtqRyxrQkFBTCxDQUF3QmlHLE1BQXhCLEdBQWlDLEVBQWpDO0FBQ0g7O0FBRUQsU0FBSyxJQUFJcUUsV0FBVCxJQUF3QixLQUFLakssWUFBN0IsRUFBMkM7QUFDdkMsV0FBS0EsWUFBTCxDQUFrQmlLLFdBQWxCLEVBQStCQyxRQUEvQixHQUR1QyxDQUV2QztBQUNBO0FBQ0g7O0FBRUQsU0FBS0MsY0FBTDtBQUNILEdBeFlvQjtBQTBZckI7QUFDQUEsRUFBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQ3ZCLFNBQUt4SyxrQkFBTCxHQUEwQixFQUExQjs7QUFDQSxRQUFJLEtBQUtDLE1BQUwsSUFBZSxLQUFLQSxNQUFMLENBQVl3SyxhQUEvQixFQUE4QztBQUMxQyxXQUFLLElBQUlDLFVBQVQsSUFBdUIsS0FBS3pLLE1BQUwsQ0FBWXdLLGFBQW5DLEVBQWtEO0FBQzlDLFlBQUlFLFNBQVMsR0FBRyxLQUFLMUssTUFBTCxDQUFZd0ssYUFBWixDQUEwQkMsVUFBMUIsQ0FBaEI7O0FBQ0EsWUFBSUMsU0FBUyxDQUFDQyxNQUFWLElBQW9CLENBQXBCLElBQXlCLEtBQUsxSyxhQUFMLElBQXNCeUssU0FBUyxDQUFDQyxNQUE3RCxFQUFxRTtBQUNqRSxjQUFJRCxTQUFTLENBQUNFLElBQVYsS0FBb0J0TCxVQUFVLENBQUN3SyxhQUFYLENBQXlCQyxLQUFqRCxFQUF3RDtBQUNwRCxnQkFBSVcsU0FBUyxJQUFJQSxTQUFTLENBQUMxRyxHQUEzQixFQUFnQztBQUM1QixrQkFBSTBHLFNBQVMsQ0FBQzFHLEdBQVYsSUFBaUIsUUFBakIsSUFBNkIwRyxTQUFTLENBQUMxRyxHQUFWLElBQWlCLFFBQWxELEVBQTREO0FBQ3hEO0FBQ0g7QUFDSjs7QUFDRCxpQkFBS2pFLGtCQUFMLENBQXdCNEksSUFBeEIsQ0FBNkIrQixTQUE3QjtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0osR0E1Wm9CO0FBOFpyQjtBQUNBeEMsRUFBQUEsa0JBQWtCLEVBQUUsOEJBQVc7QUFDM0I7QUFDSSxRQUFJMkMsVUFBVSxHQUFHLEtBQUs5SyxrQkFBTCxDQUF3QnFILEtBQXhCLEVBQWpCO0FBQ0EsUUFBSXNELFNBQVMsR0FBRyxJQUFJbkwsU0FBSixDQUFjc0wsVUFBZCxFQUEwQkEsVUFBVSxDQUFDRCxJQUFyQyxDQUFoQjtBQUNBLFNBQUs3SixTQUFMLENBQWU4SixVQUFVLENBQUNyRCxLQUFYLEdBQW1CLENBQWxDLEVBQXFDM0QsSUFBckMsQ0FBMENELFFBQTFDLENBQW1EOEcsU0FBUyxDQUFDakgsUUFBN0Q7QUFDQSxTQUFLckQsWUFBTCxDQUFrQnVJLElBQWxCLENBQXVCK0IsU0FBdkIsRUFMdUIsQ0FNM0I7QUFDSCxHQXRhb0I7QUF3YXJCdkcsRUFBQUEsbUJBQW1CLEVBQUUsK0JBQVc7QUFDNUJxQyxJQUFBQSxLQUFLLENBQUNzRSxTQUFOLENBQWdCQyxVQUFVLENBQUNDLEtBQTNCLEVBQWtDLE9BQWxDLEVBQTJDLElBQTNDO0FBQ0gsR0ExYW9CO0FBNGFyQkMsRUFBQUEsWUFBWSxFQUFFLHNCQUFTbEMsRUFBVCxFQUFhbUMsU0FBYixFQUF1QjtBQUNqQyxRQUFJLEtBQUs1SyxXQUFMLENBQWlCeUksRUFBakIsQ0FBSixFQUEwQjtBQUN0Qm1DLE1BQUFBLFNBQVMsQ0FBQyxLQUFLNUssV0FBTCxDQUFpQnlJLEVBQWpCLENBQUQsQ0FBVDtBQUNILEtBRkQsTUFFTztBQUNILFVBQUksQ0FBQyxLQUFLMUksWUFBTCxDQUFrQjBJLEVBQWxCLENBQUwsRUFDSSxLQUFLMUksWUFBTCxDQUFrQjBJLEVBQWxCLElBQXdCLEVBQXhCO0FBQ0osV0FBSzFJLFlBQUwsQ0FBa0IwSSxFQUFsQixFQUFzQkosSUFBdEIsQ0FBMkJ1QyxTQUEzQjtBQUNIOztBQUVEeEwsSUFBQUEsRUFBRSxDQUFDeUwsR0FBSCxDQUFPLEtBQUs5SyxZQUFaO0FBQ0g7QUF0Ym9CLENBQVQsQ0FBaEI7QUF5YkErSyxNQUFNLENBQUNDLE9BQVAsR0FBaUI1TCxTQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg5Li75Z+OXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIExvYWRlck1hbmFnZXIgPSByZXF1aXJlKFwibG9hZGVybWFuYWdlclwiKTtcbnZhciBTY2VuZUN0cmwgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIik7XG52YXIgU2NlbmVFdmVudCA9IHJlcXVpcmUoXCJtYWluc2NlbmVfZXZlbnRcIik7XG52YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbnZhciBCdWlsZEl0ZW0gPSByZXF1aXJlKFwiYnVpbGRfaXRlbVwiKTtcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIE1haW5TY2VuZSA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGJ1aWxkX2xpc3Q6IG51bGwsXG4gICAgICAgIGVmZmVjdF9yZW5kZXJfbGlzdDogW10sXG4gICAgICAgIGNvbmZpZzogbnVsbCxcbiAgICAgICAgY3VyX3RpbWVfdHlwZTogMSwgICAgICAgICAgIC8vIOW9k+WJjeaXtumXtOexu+Wei1xuICAgICAgICBtYXBfdHlwZTogbnVsbCxcbiAgICAgICAgbGFzdF9tYXBfcmVzOiBbXSwgICAgICAgICAgIC8vIOWtmOWCqOWcsOWbvueahOi1hOa6kOi3r+W+hFxuICAgICAgICBzY2VuZV9lZmZlY3Q6IFtdLFxuICAgICAgICBnZXRfYnVpbGRfY2I6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkX2l0ZW1zOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LCAgICAgICAgXG4gICAgfSxcblxuICAgIGN0b3I6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KClcbiAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnNpemUoMTQ0MCwgMTI4MCk7ICAgICAgICAgICAgLy8g5Zyw5Zu+5bC65a+4XG4gICAgICAgIHRoaXMubGF5ZXJfbnVtID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5Zyw5Zu+5bGC5pWwXG4gICAgICAgIHRoaXMubWFwX2xheWVyID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Zyw5Zu+5bGC57qnXG4gICAgICAgIHRoaXMuc3BlZWRfbGlzdCA9IFswLjIsIDAsIC0wLjE1LCAwXTsgICAvLyDlkITlsYLlnLDlm77nm7jlr7nkuIDlrprnmoTpgJ/luqZcbiAgICAgICAgdGhpcy5pbml0X3ggPSAwO1xuICAgICAgICB0aGlzLmluaXRfeSA9IDA7XG4gICAgICAgIHRoaXMubWFwX2NhY2hlID0gW107ICAgICAgICAgICAgICAgICAgICAgICAgLy8g5bim5Yib5bu655qE5Zyw5Zu+5YiX6KGoXG4gICAgICAgIHRoaXMubGF5ZXJfaW1nX2xpc3QgPSBbXCIxLnBuZ1wiLCBcIjIucG5nXCIsIFwiMy5wbmdcIiwgXCI0LmpwZ1wiXTtcblxuICAgICAgICB0aGlzLmxhc3RfcG9pbnQgPSBudWxsO1xuICAgIH0sXG5cbiAgICBzZXRUaW1lVHlwZTogZnVuY3Rpb24odGltZXZhbHVlKSB7XG4gICAgICAgIHZhciBjdXJfdHlwZTtcbiAgICAgICAgaWYgKHRpbWV2YWx1ZSA+PSA2ICYmIHRpbWV2YWx1ZSA8IDE4KSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJfdHlwZSA9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJfdGltZV90eXBlICE9PSBjdXJfdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJfdGltZV90eXBlID0gY3VyX3R5cGU7XG4gICAgICAgICAgICBpZiAodGhpcy5yb290LmFjdGl2ZSkgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpZW1UeXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG15RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBjdXJUaW1lID0gbXlEYXRlLmdldEhvdXJzKCk7XG4gICAgICAgIHZhciBjdXJfdGltZV90eXBlID0gMjtcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gNiAmJiBjdXJUaW1lIDw9IDE4KSB7XG4gICAgICAgICAgICBjdXJfdGltZV90eXBlID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VyX3RpbWVfdHlwZTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65Li75Z+O55u45YWz6IqC54K5XG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5yb290ID0gbmV3IGNjLk5vZGUoXCJiYXNlX3Jvb3RcIik7XG4gICAgICAgIHRoaXMucm9vdC5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgdmFyIHNjZW5lX3NjYWxlID0gdGhpcy5zY2VuZV9zY2FsZSA9IDE7XG4gICAgICAgIHZhciB3aWR0aF9zY2FsZSA9IHRoaXMud2lkdGhfc2NhbGUgPSAxO1xuXG4gICAgICAgIGlmICh3aW5kb3cuRklUX0hFSURHSFQpIHtcbiAgICAgICAgICAgIHdpZHRoX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5GSVRfV0lEVEgpIHtcbiAgICAgICAgICAgIHNjZW5lX3NjYWxlID0gRklUX1NDQUxFOyAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290LnNldENvbnRlbnRTaXplKFNDUkVFTl9XSURUSCAqIHdpZHRoX3NjYWxlLCBTQ1JFRU5fSEVJR0hUKTtcbiAgICAgICAgdGhpcy5yb290LnNldFBvc2l0aW9uKC1TQ1JFRU5fV0lEVEggKiAwLjUgKiB3aWR0aF9zY2FsZSwgLVNDUkVFTl9IRUlHSFQgKiAwLjUgKiBzY2VuZV9zY2FsZSk7XG4gICAgICAgIHRoaXMucm9vdC5hZGRDb21wb25lbnQoY2MuTWFzayk7ICAgIC8vIOiuvue9ruWJqui+keWMuuWfn1xuXG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5yb290LCBTQ0VORV9UQUcuc2NlbmUpO1xuICAgICAgICB0aGlzLnJvb3Quc2NhbGUgPSBzY2VuZV9zY2FsZTtcblxuICAgICAgICB0aGlzLnJvb3RTaG93WSA9IHRoaXMucm9vdC55O1xuICAgICAgICB0aGlzLnJvb3RIaWRlWSA9IC0gdGhpcy5yb290LmhlaWdodCAqIDI7XG5cbiAgICAgICAgLy8g5Li755qE5pON5L2c6IqC54K5XG4gICAgICAgIHRoaXMucm9vdF93bmQgPSBuZXcgY2MuTm9kZShcImhhbmRsZV9yb290XCIpO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldEFuY2hvclBvaW50KDAsIDApO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucm9vdF93bmQucGFyZW50ID0gdGhpcy5yb290O1xuXG4gICAgICAgIC8vIOWcsOWbvuWxgue6p1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5sYXllcl9udW07IGluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSBuZXcgY2MuTm9kZShcIm1hcF9sYXllclwiK2luZGV4KTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIG1hcF9sYXllci5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hZGRDaGlsZChtYXBfbGF5ZXIsICgxMC1pbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5tYXBfbGF5ZXJbaW5kZXhdID0ge25vZGU6bWFwX2xheWVyLCBpbmRleDppbmRleCwgc3ByaXRlOm51bGwsIGZyYW1lOm51bGwsIHJlczpudWxsfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWIneWni+WMluWdkOagh1xuICAgICAgICB0aGlzLmluaXRfeCA9IChTQ1JFRU5fV0lEVEggLSB0aGlzLnNpemUud2lkdGgpICogMC41O1xuICAgICAgICB0aGlzLmluaXRfeSA9IChTQ1JFRU5fSEVJR0hUIC0gdGhpcy5zaXplLmhlaWdodCkgKiAwLjU7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKHRoaXMuaW5pdF94LCB0aGlzLmluaXRfeSk7XG5cbiAgICAgICAgdGhpcy5wbGF5QmFja2dyb3VuZE11c2ljKCk7XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tizov5nph4zljIXlkKvlnLrmma/nmoRcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXNcbiAgICAgICAgdGhpcy5yb290Lm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHNlbGYubWFwX2xheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5yb290X3duZC5zdG9wQWxsQWN0aW9ucygpXG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9NT1ZFLCBmdW5jdGlvbihldmVudCl7XG4gICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmdldFRvdWNoZXMoKTtcbiAgICAgICAgICAgIHNlbGYubGFzdF9wb2ludCA9IHRvdWNoZXNbMF0uZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHNlbGYubW92ZU1haW5TY2VuZShzZWxmLmxhc3RfcG9pbnQueCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMucm9vdC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIGlmIChzZWxmLmxhc3RfcG9pbnQgPT0gbnVsbCl7IFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGludGVydmFsX3ggPSBzZWxmLmxhc3RfcG9pbnQueCAqIDM7XG4gICAgICAgICAgICAvLyB2YXIgaW50ZXJ2YWxfeCA9IChzZWxmLmxhc3RfcG9pbnQueC9NYXRoLmFicyhzZWxmLmxhc3RfcG9pbnQueCkpICogMzA7XG4gICAgICAgICAgICB2YXIgdGVtcF94ID0gc2VsZi5yb290X3duZC5nZXRQb3NpdGlvbigpLnggKyBpbnRlcnZhbF94O1xuICAgICAgICAgICAgdmFyIHRhcmdldF94ID0gc2VsZi5zY2FsZUNoZWNrUG9pbnQodGVtcF94KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlcmF0b3Igb2Ygc2VsZi5tYXBfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3Iubm9kZSl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcGVlZCA9IHNlbGYuc3BlZWRfbGlzdFtpdGVyYXRvci5pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDIsICh0YXJnZXRfeCAtIHNlbGYuaW5pdF94KSAqIHNwZWVkLCAwKS5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5vZGUucnVuQWN0aW9uKG1vdmVfdG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByb290X21vdmVfdG8gPSBjYy5tb3ZlVG8oMiwgdGFyZ2V0X3gsIHNlbGYuaW5pdF95KTtcbiAgICAgICAgICAgIHNlbGYucm9vdF93bmQucnVuQWN0aW9uKHJvb3RfbW92ZV90by5lYXNpbmcoY2MuZWFzZUJhY2tPdXQoKSkpO1xuXG4gICAgICAgIH0sIHRoaXMpXG4gICAgfSxcblxuICAgIC8vIOiuvue9ruS4u+WfjuaYr+WQpuWPr+ingVxuICAgIHNldFZpc2libGU6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIHRoaXMucm9vdFkgPSB0aGlzLnJvb3QueTtcbiAgICAgICAgICAgIHRoaXMucm9vdC55ID0gdGhpcy5yb290SGlkZVk7XG4gICAgICAgICAgICAvLyB0aGlzLnJvb3QuYWN0aXZlID0gc3RhdHVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgICAgICBpZiAoY3VyX3RpbWVfdHlwZSAhPT0gdGhpcy5jdXJfdGltZV90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTY2VuZU1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yb290LnkgPSB0aGlzLnJvb3RTaG93WTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnp7vliqjkuLvln47kvY3nva5cbiAgICB1cGRhdGVNYWluU2NlbmU6ZnVuY3Rpb24oeCwgeSl7XG4gICAgICAgIHkgPSB5ID8geSA6IHRoaXMuaW5pdF95O1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5tYXBfbGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5tYXBfbGF5ZXJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3BlZWQgPSB0aGlzLnNwZWVkX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgZWxlbWVudC5ub2RlLnNldFBvc2l0aW9uKCh4LXRoaXMuaW5pdF94KSAqIHNwZWVkLCB5IC0gdGhpcy5pbml0X3kpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbih4LCB5KTtcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65YW35L2T5pi+56S65pWw5o2uLOWMheaLrOiDjOaZryzpqazotZvlhYvnrYlcbiAgICBjcmVhdGVTY2VuZTpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN1cl90aW1lX3R5cGUgPSB0aGlzLmdldFRpZW1UeXBlKCk7XG4gICAgICAgIC8vIHRoaXMuY2hhbmdlU2NlbmVNYXAoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJTbWFsbFBpYygpO1xuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lTWFwKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwMCwgMSlcblxuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICBpZiAoVXRpbHMuaXNFbXB0eShidWlsZF9saXN0KSAmJiAhdGhpcy53YWl0X2NyZWF0ZV9idWlsZF9ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVfYnVpbGRfdm8gPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFNjZW5lRXZlbnQuQ3JlYXRlQnVpbGRWb092ZXIsIChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdF9jcmVhdGVfYnVpbGRfZXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmNyZWF0ZV9idWlsZF92byk7XG4gICAgICAgICAgICAgICAgdGhpcy5iZWZvcmVDcmVhdGVCdWlsZCgpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJlZm9yZUNyZWF0ZUJ1aWxkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5xdWVxdWVDcmVhdGVFZmZlY3QoKTtcbiAgICAgICAgLy8g5byA5aeL6aKE5Yqg6L296LWE5rqQXG4gICAgICAgIERvd25sb2FkTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrQW5pbWFDYWNoZSgpXG4gICAgfSxcblxuICAgIC8vIOW7tui/n+WIm+W7uuWcsOWbvlxuICAgIG1haW5Mb29wOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmICh0aGlzLm1hcF9jYWNoZSAmJiB0aGlzLm1hcF9jYWNoZS5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIHZhciBtYXBfaW5mbyA9IHRoaXMubWFwX2NhY2hlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAobWFwX2luZm8ucmVzKXtcbiAgICAgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhtYXBfaW5mby5yZXMsIGZ1bmN0aW9uKGxpbWl0X251bSwgcmVzX29iamVjdCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXBfbGF5ZXIgPSB0aGlzLm1hcF9sYXllclttYXBfaW5mby5sYXllcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXBfbGF5ZXIgJiYgbWFwX2xheWVyLm5vZGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9sYXllci5zcHJpdGUgPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRQb3NpdGlvbihtYXBfaW5mby5wb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRBbmNob3JQb2ludChtYXBfaW5mby5hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcF9pbmZvLmxheWVyID09IDMpIHsgICAvL+acgOWQjuS4gOWxgueahOaXtuWAmemcgOimgeaUvuWkpzTlgI1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3RpbWVfdHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIuc3ByaXRlLnNldFNjYWxlKDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnNwcml0ZS5zZXRTY2FsZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfbGF5ZXIubm9kZS5hZGRDaGlsZChtYXBfbGF5ZXIuc3ByaXRlLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLmZyYW1lID0gbWFwX2xheWVyLnNwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9sYXllci5mcmFtZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwX2xheWVyLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlUmVzKG1hcF9sYXllci5yZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2xheWVyLnJlcyA9IG1hcF9pbmZvLnJlcyAgICAgICAgLy8g5YKo5a2Y6LWE5rqQLOWIsOaXtuWAmeWIh+aNouaXtumXtOeahOaXtuWAmeimgemHiuaUvuaOieeahFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdF9udW0gPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc21hbGxfc3ByaXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXMoXCJyZXMvY2VudGVyc2NlbmUvcHJldmlldy9jZW50ZXJjaXR5XzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgdGhpcy5tYXBfY2FjaGUubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRoaXMucXVlcXVlQ3JlYXRlRWZmZWN0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0ID09IDAgJiYgdGhpcy5tYXBfY2FjaGUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIm+W7uumprOi1m+WFi+WcsOWbvlxuICAgIHJlbmRlclNtYWxsUGljOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzbWFsbF9wYXRoICA9IFwicmVzL2NlbnRlcnNjZW5lL3ByZXZpZXcvY2VudGVyY2l0eV9cIiArIHRoaXMuY3VyX3RpbWVfdHlwZSArIFwiLmpwZ1wiXG4gICAgICAgIGlmIChzbWFsbF9wYXRoICYmIHRoaXMuc21hbGxfcGF0aCkgXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhzbWFsbF9wYXRoLCBmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zbWFsbF9zcHJpdGUuc2V0UG9zaXRpb24oMCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuYWRkQ2hpbGQodGhpcy5zbWFsbF9zcHJpdGUsIDEpO1xuXG4gICAgICAgICAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnNtYWxsX3Nwcml0ZS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgIHNwcml0ZS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuc21hbGxfc3ByaXRlLmdldENvbnRlbnRTaXplKCk7XG4gICAgICAgICAgICB0aGlzLnNtYWxsX3Nwcml0ZS5zZXRTY2FsZSh0aGlzLnNpemUud2lkdGggLyBzaXplLndpZHRoLCB0aGlzLnNpemUuaGVpZ2h0IC8gc2l6ZS5oZWlnaHQpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnNtYWxsX3BhdGggPSBzbWFsbF9wYXRoO1xuICAgIH0sXG5cbiAgICAvLyDorr7nva7lvoXliJvlu7rotYTmupBcbiAgICByZW5kZXJNYXBQaWM6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBtYXBfcmVzID0gXCJyZXMvY2VudGVyc2NlbmUvY2VudGVyY2l0eS9cIiArIHRoaXMubWFwX3R5cGU7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmxheWVyX2ltZ19saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGNjLnYyKDAsIDApXG4gICAgICAgICAgICB2YXIgYXAgPSBjYy52MigwLCAwKVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMubGF5ZXJfaW1nX2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgLy8gdmFyIHJlc19wYXRoID0gbWFwX3JlcyArIFwiL1wiICsgKGluZGV4ICsgMSkgKyBcIi9cIiArIGVsZW1lbnQ7XG4gICAgICAgICAgICB2YXIgcmVzX3BhdGggPSBtYXBfcmVzICsgXCIvXCIgICsgZWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICBwb3MueCA9IC04MDtcbiAgICAgICAgICAgIH1lbHNlIGlmIChpbmRleCA9PSAxKXtcblxuICAgICAgICAgICAgfWVsc2UgaWYgKGluZGV4ID09IDIpe1xuICAgICAgICAgICAgICAgIHBvcy54ID0gNTk7XG4gICAgICAgICAgICAgICAgcG9zLnkgPSA0NzI7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBwb3MueSA9IHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgYXAueSA9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWFwX2NhY2hlLnB1c2goe3JlczpyZXNfcGF0aCwgbGF5ZXI6aW5kZXgsIHBvczpwb3MsIGFwOmFwfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5Zyw5Zu+56e75YqoXG4gICAgbW92ZU1haW5TY2VuZTogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKEd1aWRlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzSW5HdWlkZSgpKVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgeCA9IHRoaXMucm9vdF93bmQuZ2V0UG9zaXRpb24oKS54ICsgeDtcbiAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoeCk7XG4gICAgICAgIHRoaXMudXBkYXRlTWFpblNjZW5lKF94KTtcbiAgICB9LFxuXG4gICAgbW92ZVRvQnVpbGQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkX2l0ZW1zW2lkXSkge1xuICAgICAgICAgICAgdmFyIGJ1aWxkX25kID0gdGhpcy5idWlsZF9pdGVtc1tpZF0ucm9vdF93bmQ7XG4gICAgICAgICAgICB2YXIgYnVpbGRfd29yZF9wb3MgPSBidWlsZF9uZC5jb252ZXJ0VG9Xb3JsZFNwYWNlQVIoY2MudjIoMCwgMCkpO1xuICAgICAgICAgICAgdmFyIGZpbmFsX3BzbyA9IHRoaXMucm9vdF93bmQuY29udmVydFRvTm9kZVNwYWNlQVIoYnVpbGRfd29yZF9wb3MpO1xuXG4gICAgICAgICAgICAvLyB2YXIgX3ggPSB0aGlzLnNjYWxlQ2hlY2tQb2ludCgtKGZpbmFsX3Bzby54IC0gY2Mud2luU2l6ZS53aWR0aCAqIDAuNSkpO1xuICAgICAgICAgICAgdmFyIF94ID0gdGhpcy5zY2FsZUNoZWNrUG9pbnQoLShmaW5hbF9wc28ueCAtIFNDUkVFTl9XSURUSCAqIDAuNSkpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy51cGRhdGVNYWluU2NlbmUoX3gpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIpOaWreeCueaYr+WQpui2iueVjFxuICAgIHNjYWxlQ2hlY2tQb2ludDogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIF94ID0geDtcbiAgICAgICAgaWYgKHggPiAwKSB7XG4gICAgICAgICAgICBfeCA9IDBcbiAgICAgICAgfSBlbHNlIGlmICh4IDwgKHRoaXMucm9vdC53aWR0aCAtIHRoaXMuc2l6ZS53aWR0aCkpIHtcbiAgICAgICAgICAgIF94ID0gdGhpcy5yb290LndpZHRoIC0gdGhpcy5zaXplLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfeDtcbiAgICB9LFxuXG4gICAgYmVmb3JlQ3JlYXRlQnVpbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVpbGRfbGlzdCA9IFNjZW5lQ3RybC5nZXRJbnN0YW5jZSgpLmdldEJ1aWxkTGlzdCgpO1xuICAgICAgICB2YXIgbGlzdE51bSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpLmxlbmd0aDtcbiAgICAgICAgdmFyIHNjaGVJbmRleCA9IDA7XG4gICAgICAgIHZhciBjcmVhdGVJdGVtU2NoZSA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHZhciBidWlsZEtleSA9IE9iamVjdC5rZXlzKGJ1aWxkX2xpc3QpW3NjaGVJbmRleF07XG4gICAgICAgICAgICB2YXIgYnVpbGRJbmZvID0gYnVpbGRfbGlzdFtidWlsZEtleV07XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUJ1aWxkSXRlbShidWlsZEluZm8pO1xuICAgICAgICAgICAgaWYgKHNjaGVJbmRleCA9PSBsaXN0TnVtIC0gMSkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChjcmVhdGVJdGVtU2NoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2hlSW5kZXggKys7XG4gICAgICAgIH0pLmJpbmQodGhpcyksIDEwMCwgbGlzdE51bSk7XG5cblxuICAgICAgICAvLyB2YXIgYmF0dGxlX2RyYW1hX21vZGVsID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgLy8gYmF0dGxlX2RyYW1hX21vZGVsLnByZWxvYWREcmFtYVNjZW5lKCk7XG4gICAgfSxcblxuXG4gICAgY3JlYXRlQnVpbGRJdGVtOiBmdW5jdGlvbihidWlsZEluZm8pIHtcbiAgICAgICAgdmFyIGJ1aWxkX2l0ZW0gPSBuZXcgQnVpbGRJdGVtKGJ1aWxkSW5mbywgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKTtcbiAgICAgICAgdmFyIGxheWVySW5kZXggPSBidWlsZEluZm8uY29uZmlnLmxheWVyO1xuICAgICAgICB0aGlzLm1hcF9sYXllcltsYXllckluZGV4IC0gMV0ubm9kZS5hZGRDaGlsZChidWlsZF9pdGVtLnJvb3Rfd25kLCA5OTkpO1xuXG4gICAgICAgIC8vIOWIpOaWreiKgueCuVxuICAgICAgICB0aGlzLmJ1aWxkX2l0ZW1zW2J1aWxkSW5mby5jb25maWcuYmlkXSA9IGJ1aWxkX2l0ZW07XG4gICAgICAgIGlmICh0aGlzLmdldF9idWlsZF9jYltidWlsZEluZm8uY29uZmlnLmJpZF0pIHtcbiAgICAgICAgICAgIHZhciBjYWxiYWNrcyA9IHRoaXMuZ2V0X2J1aWxkX2NiW2J1aWxkSW5mby5jb25maWcuYmlkXTtcbiAgICAgICAgICAgIGZvciAodmFyIGNiX2kgaW4gY2FsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjYWxiYWNrc1tjYl9pXShidWlsZF9pdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGFuZ2VTY2VuZU1hcDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXBfdHlwZSB8fCB0aGlzLm1hcF90eXBlICE9PSB0aGlzLmN1cl90aW1lX3R5cGUpIHsgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5tYXBfdHlwZSA9IHRoaXMuY3VyX3RpbWVfdHlwZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU21hbGxQaWMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTWFwUGljKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVNjZW5lRWZmZWN0KCk7XG4gICAgICAgICAgICAvLyDlvIDlp4vliJvlu7rlnLDlm75cbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lcil7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lciA9IGdjb3JlLlRpbWVyLnNldCgoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWluTG9vcCgpO1xuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDQwMCwgLTEpO1xuICAgICAgICAgICAgfSAgIFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaUueWPmOW9k+WJjeWcuuaZr+eahOS4gOS6m+eJueaViFxuICAgIGNoYW5nZVNjZW5lRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgZWZmZWN0SW5kZXggaW4gdGhpcy5zY2VuZV9lZmZlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmVfZWZmZWN0W2VmZmVjdEluZGV4XS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgLy8gdmFyIGVmZmVjdEl0ZW4gPSB0aGlzLnNjZW5lX2VmZmVjdC5zaGlmdCgpO1xuICAgICAgICAgICAgLy8gZWZmZWN0SXRlbi5kZWxldGVNZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmFseXNpc0VmZmVjdCgpXG4gICAgfSxcblxuICAgIC8vIOino+aekOeJueaViOaVsOaNrlxuICAgIGFuYWx5c2lzRWZmZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5lZmZlY3RfcmVuZGVyX2xpc3QgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmJ1aWxkaW5nX2xpc3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGJ1aWxkSW5kZXggaW4gdGhpcy5jb25maWcuYnVpbGRpbmdfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBidWlsZEl0ZW0gPSB0aGlzLmNvbmZpZy5idWlsZGluZ19saXN0W2J1aWxkSW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0uZHVuX2lkID09IDAgfHwgdGhpcy5jdXJfdGltZV90eXBlID09IGJ1aWxkSXRlbS5kdW5faWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkSXRlbS50eXBlICE9PSAgU2NlbmVDb25zdC5CdWlsZEl0ZW1UeXBlLmJ1aWxkKSB7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0gJiYgYnVpbGRJdGVtLnJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZEl0ZW0ucmVzID09IFwiRTU0NTM5XCIgfHwgYnVpbGRJdGVtLnJlcyA9PSBcIkU1NDU0MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0LnB1c2goYnVpbGRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rlnLrmma/nibnmlYhcbiAgICBxdWVxdWVDcmVhdGVFZmZlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBmb3IgKHZhciBlZmZlY3RJbmR4ID0gMDsgZWZmZWN0SW5keCA8IHRoaXMuZWZmZWN0X3JlbmRlcl9saXN0Lmxlbmd0aDsgZWZmZWN0SW5keCArKykge1xuICAgICAgICAgICAgdmFyIGVmZmVjdENvbmYgPSB0aGlzLmVmZmVjdF9yZW5kZXJfbGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgdmFyIGJ1aWxkSXRlbSA9IG5ldyBCdWlsZEl0ZW0oZWZmZWN0Q29uZiwgZWZmZWN0Q29uZi50eXBlKTtcbiAgICAgICAgICAgIHRoaXMubWFwX2xheWVyW2VmZmVjdENvbmYubGF5ZXIgLSAxXS5ub2RlLmFkZENoaWxkKGJ1aWxkSXRlbS5yb290X3duZCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lX2VmZmVjdC5wdXNoKGJ1aWxkSXRlbSk7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgcGxheUJhY2tncm91bmRNdXNpYzogZnVuY3Rpb24oKSB7XG4gICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLlNDRU5FLCBcInNfMDAyXCIsIHRydWUpO1xuICAgIH0sXG5cbiAgICBnZXRCdWlsZEJ5SWQ6IGZ1bmN0aW9uKGlkLCBmaW5pc2hfY2Ipe1xuICAgICAgICBpZiAodGhpcy5idWlsZF9pdGVtc1tpZF0pIHtcbiAgICAgICAgICAgIGZpbmlzaF9jYih0aGlzLmJ1aWxkX2l0ZW1zW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0X2J1aWxkX2NiW2lkXSlcbiAgICAgICAgICAgICAgICB0aGlzLmdldF9idWlsZF9jYltpZF0gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZ2V0X2J1aWxkX2NiW2lkXS5wdXNoKGZpbmlzaF9jYik7XG4gICAgICAgIH1cblxuICAgICAgICBjYy5sb2codGhpcy5nZXRfYnVpbGRfY2IpO1xuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYWluU2NlbmU7Il19
|