368 lines
45 KiB
JavaScript
368 lines
45 KiB
JavaScript
|
||
(function() {
|
||
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
||
var __module = nodeEnv ? module : {exports:{}};
|
||
var __filename = 'preview-scripts/assets/Script/GameManager.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, 'b0432BA295DjIOcuitdGKO1', 'GameManager');
|
||
// Script/GameManager.ts
|
||
|
||
"use strict";
|
||
var __extends = (this && this.__extends) || (function () {
|
||
var extendStatics = function (d, b) {
|
||
extendStatics = Object.setPrototypeOf ||
|
||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
return extendStatics(d, b);
|
||
};
|
||
return function (d, b) {
|
||
extendStatics(d, b);
|
||
function __() { this.constructor = d; }
|
||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
};
|
||
})();
|
||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||
};
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
// 主游戏控制类
|
||
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
|
||
var GameManager = /** @class */ (function (_super) {
|
||
__extends(GameManager, _super);
|
||
function GameManager() {
|
||
var _this = _super !== null && _super.apply(this, arguments) || this;
|
||
_this.goal_Prefab = null;
|
||
_this.middle_Prefab = null;
|
||
return _this;
|
||
}
|
||
GameManager.prototype.onLoad = function () { };
|
||
GameManager.prototype.start = function () {
|
||
var _this = this;
|
||
this.fit();
|
||
this.init();
|
||
setTimeout(function () {
|
||
cc.fx.Notifications.on("moveTube", _this.moveTube, _this);
|
||
}, 1000);
|
||
};
|
||
//初始化数据
|
||
GameManager.prototype.init = function () {
|
||
this.tube1 = this.node.getChildByName("GameArea").getChildByName("tube1");
|
||
this.tube2 = this.node.getChildByName("GameArea").getChildByName("tube2");
|
||
this.tube3 = this.node.getChildByName("GameArea").getChildByName("tube3");
|
||
this.ball1 = this.node.getChildByName("GameArea").getChildByName("ball1");
|
||
this.ball2 = this.node.getChildByName("GameArea").getChildByName("ball2");
|
||
this.ball3 = this.node.getChildByName("GameArea").getChildByName("ball3");
|
||
this.goal = this.node.getChildByName("Goal");
|
||
this.middle = this.node.getChildByName("Middle");
|
||
// this.node.getChildByName("GameArea").getChildByName("tube1").zIndex = 1;
|
||
// this.node.getChildByName("GameArea").getChildByName("tube2").zIndex = 1;
|
||
// this.node.getChildByName("GameArea").getChildByName("tube3").zIndex = 1;
|
||
this.initMap();
|
||
this.initBall();
|
||
};
|
||
//初始化 管子和球的关卡数据
|
||
GameManager.prototype.initMap = function () {
|
||
this.tube_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].start, "start");
|
||
this.middle_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].middle, "middle");
|
||
this.goal_Array = this.changeMap(cc.fx.GameConfig.LEVEL_INFO[0].goal, "goal");
|
||
this.steps = cc.fx.GameConfig.LEVEL_INFO[0].steps;
|
||
};
|
||
/**
|
||
* 转变地图参数到程序可用
|
||
* @param tagArr tagArr为目标数组,可能为二维数组
|
||
* @param name 关卡,球和管子的类型,有start,middle,goal,其中middle是二维数组,最多为3个
|
||
*/
|
||
GameManager.prototype.changeMap = function (tagArr, name) {
|
||
//中间态可能有多组目标 故单独处理
|
||
if (name == "middle") {
|
||
for (var k = 0; k < tagArr.length; k++) {
|
||
var tempArr = tagArr[k];
|
||
for (var i = 0; i < tempArr.length; i++) {
|
||
if (tempArr[i].length > 0) {
|
||
for (var j = 0; j < tagArr[i].length; j++) {
|
||
if (this.conversion_Char(tempArr[i][j]))
|
||
tempArr[i][j] = this.conversion_Char(tempArr[i][j]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
for (var i = 0; i < tagArr.length; i++) {
|
||
if (tagArr[i].length > 0) {
|
||
for (var j = 0; j < tagArr[i].length; j++) {
|
||
if (this.conversion_Char(tagArr[i][j]))
|
||
tagArr[i][j] = this.conversion_Char(tagArr[i][j]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return tagArr;
|
||
};
|
||
//转换符号,"rgb"配置改为123
|
||
GameManager.prototype.conversion_Char = function (str) {
|
||
if (str == "r")
|
||
return 1;
|
||
else if (str == "g")
|
||
return 2;
|
||
else if (str == "b")
|
||
return 3;
|
||
};
|
||
//初始化球球 管子状态所有关都一样-
|
||
GameManager.prototype.initBall = function () {
|
||
//初始状态,球的初始化
|
||
for (var i = 0; i < this.tube_Array.length; i++) {
|
||
if (this.tube_Array[i].length > 0) {
|
||
for (var j = 0; j < this.tube_Array[i].length; j++) {
|
||
var name = "ball" + this.tube_Array[i][j];
|
||
this[name].active = true;
|
||
this[name].setPosition((i - 1) * 210, -100 + j * 100);
|
||
this[name].getComponent("Ball").init(j == (this.tube_Array[i].length - 1) ? true : false, this.tube_Array[i][j]);
|
||
}
|
||
}
|
||
}
|
||
//最终状态,球的初始化
|
||
for (var i = 0; i < this.goal_Array.length; i++) {
|
||
if (this.goal_Array[i].length > 0) {
|
||
for (var j = 0; j < this.goal_Array[i].length; j++) {
|
||
var name = this.goal_Array[i][j] + 4;
|
||
this.goal.children[name].active = true;
|
||
this.goal.children[name].setPosition((i - 1) * 210, -100 + j * 100);
|
||
this.goal.children[name].getComponent("Ball").init(false, this.goal_Array[i][j]);
|
||
}
|
||
}
|
||
}
|
||
//中间状态,球的初始化
|
||
for (var i = 0; i < this.middle_Array.length; i++) {
|
||
if (this.middle_Array.length > 0) {
|
||
if (this.middle_Array.length == 1) {
|
||
this.createMiddle(0);
|
||
}
|
||
else if (this.middle_Array.length == 3) {
|
||
this.createMiddle(1);
|
||
this.createMiddle(2);
|
||
this.createMiddle(3);
|
||
// this.middle.getChildByName("part").active = false;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
GameManager.prototype.createMiddle = function (num) {
|
||
var nodeName = "part";
|
||
if (num != 0)
|
||
nodeName = nodeName + num;
|
||
var mid = this.middle.getChildByName(nodeName);
|
||
mid.active = true;
|
||
var mid_Arr = this.middle_Array[num - 1];
|
||
for (var i = 0; i < mid_Arr.length; i++) {
|
||
if (mid_Arr[i].length > 0) {
|
||
for (var j = 0; j < mid_Arr[i].length; j++) {
|
||
var name = mid_Arr[i][j] + 4;
|
||
mid.children[name].active = true;
|
||
mid.children[name].setPosition((i - 1) * 210, -100 + j * 100);
|
||
mid.children[name].getComponent("Ball").init(false, mid_Arr[i][j]);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* 当管子内球发生移动时,改变管子数组,并且重置所有球是否可移动状态
|
||
* @param data data格式为对象
|
||
* id:number 移动球的自己的id
|
||
* tube:number 移动到目标个管子,0,1,2
|
||
start_Pos:cc.v2(), 移动之前的位置
|
||
end_Pos:cc.v2() 移动之后的终点位置
|
||
*/
|
||
GameManager.prototype.moveTube = function (data) {
|
||
this.tube_Array[data.tube].push(data.id);
|
||
var tube_Arr = this.tube_Array[1];
|
||
if (data.start_Pos.x == -210) {
|
||
tube_Arr = this.tube_Array[0];
|
||
}
|
||
else if (data.start_Pos.x == 210) {
|
||
tube_Arr = this.tube_Array[2];
|
||
}
|
||
if (tube_Arr.length > 0)
|
||
tube_Arr.pop();
|
||
if (data.start_Pos.y != 50 && tube_Arr.length > 0) {
|
||
var name = "ball" + tube_Arr[tube_Arr.length - 1];
|
||
this[name].getComponent("Ball").set_Touch(true);
|
||
}
|
||
if (data.end_Pos.y != 50) {
|
||
tube_Arr = this.tube_Array[1];
|
||
if (data.end_Pos.x == -210) {
|
||
tube_Arr = this.tube_Array[0];
|
||
}
|
||
else if (data.end_Pos.x == 210) {
|
||
tube_Arr = this.tube_Array[2];
|
||
}
|
||
if (tube_Arr.length > 1) {
|
||
var name = "ball" + tube_Arr[tube_Arr.length - 2];
|
||
console.log(name);
|
||
this[name].getComponent("Ball").set_Touch(false);
|
||
}
|
||
}
|
||
this.gameWin();
|
||
};
|
||
GameManager.prototype.gameWin = function () {
|
||
var result = false;
|
||
//如果没有中间状态,或者中间状态都已达到,则达到最终目标则算胜利
|
||
if (this.middle_Array.length == 0) {
|
||
result = this.isArrEqual(this.goal_Array);
|
||
if (result) {
|
||
alert("成功");
|
||
}
|
||
}
|
||
else {
|
||
for (var i = 0; i < this.middle_Array.length; i++) {
|
||
if (this.isArrEqual(this.middle_Array[i])) {
|
||
alert("达到中间态");
|
||
this.middle_Array.splice(i, 1);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
//判断数组是否相同,如果join情况下都不相同就不用往下比较
|
||
GameManager.prototype.isArrEqual = function (tagArr) {
|
||
var result = false;
|
||
if (this.tube_Array.join() == tagArr.join()) {
|
||
result = true;
|
||
for (var i = 0; i < this.tube_Array.length; i++) {
|
||
if (this.tube_Array[i].length != tagArr[i].length) {
|
||
result = false;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
//根据是否全面屏,做独立适配方面
|
||
GameManager.prototype.fit = function () {
|
||
var jg = this.setFit();
|
||
if (!jg) {
|
||
}
|
||
};
|
||
//判断全面屏
|
||
GameManager.prototype.getSetScreenResolutionFlag = function () {
|
||
var size = cc.winSize;
|
||
var width = size.width;
|
||
var height = size.height;
|
||
if ((height / width) > (16.2 / 9))
|
||
return false;
|
||
return true;
|
||
};
|
||
//判断全面屏适配
|
||
GameManager.prototype.setFit = function () {
|
||
var flag = this.getSetScreenResolutionFlag();
|
||
if (flag) {
|
||
}
|
||
else {
|
||
}
|
||
return flag;
|
||
};
|
||
//返回首页
|
||
GameManager.prototype.backScene = function () {
|
||
cc.director.loadScene("LoadScene");
|
||
};
|
||
//下一关,或者重新开始,或者返回上一关,根据level决定
|
||
GameManager.prototype.reStart = function (type) {
|
||
};
|
||
//获取时间戳
|
||
GameManager.prototype.getTime = function () {
|
||
var timestamp = new Date().getTime();
|
||
return timestamp;
|
||
};
|
||
//获胜
|
||
GameManager.prototype.passLevel = function () {
|
||
};
|
||
//失败
|
||
GameManager.prototype.loseLevel = function (type) {
|
||
};
|
||
//开始游戏
|
||
GameManager.prototype.startGame = function () {
|
||
};
|
||
//如果是倒计时 调用此方法
|
||
GameManager.prototype.updateCountDownTime = function () {
|
||
if (this.countTime > 0) {
|
||
this.countTime -= 1;
|
||
// this.time.string = cc.fx.GameTool.getTimeMargin(this.countTime);
|
||
if (this.countTime < 5) {
|
||
// cc.tween(this.time.node)
|
||
// .to(0.25,{scale:1.5,color:cc.color(255,0,0)})
|
||
// .to(0.25,{scale:1,color:cc.color(255,255,255)})
|
||
// .start()
|
||
var over = this.node.getChildByName("Over");
|
||
cc.tween(over)
|
||
.to(0.2, { opacity: 255 })
|
||
.delay(0.1)
|
||
.to(0.2, { opacity: 0 })
|
||
.start();
|
||
}
|
||
if (this.countTime <= 0) {
|
||
this.unschedule(this.updateCountDownTime);
|
||
var time = 0;
|
||
this.gameOver(time);
|
||
}
|
||
}
|
||
};
|
||
//上传每次操作数据
|
||
GameManager.prototype.setData = function () {
|
||
cc.fx.GameTool.setGameData();
|
||
};
|
||
//上传排行榜数据
|
||
GameManager.prototype.gameOver = function (time) {
|
||
cc.fx.GameTool.setRank(time);
|
||
this.node.getChildByName("GameOver").active = true;
|
||
this.node.getChildByName("GameOver").opacity = 0;
|
||
cc.tween(this.node.getChildByName("GameOver"))
|
||
.to(0.4, { opacity: 255 })
|
||
.delay(2)
|
||
.to(0.4, { opacity: 50 })
|
||
.call(function () {
|
||
cc.director.loadScene("OverScene");
|
||
})
|
||
.start();
|
||
};
|
||
GameManager.prototype.onEnable = function () {
|
||
// setTimeout(() => {
|
||
// cc.fx.Notifications.on("moveTube", this.moveTube, this);
|
||
// }, 100);
|
||
};
|
||
GameManager.prototype.onDisable = function () {
|
||
cc.fx.Notifications.off("moveTube", this.moveTube);
|
||
};
|
||
GameManager.prototype.update = function (dt) {
|
||
};
|
||
__decorate([
|
||
property(cc.Prefab)
|
||
], GameManager.prototype, "goal_Prefab", void 0);
|
||
__decorate([
|
||
property(cc.Prefab)
|
||
], GameManager.prototype, "middle_Prefab", void 0);
|
||
GameManager = __decorate([
|
||
ccclass
|
||
], GameManager);
|
||
return GameManager;
|
||
}(cc.Component));
|
||
exports.default = GameManager;
|
||
|
||
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxHYW1lTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTO0FBQ0gsSUFBQSxLQUFzQixFQUFFLENBQUMsVUFBVSxFQUFsQyxPQUFPLGFBQUEsRUFBRSxRQUFRLGNBQWlCLENBQUM7QUFFMUM7SUFBeUMsK0JBQVk7SUFBckQ7UUFBQSxxRUFzVUM7UUFwVUcsaUJBQVcsR0FBYyxJQUFJLENBQUM7UUFFOUIsbUJBQWEsR0FBYyxJQUFJLENBQUM7O0lBa1VwQyxDQUFDO0lBbFRHLDRCQUFNLEdBQU4sY0FBVyxDQUFDO0lBQ1osMkJBQUssR0FBTDtRQUFBLGlCQU1DO1FBTEcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osVUFBVSxDQUFDO1lBQ1AsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQzVELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRCxPQUFPO0lBQ1AsMEJBQUksR0FBSjtRQUNJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFB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LENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELDRCQUFNLEdBQU4sVUFBUSxFQUFFO0lBQ1YsQ0FBQztJQW5VRDtRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO29EQUNVO0lBRTlCO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7c0RBQ1k7SUFKZixXQUFXO1FBRC9CLE9BQU87T0FDYSxXQUFXLENBc1UvQjtJQUFELGtCQUFDO0NBdFVELEFBc1VDLENBdFV3QyxFQUFFLENBQUMsU0FBUyxHQXNVcEQ7a0JBdFVvQixXQUFXIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8g5Li75ri45oiP5o6n5Yi257G7XHJcbmNvbnN0IHtjY2NsYXNzLCBwcm9wZXJ0eX0gPSBjYy5fZGVjb3JhdG9yO1xyXG5AY2NjbGFzc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lTWFuYWdlciBleHRlbmRzIGNjLkNvbXBvbmVudCB7XHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgZ29hbF9QcmVmYWI6IGNjLlByZWZhYiA9IG51bGw7XHJcbiAgICBAcHJvcGVydHkoY2MuUHJlZmFiKVxyXG4gICAgbWlkZGxlX1ByZWZhYjogY2MuUHJlZmFiID0gbnVsbDtcclxuXHJcbiAgICBjb3VudFRpbWU6IG51bWJlcjsgIC8v5ri45oiP5oC7ZGFvamlzaGlcclxuICAgIHN0ZXBzOiAgbnVtYmVyOyAgICAgLy/lnLDlm77mnIDlpKfmraXmlbDpmZDliLZcclxuICAgIHR1YmUxOiBjYy5Ob2RlOyAgICAgLy/nrqHlrZAxXHJcbiAgICB0dWJlMjogY2MuTm9kZTsgICAgIC8v566h5a2QMlxyXG4gICAgdHViZTM6IGNjLk5vZGU7ICAgICAvL+euoeWtkDNcclxuICAgIGJhbGwxOiBjYy5Ob2RlOyAgICAgLy/nkIMxXHJcbiAgICBiYWxsMjogY2MuTm9kZTsgICAgIC8v55CDMlxyXG4gICAgYmFsbDM6IGNjLk5vZGU7ICAgICAvL+eQgzNcclxuICAgIGdvYWw6IGNjLk5vZGU7ICAgICAvL+euoeWtkDFcclxuICAgIG1pZGRsZTogY2MuTm9kZTsgICAgIC8v566h5a2QMlxyXG4gICAgdHViZV9BcnJheTogYW55Oy8v566h5a2Q5pWw57uEXHJcbiAgICBnb2FsX0FycmF5OiBhbnk7Ly/nrqHlrZDmlbDnu4RcclxuICAgIG1pZGRsZV9BcnJheTogYW55Oy8v566h5a2Q5pWw57uEXHJcblxyXG4gICAgb25Mb2FkICgpIHt9XHJcbiAgICBzdGFydCAoKSB7XHJcbiAgICAgICAgdGhpcy5maXQoKTtcclxuICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY2MuZnguTm90aWZpY2F0aW9ucy5vbihcIm1vdmVUdWJlXCIsIHRoaXMubW92ZVR1YmUsIHRoaXMpO1xyXG4gICAgICAgIH0sIDEwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW5pWw5o2uXHJcbiAgICBpbml0KCl7XHJcbiAgICAgICAgdGhpcy50dWJlMSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTFcIik7XHJcbiAgICAgICAgdGhpcy50dWJlMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTJcIik7XHJcbiAgICAgICAgdGhpcy50dWJlMyA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTNcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDFcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMiA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDJcIik7XHJcbiAgICAgICAgdGhpcy5iYWxsMyA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwiYmFsbDNcIik7XHJcbiAgICAgICAgdGhpcy5nb2FsID0gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR29hbFwiKTtcclxuICAgICAgICB0aGlzLm1pZGRsZSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIk1pZGRsZVwiKTtcclxuICAgICAgICAvLyB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lQXJlYVwiKS5nZXRDaGlsZEJ5TmFtZShcInR1YmUxXCIpLnpJbmRleCA9IDE7XHJcbiAgICAgICAgLy8gdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZUFyZWFcIikuZ2V0Q2hpbGRCeU5hbWUoXCJ0dWJlMlwiKS56SW5kZXggPSAxO1xyXG4gICAgICAgIC8vIHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcIkdhbWVBcmVhXCIpLmdldENoaWxkQnlOYW1lKFwidHViZTNcIikuekluZGV4ID0gMTtcclxuICAgICAgICB0aGlzLmluaXRNYXAoKVxyXG4gICAgICAgIHRoaXMuaW5pdEJhbGwoKTtcclxuICAgIH1cclxuICAgIC8v5Yid5aeL5YyWIOeuoeWtkOWSjOeQg+eahOWFs+WNoeaVsOaNrlxyXG4gICAgaW5pdE1hcCgpe1xyXG4gICAgICAgIHRoaXMudHViZV9BcnJheSAgPSB0aGlzLmNoYW5nZU1hcChjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk9bMF0uc3RhcnQsXCJzdGFydFwiKTtcclxuICAgICAgICB0aGlzLm1pZGRsZV9BcnJheSA9IHRoaXMuY2hhbmdlTWFwKGNjLmZ4LkdhbWVDb25maWcuTEVWRUxfSU5GT1swXS5taWRkbGUsXCJtaWRkbGVcIik7XHJcbiAgICAgICAgdGhpcy5nb2FsX0FycmF5ID0gdGhpcy5jaGFuZ2VNYXAoY2MuZnguR2FtZUNvbmZpZy5MRVZFTF9JTkZPWzBdLmdvYWwsXCJnb2FsXCIpO1xyXG4gICAgICAgIHRoaXMuc3RlcHMgPSBjYy5meC5HYW1lQ29uZmlnLkxFVkVMX0lORk9bMF0uc3RlcHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOi9rOWPmOWcsOWbvuWPguaVsOWIsOeoi+W6j+WPr+eUqFxyXG4gICAgICogQHBhcmFtIHRhZ0FyciB0YWdBcnLkuLrnm67moIfmlbDnu4TvvIzlj6/og73kuLrkuoznu7TmlbDnu4RcclxuICAgICAqIEBwYXJhbSBuYW1lIOWFs+WNoe+8jOeQg+WSjOeuoeWtkOeahOexu+Wei++8jOaciXN0YXJ0LG1pZGRsZSxnb2FsLOWFtuS4rW1pZGRsZeaYr+S6jOe7tOaVsOe7hO+8jOacgOWkmuS4ujPkuKpcclxuICAgICAqL1xyXG4gICAgY2hhbmdlTWFwKHRhZ0FyciwgbmFtZSl7XHJcbiAgICAgICAgLy/kuK3pl7TmgIHlj6/og73mnInlpJrnu4Tnm67moIcgIOaVheWNleeLrOWkhOeQhlxyXG4gICAgICAgIGlmKG5hbWUgPT0gXCJtaWRkbGVcIil7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaz0wOyBrPHRhZ0Fyci5sZW5ndGg7aysrKXtcclxuICAgICAgICAgICAgICAgIGxldCB0ZW1wQXJyID0gdGFnQXJyW2tdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7IGk8dGVtcEFyci5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBpZih0ZW1wQXJyW2ldLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGo9MDsgajx0YWdBcnJbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jb252ZXJzaW9uX0NoYXIodGVtcEFycltpXVtqXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEFycltpXVtqXSA9IHRoaXMuY29udmVyc2lvbl9DaGFyKHRlbXBBcnJbaV1bal0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT0wOyBpPHRhZ0Fyci5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgIGlmKHRhZ0FycltpXS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGo9MDsgajx0YWdBcnJbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNvbnZlcnNpb25fQ2hhcih0YWdBcnJbaV1bal0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQXJyW2ldW2pdID0gdGhpcy5jb252ZXJzaW9uX0NoYXIodGFnQXJyW2ldW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhZ0FycjtcclxuICAgIH1cclxuICAgIC8v6L2s5o2i56ym5Y+3LFwicmdiXCLphY3nva7mlLnkuLoxMjNcclxuICAgIGNvbnZlcnNpb25fQ2hhcihzdHI6IHN0cmluZyl7XHJcbiAgICAgICAgaWYoc3RyID09IFwiclwiKSByZXR1cm4gMTtcclxuICAgICAgICBlbHNlIGlmKHN0ciA9PSBcImdcIikgcmV0dXJuIDI7XHJcbiAgICAgICAgZWxzZSBpZihzdHIgPT0gXCJiXCIpIHJldHVybiAzO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yid5aeL5YyW55CD55CDIOeuoeWtkOeKtuaAgeaJgOacieWFs+mDveS4gOagty1cclxuICAgIGluaXRCYWxsKCl7XHJcbiAgICAgICAgLy/liJ3lp4vnirbmgIHvvIznkIPnmoTliJ3lp4vljJZcclxuICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnR1YmVfQXJyYXkubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZih0aGlzLnR1YmVfQXJyYXlbaV0ubGVuZ3RoID4gMCApe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBqID0wOyBqPHRoaXMudHViZV9BcnJheVtpXS5sZW5ndGg7IGorKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBcImJhbGxcIiArIHRoaXMudHViZV9BcnJheVtpXVtqXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzW25hbWVdLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5zZXRQb3NpdGlvbigoaS0xKSoyMTAsLTEwMCtqKjEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLmluaXQoaj09KHRoaXMudHViZV9BcnJheVtpXS5sZW5ndGgtMSk/dHJ1ZTpmYWxzZSx0aGlzLnR1YmVfQXJyYXlbaV1bal0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v5pyA57uI54q25oCB77yM55CD55qE5Yid5aeL5YyWXHJcbiAgICAgICAgZm9yKGxldCBpPTA7IGk8dGhpcy5nb2FsX0FycmF5Lmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYodGhpcy5nb2FsX0FycmF5W2ldLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9MDsgajx0aGlzLmdvYWxfQXJyYXlbaV0ubGVuZ3RoOyBqKyspe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nb2FsX0FycmF5W2ldW2pdICsgNDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdvYWwuY2hpbGRyZW5bbmFtZV0uYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdvYWwuY2hpbGRyZW5bbmFtZV0uc2V0UG9zaXRpb24oKGktMSkqMjEwLC0xMDAraioxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ29hbC5jaGlsZHJlbltuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLmluaXQoZmFsc2UsdGhpcy5nb2FsX0FycmF5W2ldW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+S4remXtOeKtuaAge+8jOeQg+eahOWIneWni+WMllxyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aDtpKyspe1xyXG4gICAgICAgICAgICBpZih0aGlzLm1pZGRsZV9BcnJheS5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aCA9PSAxKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU1pZGRsZSgwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYodGhpcy5taWRkbGVfQXJyYXkubGVuZ3RoID09IDMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTWlkZGxlKDMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMubWlkZGxlLmdldENoaWxkQnlOYW1lKFwicGFydFwiKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVNaWRkbGUobnVtKXtcclxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcInBhcnRcIjtcclxuICAgICAgICBpZihudW0gIT0gMCkgbm9kZU5hbWUgPSBub2RlTmFtZSArIG51bTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgbWlkID0gdGhpcy5taWRkbGUuZ2V0Q2hpbGRCeU5hbWUobm9kZU5hbWUpO1xyXG4gICAgICAgIG1pZC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBtaWRfQXJyID0gdGhpcy5taWRkbGVfQXJyYXlbbnVtLTFdO1xyXG4gICAgICAgIGZvcihsZXQgaT0wOyBpPG1pZF9BcnIubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihtaWRfQXJyW2ldLmxlbmd0aCA+IDAgKXtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9MDsgajxtaWRfQXJyW2ldLmxlbmd0aDsgaisrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG1pZF9BcnJbaV1bal0gKyA0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1pZC5jaGlsZHJlbltuYW1lXS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIG1pZC5jaGlsZHJlbltuYW1lXS5zZXRQb3NpdGlvbigoaS0xKSoyMTAsLTEwMCtqKjEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWlkLmNoaWxkcmVuW25hbWVdLmdldENvbXBvbmVudChcIkJhbGxcIikuaW5pdChmYWxzZSxtaWRfQXJyW2ldW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+euoeWtkOWGheeQg+WPkeeUn+enu+WKqOaXtu+8jOaUueWPmOeuoeWtkOaVsOe7hO+8jOW5tuS4lOmHjee9ruaJgOacieeQg+aYr+WQpuWPr+enu+WKqOeKtuaAgVxyXG4gICAgICogQHBhcmFtIGRhdGEgZGF0YeagvOW8j+S4uuWvueixoVxyXG4gICAgICogIGlkOm51bWJlciAgIOenu+WKqOeQg+eahOiHquW3seeahGlkXHJcbiAgICAgKiAgdHViZTpudW1iZXIg56e75Yqo5Yiw55uu5qCH5Liq566h5a2Q77yMMCwxLDJcclxuICAgICAgICBzdGFydF9Qb3M6Y2MudjIoKSwg56e75Yqo5LmL5YmN55qE5L2N572uXHJcbiAgICAgICAgZW5kX1BvczpjYy52MigpICAgIOenu+WKqOS5i+WQjueahOe7iOeCueS9jee9rlxyXG4gICAgICovXHJcbiAgICBtb3ZlVHViZShkYXRhKXtcclxuICAgICAgICB0aGlzLnR1YmVfQXJyYXlbZGF0YS50dWJlXS5wdXNoKGRhdGEuaWQpO1xyXG4gICAgICAgIHZhciB0dWJlX0FyciA9IHRoaXMudHViZV9BcnJheVsxXTtcclxuICAgICAgICBpZihkYXRhLnN0YXJ0X1Bvcy54ID09IC0yMTApe1xyXG4gICAgICAgICAgICB0dWJlX0FyciA9IHRoaXMudHViZV9BcnJheVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihkYXRhLnN0YXJ0X1Bvcy54ID09IDIxMCl7XHJcbiAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0dWJlX0Fyci5sZW5ndGggPiAwKSB0dWJlX0Fyci5wb3AoKTtcclxuICAgICAgICBpZihkYXRhLnN0YXJ0X1Bvcy55ICE9IDUwICYmIHR1YmVfQXJyLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICBsZXQgbmFtZSA9IFwiYmFsbFwiICsgdHViZV9BcnJbdHViZV9BcnIubGVuZ3RoLTFdO1xyXG4gICAgICAgICAgICB0aGlzW25hbWVdLmdldENvbXBvbmVudChcIkJhbGxcIikuc2V0X1RvdWNoKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihkYXRhLmVuZF9Qb3MueSAhPSA1MCl7XHJcbiAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzFdO1xyXG4gICAgICAgICAgICBpZihkYXRhLmVuZF9Qb3MueCA9PSAtMjEwKXtcclxuICAgICAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YS5lbmRfUG9zLnggPT0gMjEwKXtcclxuICAgICAgICAgICAgICAgIHR1YmVfQXJyID0gdGhpcy50dWJlX0FycmF5WzJdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHR1YmVfQXJyLmxlbmd0aCA+IDEpe1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBcImJhbGxcIiArIHR1YmVfQXJyW3R1YmVfQXJyLmxlbmd0aC0yXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpc1tuYW1lXS5nZXRDb21wb25lbnQoXCJCYWxsXCIpLnNldF9Ub3VjaChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nYW1lV2luKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2FtZVdpbigpe1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAvL+WmguaenOayoeacieS4remXtOeKtuaAge+8jOaIluiAheS4remXtOeKtuaAgemDveW3sui+vuWIsO+8jOWImei+vuWIsOacgOe7iOebruagh+WImeeul+iDnOWIqVxyXG4gICAgICAgIGlmKHRoaXMubWlkZGxlX0FycmF5Lmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5pc0FyckVxdWFsKHRoaXMuZ29hbF9BcnJheSk7XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICBhbGVydChcIuaIkOWKn1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLm1pZGRsZV9BcnJheS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmlzQXJyRXF1YWwodGhpcy5taWRkbGVfQXJyYXlbaV0pKXtcclxuICAgICAgICAgICAgICAgICAgICBhbGVydChcIui+vuWIsOS4remXtOaAgVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pZGRsZV9BcnJheS5zcGxpY2UoaSwxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5Yik5pat5pWw57uE5piv5ZCm55u45ZCM77yM5aaC5p6cam9pbuaDheWGteS4i+mDveS4jeebuOWQjOWwseS4jeeUqOW+gOS4i+avlOi+g1xyXG4gICAgaXNBcnJFcXVhbCh0YWdBcnIpe1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICBpZih0aGlzLnR1YmVfQXJyYXkuam9pbigpID09IHRhZ0Fyci5qb2luKCkpe1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnR1YmVfQXJyYXkubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy50dWJlX0FycmF5W2ldLmxlbmd0aCAhPSB0YWdBcnJbaV0ubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8v5qC55o2u5piv5ZCm5YWo6Z2i5bGP77yM5YGa54us56uL6YCC6YWN5pa56Z2iXHJcbiAgICBmaXQoKXtcclxuICAgICAgICB2YXIgamcgPSB0aGlzLnNldEZpdCgpO1xyXG4gICAgICAgIGlmKCFqZyl7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8v5Yik5pat5YWo6Z2i5bGPXHJcbiAgICBnZXRTZXRTY3JlZW5SZXNvbHV0aW9uRmxhZyAoKSB7XHJcbiAgICAgICAgbGV0IHNpemUgPSBjYy53aW5TaXplO1xyXG4gICAgICAgIGxldCB3aWR0aCA9IHNpemUud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgIGlmICgoaGVpZ2h0IC8gd2lkdGgpID4gKDE2LjIgLyA5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgLy/liKTmlq3lhajpnaLlsY/pgILphY1cclxuICAgIHNldEZpdCAoKSB7XHJcbiAgICAgICAgbGV0IGZsYWcgPSB0aGlzLmdldFNldFNjcmVlblJlc29sdXRpb25GbGFnKCk7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuICAgIC8v6L+U5Zue6aaW6aG1XHJcbiAgICBiYWNrU2NlbmUoKXtcclxuICAgICAgICBjYy5kaXJlY3Rvci5sb2FkU2NlbmUoXCJMb2FkU2NlbmVcIik7XHJcbiAgICB9XHJcbiAgICAvL+S4i+S4gOWFs++8jOaIluiAhemHjeaWsOW8gOWni++8jOaIluiAhei/lOWbnuS4iuS4gOWFs++8jOagueaNrmxldmVs5Yaz5a6aXHJcbiAgICByZVN0YXJ0KHR5cGUpe1xyXG5cclxuICAgIH1cclxuICAgIC8v6I635Y+W5pe26Ze05oizXHJcbiAgICBnZXRUaW1lKCl7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDtcclxuICAgIH1cclxuICAgIC8v6I636IOcXHJcbiAgICBwYXNzTGV2ZWwoKXtcclxuXHJcbiAgICB9XHJcbiAgICAvL+Wksei0pVxyXG4gICAgbG9zZUxldmVsKHR5cGUpe1xyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIC8v5byA5aeL5ri45oiPXHJcbiAgICBzdGFydEdhbWUoKXtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v5aaC5p6c5piv5YCS6K6h5pe2IOiwg+eUqOatpOaWueazlVxyXG4gICAgdXBkYXRlQ291bnREb3duVGltZSAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY291bnRUaW1lID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50VGltZSAtPSAxO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnRpbWUuc3RyaW5nID0gIGNjLmZ4LkdhbWVUb29sLmdldFRpbWVNYXJnaW4odGhpcy5jb3VudFRpbWUpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmNvdW50VGltZSA8IDUpe1xyXG4gICAgICAgICAgICAgICAgLy8gY2MudHdlZW4odGhpcy50aW1lLm5vZGUpXHJcbiAgICAgICAgICAgICAgICAvLyAudG8oMC4yNSx7c2NhbGU6MS41LGNvbG9yOmNjLmNvbG9yKDI1NSwwLDApfSlcclxuICAgICAgICAgICAgICAgIC8vIC50bygwLjI1LHtzY2FsZToxLGNvbG9yOmNjLmNvbG9yKDI1NSwyNTUsMjU1KX0pXHJcbiAgICAgICAgICAgICAgICAvLyAuc3RhcnQoKVxyXG4gICAgICAgICAgICAgICAgbGV0IG92ZXIgPSB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJPdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgY2MudHdlZW4ob3ZlcilcclxuICAgICAgICAgICAgICAgIC50bygwLjIse29wYWNpdHk6MjU1fSlcclxuICAgICAgICAgICAgICAgIC5kZWxheSgwLjEpXHJcbiAgICAgICAgICAgICAgICAudG8oMC4yLHtvcGFjaXR5OjB9KVxyXG4gICAgICAgICAgICAgICAgLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy5jb3VudFRpbWUgPD0gMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy51cGRhdGVDb3VudERvd25UaW1lKTtcclxuICAgICAgICAgICAgICAgIHZhciB0aW1lID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2FtZU92ZXIodGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+S4iuS8oOavj+asoeaTjeS9nOaVsOaNrlxyXG4gICAgc2V0RGF0YSgpe1xyXG4gICAgICAgICBjYy5meC5HYW1lVG9vbC5zZXRHYW1lRGF0YSgpO1xyXG4gICAgfVxyXG4gICAgLy/kuIrkvKDmjpLooYzmppzmlbDmja5cclxuICAgIGdhbWVPdmVyKHRpbWUpe1xyXG4gICAgICAgIGNjLmZ4LkdhbWVUb29sLnNldFJhbmsodGltZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlLmdldENoaWxkQnlOYW1lKFwiR2FtZU92ZXJcIikuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lT3ZlclwiKS5vcGFjaXR5ID0gMDtcclxuICAgICAgICBjYy50d2Vlbih0aGlzLm5vZGUuZ2V0Q2hpbGRCeU5hbWUoXCJHYW1lT3ZlclwiKSlcclxuICAgICAgICAudG8oMC40LHtvcGFjaXR5OjI1NX0pXHJcbiAgICAgICAgLmRlbGF5KDIpXHJcbiAgICAgICAgLnRvKDAuNCx7b3BhY2l0eTo1MH0pXHJcbiAgICAgICAgLmNhbGwoKCkgPT57XHJcbiAgICAgICAgICAgIGNjLmRpcmVjdG9yLmxvYWRTY2VuZShcIk92ZXJTY2VuZVwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdGFydCgpXHJcbiAgICB9XHJcblxyXG4gICAgb25FbmFibGUgKCkge1xyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjYy5meC5Ob3RpZmljYXRpb25zLm9uKFwibW92ZVR1YmVcIiwgdGhpcy5tb3ZlVHViZSwgdGhpcyk7XHJcbiAgICAgICAgLy8gfSwgMTAwKTtcclxuXHJcbiAgICB9XHJcbiAgICBvbkRpc2FibGUgKCkge1xyXG4gICAgICAgIGNjLmZ4Lk5vdGlmaWNhdGlvbnMub2ZmKFwibW92ZVR1YmVcIiwgdGhpcy5tb3ZlVHViZSk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGUgKGR0KSB7XHJcbiAgICB9XHJcbn1cclxuIl19
|