@nova-ui/bits
Version:
SolarWinds Nova Framework
136 lines • 23.8 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { DOCUMENT } from "@angular/common";
import { ApplicationRef, ComponentFactoryResolver, Inject, Injectable, Injector, TemplateRef, } from "@angular/core";
import isNil from "lodash/isNil";
import { DialogBackdropComponent } from "./dialog-backdrop.component";
import { NuiActiveDialog, NuiDialogRef } from "./dialog-ref";
import { DialogComponent } from "./dialog.component";
import { ContentRef } from "../../services/content-ref";
import { OverlayContainerService } from "../overlay/public-api";
import * as i0 from "@angular/core";
import * as i1 from "../overlay/public-api";
/**
* @dynamic
* @ignore
*/
export class DialogStackService {
constructor(applicationRef, injector, factoryResolver, overlayContainerService, document) {
this.applicationRef = applicationRef;
this.injector = injector;
this.factoryResolver = factoryResolver;
this.overlayContainerService = overlayContainerService;
this.document = document;
this.windowAttributes = ["backdrop", "keyboard", "size", "windowClass"];
}
open(moduleCFR, contentInjector, content, options) {
let containerEl = options.container
? this.document.querySelector(options.container)
: this.document.body;
// This handles the case when the nui-dialog is being used within the nui-overlay based components
if (options.useOverlay) {
containerEl = options.container
? this.document.querySelector(options.container)
: this.overlayContainerService.getOverlayContainer();
}
if (!containerEl) {
throw new Error(`The specified dialog container '${options.container || "body"}' was not found in the DOM.`);
}
const activeDialog = new NuiActiveDialog();
const contentRef = this.getContentRef(moduleCFR, options.injector || contentInjector, content, activeDialog);
const backdropCmptRef = options.backdrop !== false
? this.attachBackdrop(containerEl)
: undefined;
const windowCmptRef = this.attachWindowComponent(containerEl, contentRef, DialogComponent);
const nuiDialogRef = new NuiDialogRef(windowCmptRef, contentRef, backdropCmptRef, options.beforeDismiss);
activeDialog.close = (result) => {
nuiDialogRef.close(result);
};
activeDialog.dismiss = (reason) => {
nuiDialogRef.dismiss(reason);
};
this.applyWindowOptions(windowCmptRef.instance, options);
return nuiDialogRef;
}
attachBackdrop(containerEl) {
const backdropFactory = this.factoryResolver.resolveComponentFactory(DialogBackdropComponent);
const backdropCmptRef = backdropFactory.create(this.injector);
this.applicationRef.attachView(backdropCmptRef.hostView);
containerEl.appendChild(backdropCmptRef.location.nativeElement);
return backdropCmptRef;
}
attachWindowComponent(containerEl, contentRef, component) {
const windowFactory = this.factoryResolver.resolveComponentFactory(component);
const windowCmptRef = windowFactory.create(this.injector, contentRef.nodes);
this.applicationRef.attachView(windowCmptRef.hostView);
containerEl.appendChild(windowCmptRef.location.nativeElement);
return windowCmptRef;
}
applyWindowOptions(windowInstance, options) {
this.windowAttributes.forEach((optionName) => {
if (!isNil(options[optionName])) {
windowInstance[optionName] = options[optionName];
}
});
}
getContentRef(moduleCFR, contentInjector, content, context) {
if (!content) {
return new ContentRef([]);
}
else if (content instanceof TemplateRef) {
return this.createFromTemplateRef(content, context);
}
else if (typeof content === "string") {
return this.createFromString(content);
}
else {
return this.createFromComponent(moduleCFR, contentInjector, content, context);
}
}
createFromTemplateRef(content, context) {
const viewRef = content.createEmbeddedView(context);
this.applicationRef.attachView(viewRef);
return new ContentRef([viewRef.rootNodes], viewRef);
}
createFromString(content) {
const component = this.document.createTextNode(`${content}`);
return new ContentRef([[component]]);
}
createFromComponent(moduleCFR, contentInjector, content, context) {
const contentCmptFactory = moduleCFR.resolveComponentFactory(content);
const dialogContentInjector = Injector.create({
providers: [{ provide: NuiActiveDialog, useValue: context }],
parent: contentInjector,
});
const componentRef = contentCmptFactory.create(dialogContentInjector);
this.applicationRef.attachView(componentRef.hostView);
return new ContentRef([[componentRef.location.nativeElement]], componentRef.hostView, componentRef);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogStackService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }, { token: i0.ComponentFactoryResolver }, { token: i1.OverlayContainerService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogStackService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogStackService, decorators: [{
type: Injectable,
args: [{ providedIn: "root" }]
}], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.Injector }, { type: i0.ComponentFactoryResolver }, { type: i1.OverlayContainerService }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXN0YWNrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2ctc3RhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDSCxjQUFjLEVBRWQsd0JBQXdCLEVBRXhCLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsR0FDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFFakMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBRWhFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxrQkFBa0I7SUFHM0IsWUFDWSxjQUE4QixFQUM5QixRQUFrQixFQUNsQixlQUF5QyxFQUN6Qyx1QkFBZ0QsRUFDOUIsUUFBa0I7UUFKcEMsbUJBQWMsR0FB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QyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDdkMsWUFBWSxDQUFDLFFBQVEsRUFDckIsWUFBWSxDQUNmLENBQUM7SUFDTixDQUFDOytHQXJLUSxrQkFBa0IsdUpBUWYsUUFBUTttSEFSWCxrQkFBa0IsY0FETCxNQUFNOzs0RkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBU3pCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeSxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RhYmxlLFxuICAgIEluamVjdG9yLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcblxuaW1wb3J0IHsgRGlhbG9nQmFja2Ryb3BDb21wb25lbnQgfSBmcm9tIFwiLi9kaWFsb2ctYmFja2Ryb3AuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOdWlBY3RpdmVEaWFsb2csIE51aURpYWxvZ1JlZiB9IGZyb20gXCIuL2RpYWxvZy1yZWZcIjtcbmltcG9ydCB7IERpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCIuL2RpYWxvZy5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbnRlbnRSZWYgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY29udGVudC1yZWZcIjtcbmltcG9ydCB7IE92ZXJsYXlDb250YWluZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL292ZXJsYXkvcHVibGljLWFwaVwiO1xuXG4vKipcbiAqIEBkeW5hbWljXG4gKiBAaWdub3JlXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcbmV4cG9ydCBjbGFzcyBEaWFsb2dTdGFja1NlcnZpY2Uge1xuICAgIHByaXZhdGUgd2luZG93QXR0cmlidXRlcyA9IFtcImJhY2tkcm9wXCIsIFwia2V5Ym9hcmRcIiwgXCJzaXplXCIsIFwid2luZG93Q2xhc3NcIl07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBwcml2YXRlIG92ZXJsYXlDb250YWluZXJTZXJ2aWNlOiBPdmVybGF5Q29udGFpbmVyU2VydmljZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHt9XG5cbiAgICBvcGVuKFxuICAgICAgICBtb2R1bGVDRlI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgY29udGVudEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgY29udGVudDogYW55LFxuICAgICAgICBvcHRpb25zOiBhbnlcbiAgICApOiBOdWlEaWFsb2dSZWYge1xuICAgICAgICBsZXQgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50ID0gb3B0aW9ucy5jb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMuY29udGFpbmVyKVxuICAgICAgICAgICAgOiB0aGlzLmRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gdGhlIG51aS1kaWFsb2cgaXMgYmVpbmcgdXNlZCB3aXRoaW4gdGhlIG51aS1vdmVybGF5IGJhc2VkIGNvbXBvbmVudHNcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlT3ZlcmxheSkge1xuICAgICAgICAgICAgY29udGFpbmVyRWwgPSBvcHRpb25zLmNvbnRhaW5lclxuICAgICAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMuY29udGFpbmVyKVxuICAgICAgICAgICAgICAgIDogdGhpcy5vdmVybGF5Q29udGFpbmVyU2VydmljZS5nZXRPdmVybGF5Q29udGFpbmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnRhaW5lckVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBzcGVjaWZpZWQgZGlhbG9nIGNvbnRhaW5lciAnJHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250YWluZXIgfHwgXCJib2R5XCJcbiAgICAgICAgICAgICAgICB9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBET00uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZURpYWxvZyA9IG5ldyBOdWlBY3RpdmVEaWFsb2coKTtcbiAgICAgICAgY29uc3QgY29udGVudFJlZiA9IHRoaXMuZ2V0Q29udGVudFJlZihcbiAgICAgICAgICAgIG1vZHVsZUNGUixcbiAgICAgICAgICAgIG9wdGlvbnMuaW5qZWN0b3IgfHwgY29udGVudEluamVjdG9yLFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIGFjdGl2ZURpYWxvZ1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJhY2tkcm9wQ21wdFJlZjpcbiAgICAgICAgICAgIHwgQ29tcG9uZW50UmVmPERpYWxvZ0JhY2tkcm9wQ29tcG9uZW50PlxuICAgICAgICAgICAgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZHJvcCAhPT0gZmFsc2VcbiAgICAgICAgICAgICAgICA/IHRoaXMuYXR0YWNoQmFja2Ryb3AoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHdpbmRvd0NtcHRSZWY6IENvbXBvbmVudFJlZjxEaWFsb2dDb21wb25lbnQ+ID1cbiAgICAgICAgICAgIHRoaXMuYXR0YWNoV2luZG93Q29tcG9uZW50KFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRSZWYsXG4gICAgICAgICAgICAgICAgRGlhbG9nQ29tcG9uZW50XG4gICAgICAgICAgICApO1xuICAgICAgICBjb25zdCBudWlEaWFsb2dSZWY6IE51aURpYWxvZ1JlZiA9IG5ldyBOdWlEaWFsb2dSZWYoXG4gICAgICAgICAgICB3aW5kb3dDbXB0UmVmLFxuICAgICAgICAgICAgY29udGVudFJlZixcbiAgICAgICAgICAgIGJhY2tkcm9wQ21wdFJlZixcbiAgICAgICAgICAgIG9wdGlvbnMuYmVmb3JlRGlzbWlzc1xuICAgICAgICApO1xuXG4gICAgICAgIGFjdGl2ZURpYWxvZy5jbG9zZSA9IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgbnVpRGlhbG9nUmVmLmNsb3NlKHJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICAgIGFjdGl2ZURpYWxvZy5kaXNtaXNzID0gKHJlYXNvbjogYW55KSA9PiB7XG4gICAgICAgICAgICBudWlEaWFsb2dSZWYuZGlzbWlzcyhyZWFzb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYXBwbHlXaW5kb3dPcHRpb25zKHdpbmRvd0NtcHRSZWYuaW5zdGFuY2UsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbnVpRGlhbG9nUmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoQmFja2Ryb3AoXG4gICAgICAgIGNvbnRhaW5lckVsOiBhbnlcbiAgICApOiBDb21wb25lbnRSZWY8RGlhbG9nQmFja2Ryb3BDb21wb25lbnQ+IHtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PERpYWxvZ0JhY2tkcm9wQ29tcG9uZW50PiA9XG4gICAgICAgICAgICB0aGlzLmZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShcbiAgICAgICAgICAgICAgICBEaWFsb2dCYWNrZHJvcENvbXBvbmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BDbXB0UmVmID0gYmFja2Ryb3BGYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KGJhY2tkcm9wQ21wdFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKGJhY2tkcm9wQ21wdFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGJhY2tkcm9wQ21wdFJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaFdpbmRvd0NvbXBvbmVudChcbiAgICAgICAgY29udGFpbmVyRWw6IGFueSxcbiAgICAgICAgY29udGVudFJlZjogYW55LFxuICAgICAgICBjb21wb25lbnQ6IGFueVxuICAgICk6IENvbXBvbmVudFJlZjxhbnk+IHtcbiAgICAgICAgY29uc3Qgd2luZG93RmFjdG9yeSA9XG4gICAgICAgICAgICB0aGlzLmZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuICAgICAgICBjb25zdCB3aW5kb3dDbXB0UmVmID0gd2luZG93RmFjdG9yeS5jcmVhdGUoXG4gICAgICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgICAgICAgY29udGVudFJlZi5ub2Rlc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmFwcGxpY2F0aW9uUmVmLmF0dGFjaFZpZXcod2luZG93Q21wdFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKHdpbmRvd0NtcHRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHJldHVybiB3aW5kb3dDbXB0UmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlXaW5kb3dPcHRpb25zKHdpbmRvd0luc3RhbmNlOiBhbnksIG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLndpbmRvd0F0dHJpYnV0ZXMuZm9yRWFjaCgob3B0aW9uTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzTmlsKG9wdGlvbnNbb3B0aW9uTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgd2luZG93SW5zdGFuY2Vbb3B0aW9uTmFtZV0gPSBvcHRpb25zW29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRlbnRSZWYoXG4gICAgICAgIG1vZHVsZUNGUjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBjb250ZW50SW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBjb250ZW50OiBhbnksXG4gICAgICAgIGNvbnRleHQ6IE51aUFjdGl2ZURpYWxvZ1xuICAgICk6IENvbnRlbnRSZWYge1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFJlZihbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGcm9tVGVtcGxhdGVSZWYoY29udGVudCwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZyb21TdHJpbmcoY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGcm9tQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgIG1vZHVsZUNGUixcbiAgICAgICAgICAgICAgICBjb250ZW50SW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGcm9tVGVtcGxhdGVSZWYoXG4gICAgICAgIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgICAgIGNvbnRleHQ6IE51aUFjdGl2ZURpYWxvZ1xuICAgICk6IENvbnRlbnRSZWYge1xuICAgICAgICBjb25zdCB2aWV3UmVmID0gY29udGVudC5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCk7XG4gICAgICAgIHRoaXMuYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyh2aWV3UmVmKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50UmVmKFt2aWV3UmVmLnJvb3ROb2Rlc10sIHZpZXdSZWYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRnJvbVN0cmluZyhjb250ZW50OiBzdHJpbmcpOiBDb250ZW50UmVmIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgJHtjb250ZW50fWApO1xuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoW1tjb21wb25lbnRdXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGcm9tQ29tcG9uZW50KFxuICAgICAgICBtb2R1bGVDRlI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgY29udGVudEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgY29udGVudDogYW55LFxuICAgICAgICBjb250ZXh0OiBOdWlBY3RpdmVEaWFsb2dcbiAgICApOiBDb250ZW50UmVmIHtcbiAgICAgICAgY29uc3QgY29udGVudENtcHRGYWN0b3J5ID0gbW9kdWxlQ0ZSLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbnRlbnQpO1xuICAgICAgICBjb25zdCBkaWFsb2dDb250ZW50SW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOdWlBY3RpdmVEaWFsb2csIHVzZVZhbHVlOiBjb250ZXh0IH1dLFxuICAgICAgICAgICAgcGFyZW50OiBjb250ZW50SW5qZWN0b3IsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb250ZW50Q21wdEZhY3RvcnkuY3JlYXRlKGRpYWxvZ0NvbnRlbnRJbmplY3Rvcik7XG4gICAgICAgIHRoaXMuYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoXG4gICAgICAgICAgICBbW2NvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50XV0sXG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaG9zdFZpZXcsXG4gICAgICAgICAgICBjb21wb25lbnRSZWZcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=