(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/mall/mall_controller.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, 'a9944mV1I5PI7Oa6YqWCaXh', 'mall_controller'); // Scripts/mod/mall/mall_controller.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 商城的逻辑控制层 //
Create: 2018-12-18 17:12:27 // -------------------------------------------------------------------- var SceneConst = require("scene_const"); var MallEvent = require("mall_event"); var MallConst = require("mall_const"); var MainSceneController = require("mainscene_controller"); var Battle_dramaEvent = require("battle_drama_event"); var MallController = cc.Class({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { var MallModel = require("mall_model"); this.model = new MallModel(); this.model.initConfig(); this.is_first_login = true; this.temp_data = null; }, // 返回当前的model getModel: function getModel() { return this.model; }, setFirstLogin: function setFirstLogin(status) { this.is_first_login = status; }, setExchangeBuyData: function setExchangeBuyData(data) { this.temp_data = data; }, // 注册监听事件 registerEvents: function registerEvents() { if (this.init_role_event == null) { this.init_role_event = gcore.GlobalEvent.bind(Battle_dramaEvent.BattleDrama_Top_Update_Data, function () { gcore.GlobalEvent.unbind(this.init_role_event); this.init_role_event = null; var RoleController = require("role_controller"); this.role_vo = RoleController.getInstance().getRoleVo(); if (this.role_vo != null) { var BattleDramaController = require("battle_drama_controller"); var data = BattleDramaController.getInstance().getModel().getDramaData(); var max_dun_id = Config.city_data.data_base[1].activate[0][1]; if (data.max_dun_id != null && data.max_dun_id >= max_dun_id) { var config = Config.exchange_data.data_shop_list[1]; if (config.login_red != null && Utils.next(config.login_red) != null) { this.sender13401(1); } } } }.bind(this)); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(13401, this.handle13401); //商城进入数据请求 this.RegisterProtocal(13402, this.handle13402); //普通商店购买 this.RegisterProtocal(13403, this.handle13403); //神秘商店请求 this.RegisterProtocal(13404, this.handle13404); //服务端推送神秘商店可以刷新 this.RegisterProtocal(13405, this.handle13405); //神秘商城刷新列表 this.RegisterProtocal(13407, this.handle13407); //神秘商店购买 this.RegisterProtocal(13419, this.handle13419); this.RegisterProtocal(13420, this.handle13420); //商店刷新状态 //活动商城 协议 this.RegisterProtocal(16660, this.handle16660); //商店刷新状态 this.RegisterProtocal(16661, this.handle16661); //购买道具协议 }, // 打开商城主界面 //bid 需求的物品bid openMallPanel: function openMallPanel(bool, name, bid) { if (bool == true) { var build_vo = MainSceneController.getInstance().getBuildVo(SceneConst.CenterSceneBuild.shop); if (build_vo != null && build_vo.is_lock == true) { message(build_vo.desc); return; } if (this.mall_panel == null) { var MallWindow = require("mall_window"); this.mall_panel = new MallWindow(); } name = name || MallConst.MallType.GodShop; this.need_bid = bid; this.mall_panel.open(name); } else { if (this.mall_panel) { this.mall_panel.close(); this.mall_panel = null; } } }, //引导需要 getMallRoot: function getMallRoot() { if (this.mall_panel) return this.mall_panel.root_wnd; }, getMallView: function getMallView() { if (this.mall_panel) { return this.mall_panel; } }, getNeedBid: function getNeedBid() { return this.need_bid; }, //设置需求的物品bid (给不在商城建筑里的商城类型设置 setNeedBid: function setNeedBid(bid) { this.need_bid = bid; }, //打开商城批量购买界面 openMallBuyWindow: function openMallBuyWindow(bool, data) { if (bool == true) { if (data != null) { if (data.shop_type == MallConst.MallType.Recovery || data.shop_type == MallConst.MallType.ActionShop) { if (this.mall_buy_win == null) { var MallBuyWindow = require("mall_buy_window"); this.mall_buy_win = new MallBuyWindow(); } this.mall_buy_win.open(); this.mall_buy_win.setData(data); } else { var price_val = 0; if (data.discount != null && data.discount > 0) { price_val = data.discount; } else { price_val = data.price; } var is_can_buy_num = this.model.checkMoenyByType(data.pay_type, price_val); if (is_can_buy_num <= 0) { var pay_config = null; if (typeof data.pay_type == "number") { pay_config = Utils.getItemConfig(data.pay_type); } else { pay_config = Utils.getItemConfig(gdata("item_data", "data_assets_label2id", [data.pay_type])); } if (pay_config != null) { if (pay_config.id == gdata("item_data", "data_assets_label2id", "gold") || pay_config.id == gdata("item_data", "data_assets_label2id", "red_gold_or_gold")) { if (IS_SHOW_CHARGE == false) { message(Utils.TI18N("钻石不足")); } else { var fun = function fun() { require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE); }; var str = cc.js.formatStr(Utils.TI18N("%s不足,是否前往充值"), pay_config.name); var CommonAlert = require("commonalert"); CommonAlert.show(str, Utils.TI18N('确定'), fun, Utils.TI18N('取消'), null, 2, null, null, null, true); } } else { require("backpack_controller").getInstance().openTipsSource(true, pay_config.id); } } } else { if (this.mall_buy_win == null) { var MallBuyWindow = require("mall_buy_window"); this.mall_buy_win = new MallBuyWindow(); } this.mall_buy_win.open(); this.mall_buy_win.setData(data); } } } } else { if (this.mall_buy_win != null) { this.mall_buy_win.close(); this.mall_buy_win = null; } } }, //热卖商城的礼包查看界面 openMallGiftPanel: function openMallGiftPanel(bool, data) { if (bool == true) { if (this.mall_gift_panel == null) { this.mall_gift_panel = new MallGiftPanel(); } this.mall_gift_panel.open(data); } else { if (this.mall_gift_panel) { this.mall_gift_panel.close(); this.mall_gift_panel = null; } } }, //----------------协议处理-------------- // sender13401: function sender13401(type) { var protocal = {}; protocal.type = type; this.SendProtocal(13401, protocal); }, handle13401: function handle13401(data) { var status = false; var index = 0; if (data.code == 1 && data.type == 1) { //钻石商城 var config = gdata("exchange_data", "data_shop_list", [1]); if (config != null && config.login_red != null && Utils.next(config.login_red) != null) { var len = config.login_red.length; for (var k in config.login_red) { var v = config.login_red[k]; var id = v[1]; var num = v[2]; if (data.item_list != null && Utils.next(data.item_list) != null) { for (var a in data.item_list) { var j = data.item_list[a]; if (id == j.item_id && j.ext[0].val < num) { status = true; break; } else if (id == j.item_id && j.ext[0].val >= nul) { index = index + 1; } } } else { //都没有买 status = true; } } if (index == len) status = false;else status = true; } } MainSceneController.getInstance().setBuildRedStatus(SceneConst.CenterSceneBuild.shop, status && this.is_first_login); gcore.GlobalEvent.fire(MallEvent.Open_View_Event, data); }, sender13402: function sender13402(eid, num) { var protocal = {}; protocal.eid = eid; protocal.num = num; this.SendProtocal(13402, protocal); }, // handle13402: function handle13402(data) { message(data.msg); if (data.code == 1) { gcore.GlobalEvent.fire(MallEvent.Buy_Success_Event, data); } }, //神秘商店请求 sender13403: function sender13403(type) { var protocal = {}; protocal.type = type; this.SendProtocal(13403, protocal); }, // handle13403: function handle13403(data) { message(data.msg); gcore.GlobalEvent.fire(MallEvent.Get_Buy_list, data); }, //服务端推送神秘商店可以刷新 handle13404: function handle13404(data) { gcore.GlobalEvent.fire(MallEvent.Frash_tips_event); }, //刷新列表 sender13405: function sender13405(type) { var protocal = {}; protocal.type = type; this.SendProtocal(13405, protocal); }, // handle13405: function handle13405(data) { message(data.msg); if (data.code == 1) { gcore.GlobalEvent.fire(MallEvent.Get_Buy_list, data); } }, //神秘商店购买 sender13407: function sender13407(order, type, buy_type, data) { var protocal = {}; protocal.order = order; protocal.type = type; protocal.buy_type = buy_type; this.SendProtocal(13407, protocal); this.order = data; }, handle13407: function handle13407(data) { message(data.msg); if (data.code == 1) { gcore.GlobalEvent.fire(MallEvent.Buy_One_Success, data, this.order); } else { if (this.order) { require("backpack_controller").getInstance().openTipsSource(true, this.order.item_id); } } }, send13419: function send13419(num) { var protocal = {}; protocal.num = num; this.SendProtocal(13419, protocal); }, handle13419: function handle13419(data) { message(data.msg); if (data.code == 1) { if (this.temp_data != null) { this.sender13407(this.temp_data.order, this.temp_data.shop_type, 1); this.temp_data = null; } } }, handle13420: function handle13420(data) { gcore.GlobalEvent.fire(MallEvent.Free_Refresh_Data, data); }, // ----------------------------杂货店相关---------------------------- // 打开杂货店界面 openVarietyStoreWindows: function openVarietyStoreWindows(status) { if (status == true) { if (this.variety_store_view == null) { this.variety_store_view = Utils.createClass("variety_store_window", this); } if (this.variety_store_view && this.variety_store_view.isOpen() == false) { this.variety_store_view.open(); } } else { if (this.variety_store_view) { this.variety_store_view.close(); this.variety_store_view = null; } } }, // --打开活动商城 // --@ bid 活动对应的bid 不传默认打开 第一个 openMallActionWindow: function openMallActionWindow(bool, bid) { if (bool == true) { if (!this.mall_action_window) { var MallActionWindow = require("mall_action_window"); this.mall_action_window = new MallActionWindow(); } this.mall_action_window.open(bid); } else { if (this.mall_action_window) { this.mall_action_window.close(); this.mall_action_window = null; } } }, // ----------------------------------活动商城协议------------------------------------------ send16660: function send16660() { var protocal = {}; this.SendProtocal(16660, protocal); }, handle16660: function handle16660(data) { message(data.msg); gcore.GlobalEvent.fire(MallEvent.Update_Action_event, data); }, handle16661: function handle16661(data) { message(data.msg); if (data.code == 1) { gcore.GlobalEvent.fire(MallEvent.Buy_Action_Shop_Success_event, data); } }, // --{uint32, aim, "商品id"}, // --{uint32, num, "购买数量"} send16661: function send16661(bid, aim, num) { var protocal = {}; protocal.bid = bid; protocal.aim = aim; protocal.num = num; this.SendProtocal(16661, protocal); }, __delete: function __delete() { if (this.model != null) { this.model.DeleteMe(); this.model = null; } }, getVarietyStoreRoot: function getVarietyStoreRoot(finish_cb) { if (finish_cb) { if (this.variety_store_view) { this.variety_store_view.getRootWnd(finish_cb); } else { finish_cb(null); } } else { if (this.variety_store_view) return this.variety_store_view.root_wnd; } } }); module.exports = MallController; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWxsXFxtYWxsX2NvbnRyb2xsZXIuanMiXSwibmFtZXMiOlsiU2NlbmVDb25zdCIsInJlcXVpcmUiLCJNYWxsRXZlbnQiLCJNYWxsQ29uc3QiLCJNYWluU2NlbmVDb250cm9sbGVyIiwiQmF0dGxlX2RyYW1hRXZlbnQiLCJNYWxsQ29udHJvbGxlciIsImNjIiwiQ2xhc3MiLCJCYXNlQ29udHJvbGxlciIsImN0b3IiLCJpbml0Q29uZmlnIiwiTWFsbE1vZGVsIiwibW9kZWwiLCJpc19maXJzdF9sb2dpbiIsInRlbXBfZGF0YSIsImdldE1vZGVsIiwic2V0Rmlyc3RMb2dpbiIsInN0YXR1cyIsInNldEV4Y2hhbmdlQnV5RGF0YSIsImRhdGEiLCJyZWdpc3RlckV2ZW50cyIsImluaXRfcm9sZV9ldmVudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiQmF0dGxlRHJhbWFfVG9wX1VwZGF0ZV9EYXRhIiwidW5iaW5kIiwiUm9sZUNvbnRyb2xsZXIiLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJCYXR0bGVEcmFtYUNvbnRyb2xsZXIiLCJnZXREcmFtYURhdGEiLCJtYXhfZHVuX2lkIiwiQ29uZmlnIiwiY2l0eV9kYXRhIiwiZGF0YV9iYXNlIiwiYWN0aXZhdGUiLCJjb25maWciLCJleGNoYW5nZV9kYXRhIiwiZGF0YV9zaG9wX2xpc3QiLCJsb2dpbl9yZWQiLCJVdGlscyIsIm5leHQiLCJzZW5kZXIxMzQwMSIsInJlZ2lzdGVyUHJvdG9jYWxzIiwiUmVnaXN0ZXJQcm90b2NhbCIsImhhbmRsZTEzNDAxIiwiaGFuZGxlMTM0MDIiLCJoYW5kbGUxMzQwMyIsImhhbmRsZTEzNDA0IiwiaGFuZGxlMTM0MDUiLCJoYW5kbGUxMzQwNyIsImhhbmRsZTEzNDE5IiwiaGFuZGxlMTM0MjAiLCJoYW5kbGUxNjY2MCIsImhhbmRsZTE2NjYxIiwib3Blbk1hbGxQYW5lbCIsImJvb2wiLCJuYW1lIiwiYmlkIiwiYnVpbGRfdm8iLCJnZXRCdWlsZFZvIiwiQ2VudGVyU2NlbmVCdWlsZCIsInNob3AiLCJpc19sb2NrIiwibWVzc2FnZSIsImRlc2MiLCJtYWxsX3BhbmVsIiwiTWFsbFdpbmRvdyIsIk1hbGxUeXBlIiwiR29kU2hvcCIsIm5lZWRfYmlkIiwib3BlbiIsImNsb3NlIiwiZ2V0TWFsbFJvb3QiLCJyb290X3duZCIsImdldE1hbGxWaWV3IiwiZ2V0TmVlZEJpZCIsInNldE5lZWRCaWQiLCJvcGVuTWFsbEJ1eVdpbmRvdyIsInNob3BfdHlwZSIsIlJlY292ZXJ5IiwiQWN0aW9uU2hvcCIsIm1hbGxfYnV5X3dpbiIsIk1hbGxCdXlXaW5kb3ciLCJzZXREYXRhIiwicHJpY2VfdmFsIiwiZGlzY291bnQiLCJwcmljZSIsImlzX2Nhbl9idXlfbnVtIiwiY2hlY2tNb2VueUJ5VHlwZSIsInBheV90eXBlIiwicGF5X2NvbmZpZyIsImdldEl0ZW1Db25maWciLCJnZGF0YSIsImlkIiwiSVNfU0hPV19DSEFSR0UiLCJUSTE4TiIsImZ1biIsIm9wZW5WaXBNYWluV2luZG93IiwiVklQVEFCQ09OU1QiLCJDSEFSR0UiLCJzdHIiLCJqcyIsImZvcm1hdFN0ciIsIkNvbW1vbkFsZXJ0Iiwic2hvdyIsIm9wZW5UaXBzU291cmNlIiwib3Blbk1hbGxHaWZ0UGFuZWwiLCJtYWxsX2dpZnRfcGFuZWwiLCJNYWxsR2lmdFBhbmVsIiwidHlwZSIsInByb3RvY2FsIiwiU2VuZFByb3RvY2FsIiwiaW5kZXgiLCJjb2RlIiwibGVuIiwibGVuZ3RoIiwiayIsInYiLCJudW0iLCJpdGVtX2xpc3QiLCJhIiwiaiIsIml0ZW1faWQiLCJleHQiLCJ2YWwiLCJudWwiLCJzZXRCdWlsZFJlZFN0YXR1cyIsImZpcmUiLCJPcGVuX1ZpZXdfRXZlbnQiLCJzZW5kZXIxMzQwMiIsImVpZCIsIm1zZyIsIkJ1eV9TdWNjZXNzX0V2ZW50Iiwic2VuZGVyMTM0MDMiLCJHZXRfQnV5X2xpc3QiLCJGcmFzaF90aXBzX2V2ZW50Iiwic2VuZGVyMTM0MDUiLCJzZW5kZXIxMzQwNyIsIm9yZGVyIiwiYnV5X3R5cGUiLCJCdXlfT25lX1N1Y2Nlc3MiLCJzZW5kMTM0MTkiLCJGcmVlX1JlZnJlc2hfRGF0YSIsIm9wZW5WYXJpZXR5U3RvcmVXaW5kb3dzIiwidmFyaWV0eV9zdG9yZV92aWV3IiwiY3JlYXRlQ2xhc3MiLCJpc09wZW4iLCJvcGVuTWFsbEFjdGlvbldpbmRvdyIsIm1hbGxfYWN0aW9uX3dpbmRvdyIsIk1hbGxBY3Rpb25XaW5kb3ciLCJzZW5kMTY2NjAiLCJVcGRhdGVfQWN0aW9uX2V2ZW50IiwiQnV5X0FjdGlvbl9TaG9wX1N1Y2Nlc3NfZXZlbnQiLCJzZW5kMTY2NjEiLCJhaW0iLCJfX2RlbGV0ZSIsIkRlbGV0ZU1lIiwiZ2V0VmFyaWV0eVN0b3JlUm9vdCIsImZpbmlzaF9jYiIsImdldFJvb3RXbmQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFVBQVUsR0FBR0MsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRSxTQUFTLEdBQUdGLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlHLG1CQUFtQixHQUFHSCxPQUFPLENBQUMsc0JBQUQsQ0FBakM7O0FBQ0EsSUFBSUksaUJBQWlCLEdBQUdKLE9BQU8sQ0FBQyxvQkFBRCxDQUEvQjs7QUFFQSxJQUFJSyxjQUFjLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzFCLGFBQVNDLGNBRGlCO0FBRTFCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FDakIsQ0FIeUI7QUFLMUI7QUFDQUMsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFFBQUlDLFNBQVMsR0FBR1gsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBRUEsU0FBS1ksS0FBTCxHQUFhLElBQUlELFNBQUosRUFBYjtBQUVBLFNBQUtDLEtBQUwsQ0FBV0YsVUFBWDtBQUVBLFNBQUtHLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0gsR0FmeUI7QUFpQjFCO0FBQ0FDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixXQUFPLEtBQUtILEtBQVo7QUFDSCxHQXBCeUI7QUFzQjFCSSxFQUFBQSxhQUFhLEVBQUUsdUJBQVVDLE1BQVYsRUFBa0I7QUFDN0IsU0FBS0osY0FBTCxHQUFzQkksTUFBdEI7QUFDSCxHQXhCeUI7QUEwQjFCQyxFQUFBQSxrQkFBa0IsRUFBRSw0QkFBVUMsSUFBVixFQUFnQjtBQUNoQyxTQUFLTCxTQUFMLEdBQWlCSyxJQUFqQjtBQUNILEdBNUJ5QjtBQThCMUI7QUFDQUMsRUFBQUEsY0FBYyxFQUFFLDBCQUFZO0FBQ3hCLFFBQUksS0FBS0MsZUFBTCxJQUF3QixJQUE1QixFQUFpQztBQUM3QixXQUFLQSxlQUFMLEdBQXVCQyxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCcEIsaUJBQWlCLENBQUNxQiwyQkFBekMsRUFBc0UsWUFBVTtBQUNuR0gsUUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCRyxNQUFsQixDQUF5QixLQUFLTCxlQUE5QjtBQUNBLGFBQUtBLGVBQUwsR0FBdUIsSUFBdkI7O0FBQ0EsWUFBSU0sY0FBYyxHQUFHM0IsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLGFBQUs0QixPQUFMLEdBQWVELGNBQWMsQ0FBQ0UsV0FBZixHQUE2QkMsU0FBN0IsRUFBZjs7QUFDQSxZQUFHLEtBQUtGLE9BQUwsSUFBZ0IsSUFBbkIsRUFBd0I7QUFDcEIsY0FBSUcscUJBQXFCLEdBQUcvQixPQUFPLENBQUMseUJBQUQsQ0FBbkM7O0FBQ0EsY0FBSW1CLElBQUksR0FBSVkscUJBQXFCLENBQUNGLFdBQXRCLEdBQW9DZCxRQUFwQyxHQUErQ2lCLFlBQS9DLEVBQVo7QUFDQSxjQUFJQyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsU0FBakIsQ0FBMkIsQ0FBM0IsRUFBOEJDLFFBQTlCLENBQXVDLENBQXZDLEVBQTBDLENBQTFDLENBQWpCOztBQUNBLGNBQUlsQixJQUFJLENBQUNjLFVBQUwsSUFBbUIsSUFBbkIsSUFBMkJkLElBQUksQ0FBQ2MsVUFBTCxJQUFtQkEsVUFBbEQsRUFBNkQ7QUFDekQsZ0JBQUlLLE1BQU0sR0FBR0osTUFBTSxDQUFDSyxhQUFQLENBQXFCQyxjQUFyQixDQUFvQyxDQUFwQyxDQUFiOztBQUNBLGdCQUFJRixNQUFNLENBQUNHLFNBQVAsSUFBb0IsSUFBcEIsSUFBNEJDLEtBQUssQ0FBQ0MsSUFBTixDQUFXTCxNQUFNLENBQUNHLFNBQWxCLEtBQWdDLElBQWhFLEVBQXFFO0FBQ2pFLG1CQUFLRyxXQUFMLENBQWlCLENBQWpCO0FBQ0g7QUFDSjtBQUNKO0FBQ0osT0FoQjJGLENBZ0J6RnBCLElBaEJ5RixDQWdCcEYsSUFoQm9GLENBQXJFLENBQXZCO0FBaUJIO0FBQ0osR0FuRHlCO0FBcUQxQjtBQUNBcUIsRUFBQUEsaUJBQWlCLEVBQUUsNkJBQVk7QUFDM0IsU0FBS0MsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS0MsV0FBbEMsRUFEMkIsQ0FDaUM7O0FBQzVELFNBQUtELGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtFLFdBQWxDLEVBRjJCLENBRWlDOztBQUM1RCxTQUFLRixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLRyxXQUFsQyxFQUgyQixDQUdpQzs7QUFDNUQsU0FBS0gsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS0ksV0FBbEMsRUFKMkIsQ0FJaUM7O0FBQzVELFNBQUtKLGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLEtBQUtLLFdBQWxDLEVBTDJCLENBS2lDOztBQUU1RCxTQUFLTCxnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLTSxXQUFsQyxFQVAyQixDQU9pQzs7QUFDNUQsU0FBS04sZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS08sV0FBbEM7QUFDQSxTQUFLUCxnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLUSxXQUFsQyxFQVQyQixDQVNpQztBQUU1RDs7QUFDQSxTQUFLUixnQkFBTCxDQUFzQixLQUF0QixFQUE2QixLQUFLUyxXQUFsQyxFQVoyQixDQVlpQzs7QUFDNUQsU0FBS1QsZ0JBQUwsQ0FBc0IsS0FBdEIsRUFBNkIsS0FBS1UsV0FBbEMsRUFiMkIsQ0FhaUM7QUFDL0QsR0FwRXlCO0FBc0UxQjtBQUNBO0FBQ0FDLEVBQUFBLGFBQWEsRUFBRSx1QkFBVUMsSUFBVixFQUFnQkMsSUFBaEIsRUFBc0JDLEdBQXRCLEVBQTJCO0FBQ3RDLFFBQUlGLElBQUksSUFBSSxJQUFaLEVBQWtCO0FBQ2QsVUFBSUcsUUFBUSxHQUFHMUQsbUJBQW1CLENBQUMwQixXQUFwQixHQUFrQ2lDLFVBQWxDLENBQTZDL0QsVUFBVSxDQUFDZ0UsZ0JBQVgsQ0FBNEJDLElBQXpFLENBQWY7O0FBQ0EsVUFBSUgsUUFBUSxJQUFJLElBQVosSUFBb0JBLFFBQVEsQ0FBQ0ksT0FBVCxJQUFvQixJQUE1QyxFQUFrRDtBQUM5Q0MsUUFBQUEsT0FBTyxDQUFDTCxRQUFRLENBQUNNLElBQVYsQ0FBUDtBQUNBO0FBQ0g7O0FBQ0QsVUFBSSxLQUFLQyxVQUFMLElBQW1CLElBQXZCLEVBQTZCO0FBQ3pCLFlBQUlDLFVBQVUsR0FBR3JFLE9BQU8sQ0FBQyxhQUFELENBQXhCOztBQUNBLGFBQUtvRSxVQUFMLEdBQWtCLElBQUlDLFVBQUosRUFBbEI7QUFDSDs7QUFDRFYsTUFBQUEsSUFBSSxHQUFHQSxJQUFJLElBQUl6RCxTQUFTLENBQUNvRSxRQUFWLENBQW1CQyxPQUFsQztBQUNBLFdBQUtDLFFBQUwsR0FBZ0JaLEdBQWhCO0FBQ0EsV0FBS1EsVUFBTCxDQUFnQkssSUFBaEIsQ0FBcUJkLElBQXJCO0FBQ0gsS0FiRCxNQWFPO0FBQ0gsVUFBSSxLQUFLUyxVQUFULEVBQXFCO0FBQ2pCLGFBQUtBLFVBQUwsQ0FBZ0JNLEtBQWhCO0FBQ0EsYUFBS04sVUFBTCxHQUFrQixJQUFsQjtBQUNIO0FBQ0o7QUFDSixHQTVGeUI7QUE4RjFCO0FBQ0FPLEVBQUFBLFdBQVcsRUFBRSx1QkFBWTtBQUNyQixRQUFJLEtBQUtQLFVBQVQsRUFDSSxPQUFPLEtBQUtBLFVBQUwsQ0FBZ0JRLFFBQXZCO0FBQ1AsR0FsR3lCO0FBbUcxQkMsRUFBQUEsV0FBVyxFQUFDLHVCQUFVO0FBQ2xCLFFBQUksS0FBS1QsVUFBVCxFQUFvQjtBQUNoQixhQUFPLEtBQUtBLFVBQVo7QUFDSDtBQUNKLEdBdkd5QjtBQXdHMUJVLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixXQUFPLEtBQUtOLFFBQVo7QUFDSCxHQTFHeUI7QUE0RzFCO0FBQ0FPLEVBQUFBLFVBQVUsRUFBRSxvQkFBVW5CLEdBQVYsRUFBZTtBQUN2QixTQUFLWSxRQUFMLEdBQWdCWixHQUFoQjtBQUNILEdBL0d5QjtBQWlIMUI7QUFDQW9CLEVBQUFBLGlCQUFpQixFQUFFLDJCQUFVdEIsSUFBVixFQUFnQnZDLElBQWhCLEVBQXNCO0FBQ3JDLFFBQUl1QyxJQUFJLElBQUksSUFBWixFQUFrQjtBQUNkLFVBQUl2QyxJQUFJLElBQUksSUFBWixFQUFrQjtBQUNkLFlBQUlBLElBQUksQ0FBQzhELFNBQUwsSUFBa0IvRSxTQUFTLENBQUNvRSxRQUFWLENBQW1CWSxRQUFyQyxJQUFpRC9ELElBQUksQ0FBQzhELFNBQUwsSUFBa0IvRSxTQUFTLENBQUNvRSxRQUFWLENBQW1CYSxVQUExRixFQUFzRztBQUNsRyxjQUFJLEtBQUtDLFlBQUwsSUFBcUIsSUFBekIsRUFBK0I7QUFDM0IsZ0JBQUlDLGFBQWEsR0FBR3JGLE9BQU8sQ0FBQyxpQkFBRCxDQUEzQjs7QUFDQSxpQkFBS29GLFlBQUwsR0FBb0IsSUFBSUMsYUFBSixFQUFwQjtBQUNIOztBQUNELGVBQUtELFlBQUwsQ0FBa0JYLElBQWxCO0FBQ0EsZUFBS1csWUFBTCxDQUFrQkUsT0FBbEIsQ0FBMEJuRSxJQUExQjtBQUNILFNBUEQsTUFPTztBQUNILGNBQUlvRSxTQUFTLEdBQUcsQ0FBaEI7O0FBQ0EsY0FBSXBFLElBQUksQ0FBQ3FFLFFBQUwsSUFBaUIsSUFBakIsSUFBeUJyRSxJQUFJLENBQUNxRSxRQUFMLEdBQWdCLENBQTdDLEVBQWdEO0FBQzVDRCxZQUFBQSxTQUFTLEdBQUdwRSxJQUFJLENBQUNxRSxRQUFqQjtBQUNILFdBRkQsTUFFTztBQUNIRCxZQUFBQSxTQUFTLEdBQUdwRSxJQUFJLENBQUNzRSxLQUFqQjtBQUNIOztBQUNELGNBQUlDLGNBQWMsR0FBRyxLQUFLOUUsS0FBTCxDQUFXK0UsZ0JBQVgsQ0FBNEJ4RSxJQUFJLENBQUN5RSxRQUFqQyxFQUEyQ0wsU0FBM0MsQ0FBckI7O0FBQ0EsY0FBSUcsY0FBYyxJQUFJLENBQXRCLEVBQXlCO0FBQ3JCLGdCQUFJRyxVQUFVLEdBQUcsSUFBakI7O0FBQ0EsZ0JBQUksT0FBUTFFLElBQUksQ0FBQ3lFLFFBQWIsSUFBMEIsUUFBOUIsRUFBd0M7QUFDcENDLGNBQUFBLFVBQVUsR0FBR25ELEtBQUssQ0FBQ29ELGFBQU4sQ0FBb0IzRSxJQUFJLENBQUN5RSxRQUF6QixDQUFiO0FBQ0gsYUFGRCxNQUVPO0FBQ0hDLGNBQUFBLFVBQVUsR0FBR25ELEtBQUssQ0FBQ29ELGFBQU4sQ0FBb0JDLEtBQUssQ0FBQyxXQUFELEVBQWMsc0JBQWQsRUFBc0MsQ0FBQzVFLElBQUksQ0FBQ3lFLFFBQU4sQ0FBdEMsQ0FBekIsQ0FBYjtBQUNIOztBQUNELGdCQUFJQyxVQUFVLElBQUksSUFBbEIsRUFBd0I7QUFDcEIsa0JBQUlBLFVBQVUsQ0FBQ0csRUFBWCxJQUFpQkQsS0FBSyxDQUFDLFdBQUQsRUFBYyxzQkFBZCxFQUFzQyxNQUF0QyxDQUF0QixJQUF1RUYsVUFBVSxDQUFDRyxFQUFYLElBQWlCRCxLQUFLLENBQUMsV0FBRCxFQUFjLHNCQUFkLEVBQXNDLGtCQUF0QyxDQUFqRyxFQUE0SjtBQUN4SixvQkFBR0UsY0FBYyxJQUFJLEtBQXJCLEVBQTJCO0FBQ3ZCL0Isa0JBQUFBLE9BQU8sQ0FBQ3hCLEtBQUssQ0FBQ3dELEtBQU4sQ0FBWSxNQUFaLENBQUQsQ0FBUDtBQUNILGlCQUZELE1BRUs7QUFDRCxzQkFBSUMsR0FBRyxHQUFHLFNBQU5BLEdBQU0sR0FBVTtBQUNoQm5HLG9CQUFBQSxPQUFPLENBQUMsZ0JBQUQsQ0FBUCxDQUEwQjZCLFdBQTFCLEdBQXdDdUUsaUJBQXhDLENBQTBELElBQTFELEVBQWdFQyxXQUFXLENBQUNDLE1BQTVFO0FBQ0gsbUJBRkQ7O0FBR0Esc0JBQUlDLEdBQUcsR0FBR2pHLEVBQUUsQ0FBQ2tHLEVBQUgsQ0FBTUMsU0FBTixDQUFnQi9ELEtBQUssQ0FBQ3dELEtBQU4sQ0FBWSxhQUFaLENBQWhCLEVBQTJDTCxVQUFVLENBQUNsQyxJQUF0RCxDQUFWOztBQUNBLHNCQUFJK0MsV0FBVyxHQUFHMUcsT0FBTyxDQUFDLGFBQUQsQ0FBekI7O0FBQ0EwRyxrQkFBQUEsV0FBVyxDQUFDQyxJQUFaLENBQWlCSixHQUFqQixFQUFzQjdELEtBQUssQ0FBQ3dELEtBQU4sQ0FBWSxJQUFaLENBQXRCLEVBQXlDQyxHQUF6QyxFQUE4Q3pELEtBQUssQ0FBQ3dELEtBQU4sQ0FBWSxJQUFaLENBQTlDLEVBQWlFLElBQWpFLEVBQXVFLENBQXZFLEVBQTBFLElBQTFFLEVBQWdGLElBQWhGLEVBQXNGLElBQXRGLEVBQTRGLElBQTVGO0FBQ0g7QUFDSixlQVhELE1BV087QUFDSGxHLGdCQUFBQSxPQUFPLENBQUMscUJBQUQsQ0FBUCxDQUErQjZCLFdBQS9CLEdBQTZDK0UsY0FBN0MsQ0FBNEQsSUFBNUQsRUFBa0VmLFVBQVUsQ0FBQ0csRUFBN0U7QUFDSDtBQUNKO0FBQ0osV0F2QkQsTUF1Qk87QUFDSCxnQkFBSSxLQUFLWixZQUFMLElBQXFCLElBQXpCLEVBQStCO0FBQzNCLGtCQUFJQyxhQUFhLEdBQUdyRixPQUFPLENBQUMsaUJBQUQsQ0FBM0I7O0FBQ0EsbUJBQUtvRixZQUFMLEdBQW9CLElBQUlDLGFBQUosRUFBcEI7QUFDSDs7QUFDRCxpQkFBS0QsWUFBTCxDQUFrQlgsSUFBbEI7QUFDQSxpQkFBS1csWUFBTCxDQUFrQkUsT0FBbEIsQ0FBMEJuRSxJQUExQjtBQUNIO0FBQ0o7QUFDSjtBQUNKLEtBbERELE1Ba0RLO0FBQ0QsVUFBSSxLQUFLaUUsWUFBTCxJQUFxQixJQUF6QixFQUErQjtBQUMzQixhQUFLQSxZQUFMLENBQWtCVixLQUFsQjtBQUNBLGFBQUtVLFlBQUwsR0FBb0IsSUFBcEI7QUFDSDtBQUNKO0FBQ0osR0EzS3lCO0FBNksxQjtBQUNBeUIsRUFBQUEsaUJBQWlCLEVBQUUsMkJBQVVuRCxJQUFWLEVBQWdCdkMsSUFBaEIsRUFBc0I7QUFDckMsUUFBSXVDLElBQUksSUFBSSxJQUFaLEVBQWtCO0FBQ2QsVUFBSSxLQUFLb0QsZUFBTCxJQUF3QixJQUE1QixFQUFrQztBQUM5QixhQUFLQSxlQUFMLEdBQXVCLElBQUlDLGFBQUosRUFBdkI7QUFDSDs7QUFDRCxXQUFLRCxlQUFMLENBQXFCckMsSUFBckIsQ0FBMEJ0RCxJQUExQjtBQUNILEtBTEQsTUFLTztBQUNILFVBQUksS0FBSzJGLGVBQVQsRUFBMEI7QUFDdEIsYUFBS0EsZUFBTCxDQUFxQnBDLEtBQXJCO0FBQ0EsYUFBS29DLGVBQUwsR0FBdUIsSUFBdkI7QUFDSDtBQUNKO0FBQ0osR0ExTHlCO0FBOEwxQjtBQUNBO0FBQ0FsRSxFQUFBQSxXQUFXLEVBQUUscUJBQVVvRSxJQUFWLEVBQWdCO0FBQ3pCLFFBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQ0QsSUFBVCxHQUFnQkEsSUFBaEI7QUFDQSxTQUFLRSxZQUFMLENBQWtCLEtBQWxCLEVBQXlCRCxRQUF6QjtBQUNILEdBcE15QjtBQXNNMUJsRSxFQUFBQSxXQUFXLEVBQUUscUJBQVU1QixJQUFWLEVBQWdCO0FBQ3pCLFFBQUlGLE1BQU0sR0FBRyxLQUFiO0FBQ0EsUUFBSWtHLEtBQUssR0FBRyxDQUFaOztBQUVBLFFBQUloRyxJQUFJLENBQUNpRyxJQUFMLElBQWEsQ0FBYixJQUFrQmpHLElBQUksQ0FBQzZGLElBQUwsSUFBYSxDQUFuQyxFQUFzQztBQUFHO0FBQ3JDLFVBQUkxRSxNQUFNLEdBQUd5RCxLQUFLLENBQUMsZUFBRCxFQUFrQixnQkFBbEIsRUFBb0MsQ0FBQyxDQUFELENBQXBDLENBQWxCOztBQUNBLFVBQUl6RCxNQUFNLElBQUksSUFBVixJQUFrQkEsTUFBTSxDQUFDRyxTQUFQLElBQW9CLElBQXRDLElBQThDQyxLQUFLLENBQUNDLElBQU4sQ0FBV0wsTUFBTSxDQUFDRyxTQUFsQixLQUFnQyxJQUFsRixFQUF3RjtBQUNwRixZQUFJNEUsR0FBRyxHQUFHL0UsTUFBTSxDQUFDRyxTQUFQLENBQWlCNkUsTUFBM0I7O0FBQ0EsYUFBSyxJQUFJQyxDQUFULElBQWNqRixNQUFNLENBQUNHLFNBQXJCLEVBQWdDO0FBQzVCLGNBQUkrRSxDQUFDLEdBQUdsRixNQUFNLENBQUNHLFNBQVAsQ0FBaUI4RSxDQUFqQixDQUFSO0FBQ0EsY0FBSXZCLEVBQUUsR0FBR3dCLENBQUMsQ0FBQyxDQUFELENBQVY7QUFDQSxjQUFJQyxHQUFHLEdBQUdELENBQUMsQ0FBQyxDQUFELENBQVg7O0FBQ0EsY0FBSXJHLElBQUksQ0FBQ3VHLFNBQUwsSUFBa0IsSUFBbEIsSUFBMEJoRixLQUFLLENBQUNDLElBQU4sQ0FBV3hCLElBQUksQ0FBQ3VHLFNBQWhCLEtBQThCLElBQTVELEVBQWtFO0FBQzlELGlCQUFLLElBQUlDLENBQVQsSUFBY3hHLElBQUksQ0FBQ3VHLFNBQW5CLEVBQThCO0FBQzFCLGtCQUFJRSxDQUFDLEdBQUd6RyxJQUFJLENBQUN1RyxTQUFMLENBQWVDLENBQWYsQ0FBUjs7QUFDQSxrQkFBSTNCLEVBQUUsSUFBSTRCLENBQUMsQ0FBQ0MsT0FBUixJQUFtQkQsQ0FBQyxDQUFDRSxHQUFGLENBQU0sQ0FBTixFQUFTQyxHQUFULEdBQWVOLEdBQXRDLEVBQTJDO0FBQ3ZDeEcsZ0JBQUFBLE1BQU0sR0FBRyxJQUFUO0FBQ0E7QUFDSCxlQUhELE1BR08sSUFBSStFLEVBQUUsSUFBSTRCLENBQUMsQ0FBQ0MsT0FBUixJQUFtQkQsQ0FBQyxDQUFDRSxHQUFGLENBQU0sQ0FBTixFQUFTQyxHQUFULElBQWdCQyxHQUF2QyxFQUE0QztBQUMvQ2IsZ0JBQUFBLEtBQUssR0FBR0EsS0FBSyxHQUFHLENBQWhCO0FBQ0g7QUFDSjtBQUNKLFdBVkQsTUFVTztBQUFHO0FBQ05sRyxZQUFBQSxNQUFNLEdBQUcsSUFBVDtBQUNIO0FBQ0o7O0FBQ0QsWUFBSWtHLEtBQUssSUFBSUUsR0FBYixFQUNJcEcsTUFBTSxHQUFHLEtBQVQsQ0FESixLQUdJQSxNQUFNLEdBQUcsSUFBVDtBQUNQO0FBQ0o7O0FBRURkLElBQUFBLG1CQUFtQixDQUFDMEIsV0FBcEIsR0FBa0NvRyxpQkFBbEMsQ0FBb0RsSSxVQUFVLENBQUNnRSxnQkFBWCxDQUE0QkMsSUFBaEYsRUFBc0YvQyxNQUFNLElBQUksS0FBS0osY0FBckc7QUFDQVMsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCMkcsSUFBbEIsQ0FBdUJqSSxTQUFTLENBQUNrSSxlQUFqQyxFQUFrRGhILElBQWxEO0FBQ0gsR0F6T3lCO0FBMk8xQmlILEVBQUFBLFdBQVcsRUFBRSxxQkFBVUMsR0FBVixFQUFlWixHQUFmLEVBQW9CO0FBQzdCLFFBQUlSLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQ29CLEdBQVQsR0FBZUEsR0FBZjtBQUNBcEIsSUFBQUEsUUFBUSxDQUFDUSxHQUFULEdBQWVBLEdBQWY7QUFDQSxTQUFLUCxZQUFMLENBQWtCLEtBQWxCLEVBQXlCRCxRQUF6QjtBQUNILEdBaFB5QjtBQW1QMUI7QUFDQWpFLEVBQUFBLFdBQVcsRUFBRSxxQkFBVTdCLElBQVYsRUFBZ0I7QUFDekIrQyxJQUFBQSxPQUFPLENBQUMvQyxJQUFJLENBQUNtSCxHQUFOLENBQVA7O0FBQ0EsUUFBSW5ILElBQUksQ0FBQ2lHLElBQUwsSUFBYSxDQUFqQixFQUFvQjtBQUNoQjlGLE1BQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQjJHLElBQWxCLENBQXVCakksU0FBUyxDQUFDc0ksaUJBQWpDLEVBQW9EcEgsSUFBcEQ7QUFDSDtBQUNKLEdBelB5QjtBQTJQMUI7QUFDQXFILEVBQUFBLFdBQVcsRUFBRSxxQkFBVXhCLElBQVYsRUFBZ0I7QUFDekIsUUFBSUMsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDRCxJQUFULEdBQWdCQSxJQUFoQjtBQUNBLFNBQUtFLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0FoUXlCO0FBa1ExQjtBQUNBaEUsRUFBQUEsV0FBVyxFQUFFLHFCQUFVOUIsSUFBVixFQUFnQjtBQUN6QitDLElBQUFBLE9BQU8sQ0FBQy9DLElBQUksQ0FBQ21ILEdBQU4sQ0FBUDtBQUNBaEgsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCMkcsSUFBbEIsQ0FBdUJqSSxTQUFTLENBQUN3SSxZQUFqQyxFQUErQ3RILElBQS9DO0FBQ0gsR0F0UXlCO0FBd1ExQjtBQUNBK0IsRUFBQUEsV0FBVyxFQUFFLHFCQUFVL0IsSUFBVixFQUFnQjtBQUN6QkcsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCMkcsSUFBbEIsQ0FBdUJqSSxTQUFTLENBQUN5SSxnQkFBakM7QUFDSCxHQTNReUI7QUE2UTFCO0FBQ0FDLEVBQUFBLFdBQVcsRUFBRSxxQkFBVTNCLElBQVYsRUFBZ0I7QUFDekIsUUFBSUMsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDRCxJQUFULEdBQWdCQSxJQUFoQjtBQUNBLFNBQUtFLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0gsR0FsUnlCO0FBb1IxQjtBQUNBOUQsRUFBQUEsV0FBVyxFQUFFLHFCQUFVaEMsSUFBVixFQUFnQjtBQUN6QitDLElBQUFBLE9BQU8sQ0FBQy9DLElBQUksQ0FBQ21ILEdBQU4sQ0FBUDs7QUFDQSxRQUFJbkgsSUFBSSxDQUFDaUcsSUFBTCxJQUFhLENBQWpCLEVBQW9CO0FBQ2hCOUYsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCMkcsSUFBbEIsQ0FBdUJqSSxTQUFTLENBQUN3SSxZQUFqQyxFQUErQ3RILElBQS9DO0FBQ0g7QUFDSixHQTFSeUI7QUE0UjFCO0FBQ0F5SCxFQUFBQSxXQUFXLEVBQUUscUJBQVVDLEtBQVYsRUFBaUI3QixJQUFqQixFQUF1QjhCLFFBQXZCLEVBQWdDM0gsSUFBaEMsRUFBc0M7QUFDL0MsUUFBSThGLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQzRCLEtBQVQsR0FBaUJBLEtBQWpCO0FBQ0E1QixJQUFBQSxRQUFRLENBQUNELElBQVQsR0FBZ0JBLElBQWhCO0FBQ0FDLElBQUFBLFFBQVEsQ0FBQzZCLFFBQVQsR0FBb0JBLFFBQXBCO0FBQ0EsU0FBSzVCLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUJELFFBQXpCO0FBQ0EsU0FBSzRCLEtBQUwsR0FBYTFILElBQWI7QUFDSCxHQXBTeUI7QUF1UzFCaUMsRUFBQUEsV0FBVyxFQUFFLHFCQUFVakMsSUFBVixFQUFnQjtBQUN6QitDLElBQUFBLE9BQU8sQ0FBQy9DLElBQUksQ0FBQ21ILEdBQU4sQ0FBUDs7QUFDQSxRQUFJbkgsSUFBSSxDQUFDaUcsSUFBTCxJQUFhLENBQWpCLEVBQW9CO0FBQ2hCOUYsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCMkcsSUFBbEIsQ0FBdUJqSSxTQUFTLENBQUM4SSxlQUFqQyxFQUFrRDVILElBQWxELEVBQXVELEtBQUswSCxLQUE1RDtBQUNILEtBRkQsTUFFSztBQUNELFVBQUcsS0FBS0EsS0FBUixFQUFjO0FBQ1Y3SSxRQUFBQSxPQUFPLENBQUMscUJBQUQsQ0FBUCxDQUErQjZCLFdBQS9CLEdBQTZDK0UsY0FBN0MsQ0FBNEQsSUFBNUQsRUFBa0UsS0FBS2lDLEtBQUwsQ0FBV2hCLE9BQTdFO0FBRUg7QUFDSjtBQUNKLEdBalR5QjtBQW1UMUJtQixFQUFBQSxTQUFTLEVBQUUsbUJBQVV2QixHQUFWLEVBQWU7QUFDdEIsUUFBSVIsUUFBUSxHQUFHLEVBQWY7QUFDQUEsSUFBQUEsUUFBUSxDQUFDUSxHQUFULEdBQWVBLEdBQWY7QUFDQSxTQUFLUCxZQUFMLENBQWtCLEtBQWxCLEVBQXlCRCxRQUF6QjtBQUNILEdBdlR5QjtBQXlUMUI1RCxFQUFBQSxXQUFXLEVBQUUscUJBQVVsQyxJQUFWLEVBQWdCO0FBQ3pCK0MsSUFBQUEsT0FBTyxDQUFDL0MsSUFBSSxDQUFDbUgsR0FBTixDQUFQOztBQUNBLFFBQUluSCxJQUFJLENBQUNpRyxJQUFMLElBQWEsQ0FBakIsRUFBb0I7QUFDaEIsVUFBSSxLQUFLdEcsU0FBTCxJQUFrQixJQUF0QixFQUE0QjtBQUN4QixhQUFLOEgsV0FBTCxDQUFpQixLQUFLOUgsU0FBTCxDQUFlK0gsS0FBaEMsRUFBdUMsS0FBSy9ILFNBQUwsQ0FBZW1FLFNBQXRELEVBQWlFLENBQWpFO0FBQ0EsYUFBS25FLFNBQUwsR0FBaUIsSUFBakI7QUFDSDtBQUNKO0FBQ0osR0FqVXlCO0FBb1UxQndDLEVBQUFBLFdBQVcsRUFBQyxxQkFBVW5DLElBQVYsRUFBZ0I7QUFDeEJHLElBQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQjJHLElBQWxCLENBQXVCakksU0FBUyxDQUFDZ0osaUJBQWpDLEVBQW9EOUgsSUFBcEQ7QUFDSCxHQXRVeUI7QUF3VTFCO0FBQ0E7QUFDQStILEVBQUFBLHVCQUF1QixFQUFDLGlDQUFVakksTUFBVixFQUFrQjtBQUN0QyxRQUFHQSxNQUFNLElBQUksSUFBYixFQUFrQjtBQUNkLFVBQUcsS0FBS2tJLGtCQUFMLElBQTJCLElBQTlCLEVBQW1DO0FBQy9CLGFBQUtBLGtCQUFMLEdBQTBCekcsS0FBSyxDQUFDMEcsV0FBTixDQUFrQixzQkFBbEIsRUFBeUMsSUFBekMsQ0FBMUI7QUFDSDs7QUFDRCxVQUFHLEtBQUtELGtCQUFMLElBQTJCLEtBQUtBLGtCQUFMLENBQXdCRSxNQUF4QixNQUFvQyxLQUFsRSxFQUF3RTtBQUNwRSxhQUFLRixrQkFBTCxDQUF3QjFFLElBQXhCO0FBQ0g7QUFFSixLQVJELE1BUUs7QUFDRCxVQUFHLEtBQUswRSxrQkFBUixFQUEyQjtBQUN2QixhQUFLQSxrQkFBTCxDQUF3QnpFLEtBQXhCO0FBQ0EsYUFBS3lFLGtCQUFMLEdBQTBCLElBQTFCO0FBQ0g7QUFDSjtBQUNKLEdBelZ5QjtBQTJWMUI7QUFDQTtBQUNBRyxFQUFBQSxvQkE3VjBCLGdDQTZWTDVGLElBN1ZLLEVBNlZDRSxHQTdWRCxFQTZWSztBQUMzQixRQUFJRixJQUFJLElBQUksSUFBWixFQUFpQjtBQUNiLFVBQUksQ0FBQyxLQUFLNkYsa0JBQVYsRUFBNkI7QUFDekIsWUFBSUMsZ0JBQWdCLEdBQUd4SixPQUFPLENBQUMsb0JBQUQsQ0FBOUI7O0FBQ0EsYUFBS3VKLGtCQUFMLEdBQTJCLElBQUlDLGdCQUFKLEVBQTNCO0FBQ0g7O0FBQ0QsV0FBS0Qsa0JBQUwsQ0FBd0I5RSxJQUF4QixDQUE2QmIsR0FBN0I7QUFDSCxLQU5ELE1BTUs7QUFDRCxVQUFJLEtBQUsyRixrQkFBVCxFQUE0QjtBQUN4QixhQUFLQSxrQkFBTCxDQUF3QjdFLEtBQXhCO0FBQ0EsYUFBSzZFLGtCQUFMLEdBQTBCLElBQTFCO0FBQ0g7QUFDSjtBQUNKLEdBMVd5QjtBQTJXMUI7QUFDQUUsRUFBQUEsU0E1VzBCLHVCQTRXZjtBQUNQLFFBQUl4QyxRQUFRLEdBQUcsRUFBZjtBQUNBLFNBQUtDLFlBQUwsQ0FBa0IsS0FBbEIsRUFBd0JELFFBQXhCO0FBQ0gsR0EvV3lCO0FBZ1gxQjFELEVBQUFBLFdBaFgwQix1QkFnWGRwQyxJQWhYYyxFQWdYVDtBQUNiK0MsSUFBQUEsT0FBTyxDQUFDL0MsSUFBSSxDQUFDbUgsR0FBTixDQUFQO0FBQ0FoSCxJQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0IyRyxJQUFsQixDQUF1QmpJLFNBQVMsQ0FBQ3lKLG1CQUFqQyxFQUFxRHZJLElBQXJEO0FBQ0gsR0FuWHlCO0FBb1gxQnFDLEVBQUFBLFdBcFgwQix1QkFvWGRyQyxJQXBYYyxFQW9YVDtBQUNiK0MsSUFBQUEsT0FBTyxDQUFDL0MsSUFBSSxDQUFDbUgsR0FBTixDQUFQOztBQUNBLFFBQUluSCxJQUFJLENBQUNpRyxJQUFMLElBQWEsQ0FBakIsRUFBbUI7QUFDZjlGLE1BQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQjJHLElBQWxCLENBQXVCakksU0FBUyxDQUFDMEosNkJBQWpDLEVBQStEeEksSUFBL0Q7QUFDSDtBQUNKLEdBelh5QjtBQTBYMUI7QUFDQTtBQUNBeUksRUFBQUEsU0E1WDBCLHFCQTRYaEJoRyxHQTVYZ0IsRUE0WFhpRyxHQTVYVyxFQTRYTnBDLEdBNVhNLEVBNFhGO0FBQ3BCLFFBQUlSLFFBQVEsR0FBRyxFQUFmO0FBQ0FBLElBQUFBLFFBQVEsQ0FBQ3JELEdBQVQsR0FBZUEsR0FBZjtBQUNBcUQsSUFBQUEsUUFBUSxDQUFDNEMsR0FBVCxHQUFlQSxHQUFmO0FBQ0E1QyxJQUFBQSxRQUFRLENBQUNRLEdBQVQsR0FBZUEsR0FBZjtBQUNBLFNBQUtQLFlBQUwsQ0FBa0IsS0FBbEIsRUFBd0JELFFBQXhCO0FBQ0gsR0FsWXlCO0FBb1kxQjZDLEVBQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNsQixRQUFJLEtBQUtsSixLQUFMLElBQWMsSUFBbEIsRUFBd0I7QUFDcEIsV0FBS0EsS0FBTCxDQUFXbUosUUFBWDtBQUNBLFdBQUtuSixLQUFMLEdBQWEsSUFBYjtBQUNIO0FBQ0osR0F6WXlCO0FBMlkxQm9KLEVBQUFBLG1CQUFtQixFQUFFLDZCQUFTQyxTQUFULEVBQW9CO0FBQ3JDLFFBQUlBLFNBQUosRUFBZTtBQUNYLFVBQUksS0FBS2Qsa0JBQVQsRUFBNkI7QUFDekIsYUFBS0Esa0JBQUwsQ0FBd0JlLFVBQXhCLENBQW1DRCxTQUFuQztBQUNILE9BRkQsTUFFTztBQUNIQSxRQUFBQSxTQUFTLENBQUMsSUFBRCxDQUFUO0FBQ0g7QUFDSixLQU5ELE1BTU87QUFDSCxVQUFJLEtBQUtkLGtCQUFULEVBQ0ksT0FBTyxLQUFLQSxrQkFBTCxDQUF3QnZFLFFBQS9CO0FBQ1A7QUFDSjtBQXRaeUIsQ0FBVCxDQUFyQjtBQXlaQXVGLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQi9KLGNBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOWVhuWfjueahOmAu+i+keaOp+WItuWxglxuLy8gPGJyLz5DcmVhdGU6IDIwMTgtMTItMTggMTc6MTI6Mjdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbnZhciBNYWxsRXZlbnQgPSByZXF1aXJlKFwibWFsbF9ldmVudFwiKTtcbnZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKTtcbnZhciBNYWluU2NlbmVDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW5zY2VuZV9jb250cm9sbGVyXCIpO1xudmFyIEJhdHRsZV9kcmFtYUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9ldmVudFwiKVxuXG52YXIgTWFsbENvbnRyb2xsZXIgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNvbnRyb2xsZXIsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbphY3nva7mlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNYWxsTW9kZWwgPSByZXF1aXJlKFwibWFsbF9tb2RlbFwiKTtcblxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IE1hbGxNb2RlbCgpO1xuXG4gICAgICAgIHRoaXMubW9kZWwuaW5pdENvbmZpZygpO1xuXG4gICAgICAgIHRoaXMuaXNfZmlyc3RfbG9naW4gPSB0cnVlO1xuICAgICAgICB0aGlzLnRlbXBfZGF0YSA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vIOi/lOWbnuW9k+WJjeeahG1vZGVsXG4gICAgZ2V0TW9kZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfSxcblxuICAgIHNldEZpcnN0TG9naW46IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5pc19maXJzdF9sb2dpbiA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgc2V0RXhjaGFuZ2VCdXlEYXRhOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLnRlbXBfZGF0YSA9IGRhdGFcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdF9yb2xlX2V2ZW50ID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5pbml0X3JvbGVfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEJhdHRsZV9kcmFtYUV2ZW50LkJhdHRsZURyYW1hX1RvcF9VcGRhdGVfRGF0YSwoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC51bmJpbmQodGhpcy5pbml0X3JvbGVfZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdF9yb2xlX2V2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5yb2xlX3ZvICE9IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICB2YXIgQmF0dGxlRHJhbWFDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9kcmFtYV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldERyYW1hRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4X2R1bl9pZCA9IENvbmZpZy5jaXR5X2RhdGEuZGF0YV9iYXNlWzFdLmFjdGl2YXRlWzBdWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhfZHVuX2lkICE9IG51bGwgJiYgZGF0YS5tYXhfZHVuX2lkID49IG1heF9kdW5faWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5leGNoYW5nZV9kYXRhLmRhdGFfc2hvcF9saXN0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5sb2dpbl9yZWQgIT0gbnVsbCAmJiBVdGlscy5uZXh0KGNvbmZpZy5sb2dpbl9yZWQpICE9IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyMTM0MDEoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOWNj+iuruaOpeWPl+S6i+S7tlxuICAgIHJlZ2lzdGVyUHJvdG9jYWxzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzQwMSwgdGhpcy5oYW5kbGUxMzQwMSk7ICAgICAgICAgICAgIC8v5ZWG5Z+O6L+b5YWl5pWw5o2u6K+35rGCXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzQwMiwgdGhpcy5oYW5kbGUxMzQwMik7ICAgICAgICAgICAgIC8v5pmu6YCa5ZWG5bqX6LSt5LmwXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzQwMywgdGhpcy5oYW5kbGUxMzQwMyk7ICAgICAgICAgICAgIC8v56We56eY5ZWG5bqX6K+35rGCXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzQwNCwgdGhpcy5oYW5kbGUxMzQwNCk7ICAgICAgICAgICAgIC8v5pyN5Yqh56uv5o6o6YCB56We56eY5ZWG5bqX5Y+v5Lul5Yi35pawXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMzQwNSwgdGhpcy5oYW5kbGUxMzQwNSk7ICAgICAgICAgICAgIC8v56We56eY5ZWG5Z+O5Yi35paw5YiX6KGoXG5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzNDA3LCB0aGlzLmhhbmRsZTEzNDA3KTsgICAgICAgICAgICAgLy/npZ7np5jllYblupfotK3kubBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzNDE5LCB0aGlzLmhhbmRsZTEzNDE5KTtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEzNDIwLCB0aGlzLmhhbmRsZTEzNDIwKTsgICAgICAgICAgICAgLy/llYblupfliLfmlrDnirbmgIFcblxuICAgICAgICAvL+a0u+WKqOWVhuWfjiDljY/orq5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NjYwLCB0aGlzLmhhbmRsZTE2NjYwKTsgICAgICAgICAgICAgLy/llYblupfliLfmlrDnirbmgIFcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDE2NjYxLCB0aGlzLmhhbmRsZTE2NjYxKTsgICAgICAgICAgICAgLy/otK3kubDpgZPlhbfljY/orq5cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5ZWG5Z+O5Li755WM6Z2iXG4gICAgLy9iaWQg6ZyA5rGC55qE54mp5ZOBYmlkXG4gICAgb3Blbk1hbGxQYW5lbDogZnVuY3Rpb24gKGJvb2wsIG5hbWUsIGJpZCkge1xuICAgICAgICBpZiAoYm9vbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgYnVpbGRfdm8gPSBNYWluU2NlbmVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0QnVpbGRWbyhTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuc2hvcCk7XG4gICAgICAgICAgICBpZiAoYnVpbGRfdm8gIT0gbnVsbCAmJiBidWlsZF92by5pc19sb2NrID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlKGJ1aWxkX3ZvLmRlc2MpO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubWFsbF9wYW5lbCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIE1hbGxXaW5kb3cgPSByZXF1aXJlKFwibWFsbF93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWxsX3BhbmVsID0gbmV3IE1hbGxXaW5kb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lIHx8IE1hbGxDb25zdC5NYWxsVHlwZS5Hb2RTaG9wO1xuICAgICAgICAgICAgdGhpcy5uZWVkX2JpZCA9IGJpZDtcbiAgICAgICAgICAgIHRoaXMubWFsbF9wYW5lbC5vcGVuKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubWFsbF9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFsbF9wYW5lbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFsbF9wYW5lbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lvJXlr7zpnIDopoFcbiAgICBnZXRNYWxsUm9vdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5tYWxsX3BhbmVsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFsbF9wYW5lbC5yb290X3duZFxuICAgIH0sXG4gICAgZ2V0TWFsbFZpZXc6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKHRoaXMubWFsbF9wYW5lbCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWxsX3BhbmVsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGdldE5lZWRCaWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmVlZF9iaWRcbiAgICB9LFxuXG4gICAgLy/orr7nva7pnIDmsYLnmoTnianlk4FiaWQgKOe7meS4jeWcqOWVhuWfjuW7uuetkemHjOeahOWVhuWfjuexu+Wei+iuvue9rlxuICAgIHNldE5lZWRCaWQ6IGZ1bmN0aW9uIChiaWQpIHtcbiAgICAgICAgdGhpcy5uZWVkX2JpZCA9IGJpZFxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOWVhuWfjuaJuemHj+i0reS5sOeVjOmdolxuICAgIG9wZW5NYWxsQnV5V2luZG93OiBmdW5jdGlvbiAoYm9vbCwgZGF0YSkge1xuICAgICAgICBpZiAoYm9vbCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc2hvcF90eXBlID09IE1hbGxDb25zdC5NYWxsVHlwZS5SZWNvdmVyeSB8fCBkYXRhLnNob3BfdHlwZSA9PSBNYWxsQ29uc3QuTWFsbFR5cGUuQWN0aW9uU2hvcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYWxsX2J1eV93aW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE1hbGxCdXlXaW5kb3cgPSByZXF1aXJlKFwibWFsbF9idXlfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4gPSBuZXcgTWFsbEJ1eVdpbmRvdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFsbF9idXlfd2luLm9wZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4uc2V0RGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJpY2VfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGlzY291bnQgIT0gbnVsbCAmJiBkYXRhLmRpc2NvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VfdmFsID0gZGF0YS5kaXNjb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlX3ZhbCA9IGRhdGEucHJpY2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzX2Nhbl9idXlfbnVtID0gdGhpcy5tb2RlbC5jaGVja01vZW55QnlUeXBlKGRhdGEucGF5X3R5cGUsIHByaWNlX3ZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc19jYW5fYnV5X251bSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF5X2NvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChkYXRhLnBheV90eXBlKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5X2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YS5wYXlfdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheV9jb25maWcgPSBVdGlscy5nZXRJdGVtQ29uZmlnKGdkYXRhKFwiaXRlbV9kYXRhXCIsIFwiZGF0YV9hc3NldHNfbGFiZWwyaWRcIiwgW2RhdGEucGF5X3R5cGVdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF5X2NvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheV9jb25maWcuaWQgPT0gZ2RhdGEoXCJpdGVtX2RhdGFcIiwgXCJkYXRhX2Fzc2V0c19sYWJlbDJpZFwiLCBcImdvbGRcIikgfHwgcGF5X2NvbmZpZy5pZCA9PSBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwicmVkX2dvbGRfb3JfZ29sZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihJU19TSE9XX0NIQVJHRSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi6ZK755+z5LiN6LazXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5DSEFSR0UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiJXPkuI3otrPvvIzmmK/lkKbliY3lvoDlhYXlgLxcIikscGF5X2NvbmZpZy5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHIsIFV0aWxzLlRJMThOKCfnoa7lrponKSwgZnVuLCBVdGlscy5USTE4Tign5Y+W5raIJyksIG51bGwsIDIsIG51bGwsIG51bGwsIG51bGwsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5UaXBzU291cmNlKHRydWUsIHBheV9jb25maWcuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFsbF9idXlfd2luID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWFsbEJ1eVdpbmRvdyA9IHJlcXVpcmUoXCJtYWxsX2J1eV93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4gPSBuZXcgTWFsbEJ1eVdpbmRvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4ub3BlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4uc2V0RGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWxsX2J1eV93aW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFsbF9idXlfd2luLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWxsX2J1eV93aW4gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v54Ot5Y2W5ZWG5Z+O55qE56S85YyF5p+l55yL55WM6Z2iXG4gICAgb3Blbk1hbGxHaWZ0UGFuZWw6IGZ1bmN0aW9uIChib29sLCBkYXRhKSB7XG4gICAgICAgIGlmIChib29sID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbGxfZ2lmdF9wYW5lbCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWxsX2dpZnRfcGFuZWwgPSBuZXcgTWFsbEdpZnRQYW5lbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYWxsX2dpZnRfcGFuZWwub3BlbihkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hbGxfZ2lmdF9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFsbF9naWZ0X3BhbmVsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWxsX2dpZnRfcGFuZWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuXG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS3ljY/orq7lpITnkIYtLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgc2VuZGVyMTM0MDE6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTM0MDEsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTM0MDE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgICBpZiAoZGF0YS5jb2RlID09IDEgJiYgZGF0YS50eXBlID09IDEpIHsgIC8v6ZK755+z5ZWG5Z+OXG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZ2RhdGEoXCJleGNoYW5nZV9kYXRhXCIsIFwiZGF0YV9zaG9wX2xpc3RcIiwgWzFdKVxuICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5sb2dpbl9yZWQgIT0gbnVsbCAmJiBVdGlscy5uZXh0KGNvbmZpZy5sb2dpbl9yZWQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gY29uZmlnLmxvZ2luX3JlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBjb25maWcubG9naW5fcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gY29uZmlnLmxvZ2luX3JlZFtrXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bSA9IHZbMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLml0ZW1fbGlzdCAhPSBudWxsICYmIFV0aWxzLm5leHQoZGF0YS5pdGVtX2xpc3QpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gZGF0YS5pdGVtX2xpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGRhdGEuaXRlbV9saXN0W2FdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PSBqLml0ZW1faWQgJiYgai5leHRbMF0udmFsIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBqLml0ZW1faWQgJiYgai5leHRbMF0udmFsID49IG51bCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvL+mDveayoeacieS5sFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbGVuKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBNYWluU2NlbmVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnVpbGRSZWRTdGF0dXMoU2NlbmVDb25zdC5DZW50ZXJTY2VuZUJ1aWxkLnNob3AsIHN0YXR1cyAmJiB0aGlzLmlzX2ZpcnN0X2xvZ2luKVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1hbGxFdmVudC5PcGVuX1ZpZXdfRXZlbnQsIGRhdGEpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIxMzQwMjogZnVuY3Rpb24gKGVpZCwgbnVtKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5laWQgPSBlaWQ7XG4gICAgICAgIHByb3RvY2FsLm51bSA9IG51bTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTM0MDIsIHByb3RvY2FsKTtcbiAgICB9LFxuXG5cbiAgICAvL1xuICAgIGhhbmRsZTEzNDAyOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1hbGxFdmVudC5CdXlfU3VjY2Vzc19FdmVudCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/npZ7np5jllYblupfor7fmsYJcbiAgICBzZW5kZXIxMzQwMzogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzQwMywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICAvL1xuICAgIGhhbmRsZTEzNDAzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWxsRXZlbnQuR2V0X0J1eV9saXN0LCBkYXRhKTtcbiAgICB9LFxuXG4gICAgLy/mnI3liqHnq6/mjqjpgIHnpZ7np5jllYblupflj6/ku6XliLfmlrBcbiAgICBoYW5kbGUxMzQwNDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWxsRXZlbnQuRnJhc2hfdGlwc19ldmVudCk7XG4gICAgfSxcblxuICAgIC8v5Yi35paw5YiX6KGoXG4gICAgc2VuZGVyMTM0MDU6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTM0MDUsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgLy8gXG4gICAgaGFuZGxlMTM0MDU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWxsRXZlbnQuR2V0X0J1eV9saXN0LCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+elnuenmOWVhuW6l+i0reS5sFxuICAgIHNlbmRlcjEzNDA3OiBmdW5jdGlvbiAob3JkZXIsIHR5cGUsIGJ1eV90eXBlLGRhdGEpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHByb3RvY2FsLnR5cGUgPSB0eXBlO1xuICAgICAgICBwcm90b2NhbC5idXlfdHlwZSA9IGJ1eV90eXBlO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzQwNywgcHJvdG9jYWwpO1xuICAgICAgICB0aGlzLm9yZGVyID0gZGF0YTtcbiAgICB9LFxuXG5cbiAgICBoYW5kbGUxMzQwNzogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1hbGxFdmVudC5CdXlfT25lX1N1Y2Nlc3MsIGRhdGEsdGhpcy5vcmRlcik7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYodGhpcy5vcmRlcil7XG4gICAgICAgICAgICAgICAgcmVxdWlyZShcImJhY2twYWNrX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLCB0aGlzLm9yZGVyLml0ZW1faWQpXG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kMTM0MTk6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLm51bSA9IG51bVxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMzQxOSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMzQxOTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYgKGRhdGEuY29kZSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50ZW1wX2RhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyMTM0MDcodGhpcy50ZW1wX2RhdGEub3JkZXIsIHRoaXMudGVtcF9kYXRhLnNob3BfdHlwZSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wX2RhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIFxuICAgIGhhbmRsZTEzNDIwOmZ1bmN0aW9uKCBkYXRhICl7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFsbEV2ZW50LkZyZWVfUmVmcmVzaF9EYXRhLCBkYXRhKTtcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLeadgui0p+W6l+ebuOWFsy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyAg5omT5byA5p2C6LSn5bqX55WM6Z2iXG4gICAgb3BlblZhcmlldHlTdG9yZVdpbmRvd3M6ZnVuY3Rpb24oIHN0YXR1cyApe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZih0aGlzLnZhcmlldHlfc3RvcmVfdmlldyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlldHlfc3RvcmVfdmlldyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwidmFyaWV0eV9zdG9yZV93aW5kb3dcIix0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMudmFyaWV0eV9zdG9yZV92aWV3ICYmIHRoaXMudmFyaWV0eV9zdG9yZV92aWV3LmlzT3BlbigpID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlldHlfc3RvcmVfdmlldy5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLnZhcmlldHlfc3RvcmVfdmlldyl7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJpZXR5X3N0b3JlX3ZpZXcuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlldHlfc3RvcmVfdmlldyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gLS3miZPlvIDmtLvliqjllYbln45cbiAgICAvLyAtLUAgYmlkIOa0u+WKqOWvueW6lOeahGJpZCDkuI3kvKDpu5jorqTmiZPlvIAg56ys5LiA5LiqXG4gICAgb3Blbk1hbGxBY3Rpb25XaW5kb3coYm9vbCwgYmlkKXtcbiAgICAgICAgaWYgKGJvb2wgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWFsbF9hY3Rpb25fd2luZG93KXtcbiAgICAgICAgICAgICAgICBsZXQgTWFsbEFjdGlvbldpbmRvdyA9IHJlcXVpcmUoXCJtYWxsX2FjdGlvbl93aW5kb3dcIilcbiAgICAgICAgICAgICAgICB0aGlzLm1hbGxfYWN0aW9uX3dpbmRvdyA9ICBuZXcgTWFsbEFjdGlvbldpbmRvdygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hbGxfYWN0aW9uX3dpbmRvdy5vcGVuKGJpZClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZiAodGhpcy5tYWxsX2FjdGlvbl93aW5kb3cpeyBcbiAgICAgICAgICAgICAgICB0aGlzLm1hbGxfYWN0aW9uX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5tYWxsX2FjdGlvbl93aW5kb3cgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3mtLvliqjllYbln47ljY/orq4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBzZW5kMTY2NjAoKXtcbiAgICAgICAgbGV0IHByb3RvY2FsID0ge31cbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTY2NjAscHJvdG9jYWwpXG4gICAgfSxcbiAgICBoYW5kbGUxNjY2MChkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShNYWxsRXZlbnQuVXBkYXRlX0FjdGlvbl9ldmVudCxkYXRhKVxuICAgIH0sXG4gICAgaGFuZGxlMTY2NjEoZGF0YSl7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSl7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKE1hbGxFdmVudC5CdXlfQWN0aW9uX1Nob3BfU3VjY2Vzc19ldmVudCxkYXRhKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLXt1aW50MzIsIGFpbSwgXCLllYblk4FpZFwifSxcbiAgICAvLyAtLXt1aW50MzIsIG51bSwgXCLotK3kubDmlbDph49cIn1cbiAgICBzZW5kMTY2NjEoYmlkLCBhaW0sIG51bSl7XG4gICAgICAgIGxldCBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLmJpZCA9IGJpZFxuICAgICAgICBwcm90b2NhbC5haW0gPSBhaW1cbiAgICAgICAgcHJvdG9jYWwubnVtID0gbnVtXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDE2NjYxLHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBfX2RlbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLkRlbGV0ZU1lKCk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRWYXJpZXR5U3RvcmVSb290OiBmdW5jdGlvbihmaW5pc2hfY2IpIHtcbiAgICAgICAgaWYgKGZpbmlzaF9jYikge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWV0eV9zdG9yZV92aWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJpZXR5X3N0b3JlX3ZpZXcuZ2V0Um9vdFduZChmaW5pc2hfY2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hfY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YXJpZXR5X3N0b3JlX3ZpZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFyaWV0eV9zdG9yZV92aWV3LnJvb3Rfd25kO1xuICAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hbGxDb250cm9sbGVyOyJdfQ==