458 lines
71 KiB
JavaScript
458 lines
71 KiB
JavaScript
/******************************************************************************
|
|
* 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 { Inherit } from "./BoneData.js";
|
|
import { MathUtils } from "./Utils.js";
|
|
/** The applied local pose and world transform for a bone. This is the {@link Bone.getPose} with constraints applied and the
|
|
* world transform computed by {@link Skeleton.updateWorldTransform} and {@link updateWorldTransform}.
|
|
*
|
|
* If the world transform is changed, call {@link updateLocalTransform} before using the local transform. The local
|
|
* transform may be needed by other code (eg to apply another constraint).
|
|
*
|
|
* After changing the world transform, call {@link updateWorldTransform} on every descendant bone. It may be more
|
|
* convenient to modify the local transform instead, then call {@link Skeleton.updateWorldTransform} to update the world
|
|
* transforms for all bones and apply constraints. */
|
|
export class BonePose {
|
|
bone;
|
|
/** The local x translation. */
|
|
x = 0;
|
|
/** The local y translation. */
|
|
y = 0;
|
|
/** The local rotation in degrees, counter clockwise. */
|
|
rotation = 0;
|
|
/** The local scaleX. */
|
|
scaleX = 0;
|
|
/** The local scaleY. */
|
|
scaleY = 0;
|
|
/** The local shearX. */
|
|
shearX = 0;
|
|
/** The local shearY. */
|
|
shearY = 0;
|
|
inherit = Inherit.Normal;
|
|
/** The world transform `[a b][c d]` x-axis x component. */
|
|
a = 0;
|
|
/** The world transform `[a b][c d]` y-axis x component. */
|
|
b = 0;
|
|
/** The world transform `[a b][c d]` x-axis y component. */
|
|
c = 0;
|
|
/** The world transform `[a b][c d]` y-axis y component. */
|
|
d = 0;
|
|
/** The world X position. If changed, {@link updateLocalTransform} should be called. */
|
|
worldY = 0;
|
|
/** The world Y position. If changed, {@link updateLocalTransform} should be called. */
|
|
worldX = 0;
|
|
world = 0;
|
|
local = 0;
|
|
set(pose) {
|
|
if (pose == null)
|
|
throw new Error("pose cannot be null.");
|
|
this.x = pose.x;
|
|
this.y = pose.y;
|
|
this.rotation = pose.rotation;
|
|
this.scaleX = pose.scaleX;
|
|
this.scaleY = pose.scaleY;
|
|
this.shearX = pose.shearX;
|
|
this.shearY = pose.shearY;
|
|
this.inherit = pose.inherit;
|
|
}
|
|
setPosition(x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
setScale(scaleOrX, scaleY) {
|
|
this.scaleX = scaleOrX;
|
|
this.scaleY = scaleY === undefined ? scaleOrX : scaleY;
|
|
}
|
|
/** Determines how parent world transforms affect this bone. */
|
|
getInherit() {
|
|
return this.inherit;
|
|
}
|
|
setInherit(inherit) {
|
|
if (inherit == null)
|
|
throw new Error("inherit cannot be null.");
|
|
this.inherit = inherit;
|
|
}
|
|
/** Called by {@link Skeleton.updateCache} to compute the world transform, if needed. */
|
|
update(skeleton, physics) {
|
|
if (this.world !== skeleton._update)
|
|
this.updateWorldTransform(skeleton);
|
|
}
|
|
/** Computes the world transform using the parent bone's world transform and this applied local pose. Child bones are not
|
|
* updated.
|
|
*
|
|
* See <a href="https://esotericsoftware.com/spine-runtime-skeletons#World-transforms">World transforms</a> in the Spine
|
|
* Runtimes Guide. */
|
|
updateWorldTransform(skeleton) {
|
|
if (this.local === skeleton._update)
|
|
this.updateLocalTransform(skeleton);
|
|
else
|
|
this.world = skeleton._update;
|
|
const rotation = this.rotation;
|
|
const scaleX = this.scaleX;
|
|
const scaleY = this.scaleY;
|
|
const shearX = this.shearX;
|
|
const shearY = this.shearY;
|
|
if (!this.bone.parent) { // Root bone.
|
|
const sx = skeleton.scaleX, sy = skeleton.scaleY;
|
|
const rx = (rotation + shearX) * MathUtils.degRad;
|
|
const ry = (rotation + 90 + shearY) * MathUtils.degRad;
|
|
this.a = Math.cos(rx) * scaleX * sx;
|
|
this.b = Math.cos(ry) * scaleY * sx;
|
|
this.c = Math.sin(rx) * scaleX * sy;
|
|
this.d = Math.sin(ry) * scaleY * sy;
|
|
this.worldX = this.x * sx + skeleton.x;
|
|
this.worldY = this.y * sy + skeleton.y;
|
|
return;
|
|
}
|
|
const parent = this.bone.parent.appliedPose;
|
|
let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
|
this.worldX = pa * this.x + pb * this.y + parent.worldX;
|
|
this.worldY = pc * this.x + pd * this.y + parent.worldY;
|
|
switch (this.inherit) {
|
|
case Inherit.Normal: {
|
|
const rx = (rotation + shearX) * MathUtils.degRad;
|
|
const ry = (rotation + 90 + shearY) * MathUtils.degRad;
|
|
const la = Math.cos(rx) * scaleX;
|
|
const lb = Math.cos(ry) * scaleY;
|
|
const lc = Math.sin(rx) * scaleX;
|
|
const ld = Math.sin(ry) * scaleY;
|
|
this.a = pa * la + pb * lc;
|
|
this.b = pa * lb + pb * ld;
|
|
this.c = pc * la + pd * lc;
|
|
this.d = pc * lb + pd * ld;
|
|
return;
|
|
}
|
|
case Inherit.OnlyTranslation: {
|
|
const sx = skeleton.scaleX, sy = skeleton.scaleY;
|
|
const rx = (rotation + shearX) * MathUtils.degRad;
|
|
const ry = (rotation + 90 + shearY) * MathUtils.degRad;
|
|
this.a = Math.cos(rx) * scaleX * sx;
|
|
this.b = Math.cos(ry) * scaleY * sx;
|
|
this.c = Math.sin(rx) * scaleX * sy;
|
|
this.d = Math.sin(ry) * scaleY * sy;
|
|
break;
|
|
}
|
|
case Inherit.NoRotationOrReflection: {
|
|
const sx = skeleton.scaleX, sy = skeleton.scaleY, sxi = 1 / sx, syi = 1 / sy;
|
|
pa *= sxi;
|
|
pc *= syi;
|
|
let s = pa * pa + pc * pc;
|
|
let r = 0;
|
|
if (s > MathUtils.epsilon2) {
|
|
s = Math.abs(pa * pd * syi - pb * sxi * pc) / s;
|
|
pb = pc * s;
|
|
pd = pa * s;
|
|
r = rotation - MathUtils.atan2Deg(pc, pa);
|
|
}
|
|
else {
|
|
pa = 0;
|
|
pc = 0;
|
|
r = rotation - 90 + MathUtils.atan2Deg(pd, pb);
|
|
}
|
|
const rx = (r + shearX) * MathUtils.degRad;
|
|
const ry = (r + shearY + 90) * MathUtils.degRad;
|
|
const la = Math.cos(rx) * scaleX;
|
|
const lb = Math.cos(ry) * scaleY;
|
|
const lc = Math.sin(rx) * scaleX;
|
|
const ld = Math.sin(ry) * scaleY;
|
|
this.a = (pa * la - pb * lc) * sx;
|
|
this.b = (pa * lb - pb * ld) * sx;
|
|
this.c = (pc * la + pd * lc) * sy;
|
|
this.d = (pc * lb + pd * ld) * sy;
|
|
break;
|
|
}
|
|
case Inherit.NoScale:
|
|
case Inherit.NoScaleOrReflection: {
|
|
const sx = skeleton.scaleX, sy = skeleton.scaleY, sxi = 1 / sx, syi = 1 / sy;
|
|
const r = rotation * MathUtils.degRad, cos = Math.cos(r), sin = Math.sin(r);
|
|
let za = (pa * cos + pb * sin) * sxi;
|
|
let zc = (pc * cos + pd * sin) * syi;
|
|
const s = 1 / Math.sqrt(za * za + zc * zc);
|
|
za *= s;
|
|
zc *= s;
|
|
let zb = -zc, zd = za;
|
|
if (this.inherit === Inherit.NoScale && pa * pd - pb * pc < 0 !== (sx < 0 !== sy < 0)) {
|
|
zb = -zb;
|
|
zd = -zd;
|
|
}
|
|
const rx = shearX * MathUtils.degRad;
|
|
const ry = (90 + shearY) * MathUtils.degRad;
|
|
const la = Math.cos(rx) * scaleX;
|
|
const lb = Math.cos(ry) * scaleY;
|
|
const lc = Math.sin(rx) * scaleX;
|
|
const ld = Math.sin(ry) * scaleY;
|
|
this.a = (za * la + zb * lc) * sx;
|
|
this.b = (za * lb + zb * ld) * sx;
|
|
this.c = (zc * la + zd * lc) * sy;
|
|
this.d = (zc * lb + zd * ld) * sy;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
/** Computes the local transform values from the world transform.
|
|
*
|
|
* If the world transform is modified (by a constraint, {@link rotateWorld}, etc) then this method should be called so
|
|
* the local transform matches the world transform. The local transform may be needed by other code (eg to apply another
|
|
* constraint).
|
|
*
|
|
* Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The local transform after
|
|
* calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */
|
|
updateLocalTransform(skeleton) {
|
|
this.local = 0;
|
|
this.world = skeleton._update;
|
|
const sx = skeleton.scaleX, sy = skeleton.scaleY;
|
|
if (!this.bone.parent) {
|
|
const sxi = 1 / sx, syi = 1 / sy;
|
|
this.x = (this.worldX - skeleton.x) * sxi;
|
|
this.y = (this.worldY - skeleton.y) * syi;
|
|
this.set5(this.a * sxi, this.b * sxi, this.c * syi, this.d * syi, 0);
|
|
return;
|
|
}
|
|
const parent = this.bone.parent.appliedPose;
|
|
let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
|
|
const pad = pa * pd - pb * pc, pid = 1 / (pa * pd - pb * pc);
|
|
const ia = pd * pid, ib = pb * pid, ic = pc * pid, id = pa * pid;
|
|
const dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;
|
|
this.x = dx * ia - dy * ib;
|
|
this.y = dy * id - dx * ic;
|
|
switch (this.inherit) {
|
|
case Inherit.Normal:
|
|
this.set5(ia * this.a - ib * this.c, ia * this.b - ib * this.d, id * this.c - ic * this.a, id * this.d - ic * this.b, 0);
|
|
break;
|
|
case Inherit.OnlyTranslation: {
|
|
const sxi = 1 / sx, syi = 1 / sy;
|
|
this.set5(this.a * sxi, this.b * sxi, this.c * syi, this.d * syi, 0);
|
|
break;
|
|
}
|
|
case Inherit.NoRotationOrReflection: {
|
|
const sxi = 1 / sx, syi = 1 / sy;
|
|
pa *= sxi;
|
|
pc *= syi;
|
|
const wa = this.a * sxi, wb = this.b * sxi, wc = this.c * syi, wd = this.d * syi;
|
|
const s = 1 / (pa * pa + pc * pc), det = 1 / Math.abs(pad * sxi * syi);
|
|
this.set5((pa * wa + pc * wc) * s, (pa * wb + pc * wd) * s, (pa * wc - pc * wa) * det, (pa * wd - pc * wb) * det, MathUtils.atan2Deg(pc, pa));
|
|
break;
|
|
}
|
|
case Inherit.NoScale:
|
|
case Inherit.NoScaleOrReflection: {
|
|
const sxi = 1 / sx, syi = 1 / sy;
|
|
const wa = this.a * sxi, wb = this.b * sxi, wc = this.c * syi, wd = this.d * syi;
|
|
let tx = pd * this.a - pb * this.c, ty = pa * this.c - pc * this.a;
|
|
if (pad < 0) {
|
|
tx = -tx;
|
|
ty = -ty;
|
|
}
|
|
let r = MathUtils.atan2Deg(ty, tx);
|
|
this.rotation = r;
|
|
r *= MathUtils.degRad;
|
|
const cos = Math.cos(r), sin = Math.sin(r);
|
|
let za = (pa * cos + pb * sin) * sxi;
|
|
let zc = (pc * cos + pd * sin) * syi;
|
|
const s = 1 / Math.sqrt(za * za + zc * zc);
|
|
za *= s;
|
|
zc *= s;
|
|
const si = this.inherit === Inherit.NoScale && pad < 0 !== (sx < 0 !== sy < 0) ? -1 : 1;
|
|
this.set4(za * wa + zc * wc, za * wb + zc * wd, (za * wc - zc * wa) * si, (za * wd - zc * wb) * si);
|
|
}
|
|
}
|
|
}
|
|
set4(ra, rb, rc, rd) {
|
|
const x = ra * ra + rc * rc, y = rb * rb + rd * rd;
|
|
if (x > MathUtils.epsilon2) {
|
|
this.shearX = MathUtils.atan2Deg(rc, ra);
|
|
this.scaleX = Math.sqrt(x);
|
|
}
|
|
else {
|
|
this.shearX = 0;
|
|
this.scaleX = 0;
|
|
}
|
|
this.scaleY = Math.sqrt(y);
|
|
if (y > MathUtils.epsilon2) {
|
|
this.shearY = MathUtils.atan2Deg(rd, rb);
|
|
if (ra * rd - rb * rc < 0) {
|
|
this.scaleY = -this.scaleY;
|
|
this.shearY += 90;
|
|
}
|
|
else
|
|
this.shearY -= 90;
|
|
if (this.shearY > 180)
|
|
this.shearY -= 360;
|
|
else if (this.shearY <= -180) //
|
|
this.shearY += 360;
|
|
}
|
|
else
|
|
this.shearY = 0;
|
|
}
|
|
set5(ra, rb, rc, rd, ro) {
|
|
this.shearX = 0;
|
|
const x = ra * ra + rc * rc, y = rb * rb + rd * rd;
|
|
if (x > MathUtils.epsilon2) {
|
|
const r = MathUtils.atan2Deg(rc, ra);
|
|
this.rotation = r + ro;
|
|
this.scaleX = Math.sqrt(x);
|
|
this.scaleY = Math.sqrt(y);
|
|
if (y > MathUtils.epsilon2) {
|
|
this.shearY = MathUtils.atan2Deg(rd, rb);
|
|
if (ra * rd - rb * rc < 0) {
|
|
this.scaleY = -this.scaleY;
|
|
this.shearY += 90 - r;
|
|
}
|
|
else
|
|
this.shearY -= 90 + r;
|
|
if (this.shearY > 180)
|
|
this.shearY -= 360;
|
|
else if (this.shearY <= -180) //
|
|
this.shearY += 360;
|
|
}
|
|
else
|
|
this.shearY = 0;
|
|
}
|
|
else {
|
|
this.scaleX = 0;
|
|
this.scaleY = Math.sqrt(y);
|
|
this.shearY = 0;
|
|
this.rotation = y > MathUtils.epsilon2 ? MathUtils.atan2Deg(rd, rb) - 90 + ro : ro;
|
|
}
|
|
}
|
|
/** If the world transform has been modified by constraints and the local transform no longer matches,
|
|
* {@link updateLocalTransform} is called. Call this after {@link Skeleton.updateWorldTransform} before
|
|
* using the applied local transform. */
|
|
validateLocalTransform(skeleton) {
|
|
if (this.local === skeleton._update)
|
|
this.updateLocalTransform(skeleton);
|
|
}
|
|
modifyLocal(skeleton) {
|
|
if (this.local === skeleton._update)
|
|
this.updateLocalTransform(skeleton);
|
|
this.world = 0;
|
|
this.resetWorld(skeleton, skeleton._update);
|
|
}
|
|
modifyWorld(skeleton) {
|
|
const update = skeleton._update;
|
|
this.local = update;
|
|
this.world = update;
|
|
this.resetWorld(skeleton, update);
|
|
}
|
|
resetWorld(skeleton, update) {
|
|
const children = this.bone.children;
|
|
for (let i = 0, n = children.length; i < n; i++) {
|
|
const child = children[i].appliedPose;
|
|
if (child.world === update) {
|
|
if (child.local === update)
|
|
child.updateLocalTransform(skeleton);
|
|
child.world = 0;
|
|
child.resetWorld(skeleton, update);
|
|
}
|
|
}
|
|
}
|
|
/** The world rotation for the X axis, calculated using {@link a} and {@link c}. This is the direction the bone is
|
|
* pointing. */
|
|
getWorldRotationX() {
|
|
return MathUtils.atan2Deg(this.c, this.a);
|
|
}
|
|
/** The world rotation for the Y axis, calculated using {@link b} and {@link d}. */
|
|
getWorldRotationY() {
|
|
return MathUtils.atan2Deg(this.d, this.b);
|
|
}
|
|
/** The magnitude (always positive) of the world scale X, calculated using {@link a} and {@link c}. */
|
|
getWorldScaleX() {
|
|
return Math.sqrt(this.a * this.a + this.c * this.c);
|
|
}
|
|
/** The magnitude (always positive) of the world scale Y, calculated using {@link b} and {@link d}. */
|
|
getWorldScaleY() {
|
|
return Math.sqrt(this.b * this.b + this.d * this.d);
|
|
}
|
|
// public Matrix3 getWorldTransform (Matrix3 worldTransform) {
|
|
// if (worldTransform == null) throw new IllegalArgumentException("worldTransform cannot be null.");
|
|
// float[] val = worldTransform.val;
|
|
// val[M00] = a;
|
|
// val[M01] = b;
|
|
// val[M10] = c;
|
|
// val[M11] = d;
|
|
// val[M02] = worldX;
|
|
// val[M12] = worldY;
|
|
// val[M20] = 0;
|
|
// val[M21] = 0;
|
|
// val[M22] = 1;
|
|
// return worldTransform;
|
|
// }
|
|
/** Transforms a point from world coordinates to the bone's local coordinates. */
|
|
worldToLocal(world) {
|
|
if (world == null)
|
|
throw new Error("world cannot be null.");
|
|
const det = this.a * this.d - this.b * this.c;
|
|
const x = world.x - this.worldX, y = world.y - this.worldY;
|
|
world.x = (x * this.d - y * this.b) / det;
|
|
world.y = (y * this.a - x * this.c) / det;
|
|
return world;
|
|
}
|
|
/** Transforms a point from the bone's local coordinates to world coordinates. */
|
|
localToWorld(local) {
|
|
if (local == null)
|
|
throw new Error("local cannot be null.");
|
|
const x = local.x, y = local.y;
|
|
local.x = x * this.a + y * this.b + this.worldX;
|
|
local.y = x * this.c + y * this.d + this.worldY;
|
|
return local;
|
|
}
|
|
/** Transforms a point from world coordinates to the parent bone's local coordinates. */
|
|
worldToParent(world) {
|
|
if (world == null)
|
|
throw new Error("world cannot be null.");
|
|
return this.bone.parent == null ? world : this.bone.parent.appliedPose.worldToLocal(world);
|
|
}
|
|
/** Transforms a point from the parent bone's coordinates to world coordinates. */
|
|
parentToWorld(world) {
|
|
if (world == null)
|
|
throw new Error("world cannot be null.");
|
|
return this.bone.parent == null ? world : this.bone.parent.appliedPose.localToWorld(world);
|
|
}
|
|
/** Transforms a world rotation to a local rotation. */
|
|
worldToLocalRotation(worldRotation) {
|
|
worldRotation *= MathUtils.degRad;
|
|
const sin = Math.sin(worldRotation), cos = Math.cos(worldRotation);
|
|
return MathUtils.atan2Deg(this.a * sin - this.c * cos, this.d * cos - this.b * sin) + this.rotation - this.shearX;
|
|
}
|
|
/** Transforms a local rotation to a world rotation. */
|
|
localToWorldRotation(localRotation) {
|
|
localRotation = (localRotation - this.rotation - this.shearX) * MathUtils.degRad;
|
|
const sin = Math.sin(localRotation), cos = Math.cos(localRotation);
|
|
return MathUtils.atan2Deg(cos * this.c + sin * this.d, cos * this.a + sin * this.b);
|
|
}
|
|
/** Rotates the world transform the specified amount. */
|
|
rotateWorld(degrees) {
|
|
degrees *= MathUtils.degRad;
|
|
const sin = Math.sin(degrees), cos = Math.cos(degrees);
|
|
const ra = this.a, rb = this.b;
|
|
this.a = cos * ra - sin * this.c;
|
|
this.b = cos * rb - sin * this.d;
|
|
this.c = sin * ra + cos * this.c;
|
|
this.d = sin * rb + cos * this.d;
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9uZVBvc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQm9uZVBvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLeEMsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxZQUFZLENBQUM7QUFFckQ7Ozs7Ozs7O3FEQVFxRDtBQUNyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQixJQUFJLENBQVE7SUFFWiwrQkFBK0I7SUFDL0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVOLCtCQUErQjtJQUMvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sd0RBQXdEO0lBQ3hELFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFYix3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLHdCQUF3QjtJQUN4QixNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRVgsd0JBQXdCO0lBQ3hCLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFWCx3QkFBd0I7SUFDeEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBRXpCLDJEQUEyRDtJQUMzRCxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sMkRBQTJEO0lBQzNELENBQUMsR0FBRyxDQUFDLENBQUM7SUFFTiwyREFBMkQ7SUFDM0QsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVOLDJEQUEyRDtJQUMzRCxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRU4sdUZBQXVGO0lBQ3ZGLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFWCx1RkFBdUY7SUFDdkYsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRVYsR0FBRyxDQUFFLElBQWM7UUFDbEIsSUFBSSxJQUFJ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cEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1IsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUM1QyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFeEQsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckIs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LENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU07WUFDUCxDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLEtBQUssT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0UsTUFBTSxDQUFDLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNyQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ1IsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDUixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxF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RSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFM0IsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsS0FBSyxPQUFPLENBQUMsTUFBTTtnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUs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QztRQUNuRSxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELFdBQVcsQ0FBRSxPQUFlO1FBQzNCLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lLmpzXCI7XG5pbXBvcnQgeyBJbmhlcml0IH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgUGh5c2ljcyB9IGZyb20gXCIuL1BoeXNpY3MuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zZSB9IGZyb20gXCIuL1Bvc2UuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b24gfSBmcm9tIFwiLi9Ta2VsZXRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVcGRhdGUgfSBmcm9tIFwiLi9VcGRhdGUuanNcIjtcbmltcG9ydCB7IE1hdGhVdGlscywgdHlwZSBWZWN0b3IyIH0gZnJvbSBcIi4vVXRpbHMuanNcIjtcblxuLyoqIFRoZSBhcHBsaWVkIGxvY2FsIHBvc2UgYW5kIHdvcmxkIHRyYW5zZm9ybSBmb3IgYSBib25lLiBUaGlzIGlzIHRoZSB7QGxpbmsgQm9uZS5nZXRQb3NlfSB3aXRoIGNvbnN0cmFpbnRzIGFwcGxpZWQgYW5kIHRoZVxuICogd29ybGQgdHJhbnNmb3JtIGNvbXB1dGVkIGJ5IHtAbGluayBTa2VsZXRvbi51cGRhdGVXb3JsZFRyYW5zZm9ybX0gYW5kIHtAbGluayB1cGRhdGVXb3JsZFRyYW5zZm9ybX0uXG4gKlxuICogSWYgdGhlIHdvcmxkIHRyYW5zZm9ybSBpcyBjaGFuZ2VkLCBjYWxsIHtAbGluayB1cGRhdGVMb2NhbFRyYW5zZm9ybX0gYmVmb3JlIHVzaW5nIHRoZSBsb2NhbCB0cmFuc2Zvcm0uIFRoZSBsb2NhbFxuICogdHJhbnNmb3JtIG1heSBiZSBuZWVkZWQgYnkgb3RoZXIgY29kZSAoZWcgdG8gYXBwbHkgYW5vdGhlciBjb25zdHJhaW50KS5cbiAqXG4gKiBBZnRlciBjaGFuZ2luZyB0aGUgd29ybGQgdHJhbnNmb3JtLCBjYWxsIHtAbGluayB1cGRhdGVXb3JsZFRyYW5zZm9ybX0gb24gZXZlcnkgZGVzY2VuZGFudCBib25lLiBJdCBtYXkgYmUgbW9yZVxuICogY29udmVuaWVudCB0byBtb2RpZnkgdGhlIGxvY2FsIHRyYW5zZm9ybSBpbnN0ZWFkLCB0aGVuIGNhbGwge0BsaW5rIFNrZWxldG9uLnVwZGF0ZVdvcmxkVHJhbnNmb3JtfSB0byB1cGRhdGUgdGhlIHdvcmxkXG4gKiB0cmFuc2Zvcm1zIGZvciBhbGwgYm9uZXMgYW5kIGFwcGx5IGNvbnN0cmFpbnRzLiAqL1xuZXhwb3J0IGNsYXNzIEJvbmVQb3NlIGltcGxlbWVudHMgUG9zZTxCb25lUG9zZT4sIFVwZGF0ZSB7XG5cdGJvbmUhOiBCb25lO1xuXG5cdC8qKiBUaGUgbG9jYWwgeCB0cmFuc2xhdGlvbi4gKi9cblx0eCA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCB5IHRyYW5zbGF0aW9uLiAqL1xuXHR5ID0gMDtcblxuXHQvKiogVGhlIGxvY2FsIHJvdGF0aW9uIGluIGRlZ3JlZXMsIGNvdW50ZXIgY2xvY2t3aXNlLiAqL1xuXHRyb3RhdGlvbiA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVguICovXG5cdHNjYWxlWCA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzY2FsZVkuICovXG5cdHNjYWxlWSA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzaGVhclguICovXG5cdHNoZWFyWCA9IDA7XG5cblx0LyoqIFRoZSBsb2NhbCBzaGVhclkuICovXG5cdHNoZWFyWSA9IDA7XG5cblx0aW5oZXJpdCA9IEluaGVyaXQuTm9ybWFsO1xuXG5cdC8qKiBUaGUgd29ybGQgdHJhbnNmb3JtIGBbYSBiXVtjIGRdYCB4LWF4aXMgeCBjb21wb25lbnQuICovXG5cdGEgPSAwO1xuXG5cdC8qKiBUaGUgd29ybGQgdHJhbnNmb3JtIGBbYSBiXVtjIGRdYCB5LWF4aXMgeCBjb21wb25lbnQuICovXG5cdGIgPSAwO1xuXG5cdC8qKiBUaGUgd29ybGQgdHJhbnNmb3JtIGBbYSBiXVtjIGRdYCB4LWF4aXMgeSBjb21wb25lbnQuICovXG5cdGMgPSAwO1xuXG5cdC8qKiBUaGUgd29ybGQgdHJhbnNmb3JtIGBbYSBiXVtjIGRdYCB5LWF4aXMgeSBjb21wb25lbnQuICovXG5cdGQgPSAwO1xuXG5cdC8qKiBUaGUgd29ybGQgWCBwb3NpdGlvbi4gSWYgY2hhbmdlZCwge0BsaW5rIHVwZGF0ZUxvY2FsVHJhbnNmb3JtfSBzaG91bGQgYmUgY2FsbGVkLiAqL1xuXHR3b3JsZFkgPSAwO1xuXG5cdC8qKiBUaGUgd29ybGQgWSBwb3NpdGlvbi4gSWYgY2hhbmdlZCwge0BsaW5rIHVwZGF0ZUxvY2FsVHJhbnNmb3JtfSBzaG91bGQgYmUgY2FsbGVkLiAqL1xuXHR3b3JsZFggPSAwO1xuXG5cdHdvcmxkID0gMDtcblx0bG9jYWwgPSAwO1xuXG5cdHNldCAocG9zZTogQm9uZVBvc2UpOiB2b2lkIHtcblx0XHRpZiAocG9zZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJwb3NlIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLnggPSBwb3NlLng7XG5cdFx0dGhpcy55ID0gcG9zZS55O1xuXHRcdHRoaXMucm90YXRpb24gPSBwb3NlLnJvdGF0aW9uO1xuXHRcdHRoaXMuc2NhbGVYID0gcG9zZS5zY2FsZVg7XG5cdFx0dGhpcy5zY2FsZVkgPSBwb3NlLnNjYWxlWTtcblx0XHR0aGlzLnNoZWFyWCA9IHBvc2Uuc2hlYXJYO1xuXHRcdHRoaXMuc2hlYXJZID0gcG9zZS5zaGVhclk7XG5cdFx0dGhpcy5pbmhlcml0ID0gcG9zZS5pbmhlcml0O1xuXHR9XG5cblx0c2V0UG9zaXRpb24gKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHR9XG5cblx0c2V0U2NhbGUgKHNjYWxlWDogbnVtYmVyLCBzY2FsZVk6IG51bWJlcik6IHZvaWQ7XG5cdHNldFNjYWxlIChzY2FsZTogbnVtYmVyKTogdm9pZDtcblx0c2V0U2NhbGUgKHNjYWxlT3JYOiBudW1iZXIsIHNjYWxlWT86IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMuc2NhbGVYID0gc2NhbGVPclg7XG5cdFx0dGhpcy5zY2FsZVkgPSBzY2FsZVkgPT09IHVuZGVmaW5lZCA/IHNjYWxlT3JYIDogc2NhbGVZO1xuXHR9XG5cblx0LyoqIERldGVybWluZXMgaG93IHBhcmVudCB3b3JsZCB0cmFuc2Zvcm1zIGFmZmVjdCB0aGlzIGJvbmUuICovXG5cdHB1YmxpYyBnZXRJbmhlcml0ICgpOiBJbmhlcml0IHtcblx0XHRyZXR1cm4gdGhpcy5pbmhlcml0O1xuXHR9XG5cblx0cHVibGljIHNldEluaGVyaXQgKGluaGVyaXQ6IEluaGVyaXQpOiB2b2lkIHtcblx0XHRpZiAoaW5oZXJpdCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJpbmhlcml0IGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHR0aGlzLmluaGVyaXQgPSBpbmhlcml0O1xuXHR9XG5cblx0LyoqIENhbGxlZCBieSB7QGxpbmsgU2tlbGV0b24udXBkYXRlQ2FjaGV9IHRvIGNvbXB1dGUgdGhlIHdvcmxkIHRyYW5zZm9ybSwgaWYgbmVlZGVkLiAqL1xuXHRwdWJsaWMgdXBkYXRlIChza2VsZXRvbjogU2tlbGV0b24sIHBoeXNpY3M6IFBoeXNpY3MpOiB2b2lkIHtcblx0XHRpZiAodGhpcy53b3JsZCAhPT0gc2tlbGV0b24uX3VwZGF0ZSkgdGhpcy51cGRhdGVXb3JsZFRyYW5zZm9ybShza2VsZXRvbik7XG5cdH1cblxuXHQvKiogQ29tcHV0ZXMgdGhlIHdvcmxkIHRyYW5zZm9ybSB1c2luZyB0aGUgcGFyZW50IGJvbmUncyB3b3JsZCB0cmFuc2Zvcm0gYW5kIHRoaXMgYXBwbGllZCBsb2NhbCBwb3NlLiBDaGlsZCBib25lcyBhcmUgbm90XG5cdCAqIHVwZGF0ZWQuXG5cdCAqXG5cdCAqIFNlZSA8YSBocmVmPVwiaHR0cHM6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1ydW50aW1lLXNrZWxldG9ucyNXb3JsZC10cmFuc2Zvcm1zXCI+V29ybGQgdHJhbnNmb3JtczwvYT4gaW4gdGhlIFNwaW5lXG5cdCAqIFJ1bnRpbWVzIEd1aWRlLiAqL1xuXHR1cGRhdGVXb3JsZFRyYW5zZm9ybSAoc2tlbGV0b246IFNrZWxldG9uKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9jYWwgPT09IHNrZWxldG9uLl91cGRhdGUpXG5cdFx0XHR0aGlzLnVwZGF0ZUxvY2FsVHJhbnNmb3JtKHNrZWxldG9uKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLndvcmxkID0gc2tlbGV0b24uX3VwZGF0ZTtcblxuXHRcdGNvbnN0IHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcblx0XHRjb25zdCBzY2FsZVggPSB0aGlzLnNjYWxlWDtcblx0XHRjb25zdCBzY2FsZVkgPSB0aGlzLnNjYWxlWTtcblx0XHRjb25zdCBzaGVhclggPSB0aGlzLnNoZWFyWDtcblx0XHRjb25zdCBzaGVhclkgPSB0aGlzLnNoZWFyWTtcblx0XHRpZiAoIXRoaXMuYm9uZS5wYXJlbnQpIHsgLy8gUm9vdCBib25lLlxuXHRcdFx0Y29uc3Qgc3ggPSBza2VsZXRvbi5zY2FsZVgsIHN5ID0gc2tlbGV0b24uc2NhbGVZO1xuXHRcdFx0Y29uc3QgcnggPSAocm90YXRpb24gKyBzaGVhclgpICogTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRcdGNvbnN0IHJ5ID0gKHJvdGF0aW9uICsgOTAgKyBzaGVhclkpICogTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRcdHRoaXMuYSA9IE1hdGguY29zKHJ4KSAqIHNjYWxlWCAqIHN4O1xuXHRcdFx0dGhpcy5iID0gTWF0aC5jb3MocnkpICogc2NhbGVZICogc3g7XG5cdFx0XHR0aGlzLmMgPSBNYXRoLnNpbihyeCkgKiBzY2FsZVggKiBzeTtcblx0XHRcdHRoaXMuZCA9IE1hdGguc2luKHJ5KSAqIHNjYWxlWSAqIHN5O1xuXHRcdFx0dGhpcy53b3JsZFggPSB0aGlzLnggKiBzeCArIHNrZWxldG9uLng7XG5cdFx0XHR0aGlzLndvcmxkWSA9IHRoaXMueSAqIHN5ICsgc2tlbGV0b24ueTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLmJvbmUucGFyZW50LmFwcGxpZWRQb3NlO1xuXHRcdGxldCBwYSA9IHBhcmVudC5hLCBwYiA9IHBhcmVudC5iLCBwYyA9IHBhcmVudC5jLCBwZCA9IHBhcmVudC5kO1xuXHRcdHRoaXMud29ybGRYID0gcGEgKiB0aGlzLnggKyBwYiAqIHRoaXMueSArIHBhcmVudC53b3JsZFg7XG5cdFx0dGhpcy53b3JsZFkgPSBwYyAqIHRoaXMueCArIHBkICogdGhpcy55ICsgcGFyZW50LndvcmxkWTtcblxuXHRcdHN3aXRjaCAodGhpcy5pbmhlcml0KSB7XG5cdFx0XHRjYXNlIEluaGVyaXQuTm9ybWFsOiB7XG5cdFx0XHRcdGNvbnN0IHJ4ID0gKHJvdGF0aW9uICsgc2hlYXJYKSAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0XHRcdGNvbnN0IHJ5ID0gKHJvdGF0aW9uICsgOTAgKyBzaGVhclkpICogTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRcdFx0Y29uc3QgbGEgPSBNYXRoLmNvcyhyeCkgKiBzY2FsZVg7XG5cdFx0XHRcdGNvbnN0IGxiID0gTWF0aC5jb3MocnkpICogc2NhbGVZO1xuXHRcdFx0XHRjb25zdCBsYyA9IE1hdGguc2luKHJ4KSAqIHNjYWxlWDtcblx0XHRcdFx0Y29uc3QgbGQgPSBNYXRoLnNpbihyeSkgKiBzY2FsZVk7XG5cdFx0XHRcdHRoaXMuYSA9IHBhICogbGEgKyBwYiAqIGxjO1xuXHRcdFx0XHR0aGlzLmIgPSBwYSAqIGxiICsgcGIgKiBsZDtcblx0XHRcdFx0dGhpcy5jID0gcGMgKiBsYSArIHBkICogbGM7XG5cdFx0XHRcdHRoaXMuZCA9IHBjICogbGIgKyBwZCAqIGxkO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEluaGVyaXQuT25seVRyYW5zbGF0aW9uOiB7XG5cdFx0XHRcdGNvbnN0IHN4ID0gc2tlbGV0b24uc2NhbGVYLCBzeSA9IHNrZWxldG9uLnNjYWxlWTtcblx0XHRcdFx0Y29uc3QgcnggPSAocm90YXRpb24gKyBzaGVhclgpICogTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRcdFx0Y29uc3QgcnkgPSAocm90YXRpb24gKyA5MCArIHNoZWFyWSkgKiBNYXRoVXRpbHMuZGVnUmFkO1xuXHRcdFx0XHR0aGlzLmEgPSBNYXRoLmNvcyhyeCkgKiBzY2FsZVggKiBzeDtcblx0XHRcdFx0dGhpcy5iID0gTWF0aC5jb3MocnkpICogc2NhbGVZICogc3g7XG5cdFx0XHRcdHRoaXMuYyA9IE1hdGguc2luKHJ4KSAqIHNjYWxlWCAqIHN5O1xuXHRcdFx0XHR0aGlzLmQgPSBNYXRoLnNpbihyeSkgKiBzY2FsZVkgKiBzeTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEluaGVyaXQuTm9Sb3RhdGlvbk9yUmVmbGVjdGlvbjoge1xuXHRcdFx0XHRjb25zdCBzeCA9IHNrZWxldG9uLnNjYWxlWCwgc3kgPSBza2VsZXRvbi5zY2FsZVksIHN4aSA9IDEgLyBzeCwgc3lpID0gMSAvIHN5O1xuXHRcdFx0XHRwYSAqPSBzeGk7XG5cdFx0XHRcdHBjICo9IHN5aTtcblx0XHRcdFx0bGV0IHMgPSBwYSAqIHBhICsgcGMgKiBwYztcblx0XHRcdFx0bGV0IHIgPSAwO1xuXHRcdFx0XHRpZiAocyA+IE1hdGhVdGlscy5lcHNpbG9uMikge1xuXHRcdFx0XHRcdHMgPSBNYXRoLmFicyhwYSAqIHBkICogc3lpIC0gcGIgKiBzeGkgKiBwYykgLyBzO1xuXHRcdFx0XHRcdHBiID0gcGMgKiBzO1xuXHRcdFx0XHRcdHBkID0gcGEgKiBzO1xuXHRcdFx0XHRcdHIgPSByb3RhdGlvbiAtIE1hdGhVdGlscy5hdGFuMkRlZyhwYywgcGEpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBhID0gMDtcblx0XHRcdFx0XHRwYyA9IDA7XG5cdFx0XHRcdFx0ciA9IHJvdGF0aW9uIC0gOTAgKyBNYXRoVXRpbHMuYXRhbjJEZWcocGQsIHBiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByeCA9IChyICsgc2hlYXJYKSAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0XHRcdGNvbnN0IHJ5ID0gKHIgKyBzaGVhclkgKyA5MCkgKiBNYXRoVXRpbHMuZGVnUmFkO1xuXHRcdFx0XHRjb25zdCBsYSA9IE1hdGguY29zKHJ4KSAqIHNjYWxlWDtcblx0XHRcdFx0Y29uc3QgbGIgPSBNYXRoLmNvcyhyeSkgKiBzY2FsZVk7XG5cdFx0XHRcdGNvbnN0IGxjID0gTWF0aC5zaW4ocngpICogc2NhbGVYO1xuXHRcdFx0XHRjb25zdCBsZCA9IE1hdGguc2luKHJ5KSAqIHNjYWxlWTtcblx0XHRcdFx0dGhpcy5hID0gKHBhICogbGEgLSBwYiAqIGxjKSAqIHN4O1xuXHRcdFx0XHR0aGlzLmIgPSAocGEgKiBsYiAtIHBiICogbGQpICogc3g7XG5cdFx0XHRcdHRoaXMuYyA9IChwYyAqIGxhICsgcGQgKiBsYykgKiBzeTtcblx0XHRcdFx0dGhpcy5kID0gKHBjICogbGIgKyBwZCAqIGxkKSAqIHN5O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgSW5oZXJpdC5Ob1NjYWxlOlxuXHRcdFx0Y2FzZSBJbmhlcml0Lk5vU2NhbGVPclJlZmxlY3Rpb246IHtcblx0XHRcdFx0Y29uc3Qgc3ggPSBza2VsZXRvbi5zY2FsZVgsIHN5ID0gc2tlbGV0b24uc2NhbGVZLCBzeGkgPSAxIC8gc3gsIHN5aSA9IDEgLyBzeTtcblx0XHRcdFx0Y29uc3QgciA9IHJvdGF0aW9uICogTWF0aFV0aWxzLmRlZ1JhZCwgY29zID0gTWF0aC5jb3MociksIHNpbiA9IE1hdGguc2luKHIpO1xuXHRcdFx0XHRsZXQgemEgPSAocGEgKiBjb3MgKyBwYiAqIHNpbikgKiBzeGk7XG5cdFx0XHRcdGxldCB6YyA9IChwYyAqIGNvcyArIHBkICogc2luKSAqIHN5aTtcblx0XHRcdFx0Y29uc3QgcyA9IDEgLyBNYXRoLnNxcnQoemEgKiB6YSArIHpjICogemMpO1xuXHRcdFx0XHR6YSAqPSBzO1xuXHRcdFx0XHR6YyAqPSBzO1xuXHRcdFx0XHRsZXQgemIgPSAtemMsIHpkID0gemE7XG5cdFx0XHRcdGlmICh0aGlzLmluaGVyaXQgPT09IEluaGVyaXQuTm9TY2FsZSAmJiBwYSAqIHBkIC0gcGIgKiBwYyA8IDAgIT09IChzeCA8IDAgIT09IHN5IDwgMCkpIHtcblx0XHRcdFx0XHR6YiA9IC16Yjtcblx0XHRcdFx0XHR6ZCA9IC16ZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCByeCA9IHNoZWFyWCAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0XHRcdGNvbnN0IHJ5ID0gKDkwICsgc2hlYXJZKSAqIE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0XHRcdGNvbnN0IGxhID0gTWF0aC5jb3MocngpICogc2NhbGVYO1xuXHRcdFx0XHRjb25zdCBsYiA9IE1hdGguY29zKHJ5KSAqIHNjYWxlWTtcblx0XHRcdFx0Y29uc3QgbGMgPSBNYXRoLnNpbihyeCkgKiBzY2FsZVg7XG5cdFx0XHRcdGNvbnN0IGxkID0gTWF0aC5zaW4ocnkpICogc2NhbGVZO1xuXHRcdFx0XHR0aGlzLmEgPSAoemEgKiBsYSArIHpiICogbGMpICogc3g7XG5cdFx0XHRcdHRoaXMuYiA9ICh6YSAqIGxiICsgemIgKiBsZCkgKiBzeDtcblx0XHRcdFx0dGhpcy5jID0gKHpjICogbGEgKyB6ZCAqIGxjKSAqIHN5O1xuXHRcdFx0XHR0aGlzLmQgPSAoemMgKiBsYiArIHpkICogbGQpICogc3k7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBDb21wdXRlcyB0aGUgbG9jYWwgdHJhbnNmb3JtIHZhbHVlcyBmcm9tIHRoZSB3b3JsZCB0cmFuc2Zvcm0uXG5cdCAqXG5cdCAqIElmIHRoZSB3b3JsZCB0cmFuc2Zvcm0gaXMgbW9kaWZpZWQgKGJ5IGEgY29uc3RyYWludCwge0BsaW5rIHJvdGF0ZVdvcmxkfSwgZXRjKSB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgc29cblx0ICogdGhlIGxvY2FsIHRyYW5zZm9ybSBtYXRjaGVzIHRoZSB3b3JsZCB0cmFuc2Zvcm0uIFRoZSBsb2NhbCB0cmFuc2Zvcm0gbWF5IGJlIG5lZWRlZCBieSBvdGhlciBjb2RlIChlZyB0byBhcHBseSBhbm90aGVyXG5cdCAqIGNvbnN0cmFpbnQpLlxuXHQgKlxuXHQgKiBTb21lIGluZm9ybWF0aW9uIGlzIGFtYmlndW91cyBpbiB0aGUgd29ybGQgdHJhbnNmb3JtLCBzdWNoIGFzIC0xLC0xIHNjYWxlIHZlcnN1cyAxODAgcm90YXRpb24uIFRoZSBsb2NhbCB0cmFuc2Zvcm0gYWZ0ZXJcblx0ICogY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBsb2NhbCB0cmFuc2Zvcm0gdXNlZCB0byBjb21wdXRlIHRoZSB3b3JsZCB0cmFuc2Zvcm0sIGJ1dCBtYXkgbm90IGJlIGlkZW50aWNhbC4gKi9cblx0cHVibGljIHVwZGF0ZUxvY2FsVHJhbnNmb3JtIChza2VsZXRvbjogU2tlbGV0b24pOiB2b2lkIHtcblx0XHR0aGlzLmxvY2FsID0gMDtcblx0XHR0aGlzLndvcmxkID0gc2tlbGV0b24uX3VwZGF0ZTtcblxuXHRcdGNvbnN0IHN4ID0gc2tlbGV0b24uc2NhbGVYLCBzeSA9IHNrZWxldG9uLnNjYWxlWTtcblx0XHRpZiAoIXRoaXMuYm9uZS5wYXJlbnQpIHtcblx0XHRcdGNvbnN0IHN4aSA9IDEgLyBzeCwgc3lpID0gMSAvIHN5O1xuXHRcdFx0dGhpcy54ID0gKHRoaXMud29ybGRYIC0gc2tlbGV0b24ueCkgKiBzeGk7XG5cdFx0XHR0aGlzLnkgPSAodGhpcy53b3JsZFkgLSBza2VsZXRvbi55KSAqIHN5aTtcblx0XHRcdHRoaXMuc2V0NSh0aGlzLmEgKiBzeGksIHRoaXMuYiAqIHN4aSwgdGhpcy5jICogc3lpLCB0aGlzLmQgKiBzeWksIDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuYm9uZS5wYXJlbnQuYXBwbGllZFBvc2U7XG5cdFx0bGV0IHBhID0gcGFyZW50LmEsIHBiID0gcGFyZW50LmIsIHBjID0gcGFyZW50LmMsIHBkID0gcGFyZW50LmQ7XG5cdFx0Y29uc3QgcGFkID0gcGEgKiBwZCAtIHBiICogcGMsIHBpZCA9IDEgLyAocGEgKiBwZCAtIHBiICogcGMpO1xuXHRcdGNvbnN0IGlhID0gcGQgKiBwaWQsIGliID0gcGIgKiBwaWQsIGljID0gcGMgKiBwaWQsIGlkID0gcGEgKiBwaWQ7XG5cdFx0Y29uc3QgZHggPSB0aGlzLndvcmxkWCAtIHBhcmVudC53b3JsZFgsIGR5ID0gdGhpcy53b3JsZFkgLSBwYXJlbnQud29ybGRZO1xuXHRcdHRoaXMueCA9IGR4ICogaWEgLSBkeSAqIGliO1xuXHRcdHRoaXMueSA9IGR5ICogaWQgLSBkeCAqIGljO1xuXG5cdFx0c3dpdGNoICh0aGlzLmluaGVyaXQpIHtcblx0XHRcdGNhc2UgSW5oZXJpdC5Ob3JtYWw6IHRoaXMuc2V0NShpYSAqIHRoaXMuYSAtIGliICogdGhpcy5jLCBpYSAqIHRoaXMuYiAtIGliICogdGhpcy5kLCBpZCAqIHRoaXMuYyAtIGljICogdGhpcy5hLCBpZCAqIHRoaXMuZCAtIGljICogdGhpcy5iLCAwKTsgYnJlYWs7XG5cdFx0XHRjYXNlIEluaGVyaXQuT25seVRyYW5zbGF0aW9uOiB7XG5cdFx0XHRcdGNvbnN0IHN4aSA9IDEgLyBzeCwgc3lpID0gMSAvIHN5O1xuXHRcdFx0XHR0aGlzLnNldDUodGhpcy5hICogc3hpLCB0aGlzLmIgKiBzeGksIHRoaXMuYyAqIHN5aSwgdGhpcy5kICogc3lpLCAwKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEluaGVyaXQuTm9Sb3RhdGlvbk9yUmVmbGVjdGlvbjoge1xuXHRcdFx0XHRjb25zdCBzeGkgPSAxIC8gc3gsIHN5aSA9IDEgLyBzeTtcblx0XHRcdFx0cGEgKj0gc3hpO1xuXHRcdFx0XHRwYyAqPSBzeWk7XG5cdFx0XHRcdGNvbnN0IHdhID0gdGhpcy5hICogc3hpLCB3YiA9IHRoaXMuYiAqIHN4aSwgd2MgPSB0aGlzLmMgKiBzeWksIHdkID0gdGhpcy5kICogc3lpO1xuXHRcdFx0XHRjb25zdCBzID0gMSAvIChwYSAqIHBhICsgcGMgKiBwYyksIGRldCA9IDEgLyBNYXRoLmFicyhwYWQgKiBzeGkgKiBzeWkpO1xuXHRcdFx0XHR0aGlzLnNldDUoKHBhICogd2EgKyBwYyAqIHdjKSAqIHMsIChwYSAqIHdiICsgcGMgKiB3ZCkgKiBzLCAocGEgKiB3YyAtIHBjICogd2EpICogZGV0LCAocGEgKiB3ZCAtIHBjICogd2IpICogZGV0LFxuXHRcdFx0XHRcdE1hdGhVdGlscy5hdGFuMkRlZyhwYywgcGEpKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIEluaGVyaXQuTm9TY2FsZTpcblx0XHRcdGNhc2UgSW5oZXJpdC5Ob1NjYWxlT3JSZWZsZWN0aW9uOiB7XG5cdFx0XHRcdGNvbnN0IHN4aSA9IDEgLyBzeCwgc3lpID0gMSAvIHN5O1xuXHRcdFx0XHRjb25zdCB3YSA9IHRoaXMuYSAqIHN4aSwgd2IgPSB0aGlzLmIgKiBzeGksIHdjID0gdGhpcy5jICogc3lpLCB3ZCA9IHRoaXMuZCAqIHN5aTtcblx0XHRcdFx0bGV0IHR4ID0gcGQgKiB0aGlzLmEgLSBwYiAqIHRoaXMuYywgdHkgPSBwYSAqIHRoaXMuYyAtIHBjICogdGhpcy5hO1xuXHRcdFx0XHRpZiAocGFkIDwgMCkge1xuXHRcdFx0XHRcdHR4ID0gLXR4O1xuXHRcdFx0XHRcdHR5ID0gLXR5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCByID0gTWF0aFV0aWxzLmF0YW4yRGVnKHR5LCB0eCk7XG5cdFx0XHRcdHRoaXMucm90YXRpb24gPSByO1xuXHRcdFx0XHRyICo9IE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0XHRcdGNvbnN0IGNvcyA9IE1hdGguY29zKHIpLCBzaW4gPSBNYXRoLnNpbihyKTtcblx0XHRcdFx0bGV0IHphID0gKHBhICogY29zICsgcGIgKiBzaW4pICogc3hpO1xuXHRcdFx0XHRsZXQgemMgPSAocGMgKiBjb3MgKyBwZCAqIHNpbikgKiBzeWk7XG5cdFx0XHRcdGNvbnN0IHMgPSAxIC8gTWF0aC5zcXJ0KHphICogemEgKyB6YyAqIHpjKTtcblx0XHRcdFx0emEgKj0gcztcblx0XHRcdFx0emMgKj0gcztcblx0XHRcdFx0Y29uc3Qgc2kgPSB0aGlzLmluaGVyaXQgPT09IEluaGVyaXQuTm9TY2FsZSAmJiBwYWQgPCAwICE9PSAoc3ggPCAwICE9PSBzeSA8IDApID8gLTEgOiAxO1xuXHRcdFx0XHR0aGlzLnNldDQoemEgKiB3YSArIHpjICogd2MsIHphICogd2IgKyB6YyAqIHdkLCAoemEgKiB3YyAtIHpjICogd2EpICogc2ksICh6YSAqIHdkIC0gemMgKiB3YikgKiBzaSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzZXQ0IChyYTogbnVtYmVyLCByYjogbnVtYmVyLCByYzogbnVtYmVyLCByZDogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3QgeCA9IHJhICogcmEgKyByYyAqIHJjLCB5ID0gcmIgKiByYiArIHJkICogcmQ7XG5cdFx0aWYgKHggPiBNYXRoVXRpbHMuZXBzaWxvbjIpIHtcblx0XHRcdHRoaXMuc2hlYXJYID0gTWF0aFV0aWxzLmF0YW4yRGVnKHJjLCByYSk7XG5cdFx0XHR0aGlzLnNjYWxlWCA9IE1hdGguc3FydCh4KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zaGVhclggPSAwO1xuXHRcdFx0dGhpcy5zY2FsZVggPSAwO1xuXHRcdH1cblx0XHR0aGlzLnNjYWxlWSA9IE1hdGguc3FydCh5KTtcblx0XHRpZiAoeSA+IE1hdGhVdGlscy5lcHNpbG9uMikge1xuXHRcdFx0dGhpcy5zaGVhclkgPSBNYXRoVXRpbHMuYXRhbjJEZWcocmQsIHJiKTtcblx0XHRcdGlmIChyYSAqIHJkIC0gcmIgKiByYyA8IDApIHtcblx0XHRcdFx0dGhpcy5zY2FsZVkgPSAtdGhpcy5zY2FsZVk7XG5cdFx0XHRcdHRoaXMuc2hlYXJZICs9IDkwO1xuXHRcdFx0fSBlbHNlXG5cdFx0XHRcdHRoaXMuc2hlYXJZIC09IDkwO1xuXHRcdFx0aWYgKHRoaXMuc2hlYXJZID4gMTgwKVxuXHRcdFx0XHR0aGlzLnNoZWFyWSAtPSAzNjA7XG5cdFx0XHRlbHNlIGlmICh0aGlzLnNoZWFyWSA8PSAtMTgwKSAvL1xuXHRcdFx0XHR0aGlzLnNoZWFyWSArPSAzNjA7XG5cdFx0fSBlbHNlXG5cdFx0XHR0aGlzLnNoZWFyWSA9IDA7XG5cdH1cblxuXHRwcml2YXRlIHNldDUgKHJhOiBudW1iZXIsIHJiOiBudW1iZXIsIHJjOiBudW1iZXIsIHJkOiBudW1iZXIsIHJvOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnNoZWFyWCA9IDA7XG5cdFx0Y29uc3QgeCA9IHJhICogcmEgKyByYyAqIHJjLCB5ID0gcmIgKiByYiArIHJkICogcmQ7XG5cdFx0aWYgKHggPiBNYXRoVXRpbHMuZXBzaWxvbjIpIHtcblx0XHRcdGNvbnN0IHIgPSBNYXRoVXRpbHMuYXRhbjJEZWcocmMsIHJhKTtcblx0XHRcdHRoaXMucm90YXRpb24gPSByICsgcm87XG5cdFx0XHR0aGlzLnNjYWxlWCA9IE1hdGguc3FydCh4KTtcblx0XHRcdHRoaXMuc2NhbGVZID0gTWF0aC5zcXJ0KHkpO1xuXHRcdFx0aWYgKHkgPiBNYXRoVXRpbHMuZXBzaWxvbjIpIHtcblx0XHRcdFx0dGhpcy5zaGVhclkgPSBNYXRoVXRpbHMuYXRhbjJEZWcocmQsIHJiKTtcblx0XHRcdFx0aWYgKHJhICogcmQgLSByYiAqIHJjIDwgMCkge1xuXHRcdFx0XHRcdHRoaXMuc2NhbGVZID0gLXRoaXMuc2NhbGVZO1xuXHRcdFx0XHRcdHRoaXMuc2hlYXJZICs9IDkwIC0gcjtcblx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0dGhpcy5zaGVhclkgLT0gOTAgKyByO1xuXHRcdFx0XHRpZiAodGhpcy5zaGVhclkgPiAxODApXG5cdFx0XHRcdFx0dGhpcy5zaGVhclkgLT0gMzYwO1xuXHRcdFx0XHRlbHNlIGlmICh0aGlzLnNoZWFyWSA8PSAtMTgwKSAvL1xuXHRcdFx0XHRcdHRoaXMuc2hlYXJZICs9IDM2MDtcblx0XHRcdH0gZWxzZVxuXHRcdFx0XHR0aGlzLnNoZWFyWSA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2NhbGVYID0gMDtcblx0XHRcdHRoaXMuc2NhbGVZID0gTWF0aC5zcXJ0KHkpO1xuXHRcdFx0dGhpcy5zaGVhclkgPSAwO1xuXHRcdFx0dGhpcy5yb3RhdGlvbiA9IHkgPiBNYXRoVXRpbHMuZXBzaWxvbjIgPyBNYXRoVXRpbHMuYXRhbjJEZWcocmQsIHJiKSAtIDkwICsgcm8gOiBybztcblx0XHR9XG5cdH1cblxuXHQvKiogSWYgdGhlIHdvcmxkIHRyYW5zZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBieSBjb25zdHJhaW50cyBhbmQgdGhlIGxvY2FsIHRyYW5zZm9ybSBubyBsb25nZXIgbWF0Y2hlcyxcblx0ICoge0BsaW5rIHVwZGF0ZUxvY2FsVHJhbnNmb3JtfSBpcyBjYWxsZWQuIENhbGwgdGhpcyBhZnRlciB7QGxpbmsgU2tlbGV0b24udXBkYXRlV29ybGRUcmFuc2Zvcm19IGJlZm9yZVxuXHQgKiB1c2luZyB0aGUgYXBwbGllZCBsb2NhbCB0cmFuc2Zvcm0uICovXG5cdHB1YmxpYyB2YWxpZGF0ZUxvY2FsVHJhbnNmb3JtIChza2VsZXRvbjogU2tlbGV0b24pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sb2NhbCA9PT0gc2tlbGV0b24uX3VwZGF0ZSkgdGhpcy51cGRhdGVMb2NhbFRyYW5zZm9ybShza2VsZXRvbik7XG5cdH1cblxuXHRtb2RpZnlMb2NhbCAoc2tlbGV0b246IFNrZWxldG9uKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubG9jYWwgPT09IHNrZWxldG9uLl91cGRhdGUpIHRoaXMudXBkYXRlTG9jYWxUcmFuc2Zvcm0oc2tlbGV0b24pO1xuXHRcdHRoaXMud29ybGQgPSAwO1xuXHRcdHRoaXMucmVzZXRXb3JsZChza2VsZXRvbiwgc2tlbGV0b24uX3VwZGF0ZSk7XG5cdH1cblxuXHRtb2RpZnlXb3JsZCAoc2tlbGV0b246IFNrZWxldG9uKTogdm9pZCB7XG5cdFx0Y29uc3QgdXBkYXRlID0gc2tlbGV0b24uX3VwZGF0ZTtcblx0XHR0aGlzLmxvY2FsID0gdXBkYXRlO1xuXHRcdHRoaXMud29ybGQgPSB1cGRhdGU7XG5cdFx0dGhpcy5yZXNldFdvcmxkKHNrZWxldG9uLCB1cGRhdGUpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNldFdvcmxkIChza2VsZXRvbjogU2tlbGV0b24sIHVwZGF0ZTogbnVtYmVyKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmJvbmUuY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0uYXBwbGllZFBvc2U7XG5cdFx0XHRpZiAoY2hpbGQud29ybGQgPT09IHVwZGF0ZSkge1xuXHRcdFx0XHRpZiAoY2hpbGQubG9jYWwgPT09IHVwZGF0ZSkgY2hpbGQudXBkYXRlTG9jYWxUcmFuc2Zvcm0oc2tlbGV0b24pO1xuXHRcdFx0XHRjaGlsZC53b3JsZCA9IDA7XG5cdFx0XHRcdGNoaWxkLnJlc2V0V29ybGQoc2tlbGV0b24sIHVwZGF0ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIFRoZSB3b3JsZCByb3RhdGlvbiBmb3IgdGhlIFggYXhpcywgY2FsY3VsYXRlZCB1c2luZyB7QGxpbmsgYX0gYW5kIHtAbGluayBjfS4gVGhpcyBpcyB0aGUgZGlyZWN0aW9uIHRoZSBib25lIGlzXG5cdCAqIHBvaW50aW5nLiAqL1xuXHRwdWJsaWMgZ2V0V29ybGRSb3RhdGlvblggKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIE1hdGhVdGlscy5hdGFuMkRlZyh0aGlzLmMsIHRoaXMuYSk7XG5cdH1cblxuXHQvKiogVGhlIHdvcmxkIHJvdGF0aW9uIGZvciB0aGUgWSBheGlzLCBjYWxjdWxhdGVkIHVzaW5nIHtAbGluayBifSBhbmQge0BsaW5rIGR9LiAqL1xuXHRwdWJsaWMgZ2V0V29ybGRSb3RhdGlvblkgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIE1hdGhVdGlscy5hdGFuMkRlZyh0aGlzLmQsIHRoaXMuYik7XG5cdH1cblxuXHQvKiogVGhlIG1hZ25pdHVkZSAoYWx3YXlzIHBvc2l0aXZlKSBvZiB0aGUgd29ybGQgc2NhbGUgWCwgY2FsY3VsYXRlZCB1c2luZyB7QGxpbmsgYX0gYW5kIHtAbGluayBjfS4gKi9cblx0cHVibGljIGdldFdvcmxkU2NhbGVYICgpOiBudW1iZXIge1xuXHRcdHJldHVybiBNYXRoLnNxcnQodGhpcy5hICogdGhpcy5hICsgdGhpcy5jICogdGhpcy5jKTtcblx0fVxuXG5cdC8qKiBUaGUgbWFnbml0dWRlIChhbHdheXMgcG9zaXRpdmUpIG9mIHRoZSB3b3JsZCBzY2FsZSBZLCBjYWxjdWxhdGVkIHVzaW5nIHtAbGluayBifSBhbmQge0BsaW5rIGR9LiAqL1xuXHRwdWJsaWMgZ2V0V29ybGRTY2FsZVkgKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIE1hdGguc3FydCh0aGlzLmIgKiB0aGlzLmIgKyB0aGlzLmQgKiB0aGlzLmQpO1xuXHR9XG5cblx0Ly8gcHVibGljIE1hdHJpeDMgZ2V0V29ybGRUcmFuc2Zvcm0gKE1hdHJpeDMgd29ybGRUcmFuc2Zvcm0pIHtcblx0Ly8gXHRpZiAod29ybGRUcmFuc2Zvcm0gPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIndvcmxkVHJhbnNmb3JtIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0Ly8gXHRmbG9hdFtdIHZhbCA9IHdvcmxkVHJhbnNmb3JtLnZhbDtcblx0Ly8gXHR2YWxbTTAwXSA9IGE7XG5cdC8vIFx0dmFsW00wMV0gPSBiO1xuXHQvLyBcdHZhbFtNMTBdID0gYztcblx0Ly8gXHR2YWxbTTExXSA9IGQ7XG5cdC8vIFx0dmFsW00wMl0gPSB3b3JsZFg7XG5cdC8vIFx0dmFsW00xMl0gPSB3b3JsZFk7XG5cdC8vIFx0dmFsW00yMF0gPSAwO1xuXHQvLyBcdHZhbFtNMjFdID0gMDtcblx0Ly8gXHR2YWxbTTIyXSA9IDE7XG5cdC8vIFx0cmV0dXJuIHdvcmxkVHJhbnNmb3JtO1xuXHQvLyB9XG5cblx0LyoqIFRyYW5zZm9ybXMgYSBwb2ludCBmcm9tIHdvcmxkIGNvb3JkaW5hdGVzIHRvIHRoZSBib25lJ3MgbG9jYWwgY29vcmRpbmF0ZXMuICovXG5cdHB1YmxpYyB3b3JsZFRvTG9jYWwgKHdvcmxkOiBWZWN0b3IyKTogVmVjdG9yMiB7XG5cdFx0aWYgKHdvcmxkID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIndvcmxkIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBkZXQgPSB0aGlzLmEgKiB0aGlzLmQgLSB0aGlzLmIgKiB0aGlzLmM7XG5cdFx0Y29uc3QgeCA9IHdvcmxkLnggLSB0aGlzLndvcmxkWCwgeSA9IHdvcmxkLnkgLSB0aGlzLndvcmxkWTtcblx0XHR3b3JsZC54ID0gKHggKiB0aGlzLmQgLSB5ICogdGhpcy5iKSAvIGRldDtcblx0XHR3b3JsZC55ID0gKHkgKiB0aGlzLmEgLSB4ICogdGhpcy5jKSAvIGRldDtcblx0XHRyZXR1cm4gd29ybGQ7XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyBhIHBvaW50IGZyb20gdGhlIGJvbmUncyBsb2NhbCBjb29yZGluYXRlcyB0byB3b3JsZCBjb29yZGluYXRlcy4gKi9cblx0cHVibGljIGxvY2FsVG9Xb3JsZCAobG9jYWw6IFZlY3RvcjIpOiBWZWN0b3IyIHtcblx0XHRpZiAobG9jYWwgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwibG9jYWwgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHggPSBsb2NhbC54LCB5ID0gbG9jYWwueTtcblx0XHRsb2NhbC54ID0geCAqIHRoaXMuYSArIHkgKiB0aGlzLmIgKyB0aGlzLndvcmxkWDtcblx0XHRsb2NhbC55ID0geCAqIHRoaXMuYyArIHkgKiB0aGlzLmQgKyB0aGlzLndvcmxkWTtcblx0XHRyZXR1cm4gbG9jYWw7XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyBhIHBvaW50IGZyb20gd29ybGQgY29vcmRpbmF0ZXMgdG8gdGhlIHBhcmVudCBib25lJ3MgbG9jYWwgY29vcmRpbmF0ZXMuICovXG5cdHB1YmxpYyB3b3JsZFRvUGFyZW50ICh3b3JsZDogVmVjdG9yMik6IFZlY3RvcjIge1xuXHRcdGlmICh3b3JsZCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JsZCBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0cmV0dXJuIHRoaXMuYm9uZS5wYXJlbnQgPT0gbnVsbCA/IHdvcmxkIDogdGhpcy5ib25lLnBhcmVudC5hcHBsaWVkUG9zZS53b3JsZFRvTG9jYWwod29ybGQpO1xuXHR9XG5cblx0LyoqIFRyYW5zZm9ybXMgYSBwb2ludCBmcm9tIHRoZSBwYXJlbnQgYm9uZSdzIGNvb3JkaW5hdGVzIHRvIHdvcmxkIGNvb3JkaW5hdGVzLiAqL1xuXHRwdWJsaWMgcGFyZW50VG9Xb3JsZCAod29ybGQ6IFZlY3RvcjIpOiBWZWN0b3IyIHtcblx0XHRpZiAod29ybGQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwid29ybGQgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdHJldHVybiB0aGlzLmJvbmUucGFyZW50ID09IG51bGwgPyB3b3JsZCA6IHRoaXMuYm9uZS5wYXJlbnQuYXBwbGllZFBvc2UubG9jYWxUb1dvcmxkKHdvcmxkKTtcblx0fVxuXG5cdC8qKiBUcmFuc2Zvcm1zIGEgd29ybGQgcm90YXRpb24gdG8gYSBsb2NhbCByb3RhdGlvbi4gKi9cblx0cHVibGljIHdvcmxkVG9Mb2NhbFJvdGF0aW9uICh3b3JsZFJvdGF0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHdvcmxkUm90YXRpb24gKj0gTWF0aFV0aWxzLmRlZ1JhZDtcblx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbih3b3JsZFJvdGF0aW9uKSwgY29zID0gTWF0aC5jb3Mod29ybGRSb3RhdGlvbik7XG5cdFx0cmV0dXJuIE1hdGhVdGlscy5hdGFuMkRlZyh0aGlzLmEgKiBzaW4gLSB0aGlzLmMgKiBjb3MsIHRoaXMuZCAqIGNvcyAtIHRoaXMuYiAqIHNpbikgKyB0aGlzLnJvdGF0aW9uIC0gdGhpcy5zaGVhclg7XG5cdH1cblxuXHQvKiogVHJhbnNmb3JtcyBhIGxvY2FsIHJvdGF0aW9uIHRvIGEgd29ybGQgcm90YXRpb24uICovXG5cdGxvY2FsVG9Xb3JsZFJvdGF0aW9uIChsb2NhbFJvdGF0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGxvY2FsUm90YXRpb24gPSAobG9jYWxSb3RhdGlvbiAtIHRoaXMucm90YXRpb24gLSB0aGlzLnNoZWFyWCkgKiBNYXRoVXRpbHMuZGVnUmFkO1xuXHRcdGNvbnN0IHNpbiA9IE1hdGguc2luKGxvY2FsUm90YXRpb24pLCBjb3MgPSBNYXRoLmNvcyhsb2NhbFJvdGF0aW9uKTtcblx0XHRyZXR1cm4gTWF0aFV0aWxzLmF0YW4yRGVnKGNvcyAqIHRoaXMuYyArIHNpbiAqIHRoaXMuZCwgY29zICogdGhpcy5hICsgc2luICogdGhpcy5iKTtcblx0fVxuXG5cdC8qKiBSb3RhdGVzIHRoZSB3b3JsZCB0cmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBhbW91bnQuICovXG5cdHJvdGF0ZVdvcmxkIChkZWdyZWVzOiBudW1iZXIpIHtcblx0XHRkZWdyZWVzICo9IE1hdGhVdGlscy5kZWdSYWQ7XG5cdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oZGVncmVlcyksIGNvcyA9IE1hdGguY29zKGRlZ3JlZXMpO1xuXHRcdGNvbnN0IHJhID0gdGhpcy5hLCByYiA9IHRoaXMuYjtcblx0XHR0aGlzLmEgPSBjb3MgKiByYSAtIHNpbiAqIHRoaXMuYztcblx0XHR0aGlzLmIgPSBjb3MgKiByYiAtIHNpbiAqIHRoaXMuZDtcblx0XHR0aGlzLmMgPSBzaW4gKiByYSArIGNvcyAqIHRoaXMuYztcblx0XHR0aGlzLmQgPSBzaW4gKiByYiArIGNvcyAqIHRoaXMuZDtcblx0fVxufVxuIl19
|