UNPKG

ngx-beautiful-charts

Version:
303 lines 31.7 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 { 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=