UNPKG

ngx-spine

Version:

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

391 lines 45.4 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 { Color, Utils } from "../core/Utils"; import { ManagedWebGLRenderingContext } from "./WebGL"; import { SkeletonBounds } from "../core/SkeletonBounds"; import { RegionAttachment } from "../core/attachments/RegionAttachment"; import { MeshAttachment } from "../core/attachments/MeshAttachment"; import { PathAttachment } from "../core/attachments/PathAttachment"; import { ClippingAttachment } from "../core/attachments/ClippingAttachment"; var SkeletonDebugRenderer = /** @class */ (function () { function SkeletonDebugRenderer(context) { this.boneLineColor = new Color(1, 0, 0, 1); this.boneOriginColor = new Color(0, 1, 0, 1); this.attachmentLineColor = new Color(0, 0, 1, 0.5); this.triangleLineColor = new Color(1, 0.64, 0, 0.5); this.pathColor = new Color().setFromString("FF7F00"); this.clipColor = new Color(0.8, 0, 0, 2); this.aabbColor = new Color(0, 1, 0, 0.5); this.drawBones = true; this.drawRegionAttachments = true; this.drawBoundingBoxes = true; this.drawMeshHull = true; this.drawMeshTriangles = true; this.drawPaths = true; this.drawSkeletonXY = false; this.drawClipping = true; this.premultipliedAlpha = false; this.scale = 1; this.boneWidth = 2; this.bounds = new SkeletonBounds(); this.temp = new Array(); this.vertices = Utils.newFloatArray(2 * 1024); this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); } /** * @param {?} shapes * @param {?} skeleton * @param {?=} ignoredBones * @return {?} */ SkeletonDebugRenderer.prototype.draw = /** * @param {?} shapes * @param {?} skeleton * @param {?=} ignoredBones * @return {?} */ function (shapes, skeleton, ignoredBones) { if (ignoredBones === void 0) { ignoredBones = null; } /** @type {?} */ var skeletonX = skeleton.x; /** @type {?} */ var skeletonY = skeleton.y; /** @type {?} */ var gl = this.context.gl; /** @type {?} */ var srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA; shapes.setBlendMode(srcFunc, gl.ONE_MINUS_SRC_ALPHA); /** @type {?} */ var bones = skeleton.bones; if (this.drawBones) { shapes.setColor(this.boneLineColor); for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) continue; if (bone.parent == null) continue; /** @type {?} */ var x = skeletonX + bone.data.length * bone.a + bone.worldX; /** @type {?} */ var y = skeletonY + bone.data.length * bone.c + bone.worldY; shapes.rectLine(true, skeletonX + bone.worldX, skeletonY + bone.worldY, x, y, this.boneWidth * this.scale); } if (this.drawSkeletonXY) shapes.x(skeletonX, skeletonY, 4 * this.scale); } if (this.drawRegionAttachments) { shapes.setColor(this.attachmentLineColor); /** @type {?} */ var slots = skeleton.slots; for (var i = 0, n = slots.length; i < n; i++) { /** @type {?} */ var slot = slots[i]; /** @type {?} */ var attachment = slot.getAttachment(); if (attachment instanceof RegionAttachment) { /** @type {?} */ var regionAttachment = (/** @type {?} */ (attachment)); /** @type {?} */ var vertices = this.vertices; regionAttachment.computeWorldVertices(slot.bone, vertices, 0, 2); shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]); shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]); shapes.line(vertices[4], vertices[5], vertices[6], vertices[7]); shapes.line(vertices[6], vertices[7], vertices[0], vertices[1]); } } } if (this.drawMeshHull || this.drawMeshTriangles) { /** @type {?} */ var slots = skeleton.slots; for (var i = 0, n = slots.length; i < n; i++) { /** @type {?} */ var slot = slots[i]; /** @type {?} */ var attachment = slot.getAttachment(); if (!(attachment instanceof MeshAttachment)) continue; /** @type {?} */ var mesh = (/** @type {?} */ (attachment)); /** @type {?} */ var vertices = this.vertices; mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2); /** @type {?} */ var triangles = mesh.triangles; /** @type {?} */ var hullLength = mesh.hullLength; if (this.drawMeshTriangles) { shapes.setColor(this.triangleLineColor); for (var ii = 0, nn = triangles.length; ii < nn; ii += 3) { /** @type {?} */ var v1 = triangles[ii] * 2; /** @type {?} */ var v2 = triangles[ii + 1] * 2; /** @type {?} */ var v3 = triangles[ii + 2] * 2; shapes.triangle(false, vertices[v1], vertices[v1 + 1], // vertices[v2], vertices[v2 + 1], // vertices[v3], vertices[v3 + 1] // ); } } if (this.drawMeshHull && hullLength > 0) { shapes.setColor(this.attachmentLineColor); hullLength = (hullLength >> 1) * 2; /** @type {?} */ var lastX = vertices[hullLength - 2]; /** @type {?} */ var lastY = vertices[hullLength - 1]; for (var ii = 0, nn = hullLength; ii < nn; ii += 2) { /** @type {?} */ var x = vertices[ii]; /** @type {?} */ var y = vertices[ii + 1]; shapes.line(x, y, lastX, lastY); lastX = x; lastY = y; } } } } if (this.drawBoundingBoxes) { /** @type {?} */ var bounds = this.bounds; bounds.update(skeleton, true); shapes.setColor(this.aabbColor); shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight()); /** @type {?} */ var polygons = bounds.polygons; /** @type {?} */ var boxes = bounds.boundingBoxes; for (var i = 0, n = polygons.length; i < n; i++) { /** @type {?} */ var polygon = polygons[i]; shapes.setColor(boxes[i].color); shapes.polygon(polygon, 0, polygon.length); } } if (this.drawPaths) { /** @type {?} */ var slots = skeleton.slots; for (var i = 0, n = slots.length; i < n; i++) { /** @type {?} */ var slot = slots[i]; /** @type {?} */ var attachment = slot.getAttachment(); if (!(attachment instanceof PathAttachment)) continue; /** @type {?} */ var path = (/** @type {?} */ (attachment)); /** @type {?} */ var nn = path.worldVerticesLength; /** @type {?} */ var world = (this.temp = Utils.setArraySize(this.temp, nn, 0)); path.computeWorldVertices(slot, 0, nn, world, 0, 2); /** @type {?} */ var color = this.pathColor; /** @type {?} */ var x1 = world[2]; /** @type {?} */ var y1 = world[3]; /** @type {?} */ var x2 = 0; /** @type {?} */ var y2 = 0; if (path.closed) { shapes.setColor(color); /** @type {?} */ var cx1 = world[0]; /** @type {?} */ var cy1 = world[1]; /** @type {?} */ var cx2 = world[nn - 2]; /** @type {?} */ var cy2 = world[nn - 1]; x2 = world[nn - 4]; y2 = world[nn - 3]; shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); shapes.line(x1, y1, cx1, cy1); shapes.line(x2, y2, cx2, cy2); } nn -= 4; for (var ii = 4; ii < nn; ii += 6) { /** @type {?} */ var cx1 = world[ii]; /** @type {?} */ var cy1 = world[ii + 1]; /** @type {?} */ var cx2 = world[ii + 2]; /** @type {?} */ var cy2 = world[ii + 3]; x2 = world[ii + 4]; y2 = world[ii + 5]; shapes.setColor(color); shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); shapes.line(x1, y1, cx1, cy1); shapes.line(x2, y2, cx2, cy2); x1 = x2; y1 = y2; } } } if (this.drawBones) { shapes.setColor(this.boneOriginColor); for (var i = 0, n = bones.length; i < n; i++) { /** @type {?} */ var bone = bones[i]; if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) continue; shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8); } } if (this.drawClipping) { /** @type {?} */ var slots = skeleton.slots; shapes.setColor(this.clipColor); for (var i = 0, n = slots.length; i < n; i++) { /** @type {?} */ var slot = slots[i]; /** @type {?} */ var attachment = slot.getAttachment(); if (!(attachment instanceof ClippingAttachment)) continue; /** @type {?} */ var clip = (/** @type {?} */ (attachment)); /** @type {?} */ var nn = clip.worldVerticesLength; /** @type {?} */ var world = (this.temp = Utils.setArraySize(this.temp, nn, 0)); clip.computeWorldVertices(slot, 0, nn, world, 0, 2); for (var i_1 = 0, n_1 = world.length; i_1 < n_1; i_1 += 2) { /** @type {?} */ var x = world[i_1]; /** @type {?} */ var y = world[i_1 + 1]; /** @type {?} */ var x2 = world[(i_1 + 2) % world.length]; /** @type {?} */ var y2 = world[(i_1 + 3) % world.length]; shapes.line(x, y, x2, y2); } } } }; /** * @return {?} */ SkeletonDebugRenderer.prototype.dispose = /** * @return {?} */ function () { }; SkeletonDebugRenderer.LIGHT_GRAY = new Color(192 / 255, 192 / 255, 192 / 255, 1); SkeletonDebugRenderer.GREEN = new Color(0, 1, 0, 1); return SkeletonDebugRenderer; }()); export { SkeletonDebugRenderer }; if (false) { /** * @type {?} * @private */ SkeletonDebugRenderer.LIGHT_GRAY; /** * @type {?} * @private */ SkeletonDebugRenderer.GREEN; /** @type {?} */ SkeletonDebugRenderer.prototype.boneLineColor; /** @type {?} */ SkeletonDebugRenderer.prototype.boneOriginColor; /** @type {?} */ SkeletonDebugRenderer.prototype.attachmentLineColor; /** @type {?} */ SkeletonDebugRenderer.prototype.triangleLineColor; /** @type {?} */ SkeletonDebugRenderer.prototype.pathColor; /** @type {?} */ SkeletonDebugRenderer.prototype.clipColor; /** @type {?} */ SkeletonDebugRenderer.prototype.aabbColor; /** @type {?} */ SkeletonDebugRenderer.prototype.drawBones; /** @type {?} */ SkeletonDebugRenderer.prototype.drawRegionAttachments; /** @type {?} */ SkeletonDebugRenderer.prototype.drawBoundingBoxes; /** @type {?} */ SkeletonDebugRenderer.prototype.drawMeshHull; /** @type {?} */ SkeletonDebugRenderer.prototype.drawMeshTriangles; /** @type {?} */ SkeletonDebugRenderer.prototype.drawPaths; /** @type {?} */ SkeletonDebugRenderer.prototype.drawSkeletonXY; /** @type {?} */ SkeletonDebugRenderer.prototype.drawClipping; /** @type {?} */ SkeletonDebugRenderer.prototype.premultipliedAlpha; /** @type {?} */ SkeletonDebugRenderer.prototype.scale; /** @type {?} */ SkeletonDebugRenderer.prototype.boneWidth; /** * @type {?} * @private */ SkeletonDebugRenderer.prototype.context; /** * @type {?} * @private */ SkeletonDebugRenderer.prototype.bounds; /** * @type {?} * @private */ SkeletonDebugRenderer.prototype.temp; /** * @type {?} * @private */ SkeletonDebugRenderer.prototype.vertices; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL3dlYmdsL1NrZWxldG9uRGVidWdSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFNUU7SUF5QkUsK0JBQVksT0FBNkQ7UUF4QnpFLGtCQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsb0JBQWUsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4Qyx3QkFBbUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7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QUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBQ0QsdUNBQU87OztJQUFQLGNBQVcsQ0FBQztJQTlNRyxnQ0FBVSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNELDJCQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUE4TS9DLDRCQUFDO0NBQUEsQUF0T0QsSUFzT0M7U0F0T1kscUJBQXFCOzs7Ozs7SUF1QmhDLGlDQUEwRTs7Ozs7SUFDMUUsNEJBQTZDOztJQXZCN0MsOENBQXNDOztJQUN0QyxnREFBd0M7O0lBQ3hDLG9EQUE4Qzs7SUFDOUMsa0RBQStDOztJQUMvQywwQ0FBZ0Q7O0lBQ2hELDBDQUFvQzs7SUFDcEMsMENBQW9DOztJQUNwQywwQ0FBaUI7O0lBQ2pCLHNEQUE2Qjs7SUFDN0Isa0RBQXlCOztJQUN6Qiw2Q0FBb0I7O0lBQ3BCLGtEQUF5Qjs7SUFDekIsMENBQWlCOztJQUNqQiwrQ0FBdUI7O0lBQ3ZCLDZDQUFvQjs7SUFDcEIsbURBQTJCOztJQUMzQixzQ0FBVTs7SUFDViwwQ0FBYzs7Ozs7SUFDZCx3Q0FBOEM7Ozs7O0lBQzlDLHVDQUFzQzs7Ozs7SUFDdEMscUNBQW1DOzs7OztJQUNuQyx5Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XHJcbiAqIExhc3QgdXBkYXRlZCBNYXkgMSwgMjAxOS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXHJcbiAqXHJcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xyXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxyXG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcclxuICpcclxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXHJcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcclxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxyXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcclxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1NcclxuICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFU1xyXG4gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTlxyXG4gKiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCxcclxuICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLCBCVVNJTkVTU1xyXG4gKiBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXHJcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xyXG4gKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsXHJcbiAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29sb3IsIFV0aWxzLCBEaXNwb3NhYmxlIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB9IGZyb20gXCIuL1dlYkdMXCI7XHJcbmltcG9ydCB7IFNrZWxldG9uQm91bmRzIH0gZnJvbSBcIi4uL2NvcmUvU2tlbGV0b25Cb3VuZHNcIjtcclxuaW1wb3J0IHsgU2hhcGVSZW5kZXJlciB9IGZyb20gXCIuL1NoYXBlUmVuZGVyZXJcIjtcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tIFwiLi4vY29yZS9Ta2VsZXRvblwiO1xyXG5pbXBvcnQgeyBSZWdpb25BdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUmVnaW9uQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuLi9jb3JlL2F0dGFjaG1lbnRzL01lc2hBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IFBhdGhBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUGF0aEF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgQ2xpcHBpbmdBdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvQ2xpcHBpbmdBdHRhY2htZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tlbGV0b25EZWJ1Z1JlbmRlcmVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XHJcbiAgYm9uZUxpbmVDb2xvciA9IG5ldyBDb2xvcigxLCAwLCAwLCAxKTtcclxuICBib25lT3JpZ2luQ29sb3IgPSBuZXcgQ29sb3IoMCwgMSwgMCwgMSk7XHJcbiAgYXR0YWNobWVudExpbmVDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAxLCAwLjUpO1xyXG4gIHRyaWFuZ2xlTGluZUNvbG9yID0gbmV3IENvbG9yKDEsIDAuNjQsIDAsIDAuNSk7XHJcbiAgcGF0aENvbG9yID0gbmV3IENvbG9yKCkuc2V0RnJvbVN0cmluZyhcIkZGN0YwMFwiKTtcclxuICBjbGlwQ29sb3IgPSBuZXcgQ29sb3IoMC44LCAwLCAwLCAyKTtcclxuICBhYWJiQ29sb3IgPSBuZXcgQ29sb3IoMCwgMSwgMCwgMC41KTtcclxuICBkcmF3Qm9uZXMgPSB0cnVlO1xyXG4gIGRyYXdSZWdpb25BdHRhY2htZW50cyA9IHRydWU7XHJcbiAgZHJhd0JvdW5kaW5nQm94ZXMgPSB0cnVlO1xyXG4gIGRyYXdNZXNoSHVsbCA9IHRydWU7XHJcbiAgZHJhd01lc2hUcmlhbmdsZXMgPSB0cnVlO1xyXG4gIGRyYXdQYXRocyA9IHRydWU7XHJcbiAgZHJhd1NrZWxldG9uWFkgPSBmYWxzZTtcclxuICBkcmF3Q2xpcHBpbmcgPSB0cnVlO1xyXG4gIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xyXG4gIHNjYWxlID0gMTtcclxuICBib25lV2lkdGggPSAyO1xyXG4gIHByaXZhdGUgY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcclxuICBwcml2YXRlIGJvdW5kcyA9IG5ldyBTa2VsZXRvbkJvdW5kcygpO1xyXG4gIHByaXZhdGUgdGVtcCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlcyA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoMiAqIDEwMjQpO1xyXG4gIHByaXZhdGUgc3RhdGljIExJR0hUX0dSQVkgPSBuZXcgQ29sb3IoMTkyIC8gMjU1LCAxOTIgLyAyNTUsIDE5MiAvIDI1NSwgMSk7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgR1JFRU4gPSBuZXcgQ29sb3IoMCwgMSwgMCwgMSk7XHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCB8IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID1cclxuICAgICAgY29udGV4dCBpbnN0YW5jZW9mIE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHRcclxuICAgICAgICA/IGNvbnRleHRcclxuICAgICAgICA6IG5ldyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0KGNvbnRleHQpO1xyXG4gIH1cclxuICBkcmF3KFxyXG4gICAgc2hhcGVzOiBTaGFwZVJlbmRlcmVyLFxyXG4gICAgc2tlbGV0b246IFNrZWxldG9uLFxyXG4gICAgaWdub3JlZEJvbmVzOiBBcnJheTxzdHJpbmc+ID0gbnVsbFxyXG4gICkge1xyXG4gICAgbGV0IHNrZWxldG9uWCA9IHNrZWxldG9uLng7XHJcbiAgICBsZXQgc2tlbGV0b25ZID0gc2tlbGV0b24ueTtcclxuICAgIGxldCBnbCA9IHRoaXMuY29udGV4dC5nbDtcclxuICAgIGxldCBzcmNGdW5jID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPyBnbC5PTkUgOiBnbC5TUkNfQUxQSEE7XHJcbiAgICBzaGFwZXMuc2V0QmxlbmRNb2RlKHNyY0Z1bmMsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpO1xyXG4gICAgbGV0IGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XHJcbiAgICBpZiAodGhpcy5kcmF3Qm9uZXMpIHtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYm9uZUxpbmVDb2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgICBpZiAoaWdub3JlZEJvbmVzICYmIGlnbm9yZWRCb25lcy5pbmRleE9mKGJvbmUuZGF0YS5uYW1lKSA+IC0xKSBjb250aW51ZTtcclxuICAgICAgICBpZiAoYm9uZS5wYXJlbnQgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgbGV0IHggPSBza2VsZXRvblggKyBib25lLmRhdGEubGVuZ3RoICogYm9uZS5hICsgYm9uZS53b3JsZFg7XHJcbiAgICAgICAgbGV0IHkgPSBza2VsZXRvblkgKyBib25lLmRhdGEubGVuZ3RoICogYm9uZS5jICsgYm9uZS53b3JsZFk7XHJcbiAgICAgICAgc2hhcGVzLnJlY3RMaW5lKFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIHNrZWxldG9uWCArIGJvbmUud29ybGRYLFxyXG4gICAgICAgICAgc2tlbGV0b25ZICsgYm9uZS53b3JsZFksXHJcbiAgICAgICAgICB4LFxyXG4gICAgICAgICAgeSxcclxuICAgICAgICAgIHRoaXMuYm9uZVdpZHRoICogdGhpcy5zY2FsZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZHJhd1NrZWxldG9uWFkpIHNoYXBlcy54KHNrZWxldG9uWCwgc2tlbGV0b25ZLCA0ICogdGhpcy5zY2FsZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3UmVnaW9uQXR0YWNobWVudHMpIHtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYXR0YWNobWVudExpbmVDb2xvcik7XHJcbiAgICAgIGxldCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGxldCBzbG90ID0gc2xvdHNbaV07XHJcbiAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIFJlZ2lvbkF0dGFjaG1lbnQpIHtcclxuICAgICAgICAgIGxldCByZWdpb25BdHRhY2htZW50ID0gPFJlZ2lvbkF0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICAgIGxldCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XHJcbiAgICAgICAgICByZWdpb25BdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QuYm9uZSwgdmVydGljZXMsIDAsIDIpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbMF0sIHZlcnRpY2VzWzFdLCB2ZXJ0aWNlc1syXSwgdmVydGljZXNbM10pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbMl0sIHZlcnRpY2VzWzNdLCB2ZXJ0aWNlc1s0XSwgdmVydGljZXNbNV0pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbNF0sIHZlcnRpY2VzWzVdLCB2ZXJ0aWNlc1s2XSwgdmVydGljZXNbN10pO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUodmVydGljZXNbNl0sIHZlcnRpY2VzWzddLCB2ZXJ0aWNlc1swXSwgdmVydGljZXNbMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd01lc2hIdWxsIHx8IHRoaXMuZHJhd01lc2hUcmlhbmdsZXMpIHtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBNZXNoQXR0YWNobWVudCkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGxldCBtZXNoID0gPE1lc2hBdHRhY2htZW50PmF0dGFjaG1lbnQ7XHJcbiAgICAgICAgbGV0IHZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcclxuICAgICAgICBtZXNoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKFxyXG4gICAgICAgICAgc2xvdCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBtZXNoLndvcmxkVmVydGljZXNMZW5ndGgsXHJcbiAgICAgICAgICB2ZXJ0aWNlcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAyXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgdHJpYW5nbGVzID0gbWVzaC50cmlhbmdsZXM7XHJcbiAgICAgICAgbGV0IGh1bGxMZW5ndGggPSBtZXNoLmh1bGxMZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhd01lc2hUcmlhbmdsZXMpIHtcclxuICAgICAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLnRyaWFuZ2xlTGluZUNvbG9yKTtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gMCwgbm4gPSB0cmlhbmdsZXMubGVuZ3RoOyBpaSA8IG5uOyBpaSArPSAzKSB7XHJcbiAgICAgICAgICAgIGxldCB2MSA9IHRyaWFuZ2xlc1tpaV0gKiAyLFxyXG4gICAgICAgICAgICAgIHYyID0gdHJpYW5nbGVzW2lpICsgMV0gKiAyLFxyXG4gICAgICAgICAgICAgIHYzID0gdHJpYW5nbGVzW2lpICsgMl0gKiAyO1xyXG4gICAgICAgICAgICBzaGFwZXMudHJpYW5nbGUoXHJcbiAgICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjFdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YxICsgMV0sIC8vXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjJdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YyICsgMV0sIC8vXHJcbiAgICAgICAgICAgICAgdmVydGljZXNbdjNdLFxyXG4gICAgICAgICAgICAgIHZlcnRpY2VzW3YzICsgMV0gLy9cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZHJhd01lc2hIdWxsICYmIGh1bGxMZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IodGhpcy5hdHRhY2htZW50TGluZUNvbG9yKTtcclxuICAgICAgICAgIGh1bGxMZW5ndGggPSAoaHVsbExlbmd0aCA+PiAxKSAqIDI7XHJcbiAgICAgICAgICBsZXQgbGFzdFggPSB2ZXJ0aWNlc1todWxsTGVuZ3RoIC0gMl0sXHJcbiAgICAgICAgICAgIGxhc3RZID0gdmVydGljZXNbaHVsbExlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwLCBubiA9IGh1bGxMZW5ndGg7IGlpIDwgbm47IGlpICs9IDIpIHtcclxuICAgICAgICAgICAgbGV0IHggPSB2ZXJ0aWNlc1tpaV0sXHJcbiAgICAgICAgICAgICAgeSA9IHZlcnRpY2VzW2lpICsgMV07XHJcbiAgICAgICAgICAgIHNoYXBlcy5saW5lKHgsIHksIGxhc3RYLCBsYXN0WSk7XHJcbiAgICAgICAgICAgIGxhc3RYID0geDtcclxuICAgICAgICAgICAgbGFzdFkgPSB5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd0JvdW5kaW5nQm94ZXMpIHtcclxuICAgICAgbGV0IGJvdW5kcyA9IHRoaXMuYm91bmRzO1xyXG4gICAgICBib3VuZHMudXBkYXRlKHNrZWxldG9uLCB0cnVlKTtcclxuICAgICAgc2hhcGVzLnNldENvbG9yKHRoaXMuYWFiYkNvbG9yKTtcclxuICAgICAgc2hhcGVzLnJlY3QoXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgYm91bmRzLm1pblgsXHJcbiAgICAgICAgYm91bmRzLm1pblksXHJcbiAgICAgICAgYm91bmRzLmdldFdpZHRoKCksXHJcbiAgICAgICAgYm91bmRzLmdldEhlaWdodCgpXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBwb2x5Z29ucyA9IGJvdW5kcy5wb2x5Z29ucztcclxuICAgICAgbGV0IGJveGVzID0gYm91bmRzLmJvdW5kaW5nQm94ZXM7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gcG9seWdvbnMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBvbHlnb24gPSBwb2x5Z29uc1tpXTtcclxuICAgICAgICBzaGFwZXMuc2V0Q29sb3IoYm94ZXNbaV0uY29sb3IpO1xyXG4gICAgICAgIHNoYXBlcy5wb2x5Z29uKHBvbHlnb24sIDAsIHBvbHlnb24ubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd1BhdGhzKSB7XHJcbiAgICAgIGxldCBzbG90cyA9IHNrZWxldG9uLnNsb3RzO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNsb3RzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIGxldCBzbG90ID0gc2xvdHNbaV07XHJcbiAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgICBpZiAoIShhdHRhY2htZW50IGluc3RhbmNlb2YgUGF0aEF0dGFjaG1lbnQpKSBjb250aW51ZTtcclxuICAgICAgICBsZXQgcGF0aCA9IDxQYXRoQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIGxldCBubiA9IHBhdGgud29ybGRWZXJ0aWNlc0xlbmd0aDtcclxuICAgICAgICBsZXQgd29ybGQgPSAodGhpcy50ZW1wID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMudGVtcCwgbm4sIDApKTtcclxuICAgICAgICBwYXRoLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIDAsIG5uLCB3b3JsZCwgMCwgMik7XHJcbiAgICAgICAgbGV0IGNvbG9yID0gdGhpcy5wYXRoQ29sb3I7XHJcbiAgICAgICAgbGV0IHgxID0gd29ybGRbMl0sXHJcbiAgICAgICAgICB5MSA9IHdvcmxkWzNdLFxyXG4gICAgICAgICAgeDIgPSAwLFxyXG4gICAgICAgICAgeTIgPSAwO1xyXG4gICAgICAgIGlmIChwYXRoLmNsb3NlZCkge1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgIGxldCBjeDEgPSB3b3JsZFswXSxcclxuICAgICAgICAgICAgY3kxID0gd29ybGRbMV0sXHJcbiAgICAgICAgICAgIGN4MiA9IHdvcmxkW25uIC0gMl0sXHJcbiAgICAgICAgICAgIGN5MiA9IHdvcmxkW25uIC0gMV07XHJcbiAgICAgICAgICB4MiA9IHdvcmxkW25uIC0gNF07XHJcbiAgICAgICAgICB5MiA9IHdvcmxkW25uIC0gM107XHJcbiAgICAgICAgICBzaGFwZXMuY3VydmUoeDEsIHkxLCBjeDEsIGN5MSwgY3gyLCBjeTIsIHgyLCB5MiwgMzIpO1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKFNrZWxldG9uRGVidWdSZW5kZXJlci5MSUdIVF9HUkFZKTtcclxuICAgICAgICAgIHNoYXBlcy5saW5lKHgxLCB5MSwgY3gxLCBjeTEpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeDIsIHkyLCBjeDIsIGN5Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5uIC09IDQ7XHJcbiAgICAgICAgZm9yIChsZXQgaWkgPSA0OyBpaSA8IG5uOyBpaSArPSA2KSB7XHJcbiAgICAgICAgICBsZXQgY3gxID0gd29ybGRbaWldLFxyXG4gICAgICAgICAgICBjeTEgPSB3b3JsZFtpaSArIDFdLFxyXG4gICAgICAgICAgICBjeDIgPSB3b3JsZFtpaSArIDJdLFxyXG4gICAgICAgICAgICBjeTIgPSB3b3JsZFtpaSArIDNdO1xyXG4gICAgICAgICAgeDIgPSB3b3JsZFtpaSArIDRdO1xyXG4gICAgICAgICAgeTIgPSB3b3JsZFtpaSArIDVdO1xyXG4gICAgICAgICAgc2hhcGVzLnNldENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgIHNoYXBlcy5jdXJ2ZSh4MSwgeTEsIGN4MSwgY3kxLCBjeDIsIGN5MiwgeDIsIHkyLCAzMik7XHJcbiAgICAgICAgICBzaGFwZXMuc2V0Q29sb3IoU2tlbGV0b25EZWJ1Z1JlbmRlcmVyLkxJR0hUX0dSQVkpO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeDEsIHkxLCBjeDEsIGN5MSk7XHJcbiAgICAgICAgICBzaGFwZXMubGluZSh4MiwgeTIsIGN4MiwgY3kyKTtcclxuICAgICAgICAgIHgxID0geDI7XHJcbiAgICAgICAgICB5MSA9IHkyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhd0JvbmVzKSB7XHJcbiAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLmJvbmVPcmlnaW5Db2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgICBpZiAoaWdub3JlZEJvbmVzICYmIGlnbm9yZWRCb25lcy5pbmRleE9mKGJvbmUuZGF0YS5uYW1lKSA+IC0xKSBjb250aW51ZTtcclxuICAgICAgICBzaGFwZXMuY2lyY2xlKFxyXG4gICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIHNrZWxldG9uWCArIGJvbmUud29ybGRYLFxyXG4gICAgICAgICAgc2tlbGV0b25ZICsgYm9uZS53b3JsZFksXHJcbiAgICAgICAgICAzICogdGhpcy5zY2FsZSxcclxuICAgICAgICAgIFNrZWxldG9uRGVidWdSZW5kZXJlci5HUkVFTixcclxuICAgICAgICAgIDhcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kcmF3Q2xpcHBpbmcpIHtcclxuICAgICAgbGV0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XHJcbiAgICAgIHNoYXBlcy5zZXRDb2xvcih0aGlzLmNsaXBDb2xvcik7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gc2xvdHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHNsb3QgPSBzbG90c1tpXTtcclxuICAgICAgICBsZXQgYXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICAgIGlmICghKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpKSBjb250aW51ZTtcclxuICAgICAgICBsZXQgY2xpcCA9IDxDbGlwcGluZ0F0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICBsZXQgbm4gPSBjbGlwLndvcmxkVmVydGljZXNMZW5ndGg7XHJcbiAgICAgICAgbGV0IHdvcmxkID0gKHRoaXMudGVtcCA9IFV0aWxzLnNldEFycmF5U2l6ZSh0aGlzLnRlbXAsIG5uLCAwKSk7XHJcbiAgICAgICAgY2xpcC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90LCAwLCBubiwgd29ybGQsIDAsIDIpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gd29ybGQubGVuZ3RoOyBpIDwgbjsgaSArPSAyKSB7XHJcbiAgICAgICAgICBsZXQgeCA9IHdvcmxkW2ldO1xyXG4gICAgICAgICAgbGV0IHkgPSB3b3JsZFtpICsgMV07XHJcbiAgICAgICAgICBsZXQgeDIgPSB3b3JsZFsoaSArIDIpICUgd29ybGQubGVuZ3RoXTtcclxuICAgICAgICAgIGxldCB5MiA9IHdvcmxkWyhpICsgMykgJSB3b3JsZC5sZW5ndGhdO1xyXG4gICAgICAgICAgc2hhcGVzLmxpbmUoeCwgeSwgeDIsIHkyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZGlzcG9zZSgpIHt9XHJcbn1cclxuIl19