ngx-beautiful-charts
Version:
A library to create charts in Angular
303 lines • 31.7 kB
JavaScript
/**
* @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 { PieChartService } from './pie-chart.service';
import { GlobalParametersService } from '../../global/global-parameters.service';
export class PieChartComponent {
/**
* @param {?} pieChartService
* @param {?} globalParametersService
* @param {?} currentElement
*/
constructor(pieChartService, globalParametersService, currentElement) {
this.pieChartService = pieChartService;
this.globalParametersService = globalParametersService;
this.currentElement = currentElement;
this.colorScheme = 'colorful';
this.customColorScheme = [];
this.xPadding = 60;
this.yPadding = this.xPadding / 2;
this.pieSlicesInit = 0;
}
/**
* @param {?} pieCompletion
* @return {?}
*/
generatePieSlices(pieCompletion) {
if (this.pieSlicesInit === 0)
this.pieSlices = [];
/** @type {?} */
let sum = 0;
for (const val of this.data) {
sum = sum + val.value;
}
/** @type {?} */
let rotation = 0;
/** @type {?} */
let rotationRad = 0;
/** @type {?} */
let cnt = 0;
for (const val of this.data) {
// console.log(val);
/** @type {?} */
const perc = val.value / sum * pieCompletion;
/** @type {?} */
const angle = 360 * perc;
// const angleMod = (angle > 180 ) ? 360 - angle : angle;
/** @type {?} */
const angleRad = angle * Math.PI / 180;
/** @type {?} */
const largeArc = (angle > 180) ? 1 : 0;
/** @type {?} */
const path = 'M 0 0 0 ' + -this.pieRadius + ' A '
+ this.pieRadius + ' ' + this.pieRadius
+ ' 0 ' + largeArc + ' 1' + this.pieRadius * Math.sin(angleRad) + ' '
+ -this.pieRadius * Math.cos(angleRad) + ' z';
/** @type {?} */
const hoverPath = 'M 0 0 0 ' + -this.hoverPieRadius + ' A '
+ this.hoverPieRadius + ' ' + this.hoverPieRadius
+ ' 0 ' + largeArc + ' 1' + this.hoverPieRadius * Math.sin(angleRad) + ' '
+ -this.hoverPieRadius * Math.cos(angleRad) + ' z';
/** @type {?} */
const pieInteriorX = this.pieRadius * 2 / 3 * Math.sin(rotationRad + angleRad / 2);
/** @type {?} */
const pieInteriorY = -this.pieRadius * 2 / 3 * Math.cos(rotationRad + angleRad / 2);
/** @type {?} */
const toolTipText = (Math.round(perc * 10000) / 100).toString() + '%';
/** @type {?} */
const pieSlice = {
perc,
name: val.name,
color: val.color,
hoverD: hoverPath,
rotation: 'rotate(' + rotation + 'deg)',
d: path,
hover: false,
toolTipTranslate: 'translate(' + pieInteriorX + 'px, ' + pieInteriorY + 'px)',
toolTipText
};
// console.log(hoverPath);
// console.log(pieSlice);
if (this.pieSlicesInit === 0)
this.pieSlices.push(pieSlice);
else
this.pieSlices[cnt] = pieSlice;
// this.pieSlices.push(pieSlice);
rotation += angle;
rotationRad = rotation * Math.PI / 180;
cnt++;
}
}
/**
* @return {?}
*/
setDimensions() {
if (this.width)
this.height = this.width * .6 - this.xPadding;
else {
/** @type {?} */
const host = this.currentElement.nativeElement;
if (host.parentNode != null) {
/** @type {?} */
const dims = host.parentNode.getBoundingClientRect();
this.width = dims.width;
this.height = this.width * .6 - this.xPadding;
}
}
// console.log('---set dimensions---');
// console.log('width: ' + this.width);
// console.log('height: ' + this.height);
// console.log('--------------------');
}
/**
* @return {?}
*/
setColors() {
/** @type {?} */
let cnt = 0;
for (const slice of this.data) {
if (!slice.color) {
if (this.customColorScheme.length > 0) {
slice.color = this.customColorScheme[cnt % this.customColorScheme.length];
}
else {
slice.color = colorSchemes[this.colorScheme][cnt % 10];
}
}
cnt++;
}
}
/**
* @return {?}
*/
ngOnInit() {
this.data = JSON.parse(JSON.stringify(this.data));
this.componentID = this.globalParametersService.addNewComponent();
// console.log('x: ' + this.x);
this.setDimensions();
this.data.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a.value > b.value ? -1 : a.value < b.value ? 1 : 0));
this.setColors();
this.pieSlicesInit = 0;
this.pieChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.pieRadius = this.pieChartService.pieRadius;
this.hoverPieRadius = this.pieChartService.pieRadius * 1.05;
/** @type {?} */
let pieCompletion = 0;
/** @type {?} */
const intervalID = setInterval((/**
* @return {?}
*/
() => {
this.generatePieSlices(pieCompletion);
this.pieSlicesInit = 1;
pieCompletion = pieCompletion + 0.01;
pieCompletion = Math.round(pieCompletion * 100) / 100;
if (pieCompletion > 1)
clearInterval(intervalID);
}), 5);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.pieRadius;
this.cY = this.yPadding + this.pieRadius;
/** @type {?} */
const translateX = this.xPadding + this.pieRadius;
/** @type {?} */
const translateY = this.yPadding + this.pieRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
const hoverTranslateXY = this.pieRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
}
/**
* @return {?}
*/
ngOnChanges() {
this.data = JSON.parse(JSON.stringify(this.data));
// console.log('x: ' + this.x);
this.setDimensions();
this.data.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => a.value > b.value ? -1 : a.value < b.value ? 1 : 0));
this.setColors();
this.pieSlicesInit = 0;
this.pieChartService.setValues({
componentID: this.componentID,
width: this.width,
height: this.height,
xPadding: this.xPadding,
yPadding: this.yPadding,
data: this.data
});
this.pieRadius = this.pieChartService.pieRadius;
this.hoverPieRadius = this.pieChartService.pieRadius * 1.05;
/** @type {?} */
let pieCompletion = 0;
/** @type {?} */
const intervalID = setInterval((/**
* @return {?}
*/
() => {
this.generatePieSlices(pieCompletion);
this.pieSlicesInit = 1;
pieCompletion = pieCompletion + 0.01;
pieCompletion = Math.round(pieCompletion * 100) / 100;
if (pieCompletion > 1)
clearInterval(intervalID);
}), 5);
// console.log(this.hoverPieRadius);
this.cX = this.xPadding + this.pieRadius;
this.cY = this.yPadding + this.pieRadius;
/** @type {?} */
const translateX = this.xPadding + this.pieRadius;
/** @type {?} */
const translateY = this.yPadding + this.pieRadius;
this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)';
/** @type {?} */
const hoverTranslateXY = this.pieRadius * 0.08;
this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)';
}
}
PieChartComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-pie-chart',
template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-pie-chart-base />\n <g *ngFor=\"let pieSlice of pieSlices\">\n <g id=\"component\" [ngStyle]=\"{'transform': gTranslate}\">\n <g class=\"pie-g\" [ngStyle]=\"{'transform': pieSlice.rotation, 'position': 'relative'}\">\n <path class=\"pie-slice\" (mouseover)=\"pieSlice.hover=true\" (mouseout)=\"pieSlice.hover=false\"\n [ngStyle]=\"{'opacity': pieSlice.hover ? 0.7 : 1.0}\"\n [attr.d]=\"pieSlice.hover ? pieSlice.hoverD : pieSlice.d\" [attr.fill]=\"pieSlice.color\" />\n </g>\n <g class=\"tooltip\" [ngStyle]=\"{'transform': pieSlice.toolTipTranslate}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"70\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ pieSlice.toolTipText }}</text>\n </g>\n </g>\n </g>\n \n</svg>\n\n<!-- 'transform': pieSlice.hover ? hoverTranslate + ' ' + pieSlice.rotation : pieSlice.rotation, -->",
providers: [PieChartService],
styles: [".pie-slice{transition:.3s ease-in}#component .tooltip{visibility:hidden;position:relative!important}#component:hover .tooltip{visibility:visible;position:absolute;z-index:9999999!important}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap;z-index:9999999!important}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif;z-index:9999999!important}.tooltip rect{fill:#222;stroke:#111;z-index:9999998!important}"]
}] }
];
/** @nocollapse */
PieChartComponent.ctorParameters = () => [
{ type: PieChartService },
{ type: GlobalParametersService },
{ type: ElementRef }
];
PieChartComponent.propDecorators = {
data: [{ type: Input }],
width: [{ type: Input }],
colorScheme: [{ type: Input }],
customColorScheme: [{ type: Input }]
};
if (false) {
/** @type {?} */
PieChartComponent.prototype.data;
/** @type {?} */
PieChartComponent.prototype.width;
/** @type {?} */
PieChartComponent.prototype.colorScheme;
/** @type {?} */
PieChartComponent.prototype.customColorScheme;
/** @type {?} */
PieChartComponent.prototype.componentID;
/** @type {?} */
PieChartComponent.prototype.xPadding;
/** @type {?} */
PieChartComponent.prototype.yPadding;
/** @type {?} */
PieChartComponent.prototype.height;
/** @type {?} */
PieChartComponent.prototype.pieSlices;
/** @type {?} */
PieChartComponent.prototype.pieRadius;
/** @type {?} */
PieChartComponent.prototype.hoverPieRadius;
/** @type {?} */
PieChartComponent.prototype.cX;
/** @type {?} */
PieChartComponent.prototype.cY;
/** @type {?} */
PieChartComponent.prototype.gTranslate;
/** @type {?} */
PieChartComponent.prototype.hoverTranslate;
/** @type {?} */
PieChartComponent.prototype.pieSlicesInit;
/** @type {?} */
PieChartComponent.prototype.pieChartService;
/**
* @type {?}
* @private
*/
PieChartComponent.prototype.globalParametersService;
/**
* @type {?}
* @private
*/
PieChartComponent.prototype.currentElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQVFqRixNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUF3QjVCLFlBQW1CLGVBQWdDLEVBQy9CLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQWxCckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFTN0Isa0JBQWEsR0FBRyxDQUFDLENBQUM7SUFLbEIsQ0FBQzs7Ozs7SUFFRCxpQkFBaUIsQ0FBQyxhQUFhO1FBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDO1lBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7O1lBRTlDLEdBQUcsR0FBRyxDQUFDO1FBQ1gsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzNCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztTQUN2Qjs7WUFD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LDBDQUFrQjs7SUFFTiw0Q0FBdUM7Ozs7O0lBQ3ZDLG9EQUF3RDs7Ozs7SUFDeEQsMkNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPbkNoYW5nZXMsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcbmltcG9ydCB7IFBpZUNoYXJ0U2VydmljZSB9IGZyb20gJy4vcGllLWNoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9nbG9iYWwvZ2xvYmFsLXBhcmFtZXRlcnMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1waWUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1BpZUNoYXJ0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgUGllQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgLy8gPG5neC1iZWF1dGlmdWwtY2hhcnRzIFt3aWR0aF09XCI4MDBcIlxuICAvLyBbZGF0YV09XCJwaWVDaGFydERhdGFcIlxuICAvLyBjaGFydFR5cGU9XCJwaWUtY2hhcnRcIj48L25neC1iZWF1dGlmdWwtY2hhcnRzPlxuXG4gIEBJbnB1dCgpIGRhdGE6IFt7bmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nLCB2YWx1ZTogbnVtYmVyIH1dO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBjb2xvclNjaGVtZSA9ICdjb2xvcmZ1bCc7XG4gIEBJbnB1dCgpIGN1c3RvbUNvbG9yU2NoZW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbXBvbmVudElEO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgcGllU2xpY2VzOiBhbnk7XG4gIHBpZVJhZGl1czogbnVtYmVyO1xuICBob3ZlclBpZVJhZGl1czogbnVtYmVyO1xuICBjWDogbnVtYmVyO1xuICBjWTogbnVtYmVyO1xuICBnVHJhbnNsYXRlOiBzdHJpbmc7XG4gIGhvdmVyVHJhbnNsYXRlOiBzdHJpbmc7XG4gIHBpZVNsaWNlc0luaXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwaWVDaGFydFNlcnZpY2U6IFBpZUNoYXJ0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBnbG9iYWxQYXJhbWV0ZXJzU2VydmljZTogR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY3VycmVudEVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgfVxuXG4gIGdlbmVyYXRlUGllU2xpY2VzKHBpZUNvbXBsZXRpb24pIHtcbiAgICBpZiAodGhpcy5waWVTbGljZXNJbml0ID09PSAwKSB0aGlzLnBpZVNsaWNlcyA9IFtdO1xuXG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5kYXRhKSB7XG4gICAgICBzdW0gPSBzdW0gKyB2YWwudmFsdWU7XG4gICAgfVxuICAgIGxldCByb3RhdGlvbiA9IDA7XG4gICAgbGV0IHJvdGF0aW9uUmFkID0gMDtcblxuICAgIGxldCBjbnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5kYXRhKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyh2YWwpO1xuICAgICAgY29uc3QgcGVyYyA9IHZhbC52YWx1ZSAvIHN1bSAqIHBpZUNvbXBsZXRpb247XG4gICAgICBjb25zdCBhbmdsZSA9IDM2MCAqIHBlcmM7XG4gICAgICAvLyBjb25zdCBhbmdsZU1vZCA9IChhbmdsZSA+IDE4MCApID8gMzYwIC0gYW5nbGUgOiBhbmdsZTtcbiAgICAgIGNvbnN0IGFuZ2xlUmFkID0gYW5nbGUgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgY29uc3QgbGFyZ2VBcmMgPSAoYW5nbGUgPiAxODApID8gMSA6IDA7XG5cbiAgICAgIGNvbnN0IHBhdGggPSAnTSAwIDAgMCAnICsgLXRoaXMucGllUmFkaXVzICsgJyBBICdcbiAgICAgICsgdGhpcy5waWVSYWRpdXMgKyAnICcgKyB0aGlzLnBpZVJhZGl1c1xuICAgICAgKyAnIDAgJyArIGxhcmdlQXJjICsgJyAxJyArIHRoaXMucGllUmFkaXVzICogTWF0aC5zaW4oYW5nbGVSYWQpICsgJyAnXG4gICAgICArIC10aGlzLnBpZVJhZGl1cyAqIE1hdGguY29zKGFuZ2xlUmFkKSArICcgeic7XG5cbiAgICAgIGNvbnN0IGhvdmVyUGF0aCA9ICdNIDAgMCAwICcgKyAtdGhpcy5ob3ZlclBpZVJhZGl1cyArICcgQSAnXG4gICAgICArIHRoaXMuaG92ZXJQaWVSYWRpdXMgKyAnICcgKyB0aGlzLmhvdmVyUGllUmFkaXVzXG4gICAgICArICcgMCAnICsgbGFyZ2VBcmMgKyAnIDEnICsgdGhpcy5ob3ZlclBpZVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtdGhpcy5ob3ZlclBpZVJhZGl1cyAqIE1hdGguY29zKGFuZ2xlUmFkKSArICcgeic7XG5cbiAgICAgIGNvbnN0IHBpZUludGVyaW9yWCA9IHRoaXMucGllUmFkaXVzICogMiAvIDMgKiBNYXRoLnNpbihyb3RhdGlvblJhZCArIGFuZ2xlUmFkIC8gMik7XG4gICAgICBjb25zdCBwaWVJbnRlcmlvclkgPSAtdGhpcy5waWVSYWRpdXMgKiAyIC8gMyAqIE1hdGguY29zKHJvdGF0aW9uUmFkICsgYW5nbGVSYWQgLyAyKTtcbiAgICAgIGNvbnN0IHRvb2xUaXBUZXh0ID0gKE1hdGgucm91bmQocGVyYyAqIDEwMDAwKSAvIDEwMCkudG9TdHJpbmcoKSArICclJztcblxuICAgICAgY29uc3QgcGllU2xpY2UgPSB7XG4gICAgICAgIHBlcmMsXG4gICAgICAgIG5hbWU6IHZhbC5uYW1lLFxuICAgICAgICBjb2xvcjogdmFsLmNvbG9yLFxuICAgICAgICBob3ZlckQ6IGhvdmVyUGF0aCxcbiAgICAgICAgcm90YXRpb246ICdyb3RhdGUoJyArIHJvdGF0aW9uICsgJ2RlZyknLFxuICAgICAgICBkOiBwYXRoLFxuICAgICAgICBob3ZlcjogZmFsc2UsXG4gICAgICAgIHRvb2xUaXBUcmFuc2xhdGU6ICd0cmFuc2xhdGUoJyArIHBpZUludGVyaW9yWCArICdweCwgJyArIHBpZUludGVyaW9yWSArICdweCknLFxuICAgICAgICB0b29sVGlwVGV4dFxuICAgICAgfTtcblxuICAgICAgLy8gY29uc29sZS5sb2coaG92ZXJQYXRoKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHBpZVNsaWNlKTtcbiAgICAgIGlmICggdGhpcy5waWVTbGljZXNJbml0ID09PSAwICkgdGhpcy5waWVTbGljZXMucHVzaChwaWVTbGljZSk7XG4gICAgICBlbHNlIHRoaXMucGllU2xpY2VzW2NudF0gPSBwaWVTbGljZTtcbiAgICAgIC8vIHRoaXMucGllU2xpY2VzLnB1c2gocGllU2xpY2UpO1xuICAgICAgcm90YXRpb24gKz0gYW5nbGU7XG4gICAgICByb3RhdGlvblJhZCA9IHJvdGF0aW9uICogTWF0aC5QSSAvIDE4MDtcblxuICAgICAgY250ICsrO1xuICAgIH1cbiAgfVxuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMud2lkdGgpIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aCAqIC42IC0gdGhpcy54UGFkZGluZztcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy53aWR0aCAqIC42IC0gdGhpcy54UGFkZGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIHNldENvbG9ycygpIHtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHNsaWNlIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKCFzbGljZS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2xpY2UuY29sb3IgPSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lW2NudCAlIHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzbGljZS5jb2xvciA9IGNvbG9yU2NoZW1lc1t0aGlzLmNvbG9yU2NoZW1lXVtjbnQgJSAxMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNudCsrO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgdGhpcy5jb21wb25lbnRJRCA9IHRoaXMuZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UuYWRkTmV3Q29tcG9uZW50KCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3g6ICcgKyB0aGlzLngpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xuICAgIHRoaXMuZGF0YS5zb3J0KChhLCBiKSA9PiBhLnZhbHVlID4gYi52YWx1ZSA/IC0xIDogYS52YWx1ZSA8IGIudmFsdWUgPyAxIDogMCk7XG4gICAgdGhpcy5zZXRDb2xvcnMoKTtcbiAgICB0aGlzLnBpZVNsaWNlc0luaXQgPSAwO1xuICAgIHRoaXMucGllQ2hhcnRTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLnBpZVJhZGl1cyA9IHRoaXMucGllQ2hhcnRTZXJ2aWNlLnBpZVJhZGl1cztcbiAgICB0aGlzLmhvdmVyUGllUmFkaXVzID0gdGhpcy5waWVDaGFydFNlcnZpY2UucGllUmFkaXVzICogMS4wNTtcbiAgICBsZXQgcGllQ29tcGxldGlvbiA9IDA7XG5cbiAgICBjb25zdCBpbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5nZW5lcmF0ZVBpZVNsaWNlcyhwaWVDb21wbGV0aW9uKTtcbiAgICAgIHRoaXMucGllU2xpY2VzSW5pdCA9IDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gcGllQ29tcGxldGlvbiArIDAuMDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gTWF0aC5yb3VuZChwaWVDb21wbGV0aW9uICogMTAwKSAvIDEwMDtcbiAgICAgIGlmIChwaWVDb21wbGV0aW9uID4gMSkgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTtcbiAgICB9LCA1KTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhvdmVyUGllUmFkaXVzKTtcbiAgICB0aGlzLmNYID0gdGhpcy54UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuY1kgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVZID0gdGhpcy55UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuZ1RyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIHRyYW5zbGF0ZVggKyAncHgsICcgKyB0cmFuc2xhdGVZICsgJ3B4KSc7XG4gICAgY29uc3QgaG92ZXJUcmFuc2xhdGVYWSA9IHRoaXMucGllUmFkaXVzICogMC4wODtcbiAgICB0aGlzLmhvdmVyVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgaG92ZXJUcmFuc2xhdGVYWSArICdweCwgJyArIC1ob3ZlclRyYW5zbGF0ZVhZICsgJ3B4KSc7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd4OiAnICsgdGhpcy54KTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmRhdGEuc29ydCgoYSwgYikgPT4gYS52YWx1ZSA+IGIudmFsdWUgPyAtMSA6IGEudmFsdWUgPCBiLnZhbHVlID8gMSA6IDApO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5waWVTbGljZXNJbml0ID0gMDtcbiAgICB0aGlzLnBpZUNoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5waWVSYWRpdXMgPSB0aGlzLnBpZUNoYXJ0U2VydmljZS5waWVSYWRpdXM7XG4gICAgdGhpcy5ob3ZlclBpZVJhZGl1cyA9IHRoaXMucGllQ2hhcnRTZXJ2aWNlLnBpZVJhZGl1cyAqIDEuMDU7XG4gICAgbGV0IHBpZUNvbXBsZXRpb24gPSAwO1xuICAgIGNvbnN0IGludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmdlbmVyYXRlUGllU2xpY2VzKHBpZUNvbXBsZXRpb24pO1xuICAgICAgdGhpcy5waWVTbGljZXNJbml0ID0gMTtcbiAgICAgIHBpZUNvbXBsZXRpb24gPSBwaWVDb21wbGV0aW9uICsgMC4wMTtcbiAgICAgIHBpZUNvbXBsZXRpb24gPSBNYXRoLnJvdW5kKHBpZUNvbXBsZXRpb24gKiAxMDApIC8gMTAwO1xuICAgICAgaWYgKHBpZUNvbXBsZXRpb24gPiAxKSBjbGVhckludGVydmFsKGludGVydmFsSUQpO1xuICAgIH0sIDUpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaG92ZXJQaWVSYWRpdXMpO1xuICAgIHRoaXMuY1ggPSB0aGlzLnhQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgdGhpcy5jWSA9IHRoaXMueVBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVYID0gdGhpcy54UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIGNvbnN0IHRyYW5zbGF0ZVkgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgdGhpcy5nVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgdHJhbnNsYXRlWCArICdweCwgJyArIHRyYW5zbGF0ZVkgKyAncHgpJztcbiAgICBjb25zdCBob3ZlclRyYW5zbGF0ZVhZID0gdGhpcy5waWVSYWRpdXMgKiAwLjA4O1xuICAgIHRoaXMuaG92ZXJUcmFuc2xhdGUgPSAndHJhbnNsYXRlKCcgKyBob3ZlclRyYW5zbGF0ZVhZICsgJ3B4LCAnICsgLWhvdmVyVHJhbnNsYXRlWFkgKyAncHgpJztcbiAgfVxuXG59XG4iXX0=