@esotericsoftware/spine-core
Version:
The official Spine Runtimes for the web.
167 lines • 24.3 kB
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 { SliderData } from "./SliderData.js";
/** Stores the setup pose and all of the stateless data for a skeleton.
*
* See [Data objects](http://esotericsoftware.com/spine-runtime-architecture#Data-objects) in the Spine Runtimes
* Guide. */
export class SkeletonData {
/** The skeleton's name, which by default is the name of the skeleton data file, if possible. May be null. */
name = null;
/** The skeleton's bones, sorted parent first. The root bone is always the first bone. */
bones = []; // Ordered parents first.
/** The skeleton's slots in the setup pose draw order. */
slots = []; // Setup pose draw order.
skins = [];
/** The skeleton's default skin. By default this skin contains all attachments that were not in a skin in Spine.
*
* See {@link Skeleton.getAttachmentByName}.
* May be null. */
defaultSkin = null;
/** The skeleton's events. */
events = [];
/** The skeleton's animations. */
animations = [];
/** The skeleton's IK constraints. */
// biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
constraints = [];
/** The X coordinate of the skeleton's axis aligned bounding box in the setup pose. */
x = 0;
/** The Y coordinate of the skeleton's axis aligned bounding box in the setup pose. */
y = 0;
/** The width of the skeleton's axis aligned bounding box in the setup pose. */
width = 0;
/** The height of the skeleton's axis aligned bounding box in the setup pose. */
height = 0;
/** Baseline scale factor for applying distance-dependent effects on non-scalable properties, such as angle or scale. Default
* is 100. */
referenceScale = 100;
/** The Spine version used to export the skeleton data, or null. */
version = null;
/** The skeleton data hash. This value will change if any of the skeleton data has changed. May be null. */
hash = null;
// Nonessential
/** The dopesheet FPS in Spine. Available only when nonessential data was exported. */
fps = 30;
/** The path to the images folder as defined in Spine. Available only when nonessential data was exported. May be null. */
imagesPath = null;
/** The path to the audio folder as defined in Spine. Available only when nonessential data was exported. May be null. */
audioPath = null;
/** Finds a bone by comparing each bone's name. It is more efficient to cache the results of this method than to call it
* multiple times.
* @returns May be null. */
findBone(boneName) {
if (!boneName)
throw new Error("boneName cannot be null.");
const bones = this.bones;
for (let i = 0, n = bones.length; i < n; i++)
if (bones[i].name === boneName)
return bones[i];
return null;
}
/** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it
* multiple times.
* @returns May be null. */
findSlot(slotName) {
if (!slotName)
throw new Error("slotName cannot be null.");
const slots = this.slots;
for (let i = 0, n = slots.length; i < n; i++)
if (slots[i].name === slotName)
return slots[i];
return null;
}
/** Finds a skin by comparing each skin's name. It is more efficient to cache the results of this method than to call it
* multiple times.
* @returns May be null. */
findSkin(skinName) {
if (!skinName)
throw new Error("skinName cannot be null.");
const skins = this.skins;
for (let i = 0, n = skins.length; i < n; i++)
if (skins[i].name === skinName)
return skins[i];
return null;
}
/** Finds an event by comparing each events's name. It is more efficient to cache the results of this method than to call it
* multiple times.
* @returns May be null. */
findEvent(eventDataName) {
if (!eventDataName)
throw new Error("eventDataName cannot be null.");
const events = this.events;
for (let i = 0, n = events.length; i < n; i++)
if (events[i].name === eventDataName)
return events[i];
return null;
}
/** Collects animations used by {@link SliderData slider constraints}.
*
* Slider animations are designed to be applied by slider constraints rather than on their own. Applications that have a user
* choose an animation may want to exclude them. */
findSliderAnimations(animations) {
const constraints = this.constraints;
for (let i = 0, n = this.constraints.length; i < n; i++) {
const data = constraints[i];
if (data instanceof SliderData && data.animation != null)
animations.push(data.animation);
}
return animations;
}
/** Finds an animation by comparing each animation's name. It is more efficient to cache the results of this method than to
* call it multiple times.
* @returns May be null. */
findAnimation(animationName) {
if (!animationName)
throw new Error("animationName cannot be null.");
const animations = this.animations;
for (let i = 0, n = animations.length; i < n; i++)
if (animations[i].name === animationName)
return animations[i];
return null;
}
// --- Constraints.
/** Finds a constraint of the specified type by comparing each constraints's name. It is more efficient to cache the results of
* this method than to call it multiple times. */
// biome-ignore lint/suspicious/noExplicitAny: reference runtime does not restrict to specific types
findConstraint(constraintName, type) {
if (!constraintName)
throw new Error("constraintName cannot be null.");
if (type == null)
throw new Error("type cannot be null.");
const constraints = this.constraints;
for (let i = 0, n = this.constraints.length; i < n; i++) {
const constraint = constraints[i];
if (constraint instanceof type && constraint.name === constraintName)
return constraint;
}
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25EYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFRL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzdDOzs7WUFHWTtBQUNaLE1BQU0sT0FBTyxZQUFZO0lBRXhCLDZHQUE2RztJQUM3RyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQix5RkFBeUY7SUFDekYsS0FBSyxHQUFHLEVBQWdCLENBQUMsQ0FBQyx5QkFBeUI7SUFFbkQseURBQXlEO0lBQ3pELEtBQUssR0FBRyxFQUFnQixDQUFDLENBQUMseUJBQXlCO0lBRW5ELEtBQUssR0FBRyxFQUFZLENBQUM7SUFFckI7OztzQkFHa0I7SUFDbEIsV0FBVyxHQUFnQixJQUFJLENBQUM7SUFFaEMsNkJBQTZCO0lBQzdCLE1BQU0sR0FBRyxFQUFpQixDQUFDO0lBRTNCLGlDQUFpQztJQUNqQyxVQUFVLEdBQUcsRUFBaUIsQ0FBQztJQUUvQixxQ0FBcUM7SUFDckMsb0dBQW9HO0lBQ3BHLFdBQVcsR0FBRyxFQUFnQyxDQUFDO0lBRS9DLHNGQUFzRjtJQUN0RixDQUFDLEdBQVcsQ0FBQyxDQUFDO0lBRWQsc0ZBQXNGO0lBQ3RGLENBQUMsR0FBVyxDQUFDLENBQUM7SUFFZCwrRUFBK0U7SUFDL0UsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUVsQixnRkFBZ0Y7SUFDaEYsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUVuQjtpQkFDYTtJQUNiLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFFckIsbUVBQW1FO0lBQ25FLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBRTlCLDJHQUEyRztJQUMzRyxJQUFJLEdBQWtCLElBQUksQ0FBQztJQUUzQixlQUFlO0lBQ2Ysc0ZBQXNGO0lBQ3RGLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCww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TyxVQUFlLENBQUM7UUFDOUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgdHlwZSB7IEFuaW1hdGlvbiB9IGZyb20gXCIuL0FuaW1hdGlvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmVEYXRhIH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9Db25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudERhdGEgfSBmcm9tIFwiLi9FdmVudERhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tpbiB9IGZyb20gXCIuL1NraW4uanNcIjtcbmltcG9ydCB7IFNsaWRlckRhdGEgfSBmcm9tIFwiLi9TbGlkZXJEYXRhLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNsb3REYXRhIH0gZnJvbSBcIi4vU2xvdERhdGEuanNcIjtcblxuLyoqIFN0b3JlcyB0aGUgc2V0dXAgcG9zZSBhbmQgYWxsIG9mIHRoZSBzdGF0ZWxlc3MgZGF0YSBmb3IgYSBza2VsZXRvbi5cbiAqXG4gKiBTZWUgW0RhdGEgb2JqZWN0c10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLXJ1bnRpbWUtYXJjaGl0ZWN0dXJlI0RhdGEtb2JqZWN0cykgaW4gdGhlIFNwaW5lIFJ1bnRpbWVzXG4gKiBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkRhdGEge1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBuYW1lLCB3aGljaCBieSBkZWZhdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBza2VsZXRvbiBkYXRhIGZpbGUsIGlmIHBvc3NpYmxlLiBNYXkgYmUgbnVsbC4gKi9cblx0bmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGJvbmVzLCBzb3J0ZWQgcGFyZW50IGZpcnN0LiBUaGUgcm9vdCBib25lIGlzIGFsd2F5cyB0aGUgZmlyc3QgYm9uZS4gKi9cblx0Ym9uZXMgPSBbXSBhcyBCb25lRGF0YVtdOyAvLyBPcmRlcmVkIHBhcmVudHMgZmlyc3QuXG5cblx0LyoqIFRoZSBza2VsZXRvbidzIHNsb3RzIGluIHRoZSBzZXR1cCBwb3NlIGRyYXcgb3JkZXIuICovXG5cdHNsb3RzID0gW10gYXMgU2xvdERhdGFbXTsgLy8gU2V0dXAgcG9zZSBkcmF3IG9yZGVyLlxuXG5cdHNraW5zID0gW10gYXMgU2tpbltdO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24ncyBkZWZhdWx0IHNraW4uIEJ5IGRlZmF1bHQgdGhpcyBza2luIGNvbnRhaW5zIGFsbCBhdHRhY2htZW50cyB0aGF0IHdlcmUgbm90IGluIGEgc2tpbiBpbiBTcGluZS5cblx0ICpcblx0ICogU2VlIHtAbGluayBTa2VsZXRvbi5nZXRBdHRhY2htZW50QnlOYW1lfS5cblx0ICogTWF5IGJlIG51bGwuICovXG5cdGRlZmF1bHRTa2luOiBTa2luIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGV2ZW50cy4gKi9cblx0ZXZlbnRzID0gW10gYXMgRXZlbnREYXRhW107XG5cblx0LyoqIFRoZSBza2VsZXRvbidzIGFuaW1hdGlvbnMuICovXG5cdGFuaW1hdGlvbnMgPSBbXSBhcyBBbmltYXRpb25bXTtcblxuXHQvKiogVGhlIHNrZWxldG9uJ3MgSUsgY29uc3RyYWludHMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0Y29uc3RyYWludHMgPSBbXSBhcyBDb25zdHJhaW50RGF0YTxhbnksIGFueT5bXTtcblxuXHQvKiogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR4OiBudW1iZXIgPSAwO1xuXG5cdC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSBza2VsZXRvbidzIGF4aXMgYWxpZ25lZCBib3VuZGluZyBib3ggaW4gdGhlIHNldHVwIHBvc2UuICovXG5cdHk6IG51bWJlciA9IDA7XG5cblx0LyoqIFRoZSB3aWR0aCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHR3aWR0aDogbnVtYmVyID0gMDtcblxuXHQvKiogVGhlIGhlaWdodCBvZiB0aGUgc2tlbGV0b24ncyBheGlzIGFsaWduZWQgYm91bmRpbmcgYm94IGluIHRoZSBzZXR1cCBwb3NlLiAqL1xuXHRoZWlnaHQ6IG51bWJlciA9IDA7XG5cblx0LyoqIEJhc2VsaW5lIHNjYWxlIGZhY3RvciBmb3IgYXBwbHlpbmcgZGlzdGFuY2UtZGVwZW5kZW50IGVmZmVjdHMgb24gbm9uLXNjYWxhYmxlIHByb3BlcnRpZXMsIHN1Y2ggYXMgYW5nbGUgb3Igc2NhbGUuIERlZmF1bHRcblx0ICogaXMgMTAwLiAqL1xuXHRyZWZlcmVuY2VTY2FsZSA9IDEwMDtcblxuXHQvKiogVGhlIFNwaW5lIHZlcnNpb24gdXNlZCB0byBleHBvcnQgdGhlIHNrZWxldG9uIGRhdGEsIG9yIG51bGwuICovXG5cdHZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBUaGUgc2tlbGV0b24gZGF0YSBoYXNoLiBUaGlzIHZhbHVlIHdpbGwgY2hhbmdlIGlmIGFueSBvZiB0aGUgc2tlbGV0b24gZGF0YSBoYXMgY2hhbmdlZC4gTWF5IGJlIG51bGwuICovXG5cdGhhc2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdC8vIE5vbmVzc2VudGlhbFxuXHQvKiogVGhlIGRvcGVzaGVldCBGUFMgaW4gU3BpbmUuIEF2YWlsYWJsZSBvbmx5IHdoZW4gbm9uZXNzZW50aWFsIGRhdGEgd2FzIGV4cG9ydGVkLiAqL1xuXHRmcHMgPSAzMDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGltYWdlcyBmb2xkZXIgYXMgZGVmaW5lZCBpbiBTcGluZS4gQXZhaWxhYmxlIG9ubHkgd2hlbiBub25lc3NlbnRpYWwgZGF0YSB3YXMgZXhwb3J0ZWQuIE1heSBiZSBudWxsLiAqL1xuXHRpbWFnZXNQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHQvKiogVGhlIHBhdGggdG8gdGhlIGF1ZGlvIGZvbGRlciBhcyBkZWZpbmVkIGluIFNwaW5lLiBBdmFpbGFibGUgb25seSB3aGVuIG5vbmVzc2VudGlhbCBkYXRhIHdhcyBleHBvcnRlZC4gTWF5IGJlIG51bGwuICovXG5cdGF1ZGlvUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIEZpbmRzIGEgYm9uZSBieSBjb21wYXJpbmcgZWFjaCBib25lJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0byBjYWxsIGl0XG5cdCAqIG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEJvbmUgKGJvbmVOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIWJvbmVOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJib25lTmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYm9uZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0aWYgKGJvbmVzW2ldLm5hbWUgPT09IGJvbmVOYW1lKSByZXR1cm4gYm9uZXNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogRmluZHMgYSBzbG90IGJ5IGNvbXBhcmluZyBlYWNoIHNsb3QncyBuYW1lLiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXRcblx0ICogbXVsdGlwbGUgdGltZXMuXG5cdCAqIEByZXR1cm5zIE1heSBiZSBudWxsLiAqL1xuXHRmaW5kU2xvdCAoc2xvdE5hbWU6IHN0cmluZykge1xuXHRcdGlmICghc2xvdE5hbWUpIHRocm93IG5ldyBFcnJvcihcInNsb3ROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBzbG90cyA9IHRoaXMuc2xvdHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBzbG90cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoc2xvdHNbaV0ubmFtZSA9PT0gc2xvdE5hbWUpIHJldHVybiBzbG90c1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKiBGaW5kcyBhIHNraW4gYnkgY29tcGFyaW5nIGVhY2ggc2tpbidzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRTa2luIChza2luTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFza2luTmFtZSkgdGhyb3cgbmV3IEVycm9yKFwic2tpbk5hbWUgY2Fubm90IGJlIG51bGwuXCIpO1xuXHRcdGNvbnN0IHNraW5zID0gdGhpcy5za2lucztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHNraW5zLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGlmIChza2luc1tpXS5uYW1lID09PSBza2luTmFtZSkgcmV0dXJuIHNraW5zW2ldO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqIEZpbmRzIGFuIGV2ZW50IGJ5IGNvbXBhcmluZyBlYWNoIGV2ZW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHRoYW4gdG8gY2FsbCBpdFxuXHQgKiBtdWx0aXBsZSB0aW1lcy5cblx0ICogQHJldHVybnMgTWF5IGJlIG51bGwuICovXG5cdGZpbmRFdmVudCAoZXZlbnREYXRhTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFldmVudERhdGFOYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJldmVudERhdGFOYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IGV2ZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoZXZlbnRzW2ldLm5hbWUgPT09IGV2ZW50RGF0YU5hbWUpIHJldHVybiBldmVudHNbaV07XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKiogQ29sbGVjdHMgYW5pbWF0aW9ucyB1c2VkIGJ5IHtAbGluayBTbGlkZXJEYXRhIHNsaWRlciBjb25zdHJhaW50c30uXG5cdCAqXG5cdCAqIFNsaWRlciBhbmltYXRpb25zIGFyZSBkZXNpZ25lZCB0byBiZSBhcHBsaWVkIGJ5IHNsaWRlciBjb25zdHJhaW50cyByYXRoZXIgdGhhbiBvbiB0aGVpciBvd24uIEFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgYSB1c2VyXG5cdCAqIGNob29zZSBhbiBhbmltYXRpb24gbWF5IHdhbnQgdG8gZXhjbHVkZSB0aGVtLiAqL1xuXHRmaW5kU2xpZGVyQW5pbWF0aW9ucyAoYW5pbWF0aW9uczogQW5pbWF0aW9uW10pOiBBbmltYXRpb25bXSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSB0aGlzLmNvbnN0cmFpbnRzO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5jb25zdHJhaW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBjb25zdHJhaW50c1tpXTtcblx0XHRcdGlmIChkYXRhIGluc3RhbmNlb2YgU2xpZGVyRGF0YSAmJiBkYXRhLmFuaW1hdGlvbiAhPSBudWxsKSBhbmltYXRpb25zLnB1c2goZGF0YS5hbmltYXRpb24pO1xuXHRcdH1cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblx0fVxuXG5cdC8qKiBGaW5kcyBhbiBhbmltYXRpb24gYnkgY29tcGFyaW5nIGVhY2ggYW5pbWF0aW9uJ3MgbmFtZS4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2QgdGhhbiB0b1xuXHQgKiBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuXHQgKiBAcmV0dXJucyBNYXkgYmUgbnVsbC4gKi9cblx0ZmluZEFuaW1hdGlvbiAoYW5pbWF0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0aWYgKCFhbmltYXRpb25OYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJhbmltYXRpb25OYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gYW5pbWF0aW9ucy5sZW5ndGg7IGkgPCBuOyBpKyspXG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5uYW1lID09PSBhbmltYXRpb25OYW1lKSByZXR1cm4gYW5pbWF0aW9uc1tpXTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIC0tLSBDb25zdHJhaW50cy5cblxuXHQvKiogRmluZHMgYSBjb25zdHJhaW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBieSBjb21wYXJpbmcgZWFjaCBjb25zdHJhaW50cydzIG5hbWUuIEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNhY2hlIHRoZSByZXN1bHRzIG9mXG5cdCAgKiB0aGlzIG1ldGhvZCB0aGFuIHRvIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMuICovXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogcmVmZXJlbmNlIHJ1bnRpbWUgZG9lcyBub3QgcmVzdHJpY3QgdG8gc3BlY2lmaWMgdHlwZXNcblx0ZmluZENvbnN0cmFpbnQ8VCBleHRlbmRzIENvbnN0cmFpbnREYXRhPGFueSwgYW55Pj4gKGNvbnN0cmFpbnROYW1lOiBzdHJpbmcsIHR5cGU6IG5ldyAobmFtZTogc3RyaW5nKSA9PiBUKTogVCB8IG51bGwge1xuXHRcdGlmICghY29uc3RyYWludE5hbWUpIHRocm93IG5ldyBFcnJvcihcImNvbnN0cmFpbnROYW1lIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRpZiAodHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJ0eXBlIGNhbm5vdCBiZSBudWxsLlwiKTtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldO1xuXHRcdFx0aWYgKGNvbnN0cmFpbnQgaW5zdGFuY2VvZiB0eXBlICYmIGNvbnN0cmFpbnQubmFtZSA9PT0gY29uc3RyYWludE5hbWUpIHJldHVybiBjb25zdHJhaW50IGFzIFQ7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cbn1cbiJdfQ==