ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
368 lines • 32.3 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 { Utils, Color } from "../Utils";
import { Attachment } from "./Attachment";
var RegionAttachment = /** @class */ (function (_super) {
tslib_1.__extends(RegionAttachment, _super);
function RegionAttachment(name) {
var _this = _super.call(this, name) || this;
_this.x = 0;
_this.y = 0;
_this.scaleX = 1;
_this.scaleY = 1;
_this.rotation = 0;
_this.width = 0;
_this.height = 0;
_this.color = new Color(1, 1, 1, 1);
_this.offset = Utils.newFloatArray(8);
_this.uvs = Utils.newFloatArray(8);
_this.tempColor = new Color(1, 1, 1, 1);
return _this;
}
/**
* @return {?}
*/
RegionAttachment.prototype.updateOffset = /**
* @return {?}
*/
function () {
/** @type {?} */
var regionScaleX = (this.width / this.region.originalWidth) * this.scaleX;
/** @type {?} */
var regionScaleY = (this.height / this.region.originalHeight) * this.scaleY;
/** @type {?} */
var localX = (-this.width / 2) * this.scaleX + this.region.offsetX * regionScaleX;
/** @type {?} */
var localY = (-this.height / 2) * this.scaleY + this.region.offsetY * regionScaleY;
/** @type {?} */
var localX2 = localX + this.region.width * regionScaleX;
/** @type {?} */
var localY2 = localY + this.region.height * regionScaleY;
/** @type {?} */
var radians = (this.rotation * Math.PI) / 180;
/** @type {?} */
var cos = Math.cos(radians);
/** @type {?} */
var sin = Math.sin(radians);
/** @type {?} */
var localXCos = localX * cos + this.x;
/** @type {?} */
var localXSin = localX * sin;
/** @type {?} */
var localYCos = localY * cos + this.y;
/** @type {?} */
var localYSin = localY * sin;
/** @type {?} */
var localX2Cos = localX2 * cos + this.x;
/** @type {?} */
var localX2Sin = localX2 * sin;
/** @type {?} */
var localY2Cos = localY2 * cos + this.y;
/** @type {?} */
var localY2Sin = localY2 * sin;
/** @type {?} */
var offset = this.offset;
offset[RegionAttachment.OX1] = localXCos - localYSin;
offset[RegionAttachment.OY1] = localYCos + localXSin;
offset[RegionAttachment.OX2] = localXCos - localY2Sin;
offset[RegionAttachment.OY2] = localY2Cos + localXSin;
offset[RegionAttachment.OX3] = localX2Cos - localY2Sin;
offset[RegionAttachment.OY3] = localY2Cos + localX2Sin;
offset[RegionAttachment.OX4] = localX2Cos - localYSin;
offset[RegionAttachment.OY4] = localYCos + localX2Sin;
};
/**
* @param {?} region
* @return {?}
*/
RegionAttachment.prototype.setRegion = /**
* @param {?} region
* @return {?}
*/
function (region) {
this.region = region;
/** @type {?} */
var uvs = this.uvs;
if (region.rotate) {
uvs[2] = region.u;
uvs[3] = region.v2;
uvs[4] = region.u;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v;
uvs[0] = region.u2;
uvs[1] = region.v2;
}
else {
uvs[0] = region.u;
uvs[1] = region.v2;
uvs[2] = region.u;
uvs[3] = region.v;
uvs[4] = region.u2;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v2;
}
};
/**
* @param {?} bone
* @param {?} worldVertices
* @param {?} offset
* @param {?} stride
* @return {?}
*/
RegionAttachment.prototype.computeWorldVertices = /**
* @param {?} bone
* @param {?} worldVertices
* @param {?} offset
* @param {?} stride
* @return {?}
*/
function (bone, worldVertices, offset, stride) {
/** @type {?} */
var vertexOffset = this.offset;
/** @type {?} */
var x = bone.worldX;
/** @type {?} */
var y = bone.worldY;
/** @type {?} */
var a = bone.a;
/** @type {?} */
var b = bone.b;
/** @type {?} */
var c = bone.c;
/** @type {?} */
var d = bone.d;
/** @type {?} */
var offsetX = 0;
/** @type {?} */
var offsetY = 0;
offsetX = vertexOffset[RegionAttachment.OX1];
offsetY = vertexOffset[RegionAttachment.OY1];
worldVertices[offset] = offsetX * a + offsetY * b + x; // br
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX2];
offsetY = vertexOffset[RegionAttachment.OY2];
worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX3];
offsetY = vertexOffset[RegionAttachment.OY3];
worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
offset += stride;
offsetX = vertexOffset[RegionAttachment.OX4];
offsetY = vertexOffset[RegionAttachment.OY4];
worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
};
/**
* @return {?}
*/
RegionAttachment.prototype.copy = /**
* @return {?}
*/
function () {
/** @type {?} */
var copy = new RegionAttachment(name);
copy.region = this.region;
copy.rendererObject = this.rendererObject;
copy.path = this.path;
copy.x = this.x;
copy.y = this.y;
copy.scaleX = this.scaleX;
copy.scaleY = this.scaleY;
copy.rotation = this.rotation;
copy.width = this.width;
copy.height = this.height;
Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);
Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);
copy.color.setFromColor(this.color);
return copy;
};
RegionAttachment.OX1 = 0;
RegionAttachment.OY1 = 1;
RegionAttachment.OX2 = 2;
RegionAttachment.OY2 = 3;
RegionAttachment.OX3 = 4;
RegionAttachment.OY3 = 5;
RegionAttachment.OX4 = 6;
RegionAttachment.OY4 = 7;
RegionAttachment.X1 = 0;
RegionAttachment.Y1 = 1;
RegionAttachment.C1R = 2;
RegionAttachment.C1G = 3;
RegionAttachment.C1B = 4;
RegionAttachment.C1A = 5;
RegionAttachment.U1 = 6;
RegionAttachment.V1 = 7;
RegionAttachment.X2 = 8;
RegionAttachment.Y2 = 9;
RegionAttachment.C2R = 10;
RegionAttachment.C2G = 11;
RegionAttachment.C2B = 12;
RegionAttachment.C2A = 13;
RegionAttachment.U2 = 14;
RegionAttachment.V2 = 15;
RegionAttachment.X3 = 16;
RegionAttachment.Y3 = 17;
RegionAttachment.C3R = 18;
RegionAttachment.C3G = 19;
RegionAttachment.C3B = 20;
RegionAttachment.C3A = 21;
RegionAttachment.U3 = 22;
RegionAttachment.V3 = 23;
RegionAttachment.X4 = 24;
RegionAttachment.Y4 = 25;
RegionAttachment.C4R = 26;
RegionAttachment.C4G = 27;
RegionAttachment.C4B = 28;
RegionAttachment.C4A = 29;
RegionAttachment.U4 = 30;
RegionAttachment.V4 = 31;
return RegionAttachment;
}(Attachment));
export { RegionAttachment };
if (false) {
/** @type {?} */
RegionAttachment.OX1;
/** @type {?} */
RegionAttachment.OY1;
/** @type {?} */
RegionAttachment.OX2;
/** @type {?} */
RegionAttachment.OY2;
/** @type {?} */
RegionAttachment.OX3;
/** @type {?} */
RegionAttachment.OY3;
/** @type {?} */
RegionAttachment.OX4;
/** @type {?} */
RegionAttachment.OY4;
/** @type {?} */
RegionAttachment.X1;
/** @type {?} */
RegionAttachment.Y1;
/** @type {?} */
RegionAttachment.C1R;
/** @type {?} */
RegionAttachment.C1G;
/** @type {?} */
RegionAttachment.C1B;
/** @type {?} */
RegionAttachment.C1A;
/** @type {?} */
RegionAttachment.U1;
/** @type {?} */
RegionAttachment.V1;
/** @type {?} */
RegionAttachment.X2;
/** @type {?} */
RegionAttachment.Y2;
/** @type {?} */
RegionAttachment.C2R;
/** @type {?} */
RegionAttachment.C2G;
/** @type {?} */
RegionAttachment.C2B;
/** @type {?} */
RegionAttachment.C2A;
/** @type {?} */
RegionAttachment.U2;
/** @type {?} */
RegionAttachment.V2;
/** @type {?} */
RegionAttachment.X3;
/** @type {?} */
RegionAttachment.Y3;
/** @type {?} */
RegionAttachment.C3R;
/** @type {?} */
RegionAttachment.C3G;
/** @type {?} */
RegionAttachment.C3B;
/** @type {?} */
RegionAttachment.C3A;
/** @type {?} */
RegionAttachment.U3;
/** @type {?} */
RegionAttachment.V3;
/** @type {?} */
RegionAttachment.X4;
/** @type {?} */
RegionAttachment.Y4;
/** @type {?} */
RegionAttachment.C4R;
/** @type {?} */
RegionAttachment.C4G;
/** @type {?} */
RegionAttachment.C4B;
/** @type {?} */
RegionAttachment.C4A;
/** @type {?} */
RegionAttachment.U4;
/** @type {?} */
RegionAttachment.V4;
/** @type {?} */
RegionAttachment.prototype.x;
/** @type {?} */
RegionAttachment.prototype.y;
/** @type {?} */
RegionAttachment.prototype.scaleX;
/** @type {?} */
RegionAttachment.prototype.scaleY;
/** @type {?} */
RegionAttachment.prototype.rotation;
/** @type {?} */
RegionAttachment.prototype.width;
/** @type {?} */
RegionAttachment.prototype.height;
/** @type {?} */
RegionAttachment.prototype.color;
/** @type {?} */
RegionAttachment.prototype.path;
/** @type {?} */
RegionAttachment.prototype.rendererObject;
/** @type {?} */
RegionAttachment.prototype.region;
/** @type {?} */
RegionAttachment.prototype.offset;
/** @type {?} */
RegionAttachment.prototype.uvs;
/** @type {?} */
RegionAttachment.prototype.tempColor;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL2F0dGFjaG1lbnRzL1JlZ2lvbkF0dGFjaG1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE9BQU8sRUFBRSxLQUFLLEVBQWEsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJMUM7SUFBc0MsNENBQVU7SUFnRTlDLDBCQUFZLElBQVk7UUFBeEIsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FDWjtRQXBCRCxPQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sT0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFlBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxZQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsY0FBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFdBQUssR0FBRyxDQUFDLENBQUM7UUFDVixZQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBTTlCLFlBQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLFNBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdCLGVBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7SUFJbEMsQ0FBQzs7OztJQUVELHVDQUFZOzs7SUFBWjs7WUFDTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFD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Z0I7O0lBQ2hCLHFCQUFnQjs7SUFDaEIscUJBQWdCOztJQUNoQixxQkFBZ0I7O0lBQ2hCLG9CQUFlOztJQUNmLG9CQUFlOztJQUVmLG9CQUFlOztJQUNmLG9CQUFlOztJQUNmLHFCQUFnQjs7SUFDaEIscUJBQWdCOztJQUNoQixxQkFBZ0I7O0lBQ2hCLHFCQUFnQjs7SUFDaEIsb0JBQWU7O0lBQ2Ysb0JBQWU7O0lBRWYsNkJBQU07O0lBQ04sNkJBQU07O0lBQ04sa0NBQVc7O0lBQ1gsa0NBQVc7O0lBQ1gsb0NBQWE7O0lBQ2IsaUNBQVU7O0lBQ1Ysa0NBQVc7O0lBQ1gsaUNBQThCOztJQUU5QixnQ0FBYTs7SUFDYiwwQ0FBb0I7O0lBQ3BCLGtDQUFzQjs7SUFFdEIsa0NBQWdDOztJQUNoQywrQkFBNkI7O0lBRTdCLHFDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgVXRpbHMsIEFycmF5TGlrZSwgQ29sb3IgfSBmcm9tIFwiLi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gXCIuL0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgVGV4dHVyZVJlZ2lvbiB9IGZyb20gXCIuLi9UZXh0dXJlXCI7XHJcbmltcG9ydCB7IEJvbmUgfSBmcm9tIFwiLi4vQm9uZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlZ2lvbkF0dGFjaG1lbnQgZXh0ZW5kcyBBdHRhY2htZW50IHtcclxuICBzdGF0aWMgT1gxID0gMDtcclxuICBzdGF0aWMgT1kxID0gMTtcclxuICBzdGF0aWMgT1gyID0gMjtcclxuICBzdGF0aWMgT1kyID0gMztcclxuICBzdGF0aWMgT1gzID0gNDtcclxuICBzdGF0aWMgT1kzID0gNTtcclxuICBzdGF0aWMgT1g0ID0gNjtcclxuICBzdGF0aWMgT1k0ID0gNztcclxuXHJcbiAgc3RhdGljIFgxID0gMDtcclxuICBzdGF0aWMgWTEgPSAxO1xyXG4gIHN0YXRpYyBDMVIgPSAyO1xyXG4gIHN0YXRpYyBDMUcgPSAzO1xyXG4gIHN0YXRpYyBDMUIgPSA0O1xyXG4gIHN0YXRpYyBDMUEgPSA1O1xyXG4gIHN0YXRpYyBVMSA9IDY7XHJcbiAgc3RhdGljIFYxID0gNztcclxuXHJcbiAgc3RhdGljIFgyID0gODtcclxuICBzdGF0aWMgWTIgPSA5O1xyXG4gIHN0YXRpYyBDMlIgPSAxMDtcclxuICBzdGF0aWMgQzJHID0gMTE7XHJcbiAgc3RhdGljIEMyQiA9IDEyO1xyXG4gIHN0YXRpYyBDMkEgPSAxMztcclxuICBzdGF0aWMgVTIgPSAxNDtcclxuICBzdGF0aWMgVjIgPSAxNTtcclxuXHJcbiAgc3RhdGljIFgzID0gMTY7XHJcbiAgc3RhdGljIFkzID0gMTc7XHJcbiAgc3RhdGljIEMzUiA9IDE4O1xyXG4gIHN0YXRpYyBDM0cgPSAxOTtcclxuICBzdGF0aWMgQzNCID0gMjA7XHJcbiAgc3RhdGljIEMzQSA9IDIxO1xyXG4gIHN0YXRpYyBVMyA9IDIyO1xyXG4gIHN0YXRpYyBWMyA9IDIzO1xyXG5cclxuICBzdGF0aWMgWDQgPSAyNDtcclxuICBzdGF0aWMgWTQgPSAyNTtcclxuICBzdGF0aWMgQzRSID0gMjY7XHJcbiAgc3RhdGljIEM0RyA9IDI3O1xyXG4gIHN0YXRpYyBDNEIgPSAyODtcclxuICBzdGF0aWMgQzRBID0gMjk7XHJcbiAgc3RhdGljIFU0ID0gMzA7XHJcbiAgc3RhdGljIFY0ID0gMzE7XHJcblxyXG4gIHggPSAwO1xyXG4gIHkgPSAwO1xyXG4gIHNjYWxlWCA9IDE7XHJcbiAgc2NhbGVZID0gMTtcclxuICByb3RhdGlvbiA9IDA7XHJcbiAgd2lkdGggPSAwO1xyXG4gIGhlaWdodCA9IDA7XHJcbiAgY29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XHJcblxyXG4gIHBhdGg6IHN0cmluZztcclxuICByZW5kZXJlck9iamVjdDogYW55O1xyXG4gIHJlZ2lvbjogVGV4dHVyZVJlZ2lvbjtcclxuXHJcbiAgb2Zmc2V0ID0gVXRpbHMubmV3RmxvYXRBcnJheSg4KTtcclxuICB1dnMgPSBVdGlscy5uZXdGbG9hdEFycmF5KDgpO1xyXG5cclxuICB0ZW1wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSwgMSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xyXG4gICAgc3VwZXIobmFtZSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVPZmZzZXQoKTogdm9pZCB7XHJcbiAgICBsZXQgcmVnaW9uU2NhbGVYID0gKHRoaXMud2lkdGggLyB0aGlzLnJlZ2lvbi5vcmlnaW5hbFdpZHRoKSAqIHRoaXMuc2NhbGVYO1xyXG4gICAgbGV0IHJlZ2lvblNjYWxlWSA9ICh0aGlzLmhlaWdodCAvIHRoaXMucmVnaW9uLm9yaWdpbmFsSGVpZ2h0KSAqIHRoaXMuc2NhbGVZO1xyXG4gICAgbGV0IGxvY2FsWCA9XHJcbiAgICAgICgtdGhpcy53aWR0aCAvIDIpICogdGhpcy5zY2FsZVggKyB0aGlzLnJlZ2lvbi5vZmZzZXRYICogcmVnaW9uU2NhbGVYO1xyXG4gICAgbGV0IGxvY2FsWSA9XHJcbiAgICAgICgtdGhpcy5oZWlnaHQgLyAyKSAqIHRoaXMuc2NhbGVZICsgdGhpcy5yZWdpb24ub2Zmc2V0WSAqIHJlZ2lvblNjYWxlWTtcclxuICAgIGxldCBsb2NhbFgyID0gbG9jYWxYICsgdGhpcy5yZWdpb24ud2lkdGggKiByZWdpb25TY2FsZVg7XHJcbiAgICBsZXQgbG9jYWxZMiA9IGxvY2FsWSArIHRoaXMucmVnaW9uLmhlaWdodCAqIHJlZ2lvblNjYWxlWTtcclxuICAgIGxldCByYWRpYW5zID0gKHRoaXMucm90YXRpb24gKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgIGxldCBjb3MgPSBNYXRoLmNvcyhyYWRpYW5zKTtcclxuICAgIGxldCBzaW4gPSBNYXRoLnNpbihyYWRpYW5zKTtcclxuICAgIGxldCBsb2NhbFhDb3MgPSBsb2NhbFggKiBjb3MgKyB0aGlzLng7XHJcbiAgICBsZXQgbG9jYWxYU2luID0gbG9jYWxYICogc2luO1xyXG4gICAgbGV0IGxvY2FsWUNvcyA9IGxvY2FsWSAqIGNvcyArIHRoaXMueTtcclxuICAgIGxldCBsb2NhbFlTaW4gPSBsb2NhbFkgKiBzaW47XHJcbiAgICBsZXQgbG9jYWxYMkNvcyA9IGxvY2FsWDIgKiBjb3MgKyB0aGlzLng7XHJcbiAgICBsZXQgbG9jYWxYMlNpbiA9IGxvY2FsWDIgKiBzaW47XHJcbiAgICBsZXQgbG9jYWxZMkNvcyA9IGxvY2FsWTIgKiBjb3MgKyB0aGlzLnk7XHJcbiAgICBsZXQgbG9jYWxZMlNpbiA9IGxvY2FsWTIgKiBzaW47XHJcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDFdID0gbG9jYWxYQ29zIC0gbG9jYWxZU2luO1xyXG4gICAgb2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1kxXSA9IGxvY2FsWUNvcyArIGxvY2FsWFNpbjtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YMl0gPSBsb2NhbFhDb3MgLSBsb2NhbFkyU2luO1xyXG4gICAgb2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1kyXSA9IGxvY2FsWTJDb3MgKyBsb2NhbFhTaW47XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDNdID0gbG9jYWxYMkNvcyAtIGxvY2FsWTJTaW47XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWTNdID0gbG9jYWxZMkNvcyArIGxvY2FsWDJTaW47XHJcbiAgICBvZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDRdID0gbG9jYWxYMkNvcyAtIGxvY2FsWVNpbjtcclxuICAgIG9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9ZNF0gPSBsb2NhbFlDb3MgKyBsb2NhbFgyU2luO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVnaW9uKHJlZ2lvbjogVGV4dHVyZVJlZ2lvbik6IHZvaWQge1xyXG4gICAgdGhpcy5yZWdpb24gPSByZWdpb247XHJcbiAgICBsZXQgdXZzID0gdGhpcy51dnM7XHJcbiAgICBpZiAocmVnaW9uLnJvdGF0ZSkge1xyXG4gICAgICB1dnNbMl0gPSByZWdpb24udTtcclxuICAgICAgdXZzWzNdID0gcmVnaW9uLnYyO1xyXG4gICAgICB1dnNbNF0gPSByZWdpb24udTtcclxuICAgICAgdXZzWzVdID0gcmVnaW9uLnY7XHJcbiAgICAgIHV2c1s2XSA9IHJlZ2lvbi51MjtcclxuICAgICAgdXZzWzddID0gcmVnaW9uLnY7XHJcbiAgICAgIHV2c1swXSA9IHJlZ2lvbi51MjtcclxuICAgICAgdXZzWzFdID0gcmVnaW9uLnYyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXZzWzBdID0gcmVnaW9uLnU7XHJcbiAgICAgIHV2c1sxXSA9IHJlZ2lvbi52MjtcclxuICAgICAgdXZzWzJdID0gcmVnaW9uLnU7XHJcbiAgICAgIHV2c1szXSA9IHJlZ2lvbi52O1xyXG4gICAgICB1dnNbNF0gPSByZWdpb24udTI7XHJcbiAgICAgIHV2c1s1XSA9IHJlZ2lvbi52O1xyXG4gICAgICB1dnNbNl0gPSByZWdpb24udTI7XHJcbiAgICAgIHV2c1s3XSA9IHJlZ2lvbi52MjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbXB1dGVXb3JsZFZlcnRpY2VzKFxyXG4gICAgYm9uZTogQm9uZSxcclxuICAgIHdvcmxkVmVydGljZXM6IEFycmF5TGlrZTxudW1iZXI+LFxyXG4gICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICBzdHJpZGU6IG51bWJlclxyXG4gICkge1xyXG4gICAgbGV0IHZlcnRleE9mZnNldCA9IHRoaXMub2Zmc2V0O1xyXG4gICAgbGV0IHggPSBib25lLndvcmxkWCxcclxuICAgICAgeSA9IGJvbmUud29ybGRZO1xyXG4gICAgbGV0IGEgPSBib25lLmEsXHJcbiAgICAgIGIgPSBib25lLmIsXHJcbiAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgIGQgPSBib25lLmQ7XHJcbiAgICBsZXQgb2Zmc2V0WCA9IDAsXHJcbiAgICAgIG9mZnNldFkgPSAwO1xyXG5cclxuICAgIG9mZnNldFggPSB2ZXJ0ZXhPZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDFdO1xyXG4gICAgb2Zmc2V0WSA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9ZMV07XHJcbiAgICB3b3JsZFZlcnRpY2VzW29mZnNldF0gPSBvZmZzZXRYICogYSArIG9mZnNldFkgKiBiICsgeDsgLy8gYnJcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcclxuICAgIG9mZnNldCArPSBzdHJpZGU7XHJcblxyXG4gICAgb2Zmc2V0WCA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9YMl07XHJcbiAgICBvZmZzZXRZID0gdmVydGV4T2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1kyXTtcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyBibFxyXG4gICAgd29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xyXG4gICAgb2Zmc2V0ICs9IHN0cmlkZTtcclxuXHJcbiAgICBvZmZzZXRYID0gdmVydGV4T2Zmc2V0W1JlZ2lvbkF0dGFjaG1lbnQuT1gzXTtcclxuICAgIG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWTNdO1xyXG4gICAgd29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIHVsXHJcbiAgICB3b3JsZFZlcnRpY2VzW29mZnNldCArIDFdID0gb2Zmc2V0WCAqIGMgKyBvZmZzZXRZICogZCArIHk7XHJcbiAgICBvZmZzZXQgKz0gc3RyaWRlO1xyXG5cclxuICAgIG9mZnNldFggPSB2ZXJ0ZXhPZmZzZXRbUmVnaW9uQXR0YWNobWVudC5PWDRdO1xyXG4gICAgb2Zmc2V0WSA9IHZlcnRleE9mZnNldFtSZWdpb25BdHRhY2htZW50Lk9ZNF07XHJcbiAgICB3b3JsZFZlcnRpY2VzW29mZnNldF0gPSBvZmZzZXRYICogYSArIG9mZnNldFkgKiBiICsgeDsgLy8gdXJcclxuICAgIHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcclxuICB9XHJcblxyXG4gIGNvcHkoKTogQXR0YWNobWVudCB7XHJcbiAgICBsZXQgY29weSA9IG5ldyBSZWdpb25BdHRhY2htZW50KG5hbWUpO1xyXG4gICAgY29weS5yZWdpb24gPSB0aGlzLnJlZ2lvbjtcclxuICAgIGNvcHkucmVuZGVyZXJPYmplY3QgPSB0aGlzLnJlbmRlcmVyT2JqZWN0O1xyXG4gICAgY29weS5wYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgY29weS54ID0gdGhpcy54O1xyXG4gICAgY29weS55ID0gdGhpcy55O1xyXG4gICAgY29weS5zY2FsZVggPSB0aGlzLnNjYWxlWDtcclxuICAgIGNvcHkuc2NhbGVZID0gdGhpcy5zY2FsZVk7XHJcbiAgICBjb3B5LnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcclxuICAgIGNvcHkud2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgY29weS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgIFV0aWxzLmFycmF5Q29weSh0aGlzLnV2cywgMCwgY29weS51dnMsIDAsIDgpO1xyXG4gICAgVXRpbHMuYXJyYXlDb3B5KHRoaXMub2Zmc2V0LCAwLCBjb3B5Lm9mZnNldCwgMCwgOCk7XHJcbiAgICBjb3B5LmNvbG9yLnNldEZyb21Db2xvcih0aGlzLmNvbG9yKTtcclxuICAgIHJldHVybiBjb3B5O1xyXG4gIH1cclxufVxyXG4iXX0=