ngx-beautiful-charts
Version:
A library to create charts in Angular
252 lines • 23.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// @Injectable({
// providedIn: BeautifulChartsModule
// })
export class GanttChartService {
constructor() {
this.monthNames = [
'January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
];
}
/**
* @return {?}
*/
computeRectDimensions() {
this.rectWidth = this.width - this.xPadding * 2 - 150;
this.rectHeight = this.ganttPhases.length * 60;
}
/**
* @return {?}
*/
computeLegionDimensions() {
/** @type {?} */
const noOfLines = Math.ceil(this.data.length / 3);
this.legionWidth = this.width - this.xPadding * 2 - 150;
this.legionHeight = 40 + 40 * noOfLines;
}
/**
* @param {?} x
* @return {?}
*/
transformX(x) {
return this.rectWidth * x / (this.maxX - this.minX);
}
/**
* @return {?}
*/
computeLegion() {
/** @type {?} */
const noOfLines = Math.ceil(this.data.length / 3);
this.legion = [];
/** @type {?} */
let cnt = 0;
for (let line = 0; line < noOfLines; line++) {
/** @type {?} */
const legionLine = [];
for (let i = 0; i < 3; i++) {
if (this.ganttTeams[cnt])
legionLine.push(this.ganttTeams[cnt]);
cnt++;
}
this.legion.push(legionLine);
}
// console.log(this.legion);
}
/**
* @param {?} d
* @return {?}
*/
transformGanttDate(d) {
/** @type {?} */
const oneDay = 24 * 60 * 60 * 1000;
/** @type {?} */
const daysSinceMinDate = Math.round(Math.abs((new Date(d).getTime()
- (new Date(this.ganttMinDate)).getTime()) / (oneDay)));
return this.rectWidth * daysSinceMinDate / (this.maxX - this.minX);
}
/**
* @param {?} factor
* @param {?} num
* @return {?}
*/
closestMultipleLessThanEqualTo(factor, num) {
if (num % factor === 0)
return num;
else
return this.closestMultipleLessThanEqualTo(factor, num - 1);
}
/**
* @param {?} factor
* @param {?} num
* @return {?}
*/
closestMultipleMoreThanEqualTo(factor, num) {
if (num % factor === 0)
return num;
else
return this.closestMultipleMoreThanEqualTo(factor, num + 1);
}
/**
* @param {?} __0
* @return {?}
*/
setValues({ componentID: componentID, width: width, xPadding: xPadding, yPadding: yPadding, data: data }) {
this.componentID = componentID;
this.width = width;
this.xPadding = xPadding;
this.yPadding = yPadding;
this.data = data;
// console.log('service color scheme: ' + this.colorScheme)
/** @type {?} */
const froms = [];
/** @type {?} */
const tos = [];
/** @type {?} */
const phases = new Set();
this.ganttTeams = [];
// this.setColors();
// console.log(this.data);
for (const team of this.data) {
this.ganttTeams.push({ name: team.name, color: team.color });
for (const phase of Object.keys(team.timelines)) {
phases.add(phase);
for (const timeline of team.timelines[phase]) {
froms.push(timeline.from);
tos.push(timeline.to);
}
}
}
this.ganttPhases = Array.from(phases);
// console.log('phase timelines: ');
// console.log(this.phaseTimelines);
/** @type {?} */
const minDate = froms.reduce((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => new Date(a) < new Date(b) ? a : b));
/** @type {?} */
const maxDate = tos.reduce((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => new Date(a) > new Date(b) ? a : b));
this.ganttMinDate = minDate;
this.ganttMaxDate = maxDate;
// console.log(this.ganttMinDate + ' - ' + this.ganttMaxDate);
/** @type {?} */
const noOfLines = Math.ceil(this.data.length / 3);
this.height = this.ganttPhases.length * 60 + this.yPadding * 3 + 100 + 40 + 30 * noOfLines;
/** @type {?} */
const oneDay = 24 * 60 * 60 * 1000;
this.ganttDateRange = Math.round(Math.abs((new Date(this.ganttMaxDate).getTime()
- new Date(this.ganttMinDate).getTime()) / (oneDay)));
// console.log('Date Range: ');
// console.log(this.ganttDateRange);
this.minX = 0;
// this.maxX = this.ganttDateRange;
/** @type {?} */
let flag = 0;
/** @type {?} */
let qts = 1;
/** @type {?} */
let gridPrecisionX = 0;
while (flag === 0) {
if (this.ganttDateRange <= 90 * qts) {
gridPrecisionX = 7 * qts;
flag = 1;
break;
}
else {
qts = qts + 1;
}
}
this.maxX = this.closestMultipleMoreThanEqualTo(7 * qts, this.ganttDateRange);
this.ganttMaxDate = this.addDays(this.ganttMinDate, this.maxX);
this.computeRectDimensions();
this.computeLegionDimensions();
this.computeLegion();
// this.printAll();
}
/**
* @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;
}
/**
* @return {?}
*/
printAll() {
console.log('line-graph-service');
console.log('component ID: ' + this.componentID);
console.log('width: ' + this.width);
console.log('height: ' + this.height);
console.log('xPadding: ' + this.xPadding);
console.log('yPadding: ' + this.yPadding);
console.log('rectWidth: ' + this.rectWidth);
console.log('rectHeight: ' + this.rectHeight);
}
}
if (false) {
/** @type {?} */
GanttChartService.prototype.width;
/** @type {?} */
GanttChartService.prototype.height;
/** @type {?} */
GanttChartService.prototype.ganttTeams;
/** @type {?} */
GanttChartService.prototype.ganttPhases;
/** @type {?} */
GanttChartService.prototype.phaseTimelines;
/** @type {?} */
GanttChartService.prototype.legion;
/** @type {?} */
GanttChartService.prototype.ganttMinDate;
/** @type {?} */
GanttChartService.prototype.ganttMaxDate;
/** @type {?} */
GanttChartService.prototype.ganttDateRange;
/** @type {?} */
GanttChartService.prototype.xPadding;
/** @type {?} */
GanttChartService.prototype.yPadding;
/** @type {?} */
GanttChartService.prototype.componentID;
/** @type {?} */
GanttChartService.prototype.data;
/** @type {?} */
GanttChartService.prototype.rectWidth;
/** @type {?} */
GanttChartService.prototype.rectHeight;
/** @type {?} */
GanttChartService.prototype.legionWidth;
/** @type {?} */
GanttChartService.prototype.legionHeight;
/** @type {?} */
GanttChartService.prototype.minX;
/** @type {?} */
GanttChartService.prototype.maxX;
/** @type {?} */
GanttChartService.prototype.monthNames;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2dhbnR0LWNoYXJ0L2dhbnR0LWNoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BLE1BQU0sT0FBTyxpQkFBaUI7SUE4QjVCO1FBUEEsZUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7SUFFYyxDQUFDOzs7O0lBRWpCLHFCQUFxQjtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCx1QkFBdUI7O2NBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUMxQyxDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0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QUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGOzs7SUE5S0Msa0NBQWM7O0lBQ2QsbUNBQWU7O0lBQ2YsdUNBQXVCOztJQUN2Qix3Q0FBd0I7O0lBQ3hCLDJDQUFlOztJQUNmLG1DQUFPOztJQUNQLHlDQUFhOztJQUNiLHlDQUFhOztJQUNiLDJDQUF1Qjs7SUFDdkIscUNBQWlCOztJQUNqQixxQ0FBaUI7O0lBQ2pCLHdDQUFvQjs7SUFDcEIsaUNBQVU7O0lBRVYsc0NBQWtCOztJQUNsQix1Q0FBbUI7O0lBQ25CLHdDQUFvQjs7SUFDcEIseUNBQXFCOztJQUNyQixpQ0FBYTs7SUFDYixpQ0FBYTs7SUFFYix1Q0FLRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlYXV0aWZ1bENoYXJ0c01vZHVsZSB9IGZyb20gJy4uL2JlYXV0aWZ1bC1jaGFydHMubW9kdWxlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcblxuLy8gQEluamVjdGFibGUoe1xuLy8gICBwcm92aWRlZEluOiBCZWF1dGlmdWxDaGFydHNNb2R1bGVcbi8vIH0pXG5leHBvcnQgY2xhc3MgR2FudHRDaGFydFNlcnZpY2Uge1xuXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBnYW50dFRlYW1zOiBBcnJheTxhbnk+O1xuICBnYW50dFBoYXNlczogQXJyYXk8YW55PjtcbiAgcGhhc2VUaW1lbGluZXM7XG4gIGxlZ2lvbjtcbiAgZ2FudHRNaW5EYXRlO1xuICBnYW50dE1heERhdGU7XG4gIGdhbnR0RGF0ZVJhbmdlOiBudW1iZXI7XG4gIHhQYWRkaW5nOiBudW1iZXI7XG4gIHlQYWRkaW5nOiBudW1iZXI7XG4gIGNvbXBvbmVudElEOiBudW1iZXI7XG4gIGRhdGE6IGFueTtcblxuICByZWN0V2lkdGg6IG51bWJlcjtcbiAgcmVjdEhlaWdodDogbnVtYmVyO1xuICBsZWdpb25XaWR0aDogbnVtYmVyO1xuICBsZWdpb25IZWlnaHQ6IG51bWJlcjtcbiAgbWluWDogbnVtYmVyO1xuICBtYXhYOiBudW1iZXI7XG5cbiAgbW9udGhOYW1lcyA9IFtcbiAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsXG4gICAgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLFxuICAgICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLFxuICAgICdOb3ZlbWJlcicsICdEZWNlbWJlcidcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGNvbXB1dGVSZWN0RGltZW5zaW9ucygpIHtcbiAgICB0aGlzLnJlY3RXaWR0aCA9IHRoaXMud2lkdGggLSB0aGlzLnhQYWRkaW5nICogMiAtIDE1MDtcbiAgICB0aGlzLnJlY3RIZWlnaHQgPSB0aGlzLmdhbnR0UGhhc2VzLmxlbmd0aCAqIDYwO1xuICB9XG5cbiAgY29tcHV0ZUxlZ2lvbkRpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qgbm9PZkxpbmVzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS5sZW5ndGggLyAzKTtcbiAgICB0aGlzLmxlZ2lvbldpZHRoID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmcgKiAyIC0gMTUwO1xuICAgIHRoaXMubGVnaW9uSGVpZ2h0ID0gNDAgKyA0MCAqIG5vT2ZMaW5lcztcbiAgfVxuXG4gIHRyYW5zZm9ybVgoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjdFdpZHRoICogeCAvICh0aGlzLm1heFggLSB0aGlzLm1pblgpO1xuICB9XG5cbiAgY29tcHV0ZUxlZ2lvbigpIHtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMubGVnaW9uID0gW107XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChsZXQgbGluZSA9IDA7IGxpbmUgPCBub09mTGluZXM7IGxpbmUrKykge1xuICAgICAgY29uc3QgbGVnaW9uTGluZSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FudHRUZWFtc1tjbnRdKSBsZWdpb25MaW5lLnB1c2godGhpcy5nYW50dFRlYW1zW2NudF0pO1xuICAgICAgICBjbnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMubGVnaW9uLnB1c2gobGVnaW9uTGluZSk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubGVnaW9uKTtcbiAgfVxuXG4gIHRyYW5zZm9ybUdhbnR0RGF0ZShkKSB7XG4gICAgY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBkYXlzU2luY2VNaW5EYXRlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAgICAgKG5ldyBEYXRlKGQpLmdldFRpbWUoKVxuICAgICAgICAtIChuZXcgRGF0ZSh0aGlzLmdhbnR0TWluRGF0ZSkpLmdldFRpbWUoKVxuICAgICAgICApIC8gKG9uZURheSkpKTtcbiAgICByZXR1cm4gdGhpcy5yZWN0V2lkdGggKiBkYXlzU2luY2VNaW5EYXRlIC8gKHRoaXMubWF4WCAtIHRoaXMubWluWCk7XG4gIH1cblxuICBjbG9zZXN0TXVsdGlwbGVMZXNzVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0pIHtcbiAgICBpZiAobnVtICUgZmFjdG9yID09PSAwKSByZXR1cm4gbnVtO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY2xvc2VzdE11bHRpcGxlTGVzc1RoYW5FcXVhbFRvKGZhY3RvciwgbnVtIC0gMSk7XG4gIH1cblxuICBjbG9zZXN0TXVsdGlwbGVNb3JlVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0pIHtcbiAgICBpZiAobnVtICUgZmFjdG9yID09PSAwKSByZXR1cm4gbnVtO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY2xvc2VzdE11bHRpcGxlTW9yZVRoYW5FcXVhbFRvKGZhY3RvciwgbnVtICsgMSk7XG4gIH1cblxuXG4gIHNldFZhbHVlcyh7XG4gICAgY29tcG9uZW50SUQ6IGNvbXBvbmVudElELFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICB4UGFkZGluZzogeFBhZGRpbmcsXG4gICAgeVBhZGRpbmc6IHlQYWRkaW5nLFxuICAgIGRhdGE6IGRhdGFcbiAgfSkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSBjb21wb25lbnRJRDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy54UGFkZGluZyA9IHhQYWRkaW5nO1xuICAgIHRoaXMueVBhZGRpbmcgPSB5UGFkZGluZztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXJ2aWNlIGNvbG9yIHNjaGVtZTogJyArIHRoaXMuY29sb3JTY2hlbWUpXG5cbiAgICBjb25zdCBmcm9tcyA9IFtdO1xuICAgIGNvbnN0IHRvcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmdhbnR0VGVhbXMgPSBbXTtcbiAgICAvLyB0aGlzLnNldENvbG9ycygpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XG4gICAgZm9yIChjb25zdCB0ZWFtIG9mIHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5nYW50dFRlYW1zLnB1c2goe25hbWU6IHRlYW0ubmFtZSwgY29sb3I6IHRlYW0uY29sb3J9KTtcbiAgICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgT2JqZWN0LmtleXModGVhbS50aW1lbGluZXMpKSB7XG4gICAgICAgIHBoYXNlcy5hZGQocGhhc2UpO1xuICAgICAgICBmb3IgKGNvbnN0IHRpbWVsaW5lIG9mIHRlYW0udGltZWxpbmVzW3BoYXNlXSkge1xuICAgICAgICAgIGZyb21zLnB1c2godGltZWxpbmUuZnJvbSk7XG4gICAgICAgICAgdG9zLnB1c2godGltZWxpbmUudG8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2FudHRQaGFzZXMgPSBBcnJheS5mcm9tKHBoYXNlcyk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygncGhhc2UgdGltZWxpbmVzOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnBoYXNlVGltZWxpbmVzKTtcblxuICAgIGNvbnN0IG1pbkRhdGUgPSBmcm9tcy5yZWR1Y2UoKGEsIGIpID0+IG5ldyBEYXRlKGEpIDwgbmV3IERhdGUoYikgPyBhIDogYiApO1xuICAgIGNvbnN0IG1heERhdGUgPSB0b3MucmVkdWNlKChhLCBiKSA9PiBuZXcgRGF0ZShhKSA+IG5ldyBEYXRlKGIpID8gYSA6IGIgKTtcblxuICAgIHRoaXMuZ2FudHRNaW5EYXRlID0gbWluRGF0ZTtcbiAgICB0aGlzLmdhbnR0TWF4RGF0ZSA9IG1heERhdGU7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5nYW50dE1pbkRhdGUgKyAnIC0gJyArIHRoaXMuZ2FudHRNYXhEYXRlKTtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5nYW50dFBoYXNlcy5sZW5ndGggKiA2MCArIHRoaXMueVBhZGRpbmcgKiAzICsgMTAwICsgNDAgKyAzMCAqIG5vT2ZMaW5lcztcblxuICAgIGNvbnN0IG9uZURheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgdGhpcy5nYW50dERhdGVSYW5nZSA9IE1hdGgucm91bmQoTWF0aC5hYnMoXG4gICAgICAgIChuZXcgRGF0ZSh0aGlzLmdhbnR0TWF4RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgIC0gbmV3IERhdGUodGhpcy5nYW50dE1pbkRhdGUpLmdldFRpbWUoKVxuICAgICAgICApIC8gKG9uZURheSkpKTtcbiAgICAvLyBjb25zb2xlLmxvZygnRGF0ZSBSYW5nZTogJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5nYW50dERhdGVSYW5nZSk7XG4gICAgdGhpcy5taW5YID0gMDtcbiAgICAvLyB0aGlzLm1heFggPSB0aGlzLmdhbnR0RGF0ZVJhbmdlO1xuICAgIGxldCBmbGFnID0gMDtcbiAgICBsZXQgcXRzID0gMTtcbiAgICBsZXQgZ3JpZFByZWNpc2lvblggPSAwO1xuICAgIHdoaWxlIChmbGFnID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5nYW50dERhdGVSYW5nZSA8PSA5MCAqIHF0cykge1xuICAgICAgICBncmlkUHJlY2lzaW9uWCA9IDcgKiBxdHM7XG4gICAgICAgIGZsYWcgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7IHF0cyA9IHF0cyArIDE7IH1cbiAgICB9XG5cbiAgICB0aGlzLm1heFggPSB0aGlzLmNsb3Nlc3RNdWx0aXBsZU1vcmVUaGFuRXF1YWxUbyg3ICogcXRzLCB0aGlzLmdhbnR0RGF0ZVJhbmdlKTtcbiAgICB0aGlzLmdhbnR0TWF4RGF0ZSA9IHRoaXMuYWRkRGF5cyh0aGlzLmdhbnR0TWluRGF0ZSwgdGhpcy5tYXhYKTtcblxuICAgIHRoaXMuY29tcHV0ZVJlY3REaW1lbnNpb25zKCk7XG4gICAgdGhpcy5jb21wdXRlTGVnaW9uRGltZW5zaW9ucygpO1xuICAgIHRoaXMuY29tcHV0ZUxlZ2lvbigpO1xuICAgIC8vIHRoaXMucHJpbnRBbGwoKTtcbiAgfVxuXG4gIGFkZERheXMoZGF0ZSwgZGF5czogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV3ZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIG5ld2RhdGUuc2V0RGF0ZSgobmV3IERhdGUoZGF0ZSkpLmdldERhdGUoKSArIGRheXMpO1xuICAgIGNvbnN0IGRheSA9IG5ld2RhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoSW5kZXggPSBuZXdkYXRlLmdldE1vbnRoKCk7XG4gICAgY29uc3QgeWVhciA9IG5ld2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuXG4gICAgcmV0dXJuIHRoaXMubW9udGhOYW1lc1ttb250aEluZGV4XSArICcgJyArIGRheSArICcsICcgKyB5ZWFyO1xuICB9XG5cbiAgcHJpbnRBbGwoKSB7XG4gICAgY29uc29sZS5sb2coJ2xpbmUtZ3JhcGgtc2VydmljZScpO1xuICAgIGNvbnNvbGUubG9nKCdjb21wb25lbnQgSUQ6ICcgKyB0aGlzLmNvbXBvbmVudElEKTtcbiAgICBjb25zb2xlLmxvZygnd2lkdGg6ICcgKyB0aGlzLndpZHRoKTtcbiAgICBjb25zb2xlLmxvZygnaGVpZ2h0OiAnICsgdGhpcy5oZWlnaHQpO1xuICAgIGNvbnNvbGUubG9nKCd4UGFkZGluZzogJyArIHRoaXMueFBhZGRpbmcpO1xuICAgIGNvbnNvbGUubG9nKCd5UGFkZGluZzogJyArIHRoaXMueVBhZGRpbmcpO1xuICAgIGNvbnNvbGUubG9nKCdyZWN0V2lkdGg6ICcgKyB0aGlzLnJlY3RXaWR0aCk7XG4gICAgY29uc29sZS5sb2coJ3JlY3RIZWlnaHQ6ICcgKyB0aGlzLnJlY3RIZWlnaHQpO1xuICB9XG59XG4iXX0=