@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
143 lines • 21.4 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 } from "@angular/core";
import isArray from "lodash/isArray";
import { BehaviorSubject, Subject } from "rxjs";
import { distinctUntilChanged, filter, takeUntil, tap } from "rxjs/operators";
import { EventBus } 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 "@nova-ui/bits";
export class KpiScaleSyncBroker {
constructor(eventBus, pizzagnaService) {
this.eventBus = eventBus;
this.pizzagnaService = pizzagnaService;
this.brokers = [];
this.builder = new KpiScaleSyncBrokerBuilder(this.brokers);
this.destroySubscriptions$ = new Subject();
this.getMin = (n) => Math.min(...n);
this.getMax = (n) => Math.max(...n);
this.valuesObject = this.builder.valuesObject;
}
updateConfiguration(properties) {
this.properties = properties;
if (this.componentId) {
this.createPropertiesAndSubscribeToBrokers();
}
}
configure() {
return this.builder;
}
getBrokers() {
return this.brokers;
}
subscribeToBrokers() {
this.destroy();
this.brokers.forEach((broker) => {
broker.in$
.pipe(filter((_) => !!broker.in$.observers.length), distinctUntilChanged(), tap((data) => this.configureValueModel(data)), tap((data) => this.processAndEmitSyncedValue(data, broker)), takeUntil(this.destroySubscriptions$))
.subscribe();
});
}
setComponent(component, componentId) {
this.componentId = componentId;
this.updateConfiguration(this.properties);
}
destroy() {
this.destroySubscriptions$.next();
this.destroySubscriptions$.complete();
}
processAndEmitSyncedValue(data, broker) {
let fn = this.getMin;
if (broker?.type) {
fn = broker.type === "min" ? this.getMin : this.getMax;
}
const valuesToCompare = this.valuesObject[broker.id]
.filter((item) => item.targetID && item.targetValue)
.map((item) => item.targetValue);
broker.out$.next({
...data,
targetValue: fn([...valuesToCompare]),
});
}
configureValueModel(data) {
const targetObj = this.valuesObject[data.id].filter((obj) => obj.targetID === data.targetID);
targetObj.length
? (targetObj[0].targetValue = data.targetValue)
: this.valuesObject[data.id].push({
targetID: data.targetID,
targetValue: data.targetValue,
});
}
createPropertiesAndSubscribeToBrokers() {
this.tileNodes = this.pizzagnaService.getComponent(this.componentId).properties?.nodes;
const { scaleSyncConfig } = this.properties;
if (this.tileNodes?.length) {
this.tileNodes.forEach((node, i) => {
const property = {
componentId: node,
pizzagnaKey: PizzagnaLayer.Data,
propertyPath: [`syncValuesBroker`],
};
this.pizzagnaService.setProperty(property, this.getBrokers());
});
if (scaleSyncConfig && isArray(scaleSyncConfig)) {
scaleSyncConfig.forEach((s) => this.configure().addBroker({ id: s.id, type: s?.type }));
this.subscribeToBrokers();
}
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: i1.PizzagnaService }], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiScaleSyncBroker, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i2.EventBus, decorators: [{
type: Inject,
args: [PIZZAGNA_EVENT_BUS]
}] }, { type: i1.PizzagnaService }] });
class KpiScaleSyncBrokerBuilder {
constructor(brokers) {
this.brokers = brokers;
this.valuesObject = {};
}
addBroker(broker) {
const newBrokerSetting = {
id: broker.id,
targetID: "",
targetValue: 1,
};
this.valuesObject[broker.id] = new Array();
this.brokers.push({
...broker,
...this.getDefaultBrokerObject(newBrokerSetting, newBrokerSetting),
});
return this;
}
getDefaultBrokerObject(input, output) {
return {
in$: new BehaviorSubject(input),
out$: new BehaviorSubject(output),
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXNjYWxlLXN5bmMtYnJva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVycy9rcGktc2NhbGUtc3luYy1icm9rZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE9BQU8sRUFBRSxRQUFRLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFHSCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ3JCLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3JCLE1BQU0sT0FBTyxrQkFBa0I7SUFVM0IsWUFDd0MsUUFBMEIsRUFDdEQsZUFBZ0M7UUFESixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUN0RCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFQcEMsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUN4QixZQUFP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LEtBQW1CLEVBQUUsTUFBb0I7UUFDcEUsT0FBTztZQUNILEdBQUcsRUFBRSxJQUFJLGVBQWUsQ0FBZSxLQUFLLENBQUM7WUFDN0MsSUFBSSxFQUFFLElBQUksZUFBZSxDQUFlLE1BQU0sQ0FBQztTQUNsRCxDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgaXNBcnJheSBmcm9tIFwibG9kYXNoL2lzQXJyYXlcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQgeyBFdmVudEJ1cywgSUV2ZW50IH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgSUJyb2tlciwgSUJyb2tlclVzZXJDb25maWcsIElCcm9rZXJWYWx1ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJUGl6emFnbmFQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9waXp6YWduYS9mdW5jdGlvbnMvZ2V0LXBpenphZ25hLXByb3BlcnR5LXBhdGhcIjtcbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi8uLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIElDb25maWd1cmFibGUsXG4gICAgSVByb3BlcnRpZXMsXG4gICAgUGl6emFnbmFMYXllcixcbiAgICBQSVpaQUdOQV9FVkVOVF9CVVMsXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgS3BpU2NhbGVTeW5jQnJva2VyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7XG4gICAgcHJvdGVjdGVkIHByb3BlcnRpZXM6IElQcm9wZXJ0aWVzO1xuICAgIHByb3RlY3RlZCBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSB2YWx1ZXNPYmplY3Q6IFJlY29yZDxzdHJpbmcsIEFycmF5PFBhcnRpYWw8SUJyb2tlclZhbHVlPj4+O1xuICAgIHByaXZhdGUgYnJva2VyczogSUJyb2tlcltdID0gW107XG4gICAgcHJpdmF0ZSBidWlsZGVyID0gbmV3IEtwaVNjYWxlU3luY0Jyb2tlckJ1aWxkZXIodGhpcy5icm9rZXJzKTtcbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSB0aWxlTm9kZXM6IHN0cmluZ1tdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoUElaWkFHTkFfRVZFTlRfQlVTKSBwcml2YXRlIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+LFxuICAgICAgICBwcml2YXRlIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWVzT2JqZWN0ID0gdGhpcy5idWlsZGVyLnZhbHVlc09iamVjdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ29uZmlndXJhdGlvbihwcm9wZXJ0aWVzOiBJUHJvcGVydGllcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXNBbmRTdWJzY3JpYmVUb0Jyb2tlcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmUoKTogS3BpU2NhbGVTeW5jQnJva2VyQnVpbGRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJyb2tlcnMoKTogcmVhZG9ubHkgSUJyb2tlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJva2VycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3Vic2NyaWJlVG9Ccm9rZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcblxuICAgICAgICB0aGlzLmJyb2tlcnMuZm9yRWFjaCgoYnJva2VyKSA9PiB7XG4gICAgICAgICAgICBicm9rZXIuaW4kXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoXykgPT4gISFicm9rZXIuaW4kLm9ic2VydmVycy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgICAgICB0YXAoKGRhdGEpID0+IHRoaXMuY29uZmlndXJlVmFsdWVNb2RlbChkYXRhKSksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgoZGF0YSkgPT4gdGhpcy5wcm9jZXNzQW5kRW1pdFN5bmNlZFZhbHVlKGRhdGEsIGJyb2tlcikpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucyQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSwgY29tcG9uZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gICAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbih0aGlzLnByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zJC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVN1YnNjcmlwdGlvbnMkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQW5kRW1pdFN5bmNlZFZhbHVlKGRhdGE6IElCcm9rZXJWYWx1ZSwgYnJva2VyOiBJQnJva2VyKSB7XG4gICAgICAgIGxldCBmbjogRnVuY3Rpb24gPSB0aGlzLmdldE1pbjtcblxuICAgICAgICBpZiAoYnJva2VyPy50eXBlKSB7XG4gICAgICAgICAgICBmbiA9IGJyb2tlci50eXBlID09PSBcIm1pblwiID8gdGhpcy5nZXRNaW4gOiB0aGlzLmdldE1heDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlc1RvQ29tcGFyZTogKG51bWJlciB8IHVuZGVmaW5lZClbXSA9IHRoaXMudmFsdWVzT2JqZWN0W1xuICAgICAgICAgICAgYnJva2VyLmlkXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udGFyZ2V0SUQgJiYgaXRlbS50YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udGFyZ2V0VmFsdWUpO1xuXG4gICAgICAgIGJyb2tlci5vdXQkLm5leHQoe1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIHRhcmdldFZhbHVlOiBmbihbLi4udmFsdWVzVG9Db21wYXJlXSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlndXJlVmFsdWVNb2RlbChkYXRhOiBJQnJva2VyVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0T2JqID0gdGhpcy52YWx1ZXNPYmplY3RbZGF0YS5pZF0uZmlsdGVyKFxuICAgICAgICAgICAgKG9iaikgPT4gb2JqLnRhcmdldElEID09PSBkYXRhLnRhcmdldElEXG4gICAgICAgICk7XG5cbiAgICAgICAgdGFyZ2V0T2JqLmxlbmd0aFxuICAgICAgICAgICAgPyAodGFyZ2V0T2JqWzBdLnRhcmdldFZhbHVlID0gZGF0YS50YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgIDogdGhpcy52YWx1ZXNPYmplY3RbZGF0YS5pZF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXRJRDogZGF0YS50YXJnZXRJRCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlOiBkYXRhLnRhcmdldFZhbHVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVByb3BlcnRpZXNBbmRTdWJzY3JpYmVUb0Jyb2tlcnMoKSB7XG4gICAgICAgIHRoaXMudGlsZU5vZGVzID0gdGhpcy5waXp6YWduYVNlcnZpY2UuZ2V0Q29tcG9uZW50KFxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJZFxuICAgICAgICApLnByb3BlcnRpZXM/Lm5vZGVzO1xuICAgICAgICBjb25zdCB7IHNjYWxlU3luY0NvbmZpZyB9ID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbGVOb2Rlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVOb2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHk6IElQaXp6YWduYVByb3BlcnR5ID0ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZDogbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGl6emFnbmFLZXk6IFBpenphZ25hTGF5ZXIuRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoOiBbYHN5bmNWYWx1ZXNCcm9rZXJgXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMucGl6emFnbmFTZXJ2aWNlLnNldFByb3BlcnR5KHByb3BlcnR5LCB0aGlzLmdldEJyb2tlcnMoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHNjYWxlU3luY0NvbmZpZyAmJiBpc0FycmF5KHNjYWxlU3luY0NvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBzY2FsZVN5bmNDb25maWcuZm9yRWFjaCgoczogSUJyb2tlclVzZXJDb25maWcpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlKCkuYWRkQnJva2VyKHsgaWQ6IHMuaWQsIHR5cGU6IHM/LnR5cGUgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9Ccm9rZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1pbiA9IChuOiBudW1iZXJbXSkgPT4gTWF0aC5taW4oLi4ubik7XG4gICAgcHJpdmF0ZSBnZXRNYXggPSAobjogbnVtYmVyW10pID0+IE1hdGgubWF4KC4uLm4pO1xufVxuXG5jbGFzcyBLcGlTY2FsZVN5bmNCcm9rZXJCdWlsZGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVzT2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxQYXJ0aWFsPElCcm9rZXJWYWx1ZT4+PiA9XG4gICAgICAgIHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBicm9rZXJzOiBJQnJva2VyW10pIHt9XG5cbiAgICBwdWJsaWMgYWRkQnJva2VyKGJyb2tlcjogSUJyb2tlclVzZXJDb25maWcpOiBLcGlTY2FsZVN5bmNCcm9rZXJCdWlsZGVyIHtcbiAgICAgICAgY29uc3QgbmV3QnJva2VyU2V0dGluZzogSUJyb2tlclZhbHVlID0ge1xuICAgICAgICAgICAgaWQ6IGJyb2tlci5pZCxcbiAgICAgICAgICAgIHRhcmdldElEOiBcIlwiLFxuICAgICAgICAgICAgdGFyZ2V0VmFsdWU6IDEsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmFsdWVzT2JqZWN0W2Jyb2tlci5pZF0gPSBuZXcgQXJyYXk8UGFydGlhbDxJQnJva2VyVmFsdWU+PigpO1xuICAgICAgICB0aGlzLmJyb2tlcnMucHVzaCh7XG4gICAgICAgICAgICAuLi5icm9rZXIsXG4gICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRCcm9rZXJPYmplY3QobmV3QnJva2VyU2V0dGluZywgbmV3QnJva2VyU2V0dGluZyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRCcm9rZXJPYmplY3QoaW5wdXQ6IElCcm9rZXJWYWx1ZSwgb3V0cHV0OiBJQnJva2VyVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluJDogbmV3IEJlaGF2aW9yU3ViamVjdDxJQnJva2VyVmFsdWU+KGlucHV0KSxcbiAgICAgICAgICAgIG91dCQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8SUJyb2tlclZhbHVlPihvdXRwdXQpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==