UNPKG

@esotericsoftware/spine-pixi-v8

Version:
117 lines 19.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 { TextureAtlas } from '@esotericsoftware/spine-core'; import { checkExtension, copySearchParams, DOMAdapter, ExtensionType, extensions, LoaderParserPriority, path, Resolver, TextureSource, } from 'pixi.js'; import { SpineTexture } from '../SpineTexture.js'; const loaderName = "spineTextureAtlasLoader"; const spineTextureAtlasLoader = { extension: ExtensionType.Asset, resolver: { test: (value) => checkExtension(value, ".atlas"), parse: (value) => { const split = value.split('.'); return { resolution: parseFloat(Resolver.RETINA_PREFIX?.exec(value)?.[1] ?? '1'), format: split[split.length - 2], src: value, }; }, }, loader: { id: loaderName, name: loaderName, extension: { type: ExtensionType.LoadParser, priority: LoaderParserPriority.Normal, name: loaderName, }, test(url) { return checkExtension(url, '.atlas'); }, async load(url) { const response = await DOMAdapter.get().fetch(url); if (!response.ok) throw new Error(`[${loaderName}] Failed to fetch ${url}: ${response.status} ${response.statusText}`); return await response.text(); }, testParse(asset, options) { const isExtensionRight = checkExtension(options.src, '.atlas'); const isString = typeof asset === 'string'; const isExplicitLoadParserSet = options.parser === loaderName || options.loadParser === loaderName; return Promise.resolve((isExtensionRight || isExplicitLoadParserSet) && isString); }, unload(atlas) { atlas.dispose(); }, async parse(asset, options, loader) { const metadata = options.data || {}; let basePath = path.dirname(options.src); if (basePath && basePath.lastIndexOf('/') !== basePath.length - 1) { basePath += '/'; } // Retval is going to be a texture atlas. However we need to wait for it's callback to resolve this promise. const retval = new TextureAtlas(asset); // If the user gave me only one texture, that one is assumed to be the "first" texture in the atlas if (metadata.images instanceof TextureSource || typeof metadata.images === 'string') { const pixiTexture = metadata.images; metadata.images = {}; metadata.images[retval.pages[0].name] = pixiTexture; } // we will wait for all promises for the textures at the same time at the end. const textureLoadingPromises = []; // fill the pages for (const page of retval.pages) { const pageName = page.name; const providedPage = metadata?.images ? metadata.images[pageName] : undefined; if (providedPage instanceof TextureSource) { page.setTexture(SpineTexture.from(providedPage)); } else { // eslint-disable-next-line max-len const url = providedPage ?? path.normalize([...basePath.split(path.sep), pageName].join(path.sep)); const assetsToLoadIn = { src: copySearchParams(url, options.src), data: { ...metadata.imageMetadata, alphaMode: page.pma ? 'premultiplied-alpha' : 'premultiply-alpha-on-upload' } }; const pixiPromise = loader.load(assetsToLoadIn).then((texture) => { page.setTexture(SpineTexture.from(texture.source)); }); textureLoadingPromises.push(pixiPromise); } } await Promise.all(textureLoadingPromises); return retval; }, }, }; extensions.add(spineTextureAtlasLoader); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL0F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUVOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGFBQWEsRUFDYixVQUFVLEVBRVYsb0JBQW9CLEVBQ3BCLElBQUksRUFFSixRQUFRLEVBRVIsYUFBYSxHQUViLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtsRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUU3QyxNQUFNLHVCQUF1QixHQUFpRTtJQUM3RixTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUs7SUFFOUIsUUFBUSxFQUFFO1FBQ1QsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQW1CLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUUvQixPQUFPO2dCQUNOLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxLQUFLO2FBQ1YsQ0FBQztRQUNILENBQUM7S0FDRDtJQUVELE1BQU0sRUFBRTtRQUNQLEVBQUUsRUFBRSxVQUFVO1FBQ2QsSUFB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KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBUZXh0dXJlQXRsYXMgfSBmcm9tICdAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlJztcbmltcG9ydCB7XG5cdHR5cGUgQXNzZXRFeHRlbnNpb24sXG5cdGNoZWNrRXh0ZW5zaW9uLFxuXHRjb3B5U2VhcmNoUGFyYW1zLFxuXHRET01BZGFwdGVyLFxuXHRFeHRlbnNpb25UeXBlLFxuXHRleHRlbnNpb25zLFxuXHR0eXBlIExvYWRlcixcblx0TG9hZGVyUGFyc2VyUHJpb3JpdHksXG5cdHBhdGgsXG5cdHR5cGUgUmVzb2x2ZWRBc3NldCxcblx0UmVzb2x2ZXIsXG5cdHR5cGUgVGV4dHVyZSxcblx0VGV4dHVyZVNvdXJjZSxcblx0dHlwZSBVbnJlc29sdmVkQXNzZXQsXG59IGZyb20gJ3BpeGkuanMnO1xuaW1wb3J0IHsgU3BpbmVUZXh0dXJlIH0gZnJvbSAnLi4vU3BpbmVUZXh0dXJlLmpzJztcblxuXG50eXBlIFJhd0F0bGFzID0gc3RyaW5nO1xuXG5jb25zdCBsb2FkZXJOYW1lID0gXCJzcGluZVRleHR1cmVBdGxhc0xvYWRlclwiO1xuXG5jb25zdCBzcGluZVRleHR1cmVBdGxhc0xvYWRlcjogQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+ID0ge1xuXHRleHRlbnNpb246IEV4dGVuc2lvblR5cGUuQXNzZXQsXG5cblx0cmVzb2x2ZXI6IHtcblx0XHR0ZXN0OiAodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4gPT4gY2hlY2tFeHRlbnNpb24odmFsdWUsIFwiLmF0bGFzXCIpLFxuXHRcdHBhcnNlOiAodmFsdWU6IHN0cmluZyk6IFVucmVzb2x2ZWRBc3NldCA9PiB7XG5cdFx0XHRjb25zdCBzcGxpdCA9IHZhbHVlLnNwbGl0KCcuJyk7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHJlc29sdXRpb246IHBhcnNlRmxvYXQoUmVzb2x2ZXIuUkVUSU5BX1BSRUZJWD8uZXhlYyh2YWx1ZSk/LlsxXSA/PyAnMScpLFxuXHRcdFx0XHRmb3JtYXQ6IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDJdLFxuXHRcdFx0XHRzcmM6IHZhbHVlLFxuXHRcdFx0fTtcblx0XHR9LFxuXHR9LFxuXG5cdGxvYWRlcjoge1xuXHRcdGlkOiBsb2FkZXJOYW1lLFxuXHRcdG5hbWU6IGxvYWRlck5hbWUsXG5cdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHR0eXBlOiBFeHRlbnNpb25UeXBlLkxvYWRQYXJzZXIsXG5cdFx0XHRwcmlvcml0eTogTG9hZGVyUGFyc2VyUHJpb3JpdHkuTm9ybWFsLFxuXHRcdFx0bmFtZTogbG9hZGVyTmFtZSxcblx0XHR9LFxuXG5cdFx0dGVzdCAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBjaGVja0V4dGVuc2lvbih1cmwsICcuYXRsYXMnKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJhd0F0bGFzPiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IERPTUFkYXB0ZXIuZ2V0KCkuZmV0Y2godXJsKTtcblxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaylcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBbJHtsb2FkZXJOYW1lfV0gRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcblx0XHR9LFxuXG5cdFx0dGVzdFBhcnNlIChhc3NldDogdW5rbm93biwgb3B0aW9uczogUmVzb2x2ZWRBc3NldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdFx0Y29uc3QgaXNFeHRlbnNpb25SaWdodCA9IGNoZWNrRXh0ZW5zaW9uKG9wdGlvbnMuc3JjIGFzIHN0cmluZywgJy5hdGxhcycpO1xuXHRcdFx0Y29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgYXNzZXQgPT09ICdzdHJpbmcnO1xuXHRcdFx0Y29uc3QgaXNFeHBsaWNpdExvYWRQYXJzZXJTZXQgPSBvcHRpb25zLnBhcnNlciA9PT0gbG9hZGVyTmFtZSB8fCBvcHRpb25zLmxvYWRQYXJzZXIgPT09IGxvYWRlck5hbWU7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKGlzRXh0ZW5zaW9uUmlnaHQgfHwgaXNFeHBsaWNpdExvYWRQYXJzZXJTZXQpICYmIGlzU3RyaW5nKTtcblx0XHR9LFxuXG5cdFx0dW5sb2FkIChhdGxhczogVGV4dHVyZUF0bGFzKSB7XG5cdFx0XHRhdGxhcy5kaXNwb3NlKCk7XG5cdFx0fSxcblxuXHRcdGFzeW5jIHBhcnNlIChhc3NldDogUmF3QXRsYXMsIG9wdGlvbnM6IFJlc29sdmVkQXNzZXQsIGxvYWRlcjogTG9hZGVyKTogUHJvbWlzZTxUZXh0dXJlQXRsYXM+IHtcblx0XHRcdGNvbnN0IG1ldGFkYXRhOiBJU3BpbmVBdGxhc01ldGFkYXRhID0gb3B0aW9ucy5kYXRhIHx8IHt9O1xuXHRcdFx0bGV0IGJhc2VQYXRoID0gcGF0aC5kaXJuYW1lKG9wdGlvbnMuc3JjIGFzIHN0cmluZyk7XG5cblx0XHRcdGlmIChiYXNlUGF0aCAmJiBiYXNlUGF0aC5sYXN0SW5kZXhPZignLycpICE9PSBiYXNlUGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGJhc2VQYXRoICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dmFsIGlzIGdvaW5nIHRvIGJlIGEgdGV4dHVyZSBhdGxhcy4gSG93ZXZlciB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0J3MgY2FsbGJhY2sgdG8gcmVzb2x2ZSB0aGlzIHByb21pc2UuXG5cdFx0XHRjb25zdCByZXR2YWwgPSBuZXcgVGV4dHVyZUF0bGFzKGFzc2V0KTtcblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgZ2F2ZSBtZSBvbmx5IG9uZSB0ZXh0dXJlLCB0aGF0IG9uZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBcImZpcnN0XCIgdGV4dHVyZSBpbiB0aGUgYXRsYXNcblx0XHRcdGlmIChtZXRhZGF0YS5pbWFnZXMgaW5zdGFuY2VvZiBUZXh0dXJlU291cmNlIHx8IHR5cGVvZiBtZXRhZGF0YS5pbWFnZXMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGNvbnN0IHBpeGlUZXh0dXJlID0gbWV0YWRhdGEuaW1hZ2VzO1xuXG5cdFx0XHRcdG1ldGFkYXRhLmltYWdlcyA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIFRleHR1cmVTb3VyY2UgfCBzdHJpbmc+O1xuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXNbcmV0dmFsLnBhZ2VzWzBdLm5hbWVdID0gcGl4aVRleHR1cmU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIHdpbGwgd2FpdCBmb3IgYWxsIHByb21pc2VzIGZvciB0aGUgdGV4dHVyZXMgYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgZW5kLlxuXHRcdFx0Y29uc3QgdGV4dHVyZUxvYWRpbmdQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cblx0XHRcdC8vIGZpbGwgdGhlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmV0dmFsLnBhZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VOYW1lID0gcGFnZS5uYW1lO1xuXHRcdFx0XHRjb25zdCBwcm92aWRlZFBhZ2UgPSBtZXRhZGF0YT8uaW1hZ2VzID8gbWV0YWRhdGEuaW1hZ2VzW3BhZ2VOYW1lXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAocHJvdmlkZWRQYWdlIGluc3RhbmNlb2YgVGV4dHVyZVNvdXJjZSkge1xuXHRcdFx0XHRcdHBhZ2Uuc2V0VGV4dHVyZShTcGluZVRleHR1cmUuZnJvbShwcm92aWRlZFBhZ2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuXHRcdFx0XHRcdGNvbnN0IHVybDogc3RyaW5nID0gcHJvdmlkZWRQYWdlID8/IHBhdGgubm9ybWFsaXplKFsuLi5iYXNlUGF0aC5zcGxpdChwYXRoLnNlcCksIHBhZ2VOYW1lXS5qb2luKHBhdGguc2VwKSk7XG5cblx0XHRcdFx0XHRjb25zdCBhc3NldHNUb0xvYWRJbiA9IHtcblx0XHRcdFx0XHRcdHNyYzogY29weVNlYXJjaFBhcmFtcyh1cmwsIG9wdGlvbnMuc3JjIGFzIHN0cmluZyksXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdC4uLm1ldGFkYXRhLmltYWdlTWV0YWRhdGEsXG5cdFx0XHRcdFx0XHRcdGFscGhhTW9kZTogcGFnZS5wbWEgPyAncHJlbXVsdGlwbGllZC1hbHBoYScgOiAncHJlbXVsdGlwbHktYWxwaGEtb24tdXBsb2FkJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjb25zdCBwaXhpUHJvbWlzZSA9IGxvYWRlci5sb2FkPFRleHR1cmU+KGFzc2V0c1RvTG9hZEluKS50aGVuKCh0ZXh0dXJlKSA9PiB7XG5cdFx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20odGV4dHVyZS5zb3VyY2UpKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkaW5nUHJvbWlzZXMucHVzaChwaXhpUHJvbWlzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dHVyZUxvYWRpbmdQcm9taXNlcyk7XG5cblx0XHRcdHJldHVybiByZXR2YWw7XG5cdFx0fSxcblx0fSxcbn0gYXMgQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+O1xuXG5leHRlbnNpb25zLmFkZChzcGluZVRleHR1cmVBdGxhc0xvYWRlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNwaW5lQXRsYXNNZXRhZGF0YSB7XG5cdC8vIElmIHlvdSBhcmUgZG93bmxvYWRpbmcgYW4gLmF0bGFzIGZpbGUsIHRoaXMgbWV0YWRhdGEgd2lsbCBnbyB0byB0aGUgVGV4dHVyZSBsb2FkZXJcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiB1c2VyIGNhbiBwYXNzIGFueVxuXHRpbWFnZU1ldGFkYXRhPzogYW55O1xuXHQvLyBJZiB5b3UgYWxyZWFkeSBoYXZlIGF0bGFzIHBhZ2VzIGxvYWRlZCBhcyBwaXhpIHRleHR1cmVzXG5cdC8vIGFuZCB3YW50IHRvIHVzZSB0aGF0IHRvIGNyZWF0ZSB0aGUgYXRsYXMsIHlvdSBjYW4gcGFzcyB0aGVtIGhlcmVcblx0aW1hZ2VzPzogVGV4dHVyZVNvdXJjZSB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIFRleHR1cmVTb3VyY2UgfCBzdHJpbmc+O1xufVxuIl19