2025-11-04 12:16:48 +01:00

126 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 "@esotericsoftware/spine-core";
export class C3TextureEditor extends Texture {
texture;
renderer;
constructor(image, renderer, page) {
super(image);
this.renderer = renderer;
const options = {
wrapX: toC3TextureWrap(page.uWrap),
wrapY: toC3TextureWrap(page.vWrap),
sampling: toC3Filter(page.minFilter),
mipMap: toC3MipMap(page.minFilter),
};
this.texture = renderer.CreateDynamicTexture(image.width, image.height, options);
this.renderer.UpdateTexture(image, this.texture, { premultiplyAlpha: !page.pma });
}
setFilters() {
// cannot change filter after texture creation
}
setWraps() {
// cannot change wraps after texture creation
}
dispose() {
this.renderer.DeleteTexture(this.texture);
}
}
export class C3Texture extends Texture {
texture;
renderer;
constructor(image, renderer, page) {
super(image);
this.renderer = renderer;
const options = {
wrapX: toC3TextureWrap(page.uWrap),
wrapY: toC3TextureWrap(page.vWrap),
sampling: toC3Filter(page.minFilter),
mipMap: toC3MipMap(page.minFilter),
};
this.texture = renderer.createDynamicTexture(image.width, image.height, options);
this.renderer.updateTexture(image, this.texture, { premultiplyAlpha: !page.pma });
}
setFilters() {
// cannot change filter after texture creation
}
setWraps() {
// cannot change wraps after texture creation
}
dispose() {
this.renderer.deleteTexture(this.texture);
}
}
function toC3TextureWrap(wrap) {
if (wrap === TextureWrap.ClampToEdge)
return "clamp-to-edge";
else if (wrap === TextureWrap.MirroredRepeat)
return "mirror-repeat";
else if (wrap === TextureWrap.Repeat)
return "repeat";
else
throw new Error(`Unknown texture wrap: ${wrap}`);
}
function toC3MipMap(filter) {
switch (filter) {
case TextureFilter.MipMap:
case TextureFilter.MipMapLinearNearest:
case TextureFilter.MipMapNearestLinear:
case TextureFilter.MipMapNearestNearest:
return true;
case TextureFilter.Linear:
case TextureFilter.Nearest:
return false;
default:
throw new Error(`Unknown texture filter: ${filter}`);
}
}
function toC3Filter(filter) {
switch (filter) {
case TextureFilter.Nearest:
case TextureFilter.MipMapNearestNearest:
return "nearest";
case TextureFilter.Linear:
case TextureFilter.MipMapLinearNearest:
case TextureFilter.MipMapNearestLinear:
return "bilinear";
case TextureFilter.MipMap:
case TextureFilter.MipMapLinearLinear:
return "trilinear";
default:
throw new Error(`Unknown texture filter: ${filter}`);
}
}
export const BlendingModeSpineToC3 = {
[BlendMode.Normal]: "normal",
[BlendMode.Additive]: "additive",
[BlendMode.Multiply]: "multiply",
[BlendMode.Screen]: "screen",
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQzNUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0MzVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQXlCLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVySCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxPQUFPO0lBQzNDLE9BQU8sQ0FBd0I7SUFDL0IsUUFBUSxDQUF5QjtJQUVqQyxZQUFhLEtBQXFDLEVBQUUsUUFBZ0MsRUFBRSxJQUFzQjtRQUMzRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixNQUFNLE9BQU8sR0FBeUI7WUFDckMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2xDLEtBQUssRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNsQyxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2xDLENBQUE7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxVQUFVO1FBQ1QsOENBQThDO0lBQy9DLENBQUM7SUFFRCxRQUFRO1FBQ1AsNkNBQTZDO0lBQzlD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QjtZQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztBQUNGLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBMEM7SUFDM0UsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtJQUM1QixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO0lBQ2hDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVU7SUFDaEMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtDQUM1QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCbGVuZE1vZGUsIFRleHR1cmUsIHR5cGUgVGV4dHVyZUF0bGFzUGFnZSwgVGV4dHVyZUZpbHRlciwgVGV4dHVyZVdyYXAgfSBmcm9tIFwiQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgQzNUZXh0dXJlRWRpdG9yIGV4dGVuZHMgVGV4dHVyZSB7XG5cdHRleHR1cmU6IFNESy5HZnguSVdlYkdMVGV4dHVyZTtcblx0cmVuZGVyZXI6IFNESy5HZnguSVdlYkdMUmVuZGVyZXI7XG5cblx0Y29uc3RydWN0b3IgKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VCaXRtYXAsIHJlbmRlcmVyOiBTREsuR2Z4LklXZWJHTFJlbmRlcmVyLCBwYWdlOiBUZXh0dXJlQXRsYXNQYWdlKSB7XG5cdFx0c3VwZXIoaW1hZ2UpO1xuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblx0XHRjb25zdCBvcHRpb25zOiBUZXh0dXJlQ3JlYXRlT3B0aW9ucyA9IHtcblx0XHRcdHdyYXBYOiB0b0MzVGV4dHVyZVdyYXAocGFnZS51V3JhcCksXG5cdFx0XHR3cmFwWTogdG9DM1RleHR1cmVXcmFwKHBhZ2UudldyYXApLFxuXHRcdFx0c2FtcGxpbmc6IHRvQzNGaWx0ZXIocGFnZS5taW5GaWx0ZXIpLFxuXHRcdFx0bWlwTWFwOiB0b0MzTWlwTWFwKHBhZ2UubWluRmlsdGVyKSxcblx0XHR9XG5cdFx0dGhpcy50ZXh0dXJlID0gcmVuZGVyZXIuQ3JlYXRlRHluYW1pY1RleHR1cmUoaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgb3B0aW9ucyk7XG5cdFx0dGhpcy5yZW5kZXJlci5VcGRhdGVUZXh0dXJlKGltYWdlLCB0aGlzLnRleHR1cmUsIHsgcHJlbXVsdGlwbHlBbHBoYTogIXBhZ2UucG1hIH0pO1xuXHR9XG5cblx0c2V0RmlsdGVycyAoKSB7XG5cdFx0Ly8gY2Fubm90IGNoYW5nZSBmaWx0ZXIgYWZ0ZXIgdGV4dHVyZSBjcmVhdGlvblxuXHR9XG5cblx0c2V0V3JhcHMgKCkge1xuXHRcdC8vIGNhbm5vdCBjaGFuZ2Ugd3JhcHMgYWZ0ZXIgdGV4dHVyZSBjcmVhdGlvblxuXHR9XG5cblxuXHRkaXNwb3NlICgpIHtcblx0XHR0aGlzLnJlbmRlcmVyLkRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgQzNUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XG5cdHRleHR1cmU6IElUZXh0dXJlO1xuXHRyZW5kZXJlcjogSVJlbmRlcmVyO1xuXG5cdGNvbnN0cnVjdG9yIChpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwLCByZW5kZXJlcjogSVJlbmRlcmVyLCBwYWdlOiBUZXh0dXJlQXRsYXNQYWdlKSB7XG5cdFx0c3VwZXIoaW1hZ2UpO1xuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblx0XHRjb25zdCBvcHRpb25zOiBUZXh0dXJlQ3JlYXRlT3B0aW9ucyA9IHtcblx0XHRcdHdyYXBYOiB0b0MzVGV4dHVyZVdyYXAocGFnZS51V3JhcCksXG5cdFx0XHR3cmFwWTogdG9DM1RleHR1cmVXcmFwKHBhZ2UudldyYXApLFxuXHRcdFx0c2FtcGxpbmc6IHRvQzNGaWx0ZXIocGFnZS5taW5GaWx0ZXIpLFxuXHRcdFx0bWlwTWFwOiB0b0MzTWlwTWFwKHBhZ2UubWluRmlsdGVyKSxcblx0XHR9XG5cdFx0dGhpcy50ZXh0dXJlID0gcmVuZGVyZXIuY3JlYXRlRHluYW1pY1RleHR1cmUoaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgb3B0aW9ucyk7XG5cdFx0dGhpcy5yZW5kZXJlci51cGRhdGVUZXh0dXJlKGltYWdlLCB0aGlzLnRleHR1cmUsIHsgcHJlbXVsdGlwbHlBbHBoYTogIXBhZ2UucG1hIH0pO1xuXHR9XG5cblxuXHRzZXRGaWx0ZXJzICgpIHtcblx0XHQvLyBjYW5ub3QgY2hhbmdlIGZpbHRlciBhZnRlciB0ZXh0dXJlIGNyZWF0aW9uXG5cdH1cblxuXHRzZXRXcmFwcyAoKSB7XG5cdFx0Ly8gY2Fubm90IGNoYW5nZSB3cmFwcyBhZnRlciB0ZXh0dXJlIGNyZWF0aW9uXG5cdH1cblxuXHRkaXNwb3NlICgpIHtcblx0XHR0aGlzLnJlbmRlcmVyLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0b0MzVGV4dHVyZVdyYXAgKHdyYXA6IFRleHR1cmVXcmFwKTogVGV4dHVyZVdyYXBNb2RlIHtcblx0aWYgKHdyYXAgPT09IFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlKSByZXR1cm4gXCJjbGFtcC10by1lZGdlXCI7XG5cdGVsc2UgaWYgKHdyYXAgPT09IFRleHR1cmVXcmFwLk1pcnJvcmVkUmVwZWF0KSByZXR1cm4gXCJtaXJyb3ItcmVwZWF0XCI7XG5cdGVsc2UgaWYgKHdyYXAgPT09IFRleHR1cmVXcmFwLlJlcGVhdCkgcmV0dXJuIFwicmVwZWF0XCI7XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRleHR1cmUgd3JhcDogJHt3cmFwfWApO1xufVxuXG5mdW5jdGlvbiB0b0MzTWlwTWFwIChmaWx0ZXI6IFRleHR1cmVGaWx0ZXIpOiBib29sZWFuIHtcblx0c3dpdGNoIChmaWx0ZXIpIHtcblx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwOlxuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBMaW5lYXJOZWFyZXN0OlxuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TGluZWFyOlxuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TmVhcmVzdDpcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLkxpbmVhcjpcblx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTmVhcmVzdDpcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSBmaWx0ZXI6ICR7ZmlsdGVyfWApO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRvQzNGaWx0ZXIgKGZpbHRlcjogVGV4dHVyZUZpbHRlcik6IFRleHR1cmVTYW1wbGluZ01vZGUge1xuXHRzd2l0Y2ggKGZpbHRlcikge1xuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5OZWFyZXN0OlxuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TmVhcmVzdDpcblx0XHRcdHJldHVybiBcIm5lYXJlc3RcIjtcblxuXHRcdGNhc2UgVGV4dHVyZUZpbHRlci5MaW5lYXI6XG5cdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRyZXR1cm4gXCJiaWxpbmVhclwiO1xuXG5cdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcDpcblx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOlxuXHRcdFx0cmV0dXJuIFwidHJpbGluZWFyXCI7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIGZpbHRlcjogJHtmaWx0ZXJ9YCk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IEJsZW5kaW5nTW9kZVNwaW5lVG9DMzogUmVjb3JkPEJsZW5kTW9kZSwgQmxlbmRNb2RlUGFyYW1ldGVyPiA9IHtcblx0W0JsZW5kTW9kZS5Ob3JtYWxdOiBcIm5vcm1hbFwiLFxuXHRbQmxlbmRNb2RlLkFkZGl0aXZlXTogXCJhZGRpdGl2ZVwiLFxuXHRbQmxlbmRNb2RlLk11bHRpcGx5XTogXCJtdWx0aXBseVwiLFxuXHRbQmxlbmRNb2RlLlNjcmVlbl06IFwic2NyZWVuXCIsXG59XG5cbiJdfQ==