ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
448 lines • 48.6 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 { Vector2, MathUtils } from "./Utils";
export class TransformConstraint {
/**
* @param {?} data
* @param {?} skeleton
*/
constructor(data, skeleton) {
this.rotateMix = 0;
this.translateMix = 0;
this.scaleMix = 0;
this.shearMix = 0;
this.temp = new Vector2();
this.active = false;
if (data == null)
throw new Error("data cannot be null.");
if (skeleton == null)
throw new Error("skeleton cannot be null.");
this.data = data;
this.rotateMix = data.rotateMix;
this.translateMix = data.translateMix;
this.scaleMix = data.scaleMix;
this.shearMix = data.shearMix;
this.bones = new Array();
for (let i = 0; i < data.bones.length; i++)
this.bones.push(skeleton.findBone(data.bones[i].name));
this.target = skeleton.findBone(data.target.name);
}
/**
* @return {?}
*/
isActive() {
return this.active;
}
/**
* @return {?}
*/
apply() {
this.update();
}
/**
* @return {?}
*/
update() {
if (this.data.local) {
if (this.data.relative)
this.applyRelativeLocal();
else
this.applyAbsoluteLocal();
}
else {
if (this.data.relative)
this.applyRelativeWorld();
else
this.applyAbsoluteWorld();
}
}
/**
* @return {?}
*/
applyAbsoluteWorld() {
/** @type {?} */
let rotateMix = this.rotateMix;
/** @type {?} */
let translateMix = this.translateMix;
/** @type {?} */
let scaleMix = this.scaleMix;
/** @type {?} */
let shearMix = this.shearMix;
/** @type {?} */
let target = this.target;
/** @type {?} */
let ta = target.a;
/** @type {?} */
let tb = target.b;
/** @type {?} */
let tc = target.c;
/** @type {?} */
let td = target.d;
/** @type {?} */
let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
/** @type {?} */
let offsetRotation = this.data.offsetRotation * degRadReflect;
/** @type {?} */
let offsetShearY = this.data.offsetShearY * degRadReflect;
/** @type {?} */
let bones = this.bones;
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
/** @type {?} */
let modified = false;
if (rotateMix != 0) {
/** @type {?} */
let a = bone.a;
/** @type {?} */
let b = bone.b;
/** @type {?} */
let c = bone.c;
/** @type {?} */
let d = bone.d;
/** @type {?} */
let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r *= rotateMix;
/** @type {?} */
let cos = Math.cos(r);
/** @type {?} */
let sin = Math.sin(r);
bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d;
bone.c = sin * a + cos * c;
bone.d = sin * b + cos * d;
modified = true;
}
if (translateMix != 0) {
/** @type {?} */
let temp = this.temp;
target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
bone.worldX += (temp.x - bone.worldX) * translateMix;
bone.worldY += (temp.y - bone.worldY) * translateMix;
modified = true;
}
if (scaleMix > 0) {
/** @type {?} */
let s = Math.sqrt(bone.a * bone.a + bone.c * bone.c);
/** @type {?} */
let ts = Math.sqrt(ta * ta + tc * tc);
if (s > 0.00001)
s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s;
bone.a *= s;
bone.c *= s;
s = Math.sqrt(bone.b * bone.b + bone.d * bone.d);
ts = Math.sqrt(tb * tb + td * td);
if (s > 0.00001)
s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s;
bone.b *= s;
bone.d *= s;
modified = true;
}
if (shearMix > 0) {
/** @type {?} */
let b = bone.b;
/** @type {?} */
let d = bone.d;
/** @type {?} */
let by = Math.atan2(d, b);
/** @type {?} */
let r = Math.atan2(td, tb) -
Math.atan2(tc, ta) -
(by - Math.atan2(bone.c, bone.a));
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r = by + (r + offsetShearY) * shearMix;
/** @type {?} */
let s = Math.sqrt(b * b + d * d);
bone.b = Math.cos(r) * s;
bone.d = Math.sin(r) * s;
modified = true;
}
if (modified)
bone.appliedValid = false;
}
}
/**
* @return {?}
*/
applyRelativeWorld() {
/** @type {?} */
let rotateMix = this.rotateMix;
/** @type {?} */
let translateMix = this.translateMix;
/** @type {?} */
let scaleMix = this.scaleMix;
/** @type {?} */
let shearMix = this.shearMix;
/** @type {?} */
let target = this.target;
/** @type {?} */
let ta = target.a;
/** @type {?} */
let tb = target.b;
/** @type {?} */
let tc = target.c;
/** @type {?} */
let td = target.d;
/** @type {?} */
let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
/** @type {?} */
let offsetRotation = this.data.offsetRotation * degRadReflect;
/** @type {?} */
let offsetShearY = this.data.offsetShearY * degRadReflect;
/** @type {?} */
let bones = this.bones;
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
/** @type {?} */
let modified = false;
if (rotateMix != 0) {
/** @type {?} */
let a = bone.a;
/** @type {?} */
let b = bone.b;
/** @type {?} */
let c = bone.c;
/** @type {?} */
let d = bone.d;
/** @type {?} */
let r = Math.atan2(tc, ta) + offsetRotation;
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
r *= rotateMix;
/** @type {?} */
let cos = Math.cos(r);
/** @type {?} */
let sin = Math.sin(r);
bone.a = cos * a - sin * c;
bone.b = cos * b - sin * d;
bone.c = sin * a + cos * c;
bone.d = sin * b + cos * d;
modified = true;
}
if (translateMix != 0) {
/** @type {?} */
let temp = this.temp;
target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
bone.worldX += temp.x * translateMix;
bone.worldY += temp.y * translateMix;
modified = true;
}
if (scaleMix > 0) {
/** @type {?} */
let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) *
scaleMix +
1;
bone.a *= s;
bone.c *= s;
s =
(Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) *
scaleMix +
1;
bone.b *= s;
bone.d *= s;
modified = true;
}
if (shearMix > 0) {
/** @type {?} */
let r = Math.atan2(td, tb) - Math.atan2(tc, ta);
if (r > MathUtils.PI)
r -= MathUtils.PI2;
else if (r < -MathUtils.PI)
r += MathUtils.PI2;
/** @type {?} */
let b = bone.b;
/** @type {?} */
let d = bone.d;
r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix;
/** @type {?} */
let s = Math.sqrt(b * b + d * d);
bone.b = Math.cos(r) * s;
bone.d = Math.sin(r) * s;
modified = true;
}
if (modified)
bone.appliedValid = false;
}
}
/**
* @return {?}
*/
applyAbsoluteLocal() {
/** @type {?} */
let rotateMix = this.rotateMix;
/** @type {?} */
let translateMix = this.translateMix;
/** @type {?} */
let scaleMix = this.scaleMix;
/** @type {?} */
let shearMix = this.shearMix;
/** @type {?} */
let target = this.target;
if (!target.appliedValid)
target.updateAppliedTransform();
/** @type {?} */
let bones = this.bones;
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
if (!bone.appliedValid)
bone.updateAppliedTransform();
/** @type {?} */
let rotation = bone.arotation;
if (rotateMix != 0) {
/** @type {?} */
let r = target.arotation - rotation + this.data.offsetRotation;
r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
rotation += r * rotateMix;
}
/** @type {?} */
let x = bone.ax;
/** @type {?} */
let y = bone.ay;
if (translateMix != 0) {
x += (target.ax - x + this.data.offsetX) * translateMix;
y += (target.ay - y + this.data.offsetY) * translateMix;
}
/** @type {?} */
let scaleX = bone.ascaleX;
/** @type {?} */
let scaleY = bone.ascaleY;
if (scaleMix != 0) {
if (scaleX > 0.00001)
scaleX =
(scaleX +
(target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) /
scaleX;
if (scaleY > 0.00001)
scaleY =
(scaleY +
(target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) /
scaleY;
}
/** @type {?} */
let shearY = bone.ashearY;
if (shearMix != 0) {
/** @type {?} */
let r = target.ashearY - shearY + this.data.offsetShearY;
r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
bone.shearY += r * shearMix;
}
bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
}
}
/**
* @return {?}
*/
applyRelativeLocal() {
/** @type {?} */
let rotateMix = this.rotateMix;
/** @type {?} */
let translateMix = this.translateMix;
/** @type {?} */
let scaleMix = this.scaleMix;
/** @type {?} */
let shearMix = this.shearMix;
/** @type {?} */
let target = this.target;
if (!target.appliedValid)
target.updateAppliedTransform();
/** @type {?} */
let bones = this.bones;
for (let i = 0, n = bones.length; i < n; i++) {
/** @type {?} */
let bone = bones[i];
if (!bone.appliedValid)
bone.updateAppliedTransform();
/** @type {?} */
let rotation = bone.arotation;
if (rotateMix != 0)
rotation += (target.arotation + this.data.offsetRotation) * rotateMix;
/** @type {?} */
let x = bone.ax;
/** @type {?} */
let y = bone.ay;
if (translateMix != 0) {
x += (target.ax + this.data.offsetX) * translateMix;
y += (target.ay + this.data.offsetY) * translateMix;
}
/** @type {?} */
let scaleX = bone.ascaleX;
/** @type {?} */
let scaleY = bone.ascaleY;
if (scaleMix != 0) {
if (scaleX > 0.00001)
scaleX *=
(target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix + 1;
if (scaleY > 0.00001)
scaleY *=
(target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix + 1;
}
/** @type {?} */
let shearY = bone.ashearY;
if (shearMix != 0)
shearY += (target.ashearY + this.data.offsetShearY) * shearMix;
bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
}
}
}
if (false) {
/** @type {?} */
TransformConstraint.prototype.data;
/** @type {?} */
TransformConstraint.prototype.bones;
/** @type {?} */
TransformConstraint.prototype.target;
/** @type {?} */
TransformConstraint.prototype.rotateMix;
/** @type {?} */
TransformConstraint.prototype.translateMix;
/** @type {?} */
TransformConstraint.prototype.scaleMix;
/** @type {?} */
TransformConstraint.prototype.shearMix;
/** @type {?} */
TransformConstraint.prototype.temp;
/** @type {?} */
TransformConstraint.prototype.active;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtQ29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1RyYW5zZm9ybUNvbnN0cmFpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHN0MsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7SUFVOUIsWUFBWSxJQUE2QixFQUFFLFFBQWtCO1FBTjdELGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFYixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFELElBQUksUUFBUSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQVEsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdB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SUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNqRSxJQUFJLENBQUMsd0JBQXdCLENBQzNCLENBQUMsRUFDRCxDQUFDLEVBQ0QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxDQUFDLE9BQU8sRUFDWixNQUFNLENBQ1AsQ0FBQztTQUNIO0lBQ0gsQ0FBQztDQUNGOzs7SUEzUkMsbUNBQThCOztJQUM5QixvQ0FBbUI7O0lBQ25CLHFDQUFhOztJQUNiLHdDQUFjOztJQUNkLDJDQUFpQjs7SUFDakIsdUNBQWE7O0lBQ2IsdUNBQWE7O0lBQ2IsbUNBQXFCOztJQUNyQixxQ0FBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgVXBkYXRhYmxlIH0gZnJvbSBcIi4vVXBkYXRhYmxlXCI7XHJcbmltcG9ydCB7IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludERhdGFcIjtcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gXCIuL0JvbmVcIjtcclxuaW1wb3J0IHsgVmVjdG9yMiwgTWF0aFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tIFwiLi9Ta2VsZXRvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybUNvbnN0cmFpbnQgaW1wbGVtZW50cyBVcGRhdGFibGUge1xyXG4gIGRhdGE6IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhO1xyXG4gIGJvbmVzOiBBcnJheTxCb25lPjtcclxuICB0YXJnZXQ6IEJvbmU7XHJcbiAgcm90YXRlTWl4ID0gMDtcclxuICB0cmFuc2xhdGVNaXggPSAwO1xyXG4gIHNjYWxlTWl4ID0gMDtcclxuICBzaGVhck1peCA9IDA7XHJcbiAgdGVtcCA9IG5ldyBWZWN0b3IyKCk7XHJcbiAgYWN0aXZlID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoZGF0YTogVHJhbnNmb3JtQ29uc3RyYWludERhdGEsIHNrZWxldG9uOiBTa2VsZXRvbikge1xyXG4gICAgaWYgKGRhdGEgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiZGF0YSBjYW5ub3QgYmUgbnVsbC5cIik7XHJcbiAgICBpZiAoc2tlbGV0b24gPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwic2tlbGV0b24gY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgIHRoaXMucm90YXRlTWl4ID0gZGF0YS5yb3RhdGVNaXg7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZU1peCA9IGRhdGEudHJhbnNsYXRlTWl4O1xyXG4gICAgdGhpcy5zY2FsZU1peCA9IGRhdGEuc2NhbGVNaXg7XHJcbiAgICB0aGlzLnNoZWFyTWl4ID0gZGF0YS5zaGVhck1peDtcclxuICAgIHRoaXMuYm9uZXMgPSBuZXcgQXJyYXk8Qm9uZT4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5ib25lcy5sZW5ndGg7IGkrKylcclxuICAgICAgdGhpcy5ib25lcy5wdXNoKHNrZWxldG9uLmZpbmRCb25lKGRhdGEuYm9uZXNbaV0ubmFtZSkpO1xyXG4gICAgdGhpcy50YXJnZXQgPSBza2VsZXRvbi5maW5kQm9uZShkYXRhLnRhcmdldC5uYW1lKTtcclxuICB9XHJcbiAgaXNBY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XHJcbiAgfVxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcbiAgdXBkYXRlKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5sb2NhbCkge1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnJlbGF0aXZlKSB0aGlzLmFwcGx5UmVsYXRpdmVMb2NhbCgpO1xyXG4gICAgICBlbHNlIHRoaXMuYXBwbHlBYnNvbHV0ZUxvY2FsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5kYXRhLnJlbGF0aXZlKSB0aGlzLmFwcGx5UmVsYXRpdmVXb3JsZCgpO1xyXG4gICAgICBlbHNlIHRoaXMuYXBwbHlBYnNvbHV0ZVdvcmxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFwcGx5QWJzb2x1dGVXb3JsZCgpIHtcclxuICAgIGxldCByb3RhdGVNaXggPSB0aGlzLnJvdGF0ZU1peCxcclxuICAgICAgdHJhbnNsYXRlTWl4ID0gdGhpcy50cmFuc2xhdGVNaXgsXHJcbiAgICAgIHNjYWxlTWl4ID0gdGhpcy5zY2FsZU1peCxcclxuICAgICAgc2hlYXJNaXggPSB0aGlzLnNoZWFyTWl4O1xyXG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0O1xyXG4gICAgbGV0IHRhID0gdGFyZ2V0LmEsXHJcbiAgICAgIHRiID0gdGFyZ2V0LmIsXHJcbiAgICAgIHRjID0gdGFyZ2V0LmMsXHJcbiAgICAgIHRkID0gdGFyZ2V0LmQ7XHJcbiAgICBsZXQgZGVnUmFkUmVmbGVjdCA9XHJcbiAgICAgIHRhICogdGQgLSB0YiAqIHRjID4gMCA/IE1hdGhVdGlscy5kZWdSYWQgOiAtTWF0aFV0aWxzLmRlZ1JhZDtcclxuICAgIGxldCBvZmZzZXRSb3RhdGlvbiA9IHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbiAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgb2Zmc2V0U2hlYXJZID0gdGhpcy5kYXRhLm9mZnNldFNoZWFyWSAqIGRlZ1JhZFJlZmxlY3Q7XHJcbiAgICBsZXQgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBib25lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBib25lc1tpXTtcclxuICAgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCBhID0gYm9uZS5hLFxyXG4gICAgICAgICAgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGMgPSBib25lLmMsXHJcbiAgICAgICAgICBkID0gYm9uZS5kO1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0YywgdGEpIC0gTWF0aC5hdGFuMihjLCBhKSArIG9mZnNldFJvdGF0aW9uO1xyXG4gICAgICAgIGlmIChyID4gTWF0aFV0aWxzLlBJKSByIC09IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgZWxzZSBpZiAociA8IC1NYXRoVXRpbHMuUEkpIHIgKz0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICByICo9IHJvdGF0ZU1peDtcclxuICAgICAgICBsZXQgY29zID0gTWF0aC5jb3MociksXHJcbiAgICAgICAgICBzaW4gPSBNYXRoLnNpbihyKTtcclxuICAgICAgICBib25lLmEgPSBjb3MgKiBhIC0gc2luICogYztcclxuICAgICAgICBib25lLmIgPSBjb3MgKiBiIC0gc2luICogZDtcclxuICAgICAgICBib25lLmMgPSBzaW4gKiBhICsgY29zICogYztcclxuICAgICAgICBib25lLmQgPSBzaW4gKiBiICsgY29zICogZDtcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSB0aGlzLnRlbXA7XHJcbiAgICAgICAgdGFyZ2V0LmxvY2FsVG9Xb3JsZCh0ZW1wLnNldCh0aGlzLmRhdGEub2Zmc2V0WCwgdGhpcy5kYXRhLm9mZnNldFkpKTtcclxuICAgICAgICBib25lLndvcmxkWCArPSAodGVtcC54IC0gYm9uZS53b3JsZFgpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIGJvbmUud29ybGRZICs9ICh0ZW1wLnkgLSBib25lLndvcmxkWSkgKiB0cmFuc2xhdGVNaXg7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzY2FsZU1peCA+IDApIHtcclxuICAgICAgICBsZXQgcyA9IE1hdGguc3FydChib25lLmEgKiBib25lLmEgKyBib25lLmMgKiBib25lLmMpO1xyXG4gICAgICAgIGxldCB0cyA9IE1hdGguc3FydCh0YSAqIHRhICsgdGMgKiB0Yyk7XHJcbiAgICAgICAgaWYgKHMgPiAwLjAwMDAxKVxyXG4gICAgICAgICAgcyA9IChzICsgKHRzIC0gcyArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICogc2NhbGVNaXgpIC8gcztcclxuICAgICAgICBib25lLmEgKj0gcztcclxuICAgICAgICBib25lLmMgKj0gcztcclxuICAgICAgICBzID0gTWF0aC5zcXJ0KGJvbmUuYiAqIGJvbmUuYiArIGJvbmUuZCAqIGJvbmUuZCk7XHJcbiAgICAgICAgdHMgPSBNYXRoLnNxcnQodGIgKiB0YiArIHRkICogdGQpO1xyXG4gICAgICAgIGlmIChzID4gMC4wMDAwMSlcclxuICAgICAgICAgIHMgPSAocyArICh0cyAtIHMgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4KSAvIHM7XHJcbiAgICAgICAgYm9uZS5iICo9IHM7XHJcbiAgICAgICAgYm9uZS5kICo9IHM7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzaGVhck1peCA+IDApIHtcclxuICAgICAgICBsZXQgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgbGV0IGJ5ID0gTWF0aC5hdGFuMihkLCBiKTtcclxuICAgICAgICBsZXQgciA9XHJcbiAgICAgICAgICBNYXRoLmF0YW4yKHRkLCB0YikgLVxyXG4gICAgICAgICAgTWF0aC5hdGFuMih0YywgdGEpIC1cclxuICAgICAgICAgIChieSAtIE1hdGguYXRhbjIoYm9uZS5jLCBib25lLmEpKTtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciA9IGJ5ICsgKHIgKyBvZmZzZXRTaGVhclkpICogc2hlYXJNaXg7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYiAqIGIgKyBkICogZCk7XHJcbiAgICAgICAgYm9uZS5iID0gTWF0aC5jb3MocikgKiBzO1xyXG4gICAgICAgIGJvbmUuZCA9IE1hdGguc2luKHIpICogcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1vZGlmaWVkKSBib25lLmFwcGxpZWRWYWxpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseVJlbGF0aXZlV29ybGQoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGxldCB0YSA9IHRhcmdldC5hLFxyXG4gICAgICB0YiA9IHRhcmdldC5iLFxyXG4gICAgICB0YyA9IHRhcmdldC5jLFxyXG4gICAgICB0ZCA9IHRhcmdldC5kO1xyXG4gICAgbGV0IGRlZ1JhZFJlZmxlY3QgPVxyXG4gICAgICB0YSAqIHRkIC0gdGIgKiB0YyA+IDAgPyBNYXRoVXRpbHMuZGVnUmFkIDogLU1hdGhVdGlscy5kZWdSYWQ7XHJcbiAgICBsZXQgb2Zmc2V0Um90YXRpb24gPSB0aGlzLmRhdGEub2Zmc2V0Um90YXRpb24gKiBkZWdSYWRSZWZsZWN0LFxyXG4gICAgICBvZmZzZXRTaGVhclkgPSB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZICogZGVnUmFkUmVmbGVjdDtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBsZXQgbW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKHJvdGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgbGV0IGEgPSBib25lLmEsXHJcbiAgICAgICAgICBiID0gYm9uZS5iLFxyXG4gICAgICAgICAgYyA9IGJvbmUuYyxcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgbGV0IHIgPSBNYXRoLmF0YW4yKHRjLCB0YSkgKyBvZmZzZXRSb3RhdGlvbjtcclxuICAgICAgICBpZiAociA+IE1hdGhVdGlscy5QSSkgciAtPSBNYXRoVXRpbHMuUEkyO1xyXG4gICAgICAgIGVsc2UgaWYgKHIgPCAtTWF0aFV0aWxzLlBJKSByICs9IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgciAqPSByb3RhdGVNaXg7XHJcbiAgICAgICAgbGV0IGNvcyA9IE1hdGguY29zKHIpLFxyXG4gICAgICAgICAgc2luID0gTWF0aC5zaW4ocik7XHJcbiAgICAgICAgYm9uZS5hID0gY29zICogYSAtIHNpbiAqIGM7XHJcbiAgICAgICAgYm9uZS5iID0gY29zICogYiAtIHNpbiAqIGQ7XHJcbiAgICAgICAgYm9uZS5jID0gc2luICogYSArIGNvcyAqIGM7XHJcbiAgICAgICAgYm9uZS5kID0gc2luICogYiArIGNvcyAqIGQ7XHJcbiAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0cmFuc2xhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCB0ZW1wID0gdGhpcy50ZW1wO1xyXG4gICAgICAgIHRhcmdldC5sb2NhbFRvV29ybGQodGVtcC5zZXQodGhpcy5kYXRhLm9mZnNldFgsIHRoaXMuZGF0YS5vZmZzZXRZKSk7XHJcbiAgICAgICAgYm9uZS53b3JsZFggKz0gdGVtcC54ICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIGJvbmUud29ybGRZICs9IHRlbXAueSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNjYWxlTWl4ID4gMCkge1xyXG4gICAgICAgIGxldCBzID1cclxuICAgICAgICAgIChNYXRoLnNxcnQodGEgKiB0YSArIHRjICogdGMpIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVgpICpcclxuICAgICAgICAgICAgc2NhbGVNaXggK1xyXG4gICAgICAgICAgMTtcclxuICAgICAgICBib25lLmEgKj0gcztcclxuICAgICAgICBib25lLmMgKj0gcztcclxuICAgICAgICBzID1cclxuICAgICAgICAgIChNYXRoLnNxcnQodGIgKiB0YiArIHRkICogdGQpIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVkpICpcclxuICAgICAgICAgICAgc2NhbGVNaXggK1xyXG4gICAgICAgICAgMTtcclxuICAgICAgICBib25lLmIgKj0gcztcclxuICAgICAgICBib25lLmQgKj0gcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNoZWFyTWl4ID4gMCkge1xyXG4gICAgICAgIGxldCByID0gTWF0aC5hdGFuMih0ZCwgdGIpIC0gTWF0aC5hdGFuMih0YywgdGEpO1xyXG4gICAgICAgIGlmIChyID4gTWF0aFV0aWxzLlBJKSByIC09IE1hdGhVdGlscy5QSTI7XHJcbiAgICAgICAgZWxzZSBpZiAociA8IC1NYXRoVXRpbHMuUEkpIHIgKz0gTWF0aFV0aWxzLlBJMjtcclxuICAgICAgICBsZXQgYiA9IGJvbmUuYixcclxuICAgICAgICAgIGQgPSBib25lLmQ7XHJcbiAgICAgICAgciA9IE1hdGguYXRhbjIoZCwgYikgKyAociAtIE1hdGhVdGlscy5QSSAvIDIgKyBvZmZzZXRTaGVhclkpICogc2hlYXJNaXg7XHJcbiAgICAgICAgbGV0IHMgPSBNYXRoLnNxcnQoYiAqIGIgKyBkICogZCk7XHJcbiAgICAgICAgYm9uZS5iID0gTWF0aC5jb3MocikgKiBzO1xyXG4gICAgICAgIGJvbmUuZCA9IE1hdGguc2luKHIpICogcztcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1vZGlmaWVkKSBib25lLmFwcGxpZWRWYWxpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseUFic29sdXRlTG9jYWwoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGlmICghdGFyZ2V0LmFwcGxpZWRWYWxpZCkgdGFyZ2V0LnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHJvdGF0aW9uID0gYm9uZS5hcm90YXRpb247XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCByID0gdGFyZ2V0LmFyb3RhdGlvbiAtIHJvdGF0aW9uICsgdGhpcy5kYXRhLm9mZnNldFJvdGF0aW9uO1xyXG4gICAgICAgIHIgLT0gKDE2Mzg0IC0gKCgxNjM4NC40OTk5OTk5OTk5OTYgLSByIC8gMzYwKSB8IDApKSAqIDM2MDtcclxuICAgICAgICByb3RhdGlvbiArPSByICogcm90YXRlTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB4ID0gYm9uZS5heCxcclxuICAgICAgICB5ID0gYm9uZS5heTtcclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgeCArPSAodGFyZ2V0LmF4IC0geCArIHRoaXMuZGF0YS5vZmZzZXRYKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgICB5ICs9ICh0YXJnZXQuYXkgLSB5ICsgdGhpcy5kYXRhLm9mZnNldFkpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzY2FsZVggPSBib25lLmFzY2FsZVgsXHJcbiAgICAgICAgc2NhbGVZID0gYm9uZS5hc2NhbGVZO1xyXG4gICAgICBpZiAoc2NhbGVNaXggIT0gMCkge1xyXG4gICAgICAgIGlmIChzY2FsZVggPiAwLjAwMDAxKVxyXG4gICAgICAgICAgc2NhbGVYID1cclxuICAgICAgICAgICAgKHNjYWxlWCArXHJcbiAgICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVYIC0gc2NhbGVYICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWCkgKiBzY2FsZU1peCkgL1xyXG4gICAgICAgICAgICBzY2FsZVg7XHJcbiAgICAgICAgaWYgKHNjYWxlWSA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVkgPVxyXG4gICAgICAgICAgICAoc2NhbGVZICtcclxuICAgICAgICAgICAgICAodGFyZ2V0LmFzY2FsZVkgLSBzY2FsZVkgKyB0aGlzLmRhdGEub2Zmc2V0U2NhbGVZKSAqIHNjYWxlTWl4KSAvXHJcbiAgICAgICAgICAgIHNjYWxlWTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2hlYXJZID0gYm9uZS5hc2hlYXJZO1xyXG4gICAgICBpZiAoc2hlYXJNaXggIT0gMCkge1xyXG4gICAgICAgIGxldCByID0gdGFyZ2V0LmFzaGVhclkgLSBzaGVhclkgKyB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZO1xyXG4gICAgICAgIHIgLT0gKDE2Mzg0IC0gKCgxNjM4NC40OTk5OTk5OTk5OTYgLSByIC8gMzYwKSB8IDApKSAqIDM2MDtcclxuICAgICAgICBib25lLnNoZWFyWSArPSByICogc2hlYXJNaXg7XHJcbiAgICAgIH1cclxuICAgICAgYm9uZS51cGRhdGVXb3JsZFRyYW5zZm9ybVdpdGgoXHJcbiAgICAgICAgeCxcclxuICAgICAgICB5LFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIHNjYWxlWCxcclxuICAgICAgICBzY2FsZVksXHJcbiAgICAgICAgYm9uZS5hc2hlYXJYLFxyXG4gICAgICAgIHNoZWFyWVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBseVJlbGF0aXZlTG9jYWwoKSB7XHJcbiAgICBsZXQgcm90YXRlTWl4ID0gdGhpcy5yb3RhdGVNaXgsXHJcbiAgICAgIHRyYW5zbGF0ZU1peCA9IHRoaXMudHJhbnNsYXRlTWl4LFxyXG4gICAgICBzY2FsZU1peCA9IHRoaXMuc2NhbGVNaXgsXHJcbiAgICAgIHNoZWFyTWl4ID0gdGhpcy5zaGVhck1peDtcclxuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldDtcclxuICAgIGlmICghdGFyZ2V0LmFwcGxpZWRWYWxpZCkgdGFyZ2V0LnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgIGxldCBib25lcyA9IHRoaXMuYm9uZXM7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgYm9uZSA9IGJvbmVzW2ldO1xyXG4gICAgICBpZiAoIWJvbmUuYXBwbGllZFZhbGlkKSBib25lLnVwZGF0ZUFwcGxpZWRUcmFuc2Zvcm0oKTtcclxuICAgICAgbGV0IHJvdGF0aW9uID0gYm9uZS5hcm90YXRpb247XHJcbiAgICAgIGlmIChyb3RhdGVNaXggIT0gMClcclxuICAgICAgICByb3RhdGlvbiArPSAodGFyZ2V0LmFyb3RhdGlvbiArIHRoaXMuZGF0YS5vZmZzZXRSb3RhdGlvbikgKiByb3RhdGVNaXg7XHJcbiAgICAgIGxldCB4ID0gYm9uZS5heCxcclxuICAgICAgICB5ID0gYm9uZS5heTtcclxuICAgICAgaWYgKHRyYW5zbGF0ZU1peCAhPSAwKSB7XHJcbiAgICAgICAgeCArPSAodGFyZ2V0LmF4ICsgdGhpcy5kYXRhLm9mZnNldFgpICogdHJhbnNsYXRlTWl4O1xyXG4gICAgICAgIHkgKz0gKHRhcmdldC5heSArIHRoaXMuZGF0YS5vZmZzZXRZKSAqIHRyYW5zbGF0ZU1peDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc2NhbGVYID0gYm9uZS5hc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSA9IGJvbmUuYXNjYWxlWTtcclxuICAgICAgaWYgKHNjYWxlTWl4ICE9IDApIHtcclxuICAgICAgICBpZiAoc2NhbGVYID4gMC4wMDAwMSlcclxuICAgICAgICAgIHNjYWxlWCAqPVxyXG4gICAgICAgICAgICAodGFyZ2V0LmFzY2FsZVggLSAxICsgdGhpcy5kYXRhLm9mZnNldFNjYWxlWCkgKiBzY2FsZU1peCArIDE7XHJcbiAgICAgICAgaWYgKHNjYWxlWSA+IDAuMDAwMDEpXHJcbiAgICAgICAgICBzY2FsZVkgKj1cclxuICAgICAgICAgICAgKHRhcmdldC5hc2NhbGVZIC0gMSArIHRoaXMuZGF0YS5vZmZzZXRTY2FsZVkpICogc2NhbGVNaXggKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBzaGVhclkgPSBib25lLmFzaGVhclk7XHJcbiAgICAgIGlmIChzaGVhck1peCAhPSAwKVxyXG4gICAgICAgIHNoZWFyWSArPSAodGFyZ2V0LmFzaGVhclkgKyB0aGlzLmRhdGEub2Zmc2V0U2hlYXJZKSAqIHNoZWFyTWl4O1xyXG4gICAgICBib25lLnVwZGF0ZVdvcmxkVHJhbnNmb3JtV2l0aChcclxuICAgICAgICB4LFxyXG4gICAgICAgIHksXHJcbiAgICAgICAgcm90YXRpb24sXHJcbiAgICAgICAgc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSxcclxuICAgICAgICBib25lLmFzaGVhclgsXHJcbiAgICAgICAgc2hlYXJZXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==