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

133 lines 19.7 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 { Inject, Injectable } from "@angular/core"; import isArray from "lodash/isArray"; import omit from "lodash/omit"; import { ReplaySubject } from "rxjs"; import { EventBus, immutableSet } from "@nova-ui/bits"; import { DynamicComponentCreator } from "./dynamic-component-creator.service"; import { SET_PROPERTY_VALUE } from "../../services/types"; import { PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../../types"; import { getPizzagnaPropertyPath, } from "../functions/get-pizzagna-property-path"; import * as i0 from "@angular/core"; import * as i1 from "./dynamic-component-creator.service"; import * as i2 from "@nova-ui/bits"; /** * This service allows pizzagna sub-components to read data of other components and initiate changes of property values */ export class PizzagnaService { constructor(eventBus, dynamicComponentCreator) { this.eventBus = eventBus; this.dynamicComponentCreator = dynamicComponentCreator; this.pizzaChanged = new ReplaySubject(1); } updatePizzagna(pizzagna) { this.pizzagna = pizzagna; } updateComponents(components) { this.components = components; this.pizzaChanged.next(components); } getComponent(refId) { const component = this.components[refId]; if (!component) { throw new Error("Component '" + refId + "' is not defined!"); } return component; } setProperty(property, value) { const path = typeof property === "string" ? property : getPizzagnaPropertyPath(property); this.eventBus .getStream(SET_PROPERTY_VALUE) .next({ payload: { path, value } }); } createComponentsFromTemplateWithProperties(parentPath, components) { const componentIds = components.map((c) => c.id); let updatedPizzagna = this.dynamicComponentCreator.getPizzagnaUpdatedWithComponents(this.pizzagna, parentPath, componentIds); for (const component of components) { for (const childId of Object.keys(component.children)) { updatedPizzagna = immutableSet(updatedPizzagna, `${PizzagnaLayer.Data}.${childId}.properties`, component.children[childId]); } } // this is here to update the pizzagna for other converters that need to access the value immediately this.updatePizzagna(updatedPizzagna); this.eventBus.getStream(SET_PROPERTY_VALUE).next({ payload: { path: "", value: updatedPizzagna, }, }); } createComponentsFromTemplate(parentPath, componentIds) { const updatedPizzagna = this.dynamicComponentCreator.getPizzagnaUpdatedWithComponents(this.pizzagna, parentPath, componentIds); // this is here to update the pizzagna for other converters that need to access the value immediately this.updatePizzagna(updatedPizzagna); this.eventBus.getStream(SET_PROPERTY_VALUE).next({ payload: { path: "", value: updatedPizzagna, }, }); } removeComponents(ids) { if (isArray(ids)) { ids.forEach((id) => this.removeComponent(id)); } else { this.removeComponent(ids); } } removeComponent(id) { const updatedPizzagna = { ...this.pizzagna }; const componentNodes = this.pizzagna[PizzagnaLayer.Structure][id].properties?.nodes; const componentsToRemove = [id, ...componentNodes]; const layers = [ PizzagnaLayer.Structure, PizzagnaLayer.Configuration, PizzagnaLayer.Data, ]; for (const layer of layers) { if (!updatedPizzagna[layer]) { continue; } for (const component of componentsToRemove) { updatedPizzagna[layer] = omit(updatedPizzagna[layer], component); } } this.eventBus.getStream(SET_PROPERTY_VALUE).next({ payload: { path: "", value: updatedPizzagna, }, }); this.updatePizzagna(updatedPizzagna); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PizzagnaService, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: i1.DynamicComponentCreator }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PizzagnaService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PizzagnaService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i2.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }, { type: i1.DynamicComponentCreator }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl6emFnbmEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcGl6emFnbmEvc2VydmljZXMvcGl6emFnbmEuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLFFBQVEsRUFBVSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUF1QixrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9FLE9BQU8sRUFJSCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ3JCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCx1QkFBdUIsR0FFMUIsTUFBTSx5Q0FBeUMsQ0FBQzs7OztBQUVqRDs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBQ3hCLFlBQ3dDLFFBQTBCLEVBQ3RELHVCQUFnRDtRQURwQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUN0RCw0QkFBdUIsR0FB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QUM7a0lBaklRLGVBQWUsa0JBRVosa0JBQWtCO3NJQUZyQixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVOzswQkFHRixNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSBcImxvZGFzaC9pc0FycmF5XCI7XG5pbXBvcnQgb21pdCBmcm9tIFwibG9kYXNoL29taXRcIjtcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBFdmVudEJ1cywgSUV2ZW50LCBpbW11dGFibGVTZXQgfSBmcm9tIFwiQG5vdmEtdWkvYml0c1wiO1xuXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50Q3JlYXRvciB9IGZyb20gXCIuL2R5bmFtaWMtY29tcG9uZW50LWNyZWF0b3Iuc2VydmljZVwiO1xuaW1wb3J0IHsgSVNldFByb3BlcnR5UGF5bG9hZCwgU0VUX1BST1BFUlRZX1ZBTFVFIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWd1cmF0aW9uLFxuICAgIElQaXp6YSxcbiAgICBJUGl6emFnbmEsXG4gICAgUGl6emFnbmFMYXllcixcbiAgICBQSVpaQUdOQV9FVkVOVF9CVVMsXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBnZXRQaXp6YWduYVByb3BlcnR5UGF0aCxcbiAgICBJUGl6emFnbmFQcm9wZXJ0eSxcbn0gZnJvbSBcIi4uL2Z1bmN0aW9ucy9nZXQtcGl6emFnbmEtcHJvcGVydHktcGF0aFwiO1xuXG4vKipcbiAqIFRoaXMgc2VydmljZSBhbGxvd3MgcGl6emFnbmEgc3ViLWNvbXBvbmVudHMgdG8gcmVhZCBkYXRhIG9mIG90aGVyIGNvbXBvbmVudHMgYW5kIGluaXRpYXRlIGNoYW5nZXMgb2YgcHJvcGVydHkgdmFsdWVzXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQaXp6YWduYVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBJWlpBR05BX0VWRU5UX0JVUykgcHJpdmF0ZSBldmVudEJ1czogRXZlbnRCdXM8SUV2ZW50PixcbiAgICAgICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50Q3JlYXRvcjogRHluYW1pY0NvbXBvbmVudENyZWF0b3JcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgcGl6emFnbmE6IElQaXp6YWduYTtcbiAgICBwdWJsaWMgcGl6emFDaGFuZ2VkID0gbmV3IFJlcGxheVN1YmplY3Q8SVBpenphPigxKTtcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IElQaXp6YTtcblxuICAgIHB1YmxpYyB1cGRhdGVQaXp6YWduYShwaXp6YWduYTogSVBpenphZ25hKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGl6emFnbmEgPSBwaXp6YWduYTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50cyhjb21wb25lbnRzOiBJUGl6emEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgICAgICAgdGhpcy5waXp6YUNoYW5nZWQubmV4dChjb21wb25lbnRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50KHJlZklkOiBzdHJpbmcpOiBJQ29tcG9uZW50Q29uZmlndXJhdGlvbiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tyZWZJZF0gYXMgSUNvbXBvbmVudENvbmZpZ3VyYXRpb247XG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21wb25lbnQgJ1wiICsgcmVmSWQgKyBcIicgaXMgbm90IGRlZmluZWQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFByb3BlcnR5KHByb3BlcnR5OiBJUGl6emFnbmFQcm9wZXJ0eSB8IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXRoID1cbiAgICAgICAgICAgIHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gcHJvcGVydHlcbiAgICAgICAgICAgICAgICA6IGdldFBpenphZ25hUHJvcGVydHlQYXRoKHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5ldmVudEJ1c1xuICAgICAgICAgICAgLmdldFN0cmVhbShTRVRfUFJPUEVSVFlfVkFMVUUpXG4gICAgICAgICAgICAubmV4dCh7IHBheWxvYWQ6IHsgcGF0aCwgdmFsdWUgfSBhcyBJU2V0UHJvcGVydHlQYXlsb2FkIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVDb21wb25lbnRzRnJvbVRlbXBsYXRlV2l0aFByb3BlcnRpZXMoXG4gICAgICAgIHBhcmVudFBhdGg6IHN0cmluZyxcbiAgICAgICAgY29tcG9uZW50czogYW55XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IGNvbXBvbmVudHMubWFwKChjOiBhbnkpID0+IGMuaWQpO1xuICAgICAgICBsZXQgdXBkYXRlZFBpenphZ25hOiBJUGl6emFnbmEgPVxuICAgICAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50Q3JlYXRvci5nZXRQaXp6YWduYVVwZGF0ZWRXaXRoQ29tcG9uZW50cyhcbiAgICAgICAgICAgICAgICB0aGlzLnBpenphZ25hLFxuICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SWRzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBPYmplY3Qua2V5cyhjb21wb25lbnQuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBpenphZ25hID0gaW1tdXRhYmxlU2V0KFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUGl6emFnbmEsXG4gICAgICAgICAgICAgICAgICAgIGAke1BpenphZ25hTGF5ZXIuRGF0YX0uJHtjaGlsZElkfS5wcm9wZXJ0aWVzYCxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmNoaWxkcmVuW2NoaWxkSWRdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMgaXMgaGVyZSB0byB1cGRhdGUgdGhlIHBpenphZ25hIGZvciBvdGhlciBjb252ZXJ0ZXJzIHRoYXQgbmVlZCB0byBhY2Nlc3MgdGhlIHZhbHVlIGltbWVkaWF0ZWx5XG4gICAgICAgIHRoaXMudXBkYXRlUGl6emFnbmEodXBkYXRlZFBpenphZ25hKTtcblxuICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbShTRVRfUFJPUEVSVFlfVkFMVUUpLm5leHQoe1xuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVwZGF0ZWRQaXp6YWduYSxcbiAgICAgICAgICAgIH0gYXMgSVNldFByb3BlcnR5UGF5bG9hZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUNvbXBvbmVudHNGcm9tVGVtcGxhdGUoXG4gICAgICAgIHBhcmVudFBhdGg6IHN0cmluZyxcbiAgICAgICAgY29tcG9uZW50SWRzOiBzdHJpbmdbXVxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVkUGl6emFnbmEgPVxuICAgICAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50Q3JlYXRvci5nZXRQaXp6YWduYVVwZGF0ZWRXaXRoQ29tcG9uZW50cyhcbiAgICAgICAgICAgICAgICB0aGlzLnBpenphZ25hLFxuICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50SWRzXG4gICAgICAgICAgICApO1xuICAgICAgICAvLyB0aGlzIGlzIGhlcmUgdG8gdXBkYXRlIHRoZSBwaXp6YWduYSBmb3Igb3RoZXIgY29udmVydGVycyB0aGF0IG5lZWQgdG8gYWNjZXNzIHRoZSB2YWx1ZSBpbW1lZGlhdGVseVxuICAgICAgICB0aGlzLnVwZGF0ZVBpenphZ25hKHVwZGF0ZWRQaXp6YWduYSk7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZ2V0U3RyZWFtKFNFVF9QUk9QRVJUWV9WQUxVRSkubmV4dCh7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgcGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdXBkYXRlZFBpenphZ25hLFxuICAgICAgICAgICAgfSBhcyBJU2V0UHJvcGVydHlQYXlsb2FkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ29tcG9uZW50cyhpZHM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmIChpc0FycmF5KGlkcykpIHtcbiAgICAgICAgICAgIGlkcy5mb3JFYWNoKChpZCkgPT4gdGhpcy5yZW1vdmVDb21wb25lbnQoaWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGlkcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUNvbXBvbmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQaXp6YWduYTogSVBpenphZ25hID0geyAuLi50aGlzLnBpenphZ25hIH07XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50Tm9kZXMgPVxuICAgICAgICAgICAgdGhpcy5waXp6YWduYVtQaXp6YWduYUxheWVyLlN0cnVjdHVyZV1baWRdLnByb3BlcnRpZXM/Lm5vZGVzO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzVG9SZW1vdmUgPSBbaWQsIC4uLmNvbXBvbmVudE5vZGVzXTtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSBbXG4gICAgICAgICAgICBQaXp6YWduYUxheWVyLlN0cnVjdHVyZSxcbiAgICAgICAgICAgIFBpenphZ25hTGF5ZXIuQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIFBpenphZ25hTGF5ZXIuRGF0YSxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGlmICghdXBkYXRlZFBpenphZ25hW2xheWVyXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50c1RvUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBpenphZ25hW2xheWVyXSA9IG9taXQoXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQaXp6YWduYVtsYXllcl0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbShTRVRfUFJPUEVSVFlfVkFMVUUpLm5leHQoe1xuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVwZGF0ZWRQaXp6YWduYSxcbiAgICAgICAgICAgIH0gYXMgSVNldFByb3BlcnR5UGF5bG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlUGl6emFnbmEodXBkYXRlZFBpenphZ25hKTtcbiAgICB9XG59XG4iXX0=