ngx-beautiful-charts
Version:
A library to create charts in Angular
153 lines • 15.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input } from '@angular/core';
import { ClusteredBarChartService } from '../clustered-bar-chart.service';
var CbcChartBaseComponent = /** @class */ (function () {
function CbcChartBaseComponent(clusteredBarChartService) {
this.clusteredBarChartService = clusteredBarChartService;
}
/**
* @return {?}
*/
CbcChartBaseComponent.prototype.computeGrid = /**
* @return {?}
*/
function () {
var e_1, _a, e_2, _b, e_3, _c;
this.yLevelPaths = [];
this.xAxis = [];
this.yAxis = [];
for (var y = this.clusteredBarChartService.minY; y <= this.clusteredBarChartService.maxY; y = y + this.clusteredBarChartService.diff) {
/** @type {?} */
var rectEnd = this.clusteredBarChartService.xPadding + this.clusteredBarChartService.rectWidth;
/** @type {?} */
var yTransformed = this.clusteredBarChartService.transformY(this.clusteredBarChartService.maxY - y)
+ this.clusteredBarChartService.yPadding;
/** @type {?} */
var path = 'M ' + this.clusteredBarChartService.xPadding + ' ' + yTransformed + ' L ' + rectEnd + ' ' + yTransformed;
this.yLevelPaths.push(path);
this.yAxis.push({ yPos: yTransformed, value: y });
}
// console.log('diff: ' + this.clusteredBarChartService.diff);
// console.log(this.yAxis);
// now the x axis :)
// let noOfXAxisValues;
// noOfXAxisValues = this.clusteredBarChartService.data.length;
// const eachWidth = this.clusteredBarChartService.rectWidth / noOfXAxisValues;
// let cnt = -1;
// for (const bcD of this.clusteredBarChartService.data) {
// cnt ++;
// const xPos = cnt * eachWidth + eachWidth / 2 + this.clusteredBarChartService.xPadding;
// this.xAxis.push({xPos, value: bcD.name});
// }
/** @type {?} */
var noOfXAxisValues;
/** @type {?} */
var uniqueXAxisValues;
uniqueXAxisValues = new Set();
try {
for (var _d = tslib_1.__values(this.clusteredBarChartService.data), _e = _d.next(); !_e.done; _e = _d.next()) {
var series = _e.value;
/** @type {?} */
var seriesData = series.data;
try {
for (var seriesData_1 = tslib_1.__values(seriesData), seriesData_1_1 = seriesData_1.next(); !seriesData_1_1.done; seriesData_1_1 = seriesData_1.next()) {
var sData = seriesData_1_1.value;
uniqueXAxisValues.add(sData.name);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (seriesData_1_1 && !seriesData_1_1.done && (_b = seriesData_1.return)) _b.call(seriesData_1);
}
finally { if (e_2) throw e_2.error; }
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
}
finally { if (e_1) throw e_1.error; }
}
noOfXAxisValues = uniqueXAxisValues.size;
/** @type {?} */
var eachWidth = this.clusteredBarChartService.rectWidth / noOfXAxisValues;
/** @type {?} */
var cnt = -1;
try {
for (var uniqueXAxisValues_1 = tslib_1.__values(uniqueXAxisValues), uniqueXAxisValues_1_1 = uniqueXAxisValues_1.next(); !uniqueXAxisValues_1_1.done; uniqueXAxisValues_1_1 = uniqueXAxisValues_1.next()) {
var xAxisValue = uniqueXAxisValues_1_1.value;
cnt++;
/** @type {?} */
var xPos = cnt * eachWidth + eachWidth / 2 + this.clusteredBarChartService.xPadding;
this.xAxis.push({ xPos: xPos, value: xAxisValue });
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (uniqueXAxisValues_1_1 && !uniqueXAxisValues_1_1.done && (_c = uniqueXAxisValues_1.return)) _c.call(uniqueXAxisValues_1);
}
finally { if (e_3) throw e_3.error; }
}
};
/**
* @return {?}
*/
CbcChartBaseComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.computeGrid();
};
/**
* @return {?}
*/
CbcChartBaseComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.computeGrid();
};
CbcChartBaseComponent.decorators = [
{ type: Component, args: [{
selector: 'g[ngx-cbc-chart-base]',
template: "<!-- <svg:pattern [attr.id]=\"gridID\" \n[attr.x]=\"clusteredBarChartService.xPadding\" [attr.y]=\"clusteredBarChartService.yPadding\" \n[attr.width]=\"gridWidthX\" [attr.height]=\"gridWidthY\" \npatternUnits=\"userSpaceOnUse\">\n <svg:path [attr.d]=\"gridPath\" fill=\"none\" stroke=\"#444444\" stroke-width=\"0.5\" />\n</svg:pattern> -->\n\n<svg:rect [attr.x]=\"clusteredBarChartService.xPadding\" \n[attr.y]=\"clusteredBarChartService.yPadding\" \n[attr.width]=\"clusteredBarChartService.rectWidth\" \n[attr.height]=\"clusteredBarChartService.rectHeight\" \nstroke=\"#444444\" fill=\"none\" stroke-width=\"1\"/>\n\n<svg:g *ngIf=\"showGridLines\">\n <svg:path *ngFor=\"let yLevelPath of yLevelPaths\"\n class=\"bar-chart-level\"\n [attr.d]=\"yLevelPath\" fill=\"none\" stroke=\"#444444\" />\n</svg:g>\n\n<svg:text\n*ngFor=\"let x of xAxis\" class=\"axis-text\" \n[attr.x]=\"x.xPos\" [attr.y]=\"clusteredBarChartService.rectHeight+clusteredBarChartService.yPadding+30\" class=\"small\"\ntext-anchor=\"middle\" dominant-baseline=\"middle\"> {{ x.value }} </svg:text>\n\n<svg:text\n*ngFor=\"let y of yAxis\" class=\"axis-text\" \n[attr.y]=\"y.yPos\" [attr.x]=\"clusteredBarChartService.xPadding-30\" class=\"small\">{{ y.value }}</svg:text>\n\n<!-- x Axis Title -->\n<svg:text class=\"axis-text\" \n [attr.x]=\"clusteredBarChartService.rectWidth/2+clusteredBarChartService.xPadding\" \n [attr.y]=\"clusteredBarChartService.rectHeight+clusteredBarChartService.yPadding+60\" dominant-baseline=\"middle\" text-anchor=\"middle\"> \n {{ xAxisTitle }} \n</svg:text>\n\n<!-- y Axis Title -->\n<svg:text class=\"axis-text\" \n [attr.x]=\"-clusteredBarChartService.rectHeight/2-clusteredBarChartService.yPadding\" \n [attr.y]=\"clusteredBarChartService.xPadding-50\" dominant-baseline=\"middle\" text-anchor=\"middle\" transform=\"rotate(270)\"> \n {{ yAxisTitle }} \n</svg:text>\n\n\n<!-- Legion -->\n<svg:rect [attr.x]=\"2*clusteredBarChartService.xPadding + clusteredBarChartService.rectWidth\" \n[attr.y]=\"clusteredBarChartService.yPadding\" \n[attr.width]=\"clusteredBarChartService.legionWidth\" \n[attr.height]=\"clusteredBarChartService.legionHeight\" \nfill=\"#f1f1f1\" />\n\n\n<svg:g *ngFor=\"let x of clusteredBarChartService.data; index as i\">\n <svg:rect *ngIf=\"clusteredBarChartService.legionWidth\" \n [attr.x]=\"clusteredBarChartService.rectWidth + 2*clusteredBarChartService.xPadding + clusteredBarChartService.legionWidth / 4 * .3\" \n [attr.y]=\"clusteredBarChartService.yPadding+25+30*i\" \n [attr.width]=\"clusteredBarChartService.legionWidth / 4 * .4\" \n [attr.height]=\"clusteredBarChartService.legionWidth / 4 * .4\" \n [attr.fill]=\"x.color\" />\n <svg:text class=\"axis-text\" *ngIf=\"clusteredBarChartService.legionWidth\" \n [attr.x]=\"clusteredBarChartService.rectWidth + 2*clusteredBarChartService.xPadding + clusteredBarChartService.legionWidth / 4\" \n [attr.y]=\"clusteredBarChartService.yPadding+40+30*i\" class=\"small\"> {{ x.series }} </svg:text>\n</svg:g>\n\n",
styles: [".bar-chart-level{stroke-width:.3;stroke-dasharray:5}"]
}] }
];
/** @nocollapse */
CbcChartBaseComponent.ctorParameters = function () { return [
{ type: ClusteredBarChartService }
]; };
CbcChartBaseComponent.propDecorators = {
xAxisTitle: [{ type: Input }],
yAxisTitle: [{ type: Input }],
showGridLines: [{ type: Input }]
};
return CbcChartBaseComponent;
}());
export { CbcChartBaseComponent };
if (false) {
/** @type {?} */
CbcChartBaseComponent.prototype.xAxisTitle;
/** @type {?} */
CbcChartBaseComponent.prototype.yAxisTitle;
/** @type {?} */
CbcChartBaseComponent.prototype.showGridLines;
/** @type {?} */
CbcChartBaseComponent.prototype.yLevelPaths;
/** @type {?} */
CbcChartBaseComponent.prototype.xAxis;
/** @type {?} */
CbcChartBaseComponent.prototype.yAxis;
/** @type {?} */
CbcChartBaseComponent.prototype.clusteredBarChartService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2JjLWNoYXJ0LWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWJlYXV0aWZ1bC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvY2x1c3RlcmVkLWJhci1jaGFydC9jYmMtY2hhcnQtYmFzZS9jYmMtY2hhcnQtYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRTtJQWdFRSwrQkFBbUIsd0JBQWtEO1FBQWxELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7SUFBSSxDQUFDOzs7O0lBakQxRSwyQ0FBVzs7O0lBQVg7O1FBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRTs7Z0JBQzlILE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTOztnQkFDMUYsWUFBWSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7a0JBQy9FLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFROztnQkFDdEQsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcsS0FBSyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsWUFBWTtZQUN0SCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbEQ7Ozs7Ozs7Ozs7Ozs7O1lBaUJHLGVBQWU7O1lBQ2YsaUJBQWlCO1FBQ3JCLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7O1lBQzlCLEtBQXFCLElBQUEsS0FBQSxpQkFBQSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFBLGdCQUFBLDRCQUFFO2dCQUFwRCxJQUFNLE1BQU0sV0FBQTs7b0JBQ1QsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJOztvQkFDOUIsS0FBb0IsSUFBQSxlQUFBLGlCQUFBLFVBQVUsQ0FBQSxzQ0FBQSw4REFBRTt3QkFBM0IsSUFBTSxLQUFLLHVCQUFBO3dCQUNkLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ25DOzs7Ozs7Ozs7YUFDRjs7Ozs7Ozs7O1FBQ0QsZUFBZSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQzs7WUFDbkMsU0FBUyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEdBQUcsZUFBZTs7WUFDdkUsR0FBRyxHQUFHLENBQUMsQ0FBQzs7WUFDWixLQUF5QixJQUFBLHNCQUFBLGlCQUFBLGlCQUFpQixDQUFBLG9EQUFBLG1GQUFFO2dCQUF2QyxJQUFNLFVBQVUsOEJBQUE7Z0JBQ25CLEdBQUcsRUFBRyxDQUFDOztvQkFDRCxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRO2dCQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksTUFBQSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO2FBQzdDOzs7Ozs7Ozs7SUFFSCxDQUFDOzs7O0lBSUQsd0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7SUFFRCwyQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7Z0JBeEVGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxrK0ZBQThDOztpQkFFL0M7Ozs7Z0JBTlEsd0JBQXdCOzs7NkJBUzlCLEtBQUs7NkJBQ0wsS0FBSztnQ0FDTCxLQUFLOztJQWlFUiw0QkFBQztDQUFBLEFBMUVELElBMEVDO1NBckVZLHFCQUFxQjs7O0lBRWhDLDJDQUE0Qjs7SUFDNUIsMkNBQTRCOztJQUM1Qiw4Q0FBZ0M7O0lBRWhDLDRDQUFzQjs7SUFDdEIsc0NBQU07O0lBQ04sc0NBQU07O0lBbURNLHlEQUF5RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UgfSBmcm9tICcuLi9jbHVzdGVyZWQtYmFyLWNoYXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW25neC1jYmMtY2hhcnQtYmFzZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY2JjLWNoYXJ0LWJhc2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYmMtY2hhcnQtYmFzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENiY0NoYXJ0QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSB4QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHlBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0dyaWRMaW5lczogYm9vbGVhbjtcblxuICB5TGV2ZWxQYXRoczogc3RyaW5nW107XG4gIHhBeGlzO1xuICB5QXhpcztcblxuICBjb21wdXRlR3JpZCgpIHtcbiAgICB0aGlzLnlMZXZlbFBhdGhzID0gW107XG4gICAgdGhpcy54QXhpcyA9IFtdO1xuICAgIHRoaXMueUF4aXMgPSBbXTtcblxuICAgIGZvciAobGV0IHkgPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5taW5ZOyB5IDw9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLm1heFk7IHkgPSB5ICsgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UuZGlmZikge1xuICAgICAgY29uc3QgcmVjdEVuZCA9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnhQYWRkaW5nICsgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UucmVjdFdpZHRoO1xuICAgICAgY29uc3QgeVRyYW5zZm9ybWVkID0gdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UudHJhbnNmb3JtWSh0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5tYXhZIC0geSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS55UGFkZGluZztcbiAgICAgIGNvbnN0IHBhdGggPSAnTSAnICsgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UueFBhZGRpbmcgKyAnICcgKyB5VHJhbnNmb3JtZWQgKyAnIEwgJyArIHJlY3RFbmQgKyAnICcgKyB5VHJhbnNmb3JtZWQ7XG4gICAgICB0aGlzLnlMZXZlbFBhdGhzLnB1c2gocGF0aCk7XG4gICAgICB0aGlzLnlBeGlzLnB1c2goe3lQb3M6IHlUcmFuc2Zvcm1lZCwgdmFsdWU6IHkgfSk7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2RpZmY6ICcgKyB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5kaWZmKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnlBeGlzKTtcblxuICAgIC8vIG5vdyB0aGUgeCBheGlzIDopXG5cbiAgICAvLyBsZXQgbm9PZlhBeGlzVmFsdWVzO1xuICAgIC8vIG5vT2ZYQXhpc1ZhbHVlcyA9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLmRhdGEubGVuZ3RoO1xuICAgIC8vIGNvbnN0IGVhY2hXaWR0aCA9IHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnJlY3RXaWR0aCAvIG5vT2ZYQXhpc1ZhbHVlcztcbiAgICAvLyBsZXQgY250ID0gLTE7XG4gICAgLy8gZm9yIChjb25zdCBiY0Qgb2YgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UuZGF0YSkge1xuICAgIC8vICAgY250ICsrO1xuICAgIC8vICAgY29uc3QgeFBvcyA9IGNudCAqIGVhY2hXaWR0aCArIGVhY2hXaWR0aCAvIDIgKyB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS54UGFkZGluZztcbiAgICAvLyAgIHRoaXMueEF4aXMucHVzaCh7eFBvcywgdmFsdWU6IGJjRC5uYW1lfSk7XG4gICAgLy8gfVxuXG4gICAgbGV0IG5vT2ZYQXhpc1ZhbHVlcztcbiAgICBsZXQgdW5pcXVlWEF4aXNWYWx1ZXM7XG4gICAgdW5pcXVlWEF4aXNWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2YgdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UuZGF0YSkge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5kYXRhO1xuICAgICAgZm9yIChjb25zdCBzRGF0YSBvZiBzZXJpZXNEYXRhKSB7XG4gICAgICAgIHVuaXF1ZVhBeGlzVmFsdWVzLmFkZChzRGF0YS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9PZlhBeGlzVmFsdWVzID0gdW5pcXVlWEF4aXNWYWx1ZXMuc2l6ZTtcbiAgICBjb25zdCBlYWNoV2lkdGggPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5yZWN0V2lkdGggLyBub09mWEF4aXNWYWx1ZXM7XG4gICAgbGV0IGNudCA9IC0xO1xuICAgIGZvciAoY29uc3QgeEF4aXNWYWx1ZSBvZiB1bmlxdWVYQXhpc1ZhbHVlcykge1xuICAgICAgY250ICsrO1xuICAgICAgY29uc3QgeFBvcyA9IGNudCAqIGVhY2hXaWR0aCArIGVhY2hXaWR0aCAvIDIgKyB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS54UGFkZGluZztcbiAgICAgIHRoaXMueEF4aXMucHVzaCh7eFBvcywgdmFsdWU6IHhBeGlzVmFsdWUgfSk7XG4gICAgfVxuXG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlOiBDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcHV0ZUdyaWQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuY29tcHV0ZUdyaWQoKTtcbiAgfVxuXG59XG4iXX0=