@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
107 lines • 14.7 kB
JavaScript
// © 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, Optional } from "@angular/core";
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { PizzagnaService } from "../../pizzagna/services/pizzagna.service";
import { KpiColorComparatorsRegistryService } from "../../services/kpi-color-comparators-registry.service";
import { DATA_SOURCE } from "../../types";
import * as i0 from "@angular/core";
import * as i1 from "../../pizzagna/services/pizzagna.service";
import * as i2 from "../../services/kpi-color-comparators-registry.service";
export class KpiColorPrioritizer {
constructor(dataSource, pizzagnaService, comparatorsRegistry) {
this.dataSource = dataSource;
this.pizzagnaService = pizzagnaService;
this.destroy$ = new Subject();
this.propertyPath = "backgroundColor";
this.comparators = comparatorsRegistry.getComparators();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
updateConfiguration(properties) {
if (properties?.rules) {
this.rules = properties?.rules;
this.subscribeToDataChanges();
this.checkColorConditions();
}
}
setComponent(component, componentId) {
this.subscribeToDataChanges();
this.componentId = componentId;
}
subscribeToDataChanges() {
if (!this.dataSource) {
return;
}
this.dsSubscription$?.unsubscribe();
this.dsSubscription$ = this.dataSource.outputsSubject
.pipe(takeUntil(this.destroy$))
.subscribe((event) => {
this.latestValueFromDS =
event.result?.value || this.latestValueFromDS;
this.checkColorConditions();
});
}
checkColorConditions() {
if (!this.rules) {
return;
}
if (this.rules.length === 0) {
this.setColor(undefined);
this.dsSubscription$?.unsubscribe();
return;
}
let colorToSet;
// reverse because last rule has top priority
const newRules = this.rules && [...this.rules].reverse();
for (const rule of newRules) {
if (this.comparators[rule.comparisonType]?.comparatorFn(this.latestValueFromDS, rule.value)) {
colorToSet = rule.color;
break; // exit if the rule matches
}
}
this.setColor(colorToSet);
}
/**
* Sets the color to pizzagna
*
* @param color - Color to set
*/
setColor(color) {
this.pizzagnaService.setProperty({
componentId: this.componentId,
propertyPath: [this.propertyPath],
}, color);
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer, deps: [{ token: DATA_SOURCE, optional: true }, { token: i1.PizzagnaService }, { token: i2.KpiColorComparatorsRegistryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATA_SOURCE]
}] }, { type: i1.PizzagnaService }, { type: i2.KpiColorComparatorsRegistryService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLWNvbG9yLXByaW9yaXRpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVycy9rcGktY29sb3ItcHJpb3JpdGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxXQUFXLEVBQW1DLE1BQU0sYUFBYSxDQUFDOzs7O0FBSTNFLE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDNEMsVUFBdUIsRUFDckQsZUFBZ0MsRUFDMUMsbUJBQXVEO1FBRmYsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUNyRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFYM0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFeEMsaUJBQVksR0FBVyxpQkFBaUIsQ0FBQztRQVkvQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxVQUFlO1FBQ3RDLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLFNBQWMsRUFBRSxXQUFtQjtRQUNuRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNuQyxDQUFDO0lBRU8sc0JBQXNCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWM7YUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsS0FBa0MsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ2xCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNsRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTztTQUNWO1FBRUQsSUFBSSxVQUE4QixDQUFDO1FBQ25DLDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDekIsSUFDSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxZQUFZLENBQy9DLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FDYixFQUNIO2dCQUNFLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN4QixNQUFNLENBQUMsMkJBQTJCO2FBQ3JDO1NBQ0o7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssUUFBUSxDQUFDLEtBQXlCO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUM1QjtZQUNJLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3BDLEVBQ0QsS0FBSyxDQUNSLENBQUM7SUFDTixDQUFDO2tJQS9GUSxtQkFBbUIsa0JBV0osV0FBVztzSUFYMUIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFZRixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgSURhdGFTb3VyY2UgfSBmcm9tIFwiQG5vdmEtdWkvYml0c1wiO1xuXG5pbXBvcnQgeyBJRGF0YVNvdXJjZU91dHB1dCwgSUtwaUNvbG9yUnVsZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGl6emFnbmFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3BpenphZ25hL3NlcnZpY2VzL3BpenphZ25hLnNlcnZpY2VcIjtcbmltcG9ydCB7IEtwaUNvbG9yQ29tcGFyYXRvcnNSZWdpc3RyeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMva3BpLWNvbG9yLWNvbXBhcmF0b3JzLXJlZ2lzdHJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7IERBVEFfU09VUkNFLCBJQ29tcGFyYXRvcnNEaWN0LCBJQ29uZmlndXJhYmxlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJS3BpRGF0YSB9IGZyb20gXCIuLi9rcGktd2lkZ2V0L3R5cGVzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBLcGlDb2xvclByaW9yaXRpemVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSwgT25EZXN0cm95IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBwcm9wZXJ0eVBhdGg6IHN0cmluZyA9IFwiYmFja2dyb3VuZENvbG9yXCI7XG4gICAgcHJvdGVjdGVkIHJ1bGVzOiBJS3BpQ29sb3JSdWxlc1tdIHwgdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBjb21wYXJhdG9yczogSUNvbXBhcmF0b3JzRGljdDtcblxuICAgIHByaXZhdGUgZHNTdWJzY3JpcHRpb24kOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsYXRlc3RWYWx1ZUZyb21EUzogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9TT1VSQ0UpIHB1YmxpYyBkYXRhU291cmNlOiBJRGF0YVNvdXJjZSxcbiAgICAgICAgcHJvdGVjdGVkIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlLFxuICAgICAgICBjb21wYXJhdG9yc1JlZ2lzdHJ5OiBLcGlDb2xvckNvbXBhcmF0b3JzUmVnaXN0cnlTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29tcGFyYXRvcnMgPSBjb21wYXJhdG9yc1JlZ2lzdHJ5LmdldENvbXBhcmF0b3JzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDb25maWd1cmF0aW9uKHByb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAocHJvcGVydGllcz8ucnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucnVsZXMgPSBwcm9wZXJ0aWVzPy5ydWxlcztcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRhQ2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0NvbG9yQ29uZGl0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSwgY29tcG9uZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kc1N1YnNjcmlwdGlvbiQ/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy5kc1N1YnNjcmlwdGlvbiQgPSB0aGlzLmRhdGFTb3VyY2Uub3V0cHV0c1N1YmplY3RcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBJRGF0YVNvdXJjZU91dHB1dDxJS3BpRGF0YT4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFZhbHVlRnJvbURTID1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucmVzdWx0Py52YWx1ZSB8fCB0aGlzLmxhdGVzdFZhbHVlRnJvbURTO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb2xvckNvbmRpdGlvbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tDb2xvckNvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5ydWxlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucnVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbG9yKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLmRzU3Vic2NyaXB0aW9uJD8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2xvclRvU2V0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHJldmVyc2UgYmVjYXVzZSBsYXN0IHJ1bGUgaGFzIHRvcCBwcmlvcml0eVxuICAgICAgICBjb25zdCBuZXdSdWxlcyA9IHRoaXMucnVsZXMgJiYgWy4uLnRoaXMucnVsZXNdLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG5ld1J1bGVzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yc1tydWxlLmNvbXBhcmlzb25UeXBlXT8uY29tcGFyYXRvckZuKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFZhbHVlRnJvbURTLFxuICAgICAgICAgICAgICAgICAgICBydWxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29sb3JUb1NldCA9IHJ1bGUuY29sb3I7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIGV4aXQgaWYgdGhlIHJ1bGUgbWF0Y2hlc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDb2xvcihjb2xvclRvU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2xvciB0byBwaXp6YWduYVxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbG9yIC0gQ29sb3IgdG8gc2V0XG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRDb2xvcihjb2xvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGl6emFnbmFTZXJ2aWNlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOiB0aGlzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aDogW3RoaXMucHJvcGVydHlQYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xvclxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==