ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
220 lines • 22.4 kB
JavaScript
/**
* @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 } from "../Utils";
/**
* @abstract
*/
export class Attachment {
/**
* @param {?} name
*/
constructor(name) {
if (name == null)
throw new Error("name cannot be null.");
this.name = name;
}
}
if (false) {
/** @type {?} */
Attachment.prototype.name;
/**
* @abstract
* @return {?}
*/
Attachment.prototype.copy = function () { };
}
/**
* @abstract
*/
export class VertexAttachment extends Attachment {
/**
* @param {?} name
*/
constructor(name) {
super(name);
this.id = (VertexAttachment.nextID++ & 65535) << 11;
this.worldVerticesLength = 0;
this.deformAttachment = this;
}
/**
* Transforms local vertices to world coordinates.
* @param {?} slot
* @param {?} start The index of the first local vertex value to transform. Each vertex has 2 values, x and y.
* @param {?} count The number of world vertex values to output. Must be <= {\@link #getWorldVerticesLength()} - start.
* @param {?} worldVertices The output world vertices. Must have a length >= offset + count.
* @param {?} offset The worldVertices index to begin writing values.
* @param {?} stride
* @return {?}
*/
computeWorldVertices(slot, start, count, worldVertices, offset, stride) {
count = offset + (count >> 1) * stride;
/** @type {?} */
let skeleton = slot.bone.skeleton;
/** @type {?} */
let deformArray = slot.deform;
/** @type {?} */
let vertices = this.vertices;
/** @type {?} */
let bones = this.bones;
if (bones == null) {
if (deformArray.length > 0)
vertices = deformArray;
/** @type {?} */
let bone = slot.bone;
/** @type {?} */
let x = bone.worldX;
/** @type {?} */
let y = bone.worldY;
/** @type {?} */
let a = bone.a;
/** @type {?} */
let b = bone.b;
/** @type {?} */
let c = bone.c;
/** @type {?} */
let d = bone.d;
for (let v = start, w = offset; w < count; v += 2, w += stride) {
/** @type {?} */
let vx = vertices[v];
/** @type {?} */
let vy = vertices[v + 1];
worldVertices[w] = vx * a + vy * b + x;
worldVertices[w + 1] = vx * c + vy * d + y;
}
return;
}
/** @type {?} */
let v = 0;
/** @type {?} */
let skip = 0;
for (let i = 0; i < start; i += 2) {
/** @type {?} */
let n = bones[v];
v += n + 1;
skip += n;
}
/** @type {?} */
let skeletonBones = skeleton.bones;
if (deformArray.length == 0) {
for (let w = offset, b = skip * 3; w < count; w += stride) {
/** @type {?} */
let wx = 0;
/** @type {?} */
let wy = 0;
/** @type {?} */
let n = bones[v++];
n += v;
for (; v < n; v++, b += 3) {
/** @type {?} */
let bone = skeletonBones[bones[v]];
/** @type {?} */
let vx = vertices[b];
/** @type {?} */
let vy = vertices[b + 1];
/** @type {?} */
let weight = vertices[b + 2];
wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight;
wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight;
}
worldVertices[w] = wx;
worldVertices[w + 1] = wy;
}
}
else {
/** @type {?} */
let deform = deformArray;
for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {
/** @type {?} */
let wx = 0;
/** @type {?} */
let wy = 0;
/** @type {?} */
let n = bones[v++];
n += v;
for (; v < n; v++, b += 3, f += 2) {
/** @type {?} */
let bone = skeletonBones[bones[v]];
/** @type {?} */
let vx = vertices[b] + deform[f];
/** @type {?} */
let vy = vertices[b + 1] + deform[f + 1];
/** @type {?} */
let weight = vertices[b + 2];
wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight;
wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight;
}
worldVertices[w] = wx;
worldVertices[w + 1] = wy;
}
}
}
/**
* @param {?} attachment
* @return {?}
*/
copyTo(attachment) {
if (this.bones != null) {
attachment.bones = new Array(this.bones.length);
Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length);
}
else
attachment.bones = null;
if (this.vertices != null) {
attachment.vertices = Utils.newFloatArray(this.vertices.length);
Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length);
}
else
attachment.vertices = null;
attachment.worldVerticesLength = this.worldVerticesLength;
attachment.deformAttachment = this.deformAttachment;
}
}
VertexAttachment.nextID = 0;
if (false) {
/**
* @type {?}
* @private
*/
VertexAttachment.nextID;
/** @type {?} */
VertexAttachment.prototype.id;
/** @type {?} */
VertexAttachment.prototype.bones;
/** @type {?} */
VertexAttachment.prototype.vertices;
/** @type {?} */
VertexAttachment.prototype.worldVerticesLength;
/** @type {?} */
VertexAttachment.prototype.deformAttachment;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2QkEsT0FBTyxFQUFhLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7OztBQUc1QyxNQUFNLE9BQWdCLFVBQVU7Ozs7SUFHOUIsWUFBWSxJQUFZO1FBQ3RCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUdGOzs7SUFSQywwQkFBYTs7Ozs7SUFPYiw0Q0FBNEI7Ozs7O0FBRzlCLE1BQU0sT0FBZ0IsZ0JBQWlCLFNBQVEsVUFBVTs7OztJQVN2RCxZQUFZLElBQVk7UUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBUGQsT0FBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRy9DLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4QixxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO0lBSTFDLENBQUM7Ozs7Ozs7Ozs7O0lBT0Qsb0JBQW9CLENBQ2xCLElBQVUsRUFDVixLQUFhLEVBQ2IsS0FBYSxFQUNiLGFBQWdDLEVBQ2hDLE1BQWMsRUFDZCxNQUFjO1FBRWQsS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7O1lBQ25DLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7O1lBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTTs7WUFDekIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFROztZ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Q3JCLG9DQUE0Qjs7SUFDNUIsK0NBQXdCOztJQUN4Qiw0Q0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbmltcG9ydCB7IEFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuLi9TbG90XCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXR0YWNobWVudCB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmIChuYW1lID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIm5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGNvcHkoKTogQXR0YWNobWVudDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZlcnRleEF0dGFjaG1lbnQgZXh0ZW5kcyBBdHRhY2htZW50IHtcclxuICBwcml2YXRlIHN0YXRpYyBuZXh0SUQgPSAwO1xyXG5cclxuICBpZCA9IChWZXJ0ZXhBdHRhY2htZW50Lm5leHRJRCsrICYgNjU1MzUpIDw8IDExO1xyXG4gIGJvbmVzOiBBcnJheTxudW1iZXI+O1xyXG4gIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPjtcclxuICB3b3JsZFZlcnRpY2VzTGVuZ3RoID0gMDtcclxuICBkZWZvcm1BdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50ID0gdGhpcztcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmFuc2Zvcm1zIGxvY2FsIHZlcnRpY2VzIHRvIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGxvY2FsIHZlcnRleCB2YWx1ZSB0byB0cmFuc2Zvcm0uIEVhY2ggdmVydGV4IGhhcyAyIHZhbHVlcywgeCBhbmQgeS5cclxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiB3b3JsZCB2ZXJ0ZXggdmFsdWVzIHRvIG91dHB1dC4gTXVzdCBiZSA8PSB7QGxpbmsgI2dldFdvcmxkVmVydGljZXNMZW5ndGgoKX0gLSBzdGFydC5cclxuICAgKiBAcGFyYW0gd29ybGRWZXJ0aWNlcyBUaGUgb3V0cHV0IHdvcmxkIHZlcnRpY2VzLiBNdXN0IGhhdmUgYSBsZW5ndGggPj0gb2Zmc2V0ICsgY291bnQuXHJcbiAgICogQHBhcmFtIG9mZnNldCBUaGUgd29ybGRWZXJ0aWNlcyBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy4gKi9cclxuICBjb21wdXRlV29ybGRWZXJ0aWNlcyhcclxuICAgIHNsb3Q6IFNsb3QsXHJcbiAgICBzdGFydDogbnVtYmVyLFxyXG4gICAgY291bnQ6IG51bWJlcixcclxuICAgIHdvcmxkVmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBzdHJpZGU6IG51bWJlclxyXG4gICkge1xyXG4gICAgY291bnQgPSBvZmZzZXQgKyAoY291bnQgPj4gMSkgKiBzdHJpZGU7XHJcbiAgICBsZXQgc2tlbGV0b24gPSBzbG90LmJvbmUuc2tlbGV0b247XHJcbiAgICBsZXQgZGVmb3JtQXJyYXkgPSBzbG90LmRlZm9ybTtcclxuICAgIGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgaWYgKGJvbmVzID09IG51bGwpIHtcclxuICAgICAgaWYgKGRlZm9ybUFycmF5Lmxlbmd0aCA+IDApIHZlcnRpY2VzID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGxldCBib25lID0gc2xvdC5ib25lO1xyXG4gICAgICBsZXQgeCA9IGJvbmUud29ybGRYO1xyXG4gICAgICBsZXQgeSA9IGJvbmUud29ybGRZO1xyXG4gICAgICBsZXQgYSA9IGJvbmUuYSxcclxuICAgICAgICBiID0gYm9uZS5iLFxyXG4gICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgZCA9IGJvbmUuZDtcclxuICAgICAgZm9yIChsZXQgdiA9IHN0YXJ0LCB3ID0gb2Zmc2V0OyB3IDwgY291bnQ7IHYgKz0gMiwgdyArPSBzdHJpZGUpIHtcclxuICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1t2XSxcclxuICAgICAgICAgIHZ5ID0gdmVydGljZXNbdiArIDFdO1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB2eCAqIGEgKyB2eSAqIGIgKyB4O1xyXG4gICAgICAgIHdvcmxkVmVydGljZXNbdyArIDFdID0gdnggKiBjICsgdnkgKiBkICsgeTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgdiA9IDAsXHJcbiAgICAgIHNraXAgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydDsgaSArPSAyKSB7XHJcbiAgICAgIGxldCBuID0gYm9uZXNbdl07XHJcbiAgICAgIHYgKz0gbiArIDE7XHJcbiAgICAgIHNraXAgKz0gbjtcclxuICAgIH1cclxuICAgIGxldCBza2VsZXRvbkJvbmVzID0gc2tlbGV0b24uYm9uZXM7XHJcbiAgICBpZiAoZGVmb3JtQXJyYXkubGVuZ3RoID09IDApIHtcclxuICAgICAgZm9yIChsZXQgdyA9IG9mZnNldCwgYiA9IHNraXAgKiAzOyB3IDwgY291bnQ7IHcgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMpIHtcclxuICAgICAgICAgIGxldCBib25lID0gc2tlbGV0b25Cb25lc1tib25lc1t2XV07XHJcbiAgICAgICAgICBsZXQgdnggPSB2ZXJ0aWNlc1tiXSxcclxuICAgICAgICAgICAgdnkgPSB2ZXJ0aWNlc1tiICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGVmb3JtID0gZGVmb3JtQXJyYXk7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IHcgPSBvZmZzZXQsIGIgPSBza2lwICogMywgZiA9IHNraXAgPDwgMTtcclxuICAgICAgICB3IDwgY291bnQ7XHJcbiAgICAgICAgdyArPSBzdHJpZGVcclxuICAgICAgKSB7XHJcbiAgICAgICAgbGV0IHd4ID0gMCxcclxuICAgICAgICAgIHd5ID0gMDtcclxuICAgICAgICBsZXQgbiA9IGJvbmVzW3YrK107XHJcbiAgICAgICAgbiArPSB2O1xyXG4gICAgICAgIGZvciAoOyB2IDwgbjsgdisrLCBiICs9IDMsIGYgKz0gMikge1xyXG4gICAgICAgICAgbGV0IGJvbmUgPSBza2VsZXRvbkJvbmVzW2JvbmVzW3ZdXTtcclxuICAgICAgICAgIGxldCB2eCA9IHZlcnRpY2VzW2JdICsgZGVmb3JtW2ZdLFxyXG4gICAgICAgICAgICB2eSA9IHZlcnRpY2VzW2IgKyAxXSArIGRlZm9ybVtmICsgMV0sXHJcbiAgICAgICAgICAgIHdlaWdodCA9IHZlcnRpY2VzW2IgKyAyXTtcclxuICAgICAgICAgIHd4ICs9ICh2eCAqIGJvbmUuYSArIHZ5ICogYm9uZS5iICsgYm9uZS53b3JsZFgpICogd2VpZ2h0O1xyXG4gICAgICAgICAgd3kgKz0gKHZ4ICogYm9uZS5jICsgdnkgKiBib25lLmQgKyBib25lLndvcmxkWSkgKiB3ZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdvcmxkVmVydGljZXNbd10gPSB3eDtcclxuICAgICAgICB3b3JsZFZlcnRpY2VzW3cgKyAxXSA9IHd5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5VG8oYXR0YWNobWVudDogVmVydGV4QXR0YWNobWVudCkge1xyXG4gICAgaWYgKHRoaXMuYm9uZXMgIT0gbnVsbCkge1xyXG4gICAgICBhdHRhY2htZW50LmJvbmVzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkodGhpcy5ib25lcywgMCwgYXR0YWNobWVudC5ib25lcywgMCwgdGhpcy5ib25lcy5sZW5ndGgpO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQuYm9uZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLnZlcnRpY2VzICE9IG51bGwpIHtcclxuICAgICAgYXR0YWNobWVudC52ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkodGhpcy52ZXJ0aWNlcy5sZW5ndGgpO1xyXG4gICAgICBVdGlscy5hcnJheUNvcHkoXHJcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGF0dGFjaG1lbnQudmVydGljZXMsXHJcbiAgICAgICAgMCxcclxuICAgICAgICB0aGlzLnZlcnRpY2VzLmxlbmd0aFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGF0dGFjaG1lbnQudmVydGljZXMgPSBudWxsO1xyXG5cclxuICAgIGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHRoaXMud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgIGF0dGFjaG1lbnQuZGVmb3JtQXR0YWNobWVudCA9IHRoaXMuZGVmb3JtQXR0YWNobWVudDtcclxuICB9XHJcbn1cclxuIl19