UNPKG

devextreme-angular

Version:

Angular UI and visualization components based on DevExtreme widgets

246 lines 32.8 kB
/*! * devextreme-angular * Version: 22.1.14 * Build date: Mon Apr 29 2024 * * Copyright (c) 2012 - 2024 Developer Express Inc. ALL RIGHTS RESERVED * * This software may be modified and distributed under the terms * of the MIT license. See the LICENSE file in the root of the project for details. * * https://github.com/DevExpress/devextreme-angular */ import { Component, PLATFORM_ID, Inject, EventEmitter } from '@angular/core'; import { isPlatformServer } from '@angular/common'; import { makeStateKey } from '@angular/platform-browser'; import { EmitterHelper, NgEventsStrategy } from './events-strategy'; import domAdapter from 'devextreme/core/dom_adapter'; import { triggerHandler } from 'devextreme/events'; import { CollectionNestedOptionContainerImpl } from './nested-option'; import * as i0 from "@angular/core"; import * as i1 from "./template-host"; import * as i2 from "./watcher-helper"; import * as i3 from "@angular/platform-browser"; let serverStateKey; export const getServerStateKey = () => { if (!serverStateKey) { serverStateKey = makeStateKey('DX_isPlatformServer'); } return serverStateKey; }; export class DxComponent { constructor(element, ngZone, templateHost, watcherHelper, transferState, platformId) { this.element = element; this.ngZone = ngZone; this.watcherHelper = watcherHelper; this.transferState = transferState; this.platformId = platformId; this._initialOptions = {}; this._optionsToUpdate = {}; this.optionChangedHandlers = new EventEmitter(); this.isLinked = true; this.changedOptions = {}; this.removedNestedComponents = []; this.widgetUpdateLocked = false; this.templateUpdateRequired = false; this.templates = []; templateHost.setHost(this); this._collectionContainerImpl = new CollectionNestedOptionContainerImpl(this._setOption.bind(this)); this.eventHelper = new EmitterHelper(ngZone, this); } _updateTemplates() { if (this.templates.length && this.templateUpdateRequired) { let updatedTemplates = {}; this.templates.forEach(template => { updatedTemplates[template.name] = template; }); this.instance.option('integrationOptions.templates', updatedTemplates); this.templates = Object.values(updatedTemplates); this.templateUpdateRequired = false; } } _initEvents() { this.instance.on('optionChanged', (e) => { this.changedOptions[e.name] = e.value; const value = e.name === e.fullName ? e.value : e.component.option(e.name); this.eventHelper.fireNgEvent(e.name + 'Change', [value]); this.optionChangedHandlers.emit(e); }); } _initOptions() { this._initialOptions.integrationOptions.watchMethod = this.watcherHelper.getWatchMethod(); } _initPlatform() { if (this.transferState.hasKey(getServerStateKey())) { this._initialOptions.integrationOptions.renderedOnServer = this.transferState.get(getServerStateKey(), null); } else if (isPlatformServer(this.platformId)) { this.transferState.set(getServerStateKey(), true); } } _createEventEmitters(events) { const zone = this.ngZone; this.eventHelper.createEmitters(events); this._initialOptions.eventsStrategy = (instance) => { let strategy = new NgEventsStrategy(instance, zone); events.filter(event => event.subscribe).forEach(event => { strategy.addEmitter(event.subscribe, this[event.emit]); }); return strategy; }; this._initialOptions.nestedComponentOptions = function (component) { return { eventsStrategy: (instance) => { return new NgEventsStrategy(instance, zone); }, nestedComponentOptions: component.option('nestedComponentOptions') }; }; } _shouldOptionChange(name, value) { if (this.changedOptions.hasOwnProperty(name)) { const prevValue = this.changedOptions[name]; delete this.changedOptions[name]; return value !== prevValue; } return true; } clearChangedOptions() { this.changedOptions = {}; } _getOption(name) { return this.instance ? this.instance.option(name) : this._initialOptions[name]; } lockWidgetUpdate() { if (!this.widgetUpdateLocked && this.instance) { this.instance.beginUpdate(); this.widgetUpdateLocked = true; } } unlockWidgetUpdate() { if (this.widgetUpdateLocked) { this.widgetUpdateLocked = false; this.instance.endUpdate(); } } _setOption(name, value) { this.lockWidgetUpdate(); if (!this._shouldOptionChange(name, value)) { return; } if (this.instance) { this.instance.option(name, value); } else { this._initialOptions[name] = value; } } _createWidget(element) { this._initialOptions.integrationOptions = {}; this._initPlatform(); this._initOptions(); this._initialOptions.onInitializing = function () { this.beginUpdate(); }; this.instance = this._createInstance(element, this._initialOptions); this._initEvents(); this._initialOptions = {}; } _destroyWidget() { this.removedNestedComponents = []; if (this.instance) { let element = this.instance.element(); triggerHandler(element, 'dxremove', { _angularIntegration: true }); this.instance.dispose(); domAdapter.removeElement(element); } } ngOnChanges(changes) { for (let key in changes) { let change = changes[key]; if (change.currentValue !== this[key]) { this._optionsToUpdate[key] = changes[key].currentValue; } } } ngOnInit() { this._createWidget(this.element.nativeElement); } ngDoCheck() { this.applyOptions(); } ngAfterContentChecked() { this._updateTemplates(); this.applyOptions(); this.resetOptions(); this.unlockWidgetUpdate(); } ngAfterViewInit() { this._updateTemplates(); this.instance.endUpdate(); this.recreatedNestedComponents = []; } applyOptions() { if (Object.keys(this._optionsToUpdate).length) { if (this.instance) { this.instance.option(this._optionsToUpdate); } this._optionsToUpdate = {}; } } resetOptions(collectionName) { if (this.instance) { this.removedNestedComponents.filter(option => option && !this.isRecreated(option) && collectionName ? option.startsWith(collectionName) : true) .forEach(option => { this.instance.resetOption(option); }); this.removedNestedComponents = []; this.recreatedNestedComponents = []; } } isRecreated(name) { return this.recreatedNestedComponents && this.recreatedNestedComponents.some(nestedComponent => nestedComponent.getOptionPath() === name); } setTemplate(template) { this.templates.push(template); this.templateUpdateRequired = true; } setChildren(propertyName, items) { this.resetOptions(propertyName); return this._collectionContainerImpl.setChildren(propertyName, items); } } /** @nocollapse */ DxComponent.ɵfac = function DxComponent_Factory(t) { return new (t || DxComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1.DxTemplateHost), i0.ɵɵdirectiveInject(i2.WatcherHelper), i0.ɵɵdirectiveInject(i3.TransferState), i0.ɵɵdirectiveInject(PLATFORM_ID)); }; /** @nocollapse */ DxComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DxComponent, selectors: [["ng-component"]], features: [i0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function DxComponent_Template(rf, ctx) { }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxComponent, [{ type: Component, args: [{ template: '' }] }], function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.DxTemplateHost }, { type: i2.WatcherHelper }, { type: i3.TransferState }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, null); })(); export class DxComponentExtension extends DxComponent { createInstance(element) { this._createWidget(element); } ngOnInit() { } ngAfterViewInit() { this._createWidget(this.element.nativeElement); this.instance.endUpdate(); } } /** @nocollapse */ DxComponentExtension.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵDxComponentExtension_BaseFactory; return function DxComponentExtension_Factory(t) { return (ɵDxComponentExtension_BaseFactory || (ɵDxComponentExtension_BaseFactory = i0.ɵɵgetInheritedFactory(DxComponentExtension)))(t || DxComponentExtension); }; }(); /** @nocollapse */ DxComponentExtension.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DxComponentExtension, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 0, vars: 0, template: function DxComponentExtension_Template(rf, ctx) { }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxComponentExtension, [{ type: Component, args: [{ template: '' }] }], null, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZGlzdC9jb3JlL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFDSCxTQUFTLEVBS1QsV0FBVyxFQUNYLE1BQU0sRUFDTixZQUFZLEVBT2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUl4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFcEUsT0FBTyxVQUFVLE1BQU0sNkJBQTZCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFJSCxtQ0FBbUMsRUFDdEMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFFekIsSUFBSSxjQUFjLENBQUM7QUFDbkIsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDakIsY0FBYyxHQUFHLFlBQVksQ0FBTSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzdEO0lBRUQsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBS0YsTUFBTSxPQUFnQixXQUFXO0lBaUo3QixZQUFzQixPQUFtQixFQUM3QixNQUFjLEVBQ3RCLFlBQTRCLEVBQ3BCLGFBQTRCLEVBQzVCLGFBQTRCLEVBQ1AsVUFBZTtRQUwxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNQLGVBQVUsR0FBVixVQUFVLENBQUs7UUFwSnhDLG9CQUFlLEdB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QUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlCLENBQUM7OzJSQVhpQixvQkFBb0IsU0FBcEIsb0JBQW9CO3NHQUFwQixvQkFBb0I7dUZBQXBCLG9CQUFvQjtjQUh6QyxTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLEVBQUU7YUFDZiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKiBWZXJzaW9uOiAyMi4xLjE0XG4gKiBCdWlsZCBkYXRlOiBNb24gQXByIDI5IDIwMjRcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgLSAyMDI0IERldmVsb3BlciBFeHByZXNzIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRFxuICpcbiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXNcbiAqIG9mIHRoZSBNSVQgbGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QgZm9yIGRldGFpbHMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RldkV4cHJlc3MvZGV2ZXh0cmVtZS1hbmd1bGFyXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBOZ1pvbmUsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgSW5qZWN0LFxuICAgIEV2ZW50RW1pdHRlcixcblxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgRG9DaGVjayxcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNmZXJTdGF0ZSwgbWFrZVN0YXRlS2V5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IER4VGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlJztcbmltcG9ydCB7IElEeFRlbXBsYXRlSG9zdCwgRHhUZW1wbGF0ZUhvc3QgfSBmcm9tICcuL3RlbXBsYXRlLWhvc3QnO1xuaW1wb3J0IHsgRW1pdHRlckhlbHBlciwgTmdFdmVudHNTdHJhdGVneSB9IGZyb20gJy4vZXZlbnRzLXN0cmF0ZWd5JztcbmltcG9ydCB7IFdhdGNoZXJIZWxwZXIgfSBmcm9tICcuL3dhdGNoZXItaGVscGVyJztcbmltcG9ydCBkb21BZGFwdGVyIGZyb20gJ2RldmV4dHJlbWUvY29yZS9kb21fYWRhcHRlcic7XG5pbXBvcnQgeyB0cmlnZ2VySGFuZGxlciB9IGZyb20gJ2RldmV4dHJlbWUvZXZlbnRzJztcblxuaW1wb3J0IHtcbiAgICBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLFxuICAgIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uLFxuICAgIElDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVyLFxuICAgIENvbGxlY3Rpb25OZXN0ZWRPcHRpb25Db250YWluZXJJbXBsXG59IGZyb20gJy4vbmVzdGVkLW9wdGlvbic7XG5cbmxldCBzZXJ2ZXJTdGF0ZUtleTtcbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJTdGF0ZUtleSA9ICgpID0+IHtcbiAgICBpZiAoIXNlcnZlclN0YXRlS2V5KSB7XG4gICAgICAgIHNlcnZlclN0YXRlS2V5ID0gbWFrZVN0YXRlS2V5PGFueT4oJ0RYX2lzUGxhdGZvcm1TZXJ2ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmVyU3RhdGVLZXk7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHhDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCxcbiAgICBJTmVzdGVkT3B0aW9uQ29udGFpbmVyLCBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lciwgSUR4VGVtcGxhdGVIb3N0IHtcbiAgICBwcml2YXRlIF9pbml0aWFsT3B0aW9uczogYW55ID0ge307XG4gICAgcHJvdGVjdGVkIF9vcHRpb25zVG9VcGRhdGU6IGFueSA9IHt9O1xuICAgIHByaXZhdGUgX2NvbGxlY3Rpb25Db250YWluZXJJbXBsOiBJQ29sbGVjdGlvbk5lc3RlZE9wdGlvbkNvbnRhaW5lcjtcbiAgICBldmVudEhlbHBlcjogRW1pdHRlckhlbHBlcjtcbiAgICBvcHRpb25DaGFuZ2VkSGFuZGxlcnM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRlbXBsYXRlczogRHhUZW1wbGF0ZURpcmVjdGl2ZVtdO1xuICAgIGluc3RhbmNlOiBhbnk7XG4gICAgaXNMaW5rZWQgPSB0cnVlO1xuICAgIGNoYW5nZWRPcHRpb25zID0ge307XG4gICAgcmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcbiAgICByZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzOiBhbnlbXTtcbiAgICB3aWRnZXRVcGRhdGVMb2NrZWQgPSBmYWxzZTtcbiAgICB0ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF91cGRhdGVUZW1wbGF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlcy5sZW5ndGggJiYgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZFRlbXBsYXRlcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFRlbXBsYXRlc1t0ZW1wbGF0ZS5uYW1lXSA9IHRlbXBsYXRlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLm9wdGlvbignaW50ZWdyYXRpb25PcHRpb25zLnRlbXBsYXRlcycsIHVwZGF0ZWRUZW1wbGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgPSBPYmplY3QudmFsdWVzKHVwZGF0ZWRUZW1wbGF0ZXMpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0RXZlbnRzKCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlLm9uKCdvcHRpb25DaGFuZ2VkJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnNbZS5uYW1lXSA9IGUudmFsdWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZS5uYW1lID09PSBlLmZ1bGxOYW1lID8gZS52YWx1ZSA6IGUuY29tcG9uZW50Lm9wdGlvbihlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5ldmVudEhlbHBlci5maXJlTmdFdmVudChlLm5hbWUgKyAnQ2hhbmdlJywgW3ZhbHVlXSk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbkNoYW5nZWRIYW5kbGVycy5lbWl0KGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0T3B0aW9ucygpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zLndhdGNoTWV0aG9kID0gdGhpcy53YXRjaGVySGVscGVyLmdldFdhdGNoTWV0aG9kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFBsYXRmb3JtKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2ZlclN0YXRlLmhhc0tleShnZXRTZXJ2ZXJTdGF0ZUtleSgpKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zLnJlbmRlcmVkT25TZXJ2ZXIgPSB0aGlzLnRyYW5zZmVyU3RhdGUuZ2V0KGdldFNlcnZlclN0YXRlS2V5KCksIG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2ZlclN0YXRlLnNldChnZXRTZXJ2ZXJTdGF0ZUtleSgpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY3JlYXRlRXZlbnRFbWl0dGVycyhldmVudHMpIHtcbiAgICAgICAgY29uc3Qgem9uZSA9IHRoaXMubmdab25lO1xuICAgICAgICB0aGlzLmV2ZW50SGVscGVyLmNyZWF0ZUVtaXR0ZXJzKGV2ZW50cyk7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuZXZlbnRzU3RyYXRlZ3kgPSAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICAgIGxldCBzdHJhdGVneSA9IG5ldyBOZ0V2ZW50c1N0cmF0ZWd5KGluc3RhbmNlLCB6b25lKTtcblxuICAgICAgICAgICAgZXZlbnRzLmZpbHRlcihldmVudCA9PiBldmVudC5zdWJzY3JpYmUpLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWd5LmFkZEVtaXR0ZXIoZXZlbnQuc3Vic2NyaWJlLCB0aGlzW2V2ZW50LmVtaXRdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMubmVzdGVkQ29tcG9uZW50T3B0aW9ucyA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXZlbnRzU3RyYXRlZ3k6IChpbnN0YW5jZSkgPT4geyByZXR1cm4gbmV3IE5nRXZlbnRzU3RyYXRlZ3koaW5zdGFuY2UsIHpvbmUpOyB9LFxuICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudE9wdGlvbnM6IGNvbXBvbmVudC5vcHRpb24oJ25lc3RlZENvbXBvbmVudE9wdGlvbnMnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfc2hvdWxkT3B0aW9uQ2hhbmdlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgcHJldlZhbHVlID0gdGhpcy5jaGFuZ2VkT3B0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5nZWRPcHRpb25zW25hbWVdO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHByZXZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbGVhckNoYW5nZWRPcHRpb25zKCkge1xuICAgICAgICB0aGlzLmNoYW5nZWRPcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9nZXRPcHRpb24obmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlID9cbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKG5hbWUpIDpcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdO1xuICAgIH1cblxuICAgIGxvY2tXaWRnZXRVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy53aWRnZXRVcGRhdGVMb2NrZWQgJiYgdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5iZWdpblVwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy53aWRnZXRVcGRhdGVMb2NrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5sb2NrV2lkZ2V0VXBkYXRlKCkge1xuICAgICAgICBpZiAodGhpcy53aWRnZXRVcGRhdGVMb2NrZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0VXBkYXRlTG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmVuZFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zZXRPcHRpb24obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubG9ja1dpZGdldFVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5fc2hvdWxkT3B0aW9uQ2hhbmdlKG5hbWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2Uub3B0aW9uKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2NyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIG9wdGlvbnMpXG5cbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZVdpZGdldChlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaW50ZWdyYXRpb25PcHRpb25zID0ge307XG4gICAgICAgIHRoaXMuX2luaXRQbGF0Zm9ybSgpO1xuICAgICAgICB0aGlzLl9pbml0T3B0aW9ucygpO1xuXG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLm9uSW5pdGlhbGl6aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5iZWdpblVwZGF0ZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5fY3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgdGhpcy5faW5pdGlhbE9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9pbml0RXZlbnRzKCk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZXN0cm95V2lkZ2V0KCkge1xuICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzID0gW107XG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5zdGFuY2UuZWxlbWVudCgpO1xuICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXIoZWxlbWVudCwgJ2R4cmVtb3ZlJywgeyBfYW5ndWxhckludGVncmF0aW9uOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICBkb21BZGFwdGVyLnJlbW92ZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgdGVtcGxhdGVIb3N0OiBEeFRlbXBsYXRlSG9zdCxcbiAgICAgICAgcHJpdmF0ZSB3YXRjaGVySGVscGVyOiBXYXRjaGVySGVscGVyLFxuICAgICAgICBwcml2YXRlIHRyYW5zZmVyU3RhdGU6IFRyYW5zZmVyU3RhdGUsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzID0gW107XG4gICAgICAgIHRlbXBsYXRlSG9zdC5zZXRIb3N0KHRoaXMpO1xuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbCA9IG5ldyBDb2xsZWN0aW9uTmVzdGVkT3B0aW9uQ29udGFpbmVySW1wbCh0aGlzLl9zZXRPcHRpb24uYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuZXZlbnRIZWxwZXIgPSBuZXcgRW1pdHRlckhlbHBlcihuZ1pvbmUsIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSBjaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gdGhpc1trZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9uc1RvVXBkYXRlW2tleV0gPSBjaGFuZ2VzW2tleV0uY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVdpZGdldCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVGVtcGxhdGVzKCk7XG4gICAgICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRPcHRpb25zKCk7XG4gICAgICAgIHRoaXMudW5sb2NrV2lkZ2V0VXBkYXRlKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl91cGRhdGVUZW1wbGF0ZXMoKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcbiAgICAgICAgdGhpcy5yZWNyZWF0ZWROZXN0ZWRDb21wb25lbnRzID0gW107XG4gICAgfVxuXG4gICAgYXBwbHlPcHRpb25zKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fb3B0aW9uc1RvVXBkYXRlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5vcHRpb24odGhpcy5fb3B0aW9uc1RvVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNUb1VwZGF0ZSA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRPcHRpb25zKGNvbGxlY3Rpb25OYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZWROZXN0ZWRDb21wb25lbnRzLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNSZWNyZWF0ZWQob3B0aW9uKSAmJlxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25OYW1lID8gb3B0aW9uLnN0YXJ0c1dpdGgoY29sbGVjdGlvbk5hbWUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnJlc2V0T3B0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZE5lc3RlZENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNSZWNyZWF0ZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY3JlYXRlZE5lc3RlZENvbXBvbmVudHMgJiZcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVkTmVzdGVkQ29tcG9uZW50cy5zb21lKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQuZ2V0T3B0aW9uUGF0aCgpID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRUZW1wbGF0ZSh0ZW1wbGF0ZTogRHhUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5wdXNoKHRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVVwZGF0ZVJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXRDaGlsZHJlbjxUIGV4dGVuZHMgSUNvbGxlY3Rpb25OZXN0ZWRPcHRpb24+KHByb3BlcnR5TmFtZTogc3RyaW5nLCBpdGVtczogUXVlcnlMaXN0PFQ+KSB7XG4gICAgICAgIHRoaXMucmVzZXRPcHRpb25zKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uQ29udGFpbmVySW1wbC5zZXRDaGlsZHJlbihwcm9wZXJ0eU5hbWUsIGl0ZW1zKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeENvbXBvbmVudEV4dGVuc2lvbiBleHRlbmRzIER4Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBjcmVhdGVJbnN0YW5jZShlbGVtZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlV2lkZ2V0KGVsZW1lbnQpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlV2lkZ2V0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmRVcGRhdGUoKTtcbiAgICB9XG59XG4iXX0=