(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/common/baseview.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, '84f60JmoNFGgILvSODq68no', 'baseview'); // Scripts/common/baseview.js "use strict"; // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 所有窗体的显示基类 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var LoaderManager = require("loadermanager"); var ViewClass = require("viewclass"); window.BaseView = cc.Class({ "extends": ViewClass, // inifPrefab: true, ctor: function ctor() { this.viewTag = SCENE_TAG.win; this.win_type = WinType.Big; this.wating = true; // this.active_status = true; this.is_close = false; this.close_is_map = false; this.prefabPath = ""; this.root_wnd = null; this.base_view_event_list = {}; // this.res_list = {} this.is_battle_hide = true; this.is_loading = false; this.is_before_battle = false; this.initConfig(); }, statics: { winMap: [] }, // 打开窗体的主入口 open: function open(params) { this.open_params = params; if (this.root_wnd) { this.openRootWnd(params); if (this.active_status == false) { this.setVisible(true); } var GuideEvent = require("guide_event"); if (GuideEvent) gcore.GlobalEvent.fire(GuideEvent.OpenTaskEffect, this.root_wnd); } else { var self = this; if (this.is_loading) return; this.is_loading = true; if (!this.waiting_timer && this.wating && !window.hide_loading) { this.waiting_timer = gcore.Timer.set(function () { this.is_wating = true; game.updateWaitingStatus(WaitingStaus.LOADING); }.bind(this), 1500, 1); } LoaderManager.getInstance().loadRes(this.prefabPath, function (res_object) { if (this.waiting_timer) { gcore.Timer.del(this.waiting_timer); this.waiting_timer = null; } if (this.is_wating) { game.updateWaitingStatus(); this.is_wating = false; } if (this.is_close) { return; } this.is_loading = false; this.root_wnd = res_object; this.root_wnd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5); ViewManager.getInstance().addToSceneNode(this.root_wnd, this.viewTag); // 还未加载完成的时候设置了不可见,那么直接隐藏掉 if (self.fastShowThenHide) { self.fastShowThenHide = false; self.setVisible(false); } // 打开回调 this.openCallBack(); // 开启注册时间 this.registerEvent(); // 数据设置 self.openRootWnd(self.open_params); // 缓存窗体数据 this.openCacheView(); if (this.root_wnd_cb) this.root_wnd_cb(this.root_wnd); var GuideEvent = require("guide_event"); if (GuideEvent) gcore.GlobalEvent.fire(GuideEvent.OpenTaskEffect, this.root_wnd); }.bind(this)); } }, /** * 关闭窗体 * @param {*} dis_map 是都断开关闭窗体的连接关系,如果是调用closeallwindow,则不需要连接,既closeCacheView的逻辑处理 */ close: function close(dis_map) { if (this.is_close) { return; } if (dis_map && dis_map instanceof Object) { this.close_is_map = dis_map.close_win || false; } this.closeCacheView(); this.is_close = true; this.closeCallBack(); this.deleteMe(); // this.removeGlobalEvent(); // if(this.root_wnd){ // this.root_wnd.destroyAllChildren(); // this.root_wnd.destroy(); // this.root_wnd = null; // } // // LoaderManager.getInstance().deleteRes(this.prefabPath); // LoaderManager.getInstance().releasePrefab(this.prefabPath); // for(var key in this.res_list){ // LoaderManager.getInstance().releaseRes(key) // } }, deleteMe: function deleteMe() { this._super(); }, checkWinType: function checkWinType(type) { return type == WinType.Mini || type == WinType.Tips; }, // 对打开过的窗体做缓存处理 openCacheView: function openCacheView() { if (this.prefabPath == "prefab/chat/chat_window.prefab") { return; } BaseView.winMap.push(this); var length = BaseView.winMap; if (length > 1) { var next_index = length - 2; // 倒数第二个窗体的下表 var lastWin = BaseView.winMap[next_index]; // 如果这个面板的上一个面板是一个mini窗体的话,那么关闭掉上一个mini窗体,并且把改mini窗体的下一个窗体指向当前窗体 if (lastWin && this.checkWinType(lastWin.win_type) && this.win_type != WinType.Mini) { BaseView.winMap.splice(next_index, 1); lastWin.top_win = null; lastWin.next_win = null; if (lastWin.close) { lastWin.close(); } } // 取出当前窗体的上一个窗体,做关联 var next_index_to = BaseView.winMap.length - 2; if (next_index_to && next_index_to.active_status == true) { this.top_win = next_index_to; next_index_to.next_win = this; if (!this.checkWinType(this.win_type)) { this.top_win.setVisible(false); } } } // 如果是全屏窗体,则需要有隐藏掉主场景,和战斗场景 if (this.win_type == WinType.Full) { var mainSceneController = require("mainscene_controller").getInstance(); mainSceneController.handleSceneStatus(false); var battleSceneController = require("battle_controller").getInstance(); battleSceneController.handleBattleSceneStatus(false); var mainUiController = require("mainui_controller").getInstance(); mainUiController.openMainUI(false); } }, // 关闭窗体的时候做处理, closeCacheView: function closeCacheView() { var array = BaseView.winMap; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element == this) { if (this.top_win && !this.close_is_map) { // 如果这个窗体存在上一个窗体,那么没有下一个窗体的时候,打开上一个窗体,如果有下一个窗体,则把上一个窗体的下一个窗体变成自身的下一个窗体,进行关联 if (this.is_battle_hide == false) {// 旧版本的众神战场有这样的需求,界面进战斗不消失.现在基本上没有 } else if (this.next_win == null || this.next_win.win_type != WinType.Full) { this.top_win.setVisible(true); } this.top_win.next_win = null; if (this.next_win) { this.top_win.next_win = this.next_win; this.next_win.top_win = this.top_win; } } // 删除掉这个 BaseView.winMap.splice(index, 1); break; } } // 如果没有窗体,或者没有全屏窗体,则显示出主城和主战斗场景 if (BaseView.winMap.length == 0 || !this.isFullWinExist()) { var battleSceneController = require("battle_controller").getInstance(); if (battleSceneController.hadBattleScene()) { // 如果在战斗中 battleSceneController.handleBattleSceneStatus(true); } else { var mainUiController = require("mainui_controller").getInstance(); var btn_index = mainUiController.getMainUIIndex(); var MainUiConst = require("mainui_const"); if (btn_index != MainUiConst.btn_index.drama_scene) { var mainSceneController = require("mainscene_controller").getInstance(); mainSceneController.handleSceneStatus(true); } } } }, isFullWinExist: function isFullWinExist() { var array = BaseView.winMap; for (var index = 0; index < array.length; index++) { var element = array[index]; if (element.win_type == WinType.Full && element.is_before_battle == false) { return true; } } return false; }, setVisible: function setVisible(status) { if (this.active_status == status) { return; } this.active_status = status; if (this.root_wnd) { this.root_wnd.active = status; } else { this.fastShowThenHide = status; } }, getVisible: function getVisible(status) { return this.active_status; }, getRootWnd: function getRootWnd(cb) { this.root_wnd_cb = cb; if (this.root_wnd) this.root_wnd_cb(this.root_wnd); }, // 初始化一些基础数据 initConfig: function initConfig() {}, // 子类中实现, openRootWnd: function openRootWnd() {}, // 注册监听事件,子类中实现 registerEvent: function registerEvent() {}, // 打开界面之后回调,子类中实现 openCallBack: function openCallBack() {}, // 关闭界面之后的回调,子类中实现 closeCallBack: function closeCallBack() {} }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxiYXNldmlldy5qcyJdLCJuYW1lcyI6WyJMb2FkZXJNYW5hZ2VyIiwicmVxdWlyZSIsIlZpZXdDbGFzcyIsIndpbmRvdyIsIkJhc2VWaWV3IiwiY2MiLCJDbGFzcyIsImN0b3IiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwid2luIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwid2F0aW5nIiwiaXNfY2xvc2UiLCJjbG9zZV9pc19tYXAiLCJwcmVmYWJQYXRoIiwicm9vdF93bmQiLCJiYXNlX3ZpZXdfZXZlbnRfbGlzdCIsImlzX2JhdHRsZV9oaWRlIiwiaXNfbG9hZGluZyIsImlzX2JlZm9yZV9iYXR0bGUiLCJpbml0Q29uZmlnIiwic3RhdGljcyIsIndpbk1hcCIsIm9wZW4iLCJwYXJhbXMiLCJvcGVuX3BhcmFtcyIsIm9wZW5Sb290V25kIiwiYWN0aXZlX3N0YXR1cyIsInNldFZpc2libGUiLCJHdWlkZUV2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJPcGVuVGFza0VmZmVjdCIsInNlbGYiLCJ3YWl0aW5nX3RpbWVyIiwiaGlkZV9sb2FkaW5nIiwiVGltZXIiLCJzZXQiLCJpc193YXRpbmciLCJnYW1lIiwidXBkYXRlV2FpdGluZ1N0YXR1cyIsIldhaXRpbmdTdGF1cyIsIkxPQURJTkciLCJiaW5kIiwiZ2V0SW5zdGFuY2UiLCJsb2FkUmVzIiwicmVzX29iamVjdCIsImRlbCIsInNldFBvc2l0aW9uIiwiU0NSRUVOX1dJRFRIIiwiU0NSRUVOX0hFSUdIVCIsIlZpZXdNYW5hZ2VyIiwiYWRkVG9TY2VuZU5vZGUiLCJmYXN0U2hvd1RoZW5IaWRlIiwib3BlbkNhbGxCYWNrIiwicmVnaXN0ZXJFdmVudCIsIm9wZW5DYWNoZVZpZXciLCJyb290X3duZF9jYiIsImNsb3NlIiwiZGlzX21hcCIsIk9iamVjdCIsImNsb3NlX3dpbiIsImNsb3NlQ2FjaGVWaWV3IiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIiwiX3N1cGVyIiwiY2hlY2tXaW5UeXBlIiwidHlwZSIsIk1pbmkiLCJUaXBzIiwicHVzaCIsImxlbmd0aCIsIm5leHRfaW5kZXgiLCJsYXN0V2luIiwic3BsaWNlIiwidG9wX3dpbiIsIm5leHRfd2luIiwibmV4dF9pbmRleF90byIsIkZ1bGwiLCJtYWluU2NlbmVDb250cm9sbGVyIiwiaGFuZGxlU2NlbmVTdGF0dXMiLCJiYXR0bGVTY2VuZUNvbnRyb2xsZXIiLCJoYW5kbGVCYXR0bGVTY2VuZVN0YXR1cyIsIm1haW5VaUNvbnRyb2xsZXIiLCJvcGVuTWFpblVJIiwiYXJyYXkiLCJpbmRleCIsImVsZW1lbnQiLCJpc0Z1bGxXaW5FeGlzdCIsImhhZEJhdHRsZVNjZW5lIiwiYnRuX2luZGV4IiwiZ2V0TWFpblVJSW5kZXgiLCJNYWluVWlDb25zdCIsImRyYW1hX3NjZW5lIiwic3RhdHVzIiwiYWN0aXZlIiwiZ2V0VmlzaWJsZSIsImdldFJvb3RXbmQiLCJjYiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQyxlQUFELENBQTNCOztBQUNBLElBQUlDLFNBQVMsR0FBR0QsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0FFLE1BQU0sQ0FBQ0MsUUFBUCxHQUFrQkMsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDdkIsYUFBU0osU0FEYztBQUV2QjtBQUNBSyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxPQUFMLEdBQWVDLFNBQVMsQ0FBQ0MsR0FBekI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCQyxPQUFPLENBQUNDLEdBQXhCO0FBQ0EsU0FBS0MsTUFBTCxHQUFjLElBQWQsQ0FIYyxDQUlkOztBQUNBLFNBQUtDLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixFQUFsQjtBQUNBLFNBQUtDLFFBQUws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QUNQLEdBNU9zQjtBQThPdkI7QUFDQUssRUFBQUEsVUFBVSxFQUFFLHNCQUFZLENBQUcsQ0EvT0o7QUFpUHZCO0FBQ0FNLEVBQUFBLFdBQVcsRUFBRSx1QkFBWSxDQUFHLENBbFBMO0FBb1B2QjtBQUNBOEIsRUFBQUEsYUFBYSxFQUFFLHlCQUFZLENBQUcsQ0FyUFA7QUF1UHZCO0FBQ0FELEVBQUFBLFlBQVksRUFBRSx3QkFBWSxDQUFHLENBeFBOO0FBMFB2QjtBQUNBUyxFQUFBQSxhQUFhLEVBQUUseUJBQVksQ0FBRztBQTNQUCxDQUFULENBQWxCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiYDmnInnqpfkvZPnmoTmmL7npLrln7rnsbtcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTG9hZGVyTWFuYWdlciA9IHJlcXVpcmUoXCJsb2FkZXJtYW5hZ2VyXCIpO1xudmFyIFZpZXdDbGFzcyA9IHJlcXVpcmUoXCJ2aWV3Y2xhc3NcIik7XG53aW5kb3cuQmFzZVZpZXcgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogVmlld0NsYXNzLFxuICAgIC8vIGluaWZQcmVmYWI6IHRydWUsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcud2luO1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5CaWc7XG4gICAgICAgIHRoaXMud2F0aW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gdGhpcy5hY3RpdmVfc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc19jbG9zZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsb3NlX2lzX21hcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBcIlwiO1xuICAgICAgICB0aGlzLnJvb3Rfd25kID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdCA9IHt9O1xuICAgICAgICAvLyB0aGlzLnJlc19saXN0ID0ge31cbiAgICAgICAgdGhpcy5pc19iYXR0bGVfaGlkZSA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzX2JlZm9yZV9iYXR0bGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0Q29uZmlnKCk7XG4gICAgfSxcbiAgICBzdGF0aWNzOiB7XG4gICAgICAgIHdpbk1hcDogW10sXG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOeql+S9k+eahOS4u+WFpeWPo1xuICAgIG9wZW46IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5vcGVuX3BhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblJvb3RXbmQocGFyYW1zKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZV9zdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgR3VpZGVFdmVudCA9IHJlcXVpcmUoXCJndWlkZV9ldmVudFwiKTtcbiAgICAgICAgICAgIGlmIChHdWlkZUV2ZW50KVxuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgdGhpcy5yb290X3duZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodGhpcy5pc19sb2FkaW5nKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndhaXRpbmdfdGltZXIgJiYgdGhpcy53YXRpbmcgJiYgIXdpbmRvdy5oaWRlX2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhaXRpbmdfdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX3dhdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGdhbWUudXBkYXRlV2FpdGluZ1N0YXR1cyhXYWl0aW5nU3RhdXMuTE9BRElORyk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAxNTAwLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXModGhpcy5wcmVmYWJQYXRoLCAoZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YWl0aW5nX3RpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLndhaXRpbmdfdGltZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRpbmdfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX3dhdGluZykge1xuICAgICAgICAgICAgICAgICAgICBnYW1lLnVwZGF0ZVdhaXRpbmdTdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc193YXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19jbG9zZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQgPSByZXNfb2JqZWN0O1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdF93bmQuc2V0UG9zaXRpb24oLVNDUkVFTl9XSURUSCAqIDAuNSwgLVNDUkVFTl9IRUlHSFQgKiAwLjUpXG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb1NjZW5lTm9kZSh0aGlzLnJvb3Rfd25kLCB0aGlzLnZpZXdUYWcpO1xuXG4gICAgICAgICAgICAgICAgLy8g6L+Y5pyq5Yqg6L295a6M5oiQ55qE5pe25YCZ6K6+572u5LqG5LiN5Y+v6KeBLOmCo+S5iOebtOaOpemakOiXj+aOiVxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmZhc3RTaG93VGhlbkhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYXN0U2hvd1RoZW5IaWRlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIOaJk+W8gOWbnuiwg1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbkNhbGxCYWNrKCk7XG4gICAgICAgICAgICAgICAgLy8g5byA5ZCv5rOo5YaM5pe26Ze0XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KCk7XG4gICAgICAgICAgICAgICAgLy8g5pWw5o2u6K6+572uXG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuUm9vdFduZChzZWxmLm9wZW5fcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAvLyDnvJPlrZjnqpfkvZPmlbDmja5cbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5DYWNoZVZpZXcoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Rfd25kX2NiKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuXG4gICAgICAgICAgICAgICAgdmFyIEd1aWRlRXZlbnQgPSByZXF1aXJlKFwiZ3VpZGVfZXZlbnRcIik7XG4gICAgICAgICAgICAgICAgaWYgKEd1aWRlRXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5PcGVuVGFza0VmZmVjdCwgdGhpcy5yb290X3duZCk7XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWFs+mXreeql+S9k1xuICAgICAqIEBwYXJhbSB7Kn0gZGlzX21hcCDmmK/pg73mlq3lvIDlhbPpl63nqpfkvZPnmoTov57mjqXlhbPns7ss5aaC5p6c5piv6LCD55SoY2xvc2VhbGx3aW5kb3cs5YiZ5LiN6ZyA6KaB6L+e5o6lLOaXomNsb3NlQ2FjaGVWaWV355qE6YC76L6R5aSE55CGXG4gICAgICovXG4gICAgY2xvc2U6IGZ1bmN0aW9uIChkaXNfbWFwKSB7XG4gICAgICAgIGlmICh0aGlzLmlzX2Nsb3NlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc19tYXAgJiYgKGRpc19tYXAgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlX2lzX21hcCA9IGRpc19tYXAuY2xvc2Vfd2luIHx8IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZUNhY2hlVmlldygpO1xuICAgICAgICB0aGlzLmlzX2Nsb3NlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbG9zZUNhbGxCYWNrKCk7XG4gICAgICAgIHRoaXMuZGVsZXRlTWUoKTtcbiAgICAgICAgLy8gdGhpcy5yZW1vdmVHbG9iYWxFdmVudCgpO1xuICAgICAgICAvLyBpZih0aGlzLnJvb3Rfd25kKXtcbiAgICAgICAgLy8gICAgIHRoaXMucm9vdF93bmQuZGVzdHJveUFsbENoaWxkcmVuKCk7XG4gICAgICAgIC8vICAgICB0aGlzLnJvb3Rfd25kLmRlc3Ryb3koKTtcbiAgICAgICAgLy8gICAgIHRoaXMucm9vdF93bmQgPSBudWxsO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXModGhpcy5wcmVmYWJQYXRoKTtcbiAgICAgICAgLy8gTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VQcmVmYWIodGhpcy5wcmVmYWJQYXRoKTtcbiAgICAgICAgLy8gZm9yKHZhciBrZXkgaW4gdGhpcy5yZXNfbGlzdCl7XG4gICAgICAgIC8vICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVJlcyhrZXkpXG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fc3VwZXIoKTtcbiAgICB9LFxuXG4gICAgY2hlY2tXaW5UeXBlOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdHlwZSA9PSBXaW5UeXBlLk1pbmkgfHwgdHlwZSA9PSBXaW5UeXBlLlRpcHNcbiAgICB9LFxuXG4gICAgLy8g5a+55omT5byA6L+H55qE56qX5L2T5YGa57yT5a2Y5aSE55CGXG4gICAgb3BlbkNhY2hlVmlldzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wcmVmYWJQYXRoID09IFwicHJlZmFiL2NoYXQvY2hhdF93aW5kb3cucHJlZmFiXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBCYXNlVmlldy53aW5NYXAucHVzaCh0aGlzKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gQmFzZVZpZXcud2luTWFwXG4gICAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgbmV4dF9pbmRleCA9IGxlbmd0aCAtIDI7ICAgIC8vIOWAkuaVsOesrOS6jOS4queql+S9k+eahOS4i+ihqCBcbiAgICAgICAgICAgIHZhciBsYXN0V2luID0gQmFzZVZpZXcud2luTWFwW25leHRfaW5kZXhdO1xuICAgICAgICAgICAgLy8g5aaC5p6c6L+Z5Liq6Z2i5p2/55qE5LiK5LiA5Liq6Z2i5p2/5piv5LiA5LiqbWluaeeql+S9k+eahOivnSzpgqPkuYjlhbPpl63mjonkuIrkuIDkuKptaW5p56qX5L2TLOW5tuS4lOaKiuaUuW1pbmnnqpfkvZPnmoTkuIvkuIDkuKrnqpfkvZPmjIflkJHlvZPliY3nqpfkvZNcbiAgICAgICAgICAgIGlmIChsYXN0V2luICYmIHRoaXMuY2hlY2tXaW5UeXBlKGxhc3RXaW4ud2luX3R5cGUpICYmIHRoaXMud2luX3R5cGUgIT0gV2luVHlwZS5NaW5pKSB7XG4gICAgICAgICAgICAgICAgQmFzZVZpZXcud2luTWFwLnNwbGljZShuZXh0X2luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBsYXN0V2luLnRvcF93aW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGxhc3RXaW4ubmV4dF93aW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0V2luLmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXaW4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlj5blh7rlvZPliY3nqpfkvZPnmoTkuIrkuIDkuKrnqpfkvZMs5YGa5YWz6IGUXG4gICAgICAgICAgICB2YXIgbmV4dF9pbmRleF90byA9IEJhc2VWaWV3Lndpbk1hcC5sZW5ndGggLSAyO1xuICAgICAgICAgICAgaWYgKG5leHRfaW5kZXhfdG8gJiYgbmV4dF9pbmRleF90by5hY3RpdmVfc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcF93aW4gPSBuZXh0X2luZGV4X3RvO1xuICAgICAgICAgICAgICAgIG5leHRfaW5kZXhfdG8ubmV4dF93aW4gPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja1dpblR5cGUodGhpcy53aW5fdHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOaYr+WFqOWxj+eql+S9kyzliJnpnIDopoHmnInpmpDol4/mjonkuLvlnLrmma8s5ZKM5oiY5paX5Zy65pmvXG4gICAgICAgIGlmICh0aGlzLndpbl90eXBlID09IFdpblR5cGUuRnVsbCkge1xuICAgICAgICAgICAgdmFyIG1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIG1haW5TY2VuZUNvbnRyb2xsZXIuaGFuZGxlU2NlbmVTdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGJhdHRsZVNjZW5lQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBiYXR0bGVTY2VuZUNvbnRyb2xsZXIuaGFuZGxlQmF0dGxlU2NlbmVTdGF0dXMoZmFsc2UpXG4gICAgICAgICAgICB2YXIgbWFpblVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBtYWluVWlDb250cm9sbGVyLm9wZW5NYWluVUkoZmFsc2UpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T55qE5pe25YCZ5YGa5aSE55CGLFxuICAgIGNsb3NlQ2FjaGVWaWV3OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IEJhc2VWaWV3Lndpbk1hcDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3Bfd2luICYmICF0aGlzLmNsb3NlX2lzX21hcCkgeyAgIC8vIOWmguaenOi/meS4queql+S9k+WtmOWcqOS4iuS4gOS4queql+S9kyzpgqPkuYjmsqHmnInkuIvkuIDkuKrnqpfkvZPnmoTml7blgJks5omT5byA5LiK5LiA5Liq56qX5L2TLOWmguaenOacieS4i+S4gOS4queql+S9kyzliJnmiorkuIrkuIDkuKrnqpfkvZPnmoTkuIvkuIDkuKrnqpfkvZPlj5jmiJDoh6rouqvnmoTkuIvkuIDkuKrnqpfkvZMs6L+b6KGM5YWz6IGUXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzX2JhdHRsZV9oaWRlID09IGZhbHNlKSB7ICAgICAgIC8vIOaXp+eJiOacrOeahOS8l+elnuaImOWcuuaciei/meagt+eahOmcgOaxgiznlYzpnaLov5vmiJjmlpfkuI3mtojlpLEu546w5Zyo5Z+65pys5LiK5rKh5pyJXG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5leHRfd2luID09IG51bGwgfHwgdGhpcy5uZXh0X3dpbi53aW5fdHlwZSAhPSBXaW5UeXBlLkZ1bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9wX3dpbi5zZXRWaXNpYmxlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLm5leHRfd2luID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0X3dpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3Bfd2luLm5leHRfd2luID0gdGhpcy5uZXh0X3dpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dF93aW4udG9wX3dpbiA9IHRoaXMudG9wX3dpbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKDpmaTmjonov5nkuKpcbiAgICAgICAgICAgICAgICBCYXNlVmlldy53aW5NYXAuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOayoeacieeql+S9kyzmiJbogIXmsqHmnInlhajlsY/nqpfkvZMs5YiZ5pi+56S65Ye65Li75Z+O5ZKM5Li75oiY5paX5Zy65pmvXG4gICAgICAgIGlmIChCYXNlVmlldy53aW5NYXAubGVuZ3RoID09IDAgfHwgIXRoaXMuaXNGdWxsV2luRXhpc3QoKSkge1xuICAgICAgICAgICAgdmFyIGJhdHRsZVNjZW5lQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpXG4gICAgICAgICAgICBpZiAoYmF0dGxlU2NlbmVDb250cm9sbGVyLmhhZEJhdHRsZVNjZW5lKCkpIHsgLy8g5aaC5p6c5Zyo5oiY5paX5LitICBcbiAgICAgICAgICAgICAgICBiYXR0bGVTY2VuZUNvbnRyb2xsZXIuaGFuZGxlQmF0dGxlU2NlbmVTdGF0dXModHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG1haW5VaUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgYnRuX2luZGV4ID0gbWFpblVpQ29udHJvbGxlci5nZXRNYWluVUlJbmRleCgpO1xuICAgICAgICAgICAgICAgIHZhciBNYWluVWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKGJ0bl9pbmRleCAhPSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1haW5TY2VuZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFpblNjZW5lQ29udHJvbGxlci5oYW5kbGVTY2VuZVN0YXR1cyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNGdWxsV2luRXhpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBCYXNlVmlldy53aW5NYXA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG4gICAgICAgICAgICBpZiAoZWxlbWVudC53aW5fdHlwZSA9PSBXaW5UeXBlLkZ1bGwgJiYgZWxlbWVudC5pc19iZWZvcmVfYmF0dGxlID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBzZXRWaXNpYmxlOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZV9zdGF0dXMgPT0gc3RhdHVzKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZV9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmFjdGl2ZSA9IHN0YXR1cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmFzdFNob3dUaGVuSGlkZSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRWaXNpYmxlOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZV9zdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0Um9vdFduZDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmRfY2IgPSBjYjtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvln7rnoYDmlbDmja5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDlrZDnsbvkuK3lrp7njrAsXG4gICAgb3BlblJvb3RXbmQ6IGZ1bmN0aW9uICgpIHsgfSxcblxuICAgIC8vIOazqOWGjOebkeWQrOS6i+S7tizlrZDnsbvkuK3lrp7njrBcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDmiZPlvIDnlYzpnaLkuYvlkI7lm57osIMs5a2Q57G75Lit5a6e546wXG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7IH0sXG5cbiAgICAvLyDlhbPpl63nlYzpnaLkuYvlkI7nmoTlm57osIMs5a2Q57G75Lit5a6e546wXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkgeyB9LFxufSk7XG4iXX0=