UNPKG

@esotericsoftware/spine-core

Version:
115 lines 18.3 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { DrawOrderFolderTimeline, DrawOrderTimeline, isConstraintTimeline, isSlotTimeline, MixFrom, PhysicsConstraintTimeline } from "./Animation.js"; import { Constraint } from "./Constraint.js"; import { SliderPose } from "./SliderPose.js"; /** Applies an animation based on either the slider's {@link SliderPose.time} or a bone's transform property. * * See <a href="https://esotericsoftware.com/spine-sliders">Sliders</a> in the Spine User Guide. */ export class Slider extends Constraint { static offsets = [0, 0, 0, 0, 0, 0]; /** When set, the bone's transform property is used to set the slider's {@link SliderPose.time}. */ bone = null; constructor(data, skeleton) { super(data, new SliderPose(), new SliderPose()); if (!skeleton) throw new Error("skeleton cannot be null."); if (data.bone != null) this.bone = skeleton.bones[data.bone.index]; } copy(skeleton) { var copy = new Slider(this.data, skeleton); copy.pose.set(this.pose); return copy; } update(skeleton, physics) { const p = this.appliedPose; if (p.mix === 0) return; const data = this.data, animation = data.animation, bone = this.bone; if (bone !== null) { if (!bone.active) return; if (data.local) bone.appliedPose.validateLocalTransform(skeleton); p.time = data.offset + (data.property.value(skeleton, bone.appliedPose, data.local, Slider.offsets) - data.property.offset) * data.scale; if (data.loop) p.time = animation.duration + (p.time % animation.duration); else p.time = Math.max(0, p.time); } const bones = skeleton.bones; const indices = animation.bones; for (let i = 0, n = animation.bones.length; i < n; i++) bones[indices[i]].appliedPose.modifyLocal(skeleton); animation.apply(skeleton, p.time, p.time, data.loop, null, p.mix, MixFrom.current, data.additive, false, true); } sort(skeleton) { const bone = this.bone; const data = this.data; if (bone && !data.local) skeleton.sortBone(bone); skeleton._updateCache.push(this); const bones = skeleton.bones; const indices = data.animation.bones; for (let i = 0, n = data.animation.bones.length; i < n; i++) { const bone = bones[indices[i]]; bone.sorted = false; skeleton.sortReset(bone.children); skeleton.constrained(bone); } const timelines = data.animation.timelines; const slots = skeleton.slots; const constraints = skeleton.constraints; const physics = skeleton.physics; const physicsCount = skeleton.physics.length; for (let i = 0, n = data.animation.timelines.length; i < n; i++) { const t = timelines[i]; if (isSlotTimeline(t)) skeleton.constrained(slots[t.slotIndex]); else if (t instanceof DrawOrderTimeline || t instanceof DrawOrderFolderTimeline) skeleton.drawOrder.constrained(); else if (t instanceof PhysicsConstraintTimeline) { if (t.constraintIndex === -1) { for (let ii = 0; ii < physicsCount; ii++) skeleton.constrained(physics[ii]); } else skeleton.constrained(constraints[t.constraintIndex]); } else if (isConstraintTimeline(t)) { const constraintIndex = t.constraintIndex; if (constraintIndex !== -1) skeleton.constrained(constraints[constraintIndex]); } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NsaWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0SixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDOzttR0FFbUc7QUFDbkcsTUFBTSxPQUFPLE1BQU8sU0FBUSxVQUEwQztJQUM3RCxNQUFNLENBQVUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVyRCxtR0FBbUc7SUFDbkcsSUFBSSxHQUFnQixJQUFJLENBQUM7SUFFekIsWUFBYSxJQUFnQixFQUFFLFFBQWtCO1FBQ2hELEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUUsRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFFM0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU0sSUFBSSxDQUFFLFFBQWtCO1FBQzlCLElBQUksSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0MsSUFB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SyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxFQUFFLEVBQUU7d0JBQ3ZDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7O29CQUNBLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7aUJBQU0sSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDO2dCQUMxQyxJQUFJLGVBQWUsS0FBSyxDQUFDLENBQUM7b0JBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNoRixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERyYXdPcmRlckZvbGRlclRpbWVsaW5lLCBEcmF3T3JkZXJUaW1lbGluZSwgaXNDb25zdHJhaW50VGltZWxpbmUsIGlzU2xvdFRpbWVsaW5lLCBNaXhGcm9tLCBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lIH0gZnJvbSBcIi4vQW5pbWF0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmUgfSBmcm9tIFwiLi9Cb25lLmpzXCI7XG5pbXBvcnQgeyBDb25zdHJhaW50IH0gZnJvbSBcIi4vQ29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQaHlzaWNzIH0gZnJvbSBcIi4vUGh5c2ljcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsaWRlckRhdGEgfSBmcm9tIFwiLi9TbGlkZXJEYXRhLmpzXCI7XG5pbXBvcnQgeyBTbGlkZXJQb3NlIH0gZnJvbSBcIi4vU2xpZGVyUG9zZS5qc1wiO1xuXG4vKiogQXBwbGllcyBhbiBhbmltYXRpb24gYmFzZWQgb24gZWl0aGVyIHRoZSBzbGlkZXIncyB7QGxpbmsgU2xpZGVyUG9zZS50aW1lfSBvciBhIGJvbmUncyB0cmFuc2Zvcm0gcHJvcGVydHkuXG4gKlxuICogU2VlIDxhIGhyZWY9XCJodHRwczovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXNsaWRlcnNcIj5TbGlkZXJzPC9hPiBpbiB0aGUgU3BpbmUgVXNlciBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkZXIgZXh0ZW5kcyBDb25zdHJhaW50PFNsaWRlciwgU2xpZGVyRGF0YSwgU2xpZGVyUG9zZT4ge1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSBvZmZzZXRzID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuXG5cdC8qKiBXaGVuIHNldCwgdGhlIGJvbmUncyB0cmFuc2Zvcm0gcHJvcGVydHkgaXMgdXNlZCB0byBzZXQgdGhlIHNsaWRlcidzIHtAbGluayBTbGlkZXJQb3NlLnRpbWV9LiAqL1xuXHRib25lOiBCb25lIHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKGRhdGE6IFNsaWRlckRhdGEsIHNrZWxldG9uOiBTa2VsZXRvbikge1xuXHRcdHN1cGVyKGRhdGEsIG5ldyBTbGlkZXJQb3NlKCksIG5ldyBTbGlkZXJQb3NlKCkpO1xuXHRcdGlmICghc2tlbGV0b24pIHRocm93IG5ldyBFcnJvcihcInNrZWxldG9uIGNhbm5vdCBiZSBudWxsLlwiKTtcblxuXHRcdGlmIChkYXRhLmJvbmUgIT0gbnVsbCkgdGhpcy5ib25lID0gc2tlbGV0b24uYm9uZXNbZGF0YS5ib25lLmluZGV4XTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5IChza2VsZXRvbjogU2tlbGV0b24pIHtcblx0XHR2YXIgY29weSA9IG5ldyBTbGlkZXIodGhpcy5kYXRhLCBza2VsZXRvbik7XG5cdFx0Y29weS5wb3NlLnNldCh0aGlzLnBvc2UpO1xuXHRcdHJldHVybiBjb3B5O1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZSAoc2tlbGV0b246IFNrZWxldG9uLCBwaHlzaWNzOiBQaHlzaWNzKSB7XG5cdFx0Y29uc3QgcCA9IHRoaXMuYXBwbGllZFBvc2U7XG5cdFx0aWYgKHAubWl4ID09PSAwKSByZXR1cm47XG5cblx0XHRjb25zdCBkYXRhID0gdGhpcy5kYXRhLCBhbmltYXRpb24gPSBkYXRhLmFuaW1hdGlvbiwgYm9uZSA9IHRoaXMuYm9uZTtcblx0XHRpZiAoYm9uZSAhPT0gbnVsbCkge1xuXHRcdFx0aWYgKCFib25lLmFjdGl2ZSkgcmV0dXJuO1xuXHRcdFx0aWYgKGRhdGEubG9jYWwpIGJvbmUuYXBwbGllZFBvc2UudmFsaWRhdGVMb2NhbFRyYW5zZm9ybShza2VsZXRvbik7XG5cdFx0XHRwLnRpbWUgPSBkYXRhLm9mZnNldFxuXHRcdFx0XHQrIChkYXRhLnByb3BlcnR5LnZhbHVlKHNrZWxldG9uLCBib25lLmFwcGxpZWRQb3NlLCBkYXRhLmxvY2FsLCBTbGlkZXIub2Zmc2V0cykgLSBkYXRhLnByb3BlcnR5Lm9mZnNldCkgKiBkYXRhLnNjYWxlO1xuXHRcdFx0aWYgKGRhdGEubG9vcClcblx0XHRcdFx0cC50aW1lID0gYW5pbWF0aW9uLmR1cmF0aW9uICsgKHAudGltZSAlIGFuaW1hdGlvbi5kdXJhdGlvbik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHAudGltZSA9IE1hdGgubWF4KDAsIHAudGltZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblx0XHRjb25zdCBpbmRpY2VzID0gYW5pbWF0aW9uLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYW5pbWF0aW9uLmJvbmVzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGJvbmVzW2luZGljZXNbaV1dLmFwcGxpZWRQb3NlLm1vZGlmeUxvY2FsKHNrZWxldG9uKTtcblxuXHRcdGFuaW1hdGlvbi5hcHBseShza2VsZXRvbiwgcC50aW1lLCBwLnRpbWUsIGRhdGEubG9vcCwgbnVsbCwgcC5taXgsIE1peEZyb20uY3VycmVudCwgZGF0YS5hZGRpdGl2ZSwgZmFsc2UsIHRydWUpO1xuXHR9XG5cblx0c29ydCAoc2tlbGV0b246IFNrZWxldG9uKSB7XG5cdFx0Y29uc3QgYm9uZSA9IHRoaXMuYm9uZTtcblx0XHRjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHRcdGlmIChib25lICYmICFkYXRhLmxvY2FsKSBza2VsZXRvbi5zb3J0Qm9uZShib25lKTtcblx0XHRza2VsZXRvbi5fdXBkYXRlQ2FjaGUucHVzaCh0aGlzKTtcblxuXHRcdGNvbnN0IGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cdFx0Y29uc3QgaW5kaWNlcyA9IGRhdGEuYW5pbWF0aW9uLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZGF0YS5hbmltYXRpb24uYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbaW5kaWNlc1tpXV07XG5cdFx0XHRib25lLnNvcnRlZCA9IGZhbHNlO1xuXHRcdFx0c2tlbGV0b24uc29ydFJlc2V0KGJvbmUuY2hpbGRyZW4pO1xuXHRcdFx0c2tlbGV0b24uY29uc3RyYWluZWQoYm9uZSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGltZWxpbmVzID0gZGF0YS5hbmltYXRpb24udGltZWxpbmVzO1xuXHRcdGNvbnN0IHNsb3RzID0gc2tlbGV0b24uc2xvdHM7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSBza2VsZXRvbi5jb25zdHJhaW50cztcblx0XHRjb25zdCBwaHlzaWNzID0gc2tlbGV0b24ucGh5c2ljcztcblx0XHRjb25zdCBwaHlzaWNzQ291bnQgPSBza2VsZXRvbi5waHlzaWNzLmxlbmd0aDtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGRhdGEuYW5pbWF0aW9uLnRpbWVsaW5lcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IHQgPSB0aW1lbGluZXNbaV07XG5cdFx0XHRpZiAoaXNTbG90VGltZWxpbmUodCkpXG5cdFx0XHRcdHNrZWxldG9uLmNvbnN0cmFpbmVkKHNsb3RzW3Quc2xvdEluZGV4XSk7XG5cdFx0XHRlbHNlIGlmICh0IGluc3RhbmNlb2YgRHJhd09yZGVyVGltZWxpbmUgfHwgdCBpbnN0YW5jZW9mIERyYXdPcmRlckZvbGRlclRpbWVsaW5lKVxuXHRcdFx0XHRza2VsZXRvbi5kcmF3T3JkZXIuY29uc3RyYWluZWQoKTtcblx0XHRcdGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBQaHlzaWNzQ29uc3RyYWludFRpbWVsaW5lKSB7XG5cdFx0XHRcdGlmICh0LmNvbnN0cmFpbnRJbmRleCA9PT0gLTEpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGh5c2ljc0NvdW50OyBpaSsrKVxuXHRcdFx0XHRcdFx0c2tlbGV0b24uY29uc3RyYWluZWQocGh5c2ljc1tpaV0pO1xuXHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRza2VsZXRvbi5jb25zdHJhaW5lZChjb25zdHJhaW50c1t0LmNvbnN0cmFpbnRJbmRleF0pO1xuXHRcdFx0fSBlbHNlIGlmIChpc0NvbnN0cmFpbnRUaW1lbGluZSh0KSkge1xuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50SW5kZXggPSB0LmNvbnN0cmFpbnRJbmRleDtcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnRJbmRleCAhPT0gLTEpIHNrZWxldG9uLmNvbnN0cmFpbmVkKGNvbnN0cmFpbnRzW2NvbnN0cmFpbnRJbmRleF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIl19