angular-advance-chart
Version:
Angular Advance Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart
116 lines • 15 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
let DonutChartComponent = class DonutChartComponent {
constructor() {
this.selectedItem = new EventEmitter();
this.chartOptions = {
showLegend: true,
legendTitle: 'Total',
};
this.view = {
height: 200,
width: 200,
radius: 80,
donutSize: 20
};
this.totalSum = 0;
this.processedData = [];
this.legendData = [];
this.chartView = [];
}
ngOnInit() {
if (this.chartData) {
this.view['donutSize'] = this.view['donutSize'] ? this.view['donutSize'] : 20;
this.chartView.push(this.view.height + 'px');
this.chartView.push(this.view.width + 'px');
// Get total number of records
this.totalSum = this.chartData.reduce(function (a, b) {
return a + b.value;
}, 0);
//generate Data for list
let prevAngle = 0;
this.chartData.map((x, index) => {
let legend = {
name: x.name,
value: x.value,
color: x.color
};
this.legendData.push(legend);
let percentage = this.getPercentage(x.value, this.totalSum);
if (percentage > 0) {
let circlePercentage = percentage / 10 * 36;
let pieData = {
color: x.color,
a1: prevAngle,
a2: prevAngle + circlePercentage,
name: x.name
};
prevAngle = prevAngle + circlePercentage;
this.processedData.push(pieData);
}
});
}
}
getPercentage(partialValue, totalValue) {
return (100 * partialValue) / totalValue;
}
ngAfterViewInit() {
//create svg
if (this.processedData.length > 0) {
this.span.map((item, index) => {
item.nativeElement.setAttribute('d', this.describeArc(this.view.height / 2, this.view.width / 2, this.view.radius, this.processedData[index].a1, this.processedData[index].a2 == 360 ? 359.99 : this.processedData[index].a2));
item.nativeElement.setAttribute('stroke', this.processedData[index].color);
});
}
}
polarToCartesian(centerX, centerY, radius, angleInDegrees) {
let angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;
return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}
describeArc(x, y, radius, startAngle, endAngle) {
let start = this.polarToCartesian(x, y, radius, endAngle);
let end = this.polarToCartesian(x, y, radius, startAngle);
let largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
let d = [
"M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, 0, end.x, end.y
].join(" ");
return d;
}
getItemClicked(item) {
let selected = {
name: item.name,
value: item.value
};
this.selectedItem.emit(selected);
}
show(status) {
}
};
__decorate([
Input()
], DonutChartComponent.prototype, "chartData", void 0);
__decorate([
Output()
], DonutChartComponent.prototype, "selectedItem", void 0);
__decorate([
ViewChildren('el')
], DonutChartComponent.prototype, "span", void 0);
__decorate([
Input()
], DonutChartComponent.prototype, "chartOptions", void 0);
__decorate([
Input()
], DonutChartComponent.prototype, "view", void 0);
DonutChartComponent = __decorate([
Component({
selector: 'ngx-donut-chart',
template: "<div class=\"chart-view ngx-donut\">\n <svg class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\n <path width=\"100%\" height=\"100%\" #el fill=\"none\" [attr.stroke-width]=\"this.view.donutSize\" *ngFor=\"let item of processedData; let i=index\"\n (click)=\"getItemClicked(item)\" chartTooltip tooltip={{item.name}}/>\n\n </svg>\n <div class=\"legend\" *ngIf=\"chartOptions.showLegend\">\n <h4>{{chartOptions.legendTitle +' : '+ totalSum}}</h4>\n <div class=\"legend-item\" *ngFor=\"let item of legendData; let i=index\" >\n <div class=\"legend-item-colour\" [ngStyle]=\"{'background': item.color}\"></div><span class=\"legend-item-name\" >{{item.name}}</span><span class=\"legend-item-value\" >{{item.value}}</span>\n </div>\n </div>\n</div>",
styles: ["path:hover{cursor:pointer}"]
})
], DonutChartComponent);
export { DonutChartComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1hZHZhbmNlLWNoYXJ0LyIsInNvdXJjZXMiOlsibGliL19jb21wb25lbnQvZG9udXQtY2hhcnQvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVwSCxJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFtQjtJQW1COUI7UUFoQlUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXhDLGlCQUFZLEdBQWdCO1lBQ25DLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFdBQVcsRUFBRSxPQUFPO1NBQ3JCLENBQUE7UUFDUSxTQUFJLEdBQW1CO1lBQzlCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQTtRQUNELGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxFQUFFLENBQUM7SUFDQyxDQUFDO0lBRWpCLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUE7WUFFM0MsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNyQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFTix3QkFBd0I7WUFDeEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM5QixJQUFJLE1BQU0sR0FBRztvQkFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztpQkFDZixDQUFBO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUM1QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLElBQUksZ0JBQWdCLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7b0JBQzVDLElBQUksT0FBTyxHQUFHO3dCQUNaLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSzt3QkFDZCxFQUFFLEVBQUUsU0FBUzt3QkFDYixFQUFFLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjt3QkFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO3FCQUNiLENBQUE7b0JBQ0QsU0FBUyxHQUFHLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQTtvQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2xDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFHRCxhQUFhLENBQUMsWUFBWSxFQUFFLFVBQVU7UUFDcEMsT0FBTyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDM0MsQ0FBQztJQUVELGVBQWU7UUFFYixZQUFZO1FBQ1osSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFnQixFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9OLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdFLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFFSCxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYztRQUN2RCxJQUFJLGNBQWMsR0FBRyxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUU3RCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUTtRQUM1QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELElBQUksWUFBWSxHQUFHLFFBQVEsR0FBRyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUU1RCxJQUFJLENBQUMsR0FBRztZQUNOLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDdEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFWixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBSTtRQUNqQixJQUFJLFFBQVEsR0FBRztZQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNsQixDQUFBO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNO0lBQ1gsQ0FBQztDQUNGLENBQUE7QUExR1U7SUFBUixLQUFLLEVBQUU7c0RBQXdCO0FBQ3RCO0lBQVQsTUFBTSxFQUFFO3lEQUF3QztBQUM3QjtJQUFuQixZQUFZLENBQUMsSUFBSSxDQUFDO2lEQUE2QjtBQUN2QztJQUFSLEtBQUssRUFBRTt5REFHUDtBQUNRO0lBQVIsS0FBSyxFQUFFO2lEQUtQO0FBZFUsbUJBQW1CO0lBTC9CLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsZ3pCQUEyQzs7S0FFNUMsQ0FBQztHQUNXLG1CQUFtQixDQTRHL0I7U0E1R1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9fbW9kZWwvY2hhcnREYXRhJztcbmltcG9ydCB7IERvbnV0Q2hhcnRWaWV3IH0gZnJvbSAnLi4vLi4vX21vZGVsL2RvbnV0Q2hhcnRPcHRpb25zJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZG9udXQtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9udXQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb251dC1jaGFydC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERvbnV0Q2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogQ2hhcnREYXRhW107XG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZHJlbignZWwnKSBzcGFuOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBJbnB1dCgpIGNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb24gPSB7XG4gICAgc2hvd0xlZ2VuZDogdHJ1ZSxcbiAgICBsZWdlbmRUaXRsZTogJ1RvdGFsJyxcbiAgfVxuICBASW5wdXQoKSB2aWV3OiBEb251dENoYXJ0VmlldyA9IHtcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB3aWR0aDogMjAwLFxuICAgIHJhZGl1czogODAsXG4gICAgZG9udXRTaXplOiAyMFxuICB9XG4gIHRvdGFsU3VtID0gMDtcbiAgcHJvY2Vzc2VkRGF0YSA9IFtdO1xuICBsZWdlbmREYXRhID0gW107XG4gIGNoYXJ0VmlldyA9IFtdO1xuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJ0RGF0YSkge1xuICAgICAgdGhpcy52aWV3Wydkb251dFNpemUnXSA9IHRoaXMudmlld1snZG9udXRTaXplJ10gPyB0aGlzLnZpZXdbJ2RvbnV0U2l6ZSddIDogMjA7XG4gICAgICB0aGlzLmNoYXJ0Vmlldy5wdXNoKHRoaXMudmlldy5oZWlnaHQgKyAncHgnKVxuICAgICAgdGhpcy5jaGFydFZpZXcucHVzaCh0aGlzLnZpZXcud2lkdGggKyAncHgnKVxuXG4gICAgICAvLyBHZXQgdG90YWwgbnVtYmVyIG9mIHJlY29yZHNcbiAgICAgIHRoaXMudG90YWxTdW0gPSB0aGlzLmNoYXJ0RGF0YS5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiLnZhbHVlO1xuICAgICAgfSwgMCk7XG5cbiAgICAgIC8vZ2VuZXJhdGUgRGF0YSBmb3IgbGlzdFxuICAgICAgbGV0IHByZXZBbmdsZSA9IDBcbiAgICAgIHRoaXMuY2hhcnREYXRhLm1hcCgoeCwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IGxlZ2VuZCA9IHtcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IHgudmFsdWUsXG4gICAgICAgICAgY29sb3I6IHguY29sb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVnZW5kRGF0YS5wdXNoKGxlZ2VuZClcbiAgICAgICAgbGV0IHBlcmNlbnRhZ2UgPSB0aGlzLmdldFBlcmNlbnRhZ2UoeC52YWx1ZSwgdGhpcy50b3RhbFN1bSk7XG4gICAgICAgIGlmIChwZXJjZW50YWdlID4gMCkge1xuICAgICAgICAgIGxldCBjaXJjbGVQZXJjZW50YWdlID0gcGVyY2VudGFnZSAvIDEwICogMzY7XG4gICAgICAgICAgbGV0IHBpZURhdGEgPSB7XG4gICAgICAgICAgICBjb2xvcjogeC5jb2xvcixcbiAgICAgICAgICAgIGExOiBwcmV2QW5nbGUsXG4gICAgICAgICAgICBhMjogcHJldkFuZ2xlICsgY2lyY2xlUGVyY2VudGFnZSxcbiAgICAgICAgICAgIG5hbWU6IHgubmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2QW5nbGUgPSBwcmV2QW5nbGUgKyBjaXJjbGVQZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWREYXRhLnB1c2gocGllRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UGVyY2VudGFnZShwYXJ0aWFsVmFsdWUsIHRvdGFsVmFsdWUpOiBudW1iZXIge1xuICAgIHJldHVybiAoMTAwICogcGFydGlhbFZhbHVlKSAvIHRvdGFsVmFsdWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICAvL2NyZWF0ZSBzdmdcbiAgICBpZiAodGhpcy5wcm9jZXNzZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3Bhbi5tYXAoKGl0ZW06IEVsZW1lbnRSZWYsIGluZGV4KSA9PiB7XG4gICAgICAgIGl0ZW0ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2QnLCB0aGlzLmRlc2NyaWJlQXJjKHRoaXMudmlldy5oZWlnaHQgLyAyLCB0aGlzLnZpZXcud2lkdGggLyAyLCB0aGlzLnZpZXcucmFkaXVzLCB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmExLCB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmEyID09IDM2MCA/IDM1OS45OSA6IHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTIpKTtcbiAgICAgICAgaXRlbS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5jb2xvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgcG9sYXJUb0NhcnRlc2lhbihjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGFuZ2xlSW5EZWdyZWVzKSB7XG4gICAgbGV0IGFuZ2xlSW5SYWRpYW5zID0gKGFuZ2xlSW5EZWdyZWVzIC0gOTApICogTWF0aC5QSSAvIDE4MC4wO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNlbnRlclggKyAocmFkaXVzICogTWF0aC5jb3MoYW5nbGVJblJhZGlhbnMpKSxcbiAgICAgIHk6IGNlbnRlclkgKyAocmFkaXVzICogTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpKVxuICAgIH07XG4gIH1cblxuICBkZXNjcmliZUFyYyh4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSB7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5wb2xhclRvQ2FydGVzaWFuKHgsIHksIHJhZGl1cywgZW5kQW5nbGUpO1xuICAgIGxldCBlbmQgPSB0aGlzLnBvbGFyVG9DYXJ0ZXNpYW4oeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlKTtcbiAgICBsZXQgbGFyZ2VBcmNGbGFnID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlIDw9IDE4MCA/IFwiMFwiIDogXCIxXCI7XG5cbiAgICBsZXQgZCA9IFtcbiAgICAgIFwiTVwiLCBzdGFydC54LCBzdGFydC55LFxuICAgICAgXCJBXCIsIHJhZGl1cywgcmFkaXVzLCAwLCBsYXJnZUFyY0ZsYWcsIDAsIGVuZC54LCBlbmQueVxuICAgIF0uam9pbihcIiBcIik7XG5cbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIGdldEl0ZW1DbGlja2VkKGl0ZW0pIHtcbiAgICBsZXQgc2VsZWN0ZWQgPSB7XG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICB2YWx1ZTogaXRlbS52YWx1ZVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkSXRlbS5lbWl0KHNlbGVjdGVkKTtcbiAgfVxuXG4gIHNob3coc3RhdHVzKSB7XG4gIH1cbn1cbiJdfQ==