Mandala/temp/quick-scripts/dst/assets/Script/Game.js
2024-10-30 15:19:32 +08:00

320 lines
42 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function() {
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
var __module = nodeEnv ? module : {exports:{}};
var __filename = 'preview-scripts/assets/Script/Game.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, '1c26dVSok5E7o2PwD2sGBJa', 'Game');
// Script/Game.ts
"use strict";
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
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 (b.hasOwnProperty(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 DrawingBoard_1 = require("./DrawingBoard");
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
var GameState;
(function (GameState) {
GameState[GameState["drawing"] = 1] = "drawing";
GameState[GameState["erasing"] = 2] = "erasing";
})(GameState || (GameState = {}));
var Game = /** @class */ (function (_super) {
__extends(Game, _super);
function Game() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.drawNode = null;
_this.captureCamera = null;
_this.mainCamera = null;
_this.db = null;
_this.gameState = GameState.drawing;
_this.texture = null;
_this.prePos = cc.Vec2.ZERO;
_this.startPos = cc.Vec2.ZERO;
_this.lastColor = cc.Color.BLUE;
_this.errColor = cc.Color.RED;
_this.lastLineWidth = 1;
_this.history = [];
_this.touchId = -1;
_this.touchScale = false;
return _this;
}
Game.prototype.start = function () {
var _this = this;
this.initDb();
this.initTexture();
this.initRead();
setTimeout(function () {
_this.drawNode.on("touchstart", _this.onTouchStart, _this);
_this.drawNode.on("touchmove", _this.onTouchMove, _this);
_this.drawNode.on("touchend", _this.onTouchEnd, _this);
_this.drawNode.on("touchcancel", _this.onTouchEnd, _this);
}, 2000);
};
Game.prototype.initDb = function () {
//创建一个画板(需传入画板尺寸,将自动初始化)
this.db = new DrawingBoard_1.default(this.drawNode.width, this.drawNode.height);
//设置画板的绘图颜色(每次绘制前都可以重新设置)
this.lastLineWidth = 15;
this.db.setLineWidth(this.lastLineWidth);
// this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
//线条端点以圆角结尾
this.db.setLineCircleEnd(true);
};
Game.prototype.initTexture = function () {
this.texture = new cc.RenderTexture();
this.texture.initWithSize(this.drawNode.width, this.drawNode.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
var spf = new cc.SpriteFrame(this.texture);
this.drawNode.getComponent(cc.Sprite).spriteFrame = spf;
};
Game.prototype.initRead = function () {
this.targetCamera = this.node.getChildByName("tagCamera").getComponent(cc.Camera);
var rander = new cc.RenderTexture();
rander.initWithSize(this.node.width, this.node.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
this.targetCamera.targetTexture = rander;
this.targetCamera.render();
console.log("完成");
};
Game.prototype.onTouchStart = function (e) {
//将触摸位置作为线条的起点
//画板中使用的坐标系与图片坐标系一样原点在左上角X轴向右为正Y轴向下为正
//所以Y轴坐标应反过来, 这里用getLocationInView而不是getLocation
this.touchId = e.getID();
if (this.touchId == 1) {
this.touchScale = true;
return;
}
var pos = e.getLocation();
this.prePos = this.convertToDrawNodePos(pos);
this.startPos = this.convertToDrawNodePos(pos);
this.db.moveTo(this.prePos.x, this.prePos.y);
};
Game.prototype.onTouchMove = function (e) {
var touches = e.getTouches();
var touch1 = touches[0];
var delta1 = touch1.getDelta();
var pos = e.getLocation();
var pos1 = this.convertToDrawNodePos(touch1.getLocation());
var dst = this.startPos.sub(pos1).mag();
// this.label.string = touches.length + "";
if (touches.length == 1 && this.touchId < 1 && !this.touchScale && dst > 7) {
// alert("不该进来");
this.prePos = this.convertToDrawNodePos(pos);
var jg = this.pd(e);
this.changeColor(jg);
if (this.gameState == GameState.drawing) {
//从上一次绘制线条后的终点开始向鼠标当前位置绘制线条
this.db.lineTo(this.prePos.x, this.prePos.y);
}
else if (this.gameState == GameState.erasing) {
// 橡皮擦
this.db.circle(this.prePos.x, this.prePos.y, 10);
}
//每次画板中的数据有变化后,及时将数据应用到贴图上,在屏幕上显示出来
this.drawToImg();
}
else if (touches.length == 2) {
var touch1 = touches[0], touch2 = touches[1];
var delta1 = touch1.getDelta(), delta2 = touch2.getDelta();
var touchPoint1 = this.node.parent.convertToNodeSpaceAR(touch1.getLocation());
var touchPoint2 = this.node.parent.convertToNodeSpaceAR(touch2.getLocation());
var distance = touchPoint1.sub(touchPoint2);
var delta = delta1.sub(delta2);
var scale = 1;
if (Math.abs(distance.x) > Math.abs(distance.y)) {
scale = (distance.x + delta.x) / distance.x * this.node.scale;
}
else {
scale = (distance.y + delta.y) / distance.y * this.node.scale;
}
if (scale > 2)
scale = 2;
this.node.scale = scale <= 0.1 ? 0.1 : scale;
}
};
Game.prototype.onTouchEnd = function (e) {
this.touchId = e.getID();
if (this.touchId == 1)
this.touchScale = false;
this.addHistory();
};
Game.prototype.pd = function (event) {
var cha = 2;
var pos = event.getLocation();
var jg = false;
for (var i = -cha; i < cha; i++) {
var postion = cc.v2();
postion.x = pos.x + i;
for (var j = -cha; j < cha; j++) {
postion.y = pos.y + j;
// console.log("检测点:",postion.x,postion.y);
var img = this.getGraphisData(postion);
if ((img[0] != 255 && img[1] != 255 && img[2] != 255)) {
jg = true;
j = 10000;
i = 10000;
}
}
}
//
return jg;
};
Game.prototype.convertToDrawNodePos = function (worldPos) {
var pos = this.drawNode.convertToNodeSpaceAR(worldPos);
pos.x += this.drawNode.width * this.drawNode.anchorX;
pos.y += this.drawNode.height * this.drawNode.anchorY;
pos.y = this.drawNode.height - pos.y;
return pos;
};
Game.prototype.addHistory = function () {
var copy = this.db.copyData();
var ucopy = new Uint8Array(copy);
this.history.push({ data: ucopy });
// cc.log('历史步骤: ', this.history.length);
};
Game.prototype.drawToImg = function () {
//获取画板中绘制的图案数据
var data = this.db.getData();
//将数据传递给贴图对象
this.texture.initWithData(data, cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height);
};
Game.prototype.changeColor = function (red) {
if (!red)
this.db.setColor(this.errColor.r, this.errColor.g, this.errColor.b, this.errColor.a);
else
this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
};
Game.prototype.getGraphisData = function (point) {
var Uint8 = new Uint8Array(4);
Uint8 = this.targetCamera.targetTexture.readPixels(Uint8, point.x, point.y, 1, 1);
return Uint8;
};
Game.prototype.onBtnDraw = function () {
this.db.setLineWidth(this.lastLineWidth);
this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
this.gameState = GameState.drawing;
};
Game.prototype.onBtnErase = function () {
this.db.setLineWidth(this.lastLineWidth * 3);
// 橡皮擦的颜色不能是(0,0,0,0),因为这样会和DrawingBoard里的默认颜色相同导致绘制跳过
this.db.setColor(255, 255, 255, 0);
this.gameState = GameState.erasing;
};
Game.prototype.onBtnClear = function () {
this.db.reset();
this.drawToImg();
this.history.splice(0, this.history.length);
};
Game.prototype.onBtnRevoke = function () {
this.history.pop();
if (this.history.length) {
var data = this.history[this.history.length - 1].data;
this.db.setData(data.buffer);
this.texture.initWithData(this.db.getData(), cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height);
}
else {
this.onBtnClear();
}
cc.log('历史记录剩余: ', this.history.length);
};
Game.prototype.onBtnSave = function () {
var _this = this;
if (cc.sys.isBrowser) {
var width = this.drawNode.width;
var height = this.drawNode.height;
this.captureCamera.enabled = true;
var texture = new cc.RenderTexture();
texture.initWithSize(width, height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
this.captureCamera.targetTexture = texture;
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
this.captureCamera.render();
var data = texture.readPixels();
// write the render data
var rowBytes = width * 4;
for (var row = 0; row < height; row++) {
var srow = height - 1 - row;
var imageData = ctx.createImageData(width, 1);
var start = srow * width * 4;
for (var i = 0; i < rowBytes; i++) {
imageData.data[i] = data[start + i];
}
ctx.putImageData(imageData, 0, row);
}
//
var dataUrl = canvas.toDataURL('image/png');
// cc.log('iamge-base64:', dataUrl);
var saveLink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
saveLink.href = dataUrl;
saveLink.download = String(Date.now()) + '.png';
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
saveLink.dispatchEvent(event);
this.scheduleOnce(function (t) {
_this.captureCamera.enabled = false;
}, 0.1);
}
else {
cc.warn('暂时只支持web端保存图片');
}
};
Game.prototype.update = function (dt) {
};
__decorate([
property(cc.Node)
], Game.prototype, "drawNode", void 0);
__decorate([
property(cc.Camera)
], Game.prototype, "captureCamera", void 0);
__decorate([
property(cc.Camera)
], Game.prototype, "mainCamera", void 0);
Game = __decorate([
ccclass
], Game);
return Game;
}(cc.Component));
exports.default = Game;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0XFxHYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvQkFBb0I7QUFDcEIsd0VBQXdFO0FBQ3hFLG1CQUFtQjtBQUNuQixrRkFBa0Y7QUFDbEYsOEJBQThCO0FBQzlCLGtGQUFrRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWxGLCtDQUEwQztBQUVwQyxJQUFBLEtBQXdCLEVBQUUsQ0FBQyxVQUFVLEVBQW5DLE9BQU8sYUFBQSxFQUFFLFFBQVEsY0FBa0IsQ0FBQztBQUU1QyxJQUFLLFNBR0o7QUFIRCxXQUFLLFNBQVM7SUFDViwrQ0FBVyxDQUFBO0lBQ1gsK0NBQVcsQ0FBQTtBQUNmLENBQUMsRUFISSxTQUFTLEtBQVQsU0FBUyxRQUdiO0FBR0Q7SUFBa0Msd0JBQVk7SUFBOUM7UUFBQSxxRUE4UUM7UUE1UUcsY0FBUSxHQUFZLElBQUksQ0FBQztRQUd6QixtQkFBYSxHQUFjLElBQUksQ0FBQztRQUdoQyxnQkFBVSxHQUFjLElBQUksQ0FBQztRQUdyQixRQUFFLEdBQWlCLElBQUksQ0FBQztRQUN4QixlQUFTLEdBQWMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN6QyxhQUFPLEdBQXFCLElBQUksQ0FBQztRQUNqQyxZQUFNLEdBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDL0IsY0FBUSxHQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pDLGVBQVMsR0FBYSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNwQyxjQUFRLEdBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDbEMsbUJBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsYUFBTyxHQUFVLEVBQUUsQ0FBQztRQUNwQixhQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDYixnQkFBVSxHQUFHLEtBQUssQ0FBQzs7SUF5UC9CLENBQUM7SUF0UEcsb0JBQUssR0FBTDtRQUFBLGlCQVdDO1FBVkcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixVQUFVLENBQUM7WUFDUCxLQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSSxDQUFDLFlBQVksRUFBRSxLQUFJLENBQUMsQ0FBQztZQUN4RCxLQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSSxDQUFDLFdBQVcsRUFBRSxLQUFJLENBQUMsQ0FBQztZQUN0RCxLQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSSxDQUFDLFVBQVUsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUMzRCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQscUJBQU0sR0FBTjtRQUNJLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksc0JBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsNEZBQTRGO1FBQzVGLFdBQVc7UUFDWCxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCwwQkFBVyxHQUFYO1FBQ0ksSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BILElBQUksR0FBRyxHQUFtQixJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQzVELENBQUM7SUFFRCx1QkFBUSxHQUFSO1FBQ0ksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xGLElBQUksTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCwyQkFBWSxHQUFaLFVBQWEsQ0FBc0I7UUFDL0IsY0FBYztRQUNkLHlDQUF5QztRQUN6QyxnREFBZ0Q7UUFFaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBQztZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRCxDQUFDO0lBRUQsMEJBQVcsR0FBWCxVQUFZLENBQXNCO1FBQzlCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUxQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDdkMsMkNBQTJDO1FBQzNDLElBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUM7WUFDdEUsaUJBQWlCO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDckMsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxNQUFNO2dCQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNwQjthQUNJLElBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUM7WUFDeEIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDOUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFFOUUsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUVkLElBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUM7Z0JBQzNDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDakU7aUJBQ0c7Z0JBQ0EsS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNqRTtZQUNELElBQUcsS0FBSyxHQUFHLENBQUM7Z0JBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCx5QkFBVSxHQUFWLFVBQVcsQ0FBc0I7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGlCQUFFLEdBQUYsVUFBRyxLQUFLO1FBQ0osSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNmLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUUsRUFBQztZQUN0QixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixLQUFJLElBQUksQ0FBQyxHQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLDJDQUEyQztnQkFDM0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkMsSUFBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUUsR0FBRyxDQUFDLEVBQUM7b0JBQzdDLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JBQ1YsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjthQUNKO1NBRUo7UUFDRCxFQUFFO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFFZCxDQUFDO0lBRUQsbUNBQW9CLEdBQXBCLFVBQXFCLFFBQWlCO1FBQ2xDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNyRCxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3RELEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCx5QkFBVSxHQUFWO1FBQ0ksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLHlDQUF5QztJQUM3QyxDQUFDO0lBRUQsd0JBQVMsR0FBVDtRQUNJLGNBQWM7UUFDZCxJQUFJLElBQUksR0FBZSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLFlBQVk7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELDBCQUFXLEdBQVgsVUFBWSxHQUFHO1FBQ1gsSUFBRyxDQUFDLEdBQUc7WUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBOztZQUN4RixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRCw2QkFBYyxHQUFkLFVBQWUsS0FBSztRQUNoQixJQUFJLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFHRCx3QkFBUyxHQUFUO1FBQ0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx5QkFBVSxHQUFWO1FBQ0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBRXZDLENBQUM7SUFFRCx5QkFBVSxHQUFWO1FBQ0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELDBCQUFXLEdBQVg7UUFDSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDckIsSUFBSSxJQUFJLEdBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEg7YUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNyQjtRQUNELEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELHdCQUFTLEdBQVQ7UUFBQSxpQkEwQ0M7UUF6Q0csSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNoQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUVsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1lBRTNDLElBQUksTUFBTSxHQUFzQixRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsd0JBQXdCO1lBQ3hCLElBQUksUUFBUSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDekIsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQzVCLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDL0IsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN2QztnQkFDRCxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDdkM7WUFDRCxFQUFFO1lBQ0YsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxvQ0FBb0M7WUFDcEMsSUFBSSxRQUFRLEdBQVEsUUFBUSxDQUFDLGVBQWUsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRixRQUFRLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztZQUN4QixRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDaEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNoRCxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQUEsQ0FBQztnQkFDZixLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdkMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1g7YUFBTTtZQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQscUJBQU0sR0FBTixVQUFRLEVBQUU7SUFFVixDQUFDO0lBM1FEO1FBREMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7MENBQ087SUFHekI7UUFEQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzsrQ0FDWTtJQUdoQztRQURDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDOzRDQUNTO0lBUlosSUFBSTtRQUR4QixPQUFPO09BQ2EsSUFBSSxDQThReEI7SUFBRCxXQUFDO0NBOVFELEFBOFFDLENBOVFpQyxFQUFFLENBQUMsU0FBUyxHQThRN0M7a0JBOVFvQixJQUFJIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTGVhcm4gVHlwZVNjcmlwdDpcbi8vICAtIGh0dHBzOi8vZG9jcy5jb2Nvcy5jb20vY3JlYXRvci9tYW51YWwvZW4vc2NyaXB0aW5nL3R5cGVzY3JpcHQuaHRtbFxuLy8gTGVhcm4gQXR0cmlidXRlOlxuLy8gIC0gaHR0cHM6Ly9kb2NzLmNvY29zLmNvbS9jcmVhdG9yL21hbnVhbC9lbi9zY3JpcHRpbmcvcmVmZXJlbmNlL2F0dHJpYnV0ZXMuaHRtbFxuLy8gTGVhcm4gbGlmZS1jeWNsZSBjYWxsYmFja3M6XG4vLyAgLSBodHRwczovL2RvY3MuY29jb3MuY29tL2NyZWF0b3IvbWFudWFsL2VuL3NjcmlwdGluZy9saWZlLWN5Y2xlLWNhbGxiYWNrcy5odG1sXG5cbmltcG9ydCBEcmF3aW5nQm9hcmQgZnJvbSBcIi4vRHJhd2luZ0JvYXJkXCI7XG5cbmNvbnN0IHsgY2NjbGFzcywgcHJvcGVydHkgfSA9IGNjLl9kZWNvcmF0b3I7XG5cbmVudW0gR2FtZVN0YXRlIHtcbiAgICBkcmF3aW5nID0gMSxcbiAgICBlcmFzaW5nID0gMixcbn1cblxuQGNjY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWUgZXh0ZW5kcyBjYy5Db21wb25lbnQge1xuICAgIEBwcm9wZXJ0eShjYy5Ob2RlKVxuICAgIGRyYXdOb2RlOiBjYy5Ob2RlID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgY2FwdHVyZUNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIEBwcm9wZXJ0eShjYy5DYW1lcmEpXG4gICAgbWFpbkNhbWVyYTogY2MuQ2FtZXJhID0gbnVsbDtcblxuICAgIHByaXZhdGUgdGFyZ2V0Q2FtZXJhOiBjYy5DYW1lcmE7XG4gICAgcHJpdmF0ZSBkYjogRHJhd2luZ0JvYXJkID0gbnVsbDtcbiAgICBwcml2YXRlIGdhbWVTdGF0ZTogR2FtZVN0YXRlID0gR2FtZVN0YXRlLmRyYXdpbmc7XG4gICAgcHJpdmF0ZSB0ZXh0dXJlOiBjYy5SZW5kZXJUZXh0dXJlID0gbnVsbDtcbiAgICBwcml2YXRlIHByZVBvczogY2MuVmVjMiA9IGNjLlZlYzIuWkVSTztcbiAgICBwcml2YXRlIHN0YXJ0UG9zOiBjYy5WZWMyID0gY2MuVmVjMi5aRVJPO1xuICAgIHByaXZhdGUgbGFzdENvbG9yOiBjYy5Db2xvciA9IGNjLkNvbG9yLkJMVUU7XG4gICAgcHJpdmF0ZSBlcnJDb2xvcjogY2MuQ29sb3IgPSBjYy5Db2xvci5SRUQ7XG4gICAgcHJpdmF0ZSBsYXN0TGluZVdpZHRoOiBudW1iZXIgPSAxO1xuICAgIHByaXZhdGUgaGlzdG9yeTogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHRvdWNoSWQgPSAtMTtcbiAgICBwcml2YXRlIHRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgXG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5pbml0RGIoKTtcbiAgICAgICAgdGhpcy5pbml0VGV4dHVyZSgpO1xuICAgICAgICB0aGlzLmluaXRSZWFkKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hzdGFydFwiLCB0aGlzLm9uVG91Y2hTdGFydCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2htb3ZlXCIsIHRoaXMub25Ub3VjaE1vdmUsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kcmF3Tm9kZS5vbihcInRvdWNoZW5kXCIsIHRoaXMub25Ub3VjaEVuZCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRyYXdOb2RlLm9uKFwidG91Y2hjYW5jZWxcIiwgdGhpcy5vblRvdWNoRW5kLCB0aGlzKTtcbiAgICAgICAgfSwgMjAwMCk7XG4gICAgfVxuXG4gICAgaW5pdERiKCkge1xuICAgICAgICAvL+WIm+W7uuS4gOS4queUu+advyjpnIDkvKDlhaXnlLvmnb/lsLrlr7jvvIzlsIboh6rliqjliJ3lp4vljJYpXG4gICAgICAgIHRoaXMuZGIgPSBuZXcgRHJhd2luZ0JvYXJkKHRoaXMuZHJhd05vZGUud2lkdGgsIHRoaXMuZHJhd05vZGUuaGVpZ2h0KTtcbiAgICAgICAgLy/orr7nva7nlLvmnb/nmoTnu5jlm77popzoibLvvIjmr4/mrKHnu5jliLbliY3pg73lj6/ku6Xph43mlrDorr7nva7vvIlcbiAgICAgICAgdGhpcy5sYXN0TGluZVdpZHRoID0gMTU7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCk7XG4gICAgICAgIC8vIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgICAgIC8v57q/5p2h56uv54K55Lul5ZyG6KeS57uT5bC+XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZUNpcmNsZUVuZCh0cnVlKTtcbiAgICB9XG5cbiAgICBpbml0VGV4dHVyZSgpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmluaXRXaXRoU2l6ZSh0aGlzLmRyYXdOb2RlLndpZHRoLCB0aGlzLmRyYXdOb2RlLmhlaWdodCwgY2MuUmVuZGVyVGV4dHVyZS5EZXB0aFN0ZW5jaWxGb3JtYXQuUkJfRk1UX1M4KTtcbiAgICAgICAgbGV0IHNwZjogY2MuU3ByaXRlRnJhbWUgPSBuZXcgY2MuU3ByaXRlRnJhbWUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5kcmF3Tm9kZS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHNwZjtcbiAgICB9XG5cbiAgICBpbml0UmVhZCgpe1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYSA9IHRoaXMubm9kZS5nZXRDaGlsZEJ5TmFtZShcInRhZ0NhbWVyYVwiKS5nZXRDb21wb25lbnQoY2MuQ2FtZXJhKTtcbiAgICAgICAgdmFyIHJhbmRlciA9IG5ldyBjYy5SZW5kZXJUZXh0dXJlKCk7XG4gICAgICAgIHJhbmRlci5pbml0V2l0aFNpemUodGhpcy5ub2RlLndpZHRoLCB0aGlzLm5vZGUuaGVpZ2h0LCBjYy5SZW5kZXJUZXh0dXJlLkRlcHRoU3RlbmNpbEZvcm1hdC5SQl9GTVRfUzgpO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlID0gcmFuZGVyO1xuICAgICAgICB0aGlzLnRhcmdldENhbWVyYS5yZW5kZXIoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLlrozmiJBcIik7XG4gICAgfVxuXG4gICAgb25Ub3VjaFN0YXJ0KGU6IGNjLkV2ZW50LkV2ZW50VG91Y2gpIHtcbiAgICAgICAgLy/lsIbop6bmkbjkvY3nva7kvZzkuLrnur/mnaHnmoTotbfngrlcbiAgICAgICAgLy/nlLvmnb/kuK3kvb/nlKjnmoTlnZDmoIfns7vvvIzkuI7lm77niYflnZDmoIfns7vkuIDmoLfvvIzljp/ngrnlnKjlt6bkuIrop5LvvIxY6L205ZCR5Y+z5Li65q2j77yMWei9tOWQkeS4i+S4uuato1xuICAgICAgICAvL+aJgOS7pVnovbTlnZDmoIflupTlj43ov4fmnaUsIOi/memHjOeUqGdldExvY2F0aW9uSW5WaWV36ICM5LiN5pivZ2V0TG9jYXRpb25cbiAgIFxuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMudG91Y2hTY2FsZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuc3RhcnRQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgIHRoaXMuZGIubW92ZVRvKHRoaXMucHJlUG9zLngsIHRoaXMucHJlUG9zLnkpO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBvblRvdWNoTW92ZShlOiBjYy5FdmVudC5FdmVudFRvdWNoKSB7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZS5nZXRUb3VjaGVzKCk7XG4gICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdXG4gICAgICAgIHZhciBkZWx0YTEgPSB0b3VjaDEuZ2V0RGVsdGEoKTtcbiAgICAgICAgbGV0IHBvcyA9IGUuZ2V0TG9jYXRpb24oKTtcbiBcbiAgICAgICAgbGV0IHBvczEgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHRvdWNoMS5nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgbGV0IGRzdCA9IHRoaXMuc3RhcnRQb3Muc3ViKHBvczEpLm1hZygpXG4gICAgICAgIC8vIHRoaXMubGFiZWwuc3RyaW5nID0gdG91Y2hlcy5sZW5ndGggKyBcIlwiO1xuICAgICAgICBpZih0b3VjaGVzLmxlbmd0aCA9PSAxICYmIHRoaXMudG91Y2hJZCA8IDEgJiYgIXRoaXMudG91Y2hTY2FsZSAmJiBkc3QgPiA3KXtcbiAgICAgICAgICAgIC8vIGFsZXJ0KFwi5LiN6K+l6L+b5p2lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmVQb3MgPSB0aGlzLmNvbnZlcnRUb0RyYXdOb2RlUG9zKHBvcyk7XG4gICAgICAgICAgICB2YXIgamcgPSB0aGlzLnBkKGUpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDb2xvcihqZylcbiAgICAgICAgICAgIGlmICh0aGlzLmdhbWVTdGF0ZSA9PSBHYW1lU3RhdGUuZHJhd2luZykge1xuICAgICAgICAgICAgICAgIC8v5LuO5LiK5LiA5qyh57uY5Yi257q/5p2h5ZCO55qE57uI54K55byA5aeL5ZCR6byg5qCH5b2T5YmN5L2N572u57uY5Yi257q/5p2hXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5saW5lVG8odGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2FtZVN0YXRlID09IEdhbWVTdGF0ZS5lcmFzaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8g5qmh55qu5pOmXG4gICAgICAgICAgICAgICAgdGhpcy5kYi5jaXJjbGUodGhpcy5wcmVQb3MueCwgdGhpcy5wcmVQb3MueSwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/mr4/mrKHnlLvmnb/kuK3nmoTmlbDmja7mnInlj5jljJblkI7vvIzlj4rml7blsIbmlbDmja7lupTnlKjliLDotLTlm77kuIrvvIzlnKjlsY/luZXkuIrmmL7npLrlh7rmnaVcbiAgICAgICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0b3VjaGVzLmxlbmd0aCA9PSAyKXtcbiAgICAgICAgICAgIHZhciB0b3VjaDEgPSB0b3VjaGVzWzBdLCB0b3VjaDIgPSB0b3VjaGVzWzFdO1xuICAgICAgICAgICAgdmFyIGRlbHRhMSA9IHRvdWNoMS5nZXREZWx0YSgpLCBkZWx0YTIgPSB0b3VjaDIuZ2V0RGVsdGEoKTtcbiAgICAgICAgICAgIHZhciB0b3VjaFBvaW50MSA9IHRoaXMubm9kZS5wYXJlbnQuY29udmVydFRvTm9kZVNwYWNlQVIodG91Y2gxLmdldExvY2F0aW9uKCkpO1xuICAgICAgICAgICAgdmFyIHRvdWNoUG9pbnQyID0gdGhpcy5ub2RlLnBhcmVudC5jb252ZXJ0VG9Ob2RlU3BhY2VBUih0b3VjaDIuZ2V0TG9jYXRpb24oKSk7XG5cbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRvdWNoUG9pbnQxLnN1Yih0b3VjaFBvaW50Mik7XG4gICAgICAgICAgICB2YXIgZGVsdGEgPSBkZWx0YTEuc3ViKGRlbHRhMik7XG4gICAgICAgICAgICB2YXIgc2NhbGUgPSAxO1xuXG4gICAgICAgICAgICBpZihNYXRoLmFicyhkaXN0YW5jZS54KSA+IE1hdGguYWJzKGRpc3RhbmNlLnkpKXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS54ICsgZGVsdGEueCkgLyBkaXN0YW5jZS54ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBzY2FsZSA9IChkaXN0YW5jZS55ICsgZGVsdGEueSkgLyBkaXN0YW5jZS55ICogdGhpcy5ub2RlLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoc2NhbGUgPiAyICkgc2NhbGUgPSAyO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnNjYWxlID0gc2NhbGUgPD0gMC4xID8gMC4xOiBzY2FsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVG91Y2hFbmQoZTogY2MuRXZlbnQuRXZlbnRUb3VjaCkge1xuICAgICAgICB0aGlzLnRvdWNoSWQgPSBlLmdldElEKCk7XG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAxKSB0aGlzLnRvdWNoU2NhbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGRIaXN0b3J5KCk7XG4gICAgfVxuXG4gICAgcGQoZXZlbnQpe1xuICAgICAgICBsZXQgY2hhID0gMjtcbiAgICAgICAgdmFyIHBvcyA9IGV2ZW50LmdldExvY2F0aW9uKCk7XG4gICAgICAgIHZhciBqZyA9IGZhbHNlO1xuICAgICAgICBmb3IobGV0IGk9LWNoYTsgaTxjaGE7aSsrKXtcbiAgICAgICAgICAgIGxldCBwb3N0aW9uID0gY2MudjIoKTtcbiAgICAgICAgICAgIHBvc3Rpb24ueCA9IHBvcy54ICsgaTtcbiAgICAgICAgICAgIGZvcihsZXQgaiA9LWNoYTsgajxjaGE7IGorKyl7XG4gICAgICAgICAgICAgICAgcG9zdGlvbi55ID0gcG9zLnkgKyBqO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5qOA5rWL54K5OlwiLHBvc3Rpb24ueCxwb3N0aW9uLnkpO1xuICAgICAgICAgICAgICAgIGxldCBpbWcgPSB0aGlzLmdldEdyYXBoaXNEYXRhKHBvc3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmKChpbWdbMF0gIT0gMjU1ICYmIGltZ1sxXSE9MjU1ICYmIGltZ1syXSE9MjU1KSl7XG4gICAgICAgICAgICAgICAgICAgIGpnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaiA9IDEwMDAwOyBpID0gMTAwMDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICBcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gamc7XG5cbiAgICB9XG5cbiAgICBjb252ZXJ0VG9EcmF3Tm9kZVBvcyh3b3JsZFBvczogY2MuVmVjMikge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5kcmF3Tm9kZS5jb252ZXJ0VG9Ob2RlU3BhY2VBUih3b3JsZFBvcyk7XG4gICAgICAgIHBvcy54ICs9IHRoaXMuZHJhd05vZGUud2lkdGggKiB0aGlzLmRyYXdOb2RlLmFuY2hvclg7XG4gICAgICAgIHBvcy55ICs9IHRoaXMuZHJhd05vZGUuaGVpZ2h0ICogdGhpcy5kcmF3Tm9kZS5hbmNob3JZO1xuICAgICAgICBwb3MueSA9IHRoaXMuZHJhd05vZGUuaGVpZ2h0IC0gcG9zLnk7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgYWRkSGlzdG9yeSgpIHtcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmRiLmNvcHlEYXRhKCk7XG4gICAgICAgIGxldCB1Y29weSA9IG5ldyBVaW50OEFycmF5KGNvcHkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh7IGRhdGE6IHVjb3B5IH0pO1xuICAgICAgICAvLyBjYy5sb2coJ+WOhuWPsuatpemqpDogJywgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZHJhd1RvSW1nKCkge1xuICAgICAgICAvL+iOt+WPlueUu+adv+S4ree7mOWItueahOWbvuahiOaVsOaNrlxuICAgICAgICBsZXQgZGF0YTogVWludDhBcnJheSA9IHRoaXMuZGIuZ2V0RGF0YSgpO1xuICAgICAgICAvL+WwhuaVsOaNruS8oOmAkue7mei0tOWbvuWvueixoVxuICAgICAgICB0aGlzLnRleHR1cmUuaW5pdFdpdGhEYXRhKGRhdGEsIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvbG9yKHJlZCl7XG4gICAgICAgIGlmKCFyZWQpIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5lcnJDb2xvci5yLCB0aGlzLmVyckNvbG9yLmcsIHRoaXMuZXJyQ29sb3IuYiwgdGhpcy5lcnJDb2xvci5hKVxuICAgICAgICBlbHNlIHRoaXMuZGIuc2V0Q29sb3IodGhpcy5sYXN0Q29sb3IuciwgdGhpcy5sYXN0Q29sb3IuZywgdGhpcy5sYXN0Q29sb3IuYiwgdGhpcy5sYXN0Q29sb3IuYSk7XG4gICAgfVxuXG4gICAgZ2V0R3JhcGhpc0RhdGEocG9pbnQpe1xuICAgICAgICBsZXQgVWludDggPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgVWludDggPSB0aGlzLnRhcmdldENhbWVyYS50YXJnZXRUZXh0dXJlLnJlYWRQaXhlbHMoVWludDgscG9pbnQueCxwb2ludC55LDEsMSk7XG5cbiAgICAgICAgcmV0dXJuIFVpbnQ4O1xuICAgIH1cblxuXG4gICAgb25CdG5EcmF3KCkge1xuICAgICAgICB0aGlzLmRiLnNldExpbmVXaWR0aCh0aGlzLmxhc3RMaW5lV2lkdGgpO1xuICAgICAgICB0aGlzLmRiLnNldENvbG9yKHRoaXMubGFzdENvbG9yLnIsIHRoaXMubGFzdENvbG9yLmcsIHRoaXMubGFzdENvbG9yLmIsIHRoaXMubGFzdENvbG9yLmEpO1xuICAgICAgICB0aGlzLmdhbWVTdGF0ZSA9IEdhbWVTdGF0ZS5kcmF3aW5nO1xuICAgIH1cblxuICAgIG9uQnRuRXJhc2UoKSB7XG4gICAgICAgIHRoaXMuZGIuc2V0TGluZVdpZHRoKHRoaXMubGFzdExpbmVXaWR0aCAqIDMpO1xuICAgICAgICAvLyDmqaHnmq7mk6bnmoTpopzoibLkuI3og73mmK8oMCwwLDAsMCks5Zug5Li66L+Z5qC35Lya5ZKMRHJhd2luZ0JvYXJk6YeM55qE6buY6K6k6aKc6Imy55u45ZCM5a+86Ie057uY5Yi26Lez6L+HXG4gICAgICAgIHRoaXMuZGIuc2V0Q29sb3IoMjU1LCAyNTUsIDI1NSwgMCk7XG4gICAgICAgIHRoaXMuZ2FtZVN0YXRlID0gR2FtZVN0YXRlLmVyYXNpbmc7XG5cbiAgICB9XG5cbiAgICBvbkJ0bkNsZWFyKCkge1xuICAgICAgICB0aGlzLmRiLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZHJhd1RvSW1nKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5zcGxpY2UoMCwgdGhpcy5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgb25CdG5SZXZva2UoKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wb3AoKTtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhOiBVaW50OEFycmF5ID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5kYi5zZXREYXRhKGRhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5pbml0V2l0aERhdGEodGhpcy5kYi5nZXREYXRhKCksIGNjLlRleHR1cmUyRC5QaXhlbEZvcm1hdC5SR0JBODg4OCwgdGhpcy5kYi53aWR0aCwgdGhpcy5kYi5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkJ0bkNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2MubG9nKCfljoblj7LorrDlvZXliankvZk6ICcsIHRoaXMuaGlzdG9yeS5sZW5ndGgpO1xuICAgIH1cblxuICAgIG9uQnRuU2F2ZSgpIHtcbiAgICAgICAgaWYgKGNjLnN5cy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHRoaXMuZHJhd05vZGUud2lkdGg7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy5kcmF3Tm9kZS5oZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMuY2FwdHVyZUNhbWVyYS5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gbmV3IGNjLlJlbmRlclRleHR1cmUoKTtcbiAgICAgICAgICAgIHRleHR1cmUuaW5pdFdpdGhTaXplKHdpZHRoLCBoZWlnaHQsIGNjLlJlbmRlclRleHR1cmUuRGVwdGhTdGVuY2lsRm9ybWF0LlJCX0ZNVF9TOCk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEudGFyZ2V0VGV4dHVyZSA9IHRleHR1cmU7XG5cbiAgICAgICAgICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICBsZXQgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEucmVuZGVyKCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRleHR1cmUucmVhZFBpeGVscygpO1xuICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHJlbmRlciBkYXRhXG4gICAgICAgICAgICBsZXQgcm93Qnl0ZXMgPSB3aWR0aCAqIDQ7XG4gICAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNyb3cgPSBoZWlnaHQgLSAxIC0gcm93O1xuICAgICAgICAgICAgICAgIGxldCBpbWFnZURhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCAxKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBzcm93ICogd2lkdGggKiA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Qnl0ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZURhdGEuZGF0YVtpXSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIC8vIGNjLmxvZygnaWFtZ2UtYmFzZTY0OicsIGRhdGFVcmwpO1xuICAgICAgICAgICAgbGV0IHNhdmVMaW5rOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnYScpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuaHJlZiA9IGRhdGFVcmw7XG4gICAgICAgICAgICBzYXZlTGluay5kb3dubG9hZCA9IFN0cmluZyhEYXRlLm5vdygpKSArICcucG5nJztcbiAgICAgICAgICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuICAgICAgICAgICAgZXZlbnQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgdHJ1ZSwgZmFsc2UsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgICAgICAgICAgc2F2ZUxpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlT25jZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmVDYW1lcmEuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMC4xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNjLndhcm4oJ+aaguaXtuWPquaUr+aMgXdlYuerr+S/neWtmOWbvueJhycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlIChkdCkge1xuICAgICAgICBcbiAgICB9XG59XG4iXX0=