113 lines
16 KiB
JavaScript
113 lines
16 KiB
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 "@spine-particle/spine-core-4.3";
|
|
import { BLEND_MODES, MIPMAP_MODES, Texture as PixiTexture, SCALE_MODES, WRAP_MODES } from "@pixi/core";
|
|
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.source);
|
|
this.texture = PixiTexture.from(image);
|
|
}
|
|
setFilters(minFilter, _magFilter) {
|
|
this.texture.baseTexture.scaleMode = SpineTexture.toPixiTextureFilter(minFilter);
|
|
this.texture.baseTexture.mipmap = SpineTexture.toPixiMipMap(minFilter);
|
|
// pixi only has one filter for both min and mag, too bad
|
|
}
|
|
setWraps(uWrap, _vWrap) {
|
|
this.texture.baseTexture.wrapMode = SpineTexture.toPixiTextureWrap(uWrap);
|
|
// Pixi only has one setting
|
|
}
|
|
dispose() {
|
|
// I am not entirely sure about this...
|
|
this.texture.destroy();
|
|
}
|
|
static toPixiTextureFilter(filter) {
|
|
switch (filter) {
|
|
case TextureFilter.Nearest:
|
|
case TextureFilter.MipMapNearestLinear:
|
|
case TextureFilter.MipMapNearestNearest:
|
|
return SCALE_MODES.NEAREST;
|
|
case TextureFilter.Linear:
|
|
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
|
case TextureFilter.MipMapLinearNearest:
|
|
return SCALE_MODES.LINEAR;
|
|
default:
|
|
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
|
}
|
|
}
|
|
static toPixiMipMap(filter) {
|
|
switch (filter) {
|
|
case TextureFilter.Nearest:
|
|
case TextureFilter.Linear:
|
|
return MIPMAP_MODES.OFF;
|
|
case TextureFilter.MipMapNearestLinear:
|
|
case TextureFilter.MipMapNearestNearest:
|
|
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
|
case TextureFilter.MipMapLinearNearest:
|
|
return MIPMAP_MODES.ON;
|
|
default:
|
|
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
|
}
|
|
}
|
|
static toPixiTextureWrap(wrap) {
|
|
switch (wrap) {
|
|
case TextureWrap.ClampToEdge:
|
|
return WRAP_MODES.CLAMP;
|
|
case TextureWrap.MirroredRepeat:
|
|
return WRAP_MODES.MIRRORED_REPEAT;
|
|
case TextureWrap.Repeat:
|
|
return WRAP_MODES.REPEAT;
|
|
default:
|
|
throw new Error(`Unknown texture wrap: ${String(wrap)}`);
|
|
}
|
|
}
|
|
static toPixiBlending(blend) {
|
|
switch (blend) {
|
|
case BlendMode.Normal:
|
|
return BLEND_MODES.NORMAL;
|
|
case BlendMode.Additive:
|
|
return BLEND_MODES.ADD;
|
|
case BlendMode.Multiply:
|
|
return BLEND_MODES.MULTIPLY;
|
|
case BlendMode.Screen:
|
|
return BLEND_MODES.SCREEN;
|
|
default:
|
|
throw new Error(`Unknown blendMode: ${String(blend)}`);
|
|
}
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RyxNQUFNLE9BQU8sWUFBYSxTQUFRLE9BQU87SUFDaEMsTUFBTSxDQUFDLFVBQVUsR0FBdUMsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBRSxPQUF3QjtRQUMzQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWlCLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVlLE9BQU8sQ0FBYztJQUVyQyxZQUFxQixLQUFzQjtRQUMxQyx1RUFBdUU7UUFDdkUsS0FBSyxDQUFFLEtBQUssQ0FBQyxRQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsVUFBeUI7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRixJ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LEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQmxlbmRNb2RlLCBUZXh0dXJlLCBUZXh0dXJlRmlsdGVyLCBUZXh0dXJlV3JhcCB9IGZyb20gXCJAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VJbWFnZVJlc291cmNlLCBCYXNlVGV4dHVyZSBhcyBQaXhpQmFzZVRleHR1cmUgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuaW1wb3J0IHsgQkxFTkRfTU9ERVMsIE1JUE1BUF9NT0RFUywgVGV4dHVyZSBhcyBQaXhpVGV4dHVyZSwgU0NBTEVfTU9ERVMsIFdSQVBfTU9ERVMgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgU3BpbmVUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XG5cdHByaXZhdGUgc3RhdGljIHRleHR1cmVNYXA6IE1hcDxQaXhpQmFzZVRleHR1cmUsIFNwaW5lVGV4dHVyZT4gPSBuZXcgTWFwPFBpeGlCYXNlVGV4dHVyZSwgU3BpbmVUZXh0dXJlPigpO1xuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbSAodGV4dHVyZTogUGl4aUJhc2VUZXh0dXJlKTogU3BpbmVUZXh0dXJlIHtcblx0XHRpZiAoU3BpbmVUZXh0dXJlLnRleHR1cmVNYXAuaGFzKHRleHR1cmUpKSB7XG5cdFx0XHRyZXR1cm4gU3BpbmVUZXh0dXJlLnRleHR1cmVNYXAuZ2V0KHRleHR1cmUpIGFzIFNwaW5lVGV4dHVyZTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBTcGluZVRleHR1cmUodGV4dHVyZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVhZG9ubHkgdGV4dHVyZTogUGl4aVRleHR1cmU7XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RvciAoaW1hZ2U6IFBpeGlCYXNlVGV4dHVyZSkge1xuXHRcdC8vIFRvZG86IG1heWJlIGFkZCBlcnJvciBoYW5kbGluZyBpZiB5b3UgZmVlZCBhIHZpZGVvIHRleHR1cmUgdG8gc3BpbmU/XG5cdFx0c3VwZXIoKGltYWdlLnJlc291cmNlIGFzIEJhc2VJbWFnZVJlc291cmNlKS5zb3VyY2UpO1xuXHRcdHRoaXMudGV4dHVyZSA9IFBpeGlUZXh0dXJlLmZyb20oaW1hZ2UpO1xuXHR9XG5cblx0cHVibGljIHNldEZpbHRlcnMgKG1pbkZpbHRlcjogVGV4dHVyZUZpbHRlciwgX21hZ0ZpbHRlcjogVGV4dHVyZUZpbHRlcik6IHZvaWQge1xuXHRcdHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5zY2FsZU1vZGUgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZUZpbHRlcihtaW5GaWx0ZXIpO1xuXHRcdHRoaXMudGV4dHVyZS5iYXNlVGV4dHVyZS5taXBtYXAgPSBTcGluZVRleHR1cmUudG9QaXhpTWlwTWFwKG1pbkZpbHRlcik7XG5cblx0XHQvLyBwaXhpIG9ubHkgaGFzIG9uZSBmaWx0ZXIgZm9yIGJvdGggbWluIGFuZCBtYWcsIHRvbyBiYWRcblx0fVxuXG5cdHB1YmxpYyBzZXRXcmFwcyAodVdyYXA6IFRleHR1cmVXcmFwLCBfdldyYXA6IFRleHR1cmVXcmFwKTogdm9pZCB7XG5cdFx0dGhpcy50ZXh0dXJlLmJhc2VUZXh0dXJlLndyYXBNb2RlID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVXcmFwKHVXcmFwKTtcblxuXHRcdC8vIFBpeGkgb25seSBoYXMgb25lIHNldHRpbmdcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlICgpOiB2b2lkIHtcblx0XHQvLyBJIGFtIG5vdCBlbnRpcmVseSBzdXJlIGFib3V0IHRoaXMuLi5cblx0XHR0aGlzLnRleHR1cmUuZGVzdHJveSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgdG9QaXhpVGV4dHVyZUZpbHRlciAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogU0NBTEVfTU9ERVMge1xuXHRcdHN3aXRjaCAoZmlsdGVyKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTmVhcmVzdDpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TGluZWFyOlxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3ROZWFyZXN0OlxuXHRcdFx0XHRyZXR1cm4gU0NBTEVfTU9ERVMuTkVBUkVTVDtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLkxpbmVhcjpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBMaW5lYXJMaW5lYXI6IC8vIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyID09IFRleHR1cmVGaWx0ZXIuTWlwTWFwXG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTmVhcmVzdDpcblx0XHRcdFx0cmV0dXJuIFNDQUxFX01PREVTLkxJTkVBUjtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRleHR1cmUgZmlsdGVyOiAke1N0cmluZyhmaWx0ZXIpfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIHRvUGl4aU1pcE1hcCAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogTUlQTUFQX01PREVTIHtcblx0XHRzd2l0Y2ggKGZpbHRlcikge1xuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTGluZWFyOlxuXHRcdFx0XHRyZXR1cm4gTUlQTUFQX01PREVTLk9GRjtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiBNSVBNQVBfTU9ERVMuT047XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIGZpbHRlcjogJHtTdHJpbmcoZmlsdGVyKX1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB0b1BpeGlUZXh0dXJlV3JhcCAod3JhcDogVGV4dHVyZVdyYXApOiBXUkFQX01PREVTIHtcblx0XHRzd2l0Y2ggKHdyYXApIHtcblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuQ2xhbXBUb0VkZ2U6XG5cdFx0XHRcdHJldHVybiBXUkFQX01PREVTLkNMQU1QO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLk1pcnJvcmVkUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gV1JBUF9NT0RFUy5NSVJST1JFRF9SRVBFQVQ7XG5cblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gV1JBUF9NT0RFUy5SRVBFQVQ7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHdyYXA6ICR7U3RyaW5nKHdyYXApfWApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgdG9QaXhpQmxlbmRpbmcgKGJsZW5kOiBCbGVuZE1vZGUpOiBCTEVORF9NT0RFUyB7XG5cdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuTm9ybWFsOlxuXHRcdFx0XHRyZXR1cm4gQkxFTkRfTU9ERVMuTk9STUFMO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5BZGRpdGl2ZTpcblx0XHRcdFx0cmV0dXJuIEJMRU5EX01PREVTLkFERDtcblxuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuTXVsdGlwbHk6XG5cdFx0XHRcdHJldHVybiBCTEVORF9NT0RFUy5NVUxUSVBMWTtcblxuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuU2NyZWVuOlxuXHRcdFx0XHRyZXR1cm4gQkxFTkRfTU9ERVMuU0NSRUVOO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYmxlbmRNb2RlOiAke1N0cmluZyhibGVuZCl9YCk7XG5cdFx0fVxuXHR9XG59XG4iXX0=
|