ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
336 lines • 31.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Texture, TextureWrap, TextureRegion } from "./Texture";
var TextureAtlas = /** @class */ (function () {
function TextureAtlas(atlasText, textureLoader) {
this.pages = new Array();
this.regions = new Array();
this.load(atlasText, textureLoader);
}
/**
* @private
* @param {?} atlasText
* @param {?} textureLoader
* @return {?}
*/
TextureAtlas.prototype.load = /**
* @private
* @param {?} atlasText
* @param {?} textureLoader
* @return {?}
*/
function (atlasText, textureLoader) {
if (textureLoader == null)
throw new Error("textureLoader cannot be null.");
/** @type {?} */
var reader = new TextureAtlasReader(atlasText);
/** @type {?} */
var tuple = new Array(4);
/** @type {?} */
var page = null;
while (true) {
/** @type {?} */
var line = reader.readLine();
if (line == null)
break;
line = line.trim();
if (line.length == 0)
page = null;
else if (!page) {
page = new TextureAtlasPage();
page.name = line;
if (reader.readTuple(tuple) == 2) {
// size is only optional for an atlas packed with an old TexturePacker.
page.width = parseInt(tuple[0]);
page.height = parseInt(tuple[1]);
reader.readTuple(tuple);
}
// page.format = Format[tuple[0]]; we don't need format in WebGL
reader.readTuple(tuple);
page.minFilter = Texture.filterFromString(tuple[0]);
page.magFilter = Texture.filterFromString(tuple[1]);
/** @type {?} */
var direction = reader.readValue();
page.uWrap = TextureWrap.ClampToEdge;
page.vWrap = TextureWrap.ClampToEdge;
if (direction == "x")
page.uWrap = TextureWrap.Repeat;
else if (direction == "y")
page.vWrap = TextureWrap.Repeat;
else if (direction == "xy")
page.uWrap = page.vWrap = TextureWrap.Repeat;
page.texture = textureLoader(line);
page.texture.setFilters(page.minFilter, page.magFilter);
page.texture.setWraps(page.uWrap, page.vWrap);
page.width = page.texture.getImage().width;
page.height = page.texture.getImage().height;
this.pages.push(page);
}
else {
/** @type {?} */
var region = new TextureAtlasRegion();
region.name = line;
region.page = page;
/** @type {?} */
var rotateValue = reader.readValue();
if (rotateValue.toLocaleLowerCase() == "true") {
region.degrees = 90;
}
else if (rotateValue.toLocaleLowerCase() == "false") {
region.degrees = 0;
}
else {
region.degrees = parseFloat(rotateValue);
}
region.rotate = region.degrees == 90;
reader.readTuple(tuple);
/** @type {?} */
var x = parseInt(tuple[0]);
/** @type {?} */
var y = parseInt(tuple[1]);
reader.readTuple(tuple);
/** @type {?} */
var width = parseInt(tuple[0]);
/** @type {?} */
var height = parseInt(tuple[1]);
region.u = x / page.width;
region.v = y / page.height;
if (region.rotate) {
region.u2 = (x + height) / page.width;
region.v2 = (y + width) / page.height;
}
else {
region.u2 = (x + width) / page.width;
region.v2 = (y + height) / page.height;
}
region.x = x;
region.y = y;
region.width = Math.abs(width);
region.height = Math.abs(height);
if (reader.readTuple(tuple) == 4) {
// split is optional
// region.splits = new Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
if (reader.readTuple(tuple) == 4) {
// pad is optional, but only present with splits
//region.pads = Vector.<int>(parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3]));
reader.readTuple(tuple);
}
}
region.originalWidth = parseInt(tuple[0]);
region.originalHeight = parseInt(tuple[1]);
reader.readTuple(tuple);
region.offsetX = parseInt(tuple[0]);
region.offsetY = parseInt(tuple[1]);
region.index = parseInt(reader.readValue());
region.texture = page.texture;
this.regions.push(region);
}
}
};
/**
* @param {?} name
* @return {?}
*/
TextureAtlas.prototype.findRegion = /**
* @param {?} name
* @return {?}
*/
function (name) {
for (var i = 0; i < this.regions.length; i++) {
if (this.regions[i].name == name) {
return this.regions[i];
}
}
return null;
};
/**
* @return {?}
*/
TextureAtlas.prototype.dispose = /**
* @return {?}
*/
function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].texture.dispose();
}
};
return TextureAtlas;
}());
export { TextureAtlas };
if (false) {
/** @type {?} */
TextureAtlas.prototype.pages;
/** @type {?} */
TextureAtlas.prototype.regions;
}
var TextureAtlasReader = /** @class */ (function () {
function TextureAtlasReader(text) {
this.index = 0;
this.lines = text.split(/\r\n|\r|\n/);
}
/**
* @return {?}
*/
TextureAtlasReader.prototype.readLine = /**
* @return {?}
*/
function () {
if (this.index >= this.lines.length)
return null;
return this.lines[this.index++];
};
/**
* @return {?}
*/
TextureAtlasReader.prototype.readValue = /**
* @return {?}
*/
function () {
/** @type {?} */
var line = this.readLine();
/** @type {?} */
var colon = line.indexOf(":");
if (colon == -1)
throw new Error("Invalid line: " + line);
return line.substring(colon + 1).trim();
};
/**
* @param {?} tuple
* @return {?}
*/
TextureAtlasReader.prototype.readTuple = /**
* @param {?} tuple
* @return {?}
*/
function (tuple) {
/** @type {?} */
var line = this.readLine();
/** @type {?} */
var colon = line.indexOf(":");
if (colon == -1)
throw new Error("Invalid line: " + line);
/** @type {?} */
var i = 0;
/** @type {?} */
var lastMatch = colon + 1;
for (; i < 3; i++) {
/** @type {?} */
var comma = line.indexOf(",", lastMatch);
if (comma == -1)
break;
tuple[i] = line.substr(lastMatch, comma - lastMatch).trim();
lastMatch = comma + 1;
}
tuple[i] = line.substring(lastMatch).trim();
return i + 1;
};
return TextureAtlasReader;
}());
if (false) {
/** @type {?} */
TextureAtlasReader.prototype.lines;
/** @type {?} */
TextureAtlasReader.prototype.index;
}
var TextureAtlasPage = /** @class */ (function () {
function TextureAtlasPage() {
}
return TextureAtlasPage;
}());
export { TextureAtlasPage };
if (false) {
/** @type {?} */
TextureAtlasPage.prototype.name;
/** @type {?} */
TextureAtlasPage.prototype.minFilter;
/** @type {?} */
TextureAtlasPage.prototype.magFilter;
/** @type {?} */
TextureAtlasPage.prototype.uWrap;
/** @type {?} */
TextureAtlasPage.prototype.vWrap;
/** @type {?} */
TextureAtlasPage.prototype.texture;
/** @type {?} */
TextureAtlasPage.prototype.width;
/** @type {?} */
TextureAtlasPage.prototype.height;
}
var TextureAtlasRegion = /** @class */ (function (_super) {
tslib_1.__extends(TextureAtlasRegion, _super);
function TextureAtlasRegion() {
return _super !== null && _super.apply(this, arguments) || this;
}
return TextureAtlasRegion;
}(TextureRegion));
export { TextureAtlasRegion };
if (false) {
/** @type {?} */
TextureAtlasRegion.prototype.page;
/** @type {?} */
TextureAtlasRegion.prototype.name;
/** @type {?} */
TextureAtlasRegion.prototype.x;
/** @type {?} */
TextureAtlasRegion.prototype.y;
/** @type {?} */
TextureAtlasRegion.prototype.index;
/** @type {?} */
TextureAtlasRegion.prototype.rotate;
/** @type {?} */
TextureAtlasRegion.prototype.degrees;
/** @type {?} */
TextureAtlasRegion.prototype.texture;
/** @type {?} */
TextureAtlasRegion.prototype.u;
/** @type {?} */
TextureAtlasRegion.prototype.v;
/** @type {?} */
TextureAtlasRegion.prototype.u2;
/** @type {?} */
TextureAtlasRegion.prototype.v2;
/** @type {?} */
TextureAtlasRegion.prototype.width;
/** @type {?} */
TextureAtlasRegion.prototype.height;
/** @type {?} */
TextureAtlasRegion.prototype.originalWidth;
/** @type {?} */
TextureAtlasRegion.prototype.originalHeight;
/** @type {?} */
TextureAtlasRegion.prototype.offsetX;
/** @type {?} */
TextureAtlasRegion.prototype.offsetY;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dHVyZUF0bGFzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvVGV4dHVyZUF0bGFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBaUIsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRS9FO0lBR0Usc0JBQVksU0FBaUIsRUFBRSxhQUFvQztRQUZuRSxVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFzQixDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7Ozs7SUFDTywyQkFBSTs7Ozs7O0lBQVosVUFBYSxTQUFpQixFQUFFLGFBQW9DO1FBQ2xFLElBQUksYUFBYSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7O1lBQ3hFLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQzs7WUFDMUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFTLENBQUMsQ0FBQzs7WUFDNUIsSUFBSSxHQUFxQixJQUFJO1FBQ2pDLE9BQU8sSUFBSSxFQUFFOztnQkFDUCxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUM1QixJQUFJLElBQUksSUFBSSxJQUFJO2dCQUFFLE1BQU07WUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDO2lCQUM3QixJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNkLElBQUksR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNoQyx1RUFBdUU7b0JBQ3ZFLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDekI7Z0JBQ0QsZ0VBQWdFO2dCQUNoRSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNoRCxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7Z0JBQ3JDLElBQUksU0FBUyxJQUFJLEdBQUc7b0JBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO3FCQUNqRCxJQUFJLFNBQVMsSUFBSSxHQUFHO29CQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztxQkFDdEQsSUFBSSxTQUFTLElBQUksSUFBSTtvQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZCO2lCQUFNOztvQkFDRCxNQUFNLEdBQXVCLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3pELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7b0JBQ2YsV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BDLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksTUFBTSxFQUFFO29CQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztpQkFDckI7cUJBQU0sSUFBSSxXQUFXLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxPQUFPLEVBQUU7b0JBQ3JELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDTCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDMUM7Z0JBQ0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ3BCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztvQkFDdEIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7O29CQUNwQixLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQzFCLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMxQixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7b0JBQ2pCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDdEMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2lCQUN2QztxQkFBTTtvQkFDTCxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3JDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDeEM7Z0JBQ0QsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ2hDLG9CQUFvQjtvQkFDcEIsb0hBQW9IO29CQUNwSCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNoQyxnREFBZ0Q7d0JBQ2hELDZHQUE2Rzt3QkFDN0csTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDekI7aUJBQ0Y7Z0JBQ0QsTUFBTSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUNELGlDQUFVOzs7O0lBQVYsVUFBVyxJQUFZO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7SUFDRCw4QkFBTzs7O0lBQVA7UUFDRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBM0dELElBMkdDOzs7O0lBMUdDLDZCQUFzQzs7SUFDdEMsK0JBQTBDOztBQTBHNUM7SUFHRSw0QkFBWSxJQUFZO1FBRHhCLFVBQUssR0FBVyxDQUFDLENBQUM7UUFFaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Ozs7SUFDRCxxQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Ozs7SUFDRCxzQ0FBUzs7O0lBQVQ7O1lBQ00sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7O1lBQ3RCLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUM3QixJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7Ozs7SUFDRCxzQ0FBUzs7OztJQUFULFVBQVUsS0FBb0I7O1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFOztZQUN0QixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQzs7WUFDdEQsQ0FBQyxHQUFHLENBQUM7O1lBQ1AsU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7Z0JBQ2IsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztZQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQUUsTUFBTTtZQUN2QixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVELFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyxBQS9CRCxJQStCQzs7O0lBOUJDLG1DQUFxQjs7SUFDckIsbUNBQWtCOztBQThCcEI7SUFBQTtJQVNBLENBQUM7SUFBRCx1QkFBQztBQUFELENBQUMsQUFURCxJQVNDOzs7O0lBUkMsZ0NBQWE7O0lBQ2IscUNBQXlCOztJQUN6QixxQ0FBeUI7O0lBQ3pCLGlDQUFtQjs7SUFDbkIsaUNBQW1COztJQUNuQixtQ0FBaUI7O0lBQ2pCLGlDQUFjOztJQUNkLGtDQUFlOztBQUVqQjtJQUF3Qyw4Q0FBYTtJQUFyRDs7SUFtQkEsQ0FBQztJQUFELHlCQUFDO0FBQUQsQ0FBQyxBQW5CRCxDQUF3QyxhQUFhLEdBbUJwRDs7OztJQWxCQyxrQ0FBdUI7O0lBQ3ZCLGtDQUFhOztJQUNiLCtCQUFVOztJQUNWLCtCQUFVOztJQUNWLG1DQUFjOztJQUNkLG9DQUFnQjs7SUFDaEIscUNBQWdCOztJQUNoQixxQ0FBaUI7O0lBQ2pCLCtCQUFVOztJQUNWLCtCQUFVOztJQUNWLGdDQUFXOztJQUNYLGdDQUFXOztJQUNYLG1DQUFjOztJQUNkLG9DQUFlOztJQUNmLDJDQUFzQjs7SUFDdEIsNENBQXVCOztJQUN2QixxQ0FBZ0I7O0lBQ2hCLHFDQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gXCIuL1V0aWxzXCI7XHJcbmltcG9ydCB7IFRleHR1cmUsIFRleHR1cmVXcmFwLCBUZXh0dXJlRmlsdGVyLCBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4vVGV4dHVyZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhcyBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xyXG4gIHBhZ2VzID0gbmV3IEFycmF5PFRleHR1cmVBdGxhc1BhZ2U+KCk7XHJcbiAgcmVnaW9ucyA9IG5ldyBBcnJheTxUZXh0dXJlQXRsYXNSZWdpb24+KCk7XHJcbiAgY29uc3RydWN0b3IoYXRsYXNUZXh0OiBzdHJpbmcsIHRleHR1cmVMb2FkZXI6IChwYXRoOiBzdHJpbmcpID0+IGFueSkge1xyXG4gICAgdGhpcy5sb2FkKGF0bGFzVGV4dCwgdGV4dHVyZUxvYWRlcik7XHJcbiAgfVxyXG4gIHByaXZhdGUgbG9hZChhdGxhc1RleHQ6IHN0cmluZywgdGV4dHVyZUxvYWRlcjogKHBhdGg6IHN0cmluZykgPT4gYW55KSB7XHJcbiAgICBpZiAodGV4dHVyZUxvYWRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ0ZXh0dXJlTG9hZGVyIGNhbm5vdCBiZSBudWxsLlwiKTtcclxuICAgIGxldCByZWFkZXIgPSBuZXcgVGV4dHVyZUF0bGFzUmVhZGVyKGF0bGFzVGV4dCk7XHJcbiAgICBsZXQgdHVwbGUgPSBuZXcgQXJyYXk8c3RyaW5nPig0KTtcclxuICAgIGxldCBwYWdlOiBUZXh0dXJlQXRsYXNQYWdlID0gbnVsbDtcclxuICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgIGxldCBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7XHJcbiAgICAgIGlmIChsaW5lID09IG51bGwpIGJyZWFrO1xyXG4gICAgICBsaW5lID0gbGluZS50cmltKCk7XHJcbiAgICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKSBwYWdlID0gbnVsbDtcclxuICAgICAgZWxzZSBpZiAoIXBhZ2UpIHtcclxuICAgICAgICBwYWdlID0gbmV3IFRleHR1cmVBdGxhc1BhZ2UoKTtcclxuICAgICAgICBwYWdlLm5hbWUgPSBsaW5lO1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSAyKSB7XHJcbiAgICAgICAgICAvLyBzaXplIGlzIG9ubHkgb3B0aW9uYWwgZm9yIGFuIGF0bGFzIHBhY2tlZCB3aXRoIGFuIG9sZCBUZXh0dXJlUGFja2VyLlxyXG4gICAgICAgICAgcGFnZS53aWR0aCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICAgIHBhZ2UuaGVpZ2h0ID0gcGFyc2VJbnQodHVwbGVbMV0pO1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHBhZ2UuZm9ybWF0ID0gRm9ybWF0W3R1cGxlWzBdXTsgd2UgZG9uJ3QgbmVlZCBmb3JtYXQgaW4gV2ViR0xcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBwYWdlLm1pbkZpbHRlciA9IFRleHR1cmUuZmlsdGVyRnJvbVN0cmluZyh0dXBsZVswXSk7XHJcbiAgICAgICAgcGFnZS5tYWdGaWx0ZXIgPSBUZXh0dXJlLmZpbHRlckZyb21TdHJpbmcodHVwbGVbMV0pO1xyXG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSByZWFkZXIucmVhZFZhbHVlKCk7XHJcbiAgICAgICAgcGFnZS51V3JhcCA9IFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlO1xyXG4gICAgICAgIHBhZ2UudldyYXAgPSBUZXh0dXJlV3JhcC5DbGFtcFRvRWRnZTtcclxuICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwieFwiKSBwYWdlLnVXcmFwID0gVGV4dHVyZVdyYXAuUmVwZWF0O1xyXG4gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBcInlcIikgcGFnZS52V3JhcCA9IFRleHR1cmVXcmFwLlJlcGVhdDtcclxuICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gXCJ4eVwiKVxyXG4gICAgICAgICAgcGFnZS51V3JhcCA9IHBhZ2UudldyYXAgPSBUZXh0dXJlV3JhcC5SZXBlYXQ7XHJcbiAgICAgICAgcGFnZS50ZXh0dXJlID0gdGV4dHVyZUxvYWRlcihsaW5lKTtcclxuICAgICAgICBwYWdlLnRleHR1cmUuc2V0RmlsdGVycyhwYWdlLm1pbkZpbHRlciwgcGFnZS5tYWdGaWx0ZXIpO1xyXG4gICAgICAgIHBhZ2UudGV4dHVyZS5zZXRXcmFwcyhwYWdlLnVXcmFwLCBwYWdlLnZXcmFwKTtcclxuICAgICAgICBwYWdlLndpZHRoID0gcGFnZS50ZXh0dXJlLmdldEltYWdlKCkud2lkdGg7XHJcbiAgICAgICAgcGFnZS5oZWlnaHQgPSBwYWdlLnRleHR1cmUuZ2V0SW1hZ2UoKS5oZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5wYWdlcy5wdXNoKHBhZ2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByZWdpb246IFRleHR1cmVBdGxhc1JlZ2lvbiA9IG5ldyBUZXh0dXJlQXRsYXNSZWdpb24oKTtcclxuICAgICAgICByZWdpb24ubmFtZSA9IGxpbmU7XHJcbiAgICAgICAgcmVnaW9uLnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIGxldCByb3RhdGVWYWx1ZSA9IHJlYWRlci5yZWFkVmFsdWUoKTtcclxuICAgICAgICBpZiAocm90YXRlVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSBcInRydWVcIikge1xyXG4gICAgICAgICAgcmVnaW9uLmRlZ3JlZXMgPSA5MDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJvdGF0ZVZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJmYWxzZVwiKSB7XHJcbiAgICAgICAgICByZWdpb24uZGVncmVlcyA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlZ2lvbi5kZWdyZWVzID0gcGFyc2VGbG9hdChyb3RhdGVWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlZ2lvbi5yb3RhdGUgPSByZWdpb24uZGVncmVlcyA9PSA5MDtcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBsZXQgeCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICBsZXQgeSA9IHBhcnNlSW50KHR1cGxlWzFdKTtcclxuICAgICAgICByZWFkZXIucmVhZFR1cGxlKHR1cGxlKTtcclxuICAgICAgICBsZXQgd2lkdGggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KHR1cGxlWzFdKTtcclxuICAgICAgICByZWdpb24udSA9IHggLyBwYWdlLndpZHRoO1xyXG4gICAgICAgIHJlZ2lvbi52ID0geSAvIHBhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIGlmIChyZWdpb24ucm90YXRlKSB7XHJcbiAgICAgICAgICByZWdpb24udTIgPSAoeCArIGhlaWdodCkgLyBwYWdlLndpZHRoO1xyXG4gICAgICAgICAgcmVnaW9uLnYyID0gKHkgKyB3aWR0aCkgLyBwYWdlLmhlaWdodDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVnaW9uLnUyID0gKHggKyB3aWR0aCkgLyBwYWdlLndpZHRoO1xyXG4gICAgICAgICAgcmVnaW9uLnYyID0gKHkgKyBoZWlnaHQpIC8gcGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlZ2lvbi54ID0geDtcclxuICAgICAgICByZWdpb24ueSA9IHk7XHJcbiAgICAgICAgcmVnaW9uLndpZHRoID0gTWF0aC5hYnMod2lkdGgpO1xyXG4gICAgICAgIHJlZ2lvbi5oZWlnaHQgPSBNYXRoLmFicyhoZWlnaHQpO1xyXG4gICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSA0KSB7XHJcbiAgICAgICAgICAvLyBzcGxpdCBpcyBvcHRpb25hbFxyXG4gICAgICAgICAgLy8gcmVnaW9uLnNwbGl0cyA9IG5ldyBWZWN0b3IuPGludD4ocGFyc2VJbnQodHVwbGVbMF0pLCBwYXJzZUludCh0dXBsZVsxXSksIHBhcnNlSW50KHR1cGxlWzJdKSwgcGFyc2VJbnQodHVwbGVbM10pKTtcclxuICAgICAgICAgIGlmIChyZWFkZXIucmVhZFR1cGxlKHR1cGxlKSA9PSA0KSB7XHJcbiAgICAgICAgICAgIC8vIHBhZCBpcyBvcHRpb25hbCwgYnV0IG9ubHkgcHJlc2VudCB3aXRoIHNwbGl0c1xyXG4gICAgICAgICAgICAvL3JlZ2lvbi5wYWRzID0gVmVjdG9yLjxpbnQ+KHBhcnNlSW50KHR1cGxlWzBdKSwgcGFyc2VJbnQodHVwbGVbMV0pLCBwYXJzZUludCh0dXBsZVsyXSksIHBhcnNlSW50KHR1cGxlWzNdKSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkVHVwbGUodHVwbGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZWdpb24ub3JpZ2luYWxXaWR0aCA9IHBhcnNlSW50KHR1cGxlWzBdKTtcclxuICAgICAgICByZWdpb24ub3JpZ2luYWxIZWlnaHQgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVhZGVyLnJlYWRUdXBsZSh0dXBsZSk7XHJcbiAgICAgICAgcmVnaW9uLm9mZnNldFggPSBwYXJzZUludCh0dXBsZVswXSk7XHJcbiAgICAgICAgcmVnaW9uLm9mZnNldFkgPSBwYXJzZUludCh0dXBsZVsxXSk7XHJcbiAgICAgICAgcmVnaW9uLmluZGV4ID0gcGFyc2VJbnQocmVhZGVyLnJlYWRWYWx1ZSgpKTtcclxuICAgICAgICByZWdpb24udGV4dHVyZSA9IHBhZ2UudGV4dHVyZTtcclxuICAgICAgICB0aGlzLnJlZ2lvbnMucHVzaChyZWdpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZpbmRSZWdpb24obmFtZTogc3RyaW5nKTogVGV4dHVyZUF0bGFzUmVnaW9uIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZWdpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnJlZ2lvbnNbaV0ubmFtZSA9PSBuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaW9uc1tpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5wYWdlc1tpXS50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuY2xhc3MgVGV4dHVyZUF0bGFzUmVhZGVyIHtcclxuICBsaW5lczogQXJyYXk8c3RyaW5nPjtcclxuICBpbmRleDogbnVtYmVyID0gMDtcclxuICBjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRoaXMubGluZXMgPSB0ZXh0LnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pO1xyXG4gIH1cclxuICByZWFkTGluZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIHRoaXMubGluZXNbdGhpcy5pbmRleCsrXTtcclxuICB9XHJcbiAgcmVhZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgbGluZSA9IHRoaXMucmVhZExpbmUoKTtcclxuICAgIGxldCBjb2xvbiA9IGxpbmUuaW5kZXhPZihcIjpcIik7XHJcbiAgICBpZiAoY29sb24gPT0gLTEpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGluZTogXCIgKyBsaW5lKTtcclxuICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhjb2xvbiArIDEpLnRyaW0oKTtcclxuICB9XHJcbiAgcmVhZFR1cGxlKHR1cGxlOiBBcnJheTxzdHJpbmc+KTogbnVtYmVyIHtcclxuICAgIGxldCBsaW5lID0gdGhpcy5yZWFkTGluZSgpO1xyXG4gICAgbGV0IGNvbG9uID0gbGluZS5pbmRleE9mKFwiOlwiKTtcclxuICAgIGlmIChjb2xvbiA9PSAtMSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW5lOiBcIiArIGxpbmUpO1xyXG4gICAgbGV0IGkgPSAwLFxyXG4gICAgICBsYXN0TWF0Y2ggPSBjb2xvbiArIDE7XHJcbiAgICBmb3IgKDsgaSA8IDM7IGkrKykge1xyXG4gICAgICBsZXQgY29tbWEgPSBsaW5lLmluZGV4T2YoXCIsXCIsIGxhc3RNYXRjaCk7XHJcbiAgICAgIGlmIChjb21tYSA9PSAtMSkgYnJlYWs7XHJcbiAgICAgIHR1cGxlW2ldID0gbGluZS5zdWJzdHIobGFzdE1hdGNoLCBjb21tYSAtIGxhc3RNYXRjaCkudHJpbSgpO1xyXG4gICAgICBsYXN0TWF0Y2ggPSBjb21tYSArIDE7XHJcbiAgICB9XHJcbiAgICB0dXBsZVtpXSA9IGxpbmUuc3Vic3RyaW5nKGxhc3RNYXRjaCkudHJpbSgpO1xyXG4gICAgcmV0dXJuIGkgKyAxO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgVGV4dHVyZUF0bGFzUGFnZSB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG1pbkZpbHRlcjogVGV4dHVyZUZpbHRlcjtcclxuICBtYWdGaWx0ZXI6IFRleHR1cmVGaWx0ZXI7XHJcbiAgdVdyYXA6IFRleHR1cmVXcmFwO1xyXG4gIHZXcmFwOiBUZXh0dXJlV3JhcDtcclxuICB0ZXh0dXJlOiBUZXh0dXJlO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuZXhwb3J0IGNsYXNzIFRleHR1cmVBdGxhc1JlZ2lvbiBleHRlbmRzIFRleHR1cmVSZWdpb24ge1xyXG4gIHBhZ2U6IFRleHR1cmVBdGxhc1BhZ2U7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbiAgaW5kZXg6IG51bWJlcjtcclxuICByb3RhdGU6IGJvb2xlYW47XHJcbiAgZGVncmVlczogbnVtYmVyO1xyXG4gIHRleHR1cmU6IFRleHR1cmU7XHJcbiAgdTogbnVtYmVyO1xyXG4gIHY6IG51bWJlcjtcclxuICB1MjogbnVtYmVyO1xyXG4gIHYyOiBudW1iZXI7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICBoZWlnaHQ6IG51bWJlcjtcclxuICBvcmlnaW5hbFdpZHRoOiBudW1iZXI7XHJcbiAgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcjtcclxuICBvZmZzZXRYOiBudW1iZXI7XHJcbiAgb2Zmc2V0WTogbnVtYmVyO1xyXG59XHJcbiJdfQ==