UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

354 lines 31.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ApplicationRef, ComponentFactoryResolver, Directive, Inject, Injectable, Injector, NgModule, NgZone, } from '@angular/core'; import { CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortalOutlet, PortalInjector, PortalModule, TemplatePortal, } from '@angular/cdk/portal'; import { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayPositionBuilder, OverlayRef, ScrollStrategyOptions, } from '@angular/cdk/overlay'; import { Platform } from '@angular/cdk/platform'; import { Directionality } from '@angular/cdk/bidi'; import { NB_DOCUMENT } from '../../../theme.options'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class NbPortalDirective extends CdkPortal { } NbPortalDirective.decorators = [ { type: Directive, args: [{ selector: '[nbPortal]' },] } ]; export class NbPortalOutletDirective extends CdkPortalOutlet { } NbPortalOutletDirective.decorators = [ { type: Directive, args: [{ selector: '[nbPortalOutlet]' },] } ]; /** * @template T */ export class NbComponentPortal extends ComponentPortal { /** * @param {?} component * @param {?=} vcr * @param {?=} injector * @param {?=} cfr */ constructor(component, vcr, injector, cfr) { super(component, vcr, injector); this.cfr = cfr; } } if (false) { /** @type {?} */ NbComponentPortal.prototype.cfr; } /* * TODO remove after @angular/cdk@7.0.0 relased * */ export class NbDomPortalOutlet extends DomPortalOutlet { /** * @param {?} outletElement * @param {?} componentFactoryResolver * @param {?} appRef * @param {?} defaultInjector */ constructor(outletElement, componentFactoryResolver, appRef, defaultInjector) { super(outletElement, componentFactoryResolver, appRef, defaultInjector); this.outletElement = outletElement; this.componentFactoryResolver = componentFactoryResolver; this.appRef = appRef; this.defaultInjector = defaultInjector; } /* * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver. * @param portal Portal to be attached * @returns Reference to the created component. */ /** * @template T * @param {?} portal * @return {?} */ attachComponentPortal(portal) { /** @type {?} */ const resolver = portal.cfr || this.componentFactoryResolver; /** @type {?} */ const componentFactory = resolver.resolveComponentFactory(portal.component); /** @type {?} */ let componentRef; // If the portal specifies a ViewContainerRef, we will use that as the attachment point // for the component (in terms of Angular's component tree, not rendering). // When the ViewContainerRef is missing, we use the factory to create the component directly // and then manually attach the view to the application. if (portal.viewContainerRef) { componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector); this.setDisposeFn(() => componentRef.destroy()); } else { componentRef = componentFactory.create(portal.injector || this.defaultInjector); this.appRef.attachView(componentRef.hostView); this.setDisposeFn(() => { this.appRef.detachView(componentRef.hostView); componentRef.destroy(); }); } // At this point the component has been instantiated, so we move it to the location in the DOM // where we want it to be rendered. this.outletElement.appendChild(this.getComponentRootNode(componentRef)); return componentRef; } /* Gets the root HTMLElement for an instantiated component. */ /** * @private * @param {?} componentRef * @return {?} */ getComponentRootNode(componentRef) { return (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0])); } } if (false) { /** @type {?} */ NbDomPortalOutlet.prototype.outletElement; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.componentFactoryResolver; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.appRef; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.defaultInjector; } export class NbOverlay extends Overlay { /** * @param {?} scrollStrategies * @param {?} overlayContainer * @param {?} componentFactoryResolver * @param {?} positionBuilder * @param {?} keyboardDispatcher * @param {?} injector * @param {?} ngZone * @param {?} document * @param {?} directionality */ constructor(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) { super(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality); this.scrollStrategies = scrollStrategies; this.overlayContainer = overlayContainer; this.componentFactoryResolver = componentFactoryResolver; this.positionBuilder = positionBuilder; this.keyboardDispatcher = keyboardDispatcher; this.injector = injector; this.ngZone = ngZone; this.document = document; this.directionality = directionality; } /* * Creates an overlay. * @param config Configuration applied to the overlay. * @returns Reference to the created overlay. */ /** * @param {?=} config * @return {?} */ create(config) { /** @type {?} */ const host = this.createHostElement(); /** @type {?} */ const pane = this.createPaneElement(host); /** @type {?} */ const portalOutlet = this.createPortalOutlet(pane); /** @type {?} */ const overlayConfig = new OverlayConfig(config); overlayConfig.direction = overlayConfig.direction || this.directionality.value; return new OverlayRef(portalOutlet, host, pane, overlayConfig, this.ngZone, this.keyboardDispatcher, this.document); } /* * Creates the DOM element for an overlay and appends it to the overlay container. * @returns Newly-created pane element */ /** * @protected * @param {?} host * @return {?} */ createPaneElement(host) { /** @type {?} */ const pane = this.document.createElement('div'); pane.id = `cdk-overlay-${NbOverlay.nextUniqueId++}`; pane.classList.add('cdk-overlay-pane'); host.appendChild(pane); return pane; } /* * Creates the host element that wraps around an overlay * and can be used for advanced positioning. * @returns Newly-create host element. */ /** * @protected * @return {?} */ createHostElement() { /** @type {?} */ const host = this.document.createElement('div'); this.overlayContainer.getContainerElement().appendChild(host); return host; } /* * Create a DomPortalOutlet into which the overlay content can be loaded. * @param pane The DOM element to turn into a portal outlet. * @returns A portal outlet for the given DOM element. */ /** * @protected * @param {?} pane * @return {?} */ createPortalOutlet(pane) { // We have to resolve the ApplicationRef later in order to allow people // to use overlay-based providers during app initialization. if (!this.appRef) { this.appRef = this.injector.get(ApplicationRef); } return new NbDomPortalOutlet(pane, this.componentFactoryResolver, this.appRef, this.injector); } } NbOverlay.nextUniqueId = 0; NbOverlay.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbOverlay.ctorParameters = () => [ { type: ScrollStrategyOptions }, { type: OverlayContainer }, { type: ComponentFactoryResolver }, { type: OverlayPositionBuilder }, { type: OverlayKeyboardDispatcher }, { type: Injector }, { type: NgZone }, { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: Directionality } ]; if (false) { /** * @type {?} * @protected */ NbOverlay.nextUniqueId; /** * @type {?} * @protected */ NbOverlay.prototype.appRef; /** @type {?} */ NbOverlay.prototype.scrollStrategies; /** * @type {?} * @protected */ NbOverlay.prototype.overlayContainer; /** * @type {?} * @protected */ NbOverlay.prototype.componentFactoryResolver; /** * @type {?} * @protected */ NbOverlay.prototype.positionBuilder; /** * @type {?} * @protected */ NbOverlay.prototype.keyboardDispatcher; /** * @type {?} * @protected */ NbOverlay.prototype.injector; /** * @type {?} * @protected */ NbOverlay.prototype.ngZone; /** * @type {?} * @private */ NbOverlay.prototype.document; /** * @type {?} * @private */ NbOverlay.prototype.directionality; } export class NbPlatform extends Platform { } NbPlatform.decorators = [ { type: Injectable } ]; export class NbOverlayPositionBuilder extends OverlayPositionBuilder { } NbOverlayPositionBuilder.decorators = [ { type: Injectable } ]; /** * @template T */ export class NbTemplatePortal extends TemplatePortal { /** * @param {?} template * @param {?=} viewContainerRef * @param {?=} context */ constructor(template, viewContainerRef, context) { super(template, viewContainerRef, context); } } export class NbOverlayContainer extends OverlayContainer { } /** @nocollapse */ NbOverlayContainer.ngInjectableDef = i0.defineInjectable({ factory: function NbOverlayContainer_Factory() { return new NbOverlayContainer(i0.inject(i1.DOCUMENT)); }, token: NbOverlayContainer, providedIn: "root" }); export class NbFlexibleConnectedPositionStrategy extends FlexibleConnectedPositionStrategy { } export class NbPortalInjector extends PortalInjector { } /** @type {?} */ const CDK_MODULES = [OverlayModule, PortalModule]; /* * This module helps us to keep all angular/cdk deps inside our cdk module via providing aliases. * Approach will help us move cdk in separate npm package and refactor nebular/theme code. * */ export class NbCdkMappingModule { /** * @return {?} */ static forRoot() { return (/** @type {?} */ ({ ngModule: NbCdkMappingModule, providers: [ NbOverlay, NbPlatform, NbOverlayPositionBuilder, ], })); } } NbCdkMappingModule.decorators = [ { type: NgModule, args: [{ imports: [...CDK_MODULES], exports: [ ...CDK_MODULES, NbPortalDirective, NbPortalOutletDirective, ], declarations: [NbPortalDirective, NbPortalOutletDirective], },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L21hcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsd0JBQXdCLEVBRXhCLFNBQVMsRUFFVCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFFUixRQUFRLEVBQ1IsTUFBTSxHQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEVBRWYsY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBS0wsaUNBQWlDLEVBQ2pDLE9BQU8sRUFDUCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFHVixxQkFBcUIsR0FDdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBSXJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxTQUFTOzs7WUFEL0MsU0FBUyxTQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTs7QUFLckMsTUFBTSxPQUFPLHVCQUF3QixTQUFRLGVBQWU7OztZQUQzRCxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7Ozs7O0FBSTNDLE1BQU0sT0FBTyxpQkFBMkIsU0FBUSxlQUFrQjs7Ozs7OztJQUNoRSxZQUFZLFNBQTJCLEVBQzNCLEdBQXNCLEVBQ3RCLFFBQW1CLEVBQ1osR0FBOEI7UUFDL0MsS0FBSyxDQUFDLFNBQVMs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dkMsVUFBVTs7QUFLWCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsc0JBQXNCOzs7WUFEbkUsVUFBVTs7Ozs7QUFJWCxNQUFNLE9BQU8sZ0JBQTBCLFNBQVEsY0FBaUI7Ozs7OztJQUM5RCxZQUFZLFFBQXdCLEVBQUUsZ0JBQW1DLEVBQUUsT0FBVztRQUNwRixLQUFLLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7OztBQUd4RCxNQUFNLE9BQU8sbUNBQW9DLFNBQVEsaUNBQWlDO0NBQ3pGO0FBRUQsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGNBQWM7Q0FDbkQ7O01BYUssV0FBVyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQzs7Ozs7QUFlakQsTUFBTSxPQUFPLGtCQUFrQjs7OztJQUM3QixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU8sbUJBQXNCO1lBQzNCLFFBQVEsRUFBRSxrQkFBa0I7WUFDNUIsU0FBUyxFQUFFO2dCQUNULFNBQVM7Z0JBQ1QsVUFBVTtnQkFDVix3QkFBd0I7YUFDekI7U0FDRixFQUFBLENBQUM7SUFDSixDQUFDOzs7WUFuQkYsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUN6QixPQUFPLEVBQUU7b0JBQ1AsR0FBRyxXQUFXO29CQUNkLGlCQUFpQjtvQkFDakIsdUJBQXVCO2lCQUN4QjtnQkFDRCxZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQzthQUMzRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQXBwbGljYXRpb25SZWYsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRW1iZWRkZWRWaWV3UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdG9yLFxyXG4gIE1vZHVsZVdpdGhQcm92aWRlcnMsXHJcbiAgTmdNb2R1bGUsXHJcbiAgTmdab25lLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2RrUG9ydGFsLFxyXG4gIENka1BvcnRhbE91dGxldCxcclxuICBDb21wb25lbnRQb3J0YWwsXHJcbiAgRG9tUG9ydGFsT3V0bGV0LFxyXG4gIFBvcnRhbCxcclxuICBQb3J0YWxJbmplY3RvcixcclxuICBQb3J0YWxNb2R1bGUsXHJcbiAgVGVtcGxhdGVQb3J0YWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50VHlwZSxcclxuICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXHJcbiAgQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcclxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXHJcbiAgT3ZlcmxheSxcclxuICBPdmVybGF5Q29uZmlnLFxyXG4gIE92ZXJsYXlDb250YWluZXIsXHJcbiAgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcixcclxuICBPdmVybGF5TW9kdWxlLFxyXG4gIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgT3ZlcmxheVJlZixcclxuICBQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIFNjcm9sbFN0cmF0ZWd5LFxyXG4gIFNjcm9sbFN0cmF0ZWd5T3B0aW9ucyxcclxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcblxyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5cclxuXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcnRhbF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuYlBvcnRhbE91dGxldF0nIH0pXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbE91dGxldERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbE91dGxldCB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkNvbXBvbmVudFBvcnRhbDxUID0gYW55PiBleHRlbmRzIENvbXBvbmVudFBvcnRhbDxUPiB7XHJcbiAgY29uc3RydWN0b3IoY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LFxyXG4gICAgICAgICAgICAgIHZjcj86IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgICAgICAgICAgaW5qZWN0b3I/OiBJbmplY3RvcixcclxuICAgICAgICAgICAgICBwdWJsaWMgY2ZyPzogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnQsIHZjciwgaW5qZWN0b3IpO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVE9ETyByZW1vdmUgYWZ0ZXIgQGFuZ3VsYXIvY2RrQDcuMC4wIHJlbGFzZWRcclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iRG9tUG9ydGFsT3V0bGV0IGV4dGVuZHMgRG9tUG9ydGFsT3V0bGV0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8qIEVsZW1lbnQgaW50byB3aGljaCB0aGUgY29udGVudCBpcyBwcm9qZWN0ZWQuICovXHJcbiAgICBwdWJsaWMgb3V0bGV0RWxlbWVudDogRWxlbWVudCxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXHJcbiAgICBwcml2YXRlIGRlZmF1bHRJbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHN1cGVyKG91dGxldEVsZW1lbnQsIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgYXBwUmVmLCBkZWZhdWx0SW5qZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBBdHRhY2ggdGhlIGdpdmVuIENvbXBvbmVudFBvcnRhbCB0byBET00gZWxlbWVudCB1c2luZyB0aGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLlxyXG4gICAqIEBwYXJhbSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkXHJcbiAgICogQHJldHVybnMgUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBhdHRhY2hDb21wb25lbnRQb3J0YWw8VD4ocG9ydGFsOiBOYkNvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XHJcbiAgICBjb25zdCByZXNvbHZlciA9IHBvcnRhbC5jZnIgfHwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XHJcbiAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gcmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocG9ydGFsLmNvbXBvbmVudCk7XHJcbiAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VD47XHJcblxyXG4gICAgLy8gSWYgdGhlIHBvcnRhbCBzcGVjaWZpZXMgYSBWaWV3Q29udGFpbmVyUmVmLCB3ZSB3aWxsIHVzZSB0aGF0IGFzIHRoZSBhdHRhY2htZW50IHBvaW50XHJcbiAgICAvLyBmb3IgdGhlIGNvbXBvbmVudCAoaW4gdGVybXMgb2YgQW5ndWxhcidzIGNvbXBvbmVudCB0cmVlLCBub3QgcmVuZGVyaW5nKS5cclxuICAgIC8vIFdoZW4gdGhlIFZpZXdDb250YWluZXJSZWYgaXMgbWlzc2luZywgd2UgdXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGRpcmVjdGx5XHJcbiAgICAvLyBhbmQgdGhlbiBtYW51YWxseSBhdHRhY2ggdGhlIHZpZXcgdG8gdGhlIGFwcGxpY2F0aW9uLlxyXG4gICAgaWYgKHBvcnRhbC52aWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgIGNvbXBvbmVudFJlZiA9IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChcclxuICAgICAgICBjb21wb25lbnRGYWN0b3J5LFxyXG4gICAgICAgIHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcclxuICAgICAgICBwb3J0YWwuaW5qZWN0b3IgfHwgcG9ydGFsLnZpZXdDb250YWluZXJSZWYucGFyZW50SW5qZWN0b3IpO1xyXG5cclxuICAgICAgdGhpcy5zZXREaXNwb3NlRm4oKCkgPT4gY29tcG9uZW50UmVmLmRlc3Ryb3koKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShwb3J0YWwuaW5qZWN0b3IgfHwgdGhpcy5kZWZhdWx0SW5qZWN0b3IpO1xyXG4gICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgIHRoaXMuc2V0RGlzcG9zZUZuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XHJcbiAgICAgICAgY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5zdGFudGlhdGVkLCBzbyB3ZSBtb3ZlIGl0IHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgRE9NXHJcbiAgICAvLyB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgdGhpcy5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmKSk7XHJcblxyXG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcclxuICB9XHJcblxyXG4gIC8qIEdldHMgdGhlIHJvb3QgSFRNTEVsZW1lbnQgZm9yIGFuIGluc3RhbnRpYXRlZCBjb21wb25lbnQuICovXHJcbiAgcHJpdmF0ZSBnZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+KTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5iT3ZlcmxheSBleHRlbmRzIE92ZXJsYXkge1xyXG4gIHByb3RlY3RlZCBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmO1xyXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV4dFVuaXF1ZUlkID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvKiBTY3JvbGxpbmcgc3RyYXRlZ2llcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gb3ZlcmxheS4gKi9cclxuICAgIHB1YmxpYyBzY3JvbGxTdHJhdGVnaWVzOiBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcmxheUNvbnRhaW5lcjogT3ZlcmxheUNvbnRhaW5lcixcclxuICAgIHByb3RlY3RlZCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByb3RlY3RlZCBwb3NpdGlvbkJ1aWxkZXI6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICBwcm90ZWN0ZWQga2V5Ym9hcmREaXNwYXRjaGVyOiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLFxyXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByb3RlY3RlZCBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIEBJbmplY3QoTkJfRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcclxuICAgIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5KSB7XHJcbiAgICBzdXBlcihcclxuICAgICAgc2Nyb2xsU3RyYXRlZ2llcyxcclxuICAgICAgb3ZlcmxheUNvbnRhaW5lcixcclxuICAgICAgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgICBwb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgIGtleWJvYXJkRGlzcGF0Y2hlcixcclxuICAgICAgaW5qZWN0b3IsXHJcbiAgICAgIG5nWm9uZSxcclxuICAgICAgZG9jdW1lbnQsXHJcbiAgICAgIGRpcmVjdGlvbmFsaXR5LFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhbiBvdmVybGF5LlxyXG4gICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBvdmVybGF5LlxyXG4gICAqIEByZXR1cm5zIFJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBvdmVybGF5LlxyXG4gICAqL1xyXG4gIGNyZWF0ZShjb25maWc/OiBPdmVybGF5Q29uZmlnKTogT3ZlcmxheVJlZiB7XHJcbiAgICBjb25zdCBob3N0ID0gdGhpcy5jcmVhdGVIb3N0RWxlbWVudCgpO1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuY3JlYXRlUGFuZUVsZW1lbnQoaG9zdCk7XHJcbiAgICBjb25zdCBwb3J0YWxPdXRsZXQgPSB0aGlzLmNyZWF0ZVBvcnRhbE91dGxldChwYW5lKTtcclxuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyhjb25maWcpO1xyXG5cclxuICAgIG92ZXJsYXlDb25maWcuZGlyZWN0aW9uID0gb3ZlcmxheUNvbmZpZy5kaXJlY3Rpb24gfHwgdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuXHJcbiAgICByZXR1cm4gbmV3IE92ZXJsYXlSZWYocG9ydGFsT3V0bGV0LCBob3N0LCBwYW5lLCBvdmVybGF5Q29uZmlnLCB0aGlzLm5nWm9uZSxcclxuICAgICAgdGhpcy5rZXlib2FyZERpc3BhdGNoZXIsIHRoaXMuZG9jdW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIHRoZSBET00gZWxlbWVudCBmb3IgYW4gb3ZlcmxheSBhbmQgYXBwZW5kcyBpdCB0byB0aGUgb3ZlcmxheSBjb250YWluZXIuXHJcbiAgICogQHJldHVybnMgTmV3bHktY3JlYXRlZCBwYW5lIGVsZW1lbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlUGFuZUVsZW1lbnQoaG9zdDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICBwYW5lLmlkID0gYGNkay1vdmVybGF5LSR7TmJPdmVybGF5Lm5leHRVbmlxdWVJZCsrfWA7XHJcbiAgICBwYW5lLmNsYXNzTGlzdC5hZGQoJ2Nkay1vdmVybGF5LXBhbmUnKTtcclxuICAgIGhvc3QuYXBwZW5kQ2hpbGQocGFuZSk7XHJcblxyXG4gICAgcmV0dXJuIHBhbmU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgdGhlIGhvc3QgZWxlbWVudCB0aGF0IHdyYXBzIGFyb3VuZCBhbiBvdmVybGF5XHJcbiAgICogYW5kIGNhbiBiZSB1c2VkIGZvciBhZHZhbmNlZCBwb3NpdGlvbmluZy5cclxuICAgKiBAcmV0dXJucyBOZXdseS1jcmVhdGUgaG9zdCBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjcmVhdGVIb3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBjb25zdCBob3N0ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMub3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KCkuYXBwZW5kQ2hpbGQoaG9zdCk7XHJcbiAgICByZXR1cm4gaG9zdDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlIGEgRG9tUG9ydGFsT3V0bGV0IGludG8gd2hpY2ggdGhlIG92ZXJsYXkgY29udGVudCBjYW4gYmUgbG9hZGVkLlxyXG4gICAqIEBwYXJhbSBwYW5lIFRoZSBET00gZWxlbWVudCB0byB0dXJuIGludG8gYSBwb3J0YWwgb3V0bGV0LlxyXG4gICAqIEByZXR1cm5zIEEgcG9ydGFsIG91dGxldCBmb3IgdGhlIGdpdmVuIERPTSBlbGVtZW50LlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBjcmVhdGVQb3J0YWxPdXRsZXQocGFuZTogSFRNTEVsZW1lbnQpOiBOYkRvbVBvcnRhbE91dGxldCB7XHJcbiAgICAvLyBXZSBoYXZlIHRvIHJlc29sdmUgdGhlIEFwcGxpY2F0aW9uUmVmIGxhdGVyIGluIG9yZGVyIHRvIGFsbG93IHBlb3BsZVxyXG4gICAgLy8gdG8gdXNlIG92ZXJsYXktYmFzZWQgcHJvdmlkZXJzIGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24uXHJcbiAgICBpZiAoIXRoaXMuYXBwUmVmKSB7XHJcbiAgICAgIHRoaXMuYXBwUmVmID0gdGhpcy5pbmplY3Rvci5nZXQ8QXBwbGljYXRpb25SZWY+KEFwcGxpY2F0aW9uUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IE5iRG9tUG9ydGFsT3V0bGV0KHBhbmUsIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCB0aGlzLmFwcFJlZiwgdGhpcy5pbmplY3Rvcik7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlBsYXRmb3JtIGV4dGVuZHMgUGxhdGZvcm0ge1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIgZXh0ZW5kcyBPdmVybGF5UG9zaXRpb25CdWlsZGVyIHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iVGVtcGxhdGVQb3J0YWw8VCA9IGFueT4gZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbDxUPiB7XHJcbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IFRlbXBsYXRlUmVmPFQ+LCB2aWV3Q29udGFpbmVyUmVmPzogVmlld0NvbnRhaW5lclJlZiwgY29udGV4dD86IFQpIHtcclxuICAgIHN1cGVyKHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyUmVmLCBjb250ZXh0KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXlDb250YWluZXIgZXh0ZW5kcyBPdmVybGF5Q29udGFpbmVyIHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IGV4dGVuZHMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IHtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5iUG9ydGFsSW5qZWN0b3IgZXh0ZW5kcyBQb3J0YWxJbmplY3RvciB7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE5iUG9ydGFsPFQgPSBhbnk+ID0gUG9ydGFsPFQ+O1xyXG5leHBvcnQgdHlwZSBOYk92ZXJsYXlSZWYgPSBPdmVybGF5UmVmO1xyXG5leHBvcnQgdHlwZSBOYkNvbXBvbmVudFR5cGU8VCA9IGFueT4gPSBDb21wb25lbnRUeXBlPFQ+O1xyXG5leHBvcnQgdHlwZSBOYlBvc2l0aW9uU3RyYXRlZ3kgPSBQb3NpdGlvblN0cmF0ZWd5O1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3RlZFBvc2l0aW9uID0gQ29ubmVjdGVkUG9zaXRpb247XHJcbmV4cG9ydCB0eXBlIE5iQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlID0gQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlO1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3Rpb25Qb3NpdGlvblBhaXIgPSBDb25uZWN0aW9uUG9zaXRpb25QYWlyO1xyXG5leHBvcnQgdHlwZSBOYk92ZXJsYXlDb25maWcgPSBPdmVybGF5Q29uZmlnO1xyXG5leHBvcnQgdHlwZSBOYlNjcm9sbFN0cmF0ZWd5T3B0aW9ucyA9IFNjcm9sbFN0cmF0ZWd5T3B0aW9ucztcclxuZXhwb3J0IHR5cGUgTmJTY3JvbGxTdHJhdGVneSA9IFNjcm9sbFN0cmF0ZWd5O1xyXG5cclxuY29uc3QgQ0RLX01PRFVMRVMgPSBbT3ZlcmxheU1vZHVsZSwgUG9ydGFsTW9kdWxlXTtcclxuXHJcbi8qXHJcbiAqIFRoaXMgbW9kdWxlIGhlbHBzIHVzIHRvIGtlZXAgYWxsIGFuZ3VsYXIvY2RrIGRlcHMgaW5zaWRlIG91ciBjZGsgbW9kdWxlIHZpYSBwcm92aWRpbmcgYWxpYXNlcy5cclxuICogQXBwcm9hY2ggd2lsbCBoZWxwIHVzIG1vdmUgY2RrIGluIHNlcGFyYXRlIG5wbSBwYWNrYWdlIGFuZCByZWZhY3RvciBuZWJ1bGFyL3RoZW1lIGNvZGUuXHJcbiAqICovXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogWy4uLkNES19NT0RVTEVTXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICAuLi5DREtfTU9EVUxFUyxcclxuICAgIE5iUG9ydGFsRGlyZWN0aXZlLFxyXG4gICAgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmUsXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtOYlBvcnRhbERpcmVjdGl2ZSwgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmVdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJDZGtNYXBwaW5nTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdCgpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcclxuICAgIHJldHVybiA8TW9kdWxlV2l0aFByb3ZpZGVycz4ge1xyXG4gICAgICBuZ01vZHVsZTogTmJDZGtNYXBwaW5nTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBOYk92ZXJsYXksXHJcbiAgICAgICAgTmJQbGF0Zm9ybSxcclxuICAgICAgICBOYk92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsXHJcbiAgICAgIF0sXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=