@esotericsoftware/spine-pixi-v8
Version:
The official Spine Runtimes for PixiJS v8.
116 lines • 16 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 { BlendMode, Texture, TextureFilter, TextureWrap } from '@esotericsoftware/spine-core';
import { Texture as PixiTexture } from 'pixi.js';
export class SpineTexture extends Texture {
static textureMap = new Map();
static from(texture) {
if (SpineTexture.textureMap.has(texture)) {
return SpineTexture.textureMap.get(texture);
}
return new SpineTexture(texture);
}
texture;
constructor(image) {
// Todo: maybe add error handling if you feed a video texture to spine?
super(image.resource);
this.texture = PixiTexture.from(image);
}
setFilters(minFilter, magFilter) {
const style = this.texture.source.style;
style.minFilter = SpineTexture.toPixiTextureFilter(minFilter);
style.magFilter = SpineTexture.toPixiTextureFilter(magFilter);
this.texture.source.autoGenerateMipmaps = SpineTexture.toPixiMipMap(minFilter);
this.texture.source.updateMipmaps();
}
setWraps(uWrap, vWrap) {
const style = this.texture.source.style;
style.addressModeU = SpineTexture.toPixiTextureWrap(uWrap);
style.addressModeV = SpineTexture.toPixiTextureWrap(vWrap);
}
dispose() {
// I am not entirely sure about this...
this.texture.destroy();
}
static toPixiMipMap(filter) {
switch (filter) {
case TextureFilter.Nearest:
case TextureFilter.Linear:
return false;
case TextureFilter.MipMapNearestLinear:
case TextureFilter.MipMapNearestNearest:
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
case TextureFilter.MipMapLinearNearest:
return true;
default:
throw new Error(`Unknown texture filter: ${String(filter)}`);
}
}
static toPixiTextureFilter(filter) {
switch (filter) {
case TextureFilter.Nearest:
case TextureFilter.MipMapNearestLinear:
case TextureFilter.MipMapNearestNearest:
return 'nearest';
case TextureFilter.Linear:
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
case TextureFilter.MipMapLinearNearest:
return 'linear';
default:
throw new Error(`Unknown texture filter: ${String(filter)}`);
}
}
static toPixiTextureWrap(wrap) {
switch (wrap) {
case TextureWrap.ClampToEdge:
return 'clamp-to-edge';
case TextureWrap.MirroredRepeat:
return 'mirror-repeat';
case TextureWrap.Repeat:
return 'repeat';
default:
throw new Error(`Unknown texture wrap: ${String(wrap)}`);
}
}
static toPixiBlending(blend) {
switch (blend) {
case BlendMode.Normal:
return 'normal';
case BlendMode.Additive:
return 'add';
case BlendMode.Multiply:
return 'multiply';
case BlendMode.Screen:
return 'screen';
default:
throw new Error(`Unknown blendMode: ${String(blend)}`);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpELE1BQU0sT0FBTyxZQUFhLFNBQVEsT0FBTztJQUNoQyxNQUFNLENBQVUsVUFBVSxHQUFxQyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUV2RyxNQUFNLENBQUMsSUFBSSxDQUFFLE9BQXNCO1FBQ3pDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBaUIsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRWUsT0FBTyxDQUFjO0lBRXJDLFlBQXFCLEtBQW9CO1FBQ3hDLHVFQUF1RTtRQUN2RSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsU0FBd0I7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRXhDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLFFBQVEsQ0FBRSxLQUFrQixFQUFFLEtBQWtCO1FBQ3RELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUV4QyxLQUFLLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sT0FBTztRQUNiLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUFFLE1BQXFCO1FBQ2pELFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDaEIsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzNCLEtBQUssYUFBYSxDQUFDLE1BQU07Z0JBQ3hCLE9BQU8sS0FBSyxDQUFDO1lBRWQsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDeEMsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQywyREFBMkQ7WUFDbEcsS0FBSyxhQUFhLENBQUMsbUJBQW1CO2dCQUNyQyxPQUFPLElBQUksQ0FBQztZQUViO2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNGLENBQUM7SUFFTyxNQUFNLENBQUMsbUJBQW1CLENBQUUsTUFBcUI7UUFDeEQsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNoQixLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDM0IsS0FBSyxhQUFhLENBQUMsbUJBQW1CLENBQUM7WUFDdkMsS0FBSyxhQUFhLENBQUMsb0JBQW9CO2dCQUN0QyxPQUFPLFNBQVMsQ0FBQztZQUVsQixLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDMUIsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQywyREFBMkQ7WUFDbEcsS0FBSyxhQUFhLENBQUMsbUJBQW1CO2dCQUNyQyxPQUFPLFFBQVEsQ0FBQztZQUVqQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDRixDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixDQUFFLElBQWlCO1FBQ2xELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDZCxLQUFLLFdBQVcsQ0FBQyxXQUFXO2dCQUMzQixPQUFPLGVBQWUsQ0FBQztZQUV4QixLQUFLLFdBQVcsQ0FBQyxjQUFjO2dCQUM5QixPQUFPLGVBQWUsQ0FBQztZQUV4QixLQUFLLFdBQVcsQ0FBQyxNQUFNO2dCQUN0QixPQUFPLFFBQVEsQ0FBQztZQUVqQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDRixDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBRSxLQUFnQjtRQUM3QyxRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2YsS0FBSyxTQUFTLENBQUMsTUFBTTtnQkFDcEIsT0FBTyxRQUFRLENBQUM7WUFFakIsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdEIsT0FBTyxLQUFLLENBQUM7WUFFZCxLQUFLLFNBQVMsQ0FBQyxRQUFRO2dCQUN0QixPQUFPLFVBQVUsQ0FBQztZQUVuQixLQUFLLFNBQVMsQ0FBQyxNQUFNO2dCQUNwQixPQUFPLFFBQVEsQ0FBQztZQUVqQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCbGVuZE1vZGUsIFRleHR1cmUsIFRleHR1cmVGaWx0ZXIsIFRleHR1cmVXcmFwIH0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJMRU5EX01PREVTLCBTQ0FMRV9NT0RFLCBUZXh0dXJlU291cmNlLCBXUkFQX01PREUgfSBmcm9tICdwaXhpLmpzJztcbmltcG9ydCB7IFRleHR1cmUgYXMgUGl4aVRleHR1cmUgfSBmcm9tICdwaXhpLmpzJztcblxuZXhwb3J0IGNsYXNzIFNwaW5lVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlTWFwOiBNYXA8VGV4dHVyZVNvdXJjZSwgU3BpbmVUZXh0dXJlPiA9IG5ldyBNYXA8VGV4dHVyZVNvdXJjZSwgU3BpbmVUZXh0dXJlPigpO1xuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbSAodGV4dHVyZTogVGV4dHVyZVNvdXJjZSk6IFNwaW5lVGV4dHVyZSB7XG5cdFx0aWYgKFNwaW5lVGV4dHVyZS50ZXh0dXJlTWFwLmhhcyh0ZXh0dXJlKSkge1xuXHRcdFx0cmV0dXJuIFNwaW5lVGV4dHVyZS50ZXh0dXJlTWFwLmdldCh0ZXh0dXJlKSBhcyBTcGluZVRleHR1cmU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBTcGluZVRleHR1cmUodGV4dHVyZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVhZG9ubHkgdGV4dHVyZTogUGl4aVRleHR1cmU7XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RvciAoaW1hZ2U6IFRleHR1cmVTb3VyY2UpIHtcblx0XHQvLyBUb2RvOiBtYXliZSBhZGQgZXJyb3IgaGFuZGxpbmcgaWYgeW91IGZlZWQgYSB2aWRlbyB0ZXh0dXJlIHRvIHNwaW5lP1xuXHRcdHN1cGVyKGltYWdlLnJlc291cmNlKTtcblx0XHR0aGlzLnRleHR1cmUgPSBQaXhpVGV4dHVyZS5mcm9tKGltYWdlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRGaWx0ZXJzIChtaW5GaWx0ZXI6IFRleHR1cmVGaWx0ZXIsIG1hZ0ZpbHRlcjogVGV4dHVyZUZpbHRlcik6IHZvaWQge1xuXHRcdGNvbnN0IHN0eWxlID0gdGhpcy50ZXh0dXJlLnNvdXJjZS5zdHlsZTtcblxuXHRcdHN0eWxlLm1pbkZpbHRlciA9IFNwaW5lVGV4dHVyZS50b1BpeGlUZXh0dXJlRmlsdGVyKG1pbkZpbHRlcik7XG5cdFx0c3R5bGUubWFnRmlsdGVyID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVGaWx0ZXIobWFnRmlsdGVyKTtcblx0XHR0aGlzLnRleHR1cmUuc291cmNlLmF1dG9HZW5lcmF0ZU1pcG1hcHMgPSBTcGluZVRleHR1cmUudG9QaXhpTWlwTWFwKG1pbkZpbHRlcik7XG5cdFx0dGhpcy50ZXh0dXJlLnNvdXJjZS51cGRhdGVNaXBtYXBzKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0V3JhcHMgKHVXcmFwOiBUZXh0dXJlV3JhcCwgdldyYXA6IFRleHR1cmVXcmFwKTogdm9pZCB7XG5cdFx0Y29uc3Qgc3R5bGUgPSB0aGlzLnRleHR1cmUuc291cmNlLnN0eWxlO1xuXG5cdFx0c3R5bGUuYWRkcmVzc01vZGVVID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVXcmFwKHVXcmFwKTtcblx0XHRzdHlsZS5hZGRyZXNzTW9kZVYgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZVdyYXAodldyYXApO1xuXHR9XG5cblx0cHVibGljIGRpc3Bvc2UgKCk6IHZvaWQge1xuXHRcdC8vIEkgYW0gbm90IGVudGlyZWx5IHN1cmUgYWJvdXQgdGhpcy4uLlxuXHRcdHRoaXMudGV4dHVyZS5kZXN0cm95KCk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB0b1BpeGlNaXBNYXAgKGZpbHRlcjogVGV4dHVyZUZpbHRlcik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoZmlsdGVyKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTmVhcmVzdDpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5MaW5lYXI6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSBmaWx0ZXI6ICR7U3RyaW5nKGZpbHRlcil9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgdG9QaXhpVGV4dHVyZUZpbHRlciAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogU0NBTEVfTU9ERSB7XG5cdFx0c3dpdGNoIChmaWx0ZXIpIHtcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5OZWFyZXN0OlxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiAnbmVhcmVzdCc7XG5cblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5MaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiAnbGluZWFyJztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRleHR1cmUgZmlsdGVyOiAke1N0cmluZyhmaWx0ZXIpfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIHRvUGl4aVRleHR1cmVXcmFwICh3cmFwOiBUZXh0dXJlV3JhcCk6IFdSQVBfTU9ERSB7XG5cdFx0c3dpdGNoICh3cmFwKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlOlxuXHRcdFx0XHRyZXR1cm4gJ2NsYW1wLXRvLWVkZ2UnO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLk1pcnJvcmVkUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gJ21pcnJvci1yZXBlYXQnO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLlJlcGVhdDpcblx0XHRcdFx0cmV0dXJuICdyZXBlYXQnO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSB3cmFwOiAke1N0cmluZyh3cmFwKX1gKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHRvUGl4aUJsZW5kaW5nIChibGVuZDogQmxlbmRNb2RlKTogQkxFTkRfTU9ERVMge1xuXHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdGNhc2UgQmxlbmRNb2RlLk5vcm1hbDpcblx0XHRcdFx0cmV0dXJuICdub3JtYWwnO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5BZGRpdGl2ZTpcblx0XHRcdFx0cmV0dXJuICdhZGQnO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5NdWx0aXBseTpcblx0XHRcdFx0cmV0dXJuICdtdWx0aXBseSc7XG5cblx0XHRcdGNhc2UgQmxlbmRNb2RlLlNjcmVlbjpcblx0XHRcdFx0cmV0dXJuICdzY3JlZW4nO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYmxlbmRNb2RlOiAke1N0cmluZyhibGVuZCl9YCk7XG5cdFx0fVxuXHR9XG59XG4iXX0=