UNPKG

ngx-beautiful-charts

Version:
153 lines 15.9 kB
/** * @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=