UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

111 lines 20.3 kB
// © 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 { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, Output, } from "@angular/core"; import { Subject } from "rxjs"; import { map } from "rxjs/operators"; import { EventBus, uuid } from "@nova-ui/bits"; import { PizzagnaService } from "../../../../../pizzagna/services/pizzagna.service"; import { PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../../../../../types"; import * as i0 from "@angular/core"; import * as i1 from "../../../../../pizzagna/services/pizzagna.service"; import * as i2 from "@angular/common"; import * as i3 from "@nova-ui/bits"; import * as i4 from "../../../items-dynamic/items-dynamic.component"; export class TimeseriesSeriesCollectionConfigurationComponent { static { this.lateLoadKey = "TimeseriesSeriesCollectionConfigurationComponent"; } constructor(pizzagnaService, changeDetector, eventBus) { this.pizzagnaService = pizzagnaService; this.changeDetector = changeDetector; this.eventBus = eventBus; this.series = []; this.formReady = new EventEmitter(); this.destroy$ = new Subject(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } ngOnChanges(changes) { if (changes.allSeries && !changes.allSeries.isFirstChange()) { // if we receive 'allSeries' data from the data source after component initialization, we // re-create the series config components to make them aware of this change this.createSeriesConfigComponents(this.series); setTimeout(() => this.changeDetector.markForCheck()); } } onFormReady(form) { this.form = form; this.formReady.emit(form); this.emptySeries$ = this.form.valueChanges.pipe(map((result) => result.length === 0)); } onItemsChange(series) { this.createSeriesConfigComponents(series); const property = { componentId: this.componentId, pizzagnaKey: PizzagnaLayer.Data, propertyPath: ["series"], }; this.pizzagnaService.setProperty(property, series); } isPossibleToAddSeries() { const total = this.allSeries && this.allSeries.length; const present = this.series && this.series.length; return total > present; } addSeries() { this.onItemsChange([ // @ts-ignore: Types of property 'selectedSeriesId' are incompatible. ...this.series, { id: uuid("series"), // TODO: Provide selectedSeriesId value that corresponds to it's type which is string // @ts-ignore: Types of property 'selectedSeriesId' are incompatible. selectedSeriesId: null, }, ]); } createSeriesConfigComponents(series) { const parentPath = "series"; const componentIds = series.map((tile) => tile.id); this.pizzagnaService.createComponentsFromTemplate(parentPath, componentIds); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeseriesSeriesCollectionConfigurationComponent, deps: [{ token: i1.PizzagnaService }, { token: i0.ChangeDetectorRef }, { token: PIZZAGNA_EVENT_BUS }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TimeseriesSeriesCollectionConfigurationComponent, selector: "nui-timeseries-series-collection-configuration", inputs: { nodes: "nodes", componentId: "componentId", series: "series", availableSeries: "availableSeries", allSeries: "allSeries" }, outputs: { formReady: "formReady" }, usesOnChanges: true, ngImport: i0, template: "<nui-items-dynamic\n [items]=\"series\"\n [nodes]=\"nodes\"\n (itemsChange)=\"onItemsChange($event)\"\n [moveButtons]=\"false\"\n (formReady)=\"onFormReady($event)\"\n></nui-items-dynamic>\n\n<div class=\"pl-4 pr-4\" *ngIf=\"(emptySeries$ | async) && form.touched\">\n <nui-message type=\"critical\" [allowDismiss]=\"false\" i18n>\n <b>At least one series must be added.</b>\n </nui-message>\n</div>\n\n<button\n nui-button\n *ngIf=\"isPossibleToAddSeries()\"\n icon=\"add\"\n displayStyle=\"action\"\n type=\"button\"\n class=\"ml-4 mb-4\"\n (click)=\"addSeries()\"\n i18n\n>\n Add new series\n</button>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }, { kind: "component", type: i3.MessageComponent, selector: "nui-message", inputs: ["type", "allowDismiss", "manualControl"], outputs: ["dismiss"] }, { kind: "component", type: i4.ItemsDynamicComponent, selector: "nui-items-dynamic", inputs: ["items", "moveButtons", "nodes", "headerPrefix"], outputs: ["formReady", "itemsChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeseriesSeriesCollectionConfigurationComponent, decorators: [{ type: Component, args: [{ selector: "nui-timeseries-series-collection-configuration", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nui-items-dynamic\n [items]=\"series\"\n [nodes]=\"nodes\"\n (itemsChange)=\"onItemsChange($event)\"\n [moveButtons]=\"false\"\n (formReady)=\"onFormReady($event)\"\n></nui-items-dynamic>\n\n<div class=\"pl-4 pr-4\" *ngIf=\"(emptySeries$ | async) && form.touched\">\n <nui-message type=\"critical\" [allowDismiss]=\"false\" i18n>\n <b>At least one series must be added.</b>\n </nui-message>\n</div>\n\n<button\n nui-button\n *ngIf=\"isPossibleToAddSeries()\"\n icon=\"add\"\n displayStyle=\"action\"\n type=\"button\"\n class=\"ml-4 mb-4\"\n (click)=\"addSeries()\"\n i18n\n>\n Add new series\n</button>\n" }] }], ctorParameters: () => [{ type: i1.PizzagnaService }, { type: i0.ChangeDetectorRef }, { type: i3.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }], propDecorators: { nodes: [{ type: Input }], componentId: [{ type: Input }], series: [{ type: Input }], availableSeries: [{ type: Input }], allSeries: [{ type: Input }], formReady: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllcy1zZXJpZXMtY29sbGVjdGlvbi1jb25maWd1cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29uZmlndXJhdG9yL2NvbXBvbmVudHMvd2lkZ2V0cy90aW1lc2VyaWVzL3RpbWVzZXJpZXMtc2VyaWVzLWNvbGxlY3Rpb24tY29uZmlndXJhdGlvbi90aW1lc2VyaWVzLXNlcmllcy1jb2xsZWN0aW9uLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWd1cmF0b3IvY29tcG9uZW50cy93aWRnZXRzL3RpbWVzZXJpZXMvdGltZXNlcmllcy1zZXJpZXMtY29sbGVjdGlvbi1jb25maWd1cmF0aW9uL3RpbWVzZXJpZXMtc2VyaWVzLWNvbGxlY3Rpb24tY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxn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QUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQzdDLFVBQVUsRUFDVixZQUFZLENBQ2YsQ0FBQztJQUNOLENBQUM7a0lBdEZRLGdEQUFnRCxrRkFxQjdDLGtCQUFrQjtzSEFyQnJCLGdEQUFnRCxzUkN0RDdELHVwQkEwQkE7OzRGRDRCYSxnREFBZ0Q7a0JBTDVELFNBQVM7K0JBQ0ksZ0RBQWdELG1CQUV6Qyx1QkFBdUIsQ0FBQyxNQUFNOzswQkF1QjFDLE1BQU07MkJBQUMsa0JBQWtCO3lDQWhCckIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBFdmVudEJ1cywgSUV2ZW50LCB1dWlkIH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgSVRpbWVzZXJpZXNXaWRnZXREYXRhIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZXNlcmllcy13aWRnZXQvdHlwZXNcIjtcbmltcG9ydCB7IElQaXp6YWduYVByb3BlcnR5IH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3BpenphZ25hL2Z1bmN0aW9ucy9nZXQtcGl6emFnbmEtcHJvcGVydHktcGF0aFwiO1xuaW1wb3J0IHsgUGl6emFnbmFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3BpenphZ25hL3NlcnZpY2VzL3BpenphZ25hLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgSUhhc0NoYW5nZURldGVjdG9yLFxuICAgIElIYXNGb3JtLFxuICAgIFBpenphZ25hTGF5ZXIsXG4gICAgUElaWkFHTkFfRVZFTlRfQlVTLFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IElUaW1lc2VyaWVzSXRlbUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXRpbWVzZXJpZXMtc2VyaWVzLWNvbGxlY3Rpb24tY29uZmlndXJhdGlvblwiLFxuICAgIHRlbXBsYXRlVXJsOiBcInRpbWVzZXJpZXMtc2VyaWVzLWNvbGxlY3Rpb24tY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbFwiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lc2VyaWVzU2VyaWVzQ29sbGVjdGlvbkNvbmZpZ3VyYXRpb25Db21wb25lbnRcbiAgICBpbXBsZW1lbnRzIElIYXNDaGFuZ2VEZXRlY3RvciwgSUhhc0Zvcm0sIE9uRGVzdHJveSwgT25DaGFuZ2VzXG57XG4gICAgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJUaW1lc2VyaWVzU2VyaWVzQ29sbGVjdGlvbkNvbmZpZ3VyYXRpb25Db21wb25lbnRcIjtcblxuICAgIEBJbnB1dCgpIG5vZGVzOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNlcmllczogSVRpbWVzZXJpZXNJdGVtQ29uZmlndXJhdGlvbltdID0gW107XG4gICAgQElucHV0KCkgYXZhaWxhYmxlU2VyaWVzOiBJVGltZXNlcmllc1dpZGdldERhdGFbXTtcbiAgICBASW5wdXQoKSBhbGxTZXJpZXM6IElUaW1lc2VyaWVzV2lkZ2V0RGF0YVtdO1xuXG4gICAgQE91dHB1dCgpIGZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGVtcHR5U2VyaWVzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwaXp6YWduYVNlcnZpY2U6IFBpenphZ25hU2VydmljZSxcbiAgICAgICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChQSVpaQUdOQV9FVkVOVF9CVVMpIHByaXZhdGUgZXZlbnRCdXM6IEV2ZW50QnVzPElFdmVudD5cbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuYWxsU2VyaWVzICYmICFjaGFuZ2VzLmFsbFNlcmllcy5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIHJlY2VpdmUgJ2FsbFNlcmllcycgZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBhZnRlciBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24sIHdlXG4gICAgICAgICAgICAvLyByZS1jcmVhdGUgdGhlIHNlcmllcyBjb25maWcgY29tcG9uZW50cyB0byBtYWtlIHRoZW0gYXdhcmUgb2YgdGhpcyBjaGFuZ2VcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU2VyaWVzQ29uZmlnQ29tcG9uZW50cyh0aGlzLnNlcmllcyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRm9ybVJlYWR5KGZvcm06IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgdGhpcy5mb3JtUmVhZHkuZW1pdChmb3JtKTtcbiAgICAgICAgdGhpcy5lbXB0eVNlcmllcyQgPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4gcmVzdWx0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JdGVtc0NoYW5nZShzZXJpZXM6IElUaW1lc2VyaWVzSXRlbUNvbmZpZ3VyYXRpb25bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZVNlcmllc0NvbmZpZ0NvbXBvbmVudHMoc2VyaWVzKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eTogSVBpenphZ25hUHJvcGVydHkgPSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIHBpenphZ25hS2V5OiBQaXp6YWduYUxheWVyLkRhdGEsXG4gICAgICAgICAgICBwcm9wZXJ0eVBhdGg6IFtcInNlcmllc1wiXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5waXp6YWduYVNlcnZpY2Uuc2V0UHJvcGVydHkocHJvcGVydHksIHNlcmllcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUG9zc2libGVUb0FkZFNlcmllcygpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmFsbFNlcmllcyAmJiB0aGlzLmFsbFNlcmllcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHByZXNlbnQgPSB0aGlzLnNlcmllcyAmJiB0aGlzLnNlcmllcy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHRvdGFsID4gcHJlc2VudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU2VyaWVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uSXRlbXNDaGFuZ2UoW1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogVHlwZXMgb2YgcHJvcGVydHkgJ3NlbGVjdGVkU2VyaWVzSWQnIGFyZSBpbmNvbXBhdGlibGUuXG4gICAgICAgICAgICAuLi50aGlzLnNlcmllcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogdXVpZChcInNlcmllc1wiKSxcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBQcm92aWRlIHNlbGVjdGVkU2VyaWVzSWQgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byBpdCdzIHR5cGUgd2hpY2ggaXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogVHlwZXMgb2YgcHJvcGVydHkgJ3NlbGVjdGVkU2VyaWVzSWQnIGFyZSBpbmNvbXBhdGlibGUuXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJpZXNJZDogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU2VyaWVzQ29uZmlnQ29tcG9uZW50cyhcbiAgICAgICAgc2VyaWVzOiBJVGltZXNlcmllc0l0ZW1Db25maWd1cmF0aW9uW11cbiAgICApIHtcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IFwic2VyaWVzXCI7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IHNlcmllcy5tYXAoKHRpbGUpID0+IHRpbGUuaWQpO1xuICAgICAgICB0aGlzLnBpenphZ25hU2VydmljZS5jcmVhdGVDb21wb25lbnRzRnJvbVRlbXBsYXRlKFxuICAgICAgICAgICAgcGFyZW50UGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudElkc1xuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxudWktaXRlbXMtZHluYW1pY1xuICAgIFtpdGVtc109XCJzZXJpZXNcIlxuICAgIFtub2Rlc109XCJub2Rlc1wiXG4gICAgKGl0ZW1zQ2hhbmdlKT1cIm9uSXRlbXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgW21vdmVCdXR0b25zXT1cImZhbHNlXCJcbiAgICAoZm9ybVJlYWR5KT1cIm9uRm9ybVJlYWR5KCRldmVudClcIlxuPjwvbnVpLWl0ZW1zLWR5bmFtaWM+XG5cbjxkaXYgY2xhc3M9XCJwbC00IHByLTRcIiAqbmdJZj1cIihlbXB0eVNlcmllcyQgfCBhc3luYykgJiYgZm9ybS50b3VjaGVkXCI+XG4gICAgPG51aS1tZXNzYWdlIHR5cGU9XCJjcml0aWNhbFwiIFthbGxvd0Rpc21pc3NdPVwiZmFsc2VcIiBpMThuPlxuICAgICAgICA8Yj5BdCBsZWFzdCBvbmUgc2VyaWVzIG11c3QgYmUgYWRkZWQuPC9iPlxuICAgIDwvbnVpLW1lc3NhZ2U+XG48L2Rpdj5cblxuPGJ1dHRvblxuICAgIG51aS1idXR0b25cbiAgICAqbmdJZj1cImlzUG9zc2libGVUb0FkZFNlcmllcygpXCJcbiAgICBpY29uPVwiYWRkXCJcbiAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwibWwtNCBtYi00XCJcbiAgICAoY2xpY2spPVwiYWRkU2VyaWVzKClcIlxuICAgIGkxOG5cbj5cbiAgICBBZGQgbmV3IHNlcmllc1xuPC9idXR0b24+XG4iXX0=