UNPKG

@esotericsoftware/spine-core

Version:
203 lines 28.6 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, 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. * * THE SPINE RUNTIMES ARE 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 * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { Color, MathUtils } from "../Utils.js"; import { Attachment } from "./Attachment.js"; /** An attachment that displays a textured quadrilateral. * * See [Region attachments](http://esotericsoftware.com/spine-regions) in the Spine User Guide. */ export class RegionAttachment extends Attachment { sequence; /** The local x translation. */ x = 0; /** The local y translation. */ y = 0; /** The local scaleX. */ scaleX = 1; /** The local scaleY. */ scaleY = 1; /** The local rotation in degrees, counter clockwise. */ rotation = 0; /** The width of the region attachment in Spine. */ width = 0; /** The height of the region attachment in Spine. */ height = 0; /** The name of the texture region for this attachment. */ path; /** The color to tint the region attachment. */ color = new Color(1, 1, 1, 1); tempColor = new Color(1, 1, 1, 1); constructor(name, sequence) { super(name); this.sequence = sequence; } copy() { const copy = new RegionAttachment(this.name, this.sequence.copy()); 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; copy.color.setFromColor(this.color); return copy; } /** Transforms the attachment's four vertices to world coordinates. * * See <a href="http://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine * Runtimes Guide. * @param worldVertices The output world vertices. Must have a length >= `offset` + 8. * @param offset The `worldVertices` index to begin writing values. * @param stride The number of `worldVertices` entries between the value pairs written. */ computeWorldVertices(slot, vertexOffsets, worldVertices, offset, stride) { const bone = slot.bone.appliedPose; const x = bone.worldX, y = bone.worldY; const a = bone.a, b = bone.b, c = bone.c, d = bone.d; let offsetX = vertexOffsets[0]; let offsetY = vertexOffsets[1]; worldVertices[offset] = offsetX * a + offsetY * b + x; // br worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffsets[2]; offsetY = vertexOffsets[3]; worldVertices[offset] = offsetX * a + offsetY * b + x; // bl worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffsets[4]; offsetY = vertexOffsets[5]; worldVertices[offset] = offsetX * a + offsetY * b + x; // ul worldVertices[offset + 1] = offsetX * c + offsetY * d + y; offset += stride; offsetX = vertexOffsets[6]; offsetY = vertexOffsets[7]; worldVertices[offset] = offsetX * a + offsetY * b + x; // ur worldVertices[offset + 1] = offsetX * c + offsetY * d + y; } getOffsets(pose) { // biome-ignore lint/style/noNonNullAssertion: offsets are always defined after updateSequence return this.sequence.offsets[this.sequence.resolveIndex(pose)]; } updateSequence() { this.sequence.update(this); } /** Computes {@link Sequence.getUVs | UVs} and {@link Sequence.getOffsets | offsets} for a region attachment. * @param uvs Output array for the computed UVs, length of 8. * @param offset Output array for the computed vertex offsets, length of 8. */ static computeUVs(region, x, y, scaleX, scaleY, rotation, width, height, offset, uvs) { if (!region) throw new Error("Region not set."); const regionScaleX = width / region.originalWidth * scaleX; const regionScaleY = height / region.originalHeight * scaleY; const localX = -width / 2 * scaleX + region.offsetX * regionScaleX; const localY = -height / 2 * scaleY + region.offsetY * regionScaleY; const localX2 = localX + region.width * regionScaleX; const localY2 = localY + region.height * regionScaleY; const radians = rotation * MathUtils.degRad; const cos = Math.cos(radians); const sin = Math.sin(radians); const localXCos = localX * cos + x; const localXSin = localX * sin; const localYCos = localY * cos + y; const localYSin = localY * sin; const localX2Cos = localX2 * cos + x; const localX2Sin = localX2 * sin; const localY2Cos = localY2 * cos + y; const localY2Sin = localY2 * sin; offset[0] = localXCos - localYSin; offset[1] = localYCos + localXSin; offset[2] = localXCos - localY2Sin; offset[3] = localY2Cos + localXSin; offset[4] = localX2Cos - localY2Sin; offset[5] = localY2Cos + localX2Sin; offset[6] = localX2Cos - localYSin; offset[7] = localYCos + localX2Sin; if (region == null) { uvs[0] = 0; uvs[1] = 0; uvs[2] = 0; uvs[3] = 1; uvs[4] = 1; uvs[5] = 1; uvs[6] = 1; uvs[7] = 0; } else { uvs[1] = region.v2; uvs[2] = region.u; uvs[5] = region.v; uvs[6] = region.u2; if (region.degrees === 90) { uvs[0] = region.u2; uvs[3] = region.v2; uvs[4] = region.u; uvs[7] = region.v; } else { uvs[0] = region.u; uvs[3] = region.v; uvs[4] = region.u2; uvs[7] = region.v2; } } } static X1 = 0; static Y1 = 1; static C1R = 2; static C1G = 3; static C1B = 4; static C1A = 5; static U1 = 6; static V1 = 7; static X2 = 8; static Y2 = 9; static C2R = 10; static C2G = 11; static C2B = 12; static C2A = 13; static U2 = 14; static V2 = 15; static X3 = 16; static Y3 = 17; static C3R = 18; static C3G = 19; static C3B = 20; static C3A = 21; static U3 = 22; static V3 = 23; static X4 = 24; static Y4 = 25; static C4R = 26; static C4G = 27; static C4B = 28; static C4A = 29; static U4 = 30; static V4 = 31; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVnaW9uQXR0YWNobWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdHRhY2htZW50cy9SZWdpb25BdHRhY2htZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUsvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBd0IsTUFBTSxhQUFhLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSTdDOztrR0FFa0c7QUFDbEcsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFVBQVU7SUFDdEMsUUFBUSxDQUFXO0lBRTVCLCtCQUErQjtJQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sK0JBQStCO0lBQy9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTix3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLHdCQUF3QjtJQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsd0RBQXdEO0lBQ3hELFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYixtREFBbUQ7SUFDbkQsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVWLG9EQUFvRDtJQUNwRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsMERBQTBEO0lBQzFELElBQUksQ0FBVTtJQUVkLCtDQUErQztJQUMvQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUIsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxDLFlBQWEsSUFBWSxFQUFFLFFBQWtCO1FBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLENBQUM7SUFF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QUFDO0lBQ2hCLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2YsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNoQixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IFNsb3RQb3NlIH0gZnJvbSBcIi4uL1Nsb3RQb3NlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3QgfSBmcm9tIFwiLi4vU2xvdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUZXh0dXJlUmVnaW9uIH0gZnJvbSBcIi4uL1RleHR1cmUuanNcIjtcbmltcG9ydCB7IENvbG9yLCBNYXRoVXRpbHMsIHR5cGUgTnVtYmVyQXJyYXlMaWtlIH0gZnJvbSBcIi4uL1V0aWxzLmpzXCI7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSBcIi4vQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBIYXNTZXF1ZW5jZSB9IGZyb20gXCIuL0hhc1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNlcXVlbmNlIH0gZnJvbSBcIi4vU2VxdWVuY2UuanNcIjtcblxuLyoqIEFuIGF0dGFjaG1lbnQgdGhhdCBkaXNwbGF5cyBhIHRleHR1cmVkIHF1YWRyaWxhdGVyYWwuXG4gKlxuICogU2VlIFtSZWdpb24gYXR0YWNobWVudHNdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1yZWdpb25zKSBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25BdHRhY2htZW50IGV4dGVuZHMgQXR0YWNobWVudCBpbXBsZW1lbnRzIEhhc1NlcXVlbmNlIHtcblx0cmVhZG9ubHkgc2VxdWVuY2U6IFNlcXVlbmNlO1xuXG5cdC8qKiBUaGUgbG9jYWwgeCB0cmFuc2xhdGlvbi4gKi9cblx0eCA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCB5IHRyYW5zbGF0aW9uLiAqL1xuXHR5ID0gMDtcblxuXHQvKiogVGhlIGxvY2FsIHNjYWxlWC4gKi9cblx0c2NhbGVYID0gMTtcblxuXHQvKiogVGhlIGxvY2FsIHNjYWxlWS4gKi9cblx0c2NhbGVZID0gMTtcblxuXHQvKiogVGhlIGxvY2FsIHJvdGF0aW9uIGluIGRlZ3JlZXMsIGNvdW50ZXIgY2xvY2t3aXNlLiAqL1xuXHRyb3RhdGlvbiA9IDA7XG5cblx0LyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIGF0dGFjaG1lbnQgaW4gU3BpbmUuICovXG5cdHdpZHRoID0gMDtcblxuXHQvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIGF0dGFjaG1lbnQgaW4gU3BpbmUuICovXG5cdGhlaWdodCA9IDA7XG5cblx0LyoqIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHJlZ2lvbiBmb3IgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRwYXRoPzogc3RyaW5nO1xuXG5cdC8qKiBUaGUgY29sb3IgdG8gdGludCB0aGUgcmVnaW9uIGF0dGFjaG1lbnQuICovXG5cdGNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEsIDEpO1xuXG5cdHRlbXBDb2xvciA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcblxuXHRjb25zdHJ1Y3RvciAobmFtZTogc3RyaW5nLCBzZXF1ZW5jZTogU2VxdWVuY2UpIHtcblx0XHRzdXBlcihuYW1lKTtcblx0XHR0aGlzLnNlcXVlbmNlID0gc2VxdWVuY2U7XG5cdH1cblxuXHRjb3B5ICgpOiBBdHRhY2htZW50IHtcblx0XHRjb25zdCBjb3B5ID0gbmV3IFJlZ2lvbkF0dGFjaG1lbnQodGhpcy5uYW1lLCB0aGlzLnNlcXVlbmNlLmNvcHkoKSk7XG5cdFx0Y29weS5wYXRoID0gdGhpcy5wYXRoO1xuXHRcdGNvcHkueCA9IHRoaXMueDtcblx0XHRjb3B5LnkgPSB0aGlzLnk7XG5cdFx0Y29weS5zY2FsZVggPSB0aGlzLnNjYWxlWDtcblx0XHRjb3B5LnNjYWxlWSA9IHRoaXMuc2NhbGVZO1xuXHRcdGNvcHkucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xuXHRcdGNvcHkud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGNvcHkuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cdFx0Y29weS5jb2xvci5zZXRGcm9tQ29sb3IodGhpcy5jb2xvcik7XG5cdFx0cmV0dXJuIGNvcHk7XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyB0aGUgYXR0YWNobWVudCdzIGZvdXIgdmVydGljZXMgdG8gd29ybGQgY29vcmRpbmF0ZXMuXG5cdCAqXG5cdCAqIFNlZSA8YSBocmVmPVwiaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtc2tlbGV0b25zI1dvcmxkLXRyYW5zZm9ybXNcIj5Xb3JsZCB0cmFuc2Zvcm1zPC9hPiBpbiB0aGUgU3BpbmVcblx0ICogUnVudGltZXMgR3VpZGUuXG5cdCAqIEBwYXJhbSB3b3JsZFZlcnRpY2VzIFRoZSBvdXRwdXQgd29ybGQgdmVydGljZXMuIE11c3QgaGF2ZSBhIGxlbmd0aCA+PSBgb2Zmc2V0YCArIDguXG5cdCAqIEBwYXJhbSBvZmZzZXQgVGhlIGB3b3JsZFZlcnRpY2VzYCBpbmRleCB0byBiZWdpbiB3cml0aW5nIHZhbHVlcy5cblx0ICogQHBhcmFtIHN0cmlkZSBUaGUgbnVtYmVyIG9mIGB3b3JsZFZlcnRpY2VzYCBlbnRyaWVzIGJldHdlZW4gdGhlIHZhbHVlIHBhaXJzIHdyaXR0ZW4uICovXG5cdGNvbXB1dGVXb3JsZFZlcnRpY2VzIChzbG90OiBTbG90LCB2ZXJ0ZXhPZmZzZXRzOiBOdW1iZXJBcnJheUxpa2UsIHdvcmxkVmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgb2Zmc2V0OiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKSB7XG5cblx0XHRjb25zdCBib25lID0gc2xvdC5ib25lLmFwcGxpZWRQb3NlO1xuXHRcdGNvbnN0IHggPSBib25lLndvcmxkWCwgeSA9IGJvbmUud29ybGRZO1xuXHRcdGNvbnN0IGEgPSBib25lLmEsIGIgPSBib25lLmIsIGMgPSBib25lLmMsIGQgPSBib25lLmQ7XG5cblx0XHRsZXQgb2Zmc2V0WCA9IHZlcnRleE9mZnNldHNbMF07XG5cdFx0bGV0IG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRzWzFdO1xuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyBiclxuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcblx0XHRvZmZzZXQgKz0gc3RyaWRlO1xuXG5cdFx0b2Zmc2V0WCA9IHZlcnRleE9mZnNldHNbMl07XG5cdFx0b2Zmc2V0WSA9IHZlcnRleE9mZnNldHNbM107XG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXRdID0gb2Zmc2V0WCAqIGEgKyBvZmZzZXRZICogYiArIHg7IC8vIGJsXG5cdFx0d29ybGRWZXJ0aWNlc1tvZmZzZXQgKyAxXSA9IG9mZnNldFggKiBjICsgb2Zmc2V0WSAqIGQgKyB5O1xuXHRcdG9mZnNldCArPSBzdHJpZGU7XG5cblx0XHRvZmZzZXRYID0gdmVydGV4T2Zmc2V0c1s0XTtcblx0XHRvZmZzZXRZID0gdmVydGV4T2Zmc2V0c1s1XTtcblx0XHR3b3JsZFZlcnRpY2VzW29mZnNldF0gPSBvZmZzZXRYICogYSArIG9mZnNldFkgKiBiICsgeDsgLy8gdWxcblx0XHR3b3JsZFZlcnRpY2VzW29mZnNldCArIDFdID0gb2Zmc2V0WCAqIGMgKyBvZmZzZXRZICogZCArIHk7XG5cdFx0b2Zmc2V0ICs9IHN0cmlkZTtcblxuXHRcdG9mZnNldFggPSB2ZXJ0ZXhPZmZzZXRzWzZdO1xuXHRcdG9mZnNldFkgPSB2ZXJ0ZXhPZmZzZXRzWzddO1xuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0XSA9IG9mZnNldFggKiBhICsgb2Zmc2V0WSAqIGIgKyB4OyAvLyB1clxuXHRcdHdvcmxkVmVydGljZXNbb2Zmc2V0ICsgMV0gPSBvZmZzZXRYICogYyArIG9mZnNldFkgKiBkICsgeTtcblx0fVxuXG5cdGdldE9mZnNldHMgKHBvc2U6IFNsb3RQb3NlKTogbnVtYmVyW10ge1xuXHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogb2Zmc2V0cyBhcmUgYWx3YXlzIGRlZmluZWQgYWZ0ZXIgdXBkYXRlU2VxdWVuY2Vcblx0XHRyZXR1cm4gdGhpcy5zZXF1ZW5jZS5vZmZzZXRzIVt0aGlzLnNlcXVlbmNlLnJlc29sdmVJbmRleChwb3NlKV07XG5cdH1cblxuXHR1cGRhdGVTZXF1ZW5jZSAoKSB7XG5cdFx0dGhpcy5zZXF1ZW5jZS51cGRhdGUodGhpcyk7XG5cdH1cblxuXHQvKiogQ29tcHV0ZXMge0BsaW5rIFNlcXVlbmNlLmdldFVWcyB8IFVWc30gYW5kIHtAbGluayBTZXF1ZW5jZS5nZXRPZmZzZXRzIHwgb2Zmc2V0c30gZm9yIGEgcmVnaW9uIGF0dGFjaG1lbnQuXG5cdCAqIEBwYXJhbSB1dnMgT3V0cHV0IGFycmF5IGZvciB0aGUgY29tcHV0ZWQgVVZzLCBsZW5ndGggb2YgOC5cblx0ICogQHBhcmFtIG9mZnNldCBPdXRwdXQgYXJyYXkgZm9yIHRoZSBjb21wdXRlZCB2ZXJ0ZXggb2Zmc2V0cywgbGVuZ3RoIG9mIDguICovXG5cdHN0YXRpYyBjb21wdXRlVVZzIChyZWdpb246IFRleHR1cmVSZWdpb24gfCBudWxsLCB4OiBudW1iZXIsIHk6IG51bWJlciwgc2NhbGVYOiBudW1iZXIsIHNjYWxlWTogbnVtYmVyLCByb3RhdGlvbjogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuXHRcdGhlaWdodDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcltdLCB1dnM6IE51bWJlckFycmF5TGlrZSk6IHZvaWQge1xuXG5cdFx0aWYgKCFyZWdpb24pIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbiBub3Qgc2V0LlwiKTtcblx0XHRjb25zdCByZWdpb25TY2FsZVggPSB3aWR0aCAvIHJlZ2lvbi5vcmlnaW5hbFdpZHRoICogc2NhbGVYO1xuXHRcdGNvbnN0IHJlZ2lvblNjYWxlWSA9IGhlaWdodCAvIHJlZ2lvbi5vcmlnaW5hbEhlaWdodCAqIHNjYWxlWTtcblx0XHRjb25zdCBsb2NhbFggPSAtd2lkdGggLyAyICogc2NhbGVYICsgcmVnaW9uLm9mZnNldFggKiByZWdpb25TY2FsZVg7XG5cdFx0Y29uc3QgbG9jYWxZID0gLWhlaWdodCAvIDIgKiBzY2FsZVkgKyByZWdpb24ub2Zmc2V0WSAqIHJlZ2lvblNjYWxlWTtcblx0XHRjb25zdCBsb2NhbFgyID0gbG9jYWxYICsgcmVnaW9uLndpZHRoICogcmVnaW9uU2NhbGVYO1xuXHRcdGNvbnN0IGxvY2FsWTIgPSBsb2NhbFkgKyByZWdpb24uaGVpZ2h0ICogcmVnaW9uU2NhbGVZO1xuXHRcdGNvbnN0IHJhZGlhbnMgPSByb3RhdGlvbiAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0Y29uc3QgY29zID0gTWF0aC5jb3MocmFkaWFucyk7XG5cdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4ocmFkaWFucyk7XG5cdFx0Y29uc3QgbG9jYWxYQ29zID0gbG9jYWxYICogY29zICsgeDtcblx0XHRjb25zdCBsb2NhbFhTaW4gPSBsb2NhbFggKiBzaW47XG5cdFx0Y29uc3QgbG9jYWxZQ29zID0gbG9jYWxZICogY29zICsgeTtcblx0XHRjb25zdCBsb2NhbFlTaW4gPSBsb2NhbFkgKiBzaW47XG5cdFx0Y29uc3QgbG9jYWxYMkNvcyA9IGxvY2FsWDIgKiBjb3MgKyB4O1xuXHRcdGNvbnN0IGxvY2FsWDJTaW4gPSBsb2NhbFgyICogc2luO1xuXHRcdGNvbnN0IGxvY2FsWTJDb3MgPSBsb2NhbFkyICogY29zICsgeTtcblx0XHRjb25zdCBsb2NhbFkyU2luID0gbG9jYWxZMiAqIHNpbjtcblx0XHRvZmZzZXRbMF0gPSBsb2NhbFhDb3MgLSBsb2NhbFlTaW47XG5cdFx0b2Zmc2V0WzFdID0gbG9jYWxZQ29zICsgbG9jYWxYU2luO1xuXHRcdG9mZnNldFsyXSA9IGxvY2FsWENvcyAtIGxvY2FsWTJTaW47XG5cdFx0b2Zmc2V0WzNdID0gbG9jYWxZMkNvcyArIGxvY2FsWFNpbjtcblx0XHRvZmZzZXRbNF0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZMlNpbjtcblx0XHRvZmZzZXRbNV0gPSBsb2NhbFkyQ29zICsgbG9jYWxYMlNpbjtcblx0XHRvZmZzZXRbNl0gPSBsb2NhbFgyQ29zIC0gbG9jYWxZU2luO1xuXHRcdG9mZnNldFs3XSA9IGxvY2FsWUNvcyArIGxvY2FsWDJTaW47XG5cblx0XHRpZiAocmVnaW9uID09IG51bGwpIHtcblx0XHRcdHV2c1swXSA9IDA7XG5cdFx0XHR1dnNbMV0gPSAwO1xuXHRcdFx0dXZzWzJdID0gMDtcblx0XHRcdHV2c1szXSA9IDE7XG5cdFx0XHR1dnNbNF0gPSAxO1xuXHRcdFx0dXZzWzVdID0gMTtcblx0XHRcdHV2c1s2XSA9IDE7XG5cdFx0XHR1dnNbN10gPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1dnNbMV0gPSByZWdpb24udjI7XG5cdFx0XHR1dnNbMl0gPSByZWdpb24udTtcblx0XHRcdHV2c1s1XSA9IHJlZ2lvbi52O1xuXHRcdFx0dXZzWzZdID0gcmVnaW9uLnUyO1xuXHRcdFx0aWYgKHJlZ2lvbi5kZWdyZWVzID09PSA5MCkge1xuXHRcdFx0XHR1dnNbMF0gPSByZWdpb24udTI7XG5cdFx0XHRcdHV2c1szXSA9IHJlZ2lvbi52Mjtcblx0XHRcdFx0dXZzWzRdID0gcmVnaW9uLnU7XG5cdFx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXZzWzBdID0gcmVnaW9uLnU7XG5cdFx0XHRcdHV2c1szXSA9IHJlZ2lvbi52O1xuXHRcdFx0XHR1dnNbNF0gPSByZWdpb24udTI7XG5cdFx0XHRcdHV2c1s3XSA9IHJlZ2lvbi52Mjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzdGF0aWMgWDEgPSAwO1xuXHRzdGF0aWMgWTEgPSAxO1xuXHRzdGF0aWMgQzFSID0gMjtcblx0c3RhdGljIEMxRyA9IDM7XG5cdHN0YXRpYyBDMUIgPSA0O1xuXHRzdGF0aWMgQzFBID0gNTtcblx0c3RhdGljIFUxID0gNjtcblx0c3RhdGljIFYxID0gNztcblxuXHRzdGF0aWMgWDIgPSA4O1xuXHRzdGF0aWMgWTIgPSA5O1xuXHRzdGF0aWMgQzJSID0gMTA7XG5cdHN0YXRpYyBDMkcgPSAxMTtcblx0c3RhdGljIEMyQiA9IDEyO1xuXHRzdGF0aWMgQzJBID0gMTM7XG5cdHN0YXRpYyBVMiA9IDE0O1xuXHRzdGF0aWMgVjIgPSAxNTtcblxuXHRzdGF0aWMgWDMgPSAxNjtcblx0c3RhdGljIFkzID0gMTc7XG5cdHN0YXRpYyBDM1IgPSAxODtcblx0c3RhdGljIEMzRyA9IDE5O1xuXHRzdGF0aWMgQzNCID0gMjA7XG5cdHN0YXRpYyBDM0EgPSAyMTtcblx0c3RhdGljIFUzID0gMjI7XG5cdHN0YXRpYyBWMyA9IDIzO1xuXG5cdHN0YXRpYyBYNCA9IDI0O1xuXHRzdGF0aWMgWTQgPSAyNTtcblx0c3RhdGljIEM0UiA9IDI2O1xuXHRzdGF0aWMgQzRHID0gMjc7XG5cdHN0YXRpYyBDNEIgPSAyODtcblx0c3RhdGljIEM0QSA9IDI5O1xuXHRzdGF0aWMgVTQgPSAzMDtcblx0c3RhdGljIFY0ID0gMzE7XG59XG4iXX0=