UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

150 lines 22.8 kB
import { Injectable } from '@angular/core'; import { AppStateService } from '@c8y/ngx-components'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; export class YAxisService { constructor(appStateService) { this.appStateService = appStateService; this.Y_AXIS_OFFSET = 48; this.intlNumberFormatCompliantLocale = this.appStateService.state.lang.replace('_', '-'); } getYAxis(datapointsWithValues, YAxisOptions) { const YAxisPlacement = this.getYAxisPlacement(datapointsWithValues); const matchingDpSet = new Set(); const firstOccurrence = new Set(); return datapointsWithValues.map((dp, index) => { const isDefined = (value) => value !== null && value !== undefined; const isMatchingDp = (dp1, dp2) => dp1.min === dp2.min && dp1.max === dp2.max && isDefined(dp1.min) && isDefined(dp1.max) && isDefined(dp2.min) && isDefined(dp2.max); const matchingDpRange = datapointsWithValues.some((dp2, index2) => isMatchingDp(dp, dp2) && index2 < index); const anyMatchingDp = datapointsWithValues.some((dp2, index2) => isMatchingDp(dp, dp2) && index2 !== index); if (anyMatchingDp && !matchingDpRange && YAxisOptions.mergeMatchingDatapoints && !firstOccurrence.has(dp)) { firstOccurrence.add(dp); } if (firstOccurrence.has(dp)) { datapointsWithValues.forEach(dp2 => { if (isMatchingDp(dp, dp2)) { matchingDpSet.add(dp2); } }); } return { name: YAxisOptions.showLabelAndUnit ? YAxisOptions.mergeMatchingDatapoints ? firstOccurrence.has(dp) ? Array.from(matchingDpSet) .map(dp => `{${dp.__target?.id}|${dp.unit}}`) .join(' /') : matchingDpRange ? '' : `${dp.label} [${dp.unit}]` : `${dp.label} [${dp.unit}]` : '', nameLocation: 'middle', nameGap: 20, nameTextStyle: { // add rich text to support multiple colors for different dp units rich: { ...Array.from(matchingDpSet).reduce((acc, dp) => { const accKey = `${dp.__target?.id}`; acc[accKey] = { color: dp.color }; return acc; }, {}) } }, type: 'value', animation: true, axisLine: { show: matchingDpRange && YAxisOptions.mergeMatchingDatapoints ? false : true, lineStyle: { color: firstOccurrence.has(dp) ? 'black' : dp.color }, onZero: false }, axisLabel: { fontSize: 10, show: !matchingDpRange || !YAxisOptions.mergeMatchingDatapoints, formatter: val => { if (dp.min != undefined && dp.max != undefined) { const range = dp.max - dp.min; const decimalPlaces = this.getDecimalPlaces(range); return val.toFixed(decimalPlaces); } return new Intl.NumberFormat(this.intlNumberFormatCompliantLocale, { notation: 'compact', compactDisplay: 'short' }).format(val); } }, splitLine: { show: YAxisOptions.showSplitLines && !matchingDpRange, lineStyle: { color: dp.color, opacity: 0.4, type: 'dashed' } }, position: YAxisPlacement.get(dp)?.position, offset: YAxisPlacement.get(dp)?.offset, axisTick: { show: !matchingDpRange || !YAxisOptions.mergeMatchingDatapoints }, axisPointer: { show: false, label: { show: false } }, ...(dp.min && { min: dp.min }), ...(dp.max && { max: dp.max }) }; }); } getDecimalPlaces(num) { const numStr = num.toString(); const decimalIndex = numStr.indexOf('.'); if (decimalIndex === -1) { return 0; } return numStr.length - decimalIndex - 1; } getYAxisPlacement(datapointsWithValues) { const YAxisPositions = new Map(); datapointsWithValues.forEach(dp => { const position = this.getYAxisPosition(dp, datapointsWithValues); YAxisPositions.set(dp, { position }); }); const dpLeft = datapointsWithValues.filter(dp => YAxisPositions.get(dp).position === 'left'); const dpRight = datapointsWithValues.filter(dp => YAxisPositions.get(dp).position === 'right'); const YAxisPlacement = new Map(); YAxisPositions.forEach(({ position }, key) => { const offset = (position === 'left' ? dpLeft : dpRight).indexOf(key) * this.Y_AXIS_OFFSET; YAxisPlacement.set(key, { position: position, offset }); }); return YAxisPlacement; } getYAxisPosition(datapoint, datapointsWithValues) { if (datapoint.yAxisType) { return datapoint.yAxisType; } const currentIndex = datapointsWithValues.indexOf(datapoint); const otherIndexLeft = datapointsWithValues.findIndex(dp => dp !== datapoint && (!dp.yAxisType || dp.yAxisType === 'left')); if (otherIndexLeft > -1 && otherIndexLeft < currentIndex) { return 'right'; } else { return 'left'; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YAxisService, deps: [{ token: i1.AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YAxisService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YAxisService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.AppStateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieS1heGlzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9lY2hhcnQvc2VydmljZXMveS1heGlzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUd0RCxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFIcEQsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFJakIsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFRCxRQUFRLENBQUMsb0JBQW9DLEVBQUUsWUFBMEI7UUFDdkUsTUFBTSxjQUFjLEdBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBQzlDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO1FBRWhELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzVDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBeUIsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDO1lBQ3ZGLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBaUIsRUFBRSxHQUFpQixFQUFFLEVBQUUsQ0FDNUQsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRztnQkFDbkIsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRztnQkFD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QUUsQ0FBQyxFQUFFLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQ3JFLENBQUM7UUFDRixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUMsSUFBSSxjQUFjLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDekQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzsrR0F6S1UsWUFBWTttSEFBWixZQUFZOzs0RkFBWixZQUFZO2tCQUR4QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YXBvaW50QXhpc1R5cGUsIERwV2l0aFZhbHVlcywgWUF4aXNPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB0eXBlIHsgWUFYaXNPcHRpb24gfSBmcm9tICdlY2hhcnRzL3R5cGVzL3NyYy9jb29yZC9jYXJ0ZXNpYW4vQXhpc01vZGVsJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWUF4aXNTZXJ2aWNlIHtcbiAgWV9BWElTX09GRlNFVCA9IDQ4O1xuICBwcml2YXRlIGludGxOdW1iZXJGb3JtYXRDb21wbGlhbnRMb2NhbGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5pbnRsTnVtYmVyRm9ybWF0Q29tcGxpYW50TG9jYWxlID0gdGhpcy5hcHBTdGF0ZVNlcnZpY2Uuc3RhdGUubGFuZy5yZXBsYWNlKCdfJywgJy0nKTtcbiAgfVxuXG4gIGdldFlBeGlzKGRhdGFwb2ludHNXaXRoVmFsdWVzOiBEcFdpdGhWYWx1ZXNbXSwgWUF4aXNPcHRpb25zOiBZQXhpc09wdGlvbnMpOiBZQVhpc09wdGlvbltdIHtcbiAgICBjb25zdCBZQXhpc1BsYWNlbWVudDogTWFwPERwV2l0aFZhbHVlcywgeyBwb3NpdGlvbjogRGF0YXBvaW50QXhpc1R5cGU7IG9mZnNldDogbnVtYmVyIH0+ID1cbiAgICAgIHRoaXMuZ2V0WUF4aXNQbGFjZW1lbnQoZGF0YXBvaW50c1dpdGhWYWx1ZXMpO1xuXG4gICAgY29uc3QgbWF0Y2hpbmdEcFNldCA9IG5ldyBTZXQ8RHBXaXRoVmFsdWVzPigpO1xuICAgIGNvbnN0IGZpcnN0T2NjdXJyZW5jZSA9IG5ldyBTZXQ8RHBXaXRoVmFsdWVzPigpO1xuXG4gICAgcmV0dXJuIGRhdGFwb2ludHNXaXRoVmFsdWVzLm1hcCgoZHAsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0RlZmluZWQgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlzTWF0Y2hpbmdEcCA9IChkcDE6IERwV2l0aFZhbHVlcywgZHAyOiBEcFdpdGhWYWx1ZXMpID0+XG4gICAgICAgIGRwMS5taW4gPT09IGRwMi5taW4gJiZcbiAgICAgICAgZHAxLm1heCA9PT0gZHAyLm1heCAmJlxuICAgICAgICBpc0RlZmluZWQoZHAxLm1pbikgJiZcbiAgICAgICAgaXNEZWZpbmVkKGRwMS5tYXgpICYmXG4gICAgICAgIGlzRGVmaW5lZChkcDIubWluKSAmJlxuICAgICAgICBpc0RlZmluZWQoZHAyLm1heCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRHBSYW5nZSA9IGRhdGFwb2ludHNXaXRoVmFsdWVzLnNvbWUoXG4gICAgICAgIChkcDIsIGluZGV4MikgPT4gaXNNYXRjaGluZ0RwKGRwLCBkcDIpICYmIGluZGV4MiA8IGluZGV4XG4gICAgICApO1xuXG4gICAgICBjb25zdCBhbnlNYXRjaGluZ0RwID0gZGF0YXBvaW50c1dpdGhWYWx1ZXMuc29tZShcbiAgICAgICAgKGRwMiwgaW5kZXgyKSA9PiBpc01hdGNoaW5nRHAoZHAsIGRwMikgJiYgaW5kZXgyICE9PSBpbmRleFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBhbnlNYXRjaGluZ0RwICYmXG4gICAgICAgICFtYXRjaGluZ0RwUmFuZ2UgJiZcbiAgICAgICAgWUF4aXNPcHRpb25zLm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzICYmXG4gICAgICAgICFmaXJzdE9jY3VycmVuY2UuaGFzKGRwKVxuICAgICAgKSB7XG4gICAgICAgIGZpcnN0T2NjdXJyZW5jZS5hZGQoZHApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RPY2N1cnJlbmNlLmhhcyhkcCkpIHtcbiAgICAgICAgZGF0YXBvaW50c1dpdGhWYWx1ZXMuZm9yRWFjaChkcDIgPT4ge1xuICAgICAgICAgIGlmIChpc01hdGNoaW5nRHAoZHAsIGRwMikpIHtcbiAgICAgICAgICAgIG1hdGNoaW5nRHBTZXQuYWRkKGRwMik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogWUF4aXNPcHRpb25zLnNob3dMYWJlbEFuZFVuaXRcbiAgICAgICAgICA/IFlBeGlzT3B0aW9ucy5tZXJnZU1hdGNoaW5nRGF0YXBvaW50c1xuICAgICAgICAgICAgPyBmaXJzdE9jY3VycmVuY2UuaGFzKGRwKVxuICAgICAgICAgICAgICA/IEFycmF5LmZyb20obWF0Y2hpbmdEcFNldClcbiAgICAgICAgICAgICAgICAgIC5tYXAoZHAgPT4gYHske2RwLl9fdGFyZ2V0Py5pZH18JHtkcC51bml0fX1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJyAvJylcbiAgICAgICAgICAgICAgOiBtYXRjaGluZ0RwUmFuZ2VcbiAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgOiBgJHtkcC5sYWJlbH0gWyR7ZHAudW5pdH1dYFxuICAgICAgICAgICAgOiBgJHtkcC5sYWJlbH0gWyR7ZHAudW5pdH1dYFxuICAgICAgICAgIDogJycsXG4gICAgICAgIG5hbWVMb2NhdGlvbjogJ21pZGRsZScsXG4gICAgICAgIG5hbWVHYXA6IDIwLFxuICAgICAgICBuYW1lVGV4dFN0eWxlOiB7XG4gICAgICAgICAgLy8gYWRkIHJpY2ggdGV4dCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbG9ycyBmb3IgZGlmZmVyZW50IGRwIHVuaXRzXG4gICAgICAgICAgcmljaDoge1xuICAgICAgICAgICAgLi4uQXJyYXkuZnJvbShtYXRjaGluZ0RwU2V0KS5yZWR1Y2UoKGFjYywgZHApID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYWNjS2V5ID0gYCR7ZHAuX190YXJnZXQ/LmlkfWA7XG4gICAgICAgICAgICAgIGFjY1thY2NLZXldID0ge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBkcC5jb2xvclxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICBhbmltYXRpb246IHRydWUsXG4gICAgICAgIGF4aXNMaW5lOiB7XG4gICAgICAgICAgc2hvdzogbWF0Y2hpbmdEcFJhbmdlICYmIFlBeGlzT3B0aW9ucy5tZXJnZU1hdGNoaW5nRGF0YXBvaW50cyA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgICBsaW5lU3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiBmaXJzdE9jY3VycmVuY2UuaGFzKGRwKSA/ICdibGFjaycgOiBkcC5jb2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25aZXJvOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBheGlzTGFiZWw6IHtcbiAgICAgICAgICBmb250U2l6ZTogMTAsXG4gICAgICAgICAgc2hvdzogIW1hdGNoaW5nRHBSYW5nZSB8fCAhWUF4aXNPcHRpb25zLm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzLFxuICAgICAgICAgIGZvcm1hdHRlcjogdmFsID0+IHtcbiAgICAgICAgICAgIGlmIChkcC5taW4gIT0gdW5kZWZpbmVkICYmIGRwLm1heCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkcC5tYXggLSBkcC5taW47XG4gICAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSB0aGlzLmdldERlY2ltYWxQbGFjZXMocmFuZ2UpO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsLnRvRml4ZWQoZGVjaW1hbFBsYWNlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5pbnRsTnVtYmVyRm9ybWF0Q29tcGxpYW50TG9jYWxlLCB7XG4gICAgICAgICAgICAgIG5vdGF0aW9uOiAnY29tcGFjdCcsXG4gICAgICAgICAgICAgIGNvbXBhY3REaXNwbGF5OiAnc2hvcnQnXG4gICAgICAgICAgICB9KS5mb3JtYXQodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNwbGl0TGluZToge1xuICAgICAgICAgIHNob3c6IFlBeGlzT3B0aW9ucy5zaG93U3BsaXRMaW5lcyAmJiAhbWF0Y2hpbmdEcFJhbmdlLFxuICAgICAgICAgIGxpbmVTdHlsZTogeyBjb2xvcjogZHAuY29sb3IsIG9wYWNpdHk6IDAuNCwgdHlwZTogJ2Rhc2hlZCcgfVxuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjogWUF4aXNQbGFjZW1lbnQuZ2V0KGRwKT8ucG9zaXRpb24sXG4gICAgICAgIG9mZnNldDogWUF4aXNQbGFjZW1lbnQuZ2V0KGRwKT8ub2Zmc2V0LFxuICAgICAgICBheGlzVGljazoge1xuICAgICAgICAgIHNob3c6ICFtYXRjaGluZ0RwUmFuZ2UgfHwgIVlBeGlzT3B0aW9ucy5tZXJnZU1hdGNoaW5nRGF0YXBvaW50c1xuICAgICAgICB9LFxuICAgICAgICBheGlzUG9pbnRlcjoge1xuICAgICAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICBzaG93OiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGRwLm1pbiAmJiB7IG1pbjogZHAubWluIH0pLFxuICAgICAgICAuLi4oZHAubWF4ICYmIHsgbWF4OiBkcC5tYXggfSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlY2ltYWxQbGFjZXMobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG51bVN0ciA9IG51bS50b1N0cmluZygpO1xuICAgIGNvbnN0IGRlY2ltYWxJbmRleCA9IG51bVN0ci5pbmRleE9mKCcuJyk7XG4gICAgaWYgKGRlY2ltYWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gbnVtU3RyLmxlbmd0aCAtIGRlY2ltYWxJbmRleCAtIDE7XG4gIH1cblxuICBwcml2YXRlIGdldFlBeGlzUGxhY2VtZW50KFxuICAgIGRhdGFwb2ludHNXaXRoVmFsdWVzOiBEcFdpdGhWYWx1ZXNbXVxuICApOiBNYXA8RHBXaXRoVmFsdWVzLCB7IHBvc2l0aW9uOiBEYXRhcG9pbnRBeGlzVHlwZTsgb2Zmc2V0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IFlBeGlzUG9zaXRpb25zID0gbmV3IE1hcDxEcFdpdGhWYWx1ZXMsIHsgcG9zaXRpb246IERhdGFwb2ludEF4aXNUeXBlIH0+KCk7XG5cbiAgICBkYXRhcG9pbnRzV2l0aFZhbHVlcy5mb3JFYWNoKGRwID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRZQXhpc1Bvc2l0aW9uKGRwLCBkYXRhcG9pbnRzV2l0aFZhbHVlcyk7XG4gICAgICBZQXhpc1Bvc2l0aW9ucy5zZXQoZHAsIHsgcG9zaXRpb24gfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkcExlZnQgPSBkYXRhcG9pbnRzV2l0aFZhbHVlcy5maWx0ZXIoZHAgPT4gWUF4aXNQb3NpdGlvbnMuZ2V0KGRwKS5wb3NpdGlvbiA9PT0gJ2xlZnQnKTtcbiAgICBjb25zdCBkcFJpZ2h0ID0gZGF0YXBvaW50c1dpdGhWYWx1ZXMuZmlsdGVyKGRwID0+IFlBeGlzUG9zaXRpb25zLmdldChkcCkucG9zaXRpb24gPT09ICdyaWdodCcpO1xuXG4gICAgY29uc3QgWUF4aXNQbGFjZW1lbnQgPSBuZXcgTWFwPERwV2l0aFZhbHVlcywgeyBwb3NpdGlvbjogRGF0YXBvaW50QXhpc1R5cGU7IG9mZnNldDogbnVtYmVyIH0+KCk7XG4gICAgWUF4aXNQb3NpdGlvbnMuZm9yRWFjaCgoeyBwb3NpdGlvbiB9LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IChwb3NpdGlvbiA9PT0gJ2xlZnQnID8gZHBMZWZ0IDogZHBSaWdodCkuaW5kZXhPZihrZXkpICogdGhpcy5ZX0FYSVNfT0ZGU0VUO1xuICAgICAgWUF4aXNQbGFjZW1lbnQuc2V0KGtleSwgeyBwb3NpdGlvbjogcG9zaXRpb24sIG9mZnNldCB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBZQXhpc1BsYWNlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WUF4aXNQb3NpdGlvbihcbiAgICBkYXRhcG9pbnQ6IERhdGFwb2ludEF4aXNUeXBlLFxuICAgIGRhdGFwb2ludHNXaXRoVmFsdWVzOiBEcFdpdGhWYWx1ZXNbXVxuICApOiBEYXRhcG9pbnRBeGlzVHlwZSB7XG4gICAgaWYgKGRhdGFwb2ludC55QXhpc1R5cGUpIHtcbiAgICAgIHJldHVybiBkYXRhcG9pbnQueUF4aXNUeXBlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBkYXRhcG9pbnRzV2l0aFZhbHVlcy5pbmRleE9mKGRhdGFwb2ludCk7XG4gICAgY29uc3Qgb3RoZXJJbmRleExlZnQgPSBkYXRhcG9pbnRzV2l0aFZhbHVlcy5maW5kSW5kZXgoXG4gICAgICBkcCA9PiBkcCAhPT0gZGF0YXBvaW50ICYmICghZHAueUF4aXNUeXBlIHx8IGRwLnlBeGlzVHlwZSA9PT0gJ2xlZnQnKVxuICAgICk7XG4gICAgaWYgKG90aGVySW5kZXhMZWZ0ID4gLTEgJiYgb3RoZXJJbmRleExlZnQgPCBjdXJyZW50SW5kZXgpIHtcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgfVxufVxuIl19