@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
369 lines • 63.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { DatePipe } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
export class RadialGaugeService {
constructor(c8yDatePipe) {
this.c8yDatePipe = c8yDatePipe;
this.containerSize = 400;
}
setChart(chart) {
this.chart = chart;
}
getChartOptions(gaugeOptions, activeDatapointGauge, selectedPresetId, gaugeOptionsColors, rangeColors, measurement, fractionSize) {
const colorArray = this.getColorArray(activeDatapointGauge, rangeColors);
return {
series: [
{
type: 'gauge',
radius: gaugeOptions?.radius || '90%',
center: gaugeOptions?.center || ['50%', '50%'],
startAngle: gaugeOptions?.startAngle || 240,
endAngle: gaugeOptions?.endAngle || 300,
min: activeDatapointGauge?.min || 0,
max: activeDatapointGauge?.max !== undefined && activeDatapointGauge?.max !== null
? activeDatapointGauge.max
: 100,
// Split properties
splitNumber: gaugeOptions?.splitNumber || 10,
splitLine: {
distance: gaugeOptions?.splitLineDistanceRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.splitLineDistanceRatio
: gaugeOptions?.splitLineDistance || -30,
length: gaugeOptions?.splitLineLengthRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.splitLineLengthRatio
: gaugeOptions?.splitLineLength || 30,
lineStyle: {
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
? gaugeOptions?.splitLineColor
: gaugeOptionsColors?.splitLineColor || '#fff',
width: gaugeOptions?.splitLineWidth || 4
}
},
// Tick properties
axisTick: {
show: gaugeOptions?.tickShow || false,
distance: gaugeOptions?.tickDistanceRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.tickDistanceRatio
: gaugeOptions?.tickDistance || -30,
length: gaugeOptions?.tickLengthRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.tickLengthRatio
: gaugeOptions?.tickLength || 8,
lineStyle: {
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
? gaugeOptions.tickColor
: gaugeOptionsColors?.tickColor || '#fff',
width: gaugeOptions?.tickWidth || 2
}
},
// Axis properties
axisLine: {
lineStyle: {
width: gaugeOptions?.axisLineWidthRatio
? this.containerSize * gaugeOptions?.axisLineWidthRatio
: gaugeOptions?.axisLineWidth || 30,
color: colorArray
}
},
axisLabel: {
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
? gaugeOptions.axisLabelColor
: gaugeOptionsColors?.axisLabelColor || 'inherit',
distance: gaugeOptions?.axisLabelDistanceRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.axisLabelDistanceRatio
: gaugeOptions?.axisLabelDistance || 40,
fontSize: gaugeOptions?.axisLabelFontSizeRatio
? this.clampRelative(gaugeOptions?.axisLabelFontSizeRatio, gaugeOptions?.axisLabelFontSizeMin, gaugeOptions?.axisLabelFontSizeMax)
: gaugeOptions?.axisLabelFontSize || 16,
fontWeight: 'bold',
fontFamily: gaugeOptionsColors?.fontFamily
},
// pointer properties
pointer: {
...(gaugeOptions?.pointerStyle !== 'default' && {
icon: gaugeOptions?.pointerStyle
}),
show: gaugeOptions?.showPointer || false,
length: gaugeOptions?.pointerLengthRatio
? gaugeOptions?.pointerLengthRatio *
(this.containerSize * gaugeOptions?.axisLineWidthRatio)
: gaugeOptions?.pointerLength || '65%',
width: gaugeOptions?.pointerWidthRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.pointerWidthRatio
: gaugeOptions?.pointerWidth || 40,
offsetCenter: selectedPresetId === 'default'
? [0, this.containerSize * gaugeOptions?.axisLineWidthRatio * -1]
: [0, gaugeOptions?.pointerOffset || -30],
itemStyle: {
color: selectedPresetId === 'custom'
? gaugeOptions.pointerColor
: gaugeOptionsColors?.pointerColor || 'inherit'
}
},
// Progress bar properties
progress: {
show: gaugeOptions?.progressBar || false,
roundCap: gaugeOptions?.progressBarRoundCap || false,
width: gaugeOptions?.progressBarWidthRatio
? this.containerSize *
gaugeOptions?.axisLineWidthRatio *
gaugeOptions?.progressBarWidthRatio
: gaugeOptions?.progressBarWidth || 18,
itemStyle: {
color: selectedPresetId === 'custom'
? gaugeOptions.progressBarColor
: gaugeOptionsColors?.progressBarColor || 'inherit'
}
},
// Anchor properties
anchor: gaugeOptions?.anchor
? {
...gaugeOptions.anchor,
size: gaugeOptions?.anchor?.sizeRatio
? this.containerSize * gaugeOptions?.anchor?.sizeRatio
: gaugeOptions?.anchor?.size || 45,
itemStyle: {
color: selectedPresetId === 'custom'
? gaugeOptions.pointerColor
: gaugeOptionsColors?.pointerColor
}
}
: undefined,
// Detail properties
detail: {
show: gaugeOptions?.showDetail || false,
valueAnimation: true,
offsetCenter: gaugeOptions?.detailOffsetCenterYRatio
? [0, gaugeOptions?.detailOffsetCenterYRatio * this.containerSize]
: gaugeOptions?.detailOffsetCenter || [0, 0],
formatter: () => {
const value = measurement?.value.toFixed(fractionSize) || 0;
const unit = activeDatapointGauge?.unit || measurement?.unit || '';
const date = new Date(measurement?.date);
const formattedDate = this.c8yDatePipe.transform(date);
return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
},
color: 'inherit',
lineHeight: gaugeOptions?.measurementValueFontRatio
? this.clampRelative(gaugeOptions?.measurementValueFontRatio * 0.9, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
: gaugeOptions?.measurementValueFontSize || 32,
rich: {
value: {
fontSize: gaugeOptions?.measurementValueFontRatio
? this.clampRelative(fractionSize > 5 || measurement?.value > 9999
? gaugeOptions?.measurementValueFontRatio * 0.5
: gaugeOptions?.measurementValueFontRatio, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
: gaugeOptions?.measurementValueFontSize || 32,
fontWeight: 'bolder',
fontFamily: gaugeOptionsColors?.fontFamily,
color: selectedPresetId === 'custom'
? gaugeOptions.measurementValueColor
: gaugeOptionsColors?.measurementValueColor || '#777'
},
unit: {
fontSize: gaugeOptions?.unitFontRatio
? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontMin, gaugeOptions?.unitFontMax)
: gaugeOptions?.unitFontSize || 20,
fontFamily: gaugeOptionsColors?.fontFamily,
color: selectedPresetId === 'custom'
? gaugeOptions?.unitColor
: gaugeOptionsColors?.unitColor || '#999'
},
date: {
fontSize: gaugeOptions?.dateFontRatio
? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
: gaugeOptions?.dateFontSize || 12,
fontFamily: gaugeOptionsColors?.fontFamily,
color: selectedPresetId === 'custom'
? gaugeOptions?.dateColor
: gaugeOptionsColors?.dateColor || '#555'
}
}
},
markPoint: {
symbolSize: 0,
offsetCenter: gaugeOptions?.detailOffsetCenter || [0, 0],
data: [
{
x: '50%',
y: '50%',
label: {
show: gaugeOptions?.showMarkPoint,
formatter: () => {
const value = measurement?.value.toFixed(fractionSize) || 0;
const unit = activeDatapointGauge?.unit || measurement?.unit || '';
const date = new Date(measurement?.date);
const formattedDate = this.c8yDatePipe.transform(date);
return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
},
color: '#fff',
align: 'center',
rich: {
value: {
fontSize: gaugeOptions?.measurementValueFontRatio
? this.clampRelative(fractionSize > 5
? gaugeOptions?.measurementValueFontRatio * 0.5
: gaugeOptions?.measurementValueFontRatio, fractionSize > 5
? gaugeOptions.measurementValueFontMin * 0.5
: gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
: gaugeOptions?.measurementValueFontSize || 32,
fontFamily: gaugeOptionsColors?.fontFamily,
fontWeight: 'bolder',
color: gaugeOptionsColors?.knobFontColor || '#777'
},
unit: {
fontSize: gaugeOptions?.unitFontRatio
? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontSizeMin, gaugeOptions?.unitFontSizeMax)
: gaugeOptions?.unitFontSize || 20,
fontFamily: gaugeOptionsColors?.fontFamily,
color: gaugeOptionsColors?.knobFontColor || '#999'
},
date: {
fontSize: gaugeOptions?.dateFontRatio
? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
: gaugeOptions?.dateFontSize || 12,
fontFamily: gaugeOptionsColors?.fontFamily,
color: gaugeOptionsColors?.knobFontColor || '#555'
}
}
}
}
]
},
data: [
{
value: 0 || measurement?.value
}
]
}
]
};
}
updateRangeColors() {
if (!this.chart) {
return;
}
return {
default: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-form-control-border-color-default'),
yellow: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-warning'),
red: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-danger')
};
}
updateGaugeOptionsColors() {
if (!this.chart) {
return;
}
return {
splitLineColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
tickColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
axisLabelColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
pointerColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
knobColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
knobFontColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
measurementValueColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
unitColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
dateColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-text-muted'),
progressBarColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-brand-primary'),
fontFamily: getComputedStyle(document.body).getPropertyValue('font-family')
};
}
getColorArray(activeDatapointGauge, rangeColors) {
const min = activeDatapointGauge?.min ?? 0;
const max = activeDatapointGauge?.max ?? 100;
const range = max - min;
const yellowMin = activeDatapointGauge?.yellowRangeMin;
const yellowMax = activeDatapointGauge?.yellowRangeMax;
const redMin = activeDatapointGauge?.redRangeMin;
const redMax = activeDatapointGauge?.redRangeMax;
const ranges = [];
// First add red range
if (redMin != null && redMax != null && redMin < redMax) {
ranges.push({ start: redMin, end: redMax, color: rangeColors.red });
}
// Then add yellow, but clip out any overlap with red
if (yellowMin != null && yellowMax != null && yellowMin < yellowMax) {
const redRange = ranges.find(r => r.color === rangeColors.red);
if (!redRange ||
yellowMax <= redRange.start || // yellow ends before red
yellowMin >= redRange.end // yellow starts after red
) {
// no overlap
ranges.push({ start: yellowMin, end: yellowMax, color: rangeColors.yellow });
}
else {
// partial overlap – split yellow into non-overlapping parts
if (yellowMin < redRange.start) {
ranges.push({
start: yellowMin,
end: Math.min(yellowMax, redRange.start),
color: rangeColors.yellow
});
}
if (yellowMax > redRange.end) {
ranges.push({
start: Math.max(yellowMin, redRange.end),
end: yellowMax,
color: rangeColors.yellow
});
}
}
}
// Sort by start position
ranges.sort((a, b) => a.start - b.start);
// Build segments
const segments = [];
let current = min;
for (const { start, end, color } of ranges) {
if (start > current) {
// Default fill before this range
segments.push([(start - min) / range, rangeColors.default]);
}
// Start color
segments.push([(start - min) / range, color]);
// End color
segments.push([(end - min) / range, color]);
current = Math.max(current, end);
}
// Fill remaining with default
if (current < max) {
segments.push([(current - min) / range, rangeColors.default]);
}
if (segments.length === 0 || segments[segments.length - 1][0] < 1) {
segments.push([1, rangeColors.default]);
}
return segments;
}
clampRelative(ratio, min, max) {
const clampedValue = this.containerSize * ratio;
if (clampedValue < min) {
return min;
}
else if (clampedValue > max) {
return max;
}
else {
return clampedValue;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.DatePipe }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaWFsLWdhdWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL3JhZGlhbC1nYXVnZS9yYWRpYWwtZ2F1Z2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBSy9DLE1BQU0sT0FBTyxrQkFBa0I7SUFJN0IsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFGekMsa0JBQWEsR0FBRyxHQUFHLENBQUM7SUFFd0IsQ0FBQztJQUU3QyxRQUFRLENBQUMsS0FBaUI7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWUsQ0FDYixZQUEwQixFQUMxQixvQkFBZ0MsRUFDaEMsZ0JBQXdCLEVBQ3hCLGtCQUFzQyxFQUN0QyxXQUE2RCxFQUM3RCxXQUE4QixFQUM5QixZQUFvQjtRQUVwQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXpFLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksS0FBSztvQkFDckMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO29CQUM5QyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxHQUFHO29CQUMzQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxHQUFHO29CQUN2QyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JB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QUcsQ0FBQztRQUNiLENBQUM7YUFBTSxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7K0dBbGRVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLUElEZXRhaWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgR2F1Z2VPcHRpb25zLCBHYXVnZU9wdGlvbnNDb2xvcnMgfSBmcm9tICcuLi9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcvZ2F1Z2UubW9kZWwnO1xuaW1wb3J0IHsgSU1lYXN1cmVtZW50VmFsdWUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSYWRpYWxHYXVnZVNlcnZpY2Uge1xuICBwcml2YXRlIGNoYXJ0OiBFbGVtZW50UmVmO1xuICBjb250YWluZXJTaXplID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYzh5RGF0ZVBpcGU6IERhdGVQaXBlKSB7fVxuXG4gIHNldENoYXJ0KGNoYXJ0OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgZ2V0Q2hhcnRPcHRpb25zKFxuICAgIGdhdWdlT3B0aW9uczogR2F1Z2VPcHRpb25zLFxuICAgIGFjdGl2ZURhdGFwb2ludEdhdWdlOiBLUElEZXRhaWxzLFxuICAgIHNlbGVjdGVkUHJlc2V0SWQ6IHN0cmluZyxcbiAgICBnYXVnZU9wdGlvbnNDb2xvcnM6IEdhdWdlT3B0aW9uc0NvbG9ycyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9LFxuICAgIG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZSxcbiAgICBmcmFjdGlvblNpemU6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBjb2xvckFycmF5ID0gdGhpcy5nZXRDb2xvckFycmF5KGFjdGl2ZURhdGFwb2ludEdhdWdlLCByYW5nZUNvbG9ycyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnLFxuICAgICAgICAgIHJhZGl1czogZ2F1Z2VPcHRpb25zPy5yYWRpdXMgfHwgJzkwJScsXG4gICAgICAgICAgY2VudGVyOiBnYXVnZU9wdGlvbnM/LmNlbnRlciB8fCBbJzUwJScsICc1MCUnXSxcbiAgICAgICAgICBzdGFydEFuZ2xlOiBnYXVnZU9wdGlvbnM/LnN0YXJ0QW5nbGUgfHwgMjQwLFxuICAgICAgICAgIGVuZEFuZ2xlOiBnYXVnZU9wdGlvbnM/LmVuZEFuZ2xlIHx8IDMwMCxcbiAgICAgICAgICBtaW46IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5taW4gfHwgMCxcbiAgICAgICAgICBtYXg6XG4gICAgICAgICAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ubWF4ICE9PSB1bmRlZmluZWQgJiYgYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1heCAhPT0gbnVsbFxuICAgICAgICAgICAgICA/IGFjdGl2ZURhdGFwb2ludEdhdWdlLm1heFxuICAgICAgICAgICAgICA6IDEwMCxcblxuICAgICAgICAgIC8vIFNwbGl0IHByb3BlcnRpZXNcbiAgICAgICAgICBzcGxpdE51bWJlcjogZ2F1Z2VPcHRpb25zPy5zcGxpdE51bWJlciB8fCAxMCxcbiAgICAgICAgICBzcGxpdExpbmU6IHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlIHx8IC0zMCxcblxuICAgICAgICAgICAgbGVuZ3RoOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZUxlbmd0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lTGVuZ3RoIHx8IDMwLFxuXG4gICAgICAgICAgICBsaW5lU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVDb2xvclxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnNwbGl0TGluZUNvbG9yIHx8ICcjZmZmJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lV2lkdGggfHwgNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBUaWNrIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzVGljazoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy50aWNrU2hvdyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnRpY2tEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy50aWNrRGlzdGFuY2VSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0Rpc3RhbmNlIHx8IC0zMCxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy50aWNrTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnRpY2tMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0xlbmd0aCB8fCA4LFxuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nIHx8IHNlbGVjdGVkUHJlc2V0SWQgPT09ICdncmFkZS1yYXRpbmcnXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy50aWNrQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy50aWNrQ29sb3IgfHwgJyNmZmYnLFxuICAgICAgICAgICAgICB3aWR0aDogZ2F1Z2VPcHRpb25zPy50aWNrV2lkdGggfHwgMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBeGlzIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzTGluZToge1xuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpb1xuICAgICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICogZ2F1Z2VPcHRpb25zPy5heGlzTGluZVdpZHRoUmF0aW9cbiAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aCB8fCAzMCxcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yQXJyYXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXhpc0xhYmVsOiB7XG4gICAgICAgICAgICBjb2xvcjpcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5heGlzTGFiZWxDb2xvclxuICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5heGlzTGFiZWxDb2xvciB8fCAnaW5oZXJpdCcsXG4gICAgICAgICAgICBkaXN0YW5jZTogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZSB8fCA0MCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW8sXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplIHx8IDE2LFxuICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIHBvaW50ZXIgcHJvcGVydGllc1xuICAgICAgICAgIHBvaW50ZXI6IHtcbiAgICAgICAgICAgIC4uLihnYXVnZU9wdGlvbnM/LnBvaW50ZXJTdHlsZSAhPT0gJ2RlZmF1bHQnICYmIHtcbiAgICAgICAgICAgICAgaWNvbjogZ2F1Z2VPcHRpb25zPy5wb2ludGVyU3R5bGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93UG9pbnRlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy5wb2ludGVyTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/LnBvaW50ZXJMZW5ndGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgKHRoaXMuY29udGFpbmVyU2l6ZSAqIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvKVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlckxlbmd0aCB8fCAnNjUlJyxcbiAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LnBvaW50ZXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wb2ludGVyV2lkdGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlcldpZHRoIHx8IDQwLFxuICAgICAgICAgICAgb2Zmc2V0Q2VudGVyOlxuICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnZGVmYXVsdCdcbiAgICAgICAgICAgICAgICA/IFswLCB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqIC0xXVxuICAgICAgICAgICAgICAgIDogWzAsIGdhdWdlT3B0aW9ucz8ucG9pbnRlck9mZnNldCB8fCAtMzBdLFxuICAgICAgICAgICAgaXRlbVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5wb2ludGVyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wb2ludGVyQ29sb3IgfHwgJ2luaGVyaXQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIFByb2dyZXNzIGJhciBwcm9wZXJ0aWVzXG4gICAgICAgICAgcHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXIgfHwgZmFsc2UsXG4gICAgICAgICAgICByb3VuZENhcDogZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhclJvdW5kQ2FwIHx8IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhcldpZHRoUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnByb2dyZXNzQmFyV2lkdGggfHwgMTgsXG4gICAgICAgICAgICBpdGVtU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbSdcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLnByb2dyZXNzQmFyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wcm9ncmVzc0JhckNvbG9yIHx8ICdpbmhlcml0J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBbmNob3IgcHJvcGVydGllc1xuICAgICAgICAgIGFuY2hvcjogZ2F1Z2VPcHRpb25zPy5hbmNob3JcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLmdhdWdlT3B0aW9ucy5hbmNob3IsXG4gICAgICAgICAgICAgICAgc2l6ZTogZ2F1Z2VPcHRpb25zPy5hbmNob3I/LnNpemVSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmFuY2hvcj8uc2l6ZVJhdGlvXG4gICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYW5jaG9yPy5zaXplIHx8IDQ1LFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZToge1xuICAgICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnMucG9pbnRlckNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnBvaW50ZXJDb2xvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICAvLyBEZXRhaWwgcHJvcGVydGllc1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93RGV0YWlsIHx8IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICBvZmZzZXRDZW50ZXI6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvXG4gICAgICAgICAgICAgID8gWzAsIGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvICogdGhpcy5jb250YWluZXJTaXplXVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyIHx8IFswLCAwXSxcblxuICAgICAgICAgICAgZm9ybWF0dGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWVhc3VyZW1lbnQ/LnZhbHVlLnRvRml4ZWQoZnJhY3Rpb25TaXplKSB8fCAwO1xuICAgICAgICAgICAgICBjb25zdCB1bml0ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnVuaXQgfHwgbWVhc3VyZW1lbnQ/LnVuaXQgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShtZWFzdXJlbWVudD8uZGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmM4eURhdGVQaXBlLnRyYW5zZm9ybShkYXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGB7dmFsdWV8JHt2YWx1ZX19e3VuaXR8JHt1bml0fX0gXFxuIHtkYXRlfCR7Zm9ybWF0dGVkRGF0ZX19IGA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuOSxcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNSB8fCBtZWFzdXJlbWVudD8udmFsdWUgPiA5OTk5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuNVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250U2l6ZSB8fCAzMixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZGVyJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5tZWFzdXJlbWVudFZhbHVlQ29sb3JcbiAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lm1lYXN1cmVtZW50VmFsdWVDb2xvciB8fCAnIzc3NydcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdDoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250TWluLFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8udW5pdENvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy51bml0Q29sb3IgfHwgJyM5OTknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZSB8fCAxMixcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8uZGF0ZUNvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5kYXRlQ29sb3IgfHwgJyM1NTUnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hcmtQb2ludDoge1xuICAgICAgICAgICAgc3ltYm9sU2l6ZTogMCxcbiAgICAgICAgICAgIG9mZnNldENlbnRlcjogZ2F1Z2VPcHRpb25zPy5kZXRhaWxPZmZzZXRDZW50ZXIgfHwgWzAsIDBdLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogJzUwJScsXG4gICAgICAgICAgICAgICAgeTogJzUwJScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8uc2hvd01hcmtQb2ludCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1lYXN1cmVtZW50Py52YWx1ZS50b0ZpeGVkKGZyYWN0aW9uU2l6ZSkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy51bml0IHx8IG1lYXN1cmVtZW50Py51bml0IHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobWVhc3VyZW1lbnQ/LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5jOHlEYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ZhbHVlfCR7dmFsdWV9fXt1bml0fCR7dW5pdH19IFxcbiB7ZGF0ZXwke2Zvcm1hdHRlZERhdGV9fSBgO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8gKiAwLjVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uU2l6ZSA+IDVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLm1lYXN1cmVtZW50VmFsdWVGb250TWluICogMC41XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkZXInLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lmtub2JGb250Q29sb3IgfHwgJyM3NzcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy51bml0Rm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGdhdWdlT3B0aW9uc0NvbG9ycz8ua25vYkZvbnRDb2xvciB8fCAnIzk5OSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1pbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRTaXplIHx8IDEyLFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IGdhdWdlT3B0aW9uc0NvbG9ycz8uZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZ2F1Z2VPcHRpb25zQ29sb3JzPy5rbm9iRm9udENvbG9yIHx8ICcjNTU1J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAwIHx8IG1lYXN1cmVtZW50Py52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVSYW5nZUNvbG9ycygpOiBhbnkge1xuICAgIGlmICghdGhpcy5jaGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZWZhdWx0OiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LWZvcm0tY29udHJvbC1ib3JkZXItY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB5ZWxsb3c6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtd2FybmluZydcbiAgICAgICksXG4gICAgICByZWQ6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtZGFuZ2VyJ1xuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVHYXVnZU9wdGlvbnNDb2xvcnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY2hhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3BsaXRMaW5lQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtYmFja2dyb3VuZC1kZWZhdWx0J1xuICAgICAgKSxcbiAgICAgIHRpY2tDb2xvcjogZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoYXJ0Lm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICctLWM4eS1yb290LWNvbXBvbmVudC1iYWNrZ3JvdW5kLWRlZmF1bHQnXG4gICAgICApLFxuICAgICAgYXhpc0xhYmVsQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBwb2ludGVyQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iRm9udENvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJhY2tncm91bmQtZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBtZWFzdXJlbWVudFZhbHVlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB1bml0Q29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBkYXRlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtdGV4dC1tdXRlZCdcbiAgICAgICksXG4gICAgICBwcm9ncmVzc0JhckNvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJyYW5kLXByaW1hcnknXG4gICAgICApLFxuICAgICAgZm9udEZhbWlseTogZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JBcnJheShcbiAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZTogS1BJRGV0YWlscyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9XG4gICk6IFtudW1iZXIsIHN0cmluZ11bXSB7XG4gICAgY29uc3QgbWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1pbiA/PyAwO1xuICAgIGNvbnN0IG1heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5tYXggPz8gMTAwO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluO1xuXG4gICAgY29uc3QgeWVsbG93TWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnllbGxvd1JhbmdlTWluO1xuICAgIGNvbnN0IHllbGxvd01heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy55ZWxsb3dSYW5nZU1heDtcbiAgICBjb25zdCByZWRNaW4gPSBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ucmVkUmFuZ2VNaW47XG4gICAgY29uc3QgcmVkTWF4ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnJlZFJhbmdlTWF4O1xuXG4gICAgdHlwZSBSYW5nZSA9IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IGNvbG9yOiBzdHJpbmcgfTtcblxuICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gRmlyc3QgYWRkIHJlZCByYW5nZVxuICAgIGlmIChyZWRNaW4gIT0gbnVsbCAmJiByZWRNYXggIT0gbnVsbCAmJiByZWRNaW4gPCByZWRNYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKHsgc3RhcnQ6IHJlZE1pbiwgZW5kOiByZWRNYXgsIGNvbG9yOiByYW5nZUNvbG9ycy5yZWQgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiBhZGQgeWVsbG93LCBidXQgY2xpcCBvdXQgYW55IG92ZXJsYXAgd2l0aCByZWRcbiAgICBpZiAoeWVsbG93TWluICE9IG51bGwgJiYgeWVsbG93TWF4ICE9IG51bGwgJiYgeWVsbG93TWluIDwgeWVsbG93TWF4KSB7XG4gICAgICBjb25zdCByZWRSYW5nZSA9IHJhbmdlcy5maW5kKHIgPT4gci5jb2xvciA9PT0gcmFuZ2VDb2xvcnMucmVkKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhcmVkUmFuZ2UgfHxcbiAgICAgICAgeWVsbG93TWF4IDw9IHJlZFJhbmdlLnN0YXJ0IHx8IC8vIHllbGxvdyBlbmRzIGJlZm9yZSByZWRcbiAgICAgICAgeWVsbG93TWluID49IHJlZFJhbmdlLmVuZCAvLyB5ZWxsb3cgc3RhcnRzIGFmdGVyIHJlZFxuICAgICAgKSB7XG4gICAgICAgIC8vIG5vIG92ZXJsYXBcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBzdGFydDogeWVsbG93TWluLCBlbmQ6IHllbGxvd01heCwgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvdyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcnRpYWwgb3ZlcmxhcCDigJMgc3BsaXQgeWVsbG93IGludG8gbm9uLW92ZXJsYXBwaW5nIHBhcnRzXG4gICAgICAgIGlmICh5ZWxsb3dNaW4gPCByZWRSYW5nZS5zdGFydCkge1xuICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0OiB5ZWxsb3dNaW4sXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWluKHllbGxvd01heCwgcmVkUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvd1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ZWxsb3dNYXggPiByZWRSYW5nZS5lbmQpIHtcbiAgICAgICAgICByYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogTWF0aC5tYXgoeWVsbG93TWluLCByZWRSYW5nZS5lbmQpLFxuICAgICAgICAgICAgZW5kOiB5ZWxsb3dNYXgsXG4gICAgICAgICAgICBjb2xvcjogcmFuZ2VDb2xvcnMueWVsbG93XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHN0YXJ0IHBvc2l0aW9uXG4gICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcblxuICAgIC8vIEJ1aWxkIHNlZ21lbnRzXG4gICAgY29uc3Qgc2VnbWVudHM6IFtudW1iZXIsIHN0cmluZ11bXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gbWluO1xuXG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQsIGNvbG9yIH0gb2YgcmFuZ2VzKSB7XG4gICAgICBpZiAoc3RhcnQgPiBjdXJyZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgZmlsbCBiZWZvcmUgdGhpcyByYW5nZVxuICAgICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIHJhbmdlQ29sb3JzLmRlZmF1bHRdKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0YXJ0IGNvbG9yXG4gICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG4gICAgICAvLyBFbmQgY29sb3JcbiAgICAgIHNlZ21lbnRzLnB1c2goWyhlbmQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRoLm1heChjdXJyZW50LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIEZpbGwgcmVtYWluaW5nIHdpdGggZGVmYXVsdFxuICAgIGlmIChjdXJyZW50IDwgbWF4KSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsoY3VycmVudCAtIG1pbikgLyByYW5nZSwgcmFuZ2VDb2xvcnMuZGVmYXVsdF0pO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDAgfHwgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV1bMF0gPCAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsxLCByYW5nZUNvbG9ycy5kZWZhdWx0XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFJlbGF0aXZlKHJhdGlvOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gdGhpcy5jb250YWluZXJTaXplICogcmF0aW87XG4gICAgaWYgKGNsYW1wZWRWYWx1ZSA8IG1pbikge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9IGVsc2UgaWYgKGNsYW1wZWRWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIG1heDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNsYW1wZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==