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

104 lines 17 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 { Directive, Host, Input, Self } from "@angular/core"; import cloneDeep from "lodash/cloneDeep"; import { Subject } from "rxjs"; // eslint-disable-next-line import/no-deprecated import { switchMap, takeUntil } from "rxjs/operators"; import { DashboardComponent } from "../../components/dashboard/dashboard.component"; import { WidgetEditorService } from "../../configurator/services/widget-editor.service"; import { WIDGET_EDIT, WIDGET_REMOVE } from "../../services/types"; import { WidgetRemovalService } from "../../services/widget-removal.service"; import { WidgetTypesService } from "../../services/widget-types.service"; import * as i0 from "@angular/core"; import * as i1 from "../../components/dashboard/dashboard.component"; import * as i2 from "../../configurator/services/widget-editor.service"; import * as i3 from "../../services/widget-removal.service"; import * as i4 from "../../services/widget-types.service"; export class WidgetEditorDirective { constructor(dashboardComponent, widgetEditorService, widgetRemovalService, widgetTypesService) { this.dashboardComponent = dashboardComponent; this.widgetEditorService = widgetEditorService; this.widgetRemovalService = widgetRemovalService; this.widgetTypesService = widgetTypesService; this.destroy$ = new Subject(); } ngOnInit() { this.dashboardComponent.eventBus .getStream(WIDGET_EDIT) .pipe( // eslint-disable-next-line import/no-deprecated switchMap((event) => { const widget = this.dashboardComponent.dashboard.widgets[event.widgetId]; const widgetType = this.widgetTypesService.getWidgetType(widget.type, widget.version); // TODO: Ensure that widgetType is defined; const widgetEditor = { dashboardComponent: this.dashboardComponent, // @ts-ignore: Configurator is possibly undefined and is not assignable to IPizzagna type formPizzagna: widgetType.configurator, // @ts-ignore: Type 'undefined' is not assignable to type 'Record<string, string>'. paths: widgetType.paths.configurator, widget, trySubmit: this.dashboardPersistenceHandler && this.dashboardPersistenceHandler.trySubmit, }; return this.widgetEditorService.open(widgetEditor); }), takeUntil(this.destroy$)) .subscribe(); this.dashboardComponent.eventBus .getStream(WIDGET_REMOVE) .pipe( // eslint-disable-next-line import/no-deprecated switchMap((event) => { if (!event.widgetId) { throw new Error(`event has to have widgetId`); } const widgetId = event.widgetId; const tryRemove = this.dashboardPersistenceHandler && this.dashboardPersistenceHandler.tryRemove; const configuratorSource = { dashboardComponent: this.dashboardComponent, widget: cloneDeep(this.dashboardComponent.dashboard.widgets[widgetId]), }; return this.widgetRemovalService.handleRemove(this.dashboardComponent, widgetId, configuratorSource, tryRemove); }), takeUntil(this.destroy$)) .subscribe(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetEditorDirective, deps: [{ token: i1.DashboardComponent, host: true, self: true }, { token: i2.WidgetEditorService }, { token: i3.WidgetRemovalService }, { token: i4.WidgetTypesService }], target: i0.ɵɵFactoryTarget.Directive }); } /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: WidgetEditorDirective, selector: "[nuiWidgetEditor]", inputs: { dashboardPersistenceHandler: ["nuiWidgetEditor", "dashboardPersistenceHandler"] }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WidgetEditorDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiWidgetEditor]", }] }], ctorParameters: () => [{ type: i1.DashboardComponent, decorators: [{ type: Host }, { type: Self }] }, { type: i2.WidgetEditorService }, { type: i3.WidgetRemovalService }, { type: i4.WidgetTypesService }], propDecorators: { dashboardPersistenceHandler: [{ type: Input, args: ["nuiWidgetEditor"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWVkaXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvd2lkZ2V0LWVkaXRvci93aWRnZXQtZWRpdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFxQixJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxTQUFTLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixnREFBZ0Q7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQU1wRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7QUFLekUsTUFBTSxPQUFPLHFCQUFxQjtJQU05QixZQUM0Qixr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QUFJOzswQkFBSSxJQUFJOytJQUxqQiwyQkFBMkI7c0JBRDFCLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBTZWxmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBjbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1kZXByZWNhdGVkXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSURhc2hib2FyZFBlcnNpc3RlbmNlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2Rhc2hib2FyZC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBJQ29uZmlndXJhdG9yU291cmNlLFxuICAgIElXaWRnZXRFZGl0b3IsXG59IGZyb20gXCIuLi8uLi9jb25maWd1cmF0b3Ivc2VydmljZXMvdHlwZXNcIjtcbmltcG9ydCB7IFdpZGdldEVkaXRvclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29uZmlndXJhdG9yL3NlcnZpY2VzL3dpZGdldC1lZGl0b3Iuc2VydmljZVwiO1xuaW1wb3J0IHsgV0lER0VUX0VESVQsIFdJREdFVF9SRU1PVkUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdHlwZXNcIjtcbmltcG9ydCB7IFdpZGdldFJlbW92YWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3dpZGdldC1yZW1vdmFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFdpZGdldFR5cGVzU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy93aWRnZXQtdHlwZXMuc2VydmljZVwiO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVpV2lkZ2V0RWRpdG9yXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRFZGl0b3JEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KFwibnVpV2lkZ2V0RWRpdG9yXCIpXG4gICAgZGFzaGJvYXJkUGVyc2lzdGVuY2VIYW5kbGVyOiBJRGFzaGJvYXJkUGVyc2lzdGVuY2VIYW5kbGVyO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEhvc3QoKSBAU2VsZigpIHByaXZhdGUgZGFzaGJvYXJkQ29tcG9uZW50OiBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgd2lkZ2V0RWRpdG9yU2VydmljZTogV2lkZ2V0RWRpdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB3aWRnZXRSZW1vdmFsU2VydmljZTogV2lkZ2V0UmVtb3ZhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgd2lkZ2V0VHlwZXNTZXJ2aWNlOiBXaWRnZXRUeXBlc1NlcnZpY2VcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkQ29tcG9uZW50LmV2ZW50QnVzXG4gICAgICAgICAgICAuZ2V0U3RyZWFtKFdJREdFVF9FRElUKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWRnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRDb21wb25lbnQuZGFzaGJvYXJkLndpZGdldHNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQud2lkZ2V0SWRcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZGdldFR5cGUgPSB0aGlzLndpZGdldFR5cGVzU2VydmljZS5nZXRXaWRnZXRUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBFbnN1cmUgdGhhdCB3aWRnZXRUeXBlIGlzIGRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZGdldEVkaXRvcjogSVdpZGdldEVkaXRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZENvbXBvbmVudDogdGhpcy5kYXNoYm9hcmRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBDb25maWd1cmF0b3IgaXMgcG9zc2libHkgdW5kZWZpbmVkIGFuZCBpcyBub3QgYXNzaWduYWJsZSB0byBJUGl6emFnbmEgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVBpenphZ25hOiB3aWRnZXRUeXBlLmNvbmZpZ3VyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IFR5cGUgJ3VuZGVmaW5lZCcgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnUmVjb3JkPHN0cmluZywgc3RyaW5nPicuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogd2lkZ2V0VHlwZS5wYXRocy5jb25maWd1cmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnlTdWJtaXQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRQZXJzaXN0ZW5jZUhhbmRsZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZFBlcnNpc3RlbmNlSGFuZGxlci50cnlTdWJtaXQsXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0RWRpdG9yU2VydmljZS5vcGVuKHdpZGdldEVkaXRvcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb21wb25lbnQuZXZlbnRCdXNcbiAgICAgICAgICAgIC5nZXRTdHJlYW0oV0lER0VUX1JFTU9WRSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZGVwcmVjYXRlZFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC53aWRnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBldmVudCBoYXMgdG8gaGF2ZSB3aWRnZXRJZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZGdldElkID0gZXZlbnQud2lkZ2V0SWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyeVJlbW92ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZFBlcnNpc3RlbmNlSGFuZGxlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRQZXJzaXN0ZW5jZUhhbmRsZXIudHJ5UmVtb3ZlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRvclNvdXJjZTogSUNvbmZpZ3VyYXRvclNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZENvbXBvbmVudDogdGhpcy5kYXNoYm9hcmRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IGNsb25lRGVlcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZENvbXBvbmVudC5kYXNoYm9hcmQud2lkZ2V0c1t3aWRnZXRJZF1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndpZGdldFJlbW92YWxTZXJ2aWNlLmhhbmRsZVJlbW92ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0b3JTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnlSZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIl19