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

92 lines 16.9 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 { FormBuilder, } from "@angular/forms"; import { map } from "rxjs/operators"; import { EventBus, uuid } from "@nova-ui/bits"; import { KpiComponent } from "../../../../../components/kpi-widget/kpi.component"; 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/forms"; import * as i3 from "@angular/common"; import * as i4 from "@nova-ui/bits"; import * as i5 from "../../../items-dynamic/items-dynamic.component"; /** * This component and its related form represent a collection of KPI tile configuration components */ export class KpiTilesConfigurationComponent { static { this.lateLoadKey = "KpiTilesConfigurationComponent"; } constructor(pizzagnaService, changeDetector, formBuilder, eventBus) { this.pizzagnaService = pizzagnaService; this.changeDetector = changeDetector; this.formBuilder = formBuilder; this.eventBus = eventBus; this.tiles = []; this.formReady = new EventEmitter(); } ngOnChanges(changes) { } onFormReady(form) { this.form = this.formBuilder.group({ tiles: form, }); this.emptyItems$ = this.form.valueChanges.pipe(map((result) => result.tiles.length === 0)); this.formReady.emit(this.form); } onItemsChange(tiles) { const parentPath = "tiles"; const componentIds = tiles.map((tile) => tile.id); this.pizzagnaService.createComponentsFromTemplate(parentPath, componentIds); const property = { componentId: this.componentId, pizzagnaKey: PizzagnaLayer.Data, propertyPath: ["tiles"], }; this.pizzagnaService.setProperty(property, tiles); } addTile() { this.onItemsChange([ ...this.tiles, { id: uuid("kpi"), componentType: KpiComponent.lateLoadKey, }, ]); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiTilesConfigurationComponent, deps: [{ token: i1.PizzagnaService }, { token: i0.ChangeDetectorRef }, { token: i2.FormBuilder }, { token: PIZZAGNA_EVENT_BUS }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: KpiTilesConfigurationComponent, selector: "nui-kpi-tiles-configuration-component", inputs: { componentId: "componentId", tiles: "tiles", nodes: "nodes" }, outputs: { formReady: "formReady" }, usesOnChanges: true, ngImport: i0, template: "<nui-items-dynamic\n [items]=\"tiles\"\n [nodes]=\"nodes\"\n (itemsChange)=\"onItemsChange($event)\"\n (formReady)=\"onFormReady($event)\"\n></nui-items-dynamic>\n\n<div class=\"pl-4 pr-4\" *ngIf=\"(emptyItems$ | async) && form.touched\">\n <nui-message type=\"critical\" [allowDismiss]=\"false\" i18n>\n <b>At least one value must be added.</b>\n </nui-message>\n</div>\n\n<button\n nui-button\n icon=\"add\"\n displayStyle=\"action\"\n id=\"kpi-widget-add-indicator-btn\"\n type=\"button\"\n class=\"ml-4 mb-4\"\n (click)=\"addTile()\"\n i18n\n>\n Add new value\n</button>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }, { kind: "component", type: i4.MessageComponent, selector: "nui-message", inputs: ["type", "allowDismiss", "manualControl"], outputs: ["dismiss"] }, { kind: "component", type: i5.ItemsDynamicComponent, selector: "nui-items-dynamic", inputs: ["items", "moveButtons", "nodes", "headerPrefix"], outputs: ["formReady", "itemsChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiTilesConfigurationComponent, decorators: [{ type: Component, args: [{ selector: "nui-kpi-tiles-configuration-component", changeDetection: ChangeDetectionStrategy.OnPush, template: "<nui-items-dynamic\n [items]=\"tiles\"\n [nodes]=\"nodes\"\n (itemsChange)=\"onItemsChange($event)\"\n (formReady)=\"onFormReady($event)\"\n></nui-items-dynamic>\n\n<div class=\"pl-4 pr-4\" *ngIf=\"(emptyItems$ | async) && form.touched\">\n <nui-message type=\"critical\" [allowDismiss]=\"false\" i18n>\n <b>At least one value must be added.</b>\n </nui-message>\n</div>\n\n<button\n nui-button\n icon=\"add\"\n displayStyle=\"action\"\n id=\"kpi-widget-add-indicator-btn\"\n type=\"button\"\n class=\"ml-4 mb-4\"\n (click)=\"addTile()\"\n i18n\n>\n Add new value\n</button>\n" }] }], ctorParameters: () => [{ type: i1.PizzagnaService }, { type: i0.ChangeDetectorRef }, { type: i2.FormBuilder }, { type: i4.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }], propDecorators: { componentId: [{ type: Input }], tiles: [{ type: Input }], nodes: [{ type: Input }], formReady: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXRpbGVzLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb25maWd1cmF0b3IvY29tcG9uZW50cy93aWRnZXRzL2twaS9rcGktdGlsZXMtY29uZmlndXJhdGlvbi9rcGktdGlsZXMtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldHMva3BpL2twaS10aWxlcy1jb25maWd1cmF0aW9uL2twaS10aWxlcy1jb25maWd1cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHSCxXQUFXLEdBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLFFBQVEsRUFBVSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRWxGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNwRixPQUFPLEVBR0gsYUFBYSxFQUNiLGtCQUFrQixHQUNyQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7O0FBSTlCOztHQUVHO0FBTUgsTUFBTSxPQUFPLDhCQUE4QjthQUdoQyxnQkFBVyxHQUFHLGdDQUFnQyxBQUFuQyxDQUFvQztJQVd0RCxZQUNXLGVBQWdDLEVBQ2hDLGNBQWlDLEVBQ2hDLFdBQXdCLEVBQ0ksUUFBMEI7UUFIdkQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNJLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBWnpELFVBQUssR0FBNEIsRUFBRSxDQUFDO1FBR25DLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBVWpELENBQUM7SUFFRyxXQUFXLENBQUMsT0FBc0IsSUFBUyxDQUFDO0lBRTVDLFdBQVcsQ0FBQyxJQUFxQjtRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQy9CLEtBQUssRUFBRSxJQUFpQjtTQUMzQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDMUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FDN0MsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQTJCO1FBQzVDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FDN0MsVUFBVSxFQUNWLFlBQVksQ0FDZixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQXNCO1lBQ2hDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUk7WUFDL0IsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQzFCLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLE9BQU87UUFDVixJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSztZQUNiO2dCQUNJLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNmLGFBQWEsRUFBRSxZQUFZLENBQUMsV0FBVzthQUMxQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7a0lBMURRLDhCQUE4Qiw2R0FrQjNCLGtCQUFrQjtzSEFsQnJCLDhCQUE4QiwrTUM5RDNDLHNuQkF5QkE7OzRGRHFDYSw4QkFBOEI7a0JBTDFDLFNBQVM7K0JBQ0ksdUNBQXVDLG1CQUVoQyx1QkFBdUIsQ0FBQyxNQUFNOzswQkFvQjFDLE1BQU07MkJBQUMsa0JBQWtCO3lDQWJyQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIEZvcm1BcnJheSxcbiAgICBGb3JtQnVpbGRlcixcbiAgICBGb3JtR3JvdXAsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgRXZlbnRCdXMsIElFdmVudCwgdXVpZCB9IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IEtwaUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jb21wb25lbnRzL2twaS13aWRnZXQva3BpLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSVBpenphZ25hUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vcGl6emFnbmEvZnVuY3Rpb25zL2dldC1waXp6YWduYS1wcm9wZXJ0eS1wYXRoXCI7XG5pbXBvcnQgeyBQaXp6YWduYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vcGl6emFnbmEvc2VydmljZXMvcGl6emFnbmEuc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgICBJSGFzQ2hhbmdlRGV0ZWN0b3IsXG4gICAgSUhhc0Zvcm0sXG4gICAgUGl6emFnbmFMYXllcixcbiAgICBQSVpaQUdOQV9FVkVOVF9CVVMsXG59IGZyb20gXCIuLi8uLi8uLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgSUl0ZW1Db25maWd1cmF0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJS3BpSXRlbUNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBhbmQgaXRzIHJlbGF0ZWQgZm9ybSByZXByZXNlbnQgYSBjb2xsZWN0aW9uIG9mIEtQSSB0aWxlIGNvbmZpZ3VyYXRpb24gY29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWkta3BpLXRpbGVzLWNvbmZpZ3VyYXRpb24tY29tcG9uZW50XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9rcGktdGlsZXMtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbFwiLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBLcGlUaWxlc0NvbmZpZ3VyYXRpb25Db21wb25lbnRcbiAgICBpbXBsZW1lbnRzIElIYXNDaGFuZ2VEZXRlY3RvciwgSUhhc0Zvcm0sIE9uQ2hhbmdlc1xue1xuICAgIHN0YXRpYyBsYXRlTG9hZEtleSA9IFwiS3BpVGlsZXNDb25maWd1cmF0aW9uQ29tcG9uZW50XCI7XG5cbiAgICBASW5wdXQoKSBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRpbGVzOiBJS3BpSXRlbUNvbmZpZ3VyYXRpb25bXSA9IFtdO1xuICAgIEBJbnB1dCgpIG5vZGVzOiBzdHJpbmdbXTtcblxuICAgIEBPdXRwdXQoKSBmb3JtUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcblxuICAgIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGVtcHR5SXRlbXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwaXp6YWduYVNlcnZpY2U6IFBpenphZ25hU2VydmljZSxcbiAgICAgICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIEBJbmplY3QoUElaWkFHTkFfRVZFTlRfQlVTKSBwcml2YXRlIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+XG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHt9XG5cbiAgICBwdWJsaWMgb25Gb3JtUmVhZHkoZm9ybTogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgdGlsZXM6IGZvcm0gYXMgRm9ybUFycmF5LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVtcHR5SXRlbXMkID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXN1bHQpID0+IHJlc3VsdC50aWxlcy5sZW5ndGggPT09IDApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZm9ybVJlYWR5LmVtaXQodGhpcy5mb3JtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JdGVtc0NoYW5nZSh0aWxlczogSUl0ZW1Db25maWd1cmF0aW9uW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IFwidGlsZXNcIjtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gdGlsZXMubWFwKCh0aWxlKSA9PiB0aWxlLmlkKTtcbiAgICAgICAgdGhpcy5waXp6YWduYVNlcnZpY2UuY3JlYXRlQ29tcG9uZW50c0Zyb21UZW1wbGF0ZShcbiAgICAgICAgICAgIHBhcmVudFBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnRJZHNcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eTogSVBpenphZ25hUHJvcGVydHkgPSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIHBpenphZ25hS2V5OiBQaXp6YWduYUxheWVyLkRhdGEsXG4gICAgICAgICAgICBwcm9wZXJ0eVBhdGg6IFtcInRpbGVzXCJdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBpenphZ25hU2VydmljZS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdGlsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRUaWxlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uSXRlbXNDaGFuZ2UoW1xuICAgICAgICAgICAgLi4udGhpcy50aWxlcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogdXVpZChcImtwaVwiKSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiBLcGlDb21wb25lbnQubGF0ZUxvYWRLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICB9XG59XG4iLCI8bnVpLWl0ZW1zLWR5bmFtaWNcbiAgICBbaXRlbXNdPVwidGlsZXNcIlxuICAgIFtub2Rlc109XCJub2Rlc1wiXG4gICAgKGl0ZW1zQ2hhbmdlKT1cIm9uSXRlbXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGZvcm1SZWFkeSk9XCJvbkZvcm1SZWFkeSgkZXZlbnQpXCJcbj48L251aS1pdGVtcy1keW5hbWljPlxuXG48ZGl2IGNsYXNzPVwicGwtNCBwci00XCIgKm5nSWY9XCIoZW1wdHlJdGVtcyQgfCBhc3luYykgJiYgZm9ybS50b3VjaGVkXCI+XG4gICAgPG51aS1tZXNzYWdlIHR5cGU9XCJjcml0aWNhbFwiIFthbGxvd0Rpc21pc3NdPVwiZmFsc2VcIiBpMThuPlxuICAgICAgICA8Yj5BdCBsZWFzdCBvbmUgdmFsdWUgbXVzdCBiZSBhZGRlZC48L2I+XG4gICAgPC9udWktbWVzc2FnZT5cbjwvZGl2PlxuXG48YnV0dG9uXG4gICAgbnVpLWJ1dHRvblxuICAgIGljb249XCJhZGRcIlxuICAgIGRpc3BsYXlTdHlsZT1cImFjdGlvblwiXG4gICAgaWQ9XCJrcGktd2lkZ2V0LWFkZC1pbmRpY2F0b3ItYnRuXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cIm1sLTQgbWItNFwiXG4gICAgKGNsaWNrKT1cImFkZFRpbGUoKVwiXG4gICAgaTE4blxuPlxuICAgIEFkZCBuZXcgdmFsdWVcbjwvYnV0dG9uPlxuIl19