ng-d3-graphs
Version:
<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>
153 lines • 21.2 kB
JavaScript
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import * as d3 from 'd3';
import * as i0 from "@angular/core";
export var AxisDirection;
(function (AxisDirection) {
AxisDirection["top"] = "top";
AxisDirection["right"] = "right";
AxisDirection["bottom"] = "bottom";
AxisDirection["left"] = "left";
})(AxisDirection || (AxisDirection = {}));
var D3Service = /** @class */ (function () {
function D3Service() {
}
D3Service.prototype.translate = function (x, y) {
return "translate(" + x + ", " + y + ")";
};
D3Service.prototype.factoryAxis = function (scale, direction) {
switch (direction) {
case AxisDirection.top:
return d3.axisTop(scale);
case AxisDirection.right:
return d3.axisRight(scale);
case AxisDirection.bottom:
return d3.axisBottom(scale);
case AxisDirection.left:
return d3.axisLeft(scale);
default:
return new Error('No axis Direction Provided');
}
};
D3Service.prototype.factoryLine = function () {
return d3.line().x(function (d) { return d.x; }).y(function (d) { return d.y; });
};
// ==== Axis =====
D3Service.prototype.scaleLinearX = function (labels, width) {
return d3.scaleLinear()
.domain(d3.extent(labels)) // does the magic for adjustable axis
.range([0, width]);
};
D3Service.prototype.scaleLinearY = function (data, height) {
return d3.scaleLinear()
.domain(d3.extent(data)) // does the magic for adjustable axis
.range([height, 0]);
};
D3Service.prototype.scaleBandX = function (labels, width) {
return d3.scaleBand().domain(labels).rangeRound([0, width]).padding(0.1);
};
D3Service.prototype.scaleLinearYRangeRound = function (data, height) {
return d3.scaleLinear().domain([0, Math.max.apply(Math, tslib_1.__spread(data))]).rangeRound([
height, 0
]);
};
D3Service.prototype.addLabelAxisY = function (svg, height, options) {
svg.append('text')
.attr('transform', 'rotate(-90)')
.attr('y', 0 - options.margin.left)
.attr('x', 0 - height / 2)
.attr('dy', '1em')
.style('text-anchor', 'middle')
.text(options.yAxisLabel);
};
D3Service.prototype.addLabelAxisX = function (svg, width, height, options) {
svg.append('text')
.attr('transform', 'translate(' + width / 2 + ' ,' + (height + options.margin.top) +
')')
.style('text-anchor', 'middle')
.text(options.xAxisLabel);
};
D3Service.prototype.getViewBoxDefault = function (options) {
var res = {
minX: -options.margin.left,
minY: -25,
width: options.width,
height: options.height - options.margin.top,
};
return res;
};
D3Service.prototype.removeAxisTicks = function (axis) {
axis.selectAll('.tick').selectAll('line').remove();
};
D3Service.prototype.changeAxisColor = function (axis, config) {
axis.select('path')
.attr('color', config.color)
.attr('opacity', config.opacity)
.attr('rendering', config.rendering)
.attr('stroke-width', config.strokeWidth);
};
D3Service.prototype.getXaxisTime = function (svg, height, x, timeFormat, xAxisTicks) {
return svg.append('g')
.attr('transform', "translate(0," + height + ")")
.call(d3.axisBottom(x)
.tickFormat(d3.timeFormat(timeFormat))
.ticks(xAxisTicks));
};
D3Service.prototype.hideTooltip = function (tooltipText, tooltip) {
tooltipText.selectAll('tspan').remove();
tooltip.attr('visibility', 'hidden');
};
D3Service.prototype.showTooltip = function (d, xScale, yScale, tooltip, tooltipRect, tooltipText, formatTime) {
var xPos = xScale(d.x) - 150 / 2;
var yPos = yScale(d.y) + 10;
tooltip.attr('transform', "translate(" + xPos + ", " + yPos + ")")
.attr('is', true)
.attr('visibility', 'visible');
tooltipRect.attr('opacity', 0.7);
tooltipText.attr('tranform', 'translate(75,30)')
.attr('fill', 'white')
.attr('font-size', 10)
.attr('font-family', "'Roboto', 'sans-serif'");
tooltipText.append('tspan')
.attr('text-anchor', 'middle')
.attr('is', true)
.attr('x', 25)
.attr('y', -5)
.text("" + formatTime(d.x));
tooltipText.append('tspan')
.attr('text-anchor', 'middle')
.attr('is', true)
.attr('x', 20)
.attr('dy', 15)
.text("" + d.y);
};
D3Service.prototype.addTooltip = function (container) {
var tooltipConfig = {
width: 100,
height: 40,
fill: '#333',
opacity: 0.7,
rx: 15,
text: {
translateX: 10,
translateY: 20,
},
};
var tooltip = d3.select(container.nativeElement).select('svg').append('g');
var tooltipRect = tooltip.append('rect')
.attr('width', tooltipConfig.width)
.attr('height', tooltipConfig.height)
.attr('fill', tooltipConfig.fill)
.attr('opacity', 0)
.attr('rx', tooltipConfig.rx);
var tooltipText = tooltip.append('text').attr('transform', "translate(\n " + tooltipConfig.text.translateX + ",\n " + tooltipConfig.text.translateY + ")");
return { tooltip: tooltip, tooltipRect: tooltipRect, tooltipText: tooltipText, tooltipConfig: tooltipConfig };
};
D3Service.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function D3Service_Factory() { return new D3Service(); }, token: D3Service, providedIn: "root" });
D3Service = tslib_1.__decorate([
Injectable({ providedIn: 'root' })
], D3Service);
return D3Service;
}());
export { D3Service };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWQzLWdyYXBocy8iLCJzb3VyY2VzIjpbInNoYXJlZC9zZXJ2aWNlcy9kMy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDOztBQUd6QixNQUFNLENBQU4sSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCxnQ0FBZSxDQUFBO0lBQ2Ysa0NBQWlCLENBQUE7SUFDakIsOEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxhQUFhLEtBQWIsYUFBYSxRQUt4QjtBQUVEO0lBQ0U7SUFBZSxDQUFDO0lBRWhCLDZCQUFTLEdBQVQsVUFBVSxDQUFTLEVBQUUsQ0FBUztRQUM1QixPQUFPLGVBQWEsQ0FBQyxVQUFLLENBQUMsTUFBRyxDQUFDO0lBQ2pDLENBQUM7SUFFRCwrQkFBVyxHQUFYLFVBQVksS0FBVSxFQUFFLFNBQXdCO1FBQzlDLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixLQUFLLGFBQWEsQ0FBQyxLQUFLO2dCQUN0QixPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsS0FBSyxhQUFhLENBQUMsTUFBTTtnQkFDdkIsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLEtBQUssYUFBYSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QjtnQkFDRSxPQUFPLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRUQsK0JBQVcsR0FBWDtR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LElBQUksQ0FBQyxVQUFVLHFCQUM3QixhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFDLE9BQU8sU0FBQSxFQUFFLFdBQVcsYUFBQSxFQUFFLFdBQVcsYUFBQSxFQUFFLGFBQWEsZUFBQSxFQUFDLENBQUM7SUFDNUQsQ0FBQzs7SUFuS1UsU0FBUztRQURyQixVQUFVLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLENBQUM7T0FDcEIsU0FBUyxDQXdLckI7b0JBbkxEO0NBbUxDLEFBeEtELElBd0tDO1NBeEtZLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHtWaWV3Qm94fSBmcm9tICcuLi9tb2RlbHMvdmlld2JveC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBBeGlzRGlyZWN0aW9uIHtcbiAgdG9wID0gJ3RvcCcsXG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgYm90dG9tID0gJ2JvdHRvbScsXG4gIGxlZnQgPSAnbGVmdCcsXG59XG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBEM1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgdHJhbnNsYXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3h9LCAke3l9KWA7XG4gIH1cblxuICBmYWN0b3J5QXhpcyhzY2FsZTogYW55LCBkaXJlY3Rpb246IEF4aXNEaXJlY3Rpb24pOiBhbnkge1xuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIEF4aXNEaXJlY3Rpb24udG9wOlxuICAgICAgICByZXR1cm4gZDMuYXhpc1RvcChzY2FsZSk7XG4gICAgICBjYXNlIEF4aXNEaXJlY3Rpb24ucmlnaHQ6XG4gICAgICAgIHJldHVybiBkMy5heGlzUmlnaHQoc2NhbGUpO1xuICAgICAgY2FzZSBBeGlzRGlyZWN0aW9uLmJvdHRvbTpcbiAgICAgICAgcmV0dXJuIGQzLmF4aXNCb3R0b20oc2NhbGUpO1xuICAgICAgY2FzZSBBeGlzRGlyZWN0aW9uLmxlZnQ6XG4gICAgICAgIHJldHVybiBkMy5heGlzTGVmdChzY2FsZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdObyBheGlzIERpcmVjdGlvbiBQcm92aWRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGZhY3RvcnlMaW5lKCk6IGFueSB7XG4gICAgcmV0dXJuIGQzLmxpbmU8YW55PigpLngoKGQpID0+IGQueCkueSgoZCkgPT4gZC55KTtcbiAgfVxuXG4gIC8vID09PT0gQXhpcyA9PT09PVxuICBzY2FsZUxpbmVhclgobGFiZWxzOiBhbnlbXSwgd2lkdGg6IG51bWJlcikge1xuICAgIHJldHVybiBkMy5zY2FsZUxpbmVhcigpXG4gICAgICAgIC5kb21haW4oZDMuZXh0ZW50KGxhYmVscykpICAvLyBkb2VzIHRoZSBtYWdpYyBmb3IgYWRqdXN0YWJsZSBheGlzXG4gICAgICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcbiAgfVxuXG4gIHNjYWxlTGluZWFyWShkYXRhOiBhbnlbXSwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gZDMuc2NhbGVMaW5lYXIoKVxuICAgICAgICAuZG9tYWluKGQzLmV4dGVudChkYXRhKSkgIC8vIGRvZXMgdGhlIG1hZ2ljIGZvciBhZGp1c3RhYmxlIGF4aXNcbiAgICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcbiAgfVxuXG4gIHNjYWxlQmFuZFgobGFiZWxzOiBhbnlbXSwgd2lkdGg6IG51bWJlcikge1xuICAgIHJldHVybiBkMy5zY2FsZUJhbmQoKS5kb21haW4obGFiZWxzKS5yYW5nZVJvdW5kKFswLCB3aWR0aF0pLnBhZGRpbmcoMC4xKTtcbiAgfVxuXG4gIHNjYWxlTGluZWFyWVJhbmdlUm91bmQoZGF0YTogYW55W10sIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLCBNYXRoLm1heCguLi5kYXRhKV0pLnJhbmdlUm91bmQoW1xuICAgICAgaGVpZ2h0LCAwXG4gICAgXSk7XG4gIH1cblxuICBhZGRMYWJlbEF4aXNZKFxuICAgICAgc3ZnOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sIGhlaWdodDogbnVtYmVyLFxuICAgICAgb3B0aW9uczogYW55KSB7XG4gICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxuICAgICAgICAuYXR0cigneScsIDAgLSBvcHRpb25zLm1hcmdpbi5sZWZ0KVxuICAgICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxuICAgICAgICAuYXR0cignZHknLCAnMWVtJylcbiAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAudGV4dChvcHRpb25zLnlBeGlzTGFiZWwpO1xuICB9XG5cbiAgYWRkTGFiZWxBeGlzWChcbiAgICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LCB3aWR0aDogbnVtYmVyLFxuICAgICAgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM6IGFueSkge1xuICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgd2lkdGggLyAyICsgJyAsJyArIChoZWlnaHQgKyBvcHRpb25zLm1hcmdpbi50b3ApICtcbiAgICAgICAgICAgICAgICAnKScpXG4gICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLnRleHQob3B0aW9ucy54QXhpc0xhYmVsKTtcbiAgfVxuXG4gIGdldFZpZXdCb3hEZWZhdWx0KG9wdGlvbnM6IGFueSk6IFZpZXdCb3gge1xuICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgIG1pblg6IC1vcHRpb25zLm1hcmdpbi5sZWZ0LFxuICAgICAgbWluWTogLTI1LFxuICAgICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgICBoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0IC0gb3B0aW9ucy5tYXJnaW4udG9wLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcmVtb3ZlQXhpc1RpY2tzKGF4aXM6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPikge1xuICAgIGF4aXMuc2VsZWN0QWxsKCcudGljaycpLnNlbGVjdEFsbCgnbGluZScpLnJlbW92ZSgpO1xuICB9XG5cbiAgY2hhbmdlQXhpc0NvbG9yKFxuICAgICAgYXhpczogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LCBjb25maWc6IGFueSkge1xuICAgIGF4aXMuc2VsZWN0KCdwYXRoJylcbiAgICAgICAgLmF0dHIoJ2NvbG9yJywgY29uZmlnLmNvbG9yKVxuICAgICAgICAuYXR0cignb3BhY2l0eScsIGNvbmZpZy5vcGFjaXR5KVxuICAgICAgICAuYXR0cigncmVuZGVyaW5nJywgY29uZmlnLnJlbmRlcmluZylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGNvbmZpZy5zdHJva2VXaWR0aCk7XG4gIH1cblxuICBnZXRYYXhpc1RpbWUoXG4gICAgICBzdmc6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPiwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICB4OiBkMy5TY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+LCB0aW1lRm9ybWF0OiBzdHJpbmcsIHhBeGlzVGlja3M6IG51bWJlcikge1xuICAgIHJldHVybiBzdmcuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2hlaWdodH0pYClcbiAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KVxuICAgICAgICAgICAgICAgICAgLnRpY2tGb3JtYXQoZDMudGltZUZvcm1hdCh0aW1lRm9ybWF0KSlcbiAgICAgICAgICAgICAgICAgIC50aWNrcyh4QXhpc1RpY2tzKSk7XG4gIH1cblxuICBoaWRlVG9vbHRpcCh0b29sdGlwVGV4dDogYW55LCB0b29sdGlwOiBhbnkpIHtcbiAgICB0b29sdGlwVGV4dC5zZWxlY3RBbGwoJ3RzcGFuJykucmVtb3ZlKCk7XG4gICAgdG9vbHRpcC5hdHRyKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICB9XG5cbiAgc2hvd1Rvb2x0aXAoXG4gICAgICBkOiBhbnksIHhTY2FsZTogYW55LCB5U2NhbGU6IGFueSwgdG9vbHRpcDogYW55LCB0b29sdGlwUmVjdDogYW55LFxuICAgICAgdG9vbHRpcFRleHQ6IGFueSwgZm9ybWF0VGltZTogYW55KSB7XG4gICAgY29uc3QgeFBvcyA9IHhTY2FsZShkLngpIC0gMTUwIC8gMjtcbiAgICBjb25zdCB5UG9zID0geVNjYWxlKGQueSkgKyAxMDtcbiAgICB0b29sdGlwLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4UG9zfSwgJHt5UG9zfSlgKVxuICAgICAgICAuYXR0cignaXMnLCB0cnVlKVxuICAgICAgICAuYXR0cigndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgdG9vbHRpcFJlY3QuYXR0cignb3BhY2l0eScsIDAuNyk7XG4gICAgdG9vbHRpcFRleHQuYXR0cigndHJhbmZvcm0nLCAndHJhbnNsYXRlKDc1LDMwKScpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ3doaXRlJylcbiAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIDEwKVxuICAgICAgICAuYXR0cignZm9udC1mYW1pbHknLCBgJ1JvYm90bycsICdzYW5zLXNlcmlmJ2ApO1xuICAgIHRvb2x0aXBUZXh0LmFwcGVuZCgndHNwYW4nKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ2lzJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ3gnLCAyNSlcbiAgICAgICAgLmF0dHIoJ3knLCAtNSlcbiAgICAgICAgLnRleHQoYCR7Zm9ybWF0VGltZShkLngpfWApO1xuICAgIHRvb2x0aXBUZXh0LmFwcGVuZCgndHNwYW4nKVxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgICAgLmF0dHIoJ2lzJywgdHJ1ZSlcbiAgICAgICAgLmF0dHIoJ3gnLCAyMClcbiAgICAgICAgLmF0dHIoJ2R5JywgMTUpXG4gICAgICAgIC50ZXh0KGAke2QueX1gKTtcbiAgfVxuXG4gIGFkZFRvb2x0aXAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgdG9vbHRpcENvbmZpZyA9IHtcbiAgICAgIHdpZHRoOiAxMDAsXG4gICAgICBoZWlnaHQ6IDQwLFxuICAgICAgZmlsbDogJyMzMzMnLFxuICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgcng6IDE1LFxuICAgICAgdGV4dDoge1xuICAgICAgICB0cmFuc2xhdGVYOiAxMCxcbiAgICAgICAgdHJhbnNsYXRlWTogMjAsXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdG9vbHRpcCA9XG4gICAgICAgIGQzLnNlbGVjdChjb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdzdmcnKS5hcHBlbmQoJ2cnKTtcbiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXAuYXBwZW5kKCdyZWN0JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0b29sdGlwQ29uZmlnLndpZHRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB0b29sdGlwQ29uZmlnLmhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIHRvb2x0aXBDb25maWcuZmlsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3J4JywgdG9vbHRpcENvbmZpZy5yeCk7XG4gICAgY29uc3QgdG9vbHRpcFRleHQgPSB0b29sdGlwLmFwcGVuZCgndGV4dCcpLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoXG4gICAgICAgICAgJHt0b29sdGlwQ29uZmlnLnRleHQudHJhbnNsYXRlWH0sXG4gICAgICAgICAgJHt0b29sdGlwQ29uZmlnLnRleHQudHJhbnNsYXRlWX0pYCk7XG4gICAgcmV0dXJuIHt0b29sdGlwLCB0b29sdGlwUmVjdCwgdG9vbHRpcFRleHQsIHRvb2x0aXBDb25maWd9O1xuICB9XG5cblxuXG4gIC8vID09PT09PT09PT09PT1cbn1cbiJdfQ==