UNPKG

ngx-beautiful-charts

Version:
315 lines 29 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ElementRef } from '@angular/core'; import { colorSchemes } from '../../constants/color-schemes'; import { MultiLineGraphService } from './multi-line-graph.service'; import { GlobalParametersService } from '../../global/global-parameters.service'; export class MultiLineGraphComponent { /** * @param {?} multiLineGraphService * @param {?} globalParametersService * @param {?} currentElement */ constructor(multiLineGraphService, globalParametersService, currentElement) { this.multiLineGraphService = multiLineGraphService; this.globalParametersService = globalParametersService; this.currentElement = currentElement; this.colorScheme = 'colorful'; this.minX = null; this.minY = null; this.maxX = null; this.maxY = null; this.customColorScheme = []; this.xPadding = 60; this.yPadding = this.xPadding / 2; this.transformedData = []; } /** * @return {?} */ setDimensions() { if (this.width && !this.height) this.height = this.width / 3; else if (!this.width && this.height) this.width = this.height * 3; else if (!this.width && !this.height) { /** @type {?} */ const host = this.currentElement.nativeElement; if (host.parentNode != null) { /** @type {?} */ const dims = host.parentNode.getBoundingClientRect(); this.width = dims.width; this.height = dims.width / 3; } } // console.log('---set dimensions---'); // console.log('width: ' + this.width); // console.log('height: ' + this.height); // console.log('--------------------'); } /** * @return {?} */ setMinandMax() { if (this.minX == null) this.minX = Math.min(...this.data.map((/** * @param {?} line * @return {?} */ line => Math.min(...line.data.map((/** * @param {?} oneData * @return {?} */ oneData => oneData.x)))))); if (this.maxX == null) this.maxX = Math.max(...this.data.map((/** * @param {?} line * @return {?} */ line => Math.max(...line.data.map((/** * @param {?} oneData * @return {?} */ oneData => oneData.x)))))); if (this.minY == null) this.minY = Math.min(...this.data.map((/** * @param {?} line * @return {?} */ line => Math.min(...line.data.map((/** * @param {?} oneData * @return {?} */ oneData => oneData.y)))))); if (this.maxY == null) this.maxY = Math.max(...this.data.map((/** * @param {?} line * @return {?} */ line => Math.max(...line.data.map((/** * @param {?} oneData * @return {?} */ oneData => oneData.y)))))); } /** * @return {?} */ transformData() { this.transformedData = []; for (const singleLine of this.data) { /** @type {?} */ let lineData; lineData = []; for (const point of singleLine.data) { /** @type {?} */ const x = this.multiLineGraphService.transformX(point.x) + this.xPadding; /** @type {?} */ const y = this.multiLineGraphService.transformY(this.multiLineGraphService.maxY - point.y) + this.yPadding; /** @type {?} */ const toolTipX = x; /** @type {?} */ const toolTipY = y - 30; /** @type {?} */ const toolTip = point.info && (point.info !== '') ? 'block' : 'none'; lineData.push({ x, y, info: point.info, originalX: point.x, originalY: point.y, toolTipTranslate: 'translate(' + toolTipX + 'px, ' + toolTipY + 'px)', toolTip }); } this.transformedData.push({ name: singleLine.name, color: singleLine.color, data: lineData }); } } /** * @return {?} */ setLinePath() { // console.log(this.printAllInput()); this.graphLinePaths = []; for (const singleLine of this.transformedData) { /** @type {?} */ let graphLinePath = 'M'; /** @type {?} */ let singleLineData; singleLineData = singleLine.data; singleLineData.sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => a.x < b.x ? -1 : a.x > b.x ? 1 : 0)); for (const point of singleLineData) { // console.log(point); /** @type {?} */ const coordX = point.x; /** @type {?} */ const coordY = point.y; graphLinePath += ' ' + coordX + ' ' + coordY; // console.log(graphLinePath); } this.graphLinePaths.push({ color: singleLine.color, path: graphLinePath }); } } /** * @return {?} */ setColors() { /** @type {?} */ let cnt = 0; for (const line of this.data) { if (!line.color) { if (this.customColorScheme.length > 0) { line.color = this.customColorScheme[cnt % this.customColorScheme.length]; } else { line.color = colorSchemes[this.colorScheme][cnt % 10]; } } cnt++; } } /** * @return {?} */ ngOnInit() { this.componentID = this.globalParametersService.addNewComponent(); console.log('init..'); this.setDimensions(); this.setMinandMax(); this.setColors(); this.dataCopy = JSON.parse(JSON.stringify(this.data)); this.multiLineGraphService.setValues({ componentID: this.componentID, width: this.width, height: this.height, minX: this.minX, maxX: this.maxX, minY: this.minY, maxY: this.maxY, dataLength: this.data.length, xPadding: this.xPadding, yPadding: this.yPadding }); this.transformData(); this.setLinePath(); } /** * @return {?} */ ngOnChanges() { console.log('changes..'); this.setMinandMax(); this.setColors(); this.dataCopy = JSON.parse(JSON.stringify(this.data)); this.multiLineGraphService.setValues({ componentID: this.componentID, width: this.width, height: this.height, minX: this.minX, maxX: this.maxX, minY: this.minY, maxY: this.maxY, dataLength: this.data.length, xPadding: this.xPadding, yPadding: this.yPadding }); this.transformData(); this.setLinePath(); } } MultiLineGraphComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-multi-line-graph', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g ngx-mlg-chart-base [data]=\"data\"\n [gridPrecisionX]=\"gridPrecisionX\" [gridPrecisionY]=\"gridPrecisionY\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n \n\n <!-- <g *ngFor=\"let line of data\">\n <g ngx-line-graph chartBase=\"false\" [data]=\"line.data\" [minX]=\"0\" [maxX]=\"100\" \n [minY]=\"0\" [maxY]=\"50\" \n [gridPrecisionX]=\"10\" \n [gridPrecisionY]=\"10\"\n xAxisTitle=\"Time\"\n yAxisTitle=\"Distance\"\n [data]=\"data\"\n color=\"#ff4444\"\n\n [width]=\"beautifulChartsService.rectWidth\" [height]=\"beautifulChartsService.rectHeight\" [color]=\"line.color\" />\n </g> -->\n\n\n <path *ngFor=\"let singleLine of graphLinePaths\" class=\"line-path\"\n [attr.d]=\"singleLine.path\" fill=\"none\" [attr.stroke]=\"singleLine.color\"\n />\n \n \n <g *ngFor=\"let line of transformedData;\">\n <g id=\"component\" *ngFor=\"let point of line.data\">\n <circle class=\"point\" [attr.cx]=\"point.x\" [attr.cy]=\"point.y\" r=\"4\" [attr.fill]=\"line.color\">\n </circle>\n \n <g class=\"tooltip\" [ngStyle]=\"{'transform': point.toolTipTranslate, 'display': point.toolTip}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"100\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ point.info }}</text>\n </g>\n </g>\n \n </g>\n\n</svg>", providers: [MultiLineGraphService], styles: [".line-path{opacity:.6;stroke-width:3;z-index:999999}.line-path:hover{opacity:1}.point{stroke:#fff;stroke-width:2px}.point:hover{stroke-width:.5}#component .tooltip{visibility:hidden}#component:hover .tooltip{visibility:visible;position:absolute}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif}.tooltip rect{fill:#222;stroke:#111}"] }] } ]; /** @nocollapse */ MultiLineGraphComponent.ctorParameters = () => [ { type: MultiLineGraphService }, { type: GlobalParametersService }, { type: ElementRef } ]; MultiLineGraphComponent.propDecorators = { data: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], colorScheme: [{ type: Input }], minX: [{ type: Input }], minY: [{ type: Input }], maxX: [{ type: Input }], maxY: [{ type: Input }], gridPrecisionX: [{ type: Input }], gridPrecisionY: [{ type: Input }], xAxisTitle: [{ type: Input }], yAxisTitle: [{ type: Input }], customColorScheme: [{ type: Input }] }; if (false) { /** @type {?} */ MultiLineGraphComponent.prototype.data; /** @type {?} */ MultiLineGraphComponent.prototype.width; /** @type {?} */ MultiLineGraphComponent.prototype.height; /** @type {?} */ MultiLineGraphComponent.prototype.colorScheme; /** @type {?} */ MultiLineGraphComponent.prototype.minX; /** @type {?} */ MultiLineGraphComponent.prototype.minY; /** @type {?} */ MultiLineGraphComponent.prototype.maxX; /** @type {?} */ MultiLineGraphComponent.prototype.maxY; /** @type {?} */ MultiLineGraphComponent.prototype.gridPrecisionX; /** @type {?} */ MultiLineGraphComponent.prototype.gridPrecisionY; /** @type {?} */ MultiLineGraphComponent.prototype.xAxisTitle; /** @type {?} */ MultiLineGraphComponent.prototype.yAxisTitle; /** @type {?} */ MultiLineGraphComponent.prototype.customColorScheme; /** @type {?} */ MultiLineGraphComponent.prototype.componentID; /** @type {?} */ MultiLineGraphComponent.prototype.xPadding; /** @type {?} */ MultiLineGraphComponent.prototype.yPadding; /** @type {?} */ MultiLineGraphComponent.prototype.dataCopy; /** @type {?} */ MultiLineGraphComponent.prototype.graphLinePaths; /** @type {?} */ MultiLineGraphComponent.prototype.transformedData; /** @type {?} */ MultiLineGraphComponent.prototype.multiLineGraphService; /** * @type {?} * @private */ MultiLineGraphComponent.prototype.globalParametersService; /** * @type {?} * @private */ MultiLineGraphComponent.prototype.currentElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGluZS1ncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9tdWx0aS1saW5lLWdyYXBoL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBU2pGLE1BQU0sT0FBTyx1QkFBdUI7Ozs7OztJQXlHbEMsWUFBbUIscUJBQTRDLEVBQzNDLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzNDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQVk7UUF0R3JDLGdCQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ3pCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDcEIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFLcEIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFHN0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7SUF1RnJCLENBQUM7Ozs7SUFyRkQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FB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QTZCOztJQUM3Qix1Q0FBNkI7O0lBQzdCLGlEQUFnQzs7SUFDaEMsaURBQWdDOztJQUNoQyw2Q0FBNEI7O0lBQzVCLDZDQUE0Qjs7SUFDNUIsb0RBQTBDOztJQUUxQyw4Q0FBb0I7O0lBQ3BCLDJDQUFjOztJQUNkLDJDQUE2Qjs7SUFDN0IsMkNBQVM7O0lBQ1QsaURBQWU7O0lBQ2Ysa0RBQXFCOztJQW9GVCx3REFBbUQ7Ozs7O0lBQ25ELDBEQUF3RDs7Ozs7SUFDeEQsaURBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IE11bHRpTGluZUdyYXBoU2VydmljZSB9IGZyb20gJy4vbXVsdGktbGluZS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1tdWx0aS1saW5lLWdyYXBoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1saW5lLWdyYXBoLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW011bHRpTGluZUdyYXBoU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlMaW5lR3JhcGhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZGF0YTogW3tuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcsIGRhdGE6IFt7eDogbnVtYmVyLCB5OiBudW1iZXIsIGluZm86IGFueSB9XX1dO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBoZWlnaHQ6IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBtaW5YOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtaW5ZOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtYXhYOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtYXhZOiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBncmlkUHJlY2lzaW9uWDogbnVtYmVyO1xuICBASW5wdXQoKSBncmlkUHJlY2lzaW9uWTogbnVtYmVyO1xuICBASW5wdXQoKSB4QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHlBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgY3VzdG9tQ29sb3JTY2hlbWU6IHN0cmluZ1tdID0gW107XG5cbiAgY29tcG9uZW50SUQ6IG51bWJlcjtcbiAgeFBhZGRpbmcgPSA2MDtcbiAgeVBhZGRpbmcgPSB0aGlzLnhQYWRkaW5nIC8gMjtcbiAgZGF0YUNvcHk7XG4gIGdyYXBoTGluZVBhdGhzO1xuICB0cmFuc2Zvcm1lZERhdGEgPSBbXTtcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC8gMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ICogMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiAhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZGltcy53aWR0aCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBzZXRNaW5hbmRNYXgoKSB7XG4gICAgaWYgKHRoaXMubWluWCA9PSBudWxsKSB0aGlzLm1pblggPSBNYXRoLm1pbiguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5taW4oLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueCkpKSk7XG4gICAgaWYgKHRoaXMubWF4WCA9PSBudWxsKSB0aGlzLm1heFggPSBNYXRoLm1heCguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5tYXgoLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueCkpKSk7XG4gICAgaWYgKHRoaXMubWluWSA9PSBudWxsKSB0aGlzLm1pblkgPSBNYXRoLm1pbiguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5taW4oLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueSkpKSk7XG4gICAgaWYgKHRoaXMubWF4WSA9PSBudWxsKSB0aGlzLm1heFkgPSBNYXRoLm1heCguLi50aGlzLmRhdGEubWFwKGxpbmUgPT4gTWF0aC5tYXgoLi4ubGluZS5kYXRhLm1hcChvbmVEYXRhID0+IG9uZURhdGEueSkpKSk7XG4gIH1cblxuXG4gIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm1lZERhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNpbmdsZUxpbmUgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBsZXQgbGluZURhdGE7XG5cbiAgICAgIGxpbmVEYXRhID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHNpbmdsZUxpbmUuZGF0YSkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5tdWx0aUxpbmVHcmFwaFNlcnZpY2UudHJhbnNmb3JtWChwb2ludC54KSArIHRoaXMueFBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLm11bHRpTGluZUdyYXBoU2VydmljZS50cmFuc2Zvcm1ZKHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLm1heFkgLSBwb2ludC55KSArIHRoaXMueVBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHRvb2xUaXBYID0geDtcbiAgICAgICAgY29uc3QgdG9vbFRpcFkgPSB5IC0gMzA7XG4gICAgICAgIGNvbnN0IHRvb2xUaXAgPSBwb2ludC5pbmZvICYmIChwb2ludC5pbmZvICE9PSAnJykgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICBsaW5lRGF0YS5wdXNoKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgICAgaW5mbzogcG9pbnQuaW5mbyxcbiAgICAgICAgICBvcmlnaW5hbFg6IHBvaW50LngsXG4gICAgICAgICAgb3JpZ2luYWxZOiBwb2ludC55LFxuICAgICAgICAgIHRvb2xUaXBUcmFuc2xhdGU6ICd0cmFuc2xhdGUoJyArIHRvb2xUaXBYICsgJ3B4LCAnICsgdG9vbFRpcFkgKyAncHgpJyxcbiAgICAgICAgICB0b29sVGlwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2Zvcm1lZERhdGEucHVzaCh7XG4gICAgICAgIG5hbWU6IHNpbmdsZUxpbmUubmFtZSxcbiAgICAgICAgY29sb3I6IHNpbmdsZUxpbmUuY29sb3IsXG4gICAgICAgIGRhdGE6IGxpbmVEYXRhXG4gICAgICB9KTtcblxuICAgIH1cbiAgfVxuXG4gIHNldExpbmVQYXRoKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucHJpbnRBbGxJbnB1dCgpKTtcbiAgICB0aGlzLmdyYXBoTGluZVBhdGhzID0gW107XG4gICAgZm9yIChjb25zdCBzaW5nbGVMaW5lIG9mIHRoaXMudHJhbnNmb3JtZWREYXRhKSB7XG4gICAgICBsZXQgZ3JhcGhMaW5lUGF0aCA9ICdNJztcbiAgICAgIGxldCBzaW5nbGVMaW5lRGF0YTtcbiAgICAgIHNpbmdsZUxpbmVEYXRhID0gc2luZ2xlTGluZS5kYXRhO1xuICAgICAgc2luZ2xlTGluZURhdGEuc29ydCgoYSwgYikgPT4gYS54IDwgYi54ID8gLTEgOiBhLnggPiBiLnggPyAxIDogMCk7XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHNpbmdsZUxpbmVEYXRhKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29vcmRYID0gcG9pbnQueDtcbiAgICAgICAgY29uc3QgY29vcmRZID0gcG9pbnQueTtcblxuICAgICAgICBncmFwaExpbmVQYXRoICs9ICcgJyArIGNvb3JkWCArICcgJyArIGNvb3JkWTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhncmFwaExpbmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ncmFwaExpbmVQYXRocy5wdXNoKHtcbiAgICAgICAgY29sb3I6IHNpbmdsZUxpbmUuY29sb3IsXG4gICAgICAgIHBhdGg6IGdyYXBoTGluZVBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIG11bHRpTGluZUdyYXBoU2VydmljZTogTXVsdGlMaW5lR3JhcGhTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlOiBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZikge1xuICB9XG5cbiAgc2V0Q29sb3JzKCkge1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghbGluZS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZS5jb2xvciA9IHRoaXMuY3VzdG9tQ29sb3JTY2hlbWVbY250ICUgdGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmUuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudElEID0gdGhpcy5nbG9iYWxQYXJhbWV0ZXJzU2VydmljZS5hZGROZXdDb21wb25lbnQoKTtcbiAgICBjb25zb2xlLmxvZygnaW5pdC4uJyk7XG4gICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zZXRNaW5hbmRNYXgoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1pblg6IHRoaXMubWluWCxcbiAgICAgIG1heFg6IHRoaXMubWF4WCxcbiAgICAgIG1pblk6IHRoaXMubWluWSxcbiAgICAgIG1heFk6IHRoaXMubWF4WSxcbiAgICAgIGRhdGFMZW5ndGg6IHRoaXMuZGF0YS5sZW5ndGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB0aGlzLnNldExpbmVQYXRoKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBjb25zb2xlLmxvZygnY2hhbmdlcy4uJyk7XG4gICAgdGhpcy5zZXRNaW5hbmRNYXgoKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1pblg6IHRoaXMubWluWCxcbiAgICAgIG1heFg6IHRoaXMubWF4WCxcbiAgICAgIG1pblk6IHRoaXMubWluWSxcbiAgICAgIG1heFk6IHRoaXMubWF4WSxcbiAgICAgIGRhdGFMZW5ndGg6IHRoaXMuZGF0YS5sZW5ndGgsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zZm9ybURhdGEoKTtcbiAgICB0aGlzLnNldExpbmVQYXRoKCk7XG4gIH1cblxufVxuIl19