@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
109 lines • 16.5 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 { __decorate, __metadata, __param } from "tslib";
import { DecimalPipe } from "@angular/common";
import { Inject, Optional } from "@angular/core";
import _isNil from "lodash/isNil";
import { EventBus } from "@nova-ui/bits";
import { DataSourceAdapter } from "./data-source-adapter";
import { KpiWidgetThresholdColors, } from "../../configurator/components/widgets/kpi/types";
import { PizzagnaService } from "../../pizzagna/services/pizzagna.service";
import { DATA_SOURCE, PIZZAGNA_EVENT_BUS } from "../../types";
let KpiDataSourceAdapter = class KpiDataSourceAdapter extends DataSourceAdapter {
constructor(eventBus, dataSource, pizzagnaService, numberPipe) {
super(eventBus, dataSource, pizzagnaService);
this.numberPipe = numberPipe;
}
updateConfiguration(properties) {
this.thresholds = properties.thresholds;
super.updateConfiguration(properties);
}
processOutput(data) {
const processedValue = this.processThresholds(data);
// processNumberFormat changes data.value to a string which is why this function needs to be run after processThresholds.
return this.processNumberFormat(processedValue);
}
setComponent(component, componentId) {
if (componentId) {
this.componentId = componentId;
}
}
getThresholdColor(thresholdsConfig, indicatorData, defaultColor) {
const thresholdChecks = this.getThresholdChecks(thresholdsConfig, indicatorData, thresholdsConfig.reversedThresholds);
if (thresholdChecks.warningCheck) {
return KpiWidgetThresholdColors.Warning;
}
if (thresholdChecks.criticalCheck) {
return KpiWidgetThresholdColors.Critical;
}
return defaultColor;
}
getThresholdChecks(indicatorConfig, indicatorData, isReversed) {
const warningThreshold = indicatorConfig.warningThresholdValue;
const criticalThreshold = indicatorConfig.criticalThresholdValue;
const reversedWarningCheck = !_isNil(warningThreshold) &&
indicatorData.value <= warningThreshold &&
indicatorData.value > criticalThreshold;
const reversedCriticalCheck = indicatorData.value <= criticalThreshold;
const normalWarningCheck = !_isNil(warningThreshold) &&
indicatorData.value >= warningThreshold &&
indicatorData.value < criticalThreshold;
const normalCriticalCheck = indicatorData.value >= criticalThreshold;
return {
warningCheck: isReversed
? reversedWarningCheck
: normalWarningCheck,
criticalCheck: isReversed
? reversedCriticalCheck
: normalCriticalCheck,
};
}
processThresholds(data) {
if (!data ||
!this.thresholds?.showThresholds ||
typeof data.value !== "number") {
return data;
}
const thresholdColor = this.getThresholdColor(this.thresholds, data, data.backgroundColor);
return {
...data,
backgroundColor: thresholdColor,
};
}
processNumberFormat(data) {
if (typeof data?.value !== "number" || !data?.numberFormat) {
return data;
}
const numValue = this.numberPipe.transform(data.value, data.numberFormat);
return {
...data,
value: numValue,
};
}
};
KpiDataSourceAdapter = __decorate([
__param(0, Inject(PIZZAGNA_EVENT_BUS)),
__param(1, Optional()),
__param(1, Inject(DATA_SOURCE)),
__metadata("design:paramtypes", [EventBus, Object, PizzagnaService,
DecimalPipe])
], KpiDataSourceAdapter);
export { KpiDataSourceAdapter };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLWRhdGEtc291cmNlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcHJvdmlkZXJzL2twaS1kYXRhLXNvdXJjZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjs7QUFFakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUVsQyxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUU5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBRUgsd0JBQXdCLEdBQzNCLE1BQU0saURBQWlELENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPOUQsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBcUIsU0FBUSxpQkFBMkI7SUFHakUsWUFDZ0MsUUFBMEIsRUFDckIsVUFBdUIsRUFDeEQsZUFBZ0MsRUFDeEIsVUFBdUI7UUFFL0IsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVB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LFlBQVksRUFBRTtZQUN4RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLFlBQVksQ0FDcEIsQ0FBQztRQUNGLE9BQU87WUFDSCxHQUFHLElBQUk7WUFDUCxLQUFLLEVBQUUsUUFBUTtTQUNsQixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUE7QUE5R1ksb0JBQW9CO0lBSXhCLFdBQUEsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDMUIsV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUFFLFdBQUEsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO3FDQURNLFFBQVEsVUFFN0IsZUFBZTtRQUNaLFdBQVc7R0FQMUIsb0JBQW9CLENBOEdoQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBEZWNpbWFsUGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5cbmltcG9ydCB7IEV2ZW50QnVzLCBJRGF0YVNvdXJjZSwgSUV2ZW50IH0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHsgRGF0YVNvdXJjZUFkYXB0ZXIgfSBmcm9tIFwiLi9kYXRhLXNvdXJjZS1hZGFwdGVyXCI7XG5pbXBvcnQge1xuICAgIElLcGlUaHJlc2hvbGRzQ29uZmlnLFxuICAgIEtwaVdpZGdldFRocmVzaG9sZENvbG9ycyxcbn0gZnJvbSBcIi4uLy4uL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldHMva3BpL3R5cGVzXCI7XG5pbXBvcnQgeyBQaXp6YWduYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vcGl6emFnbmEvc2VydmljZXMvcGl6emFnbmEuc2VydmljZVwiO1xuaW1wb3J0IHsgREFUQV9TT1VSQ0UsIFBJWlpBR05BX0VWRU5UX0JVUyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgSUtwaURhdGEgfSBmcm9tIFwiLi4va3BpLXdpZGdldC90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElLcGlEYXRhU291cmNlQWRhcHRlckNvbmZpZ3VyYXRpb24ge1xuICAgIHRocmVzaG9sZHM6IElLcGlUaHJlc2hvbGRzQ29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgS3BpRGF0YVNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBEYXRhU291cmNlQWRhcHRlcjxJS3BpRGF0YT4ge1xuICAgIHByaXZhdGUgdGhyZXNob2xkczogSUtwaVRocmVzaG9sZHNDb25maWc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChQSVpaQUdOQV9FVkVOVF9CVVMpIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfU09VUkNFKSBkYXRhU291cmNlOiBJRGF0YVNvdXJjZSxcbiAgICAgICAgcGl6emFnbmFTZXJ2aWNlOiBQaXp6YWduYVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbnVtYmVyUGlwZTogRGVjaW1hbFBpcGVcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZXZlbnRCdXMsIGRhdGFTb3VyY2UsIHBpenphZ25hU2VydmljZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgIHByb3BlcnRpZXM6IElLcGlEYXRhU291cmNlQWRhcHRlckNvbmZpZ3VyYXRpb25cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aHJlc2hvbGRzID0gcHJvcGVydGllcy50aHJlc2hvbGRzO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZUNvbmZpZ3VyYXRpb24ocHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NPdXRwdXQoZGF0YTogSUtwaURhdGEpOiBJS3BpRGF0YSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVGhyZXNob2xkcyhkYXRhKTtcbiAgICAgICAgLy8gcHJvY2Vzc051bWJlckZvcm1hdCBjaGFuZ2VzIGRhdGEudmFsdWUgdG8gYSBzdHJpbmcgd2hpY2ggaXMgd2h5IHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcnVuIGFmdGVyIHByb2Nlc3NUaHJlc2hvbGRzLlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTnVtYmVyRm9ybWF0KHByb2Nlc3NlZFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29tcG9uZW50KGNvbXBvbmVudDogYW55LCBjb21wb25lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChjb21wb25lbnRJZCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUaHJlc2hvbGRDb2xvcihcbiAgICAgICAgdGhyZXNob2xkc0NvbmZpZzogSUtwaVRocmVzaG9sZHNDb25maWcsXG4gICAgICAgIGluZGljYXRvckRhdGE6IElLcGlEYXRhLFxuICAgICAgICBkZWZhdWx0Q29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRDaGVja3MgPSB0aGlzLmdldFRocmVzaG9sZENoZWNrcyhcbiAgICAgICAgICAgIHRocmVzaG9sZHNDb25maWcsXG4gICAgICAgICAgICBpbmRpY2F0b3JEYXRhLFxuICAgICAgICAgICAgdGhyZXNob2xkc0NvbmZpZy5yZXZlcnNlZFRocmVzaG9sZHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRocmVzaG9sZENoZWNrcy53YXJuaW5nQ2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBLcGlXaWRnZXRUaHJlc2hvbGRDb2xvcnMuV2FybmluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhyZXNob2xkQ2hlY2tzLmNyaXRpY2FsQ2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBLcGlXaWRnZXRUaHJlc2hvbGRDb2xvcnMuQ3JpdGljYWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRocmVzaG9sZENoZWNrcyhcbiAgICAgICAgaW5kaWNhdG9yQ29uZmlnOiBJS3BpVGhyZXNob2xkc0NvbmZpZyxcbiAgICAgICAgaW5kaWNhdG9yRGF0YTogSUtwaURhdGEsXG4gICAgICAgIGlzUmV2ZXJzZWQ6IGJvb2xlYW5cbiAgICApIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ1RocmVzaG9sZCA9IGluZGljYXRvckNvbmZpZy53YXJuaW5nVGhyZXNob2xkVmFsdWU7XG4gICAgICAgIGNvbnN0IGNyaXRpY2FsVGhyZXNob2xkID0gaW5kaWNhdG9yQ29uZmlnLmNyaXRpY2FsVGhyZXNob2xkVmFsdWU7XG4gICAgICAgIGNvbnN0IHJldmVyc2VkV2FybmluZ0NoZWNrID1cbiAgICAgICAgICAgICFfaXNOaWwod2FybmluZ1RocmVzaG9sZCkgJiZcbiAgICAgICAgICAgIGluZGljYXRvckRhdGEudmFsdWUgPD0gd2FybmluZ1RocmVzaG9sZCAmJlxuICAgICAgICAgICAgaW5kaWNhdG9yRGF0YS52YWx1ZSA+IGNyaXRpY2FsVGhyZXNob2xkO1xuICAgICAgICBjb25zdCByZXZlcnNlZENyaXRpY2FsQ2hlY2sgPSBpbmRpY2F0b3JEYXRhLnZhbHVlIDw9IGNyaXRpY2FsVGhyZXNob2xkO1xuICAgICAgICBjb25zdCBub3JtYWxXYXJuaW5nQ2hlY2sgPVxuICAgICAgICAgICAgIV9pc05pbCh3YXJuaW5nVGhyZXNob2xkKSAmJlxuICAgICAgICAgICAgaW5kaWNhdG9yRGF0YS52YWx1ZSA+PSB3YXJuaW5nVGhyZXNob2xkICYmXG4gICAgICAgICAgICBpbmRpY2F0b3JEYXRhLnZhbHVlIDwgY3JpdGljYWxUaHJlc2hvbGQ7XG4gICAgICAgIGNvbnN0IG5vcm1hbENyaXRpY2FsQ2hlY2sgPSBpbmRpY2F0b3JEYXRhLnZhbHVlID49IGNyaXRpY2FsVGhyZXNob2xkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2FybmluZ0NoZWNrOiBpc1JldmVyc2VkXG4gICAgICAgICAgICAgICAgPyByZXZlcnNlZFdhcm5pbmdDaGVja1xuICAgICAgICAgICAgICAgIDogbm9ybWFsV2FybmluZ0NoZWNrLFxuICAgICAgICAgICAgY3JpdGljYWxDaGVjazogaXNSZXZlcnNlZFxuICAgICAgICAgICAgICAgID8gcmV2ZXJzZWRDcml0aWNhbENoZWNrXG4gICAgICAgICAgICAgICAgOiBub3JtYWxDcml0aWNhbENoZWNrLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1RocmVzaG9sZHMoZGF0YTogSUtwaURhdGEpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgICAgICF0aGlzLnRocmVzaG9sZHM/LnNob3dUaHJlc2hvbGRzIHx8XG4gICAgICAgICAgICB0eXBlb2YgZGF0YS52YWx1ZSAhPT0gXCJudW1iZXJcIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZENvbG9yID0gdGhpcy5nZXRUaHJlc2hvbGRDb2xvcihcbiAgICAgICAgICAgIHRoaXMudGhyZXNob2xkcyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBkYXRhLmJhY2tncm91bmRDb2xvclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhyZXNob2xkQ29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTnVtYmVyRm9ybWF0KGRhdGE6IElLcGlEYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YT8udmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIWRhdGE/Lm51bWJlckZvcm1hdCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtVmFsdWUgPSB0aGlzLm51bWJlclBpcGUudHJhbnNmb3JtKFxuICAgICAgICAgICAgZGF0YS52YWx1ZSxcbiAgICAgICAgICAgIGRhdGEubnVtYmVyRm9ybWF0XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdmFsdWU6IG51bVZhbHVlLFxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==