UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

224 lines 26.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /****************************************************************************** * 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 { Utils, Color } from "../Utils"; import { VertexAttachment } from "./Attachment"; import { TextureAtlasRegion } from "../TextureAtlas"; export class MeshAttachment extends VertexAttachment { /** * @param {?} name */ constructor(name) { super(name); this.color = new Color(1, 1, 1, 1); this.tempColor = new Color(0, 0, 0, 0); } /** * @return {?} */ updateUVs() { /** @type {?} */ let regionUVs = this.regionUVs; if (this.uvs == null || this.uvs.length != regionUVs.length) this.uvs = Utils.newFloatArray(regionUVs.length); /** @type {?} */ let uvs = this.uvs; /** @type {?} */ let n = this.uvs.length; /** @type {?} */ let u = this.region.u; /** @type {?} */ let v = this.region.v; /** @type {?} */ let width = 0; /** @type {?} */ let height = 0; if (this.region instanceof TextureAtlasRegion) { /** @type {?} */ let region = this.region; /** @type {?} */ let textureWidth = region.texture.getImage().width; /** @type {?} */ let textureHeight = region.texture.getImage().height; switch (region.degrees) { case 90: u -= (region.originalHeight - region.offsetY - region.height) / textureWidth; v -= (region.originalWidth - region.offsetX - region.width) / textureHeight; width = region.originalHeight / textureWidth; height = region.originalWidth / textureHeight; for (let i = 0; i < n; i += 2) { uvs[i] = u + regionUVs[i + 1] * width; uvs[i + 1] = v + (1 - regionUVs[i]) * height; } return; case 180: u -= (region.originalWidth - region.offsetX - region.width) / textureWidth; v -= region.offsetY / textureHeight; width = region.originalWidth / textureWidth; height = region.originalHeight / textureHeight; for (let i = 0; i < n; i += 2) { uvs[i] = u + (1 - regionUVs[i]) * width; uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; } return; case 270: u -= region.offsetY / textureWidth; v -= region.offsetX / textureHeight; width = region.originalHeight / textureWidth; height = region.originalWidth / textureHeight; for (let i = 0; i < n; i += 2) { uvs[i] = u + (1 - regionUVs[i + 1]) * width; uvs[i + 1] = v + regionUVs[i] * height; } return; } u -= region.offsetX / textureWidth; v -= (region.originalHeight - region.offsetY - region.height) / textureHeight; width = region.originalWidth / textureWidth; height = region.originalHeight / textureHeight; } else if (this.region == null) { u = v = 0; width = height = 1; } else { width = this.region.u2 - u; height = this.region.v2 - v; } for (let i = 0; i < n; i += 2) { uvs[i] = u + regionUVs[i] * width; uvs[i + 1] = v + regionUVs[i + 1] * height; } } /** * @return {?} */ getParentMesh() { return this.parentMesh; } /** * @param {?} parentMesh May be null. * @return {?} */ setParentMesh(parentMesh) { this.parentMesh = parentMesh; if (parentMesh != null) { this.bones = parentMesh.bones; this.vertices = parentMesh.vertices; this.worldVerticesLength = parentMesh.worldVerticesLength; this.regionUVs = parentMesh.regionUVs; this.triangles = parentMesh.triangles; this.hullLength = parentMesh.hullLength; this.worldVerticesLength = parentMesh.worldVerticesLength; } } /** * @return {?} */ copy() { if (this.parentMesh != null) return this.newLinkedMesh(); /** @type {?} */ let copy = new MeshAttachment(this.name); copy.region = this.region; copy.path = this.path; copy.color.setFromColor(this.color); this.copyTo(copy); copy.regionUVs = new Array(this.regionUVs.length); Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length); copy.uvs = new Array(this.uvs.length); Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length); copy.triangles = new Array(this.triangles.length); Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length); copy.hullLength = this.hullLength; // Nonessential. if (this.edges != null) { copy.edges = new Array(this.edges.length); Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length); } copy.width = this.width; copy.height = this.height; return copy; } /** * @return {?} */ newLinkedMesh() { /** @type {?} */ let copy = new MeshAttachment(this.name); copy.region = this.region; copy.path = this.path; copy.color.setFromColor(this.color); copy.deformAttachment = this.deformAttachment; copy.setParentMesh(this.parentMesh != null ? this.parentMesh : this); copy.updateUVs(); return copy; } } if (false) { /** @type {?} */ MeshAttachment.prototype.region; /** @type {?} */ MeshAttachment.prototype.path; /** @type {?} */ MeshAttachment.prototype.regionUVs; /** @type {?} */ MeshAttachment.prototype.uvs; /** @type {?} */ MeshAttachment.prototype.triangles; /** @type {?} */ MeshAttachment.prototype.color; /** @type {?} */ MeshAttachment.prototype.width; /** @type {?} */ MeshAttachment.prototype.height; /** @type {?} */ MeshAttachment.prototype.hullLength; /** @type {?} */ MeshAttachment.prototype.edges; /** * @type {?} * @private */ MeshAttachment.prototype.parentMesh; /** @type {?} */ MeshAttachment.prototype.tempColor; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzaEF0dGFjaG1lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BpbmUvIiwic291cmNlcyI6WyJsaWIvc3BpbmUtdHMvY29yZS9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxPQUFPLEVBQWEsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWMsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckQsTUFBTSxPQUFPLGNBQWUsU0FBUSxnQkFBZ0I7Ozs7SUFjbEQsWUFBWSxJQUFZO1FBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVRkLFVBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQU05QixjQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFJbEMsQ0FBQzs7OztJQUVELFNBQVM7O1lBQ0gsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO1FBQzlCLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU07WUFDekQsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDL0MsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHOztZQUNkLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07O1lBQ25CLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBQ25CLENBQUMs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QUFDO1FBRTFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVELGFBQWE7O1lBQ1AsSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7OztJQTdKQyxnQ0FBc0I7O0lBQ3RCLDhCQUFhOztJQUNiLG1DQUE2Qjs7SUFDN0IsNkJBQXVCOztJQUN2QixtQ0FBeUI7O0lBQ3pCLCtCQUE4Qjs7SUFDOUIsK0JBQWM7O0lBQ2QsZ0NBQWU7O0lBQ2Ysb0NBQW1COztJQUNuQiwrQkFBcUI7Ozs7O0lBQ3JCLG9DQUFtQzs7SUFDbkMsbUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxyXG4gKiBMYXN0IHVwZGF0ZWQgTWF5IDEsIDIwMTkuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTksIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xyXG4gKlxyXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcclxuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcclxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcclxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXHJcbiAqXHJcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxyXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXHJcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cclxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTXHJcbiAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcclxuICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU5cclxuICogTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXHJcbiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsXHJcbiAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgQlVTSU5FU1NcclxuICogSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxyXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcclxuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxyXG4gKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgeyBBcnJheUxpa2UsIFV0aWxzLCBDb2xvciB9IGZyb20gXCIuLi9VdGlsc1wiO1xyXG5pbXBvcnQgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmVcIjtcclxuaW1wb3J0IHsgVmVydGV4QXR0YWNobWVudCwgQXR0YWNobWVudCB9IGZyb20gXCIuL0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgVGV4dHVyZUF0bGFzUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmVBdGxhc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1lc2hBdHRhY2htZW50IGV4dGVuZHMgVmVydGV4QXR0YWNobWVudCB7XHJcbiAgcmVnaW9uOiBUZXh0dXJlUmVnaW9uO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICByZWdpb25VVnM6IEFycmF5TGlrZTxudW1iZXI+O1xyXG4gIHV2czogQXJyYXlMaWtlPG51bWJlcj47XHJcbiAgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+O1xyXG4gIGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgaHVsbExlbmd0aDogbnVtYmVyO1xyXG4gIGVkZ2VzOiBBcnJheTxudW1iZXI+O1xyXG4gIHByaXZhdGUgcGFyZW50TWVzaDogTWVzaEF0dGFjaG1lbnQ7XHJcbiAgdGVtcENvbG9yID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVVZzKCkge1xyXG4gICAgbGV0IHJlZ2lvblVWcyA9IHRoaXMucmVnaW9uVVZzO1xyXG4gICAgaWYgKHRoaXMudXZzID09IG51bGwgfHwgdGhpcy51dnMubGVuZ3RoICE9IHJlZ2lvblVWcy5sZW5ndGgpXHJcbiAgICAgIHRoaXMudXZzID0gVXRpbHMubmV3RmxvYXRBcnJheShyZWdpb25VVnMubGVuZ3RoKTtcclxuICAgIGxldCB1dnMgPSB0aGlzLnV2cztcclxuICAgIGxldCBuID0gdGhpcy51dnMubGVuZ3RoO1xyXG4gICAgbGV0IHUgPSB0aGlzLnJlZ2lvbi51LFxyXG4gICAgICB2ID0gdGhpcy5yZWdpb24udixcclxuICAgICAgd2lkdGggPSAwLFxyXG4gICAgICBoZWlnaHQgPSAwO1xyXG4gICAgaWYgKHRoaXMucmVnaW9uIGluc3RhbmNlb2YgVGV4dHVyZUF0bGFzUmVnaW9uKSB7XHJcbiAgICAgIGxldCByZWdpb24gPSB0aGlzLnJlZ2lvbjtcclxuICAgICAgbGV0IHRleHR1cmVXaWR0aCA9IHJlZ2lvbi50ZXh0dXJlLmdldEltYWdlKCkud2lkdGgsXHJcbiAgICAgICAgdGV4dHVyZUhlaWdodCA9IHJlZ2lvbi50ZXh0dXJlLmdldEltYWdlKCkuaGVpZ2h0O1xyXG4gICAgICBzd2l0Y2ggKHJlZ2lvbi5kZWdyZWVzKSB7XHJcbiAgICAgICAgY2FzZSA5MDpcclxuICAgICAgICAgIHUgLT1cclxuICAgICAgICAgICAgKHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAtIHJlZ2lvbi5vZmZzZXRZIC0gcmVnaW9uLmhlaWdodCkgL1xyXG4gICAgICAgICAgICB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICB2IC09XHJcbiAgICAgICAgICAgIChyZWdpb24ub3JpZ2luYWxXaWR0aCAtIHJlZ2lvbi5vZmZzZXRYIC0gcmVnaW9uLndpZHRoKSAvXHJcbiAgICAgICAgICAgIHRleHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgICB3aWR0aCA9IHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICAgIGhlaWdodCA9IHJlZ2lvbi5vcmlnaW5hbFdpZHRoIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICAgIHV2c1tpXSA9IHUgKyByZWdpb25VVnNbaSArIDFdICogd2lkdGg7XHJcbiAgICAgICAgICAgIHV2c1tpICsgMV0gPSB2ICsgKDEgLSByZWdpb25VVnNbaV0pICogaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMTgwOlxyXG4gICAgICAgICAgdSAtPVxyXG4gICAgICAgICAgICAocmVnaW9uLm9yaWdpbmFsV2lkdGggLSByZWdpb24ub2Zmc2V0WCAtIHJlZ2lvbi53aWR0aCkgL1xyXG4gICAgICAgICAgICB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICB2IC09IHJlZ2lvbi5vZmZzZXRZIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIHdpZHRoID0gcmVnaW9uLm9yaWdpbmFsV2lkdGggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgICAgICBoZWlnaHQgPSByZWdpb24ub3JpZ2luYWxIZWlnaHQgLyB0ZXh0dXJlSGVpZ2h0O1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHtcclxuICAgICAgICAgICAgdXZzW2ldID0gdSArICgxIC0gcmVnaW9uVVZzW2ldKSAqIHdpZHRoO1xyXG4gICAgICAgICAgICB1dnNbaSArIDFdID0gdiArICgxIC0gcmVnaW9uVVZzW2kgKyAxXSkgKiBoZWlnaHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAyNzA6XHJcbiAgICAgICAgICB1IC09IHJlZ2lvbi5vZmZzZXRZIC8gdGV4dHVyZVdpZHRoO1xyXG4gICAgICAgICAgdiAtPSByZWdpb24ub2Zmc2V0WCAvIHRleHR1cmVIZWlnaHQ7XHJcbiAgICAgICAgICB3aWR0aCA9IHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgICAgIGhlaWdodCA9IHJlZ2lvbi5vcmlnaW5hbFdpZHRoIC8gdGV4dHVyZUhlaWdodDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICAgIHV2c1tpXSA9IHUgKyAoMSAtIHJlZ2lvblVWc1tpICsgMV0pICogd2lkdGg7XHJcbiAgICAgICAgICAgIHV2c1tpICsgMV0gPSB2ICsgcmVnaW9uVVZzW2ldICogaGVpZ2h0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHUgLT0gcmVnaW9uLm9mZnNldFggLyB0ZXh0dXJlV2lkdGg7XHJcbiAgICAgIHYgLT1cclxuICAgICAgICAocmVnaW9uLm9yaWdpbmFsSGVpZ2h0IC0gcmVnaW9uLm9mZnNldFkgLSByZWdpb24uaGVpZ2h0KSAvXHJcbiAgICAgICAgdGV4dHVyZUhlaWdodDtcclxuICAgICAgd2lkdGggPSByZWdpb24ub3JpZ2luYWxXaWR0aCAvIHRleHR1cmVXaWR0aDtcclxuICAgICAgaGVpZ2h0ID0gcmVnaW9uLm9yaWdpbmFsSGVpZ2h0IC8gdGV4dHVyZUhlaWdodDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5yZWdpb24gPT0gbnVsbCkge1xyXG4gICAgICB1ID0gdiA9IDA7XHJcbiAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpZHRoID0gdGhpcy5yZWdpb24udTIgLSB1O1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLnJlZ2lvbi52MiAtIHY7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHtcclxuICAgICAgdXZzW2ldID0gdSArIHJlZ2lvblVWc1tpXSAqIHdpZHRoO1xyXG4gICAgICB1dnNbaSArIDFdID0gdiArIHJlZ2lvblVWc1tpICsgMV0gKiBoZWlnaHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQYXJlbnRNZXNoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50TWVzaDtcclxuICB9XHJcblxyXG4gIC8qKiBAcGFyYW0gcGFyZW50TWVzaCBNYXkgYmUgbnVsbC4gKi9cclxuICBzZXRQYXJlbnRNZXNoKHBhcmVudE1lc2g6IE1lc2hBdHRhY2htZW50KSB7XHJcbiAgICB0aGlzLnBhcmVudE1lc2ggPSBwYXJlbnRNZXNoO1xyXG4gICAgaWYgKHBhcmVudE1lc2ggIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmJvbmVzID0gcGFyZW50TWVzaC5ib25lcztcclxuICAgICAgdGhpcy52ZXJ0aWNlcyA9IHBhcmVudE1lc2gudmVydGljZXM7XHJcbiAgICAgIHRoaXMud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHBhcmVudE1lc2gud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgICAgdGhpcy5yZWdpb25VVnMgPSBwYXJlbnRNZXNoLnJlZ2lvblVWcztcclxuICAgICAgdGhpcy50cmlhbmdsZXMgPSBwYXJlbnRNZXNoLnRyaWFuZ2xlcztcclxuICAgICAgdGhpcy5odWxsTGVuZ3RoID0gcGFyZW50TWVzaC5odWxsTGVuZ3RoO1xyXG4gICAgICB0aGlzLndvcmxkVmVydGljZXNMZW5ndGggPSBwYXJlbnRNZXNoLndvcmxkVmVydGljZXNMZW5ndGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5KCk6IEF0dGFjaG1lbnQge1xyXG4gICAgaWYgKHRoaXMucGFyZW50TWVzaCAhPSBudWxsKSByZXR1cm4gdGhpcy5uZXdMaW5rZWRNZXNoKCk7XHJcblxyXG4gICAgbGV0IGNvcHkgPSBuZXcgTWVzaEF0dGFjaG1lbnQodGhpcy5uYW1lKTtcclxuICAgIGNvcHkucmVnaW9uID0gdGhpcy5yZWdpb247XHJcbiAgICBjb3B5LnBhdGggPSB0aGlzLnBhdGg7XHJcbiAgICBjb3B5LmNvbG9yLnNldEZyb21Db2xvcih0aGlzLmNvbG9yKTtcclxuXHJcbiAgICB0aGlzLmNvcHlUbyhjb3B5KTtcclxuICAgIGNvcHkucmVnaW9uVVZzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5yZWdpb25VVnMubGVuZ3RoKTtcclxuICAgIFV0aWxzLmFycmF5Q29weShcclxuICAgICAgdGhpcy5yZWdpb25VVnMsXHJcbiAgICAgIDAsXHJcbiAgICAgIGNvcHkucmVnaW9uVVZzLFxyXG4gICAgICAwLFxyXG4gICAgICB0aGlzLnJlZ2lvblVWcy5sZW5ndGhcclxuICAgICk7XHJcbiAgICBjb3B5LnV2cyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMudXZzLmxlbmd0aCk7XHJcbiAgICBVdGlscy5hcnJheUNvcHkodGhpcy51dnMsIDAsIGNvcHkudXZzLCAwLCB0aGlzLnV2cy5sZW5ndGgpO1xyXG4gICAgY29weS50cmlhbmdsZXMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLnRyaWFuZ2xlcy5sZW5ndGgpO1xyXG4gICAgVXRpbHMuYXJyYXlDb3B5KFxyXG4gICAgICB0aGlzLnRyaWFuZ2xlcyxcclxuICAgICAgMCxcclxuICAgICAgY29weS50cmlhbmdsZXMsXHJcbiAgICAgIDAsXHJcbiAgICAgIHRoaXMudHJpYW5nbGVzLmxlbmd0aFxyXG4gICAgKTtcclxuICAgIGNvcHkuaHVsbExlbmd0aCA9IHRoaXMuaHVsbExlbmd0aDtcclxuXHJcbiAgICAvLyBOb25lc3NlbnRpYWwuXHJcbiAgICBpZiAodGhpcy5lZGdlcyAhPSBudWxsKSB7XHJcbiAgICAgIGNvcHkuZWRnZXMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLmVkZ2VzLmxlbmd0aCk7XHJcbiAgICAgIFV0aWxzLmFycmF5Q29weSh0aGlzLmVkZ2VzLCAwLCBjb3B5LmVkZ2VzLCAwLCB0aGlzLmVkZ2VzLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBjb3B5LndpZHRoID0gdGhpcy53aWR0aDtcclxuICAgIGNvcHkuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfVxyXG5cclxuICBuZXdMaW5rZWRNZXNoKCk6IE1lc2hBdHRhY2htZW50IHtcclxuICAgIGxldCBjb3B5ID0gbmV3IE1lc2hBdHRhY2htZW50KHRoaXMubmFtZSk7XHJcbiAgICBjb3B5LnJlZ2lvbiA9IHRoaXMucmVnaW9uO1xyXG4gICAgY29weS5wYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgY29weS5jb2xvci5zZXRGcm9tQ29sb3IodGhpcy5jb2xvcik7XHJcbiAgICBjb3B5LmRlZm9ybUF0dGFjaG1lbnQgPSB0aGlzLmRlZm9ybUF0dGFjaG1lbnQ7XHJcbiAgICBjb3B5LnNldFBhcmVudE1lc2godGhpcy5wYXJlbnRNZXNoICE9IG51bGwgPyB0aGlzLnBhcmVudE1lc2ggOiB0aGlzKTtcclxuICAgIGNvcHkudXBkYXRlVVZzKCk7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbn1cclxuIl19