UNPKG

ngx-spine

Version:

[![Build Status](https://travis-ci.org/PoiScript/ngx-spine.svg?branch=master)](https://travis-ci.org/PoiScript/ngx-spine)

293 lines 24.5 kB
/** * @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. *****************************************************************************/ class Assets { /** * @param {?} clientId */ constructor(clientId) { this.toLoad = new Array(); this.assets = {}; this.clientId = clientId; } /** * @return {?} */ loaded() { /** @type {?} */ let i = 0; for (let v in this.assets) i++; return i; } } if (false) { /** @type {?} */ Assets.prototype.clientId; /** @type {?} */ Assets.prototype.toLoad; /** @type {?} */ Assets.prototype.assets; /** @type {?} */ Assets.prototype.textureLoader; } export class SharedAssetManager { /** * @param {?=} pathPrefix */ constructor(pathPrefix = "") { this.clientAssets = {}; this.queuedAssets = {}; this.rawAssets = {}; this.errors = {}; this.pathPrefix = pathPrefix; } /** * @private * @param {?} clientId * @param {?} textureLoader * @param {?} path * @return {?} */ queueAsset(clientId, textureLoader, path) { /** @type {?} */ let clientAssets = this.clientAssets[clientId]; if (clientAssets === null || clientAssets === undefined) { clientAssets = new Assets(clientId); this.clientAssets[clientId] = clientAssets; } if (textureLoader !== null) clientAssets.textureLoader = textureLoader; clientAssets.toLoad.push(path); // check if already queued, in which case we can skip actual // loading if (this.queuedAssets[path] === path) { return false; } else { this.queuedAssets[path] = path; return true; } } /** * @param {?} clientId * @param {?} path * @return {?} */ loadText(clientId, path) { path = this.pathPrefix + path; if (!this.queueAsset(clientId, null, path)) return; /** @type {?} */ let request = new XMLHttpRequest(); request.onreadystatechange = (/** * @return {?} */ () => { if (request.readyState == XMLHttpRequest.DONE) { if (request.status >= 200 && request.status < 300) { this.rawAssets[path] = request.responseText; } else { this.errors[path] = `Couldn't load text ${path}: status ${request.status}, ${request.responseText}`; } } }); request.open("GET", path, true); request.send(); } /** * @param {?} clientId * @param {?} path * @return {?} */ loadJson(clientId, path) { path = this.pathPrefix + path; if (!this.queueAsset(clientId, null, path)) return; /** @type {?} */ let request = new XMLHttpRequest(); request.onreadystatechange = (/** * @return {?} */ () => { if (request.readyState == XMLHttpRequest.DONE) { if (request.status >= 200 && request.status < 300) { this.rawAssets[path] = JSON.parse(request.responseText); } else { this.errors[path] = `Couldn't load text ${path}: status ${request.status}, ${request.responseText}`; } } }); request.open("GET", path, true); request.send(); } /** * @param {?} clientId * @param {?} textureLoader * @param {?} path * @return {?} */ loadTexture(clientId, textureLoader, path) { path = this.pathPrefix + path; if (!this.queueAsset(clientId, textureLoader, path)) return; /** @type {?} */ let img = new Image(); img.src = path; img.crossOrigin = "anonymous"; img.onload = (/** * @param {?} ev * @return {?} */ ev => { this.rawAssets[path] = img; }); img.onerror = (/** * @param {?} ev * @return {?} */ ev => { this.errors[path] = `Couldn't load image ${path}`; }); } /** * @param {?} clientId * @param {?} path * @return {?} */ get(clientId, path) { path = this.pathPrefix + path; /** @type {?} */ let clientAssets = this.clientAssets[clientId]; if (clientAssets === null || clientAssets === undefined) return true; return clientAssets.assets[path]; } /** * @private * @param {?} clientAssets * @return {?} */ updateClientAssets(clientAssets) { for (let i = 0; i < clientAssets.toLoad.length; i++) { /** @type {?} */ let path = clientAssets.toLoad[i]; /** @type {?} */ let asset = clientAssets.assets[path]; if (asset === null || asset === undefined) { /** @type {?} */ let rawAsset = this.rawAssets[path]; if (rawAsset === null || rawAsset === undefined) continue; if (rawAsset instanceof HTMLImageElement) { clientAssets.assets[path] = clientAssets.textureLoader((/** @type {?} */ (rawAsset))); } else { clientAssets.assets[path] = rawAsset; } } } } /** * @param {?} clientId * @return {?} */ isLoadingComplete(clientId) { /** @type {?} */ let clientAssets = this.clientAssets[clientId]; if (clientAssets === null || clientAssets === undefined) return true; this.updateClientAssets(clientAssets); return clientAssets.toLoad.length == clientAssets.loaded(); } /*remove (clientId: string, path: string) { path = this.pathPrefix + path; let asset = this.assets[path]; if ((<any>asset).dispose) (<any>asset).dispose(); this.assets[path] = null; } removeAll () { for (let key in this.assets) { let asset = this.assets[key]; if ((<any>asset).dispose) (<any>asset).dispose(); } this.assets = {}; }*/ /** * @return {?} */ dispose() { // this.removeAll(); } /** * @return {?} */ hasErrors() { return Object.keys(this.errors).length > 0; } /** * @return {?} */ getErrors() { return this.errors; } } if (false) { /** * @type {?} * @private */ SharedAssetManager.prototype.pathPrefix; /** * @type {?} * @private */ SharedAssetManager.prototype.clientAssets; /** * @type {?} * @private */ SharedAssetManager.prototype.queuedAssets; /** * @type {?} * @private */ SharedAssetManager.prototype.rawAssets; /** * @type {?} * @private */ SharedAssetManager.prototype.errors; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkQXNzZXRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNwaW5lLyIsInNvdXJjZXMiOlsibGliL3NwaW5lLXRzL2NvcmUvU2hhcmVkQXNzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBLE1BQU0sTUFBTTs7OztJQUtWLFlBQVksUUFBZ0I7UUFINUIsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDN0IsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUdwQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDOzs7O0lBQ0QsTUFBTTs7WUFDQSxDQUFDLEdBQUcsQ0FBQztRQUNULEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDRjs7O0lBWkMsMEJBQWlCOztJQUNqQix3QkFBNkI7O0lBQzdCLHdCQUFzQjs7SUFDdEIsK0JBQWdEOztBQVVsRCxNQUFNLE9BQU8sa0JBQWtCOzs7O0lBTTdCLFlBQVksYUFBcUIsRUFBRTtRQUozQixpQkFBWSxHQUFnQixFQUFFLENBQUM7UUFDL0IsaUJBQVksR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQzs7Ozs7Ozs7SUFDTyxVQUFVLENBQ2hCLFFBQWdCLEVBQ2hCLGFBQStDLEVBQy9DLElBQVk7O1lBRVIsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzlDLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQ3ZELFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxR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Ozs7SUFDdkMsMENBQXVDOzs7OztJQUN2Qyx1Q0FBaUM7Ozs7O0lBQ2pDLG9DQUFpQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuaW1wb3J0IHsgTWFwLCBEaXNwb3NhYmxlIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuXHJcbmNsYXNzIEFzc2V0cyB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICB0b0xvYWQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gIGFzc2V0czogTWFwPGFueT4gPSB7fTtcclxuICB0ZXh0dXJlTG9hZGVyOiAoaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQpID0+IGFueTtcclxuICBjb25zdHJ1Y3RvcihjbGllbnRJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNsaWVudElkID0gY2xpZW50SWQ7XHJcbiAgfVxyXG4gIGxvYWRlZCgpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAobGV0IHYgaW4gdGhpcy5hc3NldHMpIGkrKztcclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY2xhc3MgU2hhcmVkQXNzZXRNYW5hZ2VyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XHJcbiAgcHJpdmF0ZSBwYXRoUHJlZml4OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBjbGllbnRBc3NldHM6IE1hcDxBc3NldHM+ID0ge307XHJcbiAgcHJpdmF0ZSBxdWV1ZWRBc3NldHM6IE1hcDxzdHJpbmc+ID0ge307XHJcbiAgcHJpdmF0ZSByYXdBc3NldHM6IE1hcDxhbnk+ID0ge307XHJcbiAgcHJpdmF0ZSBlcnJvcnM6IE1hcDxzdHJpbmc+ID0ge307XHJcbiAgY29uc3RydWN0b3IocGF0aFByZWZpeDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgdGhpcy5wYXRoUHJlZml4ID0gcGF0aFByZWZpeDtcclxuICB9XHJcbiAgcHJpdmF0ZSBxdWV1ZUFzc2V0KFxyXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcclxuICAgIHRleHR1cmVMb2FkZXI6IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gYW55LFxyXG4gICAgcGF0aDogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY2xpZW50QXNzZXRzID0gdGhpcy5jbGllbnRBc3NldHNbY2xpZW50SWRdO1xyXG4gICAgaWYgKGNsaWVudEFzc2V0cyA9PT0gbnVsbCB8fCBjbGllbnRBc3NldHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjbGllbnRBc3NldHMgPSBuZXcgQXNzZXRzKGNsaWVudElkKTtcclxuICAgICAgdGhpcy5jbGllbnRBc3NldHNbY2xpZW50SWRdID0gY2xpZW50QXNzZXRzO1xyXG4gICAgfVxyXG4gICAgaWYgKHRleHR1cmVMb2FkZXIgIT09IG51bGwpIGNsaWVudEFzc2V0cy50ZXh0dXJlTG9hZGVyID0gdGV4dHVyZUxvYWRlcjtcclxuICAgIGNsaWVudEFzc2V0cy50b0xvYWQucHVzaChwYXRoKTtcclxuICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgcXVldWVkLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBza2lwIGFjdHVhbFxyXG4gICAgLy8gbG9hZGluZ1xyXG4gICAgaWYgKHRoaXMucXVldWVkQXNzZXRzW3BhdGhdID09PSBwYXRoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucXVldWVkQXNzZXRzW3BhdGhdID0gcGF0aDtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGxvYWRUZXh0KGNsaWVudElkOiBzdHJpbmcsIHBhdGg6IHN0cmluZykge1xyXG4gICAgcGF0aCA9IHRoaXMucGF0aFByZWZpeCArIHBhdGg7XHJcbiAgICBpZiAoIXRoaXMucXVldWVBc3NldChjbGllbnRJZCwgbnVsbCwgcGF0aCkpIHJldHVybjtcclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XHJcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiByZXF1ZXN0LnN0YXR1cyA8IDMwMCkge1xyXG4gICAgICAgICAgdGhpcy5yYXdBc3NldHNbcGF0aF0gPSByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lcnJvcnNbXHJcbiAgICAgICAgICAgIHBhdGhcclxuICAgICAgICAgIF0gPSBgQ291bGRuJ3QgbG9hZCB0ZXh0ICR7cGF0aH06IHN0YXR1cyAke3JlcXVlc3Quc3RhdHVzfSwgJHtyZXF1ZXN0LnJlc3BvbnNlVGV4dH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCBwYXRoLCB0cnVlKTtcclxuICAgIHJlcXVlc3Quc2VuZCgpO1xyXG4gIH1cclxuICBsb2FkSnNvbihjbGllbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgaWYgKCF0aGlzLnF1ZXVlQXNzZXQoY2xpZW50SWQsIG51bGwsIHBhdGgpKSByZXR1cm47XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xyXG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgIHRoaXMucmF3QXNzZXRzW3BhdGhdID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JzW1xyXG4gICAgICAgICAgICBwYXRoXHJcbiAgICAgICAgICBdID0gYENvdWxkbid0IGxvYWQgdGV4dCAke3BhdGh9OiBzdGF0dXMgJHtyZXF1ZXN0LnN0YXR1c30sICR7cmVxdWVzdC5yZXNwb25zZVRleHR9YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgcGF0aCwgdHJ1ZSk7XHJcbiAgICByZXF1ZXN0LnNlbmQoKTtcclxuICB9XHJcbiAgbG9hZFRleHR1cmUoXHJcbiAgICBjbGllbnRJZDogc3RyaW5nLFxyXG4gICAgdGV4dHVyZUxvYWRlcjogKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiBhbnksXHJcbiAgICBwYXRoOiBzdHJpbmdcclxuICApIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgaWYgKCF0aGlzLnF1ZXVlQXNzZXQoY2xpZW50SWQsIHRleHR1cmVMb2FkZXIsIHBhdGgpKSByZXR1cm47XHJcbiAgICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuc3JjID0gcGF0aDtcclxuICAgIGltZy5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XHJcbiAgICBpbWcub25sb2FkID0gZXYgPT4ge1xyXG4gICAgICB0aGlzLnJhd0Fzc2V0c1twYXRoXSA9IGltZztcclxuICAgIH07XHJcbiAgICBpbWcub25lcnJvciA9IGV2ID0+IHtcclxuICAgICAgdGhpcy5lcnJvcnNbcGF0aF0gPSBgQ291bGRuJ3QgbG9hZCBpbWFnZSAke3BhdGh9YDtcclxuICAgIH07XHJcbiAgfVxyXG4gIGdldChjbGllbnRJZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcclxuICAgIHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG4gICAgbGV0IGNsaWVudEFzc2V0cyA9IHRoaXMuY2xpZW50QXNzZXRzW2NsaWVudElkXTtcclxuICAgIGlmIChjbGllbnRBc3NldHMgPT09IG51bGwgfHwgY2xpZW50QXNzZXRzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGNsaWVudEFzc2V0cy5hc3NldHNbcGF0aF07XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlQ2xpZW50QXNzZXRzKGNsaWVudEFzc2V0czogQXNzZXRzKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudEFzc2V0cy50b0xvYWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHBhdGggPSBjbGllbnRBc3NldHMudG9Mb2FkW2ldO1xyXG4gICAgICBsZXQgYXNzZXQgPSBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdO1xyXG4gICAgICBpZiAoYXNzZXQgPT09IG51bGwgfHwgYXNzZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGxldCByYXdBc3NldCA9IHRoaXMucmF3QXNzZXRzW3BhdGhdO1xyXG4gICAgICAgIGlmIChyYXdBc3NldCA9PT0gbnVsbCB8fCByYXdBc3NldCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgICBpZiAocmF3QXNzZXQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XHJcbiAgICAgICAgICBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdID0gY2xpZW50QXNzZXRzLnRleHR1cmVMb2FkZXIoPFxyXG4gICAgICAgICAgICBIVE1MSW1hZ2VFbGVtZW50XHJcbiAgICAgICAgICA+cmF3QXNzZXQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjbGllbnRBc3NldHMuYXNzZXRzW3BhdGhdID0gcmF3QXNzZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzTG9hZGluZ0NvbXBsZXRlKGNsaWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBjbGllbnRBc3NldHMgPSB0aGlzLmNsaWVudEFzc2V0c1tjbGllbnRJZF07XHJcbiAgICBpZiAoY2xpZW50QXNzZXRzID09PSBudWxsIHx8IGNsaWVudEFzc2V0cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlQ2xpZW50QXNzZXRzKGNsaWVudEFzc2V0cyk7XHJcbiAgICByZXR1cm4gY2xpZW50QXNzZXRzLnRvTG9hZC5sZW5ndGggPT0gY2xpZW50QXNzZXRzLmxvYWRlZCgpO1xyXG4gIH1cclxuICAvKnJlbW92ZSAoY2xpZW50SWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XHJcblx0XHRcdHBhdGggPSB0aGlzLnBhdGhQcmVmaXggKyBwYXRoO1xyXG5cdFx0XHRsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1twYXRoXTtcclxuXHRcdFx0aWYgKCg8YW55PmFzc2V0KS5kaXNwb3NlKSAoPGFueT5hc3NldCkuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLmFzc2V0c1twYXRoXSA9IG51bGw7XHJcblx0XHR9XHJcblx0XHRyZW1vdmVBbGwgKCkge1xyXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gdGhpcy5hc3NldHMpIHtcclxuXHRcdFx0XHRsZXQgYXNzZXQgPSB0aGlzLmFzc2V0c1trZXldO1xyXG5cdFx0XHRcdGlmICgoPGFueT5hc3NldCkuZGlzcG9zZSkgKDxhbnk+YXNzZXQpLmRpc3Bvc2UoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmFzc2V0cyA9IHt9O1xyXG5cdFx0fSovXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIC8vIHRoaXMucmVtb3ZlQWxsKCk7XHJcbiAgfVxyXG4gIGhhc0Vycm9ycygpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmVycm9ycykubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgZ2V0RXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iXX0=