|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/common/common_scrollview_single.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, '214a9FAXt5FTpkEEnLj0wMq', 'common_scrollview_single');
|
// Scripts/common/common_scrollview_single.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 新版本无限循环列表容器, cellitem 需要继承basepanel
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var CommonScrollViewSingle = cc.Class({
|
"extends": BaseClass,
|
ctor: function ctor() {
|
this.initConfig();
|
},
|
initConfig: function initConfig() {
|
this.parent = null;
|
this.prefabPath = PathTool.getPrefabPath("common", "common_scroll_view");
|
this.pos = cc.v2(0, 0);
|
this.dir = ScrollViewDir.vertical;
|
this.start_pos = ScrollViewStartPos.top;
|
this.size = cc.size(100, 100);
|
this.ap = cc.v2(0, 0); //存放所有格子结构体
|
|
this.cellList = []; //缓存Cell所用到的对象
|
|
this.cacheList = {}; //记录活跃得格子ID
|
|
this.activeCellIdx = {}; //当前选择物品的索引
|
|
this.selectCellIndex = 1; //回调方法
|
|
this.handler = {}; //到时间显示的索引
|
|
this.time_show_index = 0; //是否初始化
|
|
this.is_first_init = true; //最大条目
|
|
this.cacheMaxSize = 1;
|
},
|
|
/**
|
* 创建
|
* @param {*} parent 所在父节点
|
* @param {*} pos 滑动组件位置
|
* @param {*} dir 滑动对齐方式
|
* @param {*} start_pos 滑动列表开始位置
|
* @param {*} size 滑动框大小
|
* @param {*} setting 设置信息
|
* @param {*} ap 锚点
|
*/
|
createScroll: function createScroll(parent, pos, dir, start_pos, size, setting, ap) {
|
this.parent = parent;
|
this.pos = pos || cc.v2(0, 0);
|
this.dir = dir || ScrollViewDir.vertical;
|
this.start_pos = start_pos || ScrollViewStartPos.top;
|
this.size = size || cc.size(100, 100);
|
this.ap = ap || cc.v2(0, 0);
|
this.analysisSetting(setting);
|
LoaderManager.getInstance().loadRes(this.prefabPath, function (res_object) {
|
var scroll = res_object;
|
this.createRootWnd(scroll);
|
}.bind(this));
|
},
|
//解析数据
|
analysisSetting: function analysisSetting(setting) {
|
this.setting = setting || {};
|
this.start_x = this.setting.start_x || 0; //第一个单元的起点X
|
|
this.space_x = this.setting.space_x || 0; // 横向间隔空间
|
|
this.start_y = this.setting.start_y || 0; // 第一个单元的起点Y
|
|
this.space_y = this.setting.space_y || 0; // 竖向间隔空间
|
|
this.item_width = this.setting.item_width || 115; // 单元的宽度
|
|
this.item_height = this.setting.item_height || 115; // 单元的高度
|
|
this.row = this.setting.row || 5; // 行数,作用于水平方向的滚动
|
|
this.col = this.setting.col || 5; // 列数,作用于垂直方向的滚动
|
|
this.delay = this.setting.delay || 4; // 创建延迟时间
|
|
this.once_num = this.setting.once_num || 1; // 每次创建的数量
|
|
this.need_dynamic = this.setting.need_dynamic || true; // 是否需要动态创建的
|
//横向的只支持一行的..
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
this.row = 1;
|
}
|
|
this.calculationMaxSum();
|
},
|
//计算一下一屏最多创建的个数
|
calculationMaxSum: function calculationMaxSum() {
|
var max_sum;
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
max_sum = (Math.ceil(this.size.width / (this.item_width + this.space_x)) + 1) * this.row;
|
} else {
|
max_sum = (Math.ceil(this.size.height / (this.item_height + this.space_y)) + 1) * this.col;
|
}
|
|
this.cacheMaxSize = max_sum;
|
},
|
// 初始化创建对象
|
createRootWnd: function createRootWnd(scroll) {
|
this.root_wnd = scroll;
|
this.scroll_view = scroll.getChildByName("ScrollView");
|
this.scroll_view_mask = this.scroll_view.getChildByName("view");
|
this.scroll_view_con = this.scroll_view_mask.getChildByName("content");
|
this.root_wnd.setContentSize(this.size);
|
this.root_wnd.setAnchorPoint(this.ap.x, this.ap.y);
|
this.root_wnd.setPosition(this.pos);
|
this.scroll_view.setContentSize(this.size);
|
this.scroll_view_mask.setContentSize(this.size);
|
this.scroll_view_con.setContentSize(this.size); // 滚动组建
|
|
this.scroll_view_compend = this.scroll_view.getComponent(cc.ScrollView);
|
|
if (this.dir == ScrollViewDir.vertical) {
|
this.scroll_view_compend.vertical = true;
|
} else {
|
this.scroll_view_compend.horizontal = true;
|
}
|
|
this.container = this.scroll_view_con;
|
|
if (this.parent) {
|
this.parent.addChild(scroll);
|
} // 监听事件
|
|
|
this.setInnerContainer();
|
this.registerEvent(); // if (this.select_index != null) {
|
|
this.reloadData(this.select_index, this.setting); // }
|
},
|
// 滚动设置
|
registerEvent: function registerEvent() {
|
if (this.need_dynamic == true) {
|
this.scroll_view_compend.node.on('scrolling', this.checkRectIntersectsRect, this); // this.scroll_view_compend.node.on('bounce-bottom', this.scrollToBottom_callback, this);
|
}
|
},
|
// 滚动到底部的时候回调
|
addScrollToBottomCallBack: function addScrollToBottomCallBack(callback) {
|
this.scrollToBottom_callback = callback;
|
},
|
// 注册事件
|
registerScriptHandlerSingle: function registerScriptHandlerSingle(func, handlerId) {
|
this.handler[handlerId] = func;
|
},
|
//获取cell数量
|
numberOfCells: function numberOfCells() {
|
if (this.handler[ScrollViewFuncType.NumberOfCells]) {
|
return this.handler[ScrollViewFuncType.NumberOfCells]();
|
}
|
},
|
// 刷新每一个cell
|
updateCellByIndex: function updateCellByIndex(cell, index) {
|
if (this.handler[ScrollViewFuncType.UpdateCellByIndex]) {
|
this.handler[ScrollViewFuncType.UpdateCellByIndex](cell, index);
|
}
|
},
|
// 创建一个显示对象
|
createNewCell: function createNewCell() {
|
if (this.handler[ScrollViewFuncType.CreateNewCell]) {
|
return this.handler[ScrollViewFuncType.CreateNewCell](this.item_width, this.item_height);
|
}
|
},
|
// 点击单个
|
onCellTouched: function onCellTouched(cell, index) {
|
if (this.handler[ScrollViewFuncType.OnCellTouched]) {
|
this.handler[ScrollViewFuncType.OnCellTouched](cell, index);
|
}
|
},
|
// 设置是否可点击
|
setClickEnabled: function setClickEnabled(status) {},
|
// 设置是否吞噬点击
|
setSwallowTouches: function setSwallowTouches(status) {},
|
// 移动过程中是否不再可是范围,不再的时候移除,放到对象池,准备下一次创建
|
checkRectIntersectsRect: function checkRectIntersectsRect() {
|
if (this.dir == ScrollViewDir.vertical) {
|
this.checkOverShowByVertical();
|
} else {
|
this.checkOverShowByHorizontal();
|
}
|
},
|
// 竖直方向的监测判断
|
checkOverShowByVertical: function checkOverShowByVertical() {
|
if (this.cellList == null) return;
|
var sum = this.cellList.length;
|
if (sum == 0) return;
|
var container_y = this.container.y;
|
var bot = -container_y;
|
var top = this.size.height + bot;
|
var col_count = Math.ceil(sum / this.col); // 活跃cell开始行数
|
|
var activeCellStartRow = 0;
|
|
for (var i = 0; i < col_count; i++) {
|
var index = i * this.col;
|
var cell = this.cellList[index];
|
activeCellStartRow = i;
|
|
if (cell && cell.y - this.item_height * 0.5 <= top) {
|
break;
|
}
|
} // 活跃cell结束行数
|
|
|
var activeCellEndRow = col_count;
|
|
if (bot > 0) {
|
for (var _i = activeCellStartRow; _i < col_count; _i++) {
|
var index = _i * this.col;
|
var cell = this.cellList[index];
|
|
if (cell && cell.y + this.item_height * 0.5 < bot) {
|
activeCellEndRow = _i - 1;
|
break;
|
}
|
}
|
} // 重复使用
|
|
|
var max_count = this.numberOfCells();
|
|
for (var _i2 = 0; _i2 < col_count; _i2++) {
|
if (_i2 >= activeCellStartRow && _i2 <= activeCellEndRow) {
|
for (var m = 0; m < this.col; m++) {
|
var index = _i2 * this.col + m;
|
|
if (!this.activeCellIdx[index]) {
|
if (index <= max_count) {
|
this.updateCellAtIndex(index);
|
this.activeCellIdx[index] = true;
|
}
|
}
|
}
|
} else {
|
for (var _m = 0; _m < this.col; _m++) {
|
var index = _i2 * this.col + _m;
|
|
if (index <= max_count) {
|
this.activeCellIdx[index] = false;
|
}
|
}
|
}
|
}
|
},
|
// 竖直方向的监测判断
|
checkOverShowByVerticalBottom: function checkOverShowByVerticalBottom() {
|
if (this.cellList == null) return;
|
var sum = this.cellList.length;
|
if (sum == 0) return;
|
var container_y = this.container.y;
|
var bot = -container_y;
|
var top = this.size.height + bot;
|
var col_count = Math.ceil(sum / this.col); // 活跃cell开始行数
|
|
var activeCellStartRow = col_count;
|
|
for (var i = col_count - 1; i >= 0; i--) {
|
var index = i * this.col;
|
var cell = this.cellList[index];
|
activeCellStartRow = i;
|
|
if (cell && cell.y - this.item_height * 0.5 <= top) {
|
break;
|
}
|
} // 活跃cell结束行数
|
|
|
var activeCellEndRow = 0;
|
|
if (bot > 0) {
|
for (var _i3 = activeCellStartRow - 1; _i3 >= 0; _i3--) {
|
var index = _i3 * this.col;
|
var cell = this.cellList[index];
|
|
if (cell && cell.y + this.item_height * 0.5 < bot) {
|
activeCellEndRow = _i3 + 1;
|
break;
|
}
|
}
|
} // 重复使用
|
|
|
var max_count = this.numberOfCells();
|
|
for (var _i4 = 0; _i4 < col_count; _i4++) {
|
if (_i4 <= activeCellStartRow && _i4 >= activeCellEndRow) {
|
for (var m = 0; m < this.col; m++) {
|
var index = _i4 * this.col + m;
|
|
if (!this.activeCellIdx[index]) {
|
if (index <= max_count) {
|
this.updateCellAtIndex(index);
|
this.activeCellIdx[index] = true;
|
}
|
}
|
}
|
} else {
|
for (var _m2 = 0; _m2 < this.col; _m2++) {
|
var index = _i4 * this.col + _m2;
|
|
if (index <= max_count) {
|
this.activeCellIdx[index] = false;
|
}
|
}
|
}
|
}
|
},
|
// 水平方向的监测
|
checkOverShowByHorizontal: function checkOverShowByHorizontal() {
|
if (this.cellList == null) return;
|
var row_count = this.cellList.length;
|
if (row_count == 0) return;
|
var container_x = this.container.x;
|
var top = -container_x;
|
var bot = top + this.size.width; // 活跃cell开始列数
|
|
var activeCellStartRow = 0;
|
|
if (top > 0) {
|
for (var i = 0; i < row_count; i++) {
|
var cell = this.cellList[i];
|
activeCellStartRow = i;
|
|
if (cell && cell.x + this.item_width * 0.5 >= top) {
|
break;
|
}
|
}
|
} // 活跃cell结束行数
|
|
|
var activeCellEndRow = row_count;
|
|
for (var index = activeCellStartRow; index < row_count; index++) {
|
var cell = this.cellList[index];
|
|
if (cell && cell.x - this.item_width * 0.5 > bot) {
|
activeCellEndRow = index;
|
break;
|
}
|
}
|
|
var max_count = this.numberOfCells();
|
|
for (var _index = 0; _index < row_count; _index++) {
|
if (_index >= activeCellStartRow && _index <= activeCellEndRow) {
|
if (!this.activeCellIdx[_index]) {
|
if (_index <= max_count) {
|
this.updateCellAtIndex(_index);
|
this.activeCellIdx[_index] = true;
|
}
|
}
|
} else {
|
if (_index <= max_count) {
|
this.activeCellIdx[_index] = false;
|
}
|
}
|
}
|
},
|
// 移动到具体位置,暂时不用了
|
updateMove: function updateMove(pos) {// var target_pos = this.checkPosition(pos.x, pos.y);
|
// var move_to = cc.moveTo(0.1, target_pos.x, target_pos.y).easing(cc.easeBackOut());
|
// this.container.runAction(move_to);
|
},
|
// 跳转到指定位置,暂时不用了
|
jumpToMove: function jumpToMove(pos, time, callback) {},
|
// 监测位置,暂时也不用了
|
checkPosition: function checkPosition() {// var _x = this.container.x;
|
// var _y = this.container.y;
|
// if (this.dir == ScrollViewDir.horizontal) {
|
// _x = _x + x;
|
// } else if (this.dir == ScrollViewDir.vertical) {
|
// _y = _y + y;
|
// }
|
// if (_x > 0) {
|
// _x = 0;
|
// } else if (_x < this.size.width - this.container_size.width) {
|
// _x = this.size.width - this.container_size.width;
|
// }
|
// if (_y > 0) {
|
// _y = 0;
|
// } else if (_y < this.size.height - this.container_size.height) {
|
// _y = this.size.height - this.container_size.height;
|
// }
|
// return cc.v2(_x, _y)
|
},
|
// 获取当前容器的坐标,暂时不用
|
getCurContainerPosY: function getCurContainerPosY() {},
|
// 当前容器的坐标 位置
|
getCurContainerPosX: function getCurContainerPosX() {},
|
//设置滚动容器的大小
|
setInnerContainer: function setInnerContainer() {
|
var size = this.numberOfCells();
|
var container_width = this.size.width;
|
var container_height = this.size.height;
|
var num = 0;
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
num = Math.ceil(size / this.row);
|
container_width = num * this.item_width + 2 * this.start_x + (num - 1) * this.space_x;
|
} else {
|
num = Math.ceil(size / this.col);
|
container_height = num * this.item_height + 2 * this.start_y + (num - 1) * this.space_y;
|
}
|
|
container_width = Math.max(container_width, this.size.width);
|
container_height = Math.max(container_height, this.size.height);
|
this.container_size = cc.size(container_width, container_height);
|
|
if (this.scroll_view_con) {
|
this.scroll_view_con.setContentSize(this.container_size);
|
}
|
|
if (this.scroll_view_compend) {
|
this.scroll_view_compend.stopAutoScroll();
|
|
if (this.start_pos == ScrollViewStartPos.top) {
|
this.scroll_view_compend.scrollToTop(0);
|
} else if (this.start_pos == ScrollViewStartPos.bottom) {
|
this.scroll_view_compend.scrollToBottom(0);
|
}
|
}
|
},
|
// 刷新当前显示item数据(不改变任何位置的)
|
resetCurrentItems: function resetCurrentItems() {
|
for (var key in this.activeCellIdx) {
|
if (this.activeCellIdx[key] == true) {
|
this.updateCellAtIndex(key);
|
}
|
}
|
},
|
// 根据index刷新对应的索引,如果在可视范围以内
|
resetItemByIndex: function resetItemByIndex(index) {
|
if (this.activeCellIdx[index] == true) {
|
this.updateCellAtIndex(index);
|
}
|
},
|
// 获取所有活跃的cell对象
|
getActiveCellList: function getActiveCellList() {
|
var list = [];
|
|
for (var key in this.activeCellIdx) {
|
if (this.activeCellIdx[key] == true) {
|
if (this.cellList[key] && this.cellList[key].cell) {
|
list.push(this.cellList[key].cell);
|
}
|
}
|
}
|
|
return list;
|
},
|
// 根据下表获取对应的cell,不管是否活跃
|
getCellByIndex: function getCellByIndex(index) {
|
if (this.cellList[index] && this.cellList[index].cell) {
|
return this.cellList[index].cell;
|
}
|
},
|
// 根据下表获取对应的cell的XY位置,先预留
|
getCellXYByIndex: function getCellXYByIndex(index) {},
|
// 设置数据
|
reloadData: function reloadData(select_index, setting) {
|
if (this.root_wnd == null) {
|
this.select_index = select_index;
|
this.setting = setting;
|
return;
|
}
|
|
if (setting) {
|
this.analysisSetting(setting);
|
}
|
|
this.cellList = [];
|
this.activeCellIdx = {};
|
|
for (var key in this.cacheList) {
|
var _cell = this.cacheList[key];
|
|
_cell.setPosition(-10000, 0);
|
}
|
|
this.setInnerContainer();
|
var number = this.numberOfCells();
|
if (number == 0) return;
|
|
for (var i = 0; i < number; i++) {
|
var cell = null;
|
|
if (i <= this.time_show_index) {
|
cell = this.getCacheCellByIndex(i);
|
}
|
|
var row_count = this.cellList.length;
|
var xy = this.getCellPosition(row_count); //row_cont + 1
|
|
var cellData = {
|
cell: cell,
|
x: xy.x,
|
y: xy.y
|
};
|
this.cellList.push(cellData);
|
}
|
|
if (this.is_first_init) {
|
this.startTimeTicket();
|
} else {
|
//如果时间显示索引小于总数 应该显示继续当前定时器 让下面的能显示出来
|
if (this.time_show_index <= number) {
|
this.startTimeTicket();
|
}
|
}
|
|
if (select_index == null) {
|
var maxRefreshNum = 0;
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
maxRefreshNum = this.cacheMaxSize - this.row;
|
} else {
|
maxRefreshNum = this.cacheMaxSize - this.col;
|
}
|
|
var refreshNum = number < maxRefreshNum ? number : maxRefreshNum;
|
|
for (var _i5 = 0; _i5 < refreshNum; _i5++) {
|
if (_i5 < this.time_show_index) {
|
//i<=
|
this.updateCellAtIndex(_i5);
|
}
|
|
this.activeCellIdx[_i5] = true;
|
}
|
} else {
|
this.selectCellByIndex(select_index);
|
}
|
},
|
// 选中index索引对象(如果列表允许 会排序在开始第一位)
|
selectCellByIndex: function selectCellByIndex(index) {
|
var maxRefreshNum = 0;
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
maxRefreshNum = this.cacheMaxSize - this.row;
|
} else {
|
maxRefreshNum = this.cacheMaxSize - this.col;
|
}
|
|
var number = this.numberOfCells();
|
|
if (number < maxRefreshNum) {
|
// 不够现实一屏幕
|
for (var i = 0; i < number; i++) {
|
if (i < this.time_show_index) {
|
//i<=
|
this.updateCellAtIndex(i);
|
}
|
|
this.activeCellIdx[i] = true;
|
}
|
} else {
|
if (this.dir == ScrollViewDir.horizontal) {
|
var container_x = 0;
|
|
if (index == 0) {
|
container_x = 0;
|
} else {
|
container_x = -(this.cellList[index].x - (this.item_width + this.space_x) * 0.5);
|
} // 容器X方向最大位置
|
|
|
var max_contariner_x = -(this.container_size.width - this.size.width);
|
|
if (container_x < max_contariner_x) {
|
container_x = max_contariner_x;
|
}
|
|
var show_index = Math.floor(Math.abs(container_x) / this.item_width); //+1
|
|
if (this.time_show_index < show_index) {
|
this.time_show_index = show_index;
|
}
|
|
this.container.x = container_x;
|
this.checkOverShowByHorizontal();
|
} else {
|
var container_y = 0;
|
|
if (index == 0) {
|
container_y = this.start_y + this.cellList[index].y + this.item_height * 0.5 - this.size.height;
|
} else {
|
container_y = this.cellList[index].y + (this.item_height + this.space_y) * 0.5 - this.size.height;
|
}
|
|
if (container_y < 0) {
|
container_y = 0;
|
}
|
|
var index_1 = Math.floor((this.container_size.height - (container_y + this.size.height)) / this.item_height) + 1;
|
var show_index = (index_1 - 1) * this.col; //+1
|
|
if (this.time_show_index < show_index) {
|
this.time_show_index = show_index;
|
}
|
|
this.container.y = -container_y;
|
this.checkOverShowByVertical();
|
}
|
}
|
|
if (index >= 0 && index < this.numberOfCells()) {
|
//index>0 and index <=
|
var cell = this.getCacheCellByIndex(index);
|
cell.index = index;
|
this.cellList[index].cell = cell;
|
this.onCellTouched(cell, index);
|
}
|
},
|
// 定时器创建
|
startTimeTicket: function startTimeTicket() {
|
if (this.time_tichet == null) {
|
if (this.cellList.length == 0) return; // 到时间现实索引
|
|
var once_num = this.once_num || 1;
|
|
var _callback = function () {
|
if (this.container == null) return;
|
var count = this.time_show_index + once_num;
|
var index = this.time_show_index; // if(index == 0){
|
// index = 1;
|
// }
|
|
var size = this.cellList.length;
|
this.time_show_index = this.time_show_index + once_num;
|
|
for (var i = index; i < count; i++) {
|
if (i > size) break;
|
var cellData = this.cellList[i];
|
|
if (cellData && cellData.cell == null) {
|
cellData.cell = this.getCacheCellByIndex(i);
|
}
|
|
if (this.activeCellIdx[i]) {
|
this.updateCellAtIndex(i);
|
}
|
}
|
|
if (this.time_show_index >= size) {
|
this.clearTimeTicket();
|
this.is_first_init = false;
|
}
|
}.bind(this);
|
|
this.time_tichet = gcore.Timer.set(function () {
|
_callback();
|
}.bind(this), this.delay / 60, -1);
|
}
|
},
|
// 清除掉定时器
|
clearTimeTicket: function clearTimeTicket() {
|
if (this.time_tichet) {
|
gcore.Timer.del(this.time_tichet);
|
this.time_tichet = null;
|
}
|
},
|
// 获取index的对应位置
|
getCellPosition: function getCellPosition(index) {
|
var ap_x = 0.5;
|
var ap_y = 0.5;
|
var _x = 0;
|
var _y = 0;
|
|
if (this.dir == ScrollViewDir.horizontal) {
|
_x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * Math.floor(index / this.row);
|
_y = this.container_size.height - (this.start_y + this.item_height * ap_y + index % this.row * (this.item_height + this.space_y));
|
} else {
|
if (this.start_pos == ScrollViewStartPos.top) {
|
_x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * (index % this.col);
|
_y = this.container_size.height - (this.start_y + this.item_height * ap_y + Math.floor(index / this.col) * (this.item_height + this.space_y));
|
} else {
|
_x = this.start_x + this.item_width * ap_x + (this.item_width + this.space_x) * (index % this.col);
|
_y = this.start_y + this.item_height * ap_y + Math.floor(index / this.col) * (this.item_height + this.space_y);
|
}
|
}
|
|
return {
|
x: _x,
|
y: _y
|
};
|
},
|
// 获取格子下表对应的缓存itemcell
|
getCacheCellByIndex: function getCacheCellByIndex(index) {
|
var cacheIndex = index % this.cacheMaxSize;
|
|
if (this.cacheList[cacheIndex] == null) {
|
var newCell = this.createNewCell();
|
|
if (newCell) {
|
// newCell.setAnchorPoint(0.5, 0.5;)
|
newCell.setPosition(-10000, 0);
|
this.cacheList[cacheIndex] = newCell;
|
newCell.setParent(this.container);
|
}
|
|
return newCell;
|
} else {
|
return this.cacheList[cacheIndex];
|
}
|
},
|
// 更新格子,并标记活跃
|
updateCellAtIndex: function updateCellAtIndex(index) {
|
if (index > this.time_show_index) return;
|
if (this.cellList[index] == null) return;
|
var cellData = this.cellList[index];
|
|
if (cellData.cell == null) {
|
cellData.cell = this.getCacheCellByIndex(index);
|
}
|
|
cellData.cell.setPosition(cellData.x, cellData.y);
|
this.updateCellByIndex(cellData.cell, index);
|
},
|
//
|
getMaxSize: function getMaxSize() {
|
return this.container_size;
|
},
|
getContainer: function getContainer() {
|
return this.container;
|
},
|
deleteMe: function deleteMe() {
|
this.DeleteMe();
|
},
|
setVisible: function setVisible(bool) {
|
if (this.root_wnd && bool != null) {
|
this.root_wnd.active = bool;
|
}
|
},
|
DeleteMe: function DeleteMe() {
|
this.clearTimeTicket();
|
|
for (var key in this.cacheList) {
|
var item = this.cacheList[key];
|
|
if (item && item.deleteMe) {
|
item.deleteMe();
|
}
|
|
item = null;
|
}
|
|
this.cellList = null;
|
this.cacheList = null;
|
this.activeCellIdx = null;
|
this.root_wnd.destroy();
|
this.root_wnd = null;
|
LoaderManager.getInstance().releasePrefab(this.prefabPath);
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxjb21tb25fc2Nyb2xsdmlld19zaW5nbGUuanMiXSwibmFtZXMiOlsiQ29tbW9uU2Nyb2xsVmlld1NpbmdsZSIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiaW5pdENvbmZpZyIsInBhcmVudCIsInByZWZhYlBhdGgiLCJQYXRoVG9vbCIsImdldFByZWZhYlBhdGgiLCJwb3MiLCJ2MiIsImRpciIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsInN0YXJ0X3BvcyIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsInNpemUiLCJhcCIsImNlbGxMaXN0IiwiY2FjaGVMaXN0IiwiYWN0aXZlQ2VsbElkeCIsInNlbGVjdENlbGxJbmRleCIsImhhbmRsZXIiLCJ0aW1lX3Nob3dfaW5kZXgiLCJpc19maXJzdF9pbml0IiwiY2FjaGVNYXhTaXplIiwiY3JlYXRlU2Nyb2xsIiwic2V0dGluZyIsImFuYWx5c2lzU2V0dGluZyIsIkxvYWRlck1hbmFnZXIiLCJnZXRJbnN0YW5jZSIsImxvYWRSZXMiLCJyZXNfb2JqZWN0Iiwic2Nyb2xsIiwiY3JlYXRlUm9vdFduZCIsImJpbmQiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0Iiwicm93IiwiY29sIiwiZGVsYXkiLCJvbmNlX251bSIsIm5lZWRfZHluYW1pYyIsImhvcml6b250YWwiLCJjYWxjdWxhdGlvbk1heFN1bSIsIm1heF9zdW0iLCJNYXRoIiwiY2VpbCIsIndpZHRoIiwiaGVpZ2h0Iiwicm9vdF93bmQiLCJzY3JvbGxfdmlldyIsImdldENoaWxkQnlOYW1lIiwic2Nyb2xsX3ZpZXdfbWFzayIsInNjcm9sbF92aWV3X2NvbiIsInNldENvbnRlbnRTaXplIiwic2V0QW5jaG9yUG9pbnQiLCJ4IiwieSIsInNldFBvc2l0aW9uIiwic2Nyb2xsX3ZpZXdfY29tcGVuZCIsImdldENvbXBvbmVudCIsIlNjcm9sbFZpZXciLCJjb250YWluZXIiLCJhZGRDaGlsZCIsInNldElubmVyQ29udGFpbmVyIiwicmVnaXN0ZXJFdmVudCIsInJlbG9hZERhdGEiLCJzZWxlY3RfaW5kZXgiLCJub2RlIiwib24iLCJjaGVja1JlY3RJbnRlcnNlY3RzUmVjdCIsImFkZFNjcm9sbFRvQm90dG9tQ2FsbEJhY2siLCJjYWxsYmFjayIsInNjcm9sbFRvQm90dG9tX2NhbGxiYWNrIiwicmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlIiwiZnVuYyIsImhhbmRsZXJJZCIsIm51bWJlck9mQ2VsbHMiLCJTY3JvbGxWaWV3RnVuY1R5cGUiLCJOdW1iZXJPZkNlbGxzIiwidXBkYXRlQ2VsbEJ5SW5kZXgiLCJjZWxsIiwiaW5kZXgiLCJVcGRhdGVDZWxsQnlJbmRleCIsImNyZWF0ZU5ld0NlbGwiLCJDcmVhdGVOZXdDZWxsIiwib25DZWxsVG91Y2hlZCIsIk9uQ2VsbFRvdWNoZWQiLCJzZXRDbGlja0VuYWJsZWQiLCJzdGF0dXMiLCJzZXRTd2FsbG93VG91Y2hlcyIsImNoZWNrT3ZlclNob3dCeVZlcnRpY2FsIiwiY2hlY2tPdmVyU2hvd0J5SG9yaXpvbnRhbCIsInN1bSIsImxlbmd0aCIsImNvbnRhaW5lcl95IiwiYm90IiwiY29sX2NvdW50IiwiYWN0aXZlQ2VsbFN0YXJ0Um93IiwiaSIsImFjdGl2ZUNlbGxFbmRSb3ciLCJtYXhfY291bnQiLCJtIiwidXBkYXRlQ2VsbEF0SW5kZXgiLCJjaGVja092ZXJTaG93QnlWZXJ0aWNhbEJvdHRvbSIsInJvd19jb3VudCIsImNvbnRhaW5lcl94IiwidXBkYXRlTW92ZSIsImp1bXBUb01vdmUiLCJ0aW1lIiwiY2hlY2tQb3NpdGlvbiIsImdldEN1ckNvbnRhaW5lclBvc1kiLCJnZXRDdXJDb250YWluZXJQb3NYIiwiY29udGFpbmVyX3dpZHRoIiwiY29udGFpbmVyX2hlaWdodCIsIm51bSIsIm1heCIsImNvbnRhaW5lcl9zaXplIiwic3RvcEF1dG9TY3JvbGwiLCJzY3JvbGxUb1RvcCIsImJvdHRvbSIsInNjcm9sbFRvQm90dG9tIiwicmVzZXRDdXJyZW50SXRlbXMiLCJrZXkiLCJyZXNldEl0ZW1CeUluZGV4IiwiZ2V0QWN0aXZlQ2VsbExpc3QiLCJsaXN0IiwicHVzaCIsImdldENlbGxCeUluZGV4IiwiZ2V0Q2VsbFhZQnlJbmRleCIsIm51bWJlciIsImdldENhY2hlQ2VsbEJ5SW5kZXgiLCJ4eSIsImdldENlbGxQb3NpdGlvbiIsImNlbGxEYXRhIiwic3RhcnRUaW1lVGlja2V0IiwibWF4UmVmcmVzaE51bSIsInJlZnJlc2hOdW0iLCJzZWxlY3RDZWxsQnlJbmRleCIsIm1heF9jb250YXJpbmVyX3giLCJzaG93X2luZGV4IiwiZmxvb3IiLCJhYnMiLCJpbmRleF8xIiwidGltZV90aWNoZXQiLCJfY2FsbGJhY2siLCJjb3VudCIsImNsZWFyVGltZVRpY2tldCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJkZWwiLCJhcF94IiwiYXBfeSIsIl94IiwiX3kiLCJjYWNoZUluZGV4IiwibmV3Q2VsbCIsInNldFBhcmVudCIsImdldE1heFNpemUiLCJnZXRDb250YWluZXIiLCJkZWxldGVNZSIsIkRlbGV0ZU1lIiwic2V0VmlzaWJsZSIsImJvb2wiLCJhY3RpdmUiLCJpdGVtIiwiZGVzdHJveSIsInJlbGVhc2VQcmVmYWIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsSUFBSUEsc0JBQXNCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ2xDLGFBQVNDLFNBRHlCO0FBRWxDQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDZCxTQUFLQyxVQUFMO0FBQ0gsR0FKaUM7QUFNbENBLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLFVBQUwsR0FBa0JDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixRQUF2QixFQUFpQyxvQkFBakMsQ0FBbEI7QUFDQSxTQUFL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QUEsUUFBUSxFQUFFLG9CQUFZO0FBQ2xCLFNBQUtmLGVBQUw7O0FBQ0EsU0FBSyxJQUFJeEIsR0FBVCxJQUFnQixLQUFLN0csU0FBckIsRUFBZ0M7QUFDNUIsVUFBSXdKLElBQUksR0FBRyxLQUFLeEosU0FBTCxDQUFlNkcsR0FBZixDQUFYOztBQUNBLFVBQUkyQyxJQUFJLElBQUlBLElBQUksQ0FBQ0wsUUFBakIsRUFBMkI7QUFDdkJLLFFBQUFBLElBQUksQ0FBQ0wsUUFBTDtBQUNIOztBQUNESyxNQUFBQSxJQUFJLEdBQUcsSUFBUDtBQUNIOztBQUNELFNBQUt6SixRQUFMLEdBQWdCLElBQWhCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsSUFBckI7QUFFQSxTQUFLa0MsUUFBTCxDQUFjc0gsT0FBZDtBQUNBLFNBQUt0SCxRQUFMLEdBQWdCLElBQWhCO0FBQ0F6QixJQUFBQSxhQUFhLENBQUNDLFdBQWQsR0FBNEIrSSxhQUE1QixDQUEwQyxLQUFLeEssVUFBL0M7QUFDSDtBQTlzQmlDLENBQVQsQ0FBN0IiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOaWsOeJiOacrOaXoOmZkOW+queOr+WIl+ihqOWuueWZqCwgY2VsbGl0ZW0g6ZyA6KaB57un5om/YmFzZXBhbmVsXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgQ29tbW9uU2Nyb2xsVmlld1NpbmdsZSA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ2xhc3MsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmluaXRDb25maWcoKVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImNvbW1vblwiLCBcImNvbW1vbl9zY3JvbGxfdmlld1wiKTtcbiAgICAgICAgdGhpcy5wb3MgPSBjYy52MigwLCAwKTtcbiAgICAgICAgdGhpcy5kaXIgPSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsO1xuICAgICAgICB0aGlzLnN0YXJ0X3BvcyA9IFNjcm9sbFZpZXdTdGFydFBvcy50b3A7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGNjLnNpemUoMTAwLCAxMDApO1xuICAgICAgICB0aGlzLmFwID0gY2MudjIoMCwgMCk7XG5cbiAgICAgICAgLy/lrZjmlL7miYDmnInmoLzlrZDnu5PmnoTkvZNcbiAgICAgICAgdGhpcy5jZWxsTGlzdCA9IFtdO1xuICAgICAgICAvL+e8k+WtmENlbGzmiYDnlKjliLDnmoTlr7nosaFcbiAgICAgICAgdGhpcy5jYWNoZUxpc3QgPSB7fTtcbiAgICAgICAgLy/orrDlvZXmtLvot4PlvpfmoLzlrZBJRFxuICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHggPSB7fTtcbiAgICAgICAgLy/lvZPliY3pgInmi6nnianlk4HnmoTntKLlvJVcbiAgICAgICAgdGhpcy5zZWxlY3RDZWxsSW5kZXggPSAxO1xuICAgICAgICAvL+Wbnuiwg+aWueazlVxuICAgICAgICB0aGlzLmhhbmRsZXIgPSB7fTtcbiAgICAgICAgLy/liLDml7bpl7TmmL7npLrnmoTntKLlvJVcbiAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSAwO1xuICAgICAgICAvL+aYr+WQpuWIneWni+WMllxuICAgICAgICB0aGlzLmlzX2ZpcnN0X2luaXQgPSB0cnVlO1xuICAgICAgICAvL+acgOWkp+adoeebrlxuICAgICAgICB0aGlzLmNhY2hlTWF4U2l6ZSA9IDE7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWIm+W7ulxuICAgICAqIEBwYXJhbSB7Kn0gcGFyZW50IOaJgOWcqOeItuiKgueCuVxuICAgICAqIEBwYXJhbSB7Kn0gcG9zIOa7keWKqOe7hOS7tuS9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gZGlyIOa7keWKqOWvuem9kOaWueW8j1xuICAgICAqIEBwYXJhbSB7Kn0gc3RhcnRfcG9zIOa7keWKqOWIl+ihqOW8gOWni+S9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gc2l6ZSDmu5HliqjmoYblpKflsI9cbiAgICAgKiBAcGFyYW0geyp9IHNldHRpbmcg6K6+572u5L+h5oGvXG4gICAgICogQHBhcmFtIHsqfSBhcCDplJrngrlcbiAgICAgKi9cbiAgICBjcmVhdGVTY3JvbGw6IGZ1bmN0aW9uIChwYXJlbnQsIHBvcywgZGlyLCBzdGFydF9wb3MsIHNpemUsIHNldHRpbmcsIGFwKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLnBvcyA9IHBvcyB8fCBjYy52MigwLCAwKTtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXIgfHwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5zdGFydF9wb3MgPSBzdGFydF9wb3MgfHwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCBjYy5zaXplKDEwMCwgMTAwKTtcbiAgICAgICAgdGhpcy5hcCA9IGFwIHx8IGNjLnYyKDAsIDApO1xuXG4gICAgICAgIHRoaXMuYW5hbHlzaXNTZXR0aW5nKHNldHRpbmcpO1xuXG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHRoaXMucHJlZmFiUGF0aCwgKGZ1bmN0aW9uIChyZXNfb2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsID0gcmVzX29iamVjdDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUm9vdFduZChzY3JvbGwpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICAvL+ino+aekOaVsOaNrlxuICAgIGFuYWx5c2lzU2V0dGluZzogZnVuY3Rpb24gKHNldHRpbmcpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZyB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGFydF94ID0gdGhpcy5zZXR0aW5nLnN0YXJ0X3ggfHwgMCAgICAgICAgICAgICAgICAgICAgICAgIC8v56ys5LiA5Liq5Y2V5YWD55qE6LW354K5WFxuICAgICAgICB0aGlzLnNwYWNlX3ggPSB0aGlzLnNldHRpbmcuc3BhY2VfeCB8fCAwICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qiq5ZCR6Ze06ZqU56m66Ze0XG4gICAgICAgIHRoaXMuc3RhcnRfeSA9IHRoaXMuc2V0dGluZy5zdGFydF95IHx8IDAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoTotbfngrlZXG4gICAgICAgIHRoaXMuc3BhY2VfeSA9IHRoaXMuc2V0dGluZy5zcGFjZV95IHx8IDAgICAgICAgICAgICAgICAgICAgICAgICAvLyDnq5blkJHpl7TpmpTnqbrpl7RcbiAgICAgICAgdGhpcy5pdGVtX3dpZHRoID0gdGhpcy5zZXR0aW5nLml0ZW1fd2lkdGggfHwgMTE1ICAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWuveW6plxuICAgICAgICB0aGlzLml0ZW1faGVpZ2h0ID0gdGhpcy5zZXR0aW5nLml0ZW1faGVpZ2h0IHx8IDExNSAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE6auY5bqmXG4gICAgICAgIHRoaXMucm93ID0gdGhpcy5zZXR0aW5nLnJvdyB8fCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDooYzmlbAs5L2c55So5LqO5rC05bmz5pa55ZCR55qE5rua5YqoXG4gICAgICAgIHRoaXMuY29sID0gdGhpcy5zZXR0aW5nLmNvbCB8fCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJfmlbAs5L2c55So5LqO5Z6C55u05pa55ZCR55qE5rua5YqoXG4gICAgICAgIHRoaXMuZGVsYXkgPSB0aGlzLnNldHRpbmcuZGVsYXkgfHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliJvlu7rlu7bov5/ml7bpl7RcbiAgICAgICAgdGhpcy5vbmNlX251bSA9IHRoaXMuc2V0dGluZy5vbmNlX251bSB8fCAxICAgICAgICAgICAgICAgICAgICAgIC8vIOavj+asoeWIm+W7uueahOaVsOmHj1xuICAgICAgICB0aGlzLm5lZWRfZHluYW1pYyA9IHRoaXMuc2V0dGluZy5uZWVkX2R5bmFtaWMgfHwgdHJ1ZSAgICAgICAgICAvLyDmmK/lkKbpnIDopoHliqjmgIHliJvlu7rnmoQgXG4gICAgICAgIC8v5qiq5ZCR55qE5Y+q5pSv5oyB5LiA6KGM55qELi5cbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFNjcm9sbFZpZXdEaXIuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdGhpcy5yb3cgPSAxXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdWxhdGlvbk1heFN1bSgpO1xuICAgIH0sXG5cbiAgICAvL+iuoeeul+S4gOS4i+S4gOWxj+acgOWkmuWIm+W7uueahOS4quaVsFxuICAgIGNhbGN1bGF0aW9uTWF4U3VtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhfc3VtO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBtYXhfc3VtID0gKE1hdGguY2VpbCh0aGlzLnNpemUud2lkdGggLyAodGhpcy5pdGVtX3dpZHRoICsgdGhpcy5zcGFjZV94KSkgKyAxKSAqIHRoaXMucm93O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF4X3N1bSA9IChNYXRoLmNlaWwodGhpcy5zaXplLmhlaWdodCAvICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSkgKyAxKSAqIHRoaXMuY29sO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVNYXhTaXplID0gbWF4X3N1bTtcbiAgICB9LFxuXG4gICAgLy8g5Yid5aeL5YyW5Yib5bu65a+56LGhXG4gICAgY3JlYXRlUm9vdFduZDogZnVuY3Rpb24gKHNjcm9sbCkge1xuICAgICAgICB0aGlzLnJvb3Rfd25kID0gc2Nyb2xsO1xuICAgICAgICB0aGlzLnNjcm9sbF92aWV3ID0gc2Nyb2xsLmdldENoaWxkQnlOYW1lKFwiU2Nyb2xsVmlld1wiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxfdmlld19tYXNrID0gdGhpcy5zY3JvbGxfdmlldy5nZXRDaGlsZEJ5TmFtZShcInZpZXdcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfY29uID0gdGhpcy5zY3JvbGxfdmlld19tYXNrLmdldENoaWxkQnlOYW1lKFwiY29udGVudFwiKTtcblxuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucm9vdF93bmQuc2V0QW5jaG9yUG9pbnQodGhpcy5hcC54LCB0aGlzLmFwLnkpO1xuICAgICAgICB0aGlzLnJvb3Rfd25kLnNldFBvc2l0aW9uKHRoaXMucG9zKTtcblxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3LnNldENvbnRlbnRTaXplKHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMuc2Nyb2xsX3ZpZXdfbWFzay5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2Nvbi5zZXRDb250ZW50U2l6ZSh0aGlzLnNpemUpO1xuXG4gICAgICAgIC8vIOa7muWKqOe7hOW7ulxuICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQgPSB0aGlzLnNjcm9sbF92aWV3LmdldENvbXBvbmVudChjYy5TY3JvbGxWaWV3KVxuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnZlcnRpY2FsID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLmhvcml6b250YWwgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuc2Nyb2xsX3ZpZXdfY29uO1xuXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkQ2hpbGQoc2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDnm5HlkKzkuovku7ZcbiAgICAgICAgdGhpcy5zZXRJbm5lckNvbnRhaW5lcigpXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgpO1xuXG4gICAgICAgIC8vIGlmICh0aGlzLnNlbGVjdF9pbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5zZWxlY3RfaW5kZXgsIHRoaXMuc2V0dGluZylcbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICAvLyDmu5rliqjorr7nva5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRfZHluYW1pYyA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2NvbXBlbmQubm9kZS5vbignc2Nyb2xsaW5nJywgdGhpcy5jaGVja1JlY3RJbnRlcnNlY3RzUmVjdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZC5ub2RlLm9uKCdib3VuY2UtYm90dG9tJywgdGhpcy5zY3JvbGxUb0JvdHRvbV9jYWxsYmFjaywgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rua5Yqo5Yiw5bqV6YOo55qE5pe25YCZ5Zue6LCDXG4gICAgYWRkU2Nyb2xsVG9Cb3R0b21DYWxsQmFjazogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5LqL5Lu2XG4gICAgcmVnaXN0ZXJTY3JpcHRIYW5kbGVyU2luZ2xlOiBmdW5jdGlvbiAoZnVuYywgaGFuZGxlcklkKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcltoYW5kbGVySWRdID0gZnVuYztcbiAgICB9LFxuXG4gICAgLy/ojrflj5ZjZWxs5pWw6YePXG4gICAgbnVtYmVyT2ZDZWxsczogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5OdW1iZXJPZkNlbGxzXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcltTY3JvbGxWaWV3RnVuY1R5cGUuTnVtYmVyT2ZDZWxsc10oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliLfmlrDmr4/kuIDkuKpjZWxsXG4gICAgdXBkYXRlQ2VsbEJ5SW5kZXg6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5VcGRhdGVDZWxsQnlJbmRleF0pIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcltTY3JvbGxWaWV3RnVuY1R5cGUuVXBkYXRlQ2VsbEJ5SW5kZXhdKGNlbGwsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDliJvlu7rkuIDkuKrmmL7npLrlr7nosaFcbiAgICBjcmVhdGVOZXdDZWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJbU2Nyb2xsVmlld0Z1bmNUeXBlLkNyZWF0ZU5ld0NlbGxdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5DcmVhdGVOZXdDZWxsXSh0aGlzLml0ZW1fd2lkdGgsIHRoaXMuaXRlbV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOeCueWHu+WNleS4qlxuICAgIG9uQ2VsbFRvdWNoZWQ6IGZ1bmN0aW9uIChjZWxsLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5PbkNlbGxUb3VjaGVkXSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyW1Njcm9sbFZpZXdGdW5jVHlwZS5PbkNlbGxUb3VjaGVkXShjZWxsLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6K6+572u5piv5ZCm5Y+v54K55Ye7XG4gICAgc2V0Q2xpY2tFbmFibGVkOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG5cbiAgICB9LFxuXG4gICAgLy8g6K6+572u5piv5ZCm5ZCe5Zms54K55Ye7XG4gICAgc2V0U3dhbGxvd1RvdWNoZXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcblxuICAgIH0sXG5cbiAgICAvLyDnp7vliqjov4fnqIvkuK3mmK/lkKbkuI3lho3lj6/mmK/ojIPlm7Qs5LiN5YaN55qE5pe25YCZ56e76ZmkLOaUvuWIsOWvueixoeaxoCzlh4blpIfkuIvkuIDmrKHliJvlu7pcbiAgICBjaGVja1JlY3RJbnRlcnNlY3RzUmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJTaG93QnlWZXJ0aWNhbCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrT3ZlclNob3dCeUhvcml6b250YWwoKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOerluebtOaWueWQkeeahOebkea1i+WIpOaWrVxuICAgIGNoZWNrT3ZlclNob3dCeVZlcnRpY2FsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN1bSA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29udGFpbmVyX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICB2YXIgYm90ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5zaXplLmhlaWdodCArIGJvdDtcbiAgICAgICAgdmFyIGNvbF9jb3VudCA9IE1hdGguY2VpbChzdW0gLyB0aGlzLmNvbCk7XG4gICAgICAgIC8vIOa0u+i3g2NlbGzlvIDlp4vooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxTdGFydFJvdyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbDtcbiAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5jZWxsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBhY3RpdmVDZWxsU3RhcnRSb3cgPSBpO1xuICAgICAgICAgICAgaWYgKGNlbGwgJiYgKGNlbGwueSAtIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgPD0gdG9wKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOa0u+i3g2NlbGznu5PmnZ/ooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxFbmRSb3cgPSBjb2xfY291bnQ7XG4gICAgICAgIGlmIChib3QgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlQ2VsbFN0YXJ0Um93OyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBpICogdGhpcy5jb2w7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC55ICsgdGhpcy5pdGVtX2hlaWdodCAqIDAuNSA8IGJvdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ2VsbEVuZFJvdyA9IGktMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOmHjeWkjeS9v+eUqFxuICAgICAgICB2YXIgbWF4X2NvdW50ID0gdGhpcy5udW1iZXJPZkNlbGxzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID49IGFjdGl2ZUNlbGxTdGFydFJvdyAmJiBpIDw9IGFjdGl2ZUNlbGxFbmRSb3cpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IHRoaXMuY29sOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sICsgbTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8PSBtYXhfY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCB0aGlzLmNvbDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbCArIG07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8PSBtYXhfY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOerluebtOaWueWQkeeahOebkea1i+WIpOaWrVxuICAgIGNoZWNrT3ZlclNob3dCeVZlcnRpY2FsQm90dG9tOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN1bSA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPT0gMCkgcmV0dXJuO1xuICAgICAgICB2YXIgY29udGFpbmVyX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICB2YXIgYm90ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5zaXplLmhlaWdodCArIGJvdDtcbiAgICAgICAgdmFyIGNvbF9jb3VudCA9IE1hdGguY2VpbChzdW0gLyB0aGlzLmNvbCk7XG4gICAgICAgIC8vIOa0u+i3g2NlbGzlvIDlp4vooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxTdGFydFJvdyA9IGNvbF9jb3VudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbF9jb3VudC0xOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sO1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGFjdGl2ZUNlbGxTdGFydFJvdyA9IGk7XG4gICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC55IC0gdGhpcy5pdGVtX2hlaWdodCAqIDAuNSA8PSB0b3ApKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5rS76LeDY2VsbOe7k+adn+ihjOaVsFxuICAgICAgICB2YXIgYWN0aXZlQ2VsbEVuZFJvdyA9IDA7XG4gICAgICAgIGlmIChib3QgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlQ2VsbFN0YXJ0Um93LTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaSAqIHRoaXMuY29sO1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5jZWxsTGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNlbGwgJiYgKGNlbGwueSArIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgPCBib3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNlbGxFbmRSb3cgPSBpKzE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDph43lpI3kvb/nlKhcbiAgICAgICAgdmFyIG1heF9jb3VudCA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA8PSBhY3RpdmVDZWxsU3RhcnRSb3cgJiYgaSA+PSBhY3RpdmVDZWxsRW5kUm93KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCB0aGlzLmNvbDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGkgKiB0aGlzLmNvbCArIG07XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgdGhpcy5jb2w7IG0rKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBpICogdGhpcy5jb2wgKyBtO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4X2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgXG5cbiAgICAvLyDmsLTlubPmlrnlkJHnmoTnm5HmtYtcbiAgICBjaGVja092ZXJTaG93QnlIb3Jpem9udGFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHJvd19jb3VudCA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuICAgICAgICBpZiAocm93X2NvdW50ID09IDApIHJldHVybjtcbiAgICAgICAgdmFyIGNvbnRhaW5lcl94ID0gdGhpcy5jb250YWluZXIueDtcbiAgICAgICAgdmFyIHRvcCA9IC1jb250YWluZXJfeDtcbiAgICAgICAgdmFyIGJvdCA9IHRvcCArIHRoaXMuc2l6ZS53aWR0aDtcbiAgICAgICAgLy8g5rS76LeDY2VsbOW8gOWni+WIl+aVsFxuICAgICAgICB2YXIgYWN0aXZlQ2VsbFN0YXJ0Um93ID0gMDtcbiAgICAgICAgaWYgKHRvcCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93X2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbExpc3RbaV07XG4gICAgICAgICAgICAgICAgYWN0aXZlQ2VsbFN0YXJ0Um93ID0gaTtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbCAmJiAoY2VsbC54ICsgdGhpcy5pdGVtX3dpZHRoICogMC41KSA+PSB0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOa0u+i3g2NlbGznu5PmnZ/ooYzmlbBcbiAgICAgICAgdmFyIGFjdGl2ZUNlbGxFbmRSb3cgPSByb3dfY291bnQ7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWN0aXZlQ2VsbFN0YXJ0Um93OyBpbmRleCA8IHJvd19jb3VudDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChjZWxsICYmIChjZWxsLnggLSB0aGlzLml0ZW1fd2lkdGggKiAwLjUgPiBib3QpKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ2VsbEVuZFJvdyA9IGluZGV4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1heF9jb3VudCA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93X2NvdW50OyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gYWN0aXZlQ2VsbFN0YXJ0Um93ICYmIGluZGV4IDw9IGFjdGl2ZUNlbGxFbmRSb3cpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2VsbElkeFtpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG1heF9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDw9IG1heF9jb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNlbGxJZHhbaW5kZXhdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOenu+WKqOWIsOWFt+S9k+S9jee9rizmmoLml7bkuI3nlKjkuoZcbiAgICB1cGRhdGVNb3ZlOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIC8vIHZhciB0YXJnZXRfcG9zID0gdGhpcy5jaGVja1Bvc2l0aW9uKHBvcy54LCBwb3MueSk7XG4gICAgICAgIC8vIHZhciBtb3ZlX3RvID0gY2MubW92ZVRvKDAuMSwgdGFyZ2V0X3Bvcy54LCB0YXJnZXRfcG9zLnkpLmVhc2luZyhjYy5lYXNlQmFja091dCgpKTtcbiAgICAgICAgLy8gdGhpcy5jb250YWluZXIucnVuQWN0aW9uKG1vdmVfdG8pO1xuICAgIH0sXG5cbiAgICAvLyDot7PovazliLDmjIflrprkvY3nva4s5pqC5pe25LiN55So5LqGXG4gICAganVtcFRvTW92ZTogZnVuY3Rpb24gKHBvcywgdGltZSwgY2FsbGJhY2spIHtcblxuICAgIH0sXG5cbiAgICAvLyDnm5HmtYvkvY3nva4s5pqC5pe25Lmf5LiN55So5LqGXG4gICAgY2hlY2tQb3NpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB2YXIgX3ggPSB0aGlzLmNvbnRhaW5lci54O1xuICAgICAgICAvLyB2YXIgX3kgPSB0aGlzLmNvbnRhaW5lci55O1xuICAgICAgICAvLyBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgIC8vICAgICBfeCA9IF94ICsgeDtcbiAgICAgICAgLy8gfSBlbHNlIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsKSB7XG4gICAgICAgIC8vICAgICBfeSA9IF95ICsgeTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAoX3ggPiAwKSB7XG4gICAgICAgIC8vICAgICBfeCA9IDA7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoX3ggPCB0aGlzLnNpemUud2lkdGggLSB0aGlzLmNvbnRhaW5lcl9zaXplLndpZHRoKSB7XG4gICAgICAgIC8vICAgICBfeCA9IHRoaXMuc2l6ZS53aWR0aCAtIHRoaXMuY29udGFpbmVyX3NpemUud2lkdGg7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKF95ID4gMCkge1xuICAgICAgICAvLyAgICAgX3kgPSAwO1xuICAgICAgICAvLyB9IGVsc2UgaWYgKF95IDwgdGhpcy5zaXplLmhlaWdodCAtIHRoaXMuY29udGFpbmVyX3NpemUuaGVpZ2h0KSB7XG4gICAgICAgIC8vICAgICBfeSA9IHRoaXMuc2l6ZS5oZWlnaHQgLSB0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZXR1cm4gY2MudjIoX3gsIF95KVxuICAgIH0sXG5cbiAgICAvLyDojrflj5blvZPliY3lrrnlmajnmoTlnZDmoIcs5pqC5pe25LiN55SoXG4gICAgZ2V0Q3VyQ29udGFpbmVyUG9zWTogZnVuY3Rpb24gKCkge1xuXG4gICAgfSxcblxuICAgIC8vIOW9k+WJjeWuueWZqOeahOWdkOaghyDkvY3nva5cbiAgICBnZXRDdXJDb250YWluZXJQb3NYOiBmdW5jdGlvbiAoKSB7XG5cbiAgICB9LFxuXG4gICAgLy/orr7nva7mu5rliqjlrrnlmajnmoTlpKflsI9cbiAgICBzZXRJbm5lckNvbnRhaW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IHRoaXMubnVtYmVyT2ZDZWxscygpO1xuICAgICAgICB2YXIgY29udGFpbmVyX3dpZHRoID0gdGhpcy5zaXplLndpZHRoO1xuICAgICAgICB2YXIgY29udGFpbmVyX2hlaWdodCA9IHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHZhciBudW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMucm93KTtcbiAgICAgICAgICAgIGNvbnRhaW5lcl93aWR0aCA9IG51bSAqIHRoaXMuaXRlbV93aWR0aCArIDIgKiB0aGlzLnN0YXJ0X3ggKyAobnVtIC0gMSkgKiB0aGlzLnNwYWNlX3g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW0gPSBNYXRoLmNlaWwoc2l6ZSAvIHRoaXMuY29sKTtcbiAgICAgICAgICAgIGNvbnRhaW5lcl9oZWlnaHQgPSBudW0gKiB0aGlzLml0ZW1faGVpZ2h0ICsgMiAqIHRoaXMuc3RhcnRfeSArIChudW0gLSAxKSAqIHRoaXMuc3BhY2VfeTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluZXJfd2lkdGggPSBNYXRoLm1heChjb250YWluZXJfd2lkdGgsIHRoaXMuc2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnRhaW5lcl9oZWlnaHQgPSBNYXRoLm1heChjb250YWluZXJfaGVpZ2h0LCB0aGlzLnNpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5jb250YWluZXJfc2l6ZSA9IGNjLnNpemUoY29udGFpbmVyX3dpZHRoLCBjb250YWluZXJfaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29uKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbF92aWV3X2Nvbi5zZXRDb250ZW50U2l6ZSh0aGlzLmNvbnRhaW5lcl9zaXplKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsX3ZpZXdfY29tcGVuZCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnN0b3BBdXRvU2Nyb2xsKClcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MudG9wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvVG9wKDApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0X3BvcyA9PSBTY3JvbGxWaWV3U3RhcnRQb3MuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlld19jb21wZW5kLnNjcm9sbFRvQm90dG9tKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWIt+aWsOW9k+WJjeaYvuekuml0ZW3mlbDmja4o5LiN5pS55Y+Y5Lu75L2V5L2N572u55qEKVxuICAgIHJlc2V0Q3VycmVudEl0ZW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmFjdGl2ZUNlbGxJZHgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNlbGxJZHhba2V5XSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOagueaNrmluZGV45Yi35paw5a+55bqU55qE57Si5byVLOWmguaenOWcqOWPr+inhuiMg+WbtOS7peWGhVxuICAgIHJlc2V0SXRlbUJ5SW5kZXg6IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVDZWxsSWR4W2luZGV4XSA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDojrflj5bmiYDmnInmtLvot4PnmoRjZWxs5a+56LGhXG4gICAgZ2V0QWN0aXZlQ2VsbExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuYWN0aXZlQ2VsbElkeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2VsbElkeFtrZXldID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsTGlzdFtrZXldICYmIHRoaXMuY2VsbExpc3Rba2V5XS5jZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCh0aGlzLmNlbGxMaXN0W2tleV0uY2VsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgIH0sXG5cbiAgICAvLyDmoLnmja7kuIvooajojrflj5blr7nlupTnmoRjZWxsLOS4jeeuoeaYr+WQpua0u+i3g1xuICAgIGdldENlbGxCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbExpc3RbaW5kZXhdICYmIHRoaXMuY2VsbExpc3RbaW5kZXhdLmNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxMaXN0W2luZGV4XS5jZWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOagueaNruS4i+ihqOiOt+WPluWvueW6lOeahGNlbGznmoRYWeS9jee9rizlhYjpooTnlZlcbiAgICBnZXRDZWxsWFlCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcblxuICAgIH0sXG5cbiAgICAvLyDorr7nva7mlbDmja5cbiAgICByZWxvYWREYXRhOiBmdW5jdGlvbiAoc2VsZWN0X2luZGV4LCBzZXR0aW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0X2luZGV4ID0gc2VsZWN0X2luZGV4O1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZ1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzaXNTZXR0aW5nKHNldHRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VsbExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4ID0ge307XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNhY2hlTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY2FjaGVMaXN0W2tleV07XG4gICAgICAgICAgICBjZWxsLnNldFBvc2l0aW9uKC0xMDAwMCwwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldElubmVyQ29udGFpbmVyKCk7XG4gICAgICAgIHZhciBudW1iZXIgPSB0aGlzLm51bWJlck9mQ2VsbHMoKTtcbiAgICAgICAgaWYgKG51bWJlciA9PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGkgPD0gdGhpcy50aW1lX3Nob3dfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjZWxsID0gdGhpcy5nZXRDYWNoZUNlbGxCeUluZGV4KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJvd19jb3VudCA9IHRoaXMuY2VsbExpc3QubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHh5ID0gdGhpcy5nZXRDZWxsUG9zaXRpb24ocm93X2NvdW50KS8vcm93X2NvbnQgKyAxXG4gICAgICAgICAgICB2YXIgY2VsbERhdGEgPSB7IGNlbGw6IGNlbGwsIHg6IHh5LngsIHk6IHh5LnkgfTtcbiAgICAgICAgICAgIHRoaXMuY2VsbExpc3QucHVzaChjZWxsRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNfZmlyc3RfaW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydFRpbWVUaWNrZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5pe26Ze05pi+56S657Si5byV5bCP5LqO5oC75pWwIOW6lOivpeaYvuekuue7p+e7reW9k+WJjeWumuaXtuWZqCDorqnkuIvpnaLnmoTog73mmL7npLrlh7rmnaVcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA8PSBudW1iZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZVRpY2tldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RfaW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG1heFJlZnJlc2hOdW0gPSAwXG4gICAgICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgbWF4UmVmcmVzaE51bSA9IHRoaXMuY2FjaGVNYXhTaXplIC0gdGhpcy5yb3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1heFJlZnJlc2hOdW0gPSB0aGlzLmNhY2hlTWF4U2l6ZSAtIHRoaXMuY29sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlZnJlc2hOdW0gPSAobnVtYmVyIDwgbWF4UmVmcmVzaE51bSkgPyBudW1iZXIgOiBtYXhSZWZyZXNoTnVtO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWZyZXNoTnVtOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMudGltZV9zaG93X2luZGV4KSB7IC8vaTw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbEF0SW5kZXgoaSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2VsbEJ5SW5kZXgoc2VsZWN0X2luZGV4KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDpgInkuK1pbmRleOe0ouW8leWvueixoSjlpoLmnpzliJfooajlhYHorrgg5Lya5o6S5bqP5Zyo5byA5aeL56ys5LiA5L2NKVxuICAgIHNlbGVjdENlbGxCeUluZGV4OiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIG1heFJlZnJlc2hOdW0gPSAwO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gU2Nyb2xsVmlld0Rpci5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBtYXhSZWZyZXNoTnVtID0gdGhpcy5jYWNoZU1heFNpemUgLSB0aGlzLnJvdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1heFJlZnJlc2hOdW0gPSB0aGlzLmNhY2hlTWF4U2l6ZSAtIHRoaXMuY29sO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1iZXIgPSB0aGlzLm51bWJlck9mQ2VsbHMoKTtcbiAgICAgICAgaWYgKG51bWJlciA8IG1heFJlZnJlc2hOdW0pIHtcbiAgICAgICAgICAgIC8vIOS4jeWkn+eOsOWunuS4gOWxj+W5lVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdGhpcy50aW1lX3Nob3dfaW5kZXgpIHsgLy9pPD1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDZWxsQXRJbmRleChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDZWxsSWR4W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyX3ggPSAwO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl94ID0gMFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl94ID0gLSh0aGlzLmNlbGxMaXN0W2luZGV4XS54IC0gKHRoaXMuaXRlbV93aWR0aCArIHRoaXMuc3BhY2VfeCkgKiAwLjUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDlrrnlmahY5pa55ZCR5pyA5aSn5L2N572uXG4gICAgICAgICAgICAgICAgdmFyIG1heF9jb250YXJpbmVyX3ggPSAtKHRoaXMuY29udGFpbmVyX3NpemUud2lkdGggLSB0aGlzLnNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJfeCA8IG1heF9jb250YXJpbmVyX3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3ggPSBtYXhfY29udGFyaW5lcl94O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2hvd19pbmRleCA9IE1hdGguZmxvb3IoTWF0aC5hYnMoY29udGFpbmVyX3gpIC8gdGhpcy5pdGVtX3dpZHRoKSAvLysxXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZV9zaG93X2luZGV4IDwgc2hvd19pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfc2hvd19pbmRleCA9IHNob3dfaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnggPSBjb250YWluZXJfeDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlclNob3dCeUhvcml6b250YWwoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcl95ID0gMFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl95ID0gdGhpcy5zdGFydF95ICsgdGhpcy5jZWxsTGlzdFtpbmRleF0ueSArIHRoaXMuaXRlbV9oZWlnaHQgKiAwLjUgLSB0aGlzLnNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl95ID0gdGhpcy5jZWxsTGlzdFtpbmRleF0ueSArICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSAqIDAuNSAtIHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJfeSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3kgPSAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpbmRleF8xID0gTWF0aC5mbG9vcigodGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQgLSAoY29udGFpbmVyX3kgKyB0aGlzLnNpemUuaGVpZ2h0KSkgLyB0aGlzLml0ZW1faGVpZ2h0KSArIDE7XG4gICAgICAgICAgICAgICAgdmFyIHNob3dfaW5kZXggPSAoaW5kZXhfMSAtIDEpICogdGhpcy5jb2w7Ly8rMVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA8IHNob3dfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSBzaG93X2luZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci55ID0gLWNvbnRhaW5lcl95O1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyU2hvd0J5VmVydGljYWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5udW1iZXJPZkNlbGxzKCkpIHsgLy9pbmRleD4wIGFuZCBpbmRleCA8PVxuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmdldENhY2hlQ2VsbEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2VsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy5jZWxsTGlzdFtpbmRleF0uY2VsbCA9IGNlbGw7XG4gICAgICAgICAgICB0aGlzLm9uQ2VsbFRvdWNoZWQoY2VsbCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWumuaXtuWZqOWIm+W7ulxuICAgIHN0YXJ0VGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lX3RpY2hldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsTGlzdC5sZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyDliLDml7bpl7TnjrDlrp7ntKLlvJVcbiAgICAgICAgICAgIHZhciBvbmNlX251bSA9IHRoaXMub25jZV9udW0gfHwgMTtcbiAgICAgICAgICAgIHZhciBfY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyID09IG51bGwpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSB0aGlzLnRpbWVfc2hvd19pbmRleCArIG9uY2VfbnVtO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMudGltZV9zaG93X2luZGV4O1xuICAgICAgICAgICAgICAgIC8vIGlmKGluZGV4ID09IDApe1xuICAgICAgICAgICAgICAgIC8vICAgICBpbmRleCA9IDE7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5jZWxsTGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lX3Nob3dfaW5kZXggPSB0aGlzLnRpbWVfc2hvd19pbmRleCArIG9uY2VfbnVtO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBzaXplKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxEYXRhID0gdGhpcy5jZWxsTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxEYXRhICYmIGNlbGxEYXRhLmNlbGwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbERhdGEuY2VsbCA9IHRoaXMuZ2V0Q2FjaGVDZWxsQnlJbmRleChpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDZWxsSWR4W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNlbGxBdEluZGV4KGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVfc2hvd19pbmRleCA+PSBzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNfZmlyc3RfaW5pdCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLnRpbWVfdGljaGV0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfY2FsbGJhY2soKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aGlzLmRlbGF5IC8gNjAsIC0xKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOa4hemZpOaOieWumuaXtuWZqFxuICAgIGNsZWFyVGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lX3RpY2hldCkge1xuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMudGltZV90aWNoZXQpO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpY2hldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g6I635Y+WaW5kZXjnmoTlr7nlupTkvY3nva5cbiAgICBnZXRDZWxsUG9zaXRpb246IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgYXBfeCA9IDAuNTtcbiAgICAgICAgdmFyIGFwX3kgPSAwLjU7XG4gICAgICAgIHZhciBfeCA9IDA7XG4gICAgICAgIHZhciBfeSA9IDA7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBTY3JvbGxWaWV3RGlyLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLnJvdykpO1xuICAgICAgICAgICAgX3kgPSB0aGlzLmNvbnRhaW5lcl9zaXplLmhlaWdodCAtICh0aGlzLnN0YXJ0X3kgKyB0aGlzLml0ZW1faGVpZ2h0ICogYXBfeSArIChpbmRleCAlIHRoaXMucm93KSAqICh0aGlzLml0ZW1faGVpZ2h0ICsgdGhpcy5zcGFjZV95KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydF9wb3MgPT0gU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCkge1xuICAgICAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKGluZGV4ICUgdGhpcy5jb2wpO1xuICAgICAgICAgICAgICAgIF95ID0gdGhpcy5jb250YWluZXJfc2l6ZS5oZWlnaHQgLSAodGhpcy5zdGFydF95ICsgdGhpcy5pdGVtX2hlaWdodCAqIGFwX3kgKyAoTWF0aC5mbG9vcihpbmRleCAvIHRoaXMuY29sKSkgKiAodGhpcy5pdGVtX2hlaWdodCArIHRoaXMuc3BhY2VfeSkpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF94ID0gdGhpcy5zdGFydF94ICsgdGhpcy5pdGVtX3dpZHRoICogYXBfeCArICh0aGlzLml0ZW1fd2lkdGggKyB0aGlzLnNwYWNlX3gpICogKGluZGV4ICUgdGhpcy5jb2wpO1xuICAgICAgICAgICAgICAgIF95ID0gdGhpcy5zdGFydF95ICsgdGhpcy5pdGVtX2hlaWdodCAqIGFwX3kgKyBNYXRoLmZsb29yKGluZGV4IC8gdGhpcy5jb2wpICogKHRoaXMuaXRlbV9oZWlnaHQgKyB0aGlzLnNwYWNlX3kpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgeDogX3gsIHk6IF95IH07XG4gICAgfSxcblxuICAgIC8vIOiOt+WPluagvOWtkOS4i+ihqOWvueW6lOeahOe8k+WtmGl0ZW1jZWxsXG4gICAgZ2V0Q2FjaGVDZWxsQnlJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBjYWNoZUluZGV4ID0gKGluZGV4ICUgdGhpcy5jYWNoZU1heFNpemUpO1xuICAgICAgICBpZiAodGhpcy5jYWNoZUxpc3RbY2FjaGVJbmRleF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5ld0NlbGwgPSB0aGlzLmNyZWF0ZU5ld0NlbGwoKTtcbiAgICAgICAgICAgIGlmIChuZXdDZWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3Q2VsbC5zZXRBbmNob3JQb2ludCgwLjUsIDAuNTspXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC5zZXRQb3NpdGlvbigtMTAwMDAsMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUxpc3RbY2FjaGVJbmRleF0gPSBuZXdDZWxsO1xuICAgICAgICAgICAgICAgIG5ld0NlbGwuc2V0UGFyZW50KHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdDZWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVMaXN0W2NhY2hlSW5kZXhdO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOagvOWtkCzlubbmoIforrDmtLvot4NcbiAgICB1cGRhdGVDZWxsQXRJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMudGltZV9zaG93X2luZGV4KSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNlbGxMaXN0W2luZGV4XSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBjZWxsRGF0YSA9IHRoaXMuY2VsbExpc3RbaW5kZXhdO1xuICAgICAgICBpZiAoY2VsbERhdGEuY2VsbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjZWxsRGF0YS5jZWxsID0gdGhpcy5nZXRDYWNoZUNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjZWxsRGF0YS5jZWxsLnNldFBvc2l0aW9uKGNlbGxEYXRhLngsIGNlbGxEYXRhLnkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNlbGxCeUluZGV4KGNlbGxEYXRhLmNlbGwsIGluZGV4KTtcbiAgICB9LFxuXG4gICAgLy8gXG4gICAgZ2V0TWF4U2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJfc2l6ZTtcbiAgICB9LFxuXG4gICAgZ2V0Q29udGFpbmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9LFxuXG4gICAgZGVsZXRlTWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5EZWxldGVNZSgpO1xuICAgIH0sXG4gICAgc2V0VmlzaWJsZTpmdW5jdGlvbihib29sKXtcbiAgICAgICAgaWYodGhpcy5yb290X3duZCAmJiBib29sICE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5hY3RpdmUgPSBib29sO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBEZWxldGVNZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZVRpY2tldCgpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jYWNoZUxpc3QpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5jYWNoZUxpc3Rba2V5XTtcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uZGVsZXRlTWUpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmRlbGV0ZU1lKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VsbExpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlTGlzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2VsbElkeCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5yb290X3duZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucm9vdF93bmQgPSBudWxsO1xuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVsZWFzZVByZWZhYih0aGlzLnByZWZhYlBhdGgpO1xuICAgIH0sXG59KSJdfQ==
|