UNPKG

ngx-beautiful-charts

Version:
192 lines 21.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component } from '@angular/core'; import { GanttChartService } from '../gantt-chart.service'; export class GcChartBaseComponent { // ganttChartData = [ // { // name: 'Market Team', // color: '#EAC435', // timelines: { // 'Market Research': [ // {from: new Date('June 9, 2019'), to: new Date('July 20, 2019')}, // {from: new Date('October 9, 2019'), to: new Date('November 20, 2019')} // ], // 'User Documentation': [ // {from: new Date('August 10, 2019'), to: new Date('September 15, 2019')} // ] // } // }, // { // name: 'Development Team', // color: '#345995', // timelines: { // 'Software Development': [ // {from: new Date('July 9, 2019'), to: new Date('October 20, 2019')} // ], // 'Testing': [ // {from: new Date('October 25, 2019'), to: new Date('November 15, 2019')} // ], // 'User Documentation': [ // {from: new Date('August 1, 2019'), to: new Date('August 15, 2019')} // ] // } // } // ]; /** * @param {?} ganttChartService */ constructor(ganttChartService) { this.ganttChartService = ganttChartService; this.monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; } /** * @param {?} date * @param {?} days * @return {?} */ addDays(date, days) { /** @type {?} */ const newdate = new Date(date); newdate.setDate((new Date(date)).getDate() + days); /** @type {?} */ const day = newdate.getDate(); /** @type {?} */ const monthIndex = newdate.getMonth(); /** @type {?} */ const year = newdate.getFullYear(); return this.monthNames[monthIndex] + ' ' + day + ', ' + year; } /** * @param {?} date * @return {?} */ shortenDate(date) { date = date.replace('January', 'Jan'); date = date.replace('February', 'Feb'); date = date.replace('March', 'Mar'); date = date.replace('April', 'Apr'); date = date.replace('May', 'May'); date = date.replace('June', 'Jun'); date = date.replace('July', 'Jul'); date = date.replace('August', 'Aug'); date = date.replace('September', 'Sep'); date = date.replace('October', 'Oct'); date = date.replace('November', 'Nov'); date = date.replace('December', 'Dec'); return date; } /** * @return {?} */ computeGrid() { // compute the min date and max date // const oneDay = 24 * 60 * 60 * 1000; // const dateRange = Math.round(Math.abs( // (this.ganttChartService.ganttMaxDate.getTime() // - this.ganttChartService.ganttMinDate.getTime() // ) / (oneDay))); /** @type {?} */ let flag = 0; /** @type {?} */ let qts = 1; // 3m --> 1 week --> 12 // 6m --> 2 weeks --> 12 // 9m --> 3 weeks --> 12 while (flag === 0) { if (this.ganttChartService.ganttDateRange <= 90 * qts) { this.gridPrecisionX = 7 * qts; flag = 1; } else qts = qts + 1; } // console.log(this.gridPrecisionX); this.gridWidthX = this.ganttChartService.transformX(this.gridPrecisionX); this.gridWidthY = this.ganttChartService.rectHeight / this.ganttChartService.ganttPhases.length; this.gridPath = 'M ' + this.gridWidthX + ' 0 L 0 0 0 ' + this.gridWidthY; this.xAxis = []; this.yAxis = []; /** @type {?} */ let date = this.ganttChartService.ganttMinDate; // let xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150; /** @type {?} */ const yTrans = this.ganttChartService.rectHeight + this.ganttChartService.yPadding + 10; // let transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)'; // this.xAxis.push({xPos: xPos, value: date, transform: transform}); // console.log(date); // console.log('max date: ' + this.ganttChartService.ganttMaxDate); // console.log('date: ' + date); while (new Date(date) <= new Date(this.ganttChartService.ganttMaxDate)) { // console.log('date: ' + date); // console.log(date); /** @type {?} */ const xPos = this.ganttChartService.transformGanttDate(date) + this.ganttChartService.xPadding + 150; /** @type {?} */ const transform = 'translate(' + xPos + 'px, ' + yTrans + 'px)'; this.xAxis.push({ xPos, value: this.shortenDate(date), transform }); date = this.addDays(date, this.gridPrecisionX); } // console.log(this.xAxis); /** @type {?} */ let cnt = 0; for (const phase of this.ganttChartService.ganttPhases) { /** @type {?} */ const yPos = this.gridWidthY * cnt + this.gridWidthY * 0.5 + this.ganttChartService.yPadding; this.yAxis.push({ yPos, value: phase }); cnt++; } } /** * @return {?} */ ngOnInit() { this.computeGrid(); this.gridID = 'grid' + this.ganttChartService.componentID; } /** * @return {?} */ ngOnChanges() { this.computeGrid(); } } GcChartBaseComponent.decorators = [ { type: Component, args: [{ selector: 'g[ngx-gc-chart-base]', template: "<svg:pattern [attr.id]=\"gridID\" \n[attr.x]=\"ganttChartService.xPadding + 150\" [attr.y]=\"ganttChartService.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]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding\" \n[attr.width]=\"ganttChartService.rectWidth\" \n[attr.height]=\"ganttChartService.rectHeight\" \nstroke=\"#444444\" [attr.fill]=\"'url(#' + gridID + ')'\" stroke-width=\"1\"/>\n\n<svg:g *ngFor=\"let x of xAxis\" [ngStyle]=\"{'transform': x.transform}\">\n<svg:text class=\"x-axis-text small\" text-anchor=\"end\" dominant-baseline=\"middle\"> {{ x.value }} </svg:text>\n</svg:g>\n\n<svg:text\n*ngFor=\"let y of yAxis\" class=\"y-axis-text small\" text-anchor=\"end\"\n[attr.y]=\"y.yPos\" [attr.x]=\"150+ganttChartService.xPadding-30\">{{ y.value }}</svg:text>\n\n\n<!-- Legion -->\n<svg:rect [attr.x]=\"ganttChartService.xPadding + 150\" \n[attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight\" \n[attr.width]=\"ganttChartService.legionWidth\" \n[attr.height]=\"ganttChartService.legionHeight\" \nfill=\"#f1f1f1\" />\n\n\n<svg:g *ngFor=\"let legionLine of ganttChartService.legion; index as i\">\n <svg:g *ngFor=\"let legionEntry of legionLine; index as j\">\n <svg:rect *ngIf=\"ganttChartService.legionWidth\" \n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * 0.1 + ganttChartService.legionWidth / 3 * j\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 10\" \n [attr.width]=\"ganttChartService.legionWidth / 3 * 0.2\" \n [attr.height]=\"20\" \n rx=\"6\" ry=\"6\"\n [attr.fill]=\"legionEntry.color\" />\n\n <!-- <svg:path class=\"legion-line\" [attr.d]=\"computeLegionPath(i)\" fill=\"none\" [attr.stroke]=\"x.color\" /> -->\n <svg:text class=\"axis-text\" dominant-baseline=\"middle\"\n [attr.x]=\"ganttChartService.xPadding + 150 + ganttChartService.legionWidth / 3 * j + ganttChartService.legionWidth / 3 * 0.4\" \n [attr.y]=\"ganttChartService.yPadding * 2 + 100 + ganttChartService.rectHeight + 20 + 40*i + 20\" class=\"small\"> {{ legionEntry.name }} </svg:text>\n </svg:g>\n</svg:g>\n", styles: [".x-axis-text{-webkit-transform:rotate(320deg);transform:rotate(320deg)}"] }] } ]; /** @nocollapse */ GcChartBaseComponent.ctorParameters = () => [ { type: GanttChartService } ]; if (false) { /** @type {?} */ GcChartBaseComponent.prototype.gridWidthX; /** @type {?} */ GcChartBaseComponent.prototype.gridWidthY; /** @type {?} */ GcChartBaseComponent.prototype.gridPrecisionX; /** @type {?} */ GcChartBaseComponent.prototype.gridID; /** @type {?} */ GcChartBaseComponent.prototype.gridPath; /** @type {?} */ GcChartBaseComponent.prototype.xAxis; /** @type {?} */ GcChartBaseComponent.prototype.yAxis; /** @type {?} */ GcChartBaseComponent.prototype.monthNames; /** @type {?} */ GcChartBaseComponent.prototype.ganttChartService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9nYW50dC1jaGFydC9nYy1jaGFydC1iYXNlL2djLWNoYXJ0LWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU8zRCxNQUFNLE9BQU8sb0JBQW9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBOEQvQixZQUFtQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWpEdkQsZUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7SUE0Q3lELENBQUM7Ozs7OztJQXpDNUQsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFZOztjQUNsQixPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDOztjQUM3QyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTs7Y0FDdkIsVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUU7O2NBQy9CLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFO1FBR2xDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElB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QUFtQjs7SUFDbkIsMENBQW1COztJQUVuQiw4Q0FBdUI7O0lBRXZCLHNDQUFlOztJQUNmLHdDQUFpQjs7SUFFakIscUNBQVc7O0lBQ1gscUNBQVc7O0lBRVgsMENBS0U7O0lBNENVLGlEQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHYW50dENoYXJ0U2VydmljZSB9IGZyb20gJy4uL2dhbnR0LWNoYXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW25neC1nYy1jaGFydC1iYXNlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYy1jaGFydC1iYXNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2MtY2hhcnQtYmFzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdjQ2hhcnRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIGdyaWRXaWR0aFg6IG51bWJlcjtcbiAgZ3JpZFdpZHRoWTogbnVtYmVyO1xuXG4gIGdyaWRQcmVjaXNpb25YOiBudW1iZXI7XG5cbiAgZ3JpZElEOiBzdHJpbmc7XG4gIGdyaWRQYXRoOiBzdHJpbmc7XG5cbiAgeEF4aXM6IGFueTtcbiAgeUF4aXM6IGFueTtcblxuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJyxcbiAgICAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsXG4gICAgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsXG4gICAgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICBdO1xuXG5cbiAgYWRkRGF5cyhkYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgbmV3ZGF0ZS5zZXREYXRlKChuZXcgRGF0ZShkYXRlKSkuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgY29uc3QgZGF5ID0gbmV3ZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG5ld2RhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbmV3ZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5tb250aE5hbWVzW21vbnRoSW5kZXhdICsgJyAnICsgZGF5ICsgJywgJyArIHllYXI7XG4gIH1cbiAgLy8gZ2FudHRDaGFydERhdGEgPSBbXG4gIC8vICAge1xuICAvLyAgICAgbmFtZTogJ01hcmtldCBUZWFtJyxcbiAgLy8gICAgIGNvbG9yOiAnI0VBQzQzNScsXG4gIC8vICAgICB0aW1lbGluZXM6IHtcbiAgLy8gICAgICAgJ01hcmtldCBSZXNlYXJjaCc6IFtcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ0p1bmUgOSwgMjAxOScpLCB0bzogbmV3IERhdGUoJ0p1bHkgMjAsIDIwMTknKX0sXG4gIC8vICAgICAgICAge2Zyb206IG5ldyBEYXRlKCdPY3RvYmVyIDksIDIwMTknKSwgdG86IG5ldyBEYXRlKCdOb3ZlbWJlciAyMCwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVXNlciBEb2N1bWVudGF0aW9uJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnQXVndXN0IDEwLCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnU2VwdGVtYmVyIDE1LCAyMDE5Jyl9XG4gIC8vICAgICAgIF1cbiAgLy8gICAgIH1cbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIG5hbWU6ICdEZXZlbG9wbWVudCBUZWFtJyxcbiAgLy8gICAgIGNvbG9yOiAnIzM0NTk5NScsXG4gIC8vICAgICB0aW1lbGluZXM6IHtcbiAgLy8gICAgICAgJ1NvZnR3YXJlIERldmVsb3BtZW50JzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnSnVseSA5LCAyMDE5JyksIHRvOiBuZXcgRGF0ZSgnT2N0b2JlciAyMCwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVGVzdGluZyc6IFtcbiAgLy8gICAgICAgICB7ZnJvbTogbmV3IERhdGUoJ09jdG9iZXIgMjUsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdOb3ZlbWJlciAxNSwgMjAxOScpfVxuICAvLyAgICAgICBdLFxuICAvLyAgICAgICAnVXNlciBEb2N1bWVudGF0aW9uJzogW1xuICAvLyAgICAgICAgIHtmcm9tOiBuZXcgRGF0ZSgnQXVndXN0IDEsIDIwMTknKSwgdG86IG5ldyBEYXRlKCdBdWd1c3QgMTUsIDIwMTknKX1cbiAgLy8gICAgICAgXVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZ2FudHRDaGFydFNlcnZpY2U6IEdhbnR0Q2hhcnRTZXJ2aWNlKSB7IH1cblxuICBzaG9ydGVuRGF0ZShkYXRlKSB7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnSmFudWFyeScsICdKYW4nKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdGZWJydWFyeScsICdGZWInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdNYXJjaCcsICdNYXInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdBcHJpbCcsICdBcHInKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdNYXknLCAnTWF5Jyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnSnVuZScsICdKdW4nKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdKdWx5JywgJ0p1bCcpO1xuICAgIGRhdGUgPSBkYXRlLnJlcGxhY2UoJ0F1Z3VzdCcsICdBdWcnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdTZXB0ZW1iZXInLCAnU2VwJyk7XG4gICAgZGF0ZSA9IGRhdGUucmVwbGFjZSgnT2N0b2JlcicsICdPY3QnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdOb3ZlbWJlcicsICdOb3YnKTtcbiAgICBkYXRlID0gZGF0ZS5yZXBsYWNlKCdEZWNlbWJlcicsICdEZWMnKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGNvbXB1dGVHcmlkKCkge1xuICAgIC8vIGNvbXB1dGUgdGhlIG1pbiBkYXRlIGFuZCBtYXggZGF0ZVxuICAgIC8vIGNvbnN0IG9uZURheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgLy8gY29uc3QgZGF0ZVJhbmdlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAvLyAgICAgKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNYXhEYXRlLmdldFRpbWUoKVxuICAgIC8vICAgICAgLSB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0TWluRGF0ZS5nZXRUaW1lKClcbiAgICAvLyAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIGxldCBmbGFnID0gMDtcbiAgICBsZXQgcXRzID0gMTtcblxuICAgIC8vIDNtIC0tPiAxIHdlZWsgIC0tPiAxMlxuICAgIC8vIDZtIC0tPiAyIHdlZWtzIC0tPiAxMlxuICAgIC8vIDltIC0tPiAzIHdlZWtzIC0tPiAxMlxuXG4gICAgd2hpbGUgKGZsYWcgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmdhbnR0RGF0ZVJhbmdlIDw9IDkwICogcXRzKSB7XG4gICAgICAgIHRoaXMuZ3JpZFByZWNpc2lvblggPSA3ICogcXRzO1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgIH0gZWxzZSBxdHMgPSBxdHMgKyAxO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuXG4gICAgdGhpcy5ncmlkV2lkdGhYID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1YKHRoaXMuZ3JpZFByZWNpc2lvblgpO1xuICAgIHRoaXMuZ3JpZFdpZHRoWSA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UucmVjdEhlaWdodCAvIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRQaGFzZXMubGVuZ3RoO1xuICAgIHRoaXMuZ3JpZFBhdGggPSAnTSAnICsgdGhpcy5ncmlkV2lkdGhYICsgJyAwIEwgMCAwIDAgJyArIHRoaXMuZ3JpZFdpZHRoWTtcblxuICAgIHRoaXMueEF4aXMgPSBbXTtcbiAgICB0aGlzLnlBeGlzID0gW107XG5cbiAgICBsZXQgZGF0ZSA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNaW5EYXRlO1xuICAgIC8vIGxldCB4UG9zID0gdGhpcy5nYW50dENoYXJ0U2VydmljZS50cmFuc2Zvcm1HYW50dERhdGUoZGF0ZSkgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnhQYWRkaW5nICsgMTUwO1xuICAgIGNvbnN0IHlUcmFucyA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UucmVjdEhlaWdodCArIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UueVBhZGRpbmcgKyAxMDtcbiAgICAvLyBsZXQgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgnICsgeFBvcyArICdweCwgJyArIHlUcmFucyArICdweCknO1xuICAgIC8vIHRoaXMueEF4aXMucHVzaCh7eFBvczogeFBvcywgdmFsdWU6IGRhdGUsIHRyYW5zZm9ybTogdHJhbnNmb3JtfSk7XG4gICAgLy8gY29uc29sZS5sb2coZGF0ZSk7XG4gICAgLy8gY29uc29sZS5sb2coJ21heCBkYXRlOiAnICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS5nYW50dE1heERhdGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdkYXRlOiAnICsgZGF0ZSk7XG4gICAgd2hpbGUgKG5ldyBEYXRlKGRhdGUpIDw9IG5ldyBEYXRlKHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRNYXhEYXRlKSkge1xuICAgICAgLy8gY29uc29sZS5sb2coJ2RhdGU6ICcgKyBkYXRlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGUpO1xuICAgICAgY29uc3QgeFBvcyA9IHRoaXMuZ2FudHRDaGFydFNlcnZpY2UudHJhbnNmb3JtR2FudHREYXRlKGRhdGUpICsgdGhpcy5nYW50dENoYXJ0U2VydmljZS54UGFkZGluZyArIDE1MDtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoJyArIHhQb3MgKyAncHgsICcgKyB5VHJhbnMgKyAncHgpJztcbiAgICAgIHRoaXMueEF4aXMucHVzaCh7eFBvcywgdmFsdWU6IHRoaXMuc2hvcnRlbkRhdGUoZGF0ZSksIHRyYW5zZm9ybX0pO1xuICAgICAgZGF0ZSA9IHRoaXMuYWRkRGF5cyhkYXRlLCB0aGlzLmdyaWRQcmVjaXNpb25YKTtcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnhBeGlzKTtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGNvbnN0IHBoYXNlIG9mIHRoaXMuZ2FudHRDaGFydFNlcnZpY2UuZ2FudHRQaGFzZXMpIHtcbiAgICAgIGNvbnN0IHlQb3MgPSB0aGlzLmdyaWRXaWR0aFkgKiBjbnQgKyB0aGlzLmdyaWRXaWR0aFkgKiAwLjUgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLnlQYWRkaW5nO1xuICAgICAgdGhpcy55QXhpcy5wdXNoKHt5UG9zLCB2YWx1ZTogcGhhc2UgfSk7XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXB1dGVHcmlkKCk7XG4gICAgdGhpcy5ncmlkSUQgPSAnZ3JpZCcgKyB0aGlzLmdhbnR0Q2hhcnRTZXJ2aWNlLmNvbXBvbmVudElEO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5jb21wdXRlR3JpZCgpO1xuICB9XG59XG4iXX0=