Files
SpineParticlesWeb/vendor/spine/spine-core-4.3/dist/SkeletonJson.js
T
2026-09-02 13:53:12 +08:00

1393 lines
247 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 { AlphaTimeline, Animation, AttachmentTimeline, DeformTimeline, DrawOrderFolderTimeline, DrawOrderTimeline, EventTimeline, IkConstraintTimeline, InheritTimeline, PathConstraintMixTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PhysicsConstraintDampingTimeline, PhysicsConstraintGravityTimeline, PhysicsConstraintInertiaTimeline, PhysicsConstraintMassTimeline, PhysicsConstraintMixTimeline, PhysicsConstraintResetTimeline, PhysicsConstraintStrengthTimeline, PhysicsConstraintWindTimeline, RGB2Timeline, RGBA2Timeline, RGBATimeline, RGBTimeline, RotateTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, SequenceTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, SliderMixTimeline, SliderTimeline, TransformConstraintTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline } from "./Animation.js";
import { Sequence, SequenceMode } from "./attachments/Sequence.js";
import { BoneData, Inherit } from "./BoneData.js";
import { ScaleYMode } from "./ConstraintData.js";
import { Event } from "./Event.js";
import { EventData } from "./EventData.js";
import { IkConstraintData } from "./IkConstraintData.js";
import { PathConstraintData, PositionMode, RotateMode, SpacingMode } from "./PathConstraintData.js";
import { PhysicsConstraintData } from "./PhysicsConstraintData.js";
import { SkeletonData } from "./SkeletonData.js";
import { Skin } from "./Skin.js";
import { SliderData } from "./SliderData.js";
import { BlendMode, SlotData } from "./SlotData.js";
import { FromRotate, FromScaleX, FromScaleY, FromShearY, FromX, FromY, ToRotate, ToScaleX, ToScaleY, ToShearY, ToX, ToY, TransformConstraintData } from "./TransformConstraintData.js";
import { Color, Utils } from "./Utils.js";
/** Loads skeleton data in the Spine JSON format.
*
* See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
* [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
* Runtimes Guide. */
export class SkeletonJson {
attachmentLoader;
/** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
* runtime than were used in Spine.
*
* See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
scale = 1;
linkedMeshes = [];
constructor(attachmentLoader) {
this.attachmentLoader = attachmentLoader;
}
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
readSkeletonData(json) {
const scale = this.scale;
const skeletonData = new SkeletonData();
const root = typeof (json) === "string" ? JSON.parse(json) : json;
// Skeleton
const skeletonMap = root.skeleton;
if (skeletonMap) {
skeletonData.hash = skeletonMap.hash;
skeletonData.version = skeletonMap.spine;
skeletonData.x = skeletonMap.x;
skeletonData.y = skeletonMap.y;
skeletonData.width = skeletonMap.width;
skeletonData.height = skeletonMap.height;
skeletonData.referenceScale = getValue(skeletonMap, "referenceScale", 100) * scale;
skeletonData.fps = skeletonMap.fps;
skeletonData.imagesPath = skeletonMap.images ?? null;
skeletonData.audioPath = skeletonMap.audio ?? null;
}
// Bones
if (root.bones) {
for (let i = 0; i < root.bones.length; i++) {
const boneMap = root.bones[i];
let parent = null;
const parentName = getValue(boneMap, "parent", null);
if (parentName)
parent = skeletonData.findBone(parentName);
const data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
data.length = getValue(boneMap, "length", 0) * scale;
const setup = data.setupPose;
setup.x = getValue(boneMap, "x", 0) * scale;
setup.y = getValue(boneMap, "y", 0) * scale;
setup.rotation = getValue(boneMap, "rotation", 0);
setup.scaleX = getValue(boneMap, "scaleX", 1);
setup.scaleY = getValue(boneMap, "scaleY", 1);
setup.shearX = getValue(boneMap, "shearX", 0);
setup.shearY = getValue(boneMap, "shearY", 0);
setup.inherit = Utils.enumValue(Inherit, getValue(boneMap, "inherit", "Normal"));
data.skinRequired = getValue(boneMap, "skin", false);
const color = getValue(boneMap, "color", null);
if (color)
data.color.setFromString(color);
data.icon = getValue(boneMap, "icon", undefined);
data.iconSize = getValue(boneMap, "iconSize", 1);
data.iconRotation = getValue(boneMap, "iconRotation", 0);
skeletonData.bones.push(data);
}
}
// Slots.
if (root.slots) {
for (let i = 0; i < root.slots.length; i++) {
const slotMap = root.slots[i];
const slotName = slotMap.name;
const boneData = skeletonData.findBone(slotMap.bone);
if (!boneData)
throw new Error(`Couldn't find bone ${slotMap.bone} for slot ${slotName}`);
const data = new SlotData(skeletonData.slots.length, slotName, boneData);
const color = getValue(slotMap, "color", null);
if (color)
data.setupPose.color.setFromString(color);
const dark = getValue(slotMap, "dark", null);
if (dark)
data.setupPose.darkColor = Color.fromString(dark);
data.attachmentName = getValue(slotMap, "attachment", null);
data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
data.visible = getValue(slotMap, "visible", true);
skeletonData.slots.push(data);
}
}
// Constraints.
if (root.constraints) {
for (const constraintMap of root.constraints) {
const name = constraintMap.name;
const skinRequired = getValue(constraintMap, "skin", false);
switch (getValue(constraintMap, "type", false)) {
case "ik": {
const data = new IkConstraintData(name);
data.skinRequired = skinRequired;
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
const bone = skeletonData.findBone(constraintMap.bones[ii]);
if (!bone)
throw new Error(`Couldn't find bone ${constraintMap.bones[ii]} for IK constraint ${name}.`);
data.bones.push(bone);
}
const targetName = constraintMap.target;
const target = skeletonData.findBone(targetName);
if (!target)
throw new Error(`Couldn't find target bone ${targetName} for IK constraint ${name}.`);
data.target = target;
const scaleY = getValue(constraintMap, "scaleY", null);
if (scaleY != null)
data.scaleYMode = Utils.enumValue(ScaleYMode, scaleY);
const setup = data.setupPose;
setup.mix = getValue(constraintMap, "mix", 1);
setup.softness = getValue(constraintMap, "softness", 0) * scale;
setup.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
setup.compress = getValue(constraintMap, "compress", false);
setup.stretch = getValue(constraintMap, "stretch", false);
skeletonData.constraints.push(data);
break;
}
case "transform": {
const data = new TransformConstraintData(name);
data.skinRequired = skinRequired;
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
const boneName = constraintMap.bones[ii];
const bone = skeletonData.findBone(boneName);
if (!bone)
throw new Error(`Couldn't find bone ${boneName} for transform constraint ${constraintMap.name}.`);
data.bones.push(bone);
}
const sourceName = constraintMap.source;
const source = skeletonData.findBone(sourceName);
if (!source)
throw new Error(`Couldn't find source bone ${sourceName} for transform constraint ${constraintMap.name}.`);
data.source = source;
data.localSource = getValue(constraintMap, "localSource", false);
data.localTarget = getValue(constraintMap, "localTarget", false);
data.additive = getValue(constraintMap, "additive", false);
data.clamp = getValue(constraintMap, "clamp", false);
let rotate = false, x = false, y = false, scaleX = false, scaleY = false, shearY = false;
const fromEntries = Object.entries(getValue(constraintMap, "properties", {}));
for (const [name, fromEntry] of fromEntries) {
const from = this.fromProperty(name);
const fromScale = this.propertyScale(name, scale);
from.offset = getValue(fromEntry, "offset", 0) * fromScale;
const toEntries = Object.entries(getValue(fromEntry, "to", {}));
for (const [name, toEntry] of toEntries) {
let toScale = 1;
let to;
switch (name) {
case "rotate": {
rotate = true;
to = new ToRotate();
break;
}
case "x": {
x = true;
to = new ToX();
toScale = scale;
break;
}
case "y": {
y = true;
to = new ToY();
toScale = scale;
break;
}
case "scaleX": {
scaleX = true;
to = new ToScaleX();
break;
}
case "scaleY": {
scaleY = true;
to = new ToScaleY();
break;
}
case "shearY": {
shearY = true;
to = new ToShearY();
break;
}
default: throw new Error(`Invalid transform constraint to property: ${name}`);
}
to.offset = getValue(toEntry, "offset", 0) * toScale;
to.max = getValue(toEntry, "max", 1) * toScale;
to.scale = getValue(toEntry, "scale", 1) * toScale / fromScale;
from.to.push(to);
}
if (from.to.length > 0)
data.properties.push(from);
}
data.offsets[TransformConstraintData.ROTATION] = getValue(constraintMap, "rotation", 0);
data.offsets[TransformConstraintData.X] = getValue(constraintMap, "x", 0) * scale;
data.offsets[TransformConstraintData.Y] = getValue(constraintMap, "y", 0) * scale;
data.offsets[TransformConstraintData.SCALEX] = getValue(constraintMap, "scaleX", 0);
data.offsets[TransformConstraintData.SCALEY] = getValue(constraintMap, "scaleY", 0);
data.offsets[TransformConstraintData.SHEARY] = getValue(constraintMap, "shearY", 0);
const setup = data.setupPose;
if (rotate)
setup.mixRotate = getValue(constraintMap, "mixRotate", 1);
if (x)
setup.mixX = getValue(constraintMap, "mixX", 1);
if (y)
setup.mixY = getValue(constraintMap, "mixY", setup.mixX);
if (scaleX)
setup.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
if (scaleY)
setup.mixScaleY = getValue(constraintMap, "mixScaleY", setup.mixScaleX);
if (shearY)
setup.mixShearY = getValue(constraintMap, "mixShearY", 1);
skeletonData.constraints.push(data);
break;
}
case "path": {
const data = new PathConstraintData(name);
data.skinRequired = skinRequired;
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
const boneName = constraintMap.bones[ii];
const bone = skeletonData.findBone(boneName);
if (!bone)
throw new Error(`Couldn't find bone ${boneName} for path constraint ${constraintMap.name}.`);
data.bones.push(bone);
}
const slotName = constraintMap.slot;
const slot = skeletonData.findSlot(slotName);
if (!slot)
throw new Error(`Couldn't find slot ${slotName} for path constraint ${constraintMap.name}.`);
data.slot = slot;
data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
data.offsetRotation = getValue(constraintMap, "rotation", 0);
const setup = data.setupPose;
setup.position = getValue(constraintMap, "position", 0);
if (data.positionMode === PositionMode.Fixed)
setup.position *= scale;
setup.spacing = getValue(constraintMap, "spacing", 0);
if (data.spacingMode === SpacingMode.Length || data.spacingMode === SpacingMode.Fixed)
setup.spacing *= scale;
setup.mixRotate = getValue(constraintMap, "mixRotate", 1);
setup.mixX = getValue(constraintMap, "mixX", 1);
setup.mixY = getValue(constraintMap, "mixY", setup.mixX);
skeletonData.constraints.push(data);
break;
}
case "physics": {
const data = new PhysicsConstraintData(name);
data.skinRequired = skinRequired;
const boneName = constraintMap.bone;
const bone = skeletonData.findBone(boneName);
if (bone == null)
throw new Error(`Physics bone not found: ${boneName}`);
data.bone = bone;
data.x = getValue(constraintMap, "x", 0);
data.y = getValue(constraintMap, "y", 0);
data.rotate = getValue(constraintMap, "rotate", 0);
data.scaleX = getValue(constraintMap, "scaleX", 0);
const scaleY = getValue(constraintMap, "scaleY", null);
if (scaleY != null)
data.scaleYMode = Utils.enumValue(ScaleYMode, scaleY);
data.shearX = getValue(constraintMap, "shearX", 0);
data.limit = getValue(constraintMap, "limit", 5000) * scale;
data.step = 1 / getValue(constraintMap, "fps", 60);
const setup = data.setupPose;
setup.inertia = getValue(constraintMap, "inertia", 0.5);
setup.strength = getValue(constraintMap, "strength", 100);
setup.damping = getValue(constraintMap, "damping", 0.85);
setup.massInverse = 1 / getValue(constraintMap, "mass", 1);
setup.wind = getValue(constraintMap, "wind", 0);
setup.gravity = getValue(constraintMap, "gravity", 0);
setup.mix = getValue(constraintMap, "mix", 1);
data.inertiaGlobal = getValue(constraintMap, "inertiaGlobal", false);
data.strengthGlobal = getValue(constraintMap, "strengthGlobal", false);
data.dampingGlobal = getValue(constraintMap, "dampingGlobal", false);
data.massGlobal = getValue(constraintMap, "massGlobal", false);
data.windGlobal = getValue(constraintMap, "windGlobal", false);
data.gravityGlobal = getValue(constraintMap, "gravityGlobal", false);
data.mixGlobal = getValue(constraintMap, "mixGlobal", false);
skeletonData.constraints.push(data);
break;
}
case "slider": {
const data = new SliderData(name);
data.skinRequired = skinRequired;
data.additive = getValue(constraintMap, "additive", false);
data.loop = getValue(constraintMap, "loop", false);
data.setupPose.mix = getValue(constraintMap, "mix", 1);
const boneName = constraintMap.bone;
if (boneName) {
data.bone = skeletonData.findBone(boneName);
if (!data.bone)
throw new Error(`Slider bone not found: ${boneName}`);
const property = constraintMap.property;
data.property = this.fromProperty(property);
const propertyScale = this.propertyScale(property, scale);
data.property.offset = getValue(constraintMap, "from", 0) * propertyScale;
data.offset = getValue(constraintMap, "to", 0);
data.scale = getValue(constraintMap, "scale", 1) / propertyScale;
data.max = getValue(constraintMap, "max", 0);
data.local = getValue(constraintMap, "local", false);
}
else
data.setupPose.time = getValue(constraintMap, "time", 0);
skeletonData.constraints.push(data);
break;
}
}
}
}
// Skins.
if (root.skins) {
for (let i = 0; i < root.skins.length; i++) {
const skinMap = root.skins[i];
const skin = new Skin(skinMap.name);
if (skinMap.bones) {
for (let ii = 0; ii < skinMap.bones.length; ii++) {
const boneName = skinMap.bones[ii];
const bone = skeletonData.findBone(boneName);
if (!bone)
throw new Error(`Couldn't find bone ${boneName} for skin ${skinMap.name}.`);
skin.bones.push(bone);
}
}
if (skinMap.ik) {
for (let ii = 0; ii < skinMap.ik.length; ii++) {
const constraintName = skinMap.ik[ii];
const constraint = skeletonData.findConstraint(constraintName, IkConstraintData);
if (!constraint)
throw new Error(`Couldn't find IK constraint ${constraintName} for skin ${skinMap.name}.`);
skin.constraints.push(constraint);
}
}
if (skinMap.transform) {
for (let ii = 0; ii < skinMap.transform.length; ii++) {
const constraintName = skinMap.transform[ii];
const constraint = skeletonData.findConstraint(constraintName, TransformConstraintData);
if (!constraint)
throw new Error(`Couldn't find transform constraint ${constraintName} for skin ${skinMap.name}.`);
skin.constraints.push(constraint);
}
}
if (skinMap.path) {
for (let ii = 0; ii < skinMap.path.length; ii++) {
const constraintName = skinMap.path[ii];
const constraint = skeletonData.findConstraint(constraintName, PathConstraintData);
if (!constraint)
throw new Error(`Couldn't find path constraint ${constraintName} for skin ${skinMap.name}.`);
skin.constraints.push(constraint);
}
}
if (skinMap.physics) {
for (let ii = 0; ii < skinMap.physics.length; ii++) {
const constraintName = skinMap.physics[ii];
const constraint = skeletonData.findConstraint(constraintName, PhysicsConstraintData);
if (!constraint)
throw new Error(`Couldn't find physics constraint ${constraintName} for skin ${skinMap.name}.`);
skin.constraints.push(constraint);
}
}
if (skinMap.slider) {
for (let ii = 0; ii < skinMap.slider.length; ii++) {
const constraintName = skinMap.slider[ii];
const constraint = skeletonData.findConstraint(constraintName, SliderData);
if (!constraint)
throw new Error(`Couldn't find slider constraint ${constraintName} for skin ${skinMap.name}.`);
skin.constraints.push(constraint);
}
}
for (const slotName in skinMap.attachments) {
const slot = skeletonData.findSlot(slotName);
if (!slot)
throw new Error(`Couldn't find skin slot ${slotName} for skin ${skinMap.name}.`);
const slotMap = skinMap.attachments[slotName];
for (const entryName in slotMap) {
const attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
if (attachment)
skin.setAttachment(slot.index, entryName, attachment);
}
}
skeletonData.skins.push(skin);
if (skin.name === "default")
skeletonData.defaultSkin = skin;
}
}
// Linked meshes.
for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
const linkedMesh = this.linkedMeshes[i];
const skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
if (!skin)
throw new Error(`Skin not found: ${linkedMesh.skin}`);
const source = skin.getAttachment(linkedMesh.sourceIndex, linkedMesh.source);
if (!source)
throw new Error(`Source mesh not found: ${linkedMesh.source}`);
linkedMesh.mesh.timelineAttachment = linkedMesh.inheritTimelines ? source : linkedMesh.mesh;
linkedMesh.mesh.setSourceMesh(source);
linkedMesh.mesh.updateSequence();
// biome-ignore lint/suspicious/noConfusingLabels: reference runtime
outer: if (linkedMesh.inheritTimelines && linkedMesh.slotIndex !== linkedMesh.sourceIndex) {
const slots = source.timelineSlots;
for (const existing of slots)
if (existing === linkedMesh.slotIndex)
break outer;
const newSlots = [...slots];
newSlots[slots.length] = linkedMesh.slotIndex;
source.timelineSlots = newSlots;
}
}
this.linkedMeshes.length = 0;
// Events.
if (root.events) {
for (const eventName in root.events) {
const eventMap = root.events[eventName];
const data = new EventData(eventName);
const setup = data.setupPose;
setup.intValue = getValue(eventMap, "int", 0);
setup.floatValue = getValue(eventMap, "float", 0);
setup.stringValue = getValue(eventMap, "string", "");
data._audioPath = getValue(eventMap, "audio", null);
if (data.audioPath) {
setup.volume = getValue(eventMap, "volume", setup.volume);
setup.balance = getValue(eventMap, "balance", setup.balance);
}
skeletonData.events.push(data);
}
}
// Animations.
if (root.animations) {
for (const animationName in root.animations) {
const animationMap = root.animations[animationName];
this.readAnimation(animationMap, animationName, skeletonData);
}
}
// Slider animations.
if (root.constraints) {
for (const animationName in root.constraints) {
const animationMap = root.constraints[animationName];
if (animationMap.type === "slider") {
const data = skeletonData.findConstraint(animationMap.name, SliderData);
const animationName = animationMap.animation;
const animation = skeletonData.findAnimation(animationName);
if (!animation)
throw new Error(`Slider animation not found: ${animationName}`);
// biome-ignore lint/style/noNonNullAssertion: reference runtime
data.animation = animation;
}
}
}
return skeletonData;
}
fromProperty(type) {
let from;
switch (type) {
case "rotate":
from = new FromRotate();
break;
case "x":
from = new FromX();
break;
case "y":
from = new FromY();
break;
case "scaleX":
from = new FromScaleX();
break;
case "scaleY":
from = new FromScaleY();
break;
case "shearY":
from = new FromShearY();
break;
default: throw new Error(`Invalid transform constraint from property: ${type}`);
}
return from;
}
propertyScale(type, scale) {
switch (type) {
case "x":
case "y": return scale;
default: return 1;
}
}
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
readAttachment(map, skin, slotIndex, placeholder, skeletonData) {
const scale = this.scale;
const name = getValue(map, "name", placeholder);
switch (getValue(map, "type", "region")) {
case "region": {
const path = getValue(map, "path", name);
const sequence = this.readSequence(getValue(map, "sequence", null));
const region = this.attachmentLoader.newRegionAttachment(skin, placeholder, name, path, sequence);
if (!region)
return null;
region.path = path;
region.x = getValue(map, "x", 0) * scale;
region.y = getValue(map, "y", 0) * scale;
region.scaleX = getValue(map, "scaleX", 1);
region.scaleY = getValue(map, "scaleY", 1);
region.rotation = getValue(map, "rotation", 0);
region.width = map.width * scale;
region.height = map.height * scale;
const color = getValue(map, "color", null);
if (color)
region.color.setFromString(color);
region.updateSequence();
return region;
}
case "boundingbox": {
const box = this.attachmentLoader.newBoundingBoxAttachment(skin, placeholder, name);
if (!box)
return null;
this.readVertices(map, box, map.vertexCount << 1);
const color = getValue(map, "color", null);
if (color)
box.color.setFromString(color);
return box;
}
case "mesh":
case "linkedmesh": {
const path = getValue(map, "path", name);
const sequence = this.readSequence(getValue(map, "sequence", null));
const mesh = this.attachmentLoader.newMeshAttachment(skin, placeholder, name, path, sequence);
if (!mesh)
return null;
mesh.path = path;
const color = getValue(map, "color", null);
if (color)
mesh.color.setFromString(color);
mesh.width = getValue(map, "width", 0) * scale;
mesh.height = getValue(map, "height", 0) * scale;
const source = getValue(map, "source", null);
if (source) {
let sourceIndex = slotIndex;
const slot = getValue(map, "slot", null);
if (slot) {
const sourceSlot = skeletonData.findSlot(slot);
if (!sourceSlot)
throw new Error(`Source mesh slot not found: ${slot}`);
sourceIndex = sourceSlot.index;
}
this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, sourceIndex, source, getValue(map, "timelines", true)));
return mesh;
}
const uvs = map.uvs;
this.readVertices(map, mesh, uvs.length);
mesh.triangles = map.triangles;
mesh.regionUVs = uvs;
mesh.edges = getValue(map, "edges", null);
mesh.hullLength = getValue(map, "hull", 0) * 2;
mesh.updateSequence();
return mesh;
}
case "path": {
const path = this.attachmentLoader.newPathAttachment(skin, placeholder, name);
if (!path)
return null;
path.closed = getValue(map, "closed", false);
path.constantSpeed = getValue(map, "constantSpeed", true);
const vertexCount = map.vertexCount;
this.readVertices(map, path, vertexCount << 1);
const lengths = Utils.newArray(vertexCount / 3, 0);
for (let i = 0; i < map.lengths.length; i++)
lengths[i] = map.lengths[i] * scale;
path.lengths = lengths;
const color = getValue(map, "color", null);
if (color)
path.color.setFromString(color);
return path;
}
case "point": {
const point = this.attachmentLoader.newPointAttachment(skin, placeholder, name);
if (!point)
return null;
point.x = getValue(map, "x", 0) * scale;
point.y = getValue(map, "y", 0) * scale;
point.rotation = getValue(map, "rotation", 0);
const color = getValue(map, "color", null);
if (color)
point.color.setFromString(color);
return point;
}
case "clipping": {
const clip = this.attachmentLoader.newClippingAttachment(skin, placeholder, name);
if (!clip)
return null;
const end = getValue(map, "end", null);
if (end)
clip.endSlot = skeletonData.findSlot(end);
clip.convex = getValue(map, "convex", false);
clip.inverse = getValue(map, "inverse", false);
const vertexCount = map.vertexCount;
this.readVertices(map, clip, vertexCount << 1);
const color = getValue(map, "color", null);
if (color)
clip.color.setFromString(color);
return clip;
}
}
return null;
}
readSequence(map) {
if (map == null)
return new Sequence(1, false);
const sequence = new Sequence(getValue(map, "count", 0), true);
sequence.start = getValue(map, "start", 1);
sequence.digits = getValue(map, "digits", 0);
sequence.setupIndex = getValue(map, "setup", 0);
return sequence;
}
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
readVertices(map, attachment, verticesLength) {
const scale = this.scale;
attachment.worldVerticesLength = verticesLength;
const vertices = map.vertices;
if (verticesLength === vertices.length) {
const scaledVertices = Utils.toFloatArray(vertices);
if (scale !== 1) {
for (let i = 0, n = vertices.length; i < n; i++)
scaledVertices[i] *= scale;
}
attachment.vertices = scaledVertices;
return;
}
const weights = [];
const bones = [];
for (let i = 0, n = vertices.length; i < n;) {
const boneCount = vertices[i++];
bones.push(boneCount);
for (let nn = i + boneCount * 4; i < nn; i += 4) {
bones.push(vertices[i]);
weights.push(vertices[i + 1] * scale);
weights.push(vertices[i + 2] * scale);
weights.push(vertices[i + 3]);
}
}
attachment.bones = bones;
attachment.vertices = Utils.toFloatArray(weights);
}
// biome-ignore lint/suspicious/noExplicitAny: it is any untile we define a schema
readAnimation(map, name, skeletonData) {
const scale = this.scale;
const timelines = [];
// Slot timelines.
if (map.slots) {
for (const slotName in map.slots) {
const slotMap = map.slots[slotName];
const slot = skeletonData.findSlot(slotName);
if (!slot)
throw new Error(`Slot not found: ${slotName}`);
const slotIndex = slot.index;
for (const timelineName in slotMap) {
const timelineMap = slotMap[timelineName];
if (!timelineMap)
continue;
const frames = timelineMap.length;
switch (timelineName) {
case "attachment": {
const timeline = new AttachmentTimeline(frames, slotIndex);
for (let frame = 0; frame < frames; frame++) {
const keyMap = timelineMap[frame];
timeline.setFrame(frame, getValue(keyMap, "time", 0), getValue(keyMap, "name", null));
}
timelines.push(timeline);
break;
}
case "rgba": {
const timeline = new RGBATimeline(frames, frames << 2, slotIndex);
let keyMap = timelineMap[0];
let time = getValue(keyMap, "time", 0);
let color = Color.fromString(keyMap.color);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const newColor = Color.fromString(nextMap.color);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
}
time = time2;
color = newColor;
keyMap = nextMap;
}
timelines.push(timeline);
break;
}
case "rgb": {
const timeline = new RGBTimeline(frames, frames * 3, slotIndex);
let keyMap = timelineMap[0];
let time = getValue(keyMap, "time", 0);
let color = Color.fromString(keyMap.color);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, color.r, color.g, color.b);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const newColor = Color.fromString(nextMap.color);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
}
time = time2;
color = newColor;
keyMap = nextMap;
}
timelines.push(timeline);
break;
}
case "alpha": {
readTimeline1(timelines, timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1);
break;
}
case "rgba2": {
const timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
let keyMap = timelineMap[0];
let time = getValue(keyMap, "time", 0);
let color = Color.fromString(keyMap.light);
let color2 = Color.fromString(keyMap.dark);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const newColor = Color.fromString(nextMap.light);
const newColor2 = Color.fromString(nextMap.dark);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
}
time = time2;
color = newColor;
color2 = newColor2;
keyMap = nextMap;
}
timelines.push(timeline);
break;
}
case "rgb2": {
const timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
let keyMap = timelineMap[0];
let time = getValue(keyMap, "time", 0);
let color = Color.fromString(keyMap.light);
let color2 = Color.fromString(keyMap.dark);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const newColor = Color.fromString(nextMap.light);
const newColor2 = Color.fromString(nextMap.dark);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
}
time = time2;
color = newColor;
color2 = newColor2;
keyMap = nextMap;
}
timelines.push(timeline);
break;
}
default:
throw new Error(`Invalid timeline type for a slot: ${timelineMap.name} (${slotMap.name})`);
}
}
}
}
// Bone timelines.
if (map.bones) {
for (const boneName in map.bones) {
const boneMap = map.bones[boneName];
const bone = skeletonData.findBone(boneName);
if (!bone)
throw new Error(`Bone not found: ${boneName}`);
const boneIndex = bone.index;
for (const timelineName in boneMap) {
const timelineMap = boneMap[timelineName];
const frames = timelineMap.length;
if (frames === 0)
continue;
switch (timelineName) {
case "rotate":
readTimeline1(timelines, timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1);
break;
case "translate":
readTimeline2(timelines, timelineMap, new TranslateTimeline(frames, frames << 1, boneIndex), "x", "y", 0, scale);
break;
case "translatex":
readTimeline1(timelines, timelineMap, new TranslateXTimeline(frames, frames, boneIndex), 0, scale);
break;
case "translatey":
readTimeline1(timelines, timelineMap, new TranslateYTimeline(frames, frames, boneIndex), 0, scale);
break;
case "scale":
readTimeline2(timelines, timelineMap, new ScaleTimeline(frames, frames << 1, boneIndex), "x", "y", 1, 1);
break;
case "scalex":
readTimeline1(timelines, timelineMap, new ScaleXTimeline(frames, frames, boneIndex), 1, 1);
break;
case "scaley":
readTimeline1(timelines, timelineMap, new ScaleYTimeline(frames, frames, boneIndex), 1, 1);
break;
case "shear":
readTimeline2(timelines, timelineMap, new ShearTimeline(frames, frames << 1, boneIndex), "x", "y", 0, 1);
break;
case "shearx":
readTimeline1(timelines, timelineMap, new ShearXTimeline(frames, frames, boneIndex), 0, 1);
break;
case "sheary":
readTimeline1(timelines, timelineMap, new ShearYTimeline(frames, frames, boneIndex), 0, 1);
break;
case "inherit": {
const timeline = new InheritTimeline(frames, bone.index);
for (let frame = 0; frame < timelineMap.length; frame++) {
const aFrame = timelineMap[frame];
timeline.setFrame(frame, getValue(aFrame, "time", 0), Utils.enumValue(Inherit, getValue(aFrame, "inherit", "Normal")));
}
timelines.push(timeline);
break;
}
default:
throw new Error(`Invalid timeline type for a bone: ${timelineMap.name} (${boneMap.name})`);
}
}
}
}
// IK constraint timelines.
if (map.ik) {
for (const constraintName in map.ik) {
const constraintMap = map.ik[constraintName];
let keyMap = constraintMap[0];
if (!keyMap)
continue;
const constraint = skeletonData.findConstraint(constraintName, IkConstraintData);
if (!constraint)
throw new Error(`IK Constraint not found: ${constraintName}`);
const timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, skeletonData.constraints.indexOf(constraint));
let time = getValue(keyMap, "time", 0);
let mix = getValue(keyMap, "mix", 1);
let softness = getValue(keyMap, "softness", 0) * scale;
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
const nextMap = constraintMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const mix2 = getValue(nextMap, "mix", 1);
const softness2 = getValue(nextMap, "softness", 0) * scale;
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
}
time = time2;
mix = mix2;
softness = softness2;
keyMap = nextMap;
}
timelines.push(timeline);
}
}
// Transform constraint timelines.
if (map.transform) {
for (const constraintName in map.transform) {
const timelineMap = map.transform[constraintName];
let keyMap = timelineMap[0];
if (!keyMap)
continue;
const constraint = skeletonData.findConstraint(constraintName, TransformConstraintData);
if (!constraint)
throw new Error(`Transform constraint not found: ${constraintName}`);
const timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, skeletonData.constraints.indexOf(constraint));
let time = getValue(keyMap, "time", 0);
let mixRotate = getValue(keyMap, "mixRotate", 1);
let mixX = getValue(keyMap, "mixX", 1), mixY = getValue(keyMap, "mixY", mixX);
let mixScaleX = getValue(keyMap, "mixScaleX", 1), mixScaleY = getValue(keyMap, "mixScaleY", 1);
let mixShearY = getValue(keyMap, "mixShearY", 1);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const mixRotate2 = getValue(nextMap, "mixRotate", 1);
const mixX2 = getValue(nextMap, "mixX", 1), mixY2 = getValue(nextMap, "mixY", mixX2);
const mixScaleX2 = getValue(nextMap, "mixScaleX", 1), mixScaleY2 = getValue(nextMap, "mixScaleY", 1);
const mixShearY2 = getValue(nextMap, "mixShearY", 1);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
}
time = time2;
mixRotate = mixRotate2;
mixX = mixX2;
mixY = mixY2;
mixScaleX = mixScaleX2;
mixScaleY = mixScaleY2;
mixShearY = mixShearY2;
keyMap = nextMap;
}
timelines.push(timeline);
}
}
// Path constraint timelines.
if (map.path) {
for (const constraintName in map.path) {
const constraintMap = map.path[constraintName];
const constraint = skeletonData.findConstraint(constraintName, PathConstraintData);
if (!constraint)
throw new Error(`Path constraint not found: ${constraintName}`);
const index = skeletonData.constraints.indexOf(constraint);
for (const timelineName in constraintMap) {
const timelineMap = constraintMap[timelineName];
let keyMap = timelineMap[0];
if (!keyMap)
continue;
const frames = timelineMap.length;
switch (timelineName) {
case "position": {
const timeline = new PathConstraintPositionTimeline(frames, frames, index);
readTimeline1(timelines, timelineMap, timeline, 0, constraint.positionMode === PositionMode.Fixed ? scale : 1);
break;
}
case "spacing": {
const timeline = new PathConstraintSpacingTimeline(frames, frames, index);
readTimeline1(timelines, timelineMap, timeline, 0, constraint.spacingMode === SpacingMode.Length || constraint.spacingMode === SpacingMode.Fixed ? scale : 1);
break;
}
case "mix": {
const timeline = new PathConstraintMixTimeline(frames, frames * 3, index);
let time = getValue(keyMap, "time", 0);
let mixRotate = getValue(keyMap, "mixRotate", 1);
let mixX = getValue(keyMap, "mixX", 1);
let mixY = getValue(keyMap, "mixY", mixX);
for (let frame = 0, bezier = 0;; frame++) {
timeline.setFrame(frame, time, mixRotate, mixX, mixY);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const mixRotate2 = getValue(nextMap, "mixRotate", 1);
const mixX2 = getValue(nextMap, "mixX", 1);
const mixY2 = getValue(nextMap, "mixY", mixX2);
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
}
time = time2;
mixRotate = mixRotate2;
mixX = mixX2;
mixY = mixY2;
keyMap = nextMap;
}
timelines.push(timeline);
break;
}
}
}
}
}
// Physics constraint timelines.
if (map.physics) {
for (const constraintName in map.physics) {
const constraintMap = map.physics[constraintName];
let index = -1;
if (constraintName.length > 0) {
const constraint = skeletonData.findConstraint(constraintName, PhysicsConstraintData);
if (!constraint)
throw new Error(`Physics constraint not found: ${constraintName}`);
index = skeletonData.constraints.indexOf(constraint);
}
for (const timelineName in constraintMap) {
const timelineMap = constraintMap[timelineName];
let keyMap = timelineMap[0];
if (!keyMap)
continue;
const frames = timelineMap.length;
let timeline;
let defaultValue = 0;
if (timelineName === "reset") {
const resetTimeline = new PhysicsConstraintResetTimeline(frames, index);
for (let frame = 0; keyMap != null; keyMap = timelineMap[frame + 1], frame++)
resetTimeline.setFrame(frame, getValue(keyMap, "time", 0));
timelines.push(resetTimeline);
continue;
}
switch (timelineName) {
case "inertia":
timeline = new PhysicsConstraintInertiaTimeline(frames, frames, index);
break;
case "strength":
timeline = new PhysicsConstraintStrengthTimeline(frames, frames, index);
break;
case "damping":
timeline = new PhysicsConstraintDampingTimeline(frames, frames, index);
break;
case "mass":
timeline = new PhysicsConstraintMassTimeline(frames, frames, index);
break;
case "wind":
timeline = new PhysicsConstraintWindTimeline(frames, frames, index);
break;
case "gravity":
timeline = new PhysicsConstraintGravityTimeline(frames, frames, index);
break;
case "mix": {
defaultValue = 1;
timeline = new PhysicsConstraintMixTimeline(frames, frames, index);
break;
}
default: continue;
}
readTimeline1(timelines, timelineMap, timeline, defaultValue, 1);
}
}
}
// Slider timelines.
if (map.slider) {
for (const constraintName in map.slider) {
const constraintMap = map.slider[constraintName];
const constraint = skeletonData.findConstraint(constraintName, SliderData);
if (!constraint)
throw new Error(`Slider not found: ${constraintName}`);
const index = skeletonData.constraints.indexOf(constraint);
for (const timelineName in constraintMap) {
const timelineMap = constraintMap[timelineName];
const keyMap = timelineMap[0];
if (!keyMap)
continue;
const frames = timelineMap.length;
switch (timelineName) {
case "time":
readTimeline1(timelines, timelineMap, new SliderTimeline(frames, frames, index), 1, 1);
break;
case "mix":
readTimeline1(timelines, timelineMap, new SliderMixTimeline(frames, frames, index), 1, 1);
break;
}
}
}
}
// Attachment timelines.
if (map.attachments) {
for (const attachmentsName in map.attachments) {
const attachmentsMap = map.attachments[attachmentsName];
const skin = skeletonData.findSkin(attachmentsName);
if (!skin)
throw new Error(`Skin not found: ${attachmentsName}`);
for (const slotMapName in attachmentsMap) {
const slotMap = attachmentsMap[slotMapName];
const slot = skeletonData.findSlot(slotMapName);
if (!slot)
throw new Error(`Attachment slot not found: ${slotMapName}`);
const slotIndex = slot.index;
for (const attachmentMapName in slotMap) {
const attachmentMap = slotMap[attachmentMapName];
const attachment = skin.getAttachment(slotIndex, attachmentMapName);
if (!attachment)
throw new Error(`Timeline attachment not found: ${attachmentMapName}`);
for (const timelineMapName in attachmentMap) {
const timelineMap = attachmentMap[timelineMapName];
let keyMap = timelineMap[0];
if (!keyMap)
continue;
if (timelineMapName === "deform") {
const weighted = attachment.bones;
const vertices = attachment.vertices;
const deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
const timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
let time = getValue(keyMap, "time", 0);
for (let frame = 0, bezier = 0;; frame++) {
let deform;
const verticesValue = getValue(keyMap, "vertices", null);
if (!verticesValue)
deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
else {
deform = Utils.newFloatArray(deformLength);
const start = getValue(keyMap, "offset", 0);
Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
if (scale !== 1) {
for (let i = start, n = i + verticesValue.length; i < n; i++)
deform[i] *= scale;
}
if (!weighted) {
for (let i = 0; i < deformLength; i++)
deform[i] += vertices[i];
}
}
timeline.setFrame(frame, time, deform);
const nextMap = timelineMap[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
break;
}
const time2 = getValue(nextMap, "time", 0);
const curve = keyMap.curve;
if (curve)
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
time = time2;
keyMap = nextMap;
}
timelines.push(timeline);
}
else if (timelineMapName === "sequence") {
const timeline = new SequenceTimeline(timelineMap.length, slotIndex, attachment);
let lastDelay = 0;
for (let frame = 0; frame < timelineMap.length; frame++) {
const delay = getValue(keyMap, "delay", lastDelay);
const time = getValue(keyMap, "time", 0);
const mode = SequenceMode[getValue(keyMap, "mode", "hold")];
const index = getValue(keyMap, "index", 0);
timeline.setFrame(frame, time, mode, index, delay);
lastDelay = delay;
keyMap = timelineMap[frame + 1];
}
timelines.push(timeline);
}
}
}
}
}
}
// Draw order timeline.
if (map.drawOrder) {
const timeline = new DrawOrderTimeline(map.drawOrder.length);
const slotCount = skeletonData.slots.length;
let frame = 0;
for (const drawOrderMap of map.drawOrder) {
timeline.setFrame(frame++, getValue(drawOrderMap, "time", 0), readDrawOrder(skeletonData, drawOrderMap, slotCount, null));
}
timelines.push(timeline);
}
// Draw order folder timelines.
if (map.drawOrderFolder) {
for (const timelineMap of map.drawOrderFolder) {
const slotEntries = getValue(timelineMap, "slots", []);
const folderSlots = new Array(slotEntries.length);
let ii = 0;
for (const slotEntry of slotEntries) {
const slot = skeletonData.findSlot(slotEntry);
if (!slot)
throw new Error(`Draw order folder slot not found: ${slotEntry}`);
folderSlots[ii++] = slot.index;
}
const drawOrderFolderEntries = getValue(timelineMap, "keys", []);
const timeline = new DrawOrderFolderTimeline(drawOrderFolderEntries.length, folderSlots, skeletonData.slots.length);
let frame = 0;
for (const drawOrderFolderMap of drawOrderFolderEntries) {
timeline.setFrame(frame++, getValue(drawOrderFolderMap, "time", 0), readDrawOrder(skeletonData, drawOrderFolderMap, folderSlots.length, folderSlots));
}
timelines.push(timeline);
}
}
// Event timeline.
if (map.events) {
const timeline = new EventTimeline(map.events.length);
let frame = 0;
for (let i = 0; i < map.events.length; i++, frame++) {
const eventMap = map.events[i];
const data = skeletonData.findEvent(eventMap.name);
if (!data)
throw new Error(`Event not found: ${eventMap.name}`);
const setup = data.setupPose;
const event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), data);
event.intValue = getValue(eventMap, "int", setup.intValue);
event.floatValue = getValue(eventMap, "float", setup.floatValue);
event.stringValue = getValue(eventMap, "string", setup.stringValue);
if (event.data.audioPath) {
event.volume = getValue(eventMap, "volume", setup.volume);
event.balance = getValue(eventMap, "balance", setup.volume);
}
timeline.setFrame(frame, event);
}
timelines.push(timeline);
}
let duration = 0;
for (let i = 0, n = timelines.length; i < n; i++)
duration = Math.max(duration, timelines[i].getDuration());
const animation = new Animation(name, timelines, duration);
const color = getValue(map, "color", null);
if (color !== null)
animation.color.setFromString(color);
skeletonData.animations.push(animation);
}
}
class LinkedMesh {
source;
skin;
slotIndex;
sourceIndex;
mesh;
inheritTimelines;
constructor(mesh, skin, slotIndex, sourceIndex, source, inheritTimelines) {
this.mesh = mesh;
this.skin = skin;
this.slotIndex = slotIndex;
this.sourceIndex = sourceIndex;
this.source = source;
this.inheritTimelines = inheritTimelines;
}
}
function readTimeline1(timelines, keys, timeline, defaultValue, scale) {
let keyMap = keys[0];
let time = keyMap.time ?? 0;
let value = (keyMap.value ?? defaultValue) * scale;
let bezier = 0;
for (let frame = 0;; frame++) {
timeline.setFrame(frame, time, value);
const nextMap = keys[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
timelines.push(timeline);
return;
}
const time2 = nextMap.time ?? 0;
const value2 = (nextMap.value ?? defaultValue) * scale;
if (keyMap.curve)
bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
time = time2;
value = value2;
keyMap = nextMap;
}
}
function readTimeline2(timelines, keys, timeline, name1, name2, defaultValue, scale) {
let keyMap = keys[0];
let time = keyMap.time ?? 0;
let value1 = (keyMap[name1] ?? defaultValue) * scale;
let value2 = (keyMap[name2] ?? defaultValue) * scale;
let bezier = 0;
for (let frame = 0;; frame++) {
timeline.setFrame(frame, time, value1, value2);
const nextMap = keys[frame + 1];
if (!nextMap) {
timeline.shrink(bezier);
timelines.push(timeline);
return;
}
const time2 = nextMap.time ?? 0;
const nvalue1 = (nextMap[name1] ?? defaultValue) * scale;
const nvalue2 = (nextMap[name2] ?? defaultValue) * scale;
const curve = keyMap.curve;
if (curve) {
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
}
time = time2;
value1 = nvalue1;
value2 = nvalue2;
keyMap = nextMap;
}
}
/** @param folderSlots Slot names are resolved to positions within this array. If null, slot indices are used as positions. */
function readDrawOrder(skeletonData, keys, slotCount, folderSlots) {
const changes = keys.offsets;
if (!changes)
return null; // Setup draw order.
const drawOrder = new Array(slotCount).fill(-1);
const unchanged = new Array(slotCount - changes.length);
let originalIndex = 0, unchangedIndex = 0;
for (const offsetMap of changes) {
const slot = skeletonData.findSlot(offsetMap.slot);
if (slot == null)
throw new Error(`Draw order slot not found: ${offsetMap.slot}`);
let index = 0;
if (!folderSlots)
index = slot.index;
else {
index = -1;
for (let i = 0; i < slotCount; i++) {
if (folderSlots[i] === slot.index) {
index = i;
break;
}
}
if (index === -1)
throw new Error(`Slot not in folder: ${offsetMap.slot}`);
}
// Collect unchanged items.
while (originalIndex !== index)
unchanged[unchangedIndex++] = originalIndex++;
// Set changed items.
drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
}
// Collect remaining unchanged items.
while (originalIndex < slotCount)
unchanged[unchangedIndex++] = originalIndex++;
// Fill in unchanged items.
for (let i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] === -1)
drawOrder[i] = unchanged[--unchangedIndex];
return drawOrder;
}
function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
if (curve === "stepped") {
timeline.setStepped(frame);
return bezier;
}
const i = value << 2;
const cx1 = curve[i];
const cy1 = curve[i + 1] * scale;
const cx2 = curve[i + 2];
const cy2 = curve[i + 3] * scale;
timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
return bezier + 1;
}
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
function getValue(map, property, defaultValue) {
return map[property] !== undefined ? map[property] : defaultValue;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Kc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQStELGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLDhCQUE4QixFQUFFLDZCQUE2QixFQUFFLGdDQUFnQyxFQUFFLGdDQUFnQyxFQUFFLGdDQUFnQyxFQUFFLDZCQUE2QixFQUFFLDRCQUE0QixFQUFFLDhCQUE4QixFQUFFLGlDQUFpQyxFQUFFLDZCQUE2QixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFpQiwyQkFBMkIsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTk1QixPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVB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QUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxVQUFVO29CQUFFLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENB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RSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29DQUMzRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUM5RixDQUFDO2dDQUNELElBQUksR0FBRyxLQUFLLENBQUM7Z0NBQ2IsS0FBSyxHQUFH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QUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDckYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNyRyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDckQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDM0IsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDWCxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5RixDQUFDO29CQUVELElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ2IsU0FBUyxHQUFHLFVBQVUsQ0FBQztvQkFDdkIsSUFBSSxHQUFHLEtBQUssQ0FBQztvQkFDYixJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUNiLFNBQVMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZCLFNBQVMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZCLFNBQVMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZCLE1BQU0sR0FBRyxPQUFPLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0YsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLEtBQUssTUFBTSxjQUFjLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLENBQUMsVUFBVTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0QsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNoRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLElBQUksQ0FBQyxNQUFNO3dCQUFFLFNBQVM7b0JBRXRCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQ2xDLFFBQVEsWUFBWSxFQUFFLENBQUM7d0JBQ3RCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDakIsTUFBTSxRQUFRLEdBQUcsSUFBSSw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUMzRSxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDL0csTUFBTTt3QkFDUCxDQUFDO3dCQUNELEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUMxRSxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQzlKLE1BQU07d0JBQ1AsQ0FBQzt3QkFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7NEJBQ1osTUFBTSxRQUFRLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzs0QkFDMUUsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ3ZDLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNqRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7NEJBQzFDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztnQ0FDM0MsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0NBQ3RELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQ0FDZCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29DQUN4QixNQUFNO2dDQUNQLENBQUM7Z0NBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUNyRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0NBQzNCLElBQUksS0FBSyxFQUFFLENBQUM7b0NBQ1gsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDbkYsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDcEYsQ0FBQztnQ0FDRCxJQUFJLEdBQUcsS0FBSyxDQUFDO2dDQUNiLFNBQVMsR0FBRyxVQUFVLENBQUM7Z0NBQ3ZCLElBQUksR0FBRyxLQUFLLENBQUM7Z0NBQ2IsSUFBSSxHQUFHLEtBQUssQ0FBQztnQ0FDYixNQUFNLEdBQUcsT0FBTyxDQUFDOzRCQUNsQixDQUFDOzRCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQ3pCLE1BQU07d0JBQ1AsQ0FBQztvQkFDRixDQUFDO2dCQUNGLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixLQUFLLE1BQU0sY0FBYyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMvQixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO29CQUN0RixJQUFJLENBQUMsVUFBVTt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO29CQUNwRixLQUFLLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBQ0QsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNoRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLElBQUksQ0FBQyxNQUFNO3dCQUFFLFNBQVM7b0JBRXRCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQ2xDLElBQUksUUFBd0IsQ0FBQztvQkFDN0IsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO29CQUNyQixJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDOUIsTUFBTSxhQUFhLEdBQUcsSUFBSSw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3hFLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFOzRCQUMzRSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM1RCxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUM5QixTQUFTO29CQUNWLENBQUM7b0JBQ0QsUUFBUSxZQUFZLEVBQUUsQ0FBQzt3QkFDdEIsS0FBSyxTQUFTOzRCQUFFLFFBQVEsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDOUYsS0FBSyxVQUFVOzRCQUFFLFFBQVEsR0FBRyxJQUFJLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDaEcsS0FBSyxTQUFTOzRCQUFFLFFBQVEsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDOUYsS0FBSyxNQUFNOzRCQUFFLFFBQVEsR0FBRyxJQUFJLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDeEYsS0FBSyxNQUFNOzRCQUFFLFFBQVEsR0FBRyxJQUFJLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDeEYsS0FBSyxTQUFTOzRCQUFFLFFBQVEsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQUMsTUFBTTt3QkFDOUYsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDOzRCQUNaLFlBQVksR0FBRyxDQUFDLENBQUM7NEJBQ2pCLFFBQVEsR0FBRyxJQUFJLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQ25FLE1BQU07d0JBQ1AsQ0FBQzt3QkFDRCxPQUFPLENBQUMsQ0FBQyxTQUFTO29CQUNuQixDQUFDO29CQUNELGFBQWEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU0sY0FBYyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDakQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxVQUFVO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUUzRCxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUMxQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2hELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLE1BQU07d0JBQUUsU0FBUztvQkFFdEIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDbEMsUUFBUSxZQUFZLEVBQUUsQ0FBQzt3QkFDdEIsS0FBSyxNQUFNOzRCQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUFDLE1BQU07d0JBQzNHLEtBQUssS0FBSzs0QkFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUFDLE1BQU07b0JBQzlHLENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLEtBQUssTUFBTSxlQUFlLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsSUFBSTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLE1BQU0sV0FBVyxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUMxQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzVDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hELElBQUksQ0FBQyxJQUFJO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQ3hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzdCLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDekMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ2pELE1BQU0sVUFBVSxHQUFxQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO3dCQUN0RixJQUFJLENBQUMsVUFBVTs0QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7d0JBRXhGLEtBQUssTUFBTSxlQUFlLElBQUksYUFBYSxFQUFFLENBQUM7NEJBQzdDLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQzs0QkFDbkQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM1QixJQUFJLENBQUMsTUFBTTtnQ0FBRSxTQUFTOzRCQUV0QixJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQ0FDbEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztnQ0FDbEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQ0FDckMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0NBRTFFLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0NBQ25HLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUN2QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7b0NBQzNDLElBQUksTUFBdUIsQ0FBQztvQ0FDNUIsTUFBTSxhQUFhLEdBQWtCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO29DQUN4RSxJQUFJLENBQUMsYUFBYTt3Q0FDakIsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO3lDQUM3RCxDQUFDO3dDQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dDQUMzQyxNQUFNLEtBQUssR0FBVyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzt3Q0FDcEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dDQUN2RSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQzs0Q0FDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dEQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO3dDQUNyQixDQUFDO3dDQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0Q0FDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRTtnREFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3Q0FDM0IsQ0FBQztvQ0FDRixDQUFDO29DQUVELFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztvQ0FDdkMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQ0FDdkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dDQUNkLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0NBQ3hCLE1BQU07b0NBQ1AsQ0FBQztvQ0FDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztvQ0FDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztvQ0FDM0IsSUFBSSxLQUFLO3dDQUFFLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBQ3ZGLElBQUksR0FBRyxLQUFLLENBQUM7b0NBQ2IsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQ0FDbEIsQ0FBQztnQ0FDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUMxQixDQUFDO2lDQUFNLElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dDQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQXdCLENBQUMsQ0FBQztnQ0FDL0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dDQUNsQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO29DQUN6RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQ0FDbkQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBQ3pDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBc0IsQ0FBQztvQ0FDakYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0NBQzNDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO29DQUNuRCxTQUFTLEdBQUcsS0FBSyxDQUFDO29DQUNsQixNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQ0FDakMsQ0FBQztnQ0FDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUMxQixDQUFDO3dCQUNGLENBQUM7b0JBQ0YsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtZQUNiLEtBQUssTUFBTSxZQUFZLElBQUssR0FBRyxDQUFDLFNBQWlDLEVBQUUsQ0FBQztnQkFDbkUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzSCxDQUFDO1lBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssTUFBTSxXQUFXLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQWEsQ0FBQztnQkFDbkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQVMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxNQUFNLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDckMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLElBQUk7d0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDN0UsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDaEMsQ0FBQztnQkFFRCxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBd0IsQ0FBQztnQkFDeEYsTUFBTSxRQUFRLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BILElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxLQUFLLE1BQU0sa0JBQWtCLElBQUksc0JBQXNCLEVBQUUsQ0FBQztvQkFDekQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN2SixDQUFDO2dCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNGLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxJQUFJO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEYsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNELEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxQixLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDMUQsS0FBSyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdELENBQUM7Z0JBQ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMvQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNEO0FBRUQsTUFBTSxVQUFVO0lBQ2YsTUFBTSxDQUFTO0lBQUMsSUFBSSxDQUFTO0lBQzdCLFNBQVMsQ0FBUztJQUFDLFdBQVcsQ0FBUztJQUN2QyxJQUFJLENBQWlCO0lBQ3JCLGdCQUFnQixDQUFVO0lBRTFCLFlBQWEsSUFBb0IsRUFBRSxJQUFZLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUFFLE1BQWMsRUFDdEcsZ0JBQXlCO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMxQyxDQUFDO0NBQ0Q7QUFNRCxTQUFTLGFBQWEsQ0FBRSxTQUEwQixFQUFFLElBQXlCLEVBQUUsUUFBd0IsRUFBRSxZQUFvQixFQUFFLEtBQWE7SUFDM0ksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzVCLElBQUksS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMvQixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsT0FBTztRQUNSLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3ZELElBQUksTUFBTSxDQUFDLEtBQUs7WUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsSCxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNmLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDbEIsQ0FBQztBQUNGLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBRSxTQUEwQixFQUFFLElBQXlCLEVBQUUsUUFBdUIsRUFBRSxLQUFVLEVBQUUsS0FBVSxFQUFFLFlBQW9CLEVBQUUsS0FBYTtJQUNsSyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JELElBQUksTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNyRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsR0FBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsT0FBTztRQUNSLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNiLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDakIsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUNqQixNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ2xCLENBQUM7QUFDRixDQUFDO0FBSUQsOEhBQThIO0FBQzlILFNBQVMsYUFBYSxDQUFFLFlBQTBCLEVBQUUsSUFBdUIsRUFBRSxTQUFpQixFQUFFLFdBQTRCO0lBQzNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLG9CQUFvQjtJQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBUyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBUyxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLElBQUksYUFBYSxHQUFHLENBQUMsRUFBRSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxXQUFXO1lBQ2YsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDZixDQUFDO1lBQ0wsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ1gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25DLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ1YsTUFBTTtnQkFDUCxDQUFDO1lBQ0YsQ0FBQztZQUNELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsMkJBQTJCO1FBQzNCLE9BQU8sYUFBYSxLQUFLLEtBQUs7WUFDN0IsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDL0MscUJBQXFCO1FBQ3JCLFNBQVMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFDRCxxQ0FBcUM7SUFDckMsT0FBTyxhQUFhLEdBQUcsU0FBUztRQUMvQixTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUMvQywyQkFBMkI7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNyRSxPQUFPLFNBQVMsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUUsS0FBbUQsRUFBRSxRQUF1QixFQUFFLE1BQWMsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQzNLLE1BQWMsRUFBRSxNQUFjLEVBQUUsS0FBYTtJQUM3QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDakMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0YsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsU0FBUyxRQUFRLENBQUUsR0FBUSxFQUFFLFFBQWdCLEVBQUUsWUFBaUI7SUFDL0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBbHBoYVRpbWVsaW5lLCBBbmltYXRpb24sIEF0dGFjaG1lbnRUaW1lbGluZSwgdHlwZSBCb25lVGltZWxpbmUyLCB0eXBlIEN1cnZlVGltZWxpbmUsIHR5cGUgQ3VydmVUaW1lbGluZTEsIERlZm9ybVRpbWVsaW5lLCBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZSwgRHJhd09yZGVyVGltZWxpbmUsIEV2ZW50VGltZWxpbmUsIElrQ29uc3RyYWludFRpbWVsaW5lLCBJbmhlcml0VGltZWxpbmUsIFBhdGhDb25zdHJhaW50TWl4VGltZWxpbmUsIFBhdGhDb25zdHJhaW50UG9zaXRpb25UaW1lbGluZSwgUGF0aENvbnN0cmFpbnRTcGFjaW5nVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50RGFtcGluZ1RpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludEdyYXZpdHlUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnRJbmVydGlhVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50TWFzc1RpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludE1peFRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludFJlc2V0VGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50U3RyZW5ndGhUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnRXaW5kVGltZWxpbmUsIFJHQjJUaW1lbGluZSwgUkdCQTJUaW1lbGluZSwgUkdCQVRpbWVsaW5lLCBSR0JUaW1lbGluZSwgUm90YXRlVGltZWxpbmUsIFNjYWxlVGltZWxpbmUsIFNjYWxlWFRpbWVsaW5lLCBTY2FsZVlUaW1lbGluZSwgU2VxdWVuY2VUaW1lbGluZSwgU2hlYXJUaW1lbGluZSwgU2hlYXJYVGltZWxpbmUsIFNoZWFyWVRpbWVsaW5lLCBTbGlkZXJNaXhUaW1lbGluZSwgU2xpZGVyVGltZWxpbmUsIHR5cGUgVGltZWxpbmUsIFRyYW5zZm9ybUNvbnN0cmFpbnRUaW1lbGluZSwgVHJhbnNsYXRlVGltZWxpbmUsIFRyYW5zbGF0ZVhUaW1lbGluZSwgVHJhbnNsYXRlWVRpbWVsaW5lIH0gZnJvbSBcIi4vQW5pbWF0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF0dGFjaG1lbnQsIFZlcnRleEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9BdHRhY2htZW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF0dGFjaG1lbnRMb2FkZXIgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9BdHRhY2htZW50TG9hZGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1lc2hBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvTWVzaEF0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IFNlcXVlbmNlLCBTZXF1ZW5jZU1vZGUgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9TZXF1ZW5jZS5qc1wiO1xuaW1wb3J0IHsgQm9uZURhdGEsIEluaGVyaXQgfSBmcm9tIFwiLi9Cb25lRGF0YS5qc1wiO1xuaW1wb3J0IHsgU2NhbGVZTW9kZSB9IGZyb20gXCIuL0NvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL0V2ZW50LmpzXCI7XG5pbXBvcnQgeyBFdmVudERhdGEgfSBmcm9tIFwiLi9FdmVudERhdGEuanNcIjtcbmltcG9ydCB7IElrQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9Ja0NvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgeyBQYXRoQ29uc3RyYWludERhdGEsIFBvc2l0aW9uTW9kZSwgUm90YXRlTW9kZSwgU3BhY2luZ01vZGUgfSBmcm9tIFwiLi9QYXRoQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBoeXNpY3NDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHsgU2tlbGV0b25EYXRhIH0gZnJvbSBcIi4vU2tlbGV0b25EYXRhLmpzXCI7XG5pbXBvcnQgeyBTa2luIH0gZnJvbSBcIi4vU2tpbi5qc1wiO1xuaW1wb3J0IHsgU2xpZGVyRGF0YSB9IGZyb20gXCIuL1NsaWRlckRhdGEuanNcIjtcbmltcG9ydCB7IEJsZW5kTW9kZSwgU2xvdERhdGEgfSBmcm9tIFwiLi9TbG90RGF0YS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBGcm9tUHJvcGVydHksIEZyb21Sb3RhdGUsIEZyb21TY2FsZVgsIEZyb21TY2FsZVksIEZyb21TaGVhclksIEZyb21YLCBGcm9tWSwgdHlwZSBUb1Byb3BlcnR5LCBUb1JvdGF0ZSwgVG9TY2FsZVgsIFRvU2NhbGVZLCBUb1NoZWFyWSwgVG9YLCBUb1ksIFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IENvbG9yLCB0eXBlIE51bWJlckFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG4vKiogTG9hZHMgc2tlbGV0b24gZGF0YSBpbiB0aGUgU3BpbmUgSlNPTiBmb3JtYXQuXG4gKlxuICogU2VlIFtTcGluZSBKU09OIGZvcm1hdF0oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWpzb24tZm9ybWF0KSBhbmRcbiAqIFtKU09OIGFuZCBiaW5hcnkgZGF0YV0oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWxvYWRpbmctc2tlbGV0b24tZGF0YSNKU09OLWFuZC1iaW5hcnktZGF0YSkgaW4gdGhlIFNwaW5lXG4gKiBSdW50aW1lcyBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkpzb24ge1xuXHRhdHRhY2htZW50TG9hZGVyOiBBdHRhY2htZW50TG9hZGVyO1xuXG5cdC8qKiBTY2FsZXMgYm9uZSBwb3NpdGlvbnMsIGltYWdlIHNpemVzLCBhbmQgdHJhbnNsYXRpb25zIGFzIHRoZXkgYXJlIGxvYWRlZC4gVGhpcyBhbGxvd3MgZGlmZmVyZW50IHNpemUgaW1hZ2VzIHRvIGJlIHVzZWQgYXRcblx0ICogcnVudGltZSB0aGFuIHdlcmUgdXNlZCBpbiBTcGluZS5cblx0ICpcblx0ICogU2VlIFtTY2FsaW5nXShodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtbG9hZGluZy1za2VsZXRvbi1kYXRhI1NjYWxpbmcpIGluIHRoZSBTcGluZSBSdW50aW1lcyBHdWlkZS4gKi9cblx0c2NhbGUgPSAxO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxpbmtlZE1lc2hlcyA9IFtdIGFzIExpbmtlZE1lc2hbXTtcblxuXHRjb25zdHJ1Y3RvciAoYXR0YWNobWVudExvYWRlcjogQXR0YWNobWVudExvYWRlcikge1xuXHRcdHRoaXMuYXR0YWNobWVudExvYWRlciA9IGF0dGFjaG1lbnRMb2FkZXI7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGl0IGlzIGFueSB1bnRpbCB3ZSBkZWZpbmUgYSBzY2hlbWFcblx0cmVhZFNrZWxldG9uRGF0YSAoanNvbjogc3RyaW5nIHwgYW55KTogU2tlbGV0b25EYXRhIHtcblx0XHRjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0Y29uc3Qgc2tlbGV0b25EYXRhID0gbmV3IFNrZWxldG9uRGF0YSgpO1xuXHRcdGNvbnN0IHJvb3QgPSB0eXBlb2YgKGpzb24pID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG5cblx0XHQvLyBTa2VsZXRvblxuXHRcdGNvbnN0IHNrZWxldG9uTWFwID0gcm9vdC5za2VsZXRvbjtcblx0XHRpZiAoc2tlbGV0b25NYXApIHtcblx0XHRcdHNrZWxldG9uRGF0YS5oYXNoID0gc2tlbGV0b25NYXAuaGFzaDtcblx0XHRcdHNrZWxldG9uRGF0YS52ZXJzaW9uID0gc2tlbGV0b25NYXAuc3BpbmU7XG5cdFx0XHRza2VsZXRvbkRhdGEueCA9IHNrZWxldG9uTWFwLng7XG5cdFx0XHRza2VsZXRvbkRhdGEueSA9IHNrZWxldG9uTWFwLnk7XG5cdFx0XHRza2VsZXRvbkRhdGEud2lkdGggPSBza2VsZXRvbk1hcC53aWR0aDtcblx0XHRcdHNrZWxldG9uRGF0YS5oZWlnaHQgPSBza2VsZXRvbk1hcC5oZWlnaHQ7XG5cdFx0XHRza2VsZXRvbkRhdGEucmVmZXJlbmNlU2NhbGUgPSBnZXRWYWx1ZShza2VsZXRvbk1hcCwgXCJyZWZlcmVuY2VTY2FsZVwiLCAxMDApICogc2NhbGU7XG5cdFx0XHRza2VsZXRvbkRhdGEuZnBzID0gc2tlbGV0b25NYXAuZnBzO1xuXHRcdFx0c2tlbGV0b25EYXRhLmltYWdlc1BhdGggPSBza2VsZXRvbk1hcC5pbWFnZXMgPz8gbnVsbDtcblx0XHRcdHNrZWxldG9uRGF0YS5hdWRpb1BhdGggPSBza2VsZXRvbk1hcC5hdWRpbyA/PyBudWxsO1xuXHRcdH1cblxuXHRcdC8vIEJvbmVzXG5cdFx0aWYgKHJvb3QuYm9uZXMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5ib25lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBib25lTWFwID0gcm9vdC5ib25lc1tpXTtcblxuXHRcdFx0XHRsZXQgcGFyZW50OiBCb25lRGF0YSB8IG51bGwgPSBudWxsO1xuXHRcdFx0XHRjb25zdCBwYXJlbnROYW1lOiBzdHJpbmcgPSBnZXRWYWx1ZShib25lTWFwLCBcInBhcmVudFwiLCBudWxsKTtcblx0XHRcdFx0aWYgKHBhcmVudE5hbWUpIHBhcmVudCA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShwYXJlbnROYW1lKTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBCb25lRGF0YShza2VsZXRvbkRhdGEuYm9uZXMubGVuZ3RoLCBib25lTWFwLm5hbWUsIHBhcmVudCk7XG5cdFx0XHRcdGRhdGEubGVuZ3RoID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJsZW5ndGhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0c2V0dXAueCA9IGdldFZhbHVlKGJvbmVNYXAsIFwieFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRzZXR1cC55ID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHNldHVwLnJvdGF0aW9uID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0c2V0dXAuc2NhbGVYID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJzY2FsZVhcIiwgMSk7XG5cdFx0XHRcdHNldHVwLnNjYWxlWSA9IGdldFZhbHVlKGJvbmVNYXAsIFwic2NhbGVZXCIsIDEpO1xuXHRcdFx0XHRzZXR1cC5zaGVhclggPSBnZXRWYWx1ZShib25lTWFwLCBcInNoZWFyWFwiLCAwKTtcblx0XHRcdFx0c2V0dXAuc2hlYXJZID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJzaGVhcllcIiwgMCk7XG5cdFx0XHRcdHNldHVwLmluaGVyaXQgPSBVdGlscy5lbnVtVmFsdWUoSW5oZXJpdCwgZ2V0VmFsdWUoYm9uZU1hcCwgXCJpbmhlcml0XCIsIFwiTm9ybWFsXCIpKTtcblx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBnZXRWYWx1ZShib25lTWFwLCBcInNraW5cIiwgZmFsc2UpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBkYXRhLmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXHRcdFx0XHRkYXRhLmljb24gPSBnZXRWYWx1ZShib25lTWFwLCBcImljb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0ZGF0YS5pY29uU2l6ZSA9IGdldFZhbHVlKGJvbmVNYXAsIFwiaWNvblNpemVcIiwgMSk7XG5cdFx0XHRcdGRhdGEuaWNvblJvdGF0aW9uID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJpY29uUm90YXRpb25cIiwgMCk7XG5cblx0XHRcdFx0c2tlbGV0b25EYXRhLmJvbmVzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2xvdHMuXG5cdFx0aWYgKHJvb3Quc2xvdHMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5zbG90cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBzbG90TWFwID0gcm9vdC5zbG90c1tpXTtcblx0XHRcdFx0Y29uc3Qgc2xvdE5hbWUgPSBzbG90TWFwLm5hbWU7XG5cblx0XHRcdFx0Y29uc3QgYm9uZURhdGEgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoc2xvdE1hcC5ib25lKTtcblx0XHRcdFx0aWYgKCFib25lRGF0YSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtzbG90TWFwLmJvbmV9IGZvciBzbG90ICR7c2xvdE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgU2xvdERhdGEoc2tlbGV0b25EYXRhLnNsb3RzLmxlbmd0aCwgc2xvdE5hbWUsIGJvbmVEYXRhKTtcblxuXHRcdFx0XHRjb25zdCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUoc2xvdE1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBkYXRhLnNldHVwUG9zZS5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblxuXHRcdFx0XHRjb25zdCBkYXJrOiBzdHJpbmcgPSBnZXRWYWx1ZShzbG90TWFwLCBcImRhcmtcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChkYXJrKSBkYXRhLnNldHVwUG9zZS5kYXJrQ29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKGRhcmspO1xuXG5cdFx0XHRcdGRhdGEuYXR0YWNobWVudE5hbWUgPSBnZXRWYWx1ZShzbG90TWFwLCBcImF0dGFjaG1lbnRcIiwgbnVsbCk7XG5cdFx0XHRcdGRhdGEuYmxlbmRNb2RlID0gVXRpbHMuZW51bVZhbHVlKEJsZW5kTW9kZSwgZ2V0VmFsdWUoc2xvdE1hcCwgXCJibGVuZFwiLCBcIm5vcm1hbFwiKSk7XG5cdFx0XHRcdGRhdGEudmlzaWJsZSA9IGdldFZhbHVlKHNsb3RNYXAsIFwidmlzaWJsZVwiLCB0cnVlKTtcblx0XHRcdFx0c2tlbGV0b25EYXRhLnNsb3RzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29uc3RyYWludHMuXG5cdFx0aWYgKHJvb3QuY29uc3RyYWludHMpIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE1hcCBvZiByb290LmNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBjb25zdHJhaW50TWFwLm5hbWU7XG5cdFx0XHRcdGNvbnN0IHNraW5SZXF1aXJlZCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2tpblwiLCBmYWxzZSk7XG5cdFx0XHRcdHN3aXRjaCAoZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ0eXBlXCIsIGZhbHNlKSkge1xuXHRcdFx0XHRcdGNhc2UgXCJpa1wiOiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gbmV3IElrQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNvbnN0cmFpbnRNYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoY29uc3RyYWludE1hcC5ib25lc1tpaV0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Y29uc3RyYWludE1hcC5ib25lc1tpaV19IGZvciBJSyBjb25zdHJhaW50ICR7bmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRcdGRhdGEuYm9uZXMucHVzaChib25lKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0TmFtZSA9IGNvbnN0cmFpbnRNYXAudGFyZ2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKHRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0YXJnZXQgYm9uZSAke3RhcmdldE5hbWV9IGZvciBJSyBjb25zdHJhaW50ICR7bmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnRhcmdldCA9IHRhcmdldDtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgc2NhbGVZID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzY2FsZVlcIiwgbnVsbCk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGVZICE9IG51bGwpIGRhdGEuc2NhbGVZTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShTY2FsZVlNb2RlLCBzY2FsZVkpO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cCA9IGRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhcIiwgMSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5zb2Z0bmVzcyA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic29mdG5lc3NcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0XHRcdHNldHVwLmJlbmREaXJlY3Rpb24gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImJlbmRQb3NpdGl2ZVwiLCB0cnVlKSA/IDEgOiAtMTtcblx0XHRcdFx0XHRcdHNldHVwLmNvbXByZXNzID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJjb21wcmVzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5zdHJldGNoID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJldGNoXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInRyYW5zZm9ybVwiOiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gbmV3IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhKG5hbWUpO1xuXHRcdFx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBza2luUmVxdWlyZWQ7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjb25zdHJhaW50TWFwLmJvbmVzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBib25lTmFtZSA9IGNvbnN0cmFpbnRNYXAuYm9uZXNbaWldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFib25lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYm9uZSAke2JvbmVOYW1lfSBmb3IgdHJhbnNmb3JtIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0XHRkYXRhLmJvbmVzLnB1c2goYm9uZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNvdXJjZU5hbWU6IHN0cmluZyA9IGNvbnN0cmFpbnRNYXAuc291cmNlO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc291cmNlID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKHNvdXJjZU5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBzb3VyY2UgYm9uZSAke3NvdXJjZU5hbWV9IGZvciB0cmFuc2Zvcm0gY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnNvdXJjZSA9IHNvdXJjZTtcblxuXHRcdFx0XHRcdFx0ZGF0YS5sb2NhbFNvdXJjZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxTb3VyY2VcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5sb2NhbFRhcmdldCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxUYXJnZXRcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5hZGRpdGl2ZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiYWRkaXRpdmVcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5jbGFtcCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiY2xhbXBcIiwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0XHRsZXQgcm90YXRlID0gZmFsc2UsIHggPSBmYWxzZSwgeSA9IGZhbHNlLCBzY2FsZVggPSBmYWxzZSwgc2NhbGVZID0gZmFsc2UsIHNoZWFyWSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y29uc3QgZnJvbUVudHJpZXMgPSBPYmplY3QuZW50cmllcyhnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInByb3BlcnRpZXNcIiwge30pKSBhcyBbc3RyaW5nLCBvYmplY3RdW107XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuYW1lLCBmcm9tRW50cnldIG9mIGZyb21FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZyb20gPSB0aGlzLmZyb21Qcm9wZXJ0eShuYW1lKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnJvbVNjYWxlID0gdGhpcy5wcm9wZXJ0eVNjYWxlKG5hbWUsIHNjYWxlKTtcblx0XHRcdFx0XHRcdFx0ZnJvbS5vZmZzZXQgPSBnZXRWYWx1ZShmcm9tRW50cnksIFwib2Zmc2V0XCIsIDApICogZnJvbVNjYWxlO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0b0VudHJpZXMgPSBPYmplY3QuZW50cmllcyhnZXRWYWx1ZShmcm9tRW50cnksIFwidG9cIiwge30pKSBhcyBbc3RyaW5nLCBvYmplY3RdW107XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgW25hbWUsIHRvRW50cnldIG9mIHRvRW50cmllcykge1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0b1NjYWxlID0gMTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdG86IFRvUHJvcGVydHk7XG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChuYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicm90YXRlXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm90YXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG8gPSBuZXcgVG9Sb3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwieFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHggPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0byA9IG5ldyBUb1goKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG9TY2FsZSA9IHNjYWxlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ5XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0eSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvWSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0b1NjYWxlID0gc2NhbGU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxlWFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNjYWxlWCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2NhbGVYKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxlWVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNjYWxlWSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2NhbGVZKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNoZWFyWVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNoZWFyWSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2hlYXJZKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zZm9ybSBjb25zdHJhaW50IHRvIHByb3BlcnR5OiAke25hbWV9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRvLm9mZnNldCA9IGdldFZhbHVlKHRvRW50cnksIFwib2Zmc2V0XCIsIDApICogdG9TY2FsZTtcblx0XHRcdFx0XHRcdFx0XHR0by5tYXggPSBnZXRWYWx1ZSh0b0VudHJ5LCBcIm1heFwiLCAxKSAqIHRvU2NhbGU7XG5cdFx0XHRcdFx0XHRcdFx0dG8uc2NhbGUgPSBnZXRWYWx1ZSh0b0VudHJ5LCBcInNjYWxlXCIsIDEpICogdG9TY2FsZSAvIGZyb21TY2FsZTtcblx0XHRcdFx0XHRcdFx0XHRmcm9tLnRvLnB1c2godG8pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChmcm9tLnRvLmxlbmd0aCA+IDApIGRhdGEucHJvcGVydGllcy5wdXNoKGZyb20pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRkYXRhLm9mZnNldHNbVHJhbnNmb3JtQ29uc3RyYWludERhdGEuUk9UQVRJT05dID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0c1tUcmFuc2Zvcm1Db25zdHJhaW50RGF0YS5YXSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwieFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0ZGF0YS5vZmZzZXRzW1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhLlldID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdFx0XHRkYXRhLm9mZnNldHNbVHJhbnNmb3JtQ29uc3RyYWludERhdGEuU0NBTEVYXSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2NhbGVYXCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5vZmZzZXRzW1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhLlNDQUxFWV0gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNjYWxlWVwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0c1tUcmFuc2Zvcm1Db25zdHJhaW50RGF0YS5TSEVBUlldID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzaGVhcllcIiwgMCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNldHVwID0gZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdFx0XHRpZiAocm90YXRlKSBzZXR1cC5taXhSb3RhdGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFJvdGF0ZVwiLCAxKTtcblx0XHRcdFx0XHRcdGlmICh4KSBzZXR1cC5taXhYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhYXCIsIDEpO1xuXHRcdFx0XHRcdFx0aWYgKHkpIHNldHVwLm1peFkgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFlcIiwgc2V0dXAubWl4WCk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGVYKSBzZXR1cC5taXhTY2FsZVggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFNjYWxlWFwiLCAxKTtcblx0XHRcdFx0XHRcdGlmIChzY2FsZVkpIHNldHVwLm1peFNjYWxlWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4U2NhbGVZXCIsIHNldHVwLm1peFNjYWxlWCk7XG5cdFx0XHRcdFx0XHRpZiAoc2hlYXJZKSBzZXR1cC5taXhTaGVhclkgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFNoZWFyWVwiLCAxKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInBhdGhcIjoge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBQYXRoQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNvbnN0cmFpbnRNYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmVOYW1lID0gY29uc3RyYWludE1hcC5ib25lc1tpaV07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Ym9uZU5hbWV9IGZvciBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0XHRkYXRhLmJvbmVzLnB1c2goYm9uZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNsb3ROYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLnNsb3Q7XG5cdFx0XHRcdFx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRcdFx0XHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHNsb3QgJHtzbG90TmFtZX0gZm9yIHBhdGggY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnNsb3QgPSBzbG90O1xuXG5cdFx0XHRcdFx0XHRkYXRhLnBvc2l0aW9uTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShQb3NpdGlvbk1vZGUsIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwicG9zaXRpb25Nb2RlXCIsIFwiUGVyY2VudFwiKSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNwYWNpbmdNb2RlID0gVXRpbHMuZW51bVZhbHVlKFNwYWNpbmdNb2RlLCBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNwYWNpbmdNb2RlXCIsIFwiTGVuZ3RoXCIpKTtcblx0XHRcdFx0XHRcdGRhdGEucm90YXRlTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShSb3RhdGVNb2RlLCBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0ZU1vZGVcIiwgXCJUYW5nZW50XCIpKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0Um90YXRpb24gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0aW9uXCIsIDApO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0XHRcdHNldHVwLnBvc2l0aW9uID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJwb3NpdGlvblwiLCAwKTtcblx0XHRcdFx0XHRcdGlmIChkYXRhLnBvc2l0aW9uTW9kZSA9PT0gUG9zaXRpb25Nb2RlLkZpeGVkKSBzZXR1cC5wb3NpdGlvbiAqPSBzY2FsZTtcblx0XHRcdFx0XHRcdHNldHVwLnNwYWNpbmcgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNwYWNpbmdcIiwgMCk7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5zcGFjaW5nTW9kZSA9PT0gU3BhY2luZ01vZGUuTGVuZ3RoIHx8IGRhdGEuc3BhY2luZ01vZGUgPT09IFNwYWNpbmdNb2RlLkZpeGVkKSBzZXR1cC5zcGFjaW5nICo9IHNjYWxlO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4Um90YXRlID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5taXhYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhYXCIsIDEpO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4WSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4WVwiLCBzZXR1cC5taXhYKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInBoeXNpY3NcIjoge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYm9uZU5hbWU6IHN0cmluZyA9IGNvbnN0cmFpbnRNYXAuYm9uZTtcblx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKGJvbmUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBQaHlzaWNzIGJvbmUgbm90IGZvdW5kOiAke2JvbmVOYW1lfWApO1xuXHRcdFx0XHRcdFx0ZGF0YS5ib25lID0gYm9uZTtcblxuXHRcdFx0XHRcdFx0ZGF0YS54ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ4XCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS55ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ5XCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5yb3RhdGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0ZVwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEuc2NhbGVYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzY2FsZVhcIiwgMCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNjYWxlWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2NhbGVZXCIsIG51bGwpO1xuXHRcdFx0XHRcdFx0aWYgKHNjYWxlWSAhPSBudWxsKSBkYXRhLnNjYWxlWU1vZGUgPSBVdGlscy5lbnVtVmFsdWUoU2NhbGVZTW9kZSwgc2NhbGVZKTtcblxuXHRcdFx0XHRcdFx0ZGF0YS5zaGVhclggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNoZWFyWFwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEubGltaXQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImxpbWl0XCIsIDUwMDApICogc2NhbGU7XG5cdFx0XHRcdFx0XHRkYXRhLnN0ZXAgPSAxIC8gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJmcHNcIiwgNjApO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0XHRcdHNldHVwLmluZXJ0aWEgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImluZXJ0aWFcIiwgMC41KTtcblx0XHRcdFx0XHRcdHNldHVwLnN0cmVuZ3RoID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJlbmd0aFwiLCAxMDApO1xuXHRcdFx0XHRcdFx0c2V0dXAuZGFtcGluZyA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiZGFtcGluZ1wiLCAwLjg1KTtcblx0XHRcdFx0XHRcdHNldHVwLm1hc3NJbnZlcnNlID0gMSAvIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWFzc1wiLCAxKTtcblx0XHRcdFx0XHRcdHNldHVwLndpbmQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIndpbmRcIiwgMCk7XG5cdFx0XHRcdFx0XHRzZXR1cC5ncmF2aXR5ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJncmF2aXR5XCIsIDApO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhcIiwgMSk7XG5cdFx0XHRcdFx0XHRkYXRhLmluZXJ0aWFHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImluZXJ0aWFHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5zdHJlbmd0aEdsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic3RyZW5ndGhHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5kYW1waW5nR2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJkYW1waW5nR2xvYmFsXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdGRhdGEubWFzc0dsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWFzc0dsb2JhbFwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLndpbmRHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIndpbmRHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5ncmF2aXR5R2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJncmF2aXR5R2xvYmFsXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdGRhdGEubWl4R2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhHbG9iYWxcIiwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0XHRza2VsZXRvbkRhdGEuY29uc3RyYWludHMucHVzaChkYXRhKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYXNlIFwic2xpZGVyXCI6IHtcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgU2xpZGVyRGF0YShuYW1lKTtcblx0XHRcdFx0XHRcdGRhdGEuc2tpblJlcXVpcmVkID0gc2tpblJlcXVpcmVkO1xuXG5cdFx0XHRcdFx0XHRkYXRhLmFkZGl0aXZlID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJhZGRpdGl2ZVwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLmxvb3AgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImxvb3BcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5zZXR1cFBvc2UubWl4ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhcIiwgMSk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvbmVOYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLmJvbmU7XG5cdFx0XHRcdFx0XHRpZiAoYm9uZU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0ZGF0YS5ib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFkYXRhLmJvbmUpIHRocm93IG5ldyBFcnJvcihgU2xpZGVyIGJvbmUgbm90IGZvdW5kOiAke2JvbmVOYW1lfWApO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbnN0cmFpbnRNYXAucHJvcGVydHk7XG5cdFx0XHRcdFx0XHRcdGRhdGEucHJvcGVydHkgPSB0aGlzLmZyb21Qcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5U2NhbGUgPSB0aGlzLnByb3BlcnR5U2NhbGUocHJvcGVydHksIHNjYWxlKTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5wcm9wZXJ0eS5vZmZzZXQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImZyb21cIiwgMCkgKiBwcm9wZXJ0eVNjYWxlO1xuXHRcdFx0XHRcdFx0XHRkYXRhLm9mZnNldCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwidG9cIiwgMCk7XG5cdFx0XHRcdFx0XHRcdGRhdGEuc2NhbGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNjYWxlXCIsIDEpIC8gcHJvcGVydHlTY2FsZTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5tYXggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1heFwiLCAwKTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5sb2NhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2V0dXBQb3NlLnRpbWUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInRpbWVcIiwgMCk7XG5cblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTa2lucy5cblx0XHRpZiAocm9vdC5za2lucykge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByb290LnNraW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IHNraW5NYXAgPSByb290LnNraW5zW2ldXG5cdFx0XHRcdGNvbnN0IHNraW4gPSBuZXcgU2tpbihza2luTWFwLm5hbWUpO1xuXG5cdFx0XHRcdGlmIChza2luTWFwLmJvbmVzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBib25lTmFtZSA9IHNraW5NYXAuYm9uZXNbaWldO1xuXHRcdFx0XHRcdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShib25lTmFtZSk7XG5cdFx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Ym9uZU5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRcdHNraW4uYm9uZXMucHVzaChib25lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2tpbk1hcC5paykge1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBza2luTWFwLmlrLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludE5hbWUgPSBza2luTWFwLmlrW2lpXTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIElrQ29uc3RyYWludERhdGEpO1xuXHRcdFx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgSUsgY29uc3RyYWludCAke2NvbnN0cmFpbnROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRza2luLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNraW5NYXAudHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAudHJhbnNmb3JtLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludE5hbWUgPSBza2luTWFwLnRyYW5zZm9ybVtpaV07XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0cmFuc2Zvcm0gY29uc3RyYWludCAke2NvbnN0cmFpbnROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRza2luLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNraW5NYXAucGF0aCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBza2luTWFwLnBhdGgubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50TmFtZSA9IHNraW5NYXAucGF0aFtpaV07XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBQYXRoQ29uc3RyYWludERhdGEpO1xuXHRcdFx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgcGF0aCBjb25zdHJhaW50ICR7Y29uc3RyYWludE5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRcdHNraW4uY29uc3RyYWludHMucHVzaChjb25zdHJhaW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2tpbk1hcC5waHlzaWNzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAucGh5c2ljcy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC5waHlzaWNzW2lpXTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFBoeXNpY3NDb25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBwaHlzaWNzIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLnNsaWRlcikge1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBza2luTWFwLnNsaWRlci5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC5zbGlkZXJbaWldO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgU2xpZGVyRGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBzbGlkZXIgY29uc3RyYWludCAke2NvbnN0cmFpbnROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRza2luLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChjb25zdCBzbG90TmFtZSBpbiBza2luTWFwLmF0dGFjaG1lbnRzKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChzbG90TmFtZSk7XG5cdFx0XHRcdFx0aWYgKCFzbG90KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgc2tpbiBzbG90ICR7c2xvdE5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRjb25zdCBzbG90TWFwID0gc2tpbk1hcC5hdHRhY2htZW50c1tzbG90TmFtZV07XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlbnRyeU5hbWUgaW4gc2xvdE1hcCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IHRoaXMucmVhZEF0dGFjaG1lbnQoc2xvdE1hcFtlbnRyeU5hbWVdLCBza2luLCBzbG90LmluZGV4LCBlbnRyeU5hbWUsIHNrZWxldG9uRGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoYXR0YWNobWVudCkgc2tpbi5zZXRBdHRhY2htZW50KHNsb3QuaW5kZXgsIGVudHJ5TmFtZSwgYXR0YWNobWVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNrZWxldG9uRGF0YS5za2lucy5wdXNoKHNraW4pO1xuXHRcdFx0XHRpZiAoc2tpbi5uYW1lID09PSBcImRlZmF1bHRcIikgc2tlbGV0b25EYXRhLmRlZmF1bHRTa2luID0gc2tpbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBMaW5rZWQgbWVzaGVzLlxuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5saW5rZWRNZXNoZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBsaW5rZWRNZXNoID0gdGhpcy5saW5rZWRNZXNoZXNbaV07XG5cdFx0XHRjb25zdCBza2luID0gIWxpbmtlZE1lc2guc2tpbiA/IHNrZWxldG9uRGF0YS5kZWZhdWx0U2tpbiA6IHNrZWxldG9uRGF0YS5maW5kU2tpbihsaW5rZWRNZXNoLnNraW4pO1xuXHRcdFx0aWYgKCFza2luKSB0aHJvdyBuZXcgRXJyb3IoYFNraW4gbm90IGZvdW5kOiAke2xpbmtlZE1lc2guc2tpbn1gKTtcblx0XHRcdGNvbnN0IHNvdXJjZSA9IHNraW4uZ2V0QXR0YWNobWVudChsaW5rZWRNZXNoLnNvdXJjZUluZGV4LCBsaW5rZWRNZXNoLnNvdXJjZSk7XG5cdFx0XHRpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgbWVzaCBub3QgZm91bmQ6ICR7bGlua2VkTWVzaC5zb3VyY2V9YCk7XG5cdFx0XHRsaW5rZWRNZXNoLm1lc2gudGltZWxpbmVBdHRhY2htZW50ID0gbGlua2VkTWVzaC5pbmhlcml0VGltZWxpbmVzID8gc291cmNlIDogbGlua2VkTWVzaC5tZXNoO1xuXHRcdFx0bGlua2VkTWVzaC5tZXNoLnNldFNvdXJjZU1lc2goc291cmNlIGFzIE1lc2hBdHRhY2htZW50KTtcblx0XHRcdGxpbmtlZE1lc2gubWVzaC51cGRhdGVTZXF1ZW5jZSgpO1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbmZ1c2luZ0xhYmVsczogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdG91dGVyOlxuXHRcdFx0aWYgKGxpbmtlZE1lc2guaW5oZXJpdFRpbWVsaW5lcyAmJiBsaW5rZWRNZXNoLnNsb3RJbmRleCAhPT0gbGlua2VkTWVzaC5zb3VyY2VJbmRleCkge1xuXHRcdFx0XHRjb25zdCBzbG90cyA9IHNvdXJjZS50aW1lbGluZVNsb3RzO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGV4aXN0aW5nIG9mIHNsb3RzKVxuXHRcdFx0XHRcdGlmIChleGlzdGluZyA9PT0gbGlua2VkTWVzaC5zbG90SW5kZXgpIGJyZWFrIG91dGVyO1xuXHRcdFx0XHRjb25zdCBuZXdTbG90cyA9IFsuLi5zbG90c107XG5cdFx0XHRcdG5ld1Nsb3RzW3Nsb3RzLmxlbmd0aF0gPSBsaW5rZWRNZXNoLnNsb3RJbmRleDtcblx0XHRcdFx0c291cmNlLnRpbWVsaW5lU2xvdHMgPSBuZXdTbG90cztcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5saW5rZWRNZXNoZXMubGVuZ3RoID0gMDtcblxuXHRcdC8vIEV2ZW50cy5cblx0XHRpZiAocm9vdC5ldmVudHMpIHtcblx0XHRcdGZvciAoY29uc3QgZXZlbnROYW1lIGluIHJvb3QuZXZlbnRzKSB7XG5cdFx0XHRcdGNvbnN0IGV2ZW50TWFwID0gcm9vdC5ldmVudHNbZXZlbnROYW1lXTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBFdmVudERhdGEoZXZlbnROYW1lKTtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0c2V0dXAuaW50VmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJpbnRcIiwgMCk7XG5cdFx0XHRcdHNldHVwLmZsb2F0VmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJmbG9hdFwiLCAwKTtcblx0XHRcdFx0c2V0dXAuc3RyaW5nVmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJzdHJpbmdcIiwgXCJcIik7XG5cdFx0XHRcdGRhdGEuX2F1ZGlvUGF0aCA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImF1ZGlvXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoZGF0YS5hdWRpb1BhdGgpIHtcblx0XHRcdFx0XHRzZXR1cC52b2x1bWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJ2b2x1bWVcIiwgc2V0dXAudm9sdW1lKTtcblx0XHRcdFx0XHRzZXR1cC5iYWxhbmNlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiYmFsYW5jZVwiLCBzZXR1cC5iYWxhbmNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRza2VsZXRvbkRhdGEuZXZlbnRzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQW5pbWF0aW9ucy5cblx0XHRpZiAocm9vdC5hbmltYXRpb25zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGFuaW1hdGlvbk5hbWUgaW4gcm9vdC5hbmltYXRpb25zKSB7XG5cdFx0XHRcdGNvbnN0IGFuaW1hdGlvbk1hcCA9IHJvb3QuYW5pbWF0aW9uc1thbmltYXRpb25OYW1lXTtcblx0XHRcdFx0dGhpcy5yZWFkQW5pbWF0aW9uKGFuaW1hdGlvbk1hcCwgYW5pbWF0aW9uTmFtZSwgc2tlbGV0b25EYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTbGlkZXIgYW5pbWF0aW9ucy5cblx0XHRpZiAocm9vdC5jb25zdHJhaW50cykge1xuXHRcdFx0Zm9yIChjb25zdCBhbmltYXRpb25OYW1lIGluIHJvb3QuY29uc3RyYWludHMpIHtcblx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uTWFwID0gcm9vdC5jb25zdHJhaW50c1thbmltYXRpb25OYW1lXTtcblx0XHRcdFx0aWYgKGFuaW1hdGlvbk1hcC50eXBlID09PSBcInNsaWRlclwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChhbmltYXRpb25NYXAubmFtZSwgU2xpZGVyRGF0YSlcblx0XHRcdFx0XHRjb25zdCBhbmltYXRpb25OYW1lID0gYW5pbWF0aW9uTWFwLmFuaW1hdGlvbjtcblx0XHRcdFx0XHRjb25zdCBhbmltYXRpb24gPSBza2VsZXRvbkRhdGEuZmluZEFuaW1hdGlvbihhbmltYXRpb25OYW1lKTtcblx0XHRcdFx0XHRpZiAoIWFuaW1hdGlvbikgdGhyb3cgbmV3IEVycm9yKGBTbGlkZXIgYW5pbWF0aW9uIG5vdCBmb3VuZDogJHthbmltYXRpb25OYW1lfWApO1xuXHRcdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogcmVmZXJlbmNlIHJ1bnRpbWVcblx0XHRcdFx0XHRkYXRhIS5hbmltYXRpb24gPSBhbmltYXRpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc2tlbGV0b25EYXRhO1xuXHR9XG5cblx0cHJpdmF0ZSBmcm9tUHJvcGVydHkgKHR5cGU6IHN0cmluZyk6IEZyb21Qcm9wZXJ0eSB7XG5cdFx0bGV0IGZyb206IEZyb21Qcm9wZXJ0eTtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgXCJyb3RhdGVcIjogZnJvbSA9IG5ldyBGcm9tUm90YXRlKCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcInhcIjogZnJvbSA9IG5ldyBGcm9tWCgpOyBicmVhaztcblx0XHRcdGNhc2UgXCJ5XCI6IGZyb20gPSBuZXcgRnJvbVkoKTsgYnJlYWs7XG5cdFx0XHRjYXNlIFwic2NhbGVYXCI6IGZyb20gPSBuZXcgRnJvbVNjYWxlWCgpOyBicmVhaztcblx0XHRcdGNhc2UgXCJzY2FsZVlcIjogZnJvbSA9IG5ldyBGcm9tU2NhbGVZKCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcInNoZWFyWVwiOiBmcm9tID0gbmV3IEZyb21TaGVhclkoKTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHJhbnNmb3JtIGNvbnN0cmFpbnQgZnJvbSBwcm9wZXJ0eTogJHt0eXBlfWApO1xuXHRcdH1cblx0XHRyZXR1cm4gZnJvbTtcblx0fVxuXG5cdHByaXZhdGUgcHJvcGVydHlTY2FsZSAodHlwZTogc3RyaW5nLCBzY2FsZTogbnVtYmVyKSB7XG5cdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0XHRjYXNlIFwieFwiOlxuXHRcdFx0Y2FzZSBcInlcIjogcmV0dXJuIHNjYWxlO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIDE7XG5cdFx0fVxuXHR9XG5cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpdCBpcyBhbnkgdW50aWwgd2UgZGVmaW5lIGEgc2NoZW1hXG5cdHJlYWRBdHRhY2htZW50IChtYXA6IGFueSwgc2tpbjogU2tpbiwgc2xvdEluZGV4OiBudW1iZXIsIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHNrZWxldG9uRGF0YTogU2tlbGV0b25EYXRhKTogQXR0YWNobWVudCB8IG51bGwge1xuXHRcdGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZTtcblx0XHRjb25zdCBuYW1lID0gZ2V0VmFsdWUobWFwLCBcIm5hbWVcIiwgcGxhY2Vob2xkZXIpO1xuXG5cdFx0c3dpdGNoIChnZXRWYWx1ZShtYXAsIFwidHlwZVwiLCBcInJlZ2lvblwiKSkge1xuXHRcdFx0Y2FzZSBcInJlZ2lvblwiOiB7XG5cdFx0XHRcdGNvbnN0IHBhdGggPSBnZXRWYWx1ZShtYXAsIFwicGF0aFwiLCBuYW1lKTtcblx0XHRcdFx0Y29uc3Qgc2VxdWVuY2UgPSB0aGlzLnJlYWRTZXF1ZW5jZShnZXRWYWx1ZShtYXAsIFwic2VxdWVuY2VcIiwgbnVsbCkpO1xuXHRcdFx0XHRjb25zdCByZWdpb24gPSB0aGlzLmF0dGFjaG1lbnRMb2FkZXIubmV3UmVnaW9uQXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSwgcGF0aCwgc2VxdWVuY2UpO1xuXHRcdFx0XHRpZiAoIXJlZ2lvbikgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHJlZ2lvbi5wYXRoID0gcGF0aDtcblx0XHRcdFx0cmVnaW9uLnggPSBnZXRWYWx1ZShtYXAsIFwieFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRyZWdpb24ueSA9IGdldFZhbHVlKG1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHJlZ2lvbi5zY2FsZVggPSBnZXRWYWx1ZShtYXAsIFwic2NhbGVYXCIsIDEpO1xuXHRcdFx0XHRyZWdpb24uc2NhbGVZID0gZ2V0VmFsdWUobWFwLCBcInNjYWxlWVwiLCAxKTtcblx0XHRcdFx0cmVnaW9uLnJvdGF0aW9uID0gZ2V0VmFsdWUobWFwLCBcInJvdGF0aW9uXCIsIDApO1xuXHRcdFx0XHRyZWdpb24ud2lkdGggPSBtYXAud2lkdGggKiBzY2FsZTtcblx0XHRcdFx0cmVnaW9uLmhlaWdodCA9IG1hcC5oZWlnaHQgKiBzY2FsZTtcblxuXHRcdFx0XHRjb25zdCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIHJlZ2lvbi5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblxuXHRcdFx0XHRyZWdpb24udXBkYXRlU2VxdWVuY2UoKTtcblx0XHRcdFx0cmV0dXJuIHJlZ2lvbjtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJib3VuZGluZ2JveFwiOiB7XG5cdFx0XHRcdGNvbnN0IGJveCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdCb3VuZGluZ0JveEF0dGFjaG1lbnQoc2tpbiwgcGxhY2Vob2xkZXIsIG5hbWUpO1xuXHRcdFx0XHRpZiAoIWJveCkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHRoaXMucmVhZFZlcnRpY2VzKG1hcCwgYm94LCBtYXAudmVydGV4Q291bnQgPDwgMSk7XG5cdFx0XHRcdGNvbnN0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgYm94LmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXHRcdFx0XHRyZXR1cm4gYm94O1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIm1lc2hcIjpcblx0XHRcdGNhc2UgXCJsaW5rZWRtZXNoXCI6IHtcblx0XHRcdFx0Y29uc3QgcGF0aCA9IGdldFZhbHVlKG1hcCwgXCJwYXRoXCIsIG5hbWUpO1xuXHRcdFx0XHRjb25zdCBzZXF1ZW5jZSA9IHRoaXMucmVhZFNlcXVlbmNlKGdldFZhbHVlKG1hcCwgXCJzZXF1ZW5jZVwiLCBudWxsKSk7XG5cdFx0XHRcdGNvbnN0IG1lc2ggPSB0aGlzLmF0dGFjaG1lbnRMb2FkZXIubmV3TWVzaEF0dGFjaG1lbnQoc2tpbiwgcGxhY2Vob2xkZXIsIG5hbWUsIHBhdGgsIHNlcXVlbmNlKTtcblx0XHRcdFx0aWYgKCFtZXNoKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0bWVzaC5wYXRoID0gcGF0aDtcblxuXHRcdFx0XHRjb25zdCBjb2xvciA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBtZXNoLmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXG5cdFx0XHRcdG1lc2gud2lkdGggPSBnZXRWYWx1ZShtYXAsIFwid2lkdGhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0bWVzaC5oZWlnaHQgPSBnZXRWYWx1ZShtYXAsIFwiaGVpZ2h0XCIsIDApICogc2NhbGU7XG5cblx0XHRcdFx0Y29uc3Qgc291cmNlOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwic291cmNlXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoc291cmNlKSB7XG5cdFx0XHRcdFx0bGV0IHNvdXJjZUluZGV4ID0gc2xvdEluZGV4O1xuXHRcdFx0XHRcdGNvbnN0IHNsb3QgPSBnZXRWYWx1ZShtYXAsIFwic2xvdFwiLCBudWxsKTtcblx0XHRcdFx0XHRpZiAoc2xvdCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc291cmNlU2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChzbG90KTtcblx0XHRcdFx0XHRcdGlmICghc291cmNlU2xvdCkgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgbWVzaCBzbG90IG5vdCBmb3VuZDogJHtzbG90fWApO1xuXHRcdFx0XHRcdFx0c291cmNlSW5kZXggPSBzb3VyY2VTbG90LmluZGV4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmxpbmtlZE1lc2hlcy5wdXNoKG5ldyBMaW5rZWRNZXNoKG1lc2gsIGdldFZhbHVlKG1hcCwgXCJza2luXCIsIG51bGwpLCBzbG90SW5kZXgsIHNvdXJjZUluZGV4LCBzb3VyY2UsXG5cdFx0XHRcdFx0XHRnZXRWYWx1ZShtYXAsIFwidGltZWxpbmVzXCIsIHRydWUpKSk7XG5cdFx0XHRcdFx0cmV0dXJuIG1lc2g7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB1dnM6IEFycmF5PG51bWJlcj4gPSBtYXAudXZzO1xuXHRcdFx0XHR0aGlzLnJlYWRWZXJ0aWNlcyhtYXAsIG1lc2gsIHV2cy5sZW5ndGgpO1xuXHRcdFx0XHRtZXNoLnRyaWFuZ2xlcyA9IG1hcC50cmlhbmdsZXM7XG5cdFx0XHRcdG1lc2gucmVnaW9uVVZzID0gdXZzO1xuXG5cdFx0XHRcdG1lc2guZWRnZXMgPSBnZXRWYWx1ZShtYXAsIFwiZWRnZXNcIiwgbnVsbCk7XG5cdFx0XHRcdG1lc2guaHVsbExlbmd0aCA9IGdldFZhbHVlKG1hcCwgXCJodWxsXCIsIDApICogMjtcblx0XHRcdFx0bWVzaC51cGRhdGVTZXF1ZW5jZSgpO1xuXHRcdFx0XHRyZXR1cm4gbWVzaDtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwYXRoXCI6IHtcblx0XHRcdFx0Y29uc3QgcGF0aCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdQYXRoQXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSk7XG5cdFx0XHRcdGlmICghcGF0aCkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHBhdGguY2xvc2VkID0gZ2V0VmFsdWUobWFwLCBcImNsb3NlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdHBhdGguY29uc3RhbnRTcGVlZCA9IGdldFZhbHVlKG1hcCwgXCJjb25zdGFudFNwZWVkXCIsIHRydWUpO1xuXG5cdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gbWFwLnZlcnRleENvdW50O1xuXHRcdFx0XHR0aGlzLnJlYWRWZXJ0aWNlcyhtYXAsIHBhdGgsIHZlcnRleENvdW50IDw8IDEpO1xuXG5cdFx0XHRcdGNvbnN0IGxlbmd0aHM6IEFycmF5PG51bWJlcj4gPSBVdGlscy5uZXdBcnJheSh2ZXJ0ZXhDb3VudCAvIDMsIDApO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1hcC5sZW5ndGhzLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHRcdGxlbmd0aHNbaV0gPSBtYXAubGVuZ3Roc1tpXSAqIHNjYWxlO1xuXHRcdFx0XHRwYXRoLmxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgcGF0aC5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblx0XHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwicG9pbnRcIjoge1xuXHRcdFx0XHRjb25zdCBwb2ludCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdQb2ludEF0dGFjaG1lbnQoc2tpbiwgcGxhY2Vob2xkZXIsIG5hbWUpO1xuXHRcdFx0XHRpZiAoIXBvaW50KSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cG9pbnQueCA9IGdldFZhbHVlKG1hcCwgXCJ4XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHBvaW50LnkgPSBnZXRWYWx1ZShtYXAsIFwieVwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRwb2ludC5yb3RhdGlvbiA9IGdldFZhbHVlKG1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblxuXHRcdFx0XHRjb25zdCBjb2xvciA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBwb2ludC5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblx0XHRcdFx0cmV0dXJuIHBvaW50O1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcImNsaXBwaW5nXCI6IHtcblx0XHRcdFx0Y29uc3QgY2xpcCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdDbGlwcGluZ0F0dGFjaG1lbnQoc2tpbiwgcGxhY2Vob2xkZXIsIG5hbWUpO1xuXHRcdFx0XHRpZiAoIWNsaXApIHJldHVybiBudWxsO1xuXG5cdFx0XHRcdGNvbnN0IGVuZCA9IGdldFZhbHVlKG1hcCwgXCJlbmRcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChlbmQpIGNsaXAuZW5kU2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChlbmQpO1xuXG5cdFx0XHRcdGNsaXAuY29udmV4ID0gZ2V0VmFsdWUobWFwLCBcImNvbnZleFwiLCBmYWxzZSk7XG5cdFx0XHRcdGNsaXAuaW52ZXJzZSA9IGdldFZhbHVlKG1hcCwgXCJpbnZlcnNlXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRjb25zdCB2ZXJ0ZXhDb3VudCA9IG1hcC52ZXJ0ZXhDb3VudDtcblx0XHRcdFx0dGhpcy5yZWFkVmVydGljZXMobWFwLCBjbGlwLCB2ZXJ0ZXhDb3VudCA8PCAxKTtcblxuXHRcdFx0XHRjb25zdCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIGNsaXAuY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cdFx0XHRcdHJldHVybiBjbGlwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJlYWRTZXF1ZW5jZSAobWFwOiBvYmplY3QpIHtcblx0XHRpZiAobWFwID09IG51bGwpIHJldHVybiBuZXcgU2VxdWVuY2UoMSwgZmFsc2UpO1xuXHRcdGNvbnN0IHNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKGdldFZhbHVlKG1hcCwgXCJjb3VudFwiLCAwKSwgdHJ1ZSk7XG5cdFx0c2VxdWVuY2Uuc3RhcnQgPSBnZXRWYWx1ZShtYXAsIFwic3RhcnRcIiwgMSk7XG5cdFx0c2VxdWVuY2UuZGlnaXRzID0gZ2V0VmFsdWUobWFwLCBcImRpZ2l0c1wiLCAwKTtcblx0XHRzZXF1ZW5jZS5zZXR1cEluZGV4ID0gZ2V0VmFsdWUobWFwLCBcInNldHVwXCIsIDApO1xuXHRcdHJldHVybiBzZXF1ZW5jZTtcblx0fVxuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogaXQgaXMgYW55IHVudGlsIHdlIGRlZmluZSBhIHNjaGVtYVxuXHRyZWFkVmVydGljZXMgKG1hcDogYW55LCBhdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50LCB2ZXJ0aWNlc0xlbmd0aDogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgc2NhbGUgPSB0aGlzLnNjYWxlO1xuXHRcdGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCA9IHZlcnRpY2VzTGVuZ3RoO1xuXHRcdGNvbnN0IHZlcnRpY2VzOiBBcnJheTxudW1iZXI+ID0gbWFwLnZlcnRpY2VzO1xuXHRcdGlmICh2ZXJ0aWNlc0xlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBzY2FsZWRWZXJ0aWNlcyA9IFV0aWxzLnRvRmxvYXRBcnJheSh2ZXJ0aWNlcyk7XG5cdFx0XHRpZiAoc2NhbGUgIT09IDEpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRcdFx0c2NhbGVkVmVydGljZXNbaV0gKj0gc2NhbGU7XG5cdFx0XHR9XG5cdFx0XHRhdHRhY2htZW50LnZlcnRpY2VzID0gc2NhbGVkVmVydGljZXM7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHdlaWdodHM6IG51bWJlcltdID0gW107XG5cdFx0Y29uc3QgYm9uZXM6IG51bWJlcltdID0gW107XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBuOykge1xuXHRcdFx0Y29uc3QgYm9uZUNvdW50ID0gdmVydGljZXNbaSsrXTtcblx0XHRcdGJvbmVzLnB1c2goYm9uZUNvdW50KTtcblx0XHRcdGZvciAobGV0IG5uID0gaSArIGJvbmVDb3VudCAqIDQ7IGkgPCBubjsgaSArPSA0KSB7XG5cdFx0XHRcdGJvbmVzLnB1c2godmVydGljZXNbaV0pO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDFdICogc2NhbGUpO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDJdICogc2NhbGUpO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDNdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXR0YWNobWVudC5ib25lcyA9IGJvbmVzO1xuXHRcdGF0dGFjaG1lbnQudmVydGljZXMgPSBVdGlscy50b0Zsb2F0QXJyYXkod2VpZ2h0cyk7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGl0IGlzIGFueSB1bnRpbGUgd2UgZGVmaW5lIGEgc2NoZW1hXG5cdHJlYWRBbmltYXRpb24gKG1hcDogYW55LCBuYW1lOiBzdHJpbmcsIHNrZWxldG9uRGF0YTogU2tlbGV0b25EYXRhKSB7XG5cdFx0Y29uc3Qgc2NhbGUgPSB0aGlzLnNjYWxlO1xuXHRcdGNvbnN0IHRpbWVsaW5lczogVGltZWxpbmVbXSA9IFtdO1xuXG5cdFx0Ly8gU2xvdCB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5zbG90cykge1xuXHRcdFx0Zm9yIChjb25zdCBzbG90TmFtZSBpbiBtYXAuc2xvdHMpIHtcblx0XHRcdFx0Y29uc3Qgc2xvdE1hcCA9IG1hcC5zbG90c1tzbG90TmFtZV07XG5cdFx0XHRcdGNvbnN0IHNsb3QgPSBza2VsZXRvbkRhdGEuZmluZFNsb3Qoc2xvdE5hbWUpO1xuXHRcdFx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgU2xvdCBub3QgZm91bmQ6ICR7c2xvdE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IHNsb3RJbmRleCA9IHNsb3QuaW5kZXg7XG5cdFx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVOYW1lIGluIHNsb3RNYXApIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IHNsb3RNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRpZiAoIXRpbWVsaW5lTWFwKSBjb250aW51ZTtcblx0XHRcdFx0XHRjb25zdCBmcmFtZXMgPSB0aW1lbGluZU1hcC5sZW5ndGg7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKHRpbWVsaW5lTmFtZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcImF0dGFjaG1lbnRcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBBdHRhY2htZW50VGltZWxpbmUoZnJhbWVzLCBzbG90SW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDA7IGZyYW1lIDwgZnJhbWVzOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qga2V5TWFwID0gdGltZWxpbmVNYXBbZnJhbWVdO1xuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKSwgZ2V0VmFsdWUoa2V5TWFwLCBcIm5hbWVcIiwgbnVsbCkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwicmdiYVwiOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IFJHQkFUaW1lbGluZShmcmFtZXMsIGZyYW1lcyA8PCAyLCBzbG90SW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdGxldCBjb2xvciA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmNvbG9yKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBjb2xvci5hKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmNvbG9yKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCBjb2xvci5nLCBuZXdDb2xvci5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDIsIHRpbWUsIHRpbWUyLCBjb2xvci5iLCBuZXdDb2xvci5iLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBjb2xvci5hLCBuZXdDb2xvci5hLCAxKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdGNvbG9yID0gbmV3Q29sb3I7XG5cdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwicmdiXCI6IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUkdCVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgKiAzLCBzbG90SW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdGxldCBjb2xvciA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmNvbG9yKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmNvbG9yKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCBjb2xvci5nLCBuZXdDb2xvci5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDIsIHRpbWUsIHRpbWUyLCBjb2xvci5iLCBuZXdDb2xvci5iLCAxKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdGNvbG9yID0gbmV3Q29sb3I7XG5cdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwiYWxwaGFcIjoge1xuXHRcdFx0XHRcdFx0XHRyZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBBbHBoYVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBzbG90SW5kZXgpLCAwLCAxKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwicmdiYTJcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBSR0JBMlRpbWVsaW5lKGZyYW1lcywgZnJhbWVzICogNywgc2xvdEluZGV4KTtcblxuXHRcdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdGxldCBjb2xvciA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmxpZ2h0KTtcblx0XHRcdFx0XHRcdFx0bGV0IGNvbG9yMiA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmRhcmspO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmEsIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbG9yMiA9IENvbG9yLmZyb21TdHJpbmcobmV4dE1hcC5kYXJrKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCBjb2xvci5nLCBuZXdDb2xvci5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDIsIHRpbWUsIHRpbWUyLCBjb2xvci5iLCBuZXdDb2xvci5iLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBjb2xvci5hLCBuZXdDb2xvci5hLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDQsIHRpbWUsIHRpbWUyLCBjb2xvcjIuciwgbmV3Q29sb3IyLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgNSwgdGltZSwgdGltZTIsIGNvbG9yMi5nLCBuZXdDb2xvcjIuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA2LCB0aW1lLCB0aW1lMiwgY29sb3IyLmIsIG5ld0NvbG9yMi5iLCAxKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdGNvbG9yID0gbmV3Q29sb3I7XG5cdFx0XHRcdFx0XHRcdFx0Y29sb3IyID0gbmV3Q29sb3IyO1xuXHRcdFx0XHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y2FzZSBcInJnYjJcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBSR0IyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgKiA2LCBzbG90SW5kZXgpO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0XHRsZXQgY29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuZGFyayk7XG5cblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYik7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dE1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXdDb2xvciA9IENvbG9yLmZyb21TdHJpbmcobmV4dE1hcC5saWdodCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmRhcmspO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIGNvbG9yLnIsIG5ld0NvbG9yLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIGNvbG9yLmcsIG5ld0NvbG9yLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMywgdGltZSwgdGltZTIsIGNvbG9yMi5yLCBuZXdDb2xvcjIuciwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA0LCB0aW1lLCB0aW1lMiwgY29sb3IyLmcsIG5ld0NvbG9yMi5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDUsIHRpbWUsIHRpbWUyLCBjb2xvcjIuYiwgbmV3Q29sb3IyLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjIgPSBuZXdDb2xvcjI7XG5cdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZWxpbmUgdHlwZSBmb3IgYSBzbG90OiAke3RpbWVsaW5lTWFwLm5hbWV9ICgke3Nsb3RNYXAubmFtZX0pYCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQm9uZSB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5ib25lcykge1xuXHRcdFx0Zm9yIChjb25zdCBib25lTmFtZSBpbiBtYXAuYm9uZXMpIHtcblx0XHRcdFx0Y29uc3QgYm9uZU1hcCA9IG1hcC5ib25lc1tib25lTmFtZV07XG5cdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQm9uZSBub3QgZm91bmQ6ICR7Ym9uZU5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IGJvbmVJbmRleCA9IGJvbmUuaW5kZXg7XG5cdFx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVOYW1lIGluIGJvbmVNYXApIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IGJvbmVNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRjb25zdCBmcmFtZXMgPSB0aW1lbGluZU1hcC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGZyYW1lcyA9PT0gMCkgY29udGludWU7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKHRpbWVsaW5lTmFtZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcInJvdGF0ZVwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBSb3RhdGVUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInRyYW5zbGF0ZVwiOiByZWFkVGltZWxpbmUyKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBUcmFuc2xhdGVUaW1lbGluZShmcmFtZXMsIGZyYW1lcyA8PCAxLCBib25lSW5kZXgpLCBcInhcIiwgXCJ5XCIsIDAsIHNjYWxlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwidHJhbnNsYXRleFwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBUcmFuc2xhdGVYVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCksIDAsIHNjYWxlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwidHJhbnNsYXRleVwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBUcmFuc2xhdGVZVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCksIDAsIHNjYWxlKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwic2NhbGVcIjogcmVhZFRpbWVsaW5lMih0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCBuZXcgU2NhbGVUaW1lbGluZShmcmFtZXMsIGZyYW1lcyA8PCAxLCBib25lSW5kZXgpLCBcInhcIiwgXCJ5XCIsIDEsIDEpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsZXhcIjogcmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCBuZXcgU2NhbGVYVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCksIDEsIDEpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsZXlcIjogcmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCBuZXcgU2NhbGVZVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCksIDEsIDEpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJzaGVhclwiOiByZWFkVGltZWxpbmUyKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTaGVhclRpbWVsaW5lKGZyYW1lcywgZnJhbWVzIDw8IDEsIGJvbmVJbmRleCksIFwieFwiLCBcInlcIiwgMCwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInNoZWFyeFwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTaGVhclhUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInNoZWFyeVwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTaGVhcllUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcImluaGVyaXRcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBJbmhlcml0VGltZWxpbmUoZnJhbWVzLCBib25lLmluZGV4KTtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwOyBmcmFtZSA8IHRpbWVsaW5lTWFwLmxlbmd0aDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGcmFtZSA9IHRpbWVsaW5lTWFwW2ZyYW1lXTtcblx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZ2V0VmFsdWUoYUZyYW1lLCBcInRpbWVcIiwgMCksIFV0aWxzLmVudW1WYWx1ZShJbmhlcml0LCBnZXRWYWx1ZShhRnJhbWUsIFwiaW5oZXJpdFwiLCBcIk5vcm1hbFwiKSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZWxpbmUgdHlwZSBmb3IgYSBib25lOiAke3RpbWVsaW5lTWFwLm5hbWV9ICgke2JvbmVNYXAubmFtZX0pYCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJSyBjb25zdHJhaW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLmlrKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnROYW1lIGluIG1hcC5paykge1xuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50TWFwID0gbWFwLmlrW2NvbnN0cmFpbnROYW1lXTtcblx0XHRcdFx0bGV0IGtleU1hcCA9IGNvbnN0cmFpbnRNYXBbMF07XG5cdFx0XHRcdGlmICgha2V5TWFwKSBjb250aW51ZTtcblxuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBJa0NvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYElLIENvbnN0cmFpbnQgbm90IGZvdW5kOiAke2NvbnN0cmFpbnROYW1lfWApO1xuXHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBJa0NvbnN0cmFpbnRUaW1lbGluZShjb25zdHJhaW50TWFwLmxlbmd0aCwgY29uc3RyYWludE1hcC5sZW5ndGggPDwgMSxcblx0XHRcdFx0XHRza2VsZXRvbkRhdGEuY29uc3RyYWludHMuaW5kZXhPZihjb25zdHJhaW50KSk7XG5cblx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0bGV0IG1peCA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhcIiwgMSk7XG5cdFx0XHRcdGxldCBzb2Z0bmVzcyA9IGdldFZhbHVlKGtleU1hcCwgXCJzb2Z0bmVzc1wiLCAwKSAqIHNjYWxlO1xuXG5cdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIG1peCwgc29mdG5lc3MsIGdldFZhbHVlKGtleU1hcCwgXCJiZW5kUG9zaXRpdmVcIiwgdHJ1ZSkgPyAxIDogLTEsIGdldFZhbHVlKGtleU1hcCwgXCJjb21wcmVzc1wiLCBmYWxzZSksIGdldFZhbHVlKGtleU1hcCwgXCJzdHJldGNoXCIsIGZhbHNlKSk7XG5cdFx0XHRcdFx0Y29uc3QgbmV4dE1hcCA9IGNvbnN0cmFpbnRNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0Y29uc3QgbWl4MiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4XCIsIDEpO1xuXHRcdFx0XHRcdGNvbnN0IHNvZnRuZXNzMiA9IGdldFZhbHVlKG5leHRNYXAsIFwic29mdG5lc3NcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBtaXgsIG1peDIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIHNvZnRuZXNzLCBzb2Z0bmVzczIsIHNjYWxlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0bWl4ID0gbWl4Mjtcblx0XHRcdFx0XHRzb2Z0bmVzcyA9IHNvZnRuZXNzMjtcblx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUcmFuc2Zvcm0gY29uc3RyYWludCB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC50cmFuc2Zvcm0pIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE5hbWUgaW4gbWFwLnRyYW5zZm9ybSkge1xuXHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IG1hcC50cmFuc2Zvcm1bY29uc3RyYWludE5hbWVdO1xuXHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdGlmICgha2V5TWFwKSBjb250aW51ZTtcblxuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2Zvcm0gY29uc3RyYWludCBub3QgZm91bmQ6ICR7Y29uc3RyYWludE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IFRyYW5zZm9ybUNvbnN0cmFpbnRUaW1lbGluZSh0aW1lbGluZU1hcC5sZW5ndGgsIHRpbWVsaW5lTWFwLmxlbmd0aCAqIDYsXG5cdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCkpO1xuXG5cdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdGxldCBtaXhSb3RhdGUgPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRsZXQgbWl4WCA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhYXCIsIDEpLCBtaXhZID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFlcIiwgbWl4WCk7XG5cdFx0XHRcdGxldCBtaXhTY2FsZVggPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4U2NhbGVYXCIsIDEpLCBtaXhTY2FsZVkgPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4U2NhbGVZXCIsIDEpO1xuXHRcdFx0XHRsZXQgbWl4U2hlYXJZID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFNoZWFyWVwiLCAxKTtcblxuXHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBtaXhSb3RhdGUsIG1peFgsIG1peFksIG1peFNjYWxlWCwgbWl4U2NhbGVZLCBtaXhTaGVhclkpO1xuXHRcdFx0XHRcdGNvbnN0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRjb25zdCBtaXhSb3RhdGUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdFx0Y29uc3QgbWl4WDIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFhcIiwgMSksIG1peFkyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhZXCIsIG1peFgyKTtcblx0XHRcdFx0XHRjb25zdCBtaXhTY2FsZVgyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhTY2FsZVhcIiwgMSksIG1peFNjYWxlWTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFNjYWxlWVwiLCAxKTtcblx0XHRcdFx0XHRjb25zdCBtaXhTaGVhclkyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhTaGVhcllcIiwgMSk7XG5cdFx0XHRcdFx0Y29uc3QgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0aWYgKGN1cnZlKSB7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAwLCB0aW1lLCB0aW1lMiwgbWl4Um90YXRlLCBtaXhSb3RhdGUyLCAxKTtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCBtaXhYLCBtaXhYMiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAyLCB0aW1lLCB0aW1lMiwgbWl4WSwgbWl4WTIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMywgdGltZSwgdGltZTIsIG1peFNjYWxlWCwgbWl4U2NhbGVYMiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA0LCB0aW1lLCB0aW1lMiwgbWl4U2NhbGVZLCBtaXhTY2FsZVkyLCAxKTtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDUsIHRpbWUsIHRpbWUyLCBtaXhTaGVhclksIG1peFNoZWFyWTIsIDEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRtaXhSb3RhdGUgPSBtaXhSb3RhdGUyO1xuXHRcdFx0XHRcdG1peFggPSBtaXhYMjtcblx0XHRcdFx0XHRtaXhZID0gbWl4WTI7XG5cdFx0XHRcdFx0bWl4U2NhbGVYID0gbWl4U2NhbGVYMjtcblx0XHRcdFx0XHRtaXhTY2FsZVkgPSBtaXhTY2FsZVkyO1xuXHRcdFx0XHRcdG1peFNoZWFyWSA9IG1peFNoZWFyWTI7XG5cdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUGF0aCBjb25zdHJhaW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLnBhdGgpIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE5hbWUgaW4gbWFwLnBhdGgpIHtcblx0XHRcdFx0Y29uc3QgY29uc3RyYWludE1hcCA9IG1hcC5wYXRoW2NvbnN0cmFpbnROYW1lXTtcblx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgUGF0aENvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYFBhdGggY29uc3RyYWludCBub3QgZm91bmQ6ICR7Y29uc3RyYWludE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gc2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCk7XG5cdFx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVOYW1lIGluIGNvbnN0cmFpbnRNYXApIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IGNvbnN0cmFpbnRNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Y29uc3QgZnJhbWVzID0gdGltZWxpbmVNYXAubGVuZ3RoO1xuXHRcdFx0XHRcdHN3aXRjaCAodGltZWxpbmVOYW1lKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwicG9zaXRpb25cIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBQYXRoQ29uc3RyYWludFBvc2l0aW9uVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0cmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCB0aW1lbGluZSwgMCwgY29uc3RyYWludC5wb3NpdGlvbk1vZGUgPT09IFBvc2l0aW9uTW9kZS5GaXhlZCA/IHNjYWxlIDogMSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y2FzZSBcInNwYWNpbmdcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBQYXRoQ29uc3RyYWludFNwYWNpbmdUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRyZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIHRpbWVsaW5lLCAwLCBjb25zdHJhaW50LnNwYWNpbmdNb2RlID09PSBTcGFjaW5nTW9kZS5MZW5ndGggfHwgY29uc3RyYWludC5zcGFjaW5nTW9kZSA9PT0gU3BhY2luZ01vZGUuRml4ZWQgPyBzY2FsZSA6IDEpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJtaXhcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBQYXRoQ29uc3RyYWludE1peFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzICogMywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbWl4Um90YXRlID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFJvdGF0ZVwiLCAxKTtcblx0XHRcdFx0XHRcdFx0bGV0IG1peFggPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4WFwiLCAxKTtcblx0XHRcdFx0XHRcdFx0bGV0IG1peFkgPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4WVwiLCBtaXhYKTtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbWl4Um90YXRlLCBtaXhYLCBtaXhZKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1peFJvdGF0ZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFJvdGF0ZVwiLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtaXhYMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4WFwiLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtaXhZMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4WVwiLCBtaXhYMik7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGN1cnZlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAwLCB0aW1lLCB0aW1lMiwgbWl4Um90YXRlLCBtaXhSb3RhdGUyLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCBtaXhYLCBtaXhYMiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAyLCB0aW1lLCB0aW1lMiwgbWl4WSwgbWl4WTIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdFx0bWl4Um90YXRlID0gbWl4Um90YXRlMjtcblx0XHRcdFx0XHRcdFx0XHRtaXhYID0gbWl4WDI7XG5cdFx0XHRcdFx0XHRcdFx0bWl4WSA9IG1peFkyO1xuXHRcdFx0XHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQaHlzaWNzIGNvbnN0cmFpbnQgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAucGh5c2ljcykge1xuXHRcdFx0Zm9yIChjb25zdCBjb25zdHJhaW50TmFtZSBpbiBtYXAucGh5c2ljcykge1xuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50TWFwID0gbWFwLnBoeXNpY3NbY29uc3RyYWludE5hbWVdO1xuXHRcdFx0XHRsZXQgaW5kZXggPSAtMTtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnROYW1lLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBQaHlzaWNzQ29uc3RyYWludERhdGEpO1xuXHRcdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBQaHlzaWNzIGNvbnN0cmFpbnQgbm90IGZvdW5kOiAke2NvbnN0cmFpbnROYW1lfWApO1xuXHRcdFx0XHRcdGluZGV4ID0gc2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCB0aW1lbGluZU5hbWUgaW4gY29uc3RyYWludE1hcCkge1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lTWFwID0gY29uc3RyYWludE1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRpZiAoIWtleU1hcCkgY29udGludWU7XG5cblx0XHRcdFx0XHRjb25zdCBmcmFtZXMgPSB0aW1lbGluZU1hcC5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IHRpbWVsaW5lOiBDdXJ2ZVRpbWVsaW5lMTtcblx0XHRcdFx0XHRsZXQgZGVmYXVsdFZhbHVlID0gMDtcblx0XHRcdFx0XHRpZiAodGltZWxpbmVOYW1lID09PSBcInJlc2V0XCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc2V0VGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRSZXNldFRpbWVsaW5lKGZyYW1lcywgaW5kZXgpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwOyBrZXlNYXAgIT0gbnVsbDsga2V5TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXSwgZnJhbWUrKylcblx0XHRcdFx0XHRcdFx0cmVzZXRUaW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCkpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVzZXRUaW1lbGluZSk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c3dpdGNoICh0aW1lbGluZU5hbWUpIHtcblx0XHRcdFx0XHRcdGNhc2UgXCJpbmVydGlhXCI6IHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50SW5lcnRpYVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInN0cmVuZ3RoXCI6IHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50U3RyZW5ndGhUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJkYW1waW5nXCI6IHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50RGFtcGluZ1RpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm1hc3NcIjogdGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRNYXNzVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwid2luZFwiOiB0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludFdpbmRUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJncmF2aXR5XCI6IHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50R3Jhdml0eVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm1peFwiOiB7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZSA9IDE7XG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50TWl4VGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRkZWZhdWx0OiBjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCB0aW1lbGluZSwgZGVmYXVsdFZhbHVlLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNsaWRlciB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5zbGlkZXIpIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE5hbWUgaW4gbWFwLnNsaWRlcikge1xuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50TWFwID0gbWFwLnNsaWRlcltjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFNsaWRlckRhdGEpO1xuXHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgU2xpZGVyIG5vdCBmb3VuZDogJHtjb25zdHJhaW50TmFtZX1gKTtcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBza2VsZXRvbkRhdGEuY29uc3RyYWludHMuaW5kZXhPZihjb25zdHJhaW50KTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHRpbWVsaW5lTmFtZSBpbiBjb25zdHJhaW50TWFwKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGltZWxpbmVNYXAgPSBjb25zdHJhaW50TWFwW3RpbWVsaW5lTmFtZV07XG5cdFx0XHRcdFx0Y29uc3Qga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Y29uc3QgZnJhbWVzID0gdGltZWxpbmVNYXAubGVuZ3RoO1xuXHRcdFx0XHRcdHN3aXRjaCAodGltZWxpbmVOYW1lKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwidGltZVwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTbGlkZXJUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpLCAxLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwibWl4XCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFNsaWRlck1peFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCksIDEsIDEpOyBicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBdHRhY2htZW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLmF0dGFjaG1lbnRzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnRzTmFtZSBpbiBtYXAuYXR0YWNobWVudHMpIHtcblx0XHRcdFx0Y29uc3QgYXR0YWNobWVudHNNYXAgPSBtYXAuYXR0YWNobWVudHNbYXR0YWNobWVudHNOYW1lXTtcblx0XHRcdFx0Y29uc3Qgc2tpbiA9IHNrZWxldG9uRGF0YS5maW5kU2tpbihhdHRhY2htZW50c05hbWUpO1xuXHRcdFx0XHRpZiAoIXNraW4pIHRocm93IG5ldyBFcnJvcihgU2tpbiBub3QgZm91bmQ6ICR7YXR0YWNobWVudHNOYW1lfWApO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNsb3RNYXBOYW1lIGluIGF0dGFjaG1lbnRzTWFwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdE1hcCA9IGF0dGFjaG1lbnRzTWFwW3Nsb3RNYXBOYW1lXTtcblx0XHRcdFx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3RNYXBOYW1lKTtcblx0XHRcdFx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgQXR0YWNobWVudCBzbG90IG5vdCBmb3VuZDogJHtzbG90TWFwTmFtZX1gKTtcblx0XHRcdFx0XHRjb25zdCBzbG90SW5kZXggPSBzbG90LmluZGV4O1xuXHRcdFx0XHRcdGZvciAoY29uc3QgYXR0YWNobWVudE1hcE5hbWUgaW4gc2xvdE1hcCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudE1hcCA9IHNsb3RNYXBbYXR0YWNobWVudE1hcE5hbWVdO1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IDxWZXJ0ZXhBdHRhY2htZW50PnNraW4uZ2V0QXR0YWNobWVudChzbG90SW5kZXgsIGF0dGFjaG1lbnRNYXBOYW1lKTtcblx0XHRcdFx0XHRcdGlmICghYXR0YWNobWVudCkgdGhyb3cgbmV3IEVycm9yKGBUaW1lbGluZSBhdHRhY2htZW50IG5vdCBmb3VuZDogJHthdHRhY2htZW50TWFwTmFtZX1gKTtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCB0aW1lbGluZU1hcE5hbWUgaW4gYXR0YWNobWVudE1hcCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IGF0dGFjaG1lbnRNYXBbdGltZWxpbmVNYXBOYW1lXTtcblx0XHRcdFx0XHRcdFx0bGV0IGtleU1hcCA9IHRpbWVsaW5lTWFwWzBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWtleU1hcCkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRpbWVsaW5lTWFwTmFtZSA9PT0gXCJkZWZvcm1cIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHdlaWdodGVkID0gYXR0YWNobWVudC5ib25lcztcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB2ZXJ0aWNlcyA9IGF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZGVmb3JtTGVuZ3RoID0gd2VpZ2h0ZWQgPyB2ZXJ0aWNlcy5sZW5ndGggLyAzICogMiA6IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IERlZm9ybVRpbWVsaW5lKHRpbWVsaW5lTWFwLmxlbmd0aCwgdGltZWxpbmVNYXAubGVuZ3RoLCBzbG90SW5kZXgsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZWZvcm06IE51bWJlckFycmF5TGlrZTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHZlcnRpY2VzVmFsdWU6IEFycmF5PG51bWJlcj4gPSBnZXRWYWx1ZShrZXlNYXAsIFwidmVydGljZXNcIiwgbnVsbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXZlcnRpY2VzVmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZm9ybSA9IHdlaWdodGVkID8gVXRpbHMubmV3RmxvYXRBcnJheShkZWZvcm1MZW5ndGgpIDogdmVydGljZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtID0gVXRpbHMubmV3RmxvYXRBcnJheShkZWZvcm1MZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdGFydCA9IDxudW1iZXI+Z2V0VmFsdWUoa2V5TWFwLCBcIm9mZnNldFwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0VXRpbHMuYXJyYXlDb3B5KHZlcnRpY2VzVmFsdWUsIDAsIGRlZm9ybSwgc3RhcnQsIHZlcnRpY2VzVmFsdWUubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNjYWxlICE9PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IHN0YXJ0LCBuID0gaSArIHZlcnRpY2VzVmFsdWUubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICo9IHNjYWxlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghd2VpZ2h0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRlZm9ybUxlbmd0aDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IHZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBkZWZvcm0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dE1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkgYmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIDAsIDEsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTWFwTmFtZSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgU2VxdWVuY2VUaW1lbGluZSh0aW1lbGluZU1hcC5sZW5ndGgsIHNsb3RJbmRleCwgYXR0YWNobWVudCBhcyBBdHRhY2htZW50KTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgbGFzdERlbGF5ID0gMDtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDA7IGZyYW1lIDwgdGltZWxpbmVNYXAubGVuZ3RoOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkZWxheSA9IGdldFZhbHVlKGtleU1hcCwgXCJkZWxheVwiLCBsYXN0RGVsYXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbW9kZSA9IFNlcXVlbmNlTW9kZVtnZXRWYWx1ZShrZXlNYXAsIFwibW9kZVwiLCBcImhvbGRcIildIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBnZXRWYWx1ZShrZXlNYXAsIFwiaW5kZXhcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbW9kZSwgaW5kZXgsIGRlbGF5KTtcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3REZWxheSA9IGRlbGF5O1xuXHRcdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRHJhdyBvcmRlciB0aW1lbGluZS5cblx0XHRpZiAobWFwLmRyYXdPcmRlcikge1xuXHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgRHJhd09yZGVyVGltZWxpbmUobWFwLmRyYXdPcmRlci5sZW5ndGgpO1xuXHRcdFx0Y29uc3Qgc2xvdENvdW50ID0gc2tlbGV0b25EYXRhLnNsb3RzLmxlbmd0aDtcblx0XHRcdGxldCBmcmFtZSA9IDBcblx0XHRcdGZvciAoY29uc3QgZHJhd09yZGVyTWFwIG9mIChtYXAuZHJhd09yZGVyIGFzIERyYXdPcmRlcktleXNUeXBlW10pKSB7XG5cdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lKyssIGdldFZhbHVlKGRyYXdPcmRlck1hcCwgXCJ0aW1lXCIsIDApLCByZWFkRHJhd09yZGVyKHNrZWxldG9uRGF0YSwgZHJhd09yZGVyTWFwLCBzbG90Q291bnQsIG51bGwpKTtcblx0XHRcdH1cblx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHR9XG5cblx0XHQvLyBEcmF3IG9yZGVyIGZvbGRlciB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5kcmF3T3JkZXJGb2xkZXIpIHtcblx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVNYXAgb2YgbWFwLmRyYXdPcmRlckZvbGRlcikge1xuXHRcdFx0XHRjb25zdCBzbG90RW50cmllcyA9IGdldFZhbHVlKHRpbWVsaW5lTWFwLCBcInNsb3RzXCIsIFtdKSBhcyBzdHJpbmdbXTtcblx0XHRcdFx0Y29uc3QgZm9sZGVyU2xvdHMgPSBuZXcgQXJyYXk8bnVtYmVyPihzbG90RW50cmllcy5sZW5ndGgpO1xuXHRcdFx0XHRsZXQgaWkgPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNsb3RFbnRyeSBvZiBzbG90RW50cmllcykge1xuXHRcdFx0XHRcdGNvbnN0IHNsb3QgPSBza2VsZXRvbkRhdGEuZmluZFNsb3Qoc2xvdEVudHJ5KTtcblx0XHRcdFx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgRHJhdyBvcmRlciBmb2xkZXIgc2xvdCBub3QgZm91bmQ6ICR7c2xvdEVudHJ5fWApO1xuXHRcdFx0XHRcdGZvbGRlclNsb3RzW2lpKytdID0gc2xvdC5pbmRleDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGRyYXdPcmRlckZvbGRlckVudHJpZXMgPSBnZXRWYWx1ZSh0aW1lbGluZU1hcCwgXCJrZXlzXCIsIFtdKSBhcyBEcmF3T3JkZXJLZXlzVHlwZVtdO1xuXHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBEcmF3T3JkZXJGb2xkZXJUaW1lbGluZShkcmF3T3JkZXJGb2xkZXJFbnRyaWVzLmxlbmd0aCwgZm9sZGVyU2xvdHMsIHNrZWxldG9uRGF0YS5zbG90cy5sZW5ndGgpO1xuXHRcdFx0XHRsZXQgZnJhbWUgPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGRyYXdPcmRlckZvbGRlck1hcCBvZiBkcmF3T3JkZXJGb2xkZXJFbnRyaWVzKSB7XG5cdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUrKywgZ2V0VmFsdWUoZHJhd09yZGVyRm9sZGVyTWFwLCBcInRpbWVcIiwgMCksIHJlYWREcmF3T3JkZXIoc2tlbGV0b25EYXRhLCBkcmF3T3JkZXJGb2xkZXJNYXAsIGZvbGRlclNsb3RzLmxlbmd0aCwgZm9sZGVyU2xvdHMpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRXZlbnQgdGltZWxpbmUuXG5cdFx0aWYgKG1hcC5ldmVudHMpIHtcblx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IEV2ZW50VGltZWxpbmUobWFwLmV2ZW50cy5sZW5ndGgpO1xuXHRcdFx0bGV0IGZyYW1lID0gMDtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLmV2ZW50cy5sZW5ndGg7IGkrKywgZnJhbWUrKykge1xuXHRcdFx0XHRjb25zdCBldmVudE1hcCA9IG1hcC5ldmVudHNbaV07XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBza2VsZXRvbkRhdGEuZmluZEV2ZW50KGV2ZW50TWFwLm5hbWUpO1xuXHRcdFx0XHRpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgRXZlbnQgbm90IGZvdW5kOiAke2V2ZW50TWFwLm5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IHNldHVwID0gZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KFV0aWxzLnRvU2luZ2xlUHJlY2lzaW9uKGdldFZhbHVlKGV2ZW50TWFwLCBcInRpbWVcIiwgMCkpLCBkYXRhKTtcblx0XHRcdFx0ZXZlbnQuaW50VmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJpbnRcIiwgc2V0dXAuaW50VmFsdWUpO1xuXHRcdFx0XHRldmVudC5mbG9hdFZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiZmxvYXRcIiwgc2V0dXAuZmxvYXRWYWx1ZSk7XG5cdFx0XHRcdGV2ZW50LnN0cmluZ1ZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwic3RyaW5nXCIsIHNldHVwLnN0cmluZ1ZhbHVlKTtcblx0XHRcdFx0aWYgKGV2ZW50LmRhdGEuYXVkaW9QYXRoKSB7XG5cdFx0XHRcdFx0ZXZlbnQudm9sdW1lID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwidm9sdW1lXCIsIHNldHVwLnZvbHVtZSk7XG5cdFx0XHRcdFx0ZXZlbnQuYmFsYW5jZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImJhbGFuY2VcIiwgc2V0dXAudm9sdW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZXZlbnQpO1xuXHRcdFx0fVxuXHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdH1cblxuXHRcdGxldCBkdXJhdGlvbiA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aW1lbGluZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgdGltZWxpbmVzW2ldLmdldER1cmF0aW9uKCkpO1xuXG5cdFx0Y29uc3QgYW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbihuYW1lLCB0aW1lbGluZXMsIGR1cmF0aW9uKTtcblx0XHRjb25zdCBjb2xvciA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRpZiAoY29sb3IgIT09IG51bGwpIGFuaW1hdGlvbi5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblxuXHRcdHNrZWxldG9uRGF0YS5hbmltYXRpb25zLnB1c2goYW5pbWF0aW9uKTtcblx0fVxufVxuXG5jbGFzcyBMaW5rZWRNZXNoIHtcblx0c291cmNlOiBzdHJpbmc7IHNraW46IHN0cmluZztcblx0c2xvdEluZGV4OiBudW1iZXI7IHNvdXJjZUluZGV4OiBudW1iZXI7XG5cdG1lc2g6IE1lc2hBdHRhY2htZW50O1xuXHRpbmhlcml0VGltZWxpbmVzOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChtZXNoOiBNZXNoQXR0YWNobWVudCwgc2tpbjogc3RyaW5nLCBzbG90SW5kZXg6IG51bWJlciwgc291cmNlSW5kZXg6IG51bWJlciwgc291cmNlOiBzdHJpbmcsXG5cdFx0aW5oZXJpdFRpbWVsaW5lczogYm9vbGVhbikge1xuXHRcdHRoaXMubWVzaCA9IG1lc2g7XG5cdFx0dGhpcy5za2luID0gc2tpbjtcblx0XHR0aGlzLnNsb3RJbmRleCA9IHNsb3RJbmRleDtcblx0XHR0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7XG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdFx0dGhpcy5pbmhlcml0VGltZWxpbmVzID0gaW5oZXJpdFRpbWVsaW5lcztcblx0fVxufVxuXG50eXBlIEN1cnZlVHlwZSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgXCJzdGVwcGVkXCI7XG50eXBlIFRpbWVsaW5lMUtleXNUeXBlID0geyB2YWx1ZTogbnVtYmVyLCB0aW1lPzogbnVtYmVyLCBjdXJ2ZT86IEN1cnZlVHlwZSB9O1xudHlwZSBUaW1lbGluZTJLZXlzVHlwZSA9IFRpbWVsaW5lMUtleXNUeXBlICYgeyB4PzogbnVtYmVyLCB5PzogbnVtYmVyIH07XG5cbmZ1bmN0aW9uIHJlYWRUaW1lbGluZTEgKHRpbWVsaW5lczogQXJyYXk8VGltZWxpbmU+LCBrZXlzOiBUaW1lbGluZTFLZXlzVHlwZVtdLCB0aW1lbGluZTogQ3VydmVUaW1lbGluZTEsIGRlZmF1bHRWYWx1ZTogbnVtYmVyLCBzY2FsZTogbnVtYmVyKSB7XG5cdGxldCBrZXlNYXAgPSBrZXlzWzBdO1xuXHRsZXQgdGltZSA9IGtleU1hcC50aW1lID8/IDA7XG5cdGxldCB2YWx1ZSA9IChrZXlNYXAudmFsdWUgPz8gZGVmYXVsdFZhbHVlKSAqIHNjYWxlO1xuXHRsZXQgYmV6aWVyID0gMDtcblxuXHRmb3IgKGxldCBmcmFtZSA9IDA7IDsgZnJhbWUrKykge1xuXHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCB2YWx1ZSk7XG5cdFx0Y29uc3QgbmV4dE1hcCA9IGtleXNbZnJhbWUgKyAxXTtcblx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB0aW1lMiA9IG5leHRNYXAudGltZSA/PyAwO1xuXHRcdGNvbnN0IHZhbHVlMiA9IChuZXh0TWFwLnZhbHVlID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0XHRpZiAoa2V5TWFwLmN1cnZlKSBiZXppZXIgPSByZWFkQ3VydmUoa2V5TWFwLmN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIHZhbHVlLCB2YWx1ZTIsIHNjYWxlKTtcblx0XHR0aW1lID0gdGltZTI7XG5cdFx0dmFsdWUgPSB2YWx1ZTI7XG5cdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0fVxufVxuXG5mdW5jdGlvbiByZWFkVGltZWxpbmUyICh0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiwga2V5czogVGltZWxpbmUyS2V5c1R5cGVbXSwgdGltZWxpbmU6IEJvbmVUaW1lbGluZTIsIG5hbWUxOiBcInhcIiwgbmFtZTI6IFwieVwiLCBkZWZhdWx0VmFsdWU6IG51bWJlciwgc2NhbGU6IG51bWJlcikge1xuXHRsZXQga2V5TWFwID0ga2V5c1swXTtcblx0bGV0IHRpbWUgPSBrZXlNYXAudGltZSA/PyAwO1xuXHRsZXQgdmFsdWUxID0gKGtleU1hcFtuYW1lMV0gPz8gZGVmYXVsdFZhbHVlKSAqIHNjYWxlO1xuXHRsZXQgdmFsdWUyID0gKGtleU1hcFtuYW1lMl0gPz8gZGVmYXVsdFZhbHVlKSAqIHNjYWxlO1xuXHRsZXQgYmV6aWVyID0gMDtcblx0Zm9yIChsZXQgZnJhbWUgPSAwOyA7IGZyYW1lKyspIHtcblx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgdmFsdWUxLCB2YWx1ZTIpO1xuXHRcdGNvbnN0IG5leHRNYXAgPSBrZXlzW2ZyYW1lICsgMV07XG5cdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGltZTIgPSBuZXh0TWFwLnRpbWUgPz8gMDtcblx0XHRjb25zdCBudmFsdWUxID0gKG5leHRNYXBbbmFtZTFdID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0XHRjb25zdCBudmFsdWUyID0gKG5leHRNYXBbbmFtZTJdID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0XHRjb25zdCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRpZiAoY3VydmUpIHtcblx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCB2YWx1ZTEsIG52YWx1ZTEsIHNjYWxlKTtcblx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDEsIHRpbWUsIHRpbWUyLCB2YWx1ZTIsIG52YWx1ZTIsIHNjYWxlKTtcblx0XHR9XG5cdFx0dGltZSA9IHRpbWUyO1xuXHRcdHZhbHVlMSA9IG52YWx1ZTE7XG5cdFx0dmFsdWUyID0gbnZhbHVlMjtcblx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHR9XG59XG5cbnR5cGUgRHJhd09yZGVyS2V5c1R5cGUgPSB7IG9mZnNldHM/OiB7IHNsb3Q6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIgfVtdIH07XG5cbi8qKiBAcGFyYW0gZm9sZGVyU2xvdHMgU2xvdCBuYW1lcyBhcmUgcmVzb2x2ZWQgdG8gcG9zaXRpb25zIHdpdGhpbiB0aGlzIGFycmF5LiBJZiBudWxsLCBzbG90IGluZGljZXMgYXJlIHVzZWQgYXMgcG9zaXRpb25zLiAqL1xuZnVuY3Rpb24gcmVhZERyYXdPcmRlciAoc2tlbGV0b25EYXRhOiBTa2VsZXRvbkRhdGEsIGtleXM6IERyYXdPcmRlcktleXNUeXBlLCBzbG90Q291bnQ6IG51bWJlciwgZm9sZGVyU2xvdHM6IG51bWJlcltdIHwgbnVsbCk6IG51bWJlcltdIHwgbnVsbCB7XG5cdGNvbnN0IGNoYW5nZXMgPSBrZXlzLm9mZnNldHM7XG5cdGlmICghY2hhbmdlcykgcmV0dXJuIG51bGw7IC8vIFNldHVwIGRyYXcgb3JkZXIuXG5cdGNvbnN0IGRyYXdPcmRlciA9IG5ldyBBcnJheTxudW1iZXI+KHNsb3RDb3VudCkuZmlsbCgtMSk7XG5cdGNvbnN0IHVuY2hhbmdlZCA9IG5ldyBBcnJheTxudW1iZXI+KHNsb3RDb3VudCAtIGNoYW5nZXMubGVuZ3RoKTtcblx0bGV0IG9yaWdpbmFsSW5kZXggPSAwLCB1bmNoYW5nZWRJbmRleCA9IDA7XG5cdGZvciAoY29uc3Qgb2Zmc2V0TWFwIG9mIGNoYW5nZXMpIHtcblx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KG9mZnNldE1hcC5zbG90KTtcblx0XHRpZiAoc2xvdCA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYERyYXcgb3JkZXIgc2xvdCBub3QgZm91bmQ6ICR7b2Zmc2V0TWFwLnNsb3R9YCk7XG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRpZiAoIWZvbGRlclNsb3RzKVxuXHRcdFx0aW5kZXggPSBzbG90LmluZGV4O1xuXHRcdGVsc2Uge1xuXHRcdFx0aW5kZXggPSAtMTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdENvdW50OyBpKyspIHtcblx0XHRcdFx0aWYgKGZvbGRlclNsb3RzW2ldID09PSBzbG90LmluZGV4KSB7XG5cdFx0XHRcdFx0aW5kZXggPSBpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoYFNsb3Qgbm90IGluIGZvbGRlcjogJHtvZmZzZXRNYXAuc2xvdH1gKTtcblx0XHR9XG5cdFx0Ly8gQ29sbGVjdCB1bmNoYW5nZWQgaXRlbXMuXG5cdFx0d2hpbGUgKG9yaWdpbmFsSW5kZXggIT09IGluZGV4KVxuXHRcdFx0dW5jaGFuZ2VkW3VuY2hhbmdlZEluZGV4KytdID0gb3JpZ2luYWxJbmRleCsrO1xuXHRcdC8vIFNldCBjaGFuZ2VkIGl0ZW1zLlxuXHRcdGRyYXdPcmRlcltvcmlnaW5hbEluZGV4ICsgb2Zmc2V0TWFwLm9mZnNldF0gPSBvcmlnaW5hbEluZGV4Kys7XG5cdH1cblx0Ly8gQ29sbGVjdCByZW1haW5pbmcgdW5jaGFuZ2VkIGl0ZW1zLlxuXHR3aGlsZSAob3JpZ2luYWxJbmRleCA8IHNsb3RDb3VudClcblx0XHR1bmNoYW5nZWRbdW5jaGFuZ2VkSW5kZXgrK10gPSBvcmlnaW5hbEluZGV4Kys7XG5cdC8vIEZpbGwgaW4gdW5jaGFuZ2VkIGl0ZW1zLlxuXHRmb3IgKGxldCBpID0gc2xvdENvdW50IC0gMTsgaSA+PSAwOyBpLS0pXG5cdFx0aWYgKGRyYXdPcmRlcltpXSA9PT0gLTEpIGRyYXdPcmRlcltpXSA9IHVuY2hhbmdlZFstLXVuY2hhbmdlZEluZGV4XTtcblx0cmV0dXJuIGRyYXdPcmRlcjtcbn1cblxuZnVuY3Rpb24gcmVhZEN1cnZlIChjdXJ2ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBcInN0ZXBwZWRcIiwgdGltZWxpbmU6IEN1cnZlVGltZWxpbmUsIGJlemllcjogbnVtYmVyLCBmcmFtZTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyLCB0aW1lMTogbnVtYmVyLCB0aW1lMjogbnVtYmVyLFxuXHR2YWx1ZTE6IG51bWJlciwgdmFsdWUyOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpIHtcblx0aWYgKGN1cnZlID09PSBcInN0ZXBwZWRcIikge1xuXHRcdHRpbWVsaW5lLnNldFN0ZXBwZWQoZnJhbWUpO1xuXHRcdHJldHVybiBiZXppZXI7XG5cdH1cblx0Y29uc3QgaSA9IHZhbHVlIDw8IDI7XG5cdGNvbnN0IGN4MSA9IGN1cnZlW2ldO1xuXHRjb25zdCBjeTEgPSBjdXJ2ZVtpICsgMV0gKiBzY2FsZTtcblx0Y29uc3QgY3gyID0gY3VydmVbaSArIDJdO1xuXHRjb25zdCBjeTIgPSBjdXJ2ZVtpICsgM10gKiBzY2FsZTtcblx0dGltZWxpbmUuc2V0QmV6aWVyKGJlemllciwgZnJhbWUsIHZhbHVlLCB0aW1lMSwgdmFsdWUxLCBjeDEsIGN5MSwgY3gyLCBjeTIsIHRpbWUyLCB2YWx1ZTIpO1xuXHRyZXR1cm4gYmV6aWVyICsgMTtcbn1cblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpdCBpcyBhbnkgdW50aWwgd2UgZGVmaW5lIGEgc2NoZW1hXG5mdW5jdGlvbiBnZXRWYWx1ZSAobWFwOiBhbnksIHByb3BlcnR5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55KSB7XG5cdHJldHVybiBtYXBbcHJvcGVydHldICE9PSB1bmRlZmluZWQgPyBtYXBbcHJvcGVydHldIDogZGVmYXVsdFZhbHVlO1xufVxuIl19