ngx-lil-gui
Version:
Lil-GUI wrapper for Angular
178 lines • 22.2 kB
JavaScript
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, inject, Input, NgZone, Output, } from '@angular/core';
import GUI from 'lil-gui';
import * as i0 from "@angular/core";
class NgxLilGui {
constructor() {
this.zoneless = false;
this.self = false;
this.guiChange = new EventEmitter();
this.guiFinishChange = new EventEmitter();
this.guiReady = new EventEmitter();
this.#hostElement = inject(ElementRef, {
skipSelf: true,
});
this.#parentGUI = inject(NgxLilGui, { skipSelf: true, optional: true });
this.#ngZone = inject(NgZone);
}
#gui;
#hostElement;
#parentGUI;
#ngZone;
ngOnInit() {
this.zoneless = this.#parentGUI?.zoneless ?? this.zoneless;
this.run(() => {
let container = this.container instanceof HTMLElement
? this.container
: this.#hostElement.nativeElement;
if (typeof this.container === 'boolean') {
container = undefined;
}
this.#gui = new GUI({
container,
touchStyles: this.touchStyles,
autoPlace: this.autoPlace,
injectStyles: this.injectStyles,
width: this.width,
title: this.title,
parent: this.self ? undefined : this.#parentGUI?.gui || undefined,
});
this.#setupEvents();
if (this.config) {
this.#buildGUI(this.config);
}
this.guiReady.emit(this.gui);
});
}
get gui() {
return this.#gui;
}
addController(property, controllerConfig) {
return this.run(() => {
if (this.object) {
const [, , ...config] = extractControllerConfig(controllerConfig);
return this.gui.add(this.object, property, ...config);
}
return undefined;
});
}
addColor(property, colorConfig) {
return this.run(() => {
if (this.object) {
return this.gui.addColor(this.object, property, colorConfig?.rgbScale);
}
return undefined;
});
}
run(fn) {
if (this.zoneless) {
return this.#ngZone.runOutsideAngular(() => {
return fn();
});
}
return fn();
}
ngOnDestroy() {
this.run(() => {
this.#gui.destroy();
});
}
#setupEvents() {
this.gui.onChange((arg0) => {
this.guiChange.emit({ ...arg0, gui: this.gui });
});
this.gui.onFinishChange((arg0) => {
this.guiFinishChange.emit({ ...arg0, gui: this.gui });
});
}
#buildGUI(config, gui = this.gui) {
const { guis, colors, object, controllers } = config;
for (const [controllerKey, controllerValue] of Object.entries(controllers || {})) {
const [onChange, onFinishChange, ...config] = extractControllerConfig(controllerValue);
const controller = gui.add(object, controllerKey, ...config);
if (onChange) {
controller.onChange((value) => {
onChange({ value, controller });
});
}
if (onFinishChange) {
controller.onFinishChange((value) => {
onFinishChange({ value, controller });
});
}
}
for (const [colorKey, colorValue] of Object.entries(colors || {})) {
const { rgbScale, onChange, onFinishChange } = colorValue;
const controller = gui.addColor(object, colorKey, rgbScale);
if (onChange) {
controller.onChange((value) => {
onChange({ value, controller });
});
}
if (onFinishChange) {
controller.onFinishChange((value) => {
onFinishChange({ value, controller });
});
}
}
for (const [folderKey, folderConfig] of Object.entries(guis || {})) {
const folder = gui.addFolder(folderKey);
this.#buildGUI(folderConfig, folder);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: NgxLilGui, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: NgxLilGui, isStandalone: true, selector: "\n ngx-lil-gui:not([config]):not([object]),\n ngx-lil-gui[config]:not([object]),\n ngx-lil-gui[object]:not([config])\n ", inputs: { zoneless: "zoneless", self: "self", autoPlace: "autoPlace", container: "container", width: "width", title: "title", injectStyles: "injectStyles", touchStyles: "touchStyles", object: "object", config: "config" }, outputs: { guiChange: "guiChange", guiFinishChange: "guiFinishChange", guiReady: "guiReady" }, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { NgxLilGui };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: NgxLilGui, decorators: [{
type: Component,
args: [{
selector: `
ngx-lil-gui:not([config]):not([object]),
ngx-lil-gui[config]:not([object]),
ngx-lil-gui[object]:not([config])
`,
template: ` <ng-content></ng-content> `,
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
}]
}], propDecorators: { zoneless: [{
type: Input
}], self: [{
type: Input
}], autoPlace: [{
type: Input
}], container: [{
type: Input
}], width: [{
type: Input
}], title: [{
type: Input
}], injectStyles: [{
type: Input
}], touchStyles: [{
type: Input
}], object: [{
type: Input
}], config: [{
type: Input
}], guiChange: [{
type: Output
}], guiFinishChange: [{
type: Output
}], guiReady: [{
type: Output
}] } });
function extractControllerConfig(controllerConfig) {
const config = [undefined, undefined];
if (controllerConfig) {
config[0] = controllerConfig.onChange;
config[1] = controllerConfig.onFinishChange;
config[2] =
controllerConfig.collection ||
controllerConfig.min;
config[3] = controllerConfig.max;
config[4] = controllerConfig.step;
}
return config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWxpbC1ndWkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWxpbC1ndWkvc3JjL2xpYi9uZ3gtbGlsLWd1aS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxHQUFvQyxNQUFNLFNBQVMsQ0FBQzs7QUFhM0QsTUFVYSxTQUFTO0lBVnRCO1FBV1csYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBWVosY0FBUyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBQ2hELG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDNUQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFHN0MsaUJBQVksR0FBRyxNQUFNLENBQTBCLFVBQVUsRUFBRTtZQUN6RCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUNILGVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSxZQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBeUkxQjtJQTlJQyxJQUFJLENBQU87SUFDWCxZQUFZLENBRVQ7SUFDSCxVQUFVLENBQXlEO0lBQ25FLE9BQU8sQ0FBa0I7SUFFekIsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNa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QUN2QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUVVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNOztBQWtKVCxTQUFTLHVCQUF1QixDQUM5QixnQkFBb0Q7SUFRcEQsTUFBTSxNQUFNLEdBTVIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFM0IsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUM7UUFFNUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNOLGdCQUFvRCxDQUFDLFVBQVU7Z0JBQy9ELGdCQUFvRCxDQUFDLEdBQUcsQ0FBQztRQUU1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUksZ0JBQW9ELENBQUMsR0FBRyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBSSxnQkFBb0QsQ0FBQyxJQUFJLENBQUM7S0FDeEU7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IEdVSSwgeyBDb2xvckNvbnRyb2xsZXIsIENvbnRyb2xsZXIgfSBmcm9tICdsaWwtZ3VpJztcbmltcG9ydCB0eXBlIHtcbiAgQW55UmVjb3JkLFxuICBOZ3hMaWxHdWlDaGFuZ2UsXG4gIE5neExpbEd1aUNvbG9yQ29uZmlnLFxuICBOZ3hMaWxHdWlDb25maWcsXG4gIE5neExpbEd1aUNvbnRyb2xsZXJDaGFuZ2UsXG4gIE5neExpbEd1aUNvbnRyb2xsZXJDb25maWcsXG4gIE5neExpbEd1aUNvbnRyb2xsZXJOdW1iZXJDb25maWcsXG4gIE5neExpbEd1aUNvbnRyb2xsZXJTZWxlY3RDb25maWcsXG4gIE5neExpbEd1aUZpbmlzaENoYW5nZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogYFxuICAgIG5neC1saWwtZ3VpOm5vdChbY29uZmlnXSk6bm90KFtvYmplY3RdKSxcbiAgICBuZ3gtbGlsLWd1aVtjb25maWddOm5vdChbb2JqZWN0XSksXG4gICAgbmd4LWxpbC1ndWlbb2JqZWN0XTpub3QoW2NvbmZpZ10pXG4gIGAsXG4gIHRlbXBsYXRlOiBgIDxuZy1jb250ZW50PjwvbmctY29udGVudD4gYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIE5neExpbEd1aSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgem9uZWxlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGF1dG9QbGFjZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgZmFsc2U7XG4gIEBJbnB1dCgpIHdpZHRoPzogbnVtYmVyO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgaW5qZWN0U3R5bGVzPzogYm9vbGVhbjtcbiAgQElucHV0KCkgdG91Y2hTdHlsZXM/OiBudW1iZXI7XG5cbiAgQElucHV0KCkgb2JqZWN0PzogQW55UmVjb3JkO1xuICBASW5wdXQoKSBjb25maWc/OiBOZ3hMaWxHdWlDb25maWc7XG5cbiAgQE91dHB1dCgpIGd1aUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd4TGlsR3VpQ2hhbmdlPigpO1xuICBAT3V0cHV0KCkgZ3VpRmluaXNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3hMaWxHdWlGaW5pc2hDaGFuZ2U+KCk7XG4gIEBPdXRwdXQoKSBndWlSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8R1VJPigpO1xuXG4gICNndWkhOiBHVUk7XG4gICNob3N0RWxlbWVudCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZiwge1xuICAgIHNraXBTZWxmOiB0cnVlLFxuICB9KTtcbiAgI3BhcmVudEdVSSA9IGluamVjdChOZ3hMaWxHdWksIHsgc2tpcFNlbGY6IHRydWUsIG9wdGlvbmFsOiB0cnVlIH0pO1xuICAjbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy56b25lbGVzcyA9IHRoaXMuI3BhcmVudEdVST8uem9uZWxlc3MgPz8gdGhpcy56b25lbGVzcztcbiAgICB0aGlzLnJ1bigoKSA9PiB7XG4gICAgICBsZXQgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICA/IHRoaXMuY29udGFpbmVyXG4gICAgICAgICAgOiB0aGlzLiNob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29udGFpbmVyID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNndWkgPSBuZXcgR1VJKHtcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICB0b3VjaFN0eWxlczogdGhpcy50b3VjaFN0eWxlcyxcbiAgICAgICAgYXV0b1BsYWNlOiB0aGlzLmF1dG9QbGFjZSxcbiAgICAgICAgaW5qZWN0U3R5bGVzOiB0aGlzLmluamVjdFN0eWxlcyxcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICBwYXJlbnQ6IHRoaXMuc2VsZiA/IHVuZGVmaW5lZCA6IHRoaXMuI3BhcmVudEdVST8uZ3VpIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLiNzZXR1cEV2ZW50cygpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhpcy4jYnVpbGRHVUkodGhpcy5jb25maWcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmd1aVJlYWR5LmVtaXQodGhpcy5ndWkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGd1aSgpOiBHVUkge1xuICAgIHJldHVybiB0aGlzLiNndWk7XG4gIH1cblxuICBhZGRDb250cm9sbGVyKFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgY29udHJvbGxlckNvbmZpZz86IE5neExpbEd1aUNvbnRyb2xsZXJDb25maWdbc3RyaW5nXVxuICApOiBDb250cm9sbGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IFssICwgLi4uY29uZmlnXSA9IGV4dHJhY3RDb250cm9sbGVyQ29uZmlnKGNvbnRyb2xsZXJDb25maWcpO1xuICAgICAgICByZXR1cm4gdGhpcy5ndWkuYWRkKHRoaXMub2JqZWN0LCBwcm9wZXJ0eSwgLi4uY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb2xvcihcbiAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIGNvbG9yQ29uZmlnPzogTmd4TGlsR3VpQ29sb3JDb25maWdbc3RyaW5nXVxuICApOiBDb2xvckNvbnRyb2xsZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJ1bigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5vYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpLmFkZENvbG9yKFxuICAgICAgICAgIHRoaXMub2JqZWN0LFxuICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgIGNvbG9yQ29uZmlnPy5yZ2JTY2FsZVxuICAgICAgICApIGFzIENvbG9yQ29udHJvbGxlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bjxUUmV0dXJuID0gdm9pZD4oZm46ICgpID0+IFRSZXR1cm4pOiBUUmV0dXJuIHtcbiAgICBpZiAodGhpcy56b25lbGVzcykge1xuICAgICAgcmV0dXJuIHRoaXMuI25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLiNndWkuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgI3NldHVwRXZlbnRzKCkge1xuICAgIHRoaXMuZ3VpLm9uQ2hhbmdlKChhcmcwKSA9PiB7XG4gICAgICB0aGlzLmd1aUNoYW5nZS5lbWl0KHsgLi4uYXJnMCwgZ3VpOiB0aGlzLmd1aSB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuZ3VpLm9uRmluaXNoQ2hhbmdlKChhcmcwKSA9PiB7XG4gICAgICB0aGlzLmd1aUZpbmlzaENoYW5nZS5lbWl0KHsgLi4uYXJnMCwgZ3VpOiB0aGlzLmd1aSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gICNidWlsZEdVSShjb25maWc6IE5neExpbEd1aUNvbmZpZywgZ3VpID0gdGhpcy5ndWkpIHtcbiAgICBjb25zdCB7IGd1aXMsIGNvbG9ycywgb2JqZWN0LCBjb250cm9sbGVycyB9ID0gY29uZmlnIGFzIE5neExpbEd1aUNvbmZpZztcblxuICAgIGZvciAoY29uc3QgW2NvbnRyb2xsZXJLZXksIGNvbnRyb2xsZXJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBjb250cm9sbGVycyB8fCB7fVxuICAgICkpIHtcbiAgICAgIGNvbnN0IFtvbkNoYW5nZSwgb25GaW5pc2hDaGFuZ2UsIC4uLmNvbmZpZ10gPVxuICAgICAgICBleHRyYWN0Q29udHJvbGxlckNvbmZpZyhjb250cm9sbGVyVmFsdWUpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IGd1aS5hZGQob2JqZWN0LCBjb250cm9sbGVyS2V5LCAuLi5jb25maWcpO1xuICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbnRyb2xsZXIub25DaGFuZ2UoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBvbkNoYW5nZSh7IHZhbHVlLCBjb250cm9sbGVyIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9uRmluaXNoQ2hhbmdlKSB7XG4gICAgICAgIGNvbnRyb2xsZXIub25GaW5pc2hDaGFuZ2UoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBvbkZpbmlzaENoYW5nZSh7IHZhbHVlLCBjb250cm9sbGVyIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb2xvcktleSwgY29sb3JWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29sb3JzIHx8IHt9KSkge1xuICAgICAgY29uc3QgeyByZ2JTY2FsZSwgb25DaGFuZ2UsIG9uRmluaXNoQ2hhbmdlIH0gPSBjb2xvclZhbHVlO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IGd1aS5hZGRDb2xvcihvYmplY3QsIGNvbG9yS2V5LCByZ2JTY2FsZSk7XG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgY29udHJvbGxlci5vbkNoYW5nZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIG9uQ2hhbmdlKHsgdmFsdWUsIGNvbnRyb2xsZXIgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25GaW5pc2hDaGFuZ2UpIHtcbiAgICAgICAgY29udHJvbGxlci5vbkZpbmlzaENoYW5nZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIG9uRmluaXNoQ2hhbmdlKHsgdmFsdWUsIGNvbnRyb2xsZXIgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZvbGRlcktleSwgZm9sZGVyQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhndWlzIHx8IHt9KSkge1xuICAgICAgY29uc3QgZm9sZGVyID0gZ3VpLmFkZEZvbGRlcihmb2xkZXJLZXkpO1xuICAgICAgdGhpcy4jYnVpbGRHVUkoZm9sZGVyQ29uZmlnLCBmb2xkZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0Q29udHJvbGxlckNvbmZpZyhcbiAgY29udHJvbGxlckNvbmZpZz86IE5neExpbEd1aUNvbnRyb2xsZXJDb25maWdbc3RyaW5nXVxuKTogW1xuICAoKGFyZzogTmd4TGlsR3VpQ29udHJvbGxlckNoYW5nZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQsXG4gICgoYXJnOiBOZ3hMaWxHdWlDb250cm9sbGVyQ2hhbmdlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCxcbiAgKG51bWJlciB8IHN0cmluZ1tdIHwgQW55UmVjb3JkKT8sXG4gIG51bWJlcj8sXG4gIG51bWJlcj9cbl0ge1xuICBjb25zdCBjb25maWc6IFtcbiAgICAoKGFyZzogTmd4TGlsR3VpQ29udHJvbGxlckNoYW5nZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQsXG4gICAgKChhcmc6IE5neExpbEd1aUNvbnRyb2xsZXJDaGFuZ2UpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICAgIChudW1iZXIgfCBzdHJpbmdbXSB8IEFueVJlY29yZCk/LFxuICAgIG51bWJlcj8sXG4gICAgbnVtYmVyP1xuICBdID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcblxuICBpZiAoY29udHJvbGxlckNvbmZpZykge1xuICAgIGNvbmZpZ1swXSA9IGNvbnRyb2xsZXJDb25maWcub25DaGFuZ2U7XG4gICAgY29uZmlnWzFdID0gY29udHJvbGxlckNvbmZpZy5vbkZpbmlzaENoYW5nZTtcblxuICAgIGNvbmZpZ1syXSA9XG4gICAgICAoY29udHJvbGxlckNvbmZpZyBhcyBOZ3hMaWxHdWlDb250cm9sbGVyU2VsZWN0Q29uZmlnKS5jb2xsZWN0aW9uIHx8XG4gICAgICAoY29udHJvbGxlckNvbmZpZyBhcyBOZ3hMaWxHdWlDb250cm9sbGVyTnVtYmVyQ29uZmlnKS5taW47XG5cbiAgICBjb25maWdbM10gPSAoY29udHJvbGxlckNvbmZpZyBhcyBOZ3hMaWxHdWlDb250cm9sbGVyTnVtYmVyQ29uZmlnKS5tYXg7XG4gICAgY29uZmlnWzRdID0gKGNvbnRyb2xsZXJDb25maWcgYXMgTmd4TGlsR3VpQ29udHJvbGxlck51bWJlckNvbmZpZykuc3RlcDtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG4iXX0=