ngx-beautiful-charts
Version:
A library to create charts in Angular
341 lines • 28.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input } from '@angular/core';
import { colorSchemes } from '../../constants/color-schemes';
import { GlobalParametersService } from '../../global/global-parameters.service';
import { LineGraphService } from './line-graph.service';
var LineGraphComponent = /** @class */ (function () {
function LineGraphComponent(lineGraphService, globalParametersService, currentElement) {
this.lineGraphService = lineGraphService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.data = null;
this.chartBase = true;
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;
}
/**
* @return {?}
*/
LineGraphComponent.prototype.setDimensions = /**
* @return {?}
*/
function () {
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 {?} */
var host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
var 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 {?}
*/
LineGraphComponent.prototype.setMinandMax = /**
* @return {?}
*/
function () {
if (this.minX == null)
this.minX = Math.min.apply(Math, tslib_1.__spread(this.data.map((/**
* @param {?} oneData
* @return {?}
*/
function (oneData) { return oneData.x; }))));
if (this.maxX == null)
this.maxX = Math.max.apply(Math, tslib_1.__spread(this.data.map((/**
* @param {?} oneData
* @return {?}
*/
function (oneData) { return oneData.x; }))));
if (this.minY == null)
this.minY = Math.min.apply(Math, tslib_1.__spread(this.data.map((/**
* @param {?} oneData
* @return {?}
*/
function (oneData) { return oneData.y; }))));
if (this.maxY == null)
this.maxY = Math.max.apply(Math, tslib_1.__spread(this.data.map((/**
* @param {?} oneData
* @return {?}
*/
function (oneData) { return oneData.y; }))));
};
/**
* @return {?}
*/
LineGraphComponent.prototype.transformData = /**
* @return {?}
*/
function () {
var e_1, _a;
this.transformedData = [];
try {
for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) {
var point = _c.value;
/** @type {?} */
var x = this.lineGraphService.transformX(point.x) + this.xPadding;
/** @type {?} */
var y = this.lineGraphService.transformY(this.lineGraphService.maxY - point.y) + this.yPadding;
/** @type {?} */
var toolTipX = x;
/** @type {?} */
var toolTipY = y - 30;
/** @type {?} */
var toolTip = point.info && (point.info !== '') ? 'block' : 'none';
this.transformedData.push({
x: x,
y: y,
info: point.info,
originalX: point.x,
originalY: point.y,
toolTipTranslate: 'translate(' + toolTipX + 'px, ' + toolTipY + 'px)',
toolTip: toolTip
});
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
// console.log(this.transformedData);
};
/**
* @return {?}
*/
LineGraphComponent.prototype.printAllInput = /**
* @return {?}
*/
function () {
console.log('width: ' + this.width);
console.log('height: ' + this.height);
console.log('minX: ' + this.minX);
console.log('maxX: ' + this.maxX);
console.log('minY: ' + this.minY);
console.log('maxY: ' + this.maxY);
console.log('x: ' + this.xPadding);
console.log('y: ' + this.yPadding);
console.log('data: ' + this.data);
};
/**
* @return {?}
*/
LineGraphComponent.prototype.setLinePath = /**
* @return {?}
*/
function () {
var e_2, _a;
// console.log(this.printAllInput());
this.graphLinePath = 'M';
this.data.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a.x < b.x ? -1 : a.x > b.x ? 1 : 0; }));
try {
for (var _b = tslib_1.__values(this.transformedData), _c = _b.next(); !_c.done; _c = _b.next()) {
var point = _c.value;
// console.log(point);
/** @type {?} */
var coordX = point.x;
/** @type {?} */
var coordY = point.y;
this.graphLinePath += ' ' + coordX + ' ' + coordY;
// console.log(this.graphLinePath);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
};
/**
* @return {?}
*/
LineGraphComponent.prototype.setColor = /**
* @return {?}
*/
function () {
if (!this.color) {
if (this.customColorScheme.length > 0) {
this.color = this.customColorScheme[0];
}
else {
this.color = colorSchemes[this.colorScheme][0];
}
}
};
/**
* @return {?}
*/
LineGraphComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.componentID = this.globalParametersService.addNewComponent();
// console.log('init..');
this.setDimensions();
// this.printAllInput();
this.setMinandMax();
// this.printAllInput();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.lineGraphService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
minX: this.minX,
maxX: this.maxX,
minY: this.minY,
maxY: this.maxY,
xPadding: this.xPadding,
yPadding: this.yPadding
});
this.setColor();
this.transformData();
this.setLinePath();
};
/**
* @return {?}
*/
LineGraphComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
// console.log('changes..');
// this.printAllInput();
this.setMinandMax();
// this.printAllInput();
this.dataCopy = JSON.parse(JSON.stringify(this.data));
this.lineGraphService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
minX: this.minX,
maxX: this.maxX,
minY: this.minY,
maxY: this.maxY,
xPadding: this.xPadding,
yPadding: this.yPadding
});
this.setColor();
this.transformData();
this.setLinePath();
};
LineGraphComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-line-graph',
template: "<svg [attr.width]=\"lineGraphService.width\" [attr.height]=\"lineGraphService.height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-lg-chart-base *ngIf=\"chartBase\"\n [gridPrecisionX]=\"gridPrecisionX\" [gridPrecisionY]=\"gridPrecisionY\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n \n <path class=\"line-path\"\n [attr.d]=\"graphLinePath\" fill=\"none\" [attr.stroke]=\"color\"\n />\n\n <g id=\"component\" *ngFor=\"let point of transformedData;\">\n <circle class=\"point\" [attr.cx]=\"point.x\" [attr.cy]=\"point.y\" r=\"4\" [attr.fill]=\"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</svg>",
providers: [LineGraphService],
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 */
LineGraphComponent.ctorParameters = function () { return [
{ type: LineGraphService },
{ type: GlobalParametersService },
{ type: ElementRef }
]; };
LineGraphComponent.propDecorators = {
data: [{ type: Input }],
chartBase: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
color: [{ 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 }]
};
return LineGraphComponent;
}());
export { LineGraphComponent };
if (false) {
/** @type {?} */
LineGraphComponent.prototype.data;
/** @type {?} */
LineGraphComponent.prototype.chartBase;
/** @type {?} */
LineGraphComponent.prototype.width;
/** @type {?} */
LineGraphComponent.prototype.height;
/** @type {?} */
LineGraphComponent.prototype.color;
/** @type {?} */
LineGraphComponent.prototype.colorScheme;
/** @type {?} */
LineGraphComponent.prototype.minX;
/** @type {?} */
LineGraphComponent.prototype.minY;
/** @type {?} */
LineGraphComponent.prototype.maxX;
/** @type {?} */
LineGraphComponent.prototype.maxY;
/** @type {?} */
LineGraphComponent.prototype.gridPrecisionX;
/** @type {?} */
LineGraphComponent.prototype.gridPrecisionY;
/** @type {?} */
LineGraphComponent.prototype.xAxisTitle;
/** @type {?} */
LineGraphComponent.prototype.yAxisTitle;
/** @type {?} */
LineGraphComponent.prototype.customColorScheme;
/** @type {?} */
LineGraphComponent.prototype.componentID;
/** @type {?} */
LineGraphComponent.prototype.xPadding;
/** @type {?} */
LineGraphComponent.prototype.yPadding;
/** @type {?} */
LineGraphComponent.prototype.graphLinePath;
/** @type {?} */
LineGraphComponent.prototype.dataCopy;
/** @type {?} */
LineGraphComponent.prototype.transformedData;
/** @type {?} */
LineGraphComponent.prototype.lineGraphService;
/**
* @type {?}
* @private
*/
LineGraphComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
LineGraphComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1ncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9saW5lLWdyYXBoL2xpbmUtZ3JhcGguY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RDtJQWdDRSw0QkFBbUIsZ0JBQWtDLEVBQ2pDLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQVk7UUExQnJDLFNBQUksR0FBeUMsSUFBSSxDQUFDO1FBQ2xELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJakIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDcEIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUtwQixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFJMUMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQVE3QixDQUFDOzs7O0lBRUQsMENBQWE7OztJQUFiO1FBQ0UsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUks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QiwrQ0FBMEM7O0lBRzFDLHlDQUFvQjs7SUFDcEIsc0NBQWM7O0lBQ2Qsc0NBQTZCOztJQUM3QiwyQ0FBc0I7O0lBQ3RCLHNDQUFTOztJQUNULDZDQUFnQjs7SUFFSiw4Q0FBeUM7Ozs7O0lBQ3pDLHFEQUF3RDs7Ozs7SUFDeEQsNENBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGluZUdyYXBoU2VydmljZSB9IGZyb20gJy4vbGluZS1ncmFwaC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWxpbmUtZ3JhcGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluZS1ncmFwaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmUtZ3JhcGguY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbTGluZUdyYXBoU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTGluZUdyYXBoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRhdGE6IFt7eDogbnVtYmVyLCB5OiBudW1iZXIsIGluZm86IGFueSB9XSA9IG51bGw7XG4gIEBJbnB1dCgpIGNoYXJ0QmFzZSA9IHRydWU7XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhlaWdodDogbnVtYmVyO1xuICBASW5wdXQoKSBjb2xvcjogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xvclNjaGVtZSA9ICdjb2xvcmZ1bCc7XG4gIEBJbnB1dCgpIG1pblg6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1pblk6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFg6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFk6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGdyaWRQcmVjaXNpb25YOiBudW1iZXI7XG4gIEBJbnB1dCgpIGdyaWRQcmVjaXNpb25ZOiBudW1iZXI7XG4gIEBJbnB1dCgpIHhBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgeUF4aXNUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuXG4gIGNvbXBvbmVudElEOiBudW1iZXI7XG4gIHhQYWRkaW5nID0gNjA7XG4gIHlQYWRkaW5nID0gdGhpcy54UGFkZGluZyAvIDI7XG4gIGdyYXBoTGluZVBhdGg6IHN0cmluZztcbiAgZGF0YUNvcHk7XG4gIHRyYW5zZm9ybWVkRGF0YTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGluZUdyYXBoU2VydmljZTogTGluZUdyYXBoU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBnbG9iYWxQYXJhbWV0ZXJzU2VydmljZTogR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMud2lkdGggJiYgIXRoaXMuaGVpZ2h0KSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLyAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgKiAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChob3N0LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaW1zID0gaG9zdC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLndpZHRoID0gZGltcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBkaW1zLndpZHRoIC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIHNldE1pbmFuZE1heCgpIHtcbiAgICBpZiAodGhpcy5taW5YID09IG51bGwpIHRoaXMubWluWCA9IE1hdGgubWluKC4uLnRoaXMuZGF0YS5tYXAob25lRGF0YSA9PiBvbmVEYXRhLngpKTtcbiAgICBpZiAodGhpcy5tYXhYID09IG51bGwpIHRoaXMubWF4WCA9IE1hdGgubWF4KC4uLnRoaXMuZGF0YS5tYXAob25lRGF0YSA9PiBvbmVEYXRhLngpKTtcbiAgICBpZiAodGhpcy5taW5ZID09IG51bGwpIHRoaXMubWluWSA9IE1hdGgubWluKC4uLnRoaXMuZGF0YS5tYXAob25lRGF0YSA9PiBvbmVEYXRhLnkpKTtcbiAgICBpZiAodGhpcy5tYXhZID09IG51bGwpIHRoaXMubWF4WSA9IE1hdGgubWF4KC4uLnRoaXMuZGF0YS5tYXAob25lRGF0YSA9PiBvbmVEYXRhLnkpKTtcbiAgfVxuXG4gIHRyYW5zZm9ybURhdGEoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm1lZERhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHRoaXMuZGF0YSkge1xuICAgICAgY29uc3QgeCA9IHRoaXMubGluZUdyYXBoU2VydmljZS50cmFuc2Zvcm1YKHBvaW50LngpICsgdGhpcy54UGFkZGluZztcbiAgICAgIGNvbnN0IHkgPSB0aGlzLmxpbmVHcmFwaFNlcnZpY2UudHJhbnNmb3JtWSh0aGlzLmxpbmVHcmFwaFNlcnZpY2UubWF4WSAtIHBvaW50LnkpICsgdGhpcy55UGFkZGluZztcbiAgICAgIGNvbnN0IHRvb2xUaXBYID0geDtcbiAgICAgIGNvbnN0IHRvb2xUaXBZID0geSAtIDMwO1xuICAgICAgY29uc3QgdG9vbFRpcCA9IHBvaW50LmluZm8gJiYgKHBvaW50LmluZm8gIT09ICcnKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICB0aGlzLnRyYW5zZm9ybWVkRGF0YS5wdXNoKHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgaW5mbzogcG9pbnQuaW5mbyxcbiAgICAgICAgb3JpZ2luYWxYOiBwb2ludC54LFxuICAgICAgICBvcmlnaW5hbFk6IHBvaW50LnksXG4gICAgICAgIHRvb2xUaXBUcmFuc2xhdGU6ICd0cmFuc2xhdGUoJyArIHRvb2xUaXBYICsgJ3B4LCAnICsgdG9vbFRpcFkgKyAncHgpJyxcbiAgICAgICAgdG9vbFRpcFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudHJhbnNmb3JtZWREYXRhKTtcbiAgfVxuXG4gIHByaW50QWxsSW5wdXQoKSB7XG4gICAgY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICBjb25zb2xlLmxvZygnbWluWDogJyArIHRoaXMubWluWCk7XG4gICAgY29uc29sZS5sb2coJ21heFg6ICcgKyB0aGlzLm1heFgpO1xuICAgIGNvbnNvbGUubG9nKCdtaW5ZOiAnICsgdGhpcy5taW5ZKTtcbiAgICBjb25zb2xlLmxvZygnbWF4WTogJyArIHRoaXMubWF4WSk7XG4gICAgY29uc29sZS5sb2coJ3g6ICcgKyB0aGlzLnhQYWRkaW5nKTtcbiAgICBjb25zb2xlLmxvZygneTogJyArIHRoaXMueVBhZGRpbmcpO1xuICAgIGNvbnNvbGUubG9nKCdkYXRhOiAnICsgdGhpcy5kYXRhKTtcbiAgfVxuXG5cbiAgc2V0TGluZVBhdGgoKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5wcmludEFsbElucHV0KCkpO1xuICAgIHRoaXMuZ3JhcGhMaW5lUGF0aCA9ICdNJztcblxuICAgIHRoaXMuZGF0YS5zb3J0KChhLCBiKSA9PiBhLnggPCBiLnggPyAtMSA6IGEueCA+IGIueCA/IDEgOiAwKTtcbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHRoaXMudHJhbnNmb3JtZWREYXRhKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhwb2ludCk7XG4gICAgICBjb25zdCBjb29yZFggPSBwb2ludC54O1xuICAgICAgY29uc3QgY29vcmRZID0gcG9pbnQueTtcblxuICAgICAgdGhpcy5ncmFwaExpbmVQYXRoICs9ICcgJyArIGNvb3JkWCArICcgJyArIGNvb3JkWTtcblxuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ncmFwaExpbmVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBzZXRDb2xvcigpIHtcbiAgICBpZiAoIXRoaXMuY29sb3IpIHtcbiAgICAgIGlmICh0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb2xvciA9IHRoaXMuY3VzdG9tQ29sb3JTY2hlbWVbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3JTY2hlbWVzW3RoaXMuY29sb3JTY2hlbWVdWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbml0Li4nKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICAvLyB0aGlzLnByaW50QWxsSW5wdXQoKTtcbiAgICB0aGlzLnNldE1pbmFuZE1heCgpO1xuICAgIC8vIHRoaXMucHJpbnRBbGxJbnB1dCgpO1xuICAgIHRoaXMuZGF0YUNvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMubGluZUdyYXBoU2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICBtaW5YOiB0aGlzLm1pblgsXG4gICAgICBtYXhYOiB0aGlzLm1heFgsXG4gICAgICBtaW5ZOiB0aGlzLm1pblksXG4gICAgICBtYXhZOiB0aGlzLm1heFksXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldENvbG9yKCk7XG4gICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG4gICAgdGhpcy5zZXRMaW5lUGF0aCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2NoYW5nZXMuLicpO1xuICAgIC8vIHRoaXMucHJpbnRBbGxJbnB1dCgpO1xuICAgIHRoaXMuc2V0TWluYW5kTWF4KCk7XG4gICAgLy8gdGhpcy5wcmludEFsbElucHV0KCk7XG5cbiAgICB0aGlzLmRhdGFDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICB0aGlzLmxpbmVHcmFwaFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgbWluWDogdGhpcy5taW5YLFxuICAgICAgbWF4WDogdGhpcy5tYXhYLFxuICAgICAgbWluWTogdGhpcy5taW5ZLFxuICAgICAgbWF4WTogdGhpcy5tYXhZLFxuICAgICAgeFBhZGRpbmc6IHRoaXMueFBhZGRpbmcsXG4gICAgICB5UGFkZGluZzogdGhpcy55UGFkZGluZ1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRDb2xvcigpO1xuXG4gICAgdGhpcy50cmFuc2Zvcm1EYXRhKCk7XG4gICAgdGhpcy5zZXRMaW5lUGF0aCgpO1xuICB9XG5cbn1cbiJdfQ==