ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
283 lines • 27.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated May 1, 2019. Replaces all prior versions.
*
* Copyright (c) 2013-2019, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
* INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { MeshAttachment } from "./attachments/MeshAttachment";
export class SkinEntry {
/**
* @param {?} slotIndex
* @param {?} name
* @param {?} attachment
*/
constructor(slotIndex, name, attachment) {
this.slotIndex = slotIndex;
this.name = name;
this.attachment = attachment;
}
}
if (false) {
/** @type {?} */
SkinEntry.prototype.slotIndex;
/** @type {?} */
SkinEntry.prototype.name;
/** @type {?} */
SkinEntry.prototype.attachment;
}
export class Skin {
/**
* @param {?} name
*/
constructor(name) {
this.attachments = new Array();
this.bones = Array();
this.constraints = new Array();
if (name == null)
throw new Error("name cannot be null.");
this.name = name;
}
/**
* @param {?} slotIndex
* @param {?} name
* @param {?} attachment
* @return {?}
*/
setAttachment(slotIndex, name, attachment) {
if (attachment == null)
throw new Error("attachment cannot be null.");
/** @type {?} */
let attachments = this.attachments;
if (slotIndex >= attachments.length)
attachments.length = slotIndex + 1;
if (!attachments[slotIndex])
attachments[slotIndex] = {};
attachments[slotIndex][name] = attachment;
}
/**
* @param {?} skin
* @return {?}
*/
addSkin(skin) {
for (let i = 0; i < skin.bones.length; i++) {
/** @type {?} */
let bone = skin.bones[i];
/** @type {?} */
let contained = false;
for (let j = 0; j < this.bones.length; j++) {
if (this.bones[j] == bone) {
contained = true;
break;
}
}
if (!contained)
this.bones.push(bone);
}
for (let i = 0; i < skin.constraints.length; i++) {
/** @type {?} */
let constraint = skin.constraints[i];
/** @type {?} */
let contained = false;
for (let j = 0; j < this.constraints.length; j++) {
if (this.constraints[j] == constraint) {
contained = true;
break;
}
}
if (!contained)
this.constraints.push(constraint);
}
/** @type {?} */
let attachments = skin.getAttachments();
for (let i = 0; i < attachments.length; i++) {
/** @type {?} */
var attachment = attachments[i];
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
}
/**
* @param {?} skin
* @return {?}
*/
copySkin(skin) {
for (let i = 0; i < skin.bones.length; i++) {
/** @type {?} */
let bone = skin.bones[i];
/** @type {?} */
let contained = false;
for (let j = 0; j < this.bones.length; j++) {
if (this.bones[j] == bone) {
contained = true;
break;
}
}
if (!contained)
this.bones.push(bone);
}
for (let i = 0; i < skin.constraints.length; i++) {
/** @type {?} */
let constraint = skin.constraints[i];
/** @type {?} */
let contained = false;
for (let j = 0; j < this.constraints.length; j++) {
if (this.constraints[j] == constraint) {
contained = true;
break;
}
}
if (!contained)
this.constraints.push(constraint);
}
/** @type {?} */
let attachments = skin.getAttachments();
for (let i = 0; i < attachments.length; i++) {
/** @type {?} */
var attachment = attachments[i];
if (attachment.attachment == null)
continue;
if (attachment.attachment instanceof MeshAttachment) {
attachment.attachment = attachment.attachment.newLinkedMesh();
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
else {
attachment.attachment = attachment.attachment.copy();
this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
}
}
}
/**
* @param {?} slotIndex
* @param {?} name
* @return {?} May be null.
*/
getAttachment(slotIndex, name) {
/** @type {?} */
let dictionary = this.attachments[slotIndex];
return dictionary ? dictionary[name] : null;
}
/**
* @param {?} slotIndex
* @param {?} name
* @return {?}
*/
removeAttachment(slotIndex, name) {
/** @type {?} */
let dictionary = this.attachments[slotIndex];
if (dictionary)
dictionary[name] = null;
}
/**
* @return {?}
*/
getAttachments() {
/** @type {?} */
let entries = new Array();
for (var i = 0; i < this.attachments.length; i++) {
/** @type {?} */
let slotAttachments = this.attachments[i];
if (slotAttachments) {
for (let name in slotAttachments) {
/** @type {?} */
let attachment = slotAttachments[name];
if (attachment)
entries.push(new SkinEntry(i, name, attachment));
}
}
}
return entries;
}
/**
* @param {?} slotIndex
* @param {?} attachments
* @return {?}
*/
getAttachmentsForSlot(slotIndex, attachments) {
/** @type {?} */
let slotAttachments = this.attachments[slotIndex];
if (slotAttachments) {
for (let name in slotAttachments) {
/** @type {?} */
let attachment = slotAttachments[name];
if (attachment)
attachments.push(new SkinEntry(slotIndex, name, attachment));
}
}
}
/**
* @return {?}
*/
clear() {
this.attachments.length = 0;
this.bones.length = 0;
this.constraints.length = 0;
}
/**
* Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached.
* @param {?} skeleton
* @param {?} oldSkin
* @return {?}
*/
attachAll(skeleton, oldSkin) {
/** @type {?} */
let slotIndex = 0;
for (let i = 0; i < skeleton.slots.length; i++) {
/** @type {?} */
let slot = skeleton.slots[i];
/** @type {?} */
let slotAttachment = slot.getAttachment();
if (slotAttachment && slotIndex < oldSkin.attachments.length) {
/** @type {?} */
let dictionary = oldSkin.attachments[slotIndex];
for (let key in dictionary) {
/** @type {?} */
let skinAttachment = dictionary[key];
if (slotAttachment == skinAttachment) {
/** @type {?} */
let attachment = this.getAttachment(slotIndex, key);
if (attachment != null)
slot.setAttachment(attachment);
break;
}
}
}
slotIndex++;
}
}
}
if (false) {
/** @type {?} */
Skin.prototype.name;
/** @type {?} */
Skin.prototype.attachments;
/** @type {?} */
Skin.prototype.bones;
/** @type {?} */
Skin.prototype.constraints;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy9jb3JlL1NraW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSzlELE1BQU0sT0FBTyxTQUFTOzs7Ozs7SUFDcEIsWUFDUyxTQUFpQixFQUNqQixJQUFZLEVBQ1osVUFBc0I7UUFGdEIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUM1QixDQUFDO0NBQ0w7OztJQUpHLDhCQUF3Qjs7SUFDeEIseUJBQW1COztJQUNuQiwrQkFBNkI7O0FBR2pDLE1BQU0sT0FBTyxJQUFJOzs7O0lBS2YsWUFBWSxJQUFZO1FBSHhCLGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQW1CLENBQUM7UUFDM0MsVUFBSyxHQUFHLEtBQUssRUFBWSxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7UUFFeEMsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDOzs7Ozs7O0lBQ0QsYUFBYSxDQUFDLFNBQWlCLEVBQUUsSUFBWSxFQUFFLFVBQXNCO1FBQ25FLElBQUksVUFBVSxJQUFJLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7O1lBQ2xFLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVztRQUNsQyxJQUFJLFNBQVMsSUFBSSxXQUFXLENBQUMsTUFBTTtZQUFFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJ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bkQsSUFBSSxVQUFVLElBQUksSUFBSTs0QkFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN2RCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7WUFDRCxTQUFTLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQztDQUNGOzs7SUFySkMsb0JBQWE7O0lBQ2IsMkJBQTJDOztJQUMzQyxxQkFBMEI7O0lBQzFCLDJCQUEwQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWFwIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgTWVzaEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBCb25lRGF0YSB9IGZyb20gXCIuL0JvbmVEYXRhXCI7XHJcbmltcG9ydCB7IENvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vQ29uc3RyYWludFwiO1xyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tpbkVudHJ5IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBzbG90SW5kZXg6IG51bWJlcixcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgYXR0YWNobWVudDogQXR0YWNobWVudFxyXG4gICkge31cclxufVxyXG5leHBvcnQgY2xhc3MgU2tpbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGF0dGFjaG1lbnRzID0gbmV3IEFycmF5PE1hcDxBdHRhY2htZW50Pj4oKTtcclxuICBib25lcyA9IEFycmF5PEJvbmVEYXRhPigpO1xyXG4gIGNvbnN0cmFpbnRzID0gbmV3IEFycmF5PENvbnN0cmFpbnREYXRhPigpO1xyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xyXG4gICAgaWYgKG5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwibmFtZSBjYW5ub3QgYmUgbnVsbC5cIik7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gIH1cclxuICBzZXRBdHRhY2htZW50KHNsb3RJbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpIHtcclxuICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcImF0dGFjaG1lbnQgY2Fubm90IGJlIG51bGwuXCIpO1xyXG4gICAgbGV0IGF0dGFjaG1lbnRzID0gdGhpcy5hdHRhY2htZW50cztcclxuICAgIGlmIChzbG90SW5kZXggPj0gYXR0YWNobWVudHMubGVuZ3RoKSBhdHRhY2htZW50cy5sZW5ndGggPSBzbG90SW5kZXggKyAxO1xyXG4gICAgaWYgKCFhdHRhY2htZW50c1tzbG90SW5kZXhdKSBhdHRhY2htZW50c1tzbG90SW5kZXhdID0ge307XHJcbiAgICBhdHRhY2htZW50c1tzbG90SW5kZXhdW25hbWVdID0gYXR0YWNobWVudDtcclxuICB9XHJcbiAgYWRkU2tpbihza2luOiBTa2luKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNraW4uYm9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBza2luLmJvbmVzW2ldO1xyXG4gICAgICBsZXQgY29udGFpbmVkID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5ib25lcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLmJvbmVzW2pdID09IGJvbmUpIHtcclxuICAgICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjb250YWluZWQpIHRoaXMuYm9uZXMucHVzaChib25lKTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpbi5jb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY29uc3RyYWludCA9IHNraW4uY29uc3RyYWludHNbaV07XHJcbiAgICAgIGxldCBjb250YWluZWQgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uc3RyYWludHNbal0gPT0gY29uc3RyYWludCkge1xyXG4gICAgICAgICAgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRhaW5lZCkgdGhpcy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IGF0dGFjaG1lbnRzID0gc2tpbi5nZXRBdHRhY2htZW50cygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRhY2htZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgYXR0YWNobWVudCA9IGF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICB0aGlzLnNldEF0dGFjaG1lbnQoXHJcbiAgICAgICAgYXR0YWNobWVudC5zbG90SW5kZXgsXHJcbiAgICAgICAgYXR0YWNobWVudC5uYW1lLFxyXG4gICAgICAgIGF0dGFjaG1lbnQuYXR0YWNobWVudFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb3B5U2tpbihza2luOiBTa2luKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNraW4uYm9uZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGJvbmUgPSBza2luLmJvbmVzW2ldO1xyXG4gICAgICBsZXQgY29udGFpbmVkID0gZmFsc2U7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5ib25lcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLmJvbmVzW2pdID09IGJvbmUpIHtcclxuICAgICAgICAgIGNvbnRhaW5lZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFjb250YWluZWQpIHRoaXMuYm9uZXMucHVzaChib25lKTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpbi5jb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY29uc3RyYWludCA9IHNraW4uY29uc3RyYWludHNbaV07XHJcbiAgICAgIGxldCBjb250YWluZWQgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uc3RyYWludHNbal0gPT0gY29uc3RyYWludCkge1xyXG4gICAgICAgICAgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRhaW5lZCkgdGhpcy5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IGF0dGFjaG1lbnRzID0gc2tpbi5nZXRBdHRhY2htZW50cygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRhY2htZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgYXR0YWNobWVudCA9IGF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICBpZiAoYXR0YWNobWVudC5hdHRhY2htZW50ID09IG51bGwpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoYXR0YWNobWVudC5hdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcclxuICAgICAgICBhdHRhY2htZW50LmF0dGFjaG1lbnQgPSBhdHRhY2htZW50LmF0dGFjaG1lbnQubmV3TGlua2VkTWVzaCgpO1xyXG4gICAgICAgIHRoaXMuc2V0QXR0YWNobWVudChcclxuICAgICAgICAgIGF0dGFjaG1lbnQuc2xvdEluZGV4LFxyXG4gICAgICAgICAgYXR0YWNobWVudC5uYW1lLFxyXG4gICAgICAgICAgYXR0YWNobWVudC5hdHRhY2htZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhdHRhY2htZW50LmF0dGFjaG1lbnQgPSBhdHRhY2htZW50LmF0dGFjaG1lbnQuY29weSgpO1xyXG4gICAgICAgIHRoaXMuc2V0QXR0YWNobWVudChcclxuICAgICAgICAgIGF0dGFjaG1lbnQuc2xvdEluZGV4LFxyXG4gICAgICAgICAgYXR0YWNobWVudC5uYW1lLFxyXG4gICAgICAgICAgYXR0YWNobWVudC5hdHRhY2htZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKiogQHJldHVybiBNYXkgYmUgbnVsbC4gKi9cclxuICBnZXRBdHRhY2htZW50KHNsb3RJbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiBBdHRhY2htZW50IHtcclxuICAgIGxldCBkaWN0aW9uYXJ5ID0gdGhpcy5hdHRhY2htZW50c1tzbG90SW5kZXhdO1xyXG4gICAgcmV0dXJuIGRpY3Rpb25hcnkgPyBkaWN0aW9uYXJ5W25hbWVdIDogbnVsbDtcclxuICB9XHJcbiAgcmVtb3ZlQXR0YWNobWVudChzbG90SW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgZGljdGlvbmFyeSA9IHRoaXMuYXR0YWNobWVudHNbc2xvdEluZGV4XTtcclxuICAgIGlmIChkaWN0aW9uYXJ5KSBkaWN0aW9uYXJ5W25hbWVdID0gbnVsbDtcclxuICB9XHJcbiAgZ2V0QXR0YWNobWVudHMoKTogQXJyYXk8U2tpbkVudHJ5PiB7XHJcbiAgICBsZXQgZW50cmllcyA9IG5ldyBBcnJheTxTa2luRW50cnk+KCk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0YWNobWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHNsb3RBdHRhY2htZW50cyA9IHRoaXMuYXR0YWNobWVudHNbaV07XHJcbiAgICAgIGlmIChzbG90QXR0YWNobWVudHMpIHtcclxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHNsb3RBdHRhY2htZW50cykge1xyXG4gICAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90QXR0YWNobWVudHNbbmFtZV07XHJcbiAgICAgICAgICBpZiAoYXR0YWNobWVudCkgZW50cmllcy5wdXNoKG5ldyBTa2luRW50cnkoaSwgbmFtZSwgYXR0YWNobWVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVudHJpZXM7XHJcbiAgfVxyXG4gIGdldEF0dGFjaG1lbnRzRm9yU2xvdChzbG90SW5kZXg6IG51bWJlciwgYXR0YWNobWVudHM6IEFycmF5PFNraW5FbnRyeT4pIHtcclxuICAgIGxldCBzbG90QXR0YWNobWVudHMgPSB0aGlzLmF0dGFjaG1lbnRzW3Nsb3RJbmRleF07XHJcbiAgICBpZiAoc2xvdEF0dGFjaG1lbnRzKSB7XHJcbiAgICAgIGZvciAobGV0IG5hbWUgaW4gc2xvdEF0dGFjaG1lbnRzKSB7XHJcbiAgICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90QXR0YWNobWVudHNbbmFtZV07XHJcbiAgICAgICAgaWYgKGF0dGFjaG1lbnQpXHJcbiAgICAgICAgICBhdHRhY2htZW50cy5wdXNoKG5ldyBTa2luRW50cnkoc2xvdEluZGV4LCBuYW1lLCBhdHRhY2htZW50KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgY2xlYXIoKSB7XHJcbiAgICB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLmJvbmVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG4gIC8qKiBBdHRhY2ggZWFjaCBhdHRhY2htZW50IGluIHRoaXMgc2tpbiBpZiB0aGUgY29ycmVzcG9uZGluZyBhdHRhY2htZW50IGluIHRoZSBvbGQgc2tpbiBpcyBjdXJyZW50bHkgYXR0YWNoZWQuICovXHJcbiAgYXR0YWNoQWxsKHNrZWxldG9uOiBTa2VsZXRvbiwgb2xkU2tpbjogU2tpbikge1xyXG4gICAgbGV0IHNsb3RJbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNrZWxldG9uLnNsb3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBzbG90ID0gc2tlbGV0b24uc2xvdHNbaV07XHJcbiAgICAgIGxldCBzbG90QXR0YWNobWVudCA9IHNsb3QuZ2V0QXR0YWNobWVudCgpO1xyXG4gICAgICBpZiAoc2xvdEF0dGFjaG1lbnQgJiYgc2xvdEluZGV4IDwgb2xkU2tpbi5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgZGljdGlvbmFyeSA9IG9sZFNraW4uYXR0YWNobWVudHNbc2xvdEluZGV4XTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgbGV0IHNraW5BdHRhY2htZW50OiBBdHRhY2htZW50ID0gZGljdGlvbmFyeVtrZXldO1xyXG4gICAgICAgICAgaWYgKHNsb3RBdHRhY2htZW50ID09IHNraW5BdHRhY2htZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBhdHRhY2htZW50ID0gdGhpcy5nZXRBdHRhY2htZW50KHNsb3RJbmRleCwga2V5KTtcclxuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgIT0gbnVsbCkgc2xvdC5zZXRBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2xvdEluZGV4Kys7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==