UNPKG

angular-sunburst-radar-chart

Version:
414 lines 68.6 kB
import { __assign, __decorate, __read } from "tslib"; import { Component, Input } from '@angular/core'; import { createCircle, createLine, createPath } from './utils/elements'; import { createArcToWriteText, getTextForAngle, writeTextOnArc } from './utils/textelement'; import { createInnerChartBarWithInArc, createOuterChartBarWithInArc } from './utils/arc-bar-charts'; import { calculatePointBetween, getGlobalPositions } from './utils/positions'; import { distanceBetweenTwoPoints, polarToCartesian } from './utils/trignometry'; import { createLegends, createLegendWithOptions } from './utils/legend'; import { formatItems, generateRandomColor, getFormattedAngle, getOptionsOrEmpty, hashCode } from './utils/utils'; import { getAllAnglesBasedOnChild, getAllAnglesBasedOnParent, getPointsOnCircleAtAngels, positionsOnAngles } from './utils/angels'; import { createSvgHandlerWithSelector } from './utils/svg-rotator'; var AngularSunburstRadarChartComponent = /** @class */ (function () { function AngularSunburstRadarChartComponent() { this.componentDisplayed = false; this.showToolTip = false; this.tooltipTopInPx = '0px'; this.tooltipLeftInPx = '0px'; this.tooltipText = ''; this.svgId = null; this.svgGroupId = null; this.svgHandler = null; this.currentRotationAngle = 10; this.svgCursor = 'default'; this.initialized = false; this.innerBorderHeight = 30; this.outerBorderHeight = 30; this.elements = []; this.hasChildren = false; this.outerBorderCircleRef = 'outerBorderCircle'; this.error = null; this.hasError = false; this.startRotation = false; } AngularSunburstRadarChartComponent.prototype.showError = function (msg) { this.error = msg; this.hasError = true; }; AngularSunburstRadarChartComponent.prototype.hideError = function () { this.error = null; this.hasError = false; }; AngularSunburstRadarChartComponent.prototype.appendToSvg = function (element) { this.elements.push(element); }; AngularSunburstRadarChartComponent.prototype.ngOnChanges = function (changes) { this.hideError(); var isFirstChange = Object.values(changes).some(function (c) { return c.isFirstChange(); }); this.modifyOnFirstChange(isFirstChange); }; AngularSunburstRadarChartComponent.prototype.modifyOnFirstChange = function (isFirstChange) { if (!isFirstChange) { this.initialize(); } }; AngularSunburstRadarChartComponent.prototype.ngOnInit = function () { this.hideError(); this.initialize(); }; AngularSunburstRadarChartComponent.prototype.initialize = function () { var _this = this; var defaults = { size: 300, maxScore: 100, animateChart: true, splitBasedOnChildren: true, legendAxisLinePosition: 1 }; var options = __assign(__assign({}, defaults), (getOptionsOrEmpty(this.options))); this.size = options.size; this.maxScore = options.maxScore; this.animateChart = options.animateChart; this.splitBasedOnChildren = options.splitBasedOnChildren; this.legendAxisLinePosition = options.legendAxisLinePosition; if (!this.hasValidParameters()) { this.showError('Input Values not set or Items was improper'); return; } this.initialized = false; this.svgId = 'svg' + hashCode(this.items); this.svgGroupId = 'svg-group' + hashCode(this.items); this.viewBox = '0 0 ' + this.size + ' ' + this.size; this.innerCircleRadius = Math.abs(this.size / 5.33); this.innerBorderHeight = this.innerCircleRadius / 5; this.outerBorderHeight = this.innerCircleRadius / 5; this.globalPosition = getGlobalPositions({ size: this.size, maxScore: this.maxScore, items: this.items }); this.hasChildren = this.items.filter(function (item) { return !!item.children; }).length > 0; this.drawLayout(); var _a = this.globalPosition, innerRadius = _a.innerRadius, innerTextRadius = _a.innerTextRadius, textSize = _a.textSize, outerTextSize = _a.outerTextSize, outerRadiusBorder = _a.outerRadiusBorder, outerTextRadius = _a.outerTextRadius, center = _a.center; var _b = __read([center.x, center.y], 2), centerX = _b[0], centerY = _b[1]; var items = this.items; var allAngels = []; var hasChildren = this.hasChildren; if (this.splitBasedOnChildren) { // Cannot have no children items = formatItems(items); allAngels = getAllAnglesBasedOnChild(items); } else { allAngels = getAllAnglesBasedOnParent(items); } var angleDifference = 360 / items.length; var angles = allAngels.map(function (value) { return value.startDegree; }); var middleAngles = allAngels.map(function (value) { return value.middleDegree; }); var points = positionsOnAngles(centerX, centerY, this.chartBorder, angles); var lines = []; var elements = []; var nextLevelElements = []; for (var i = 0; i < points.length; i++) { var _c = points[i], x = _c.x, y = _c.y; var endAngleIndex = i + 1; if (endAngleIndex >= points.length) { endAngleIndex = 0; } var endAngle = angles[endAngleIndex]; var startAngle = angles[i]; var middleAngle = middleAngles[i]; var item = items[i]; if (!!item.color === false) { var colorDefaults = { color: generateRandomColor() }; item = __assign(__assign({}, colorDefaults), item); } if (this.hasChildren && item.children && item.children.length > 0) { var childAngels = allAngels[i].children; nextLevelElements = nextLevelElements.concat(this.drawOnLevel({ items: item.children, totalDegrees: angleDifference, childAngels: childAngels, color: item.color })); } lines.push(createLine({ x1: centerX, y1: centerY, x2: x, y2: y, width: 2 })); // Create Arc for inner values var barWithinArc = createInnerChartBarWithInArc({ startPoint: center, item: item, radius: innerRadius, startAngle: startAngle, endAngle: endAngle, maxScore: this.maxScore }); elements.push(barWithinArc); var innerTextElements = this.addArcText({ arcForTextId: 'arc-text-inner' + this.getUniqueCode() + '-' + i, radius: innerTextRadius, fontSize: textSize, startAngle: startAngle, endAngle: endAngle, perAngle: angleDifference, item: item }); elements = elements.concat(innerTextElements); if (hasChildren) { elements.push(this.drawOuterBackgroundWithMiddle({ item: item, startAngle: startAngle, middleAngle: middleAngle, endAngle: endAngle })); var outerBackgroundTextElements = this.addArcText({ arcForTextId: 'arc-text-outer' + this.getUniqueCode() + '-' + i, radius: outerTextRadius, fontSize: outerTextSize, perAngle: angleDifference, startAngle: startAngle, endAngle: endAngle, item: item }); elements = elements.concat(outerBackgroundTextElements); } } nextLevelElements.forEach(function (line) { _this.appendToSvg(line); }); this.drawInnerBorders(); elements.forEach(function (line) { _this.appendToSvg(line); }); lines.forEach(function (line) { _this.appendToSvg(line); }); var legendAxisIndex = this.getLegendAxisIndex(angles); this.drawLegends(angles[legendAxisIndex]); this.addSmallCirclesAtCenter(centerX, centerY); this.initialized = true; this.currentRotationAngle = 10; this.rotationPoint = getFormattedAngle(this.currentRotationAngle, center); }; AngularSunburstRadarChartComponent.prototype.getLegendAxisIndex = function (angles) { var legendAxisIndex = this.legendAxisLinePosition - 1; if (legendAxisIndex < 0 || legendAxisIndex >= angles.length) { legendAxisIndex = 0; } return legendAxisIndex; }; AngularSunburstRadarChartComponent.prototype.hasValidParameters = function () { return this.items && this.items.length > 1; }; AngularSunburstRadarChartComponent.prototype.drawOuterBackgroundWithMiddle = function (_a) { var item = _a.item, startAngle = _a.startAngle, middleAngle = _a.middleAngle, endAngle = _a.endAngle; var color = item.color; var _b = this.globalPosition, outerTextRadius = _b.outerTextRadius, center = _b.center; var _c = __read([center.x, center.y], 2), centerX = _c[0], centerY = _c[1]; var middleCircle = calculatePointBetween({ centerX: centerX, centerY: centerY, startAngle: startAngle, middleAngle: middleAngle, endAngle: endAngle, radius: outerTextRadius }); var d = [ 'M', middleCircle.start.x, middleCircle.start.y, 'A', outerTextRadius, outerTextRadius, 0, 0, 1, middleCircle.end.x, middleCircle.end.y ]; var title = item.name + '-' + item.value; var strokeWidth = 0.0775 * this.size; return createPath({ d: d.join(' '), stroke: color, 'stroke-width': strokeWidth, title: title }); }; AngularSunburstRadarChartComponent.prototype.drawOnLevel = function (_a) { var items = _a.items, totalDegrees = _a.totalDegrees, childAngels = _a.childAngels, color = _a.color; var _b = this.globalPosition, innerRadiusBorder = _b.innerRadiusBorder, middleRadius = _b.middleRadius, textSize = _b.textSize, middleTextRadius = _b.middleTextRadius, center = _b.center; var _c = __read([center.x, center.y], 2), centerX = _c[0], centerY = _c[1]; var angles = childAngels.map(function (item) { return item.startDegree; }); var middleAngles = childAngels.map(function (item) { return item.middleDegree; }); var endAngles = childAngels.map(function (item) { return item.endDegree; }); var perAngle = totalDegrees / items.length; var pointsOnInnerRadiusBorder = getPointsOnCircleAtAngels(centerX, centerY, innerRadiusBorder, angles); var pointsOnMiddle = getPointsOnCircleAtAngels(centerX, centerY, middleRadius, angles); var elements = []; var lines = []; var currentDegree = angles[0]; for (var i = 0; i < pointsOnInnerRadiusBorder.length; i++) { var pointOnInnerRadiusBorder = pointsOnInnerRadiusBorder[i]; var pointOnMiddle = pointsOnMiddle[i]; lines.push(createLine({ x1: pointOnInnerRadiusBorder.x, y1: pointOnInnerRadiusBorder.y, x2: pointOnMiddle.x, y2: pointOnMiddle.y, width: 0.5 })); var startAngle = angles[i]; var middleAngle = middleAngles[i]; var endAngle = endAngles[i]; var item = items[i]; var params = { startPoint: pointOnInnerRadiusBorder, item: item, startAngle: startAngle, endAngle: endAngle, middleAngle: middleAngle, middleRadius: middleRadius, innerRadiusBorder: innerRadiusBorder, center: center, maxScore: this.maxScore, color: color, index: i }; var arcForChart = createOuterChartBarWithInArc(params); elements.push(arcForChart); var middleTextElements = this.addArcText({ arcForTextId: 'arc-text-middle' + this.getUniqueCode() + '-' + startAngle + i, radius: middleTextRadius, fontSize: textSize, perAngle: perAngle, startAngle: startAngle, endAngle: endAngle, item: item }); elements = elements.concat(middleTextElements); currentDegree = currentDegree + perAngle; } lines.forEach(function (line) { elements.push(line); }); return elements; }; AngularSunburstRadarChartComponent.prototype.getUniqueCode = function () { return hashCode(this.items) + '-' + this.size; }; AngularSunburstRadarChartComponent.prototype.drawInnerBorders = function () { var _a = this.globalPosition, innerRadius = _a.innerRadius, innerRadiusBorder = _a.innerRadiusBorder, center = _a.center; var _b = __read([center.x, center.y], 2), centerX = _b[0], centerY = _b[1]; var innerContainer = createCircle({ x: centerX, y: centerY, radius: innerRadius, fillColor: 'none' }); var innerBorderContainer = createCircle({ x: centerX, y: centerY, radius: innerRadiusBorder, fillColor: '#FFFFFF' }); this.appendToSvg(innerBorderContainer); this.appendToSvg(innerContainer); }; AngularSunburstRadarChartComponent.prototype.addSmallCirclesAtCenter = function (centerX, centerY) { var outerRadius = 0.0025 * 2 * this.size; var innerRadius = 0.0005 * 2 * this.size; this.appendToSvg(createCircle({ x: centerX, y: centerY, radius: outerRadius, fillColor: '#FFFFFF' })); this.appendToSvg(createCircle({ x: centerX, y: centerY, radius: innerRadius, fillColor: '#FFFFFF' })); }; AngularSunburstRadarChartComponent.prototype.drawLegends = function (degreeToBeDrawn) { var _this = this; var _a = this.globalPosition, innerRadius = _a.innerRadius, innerRadiusBorder = _a.innerRadiusBorder, middleRadius = _a.middleRadius, center = _a.center; var _b = __read([center.x, center.y], 2), centerX = _b[0], centerY = _b[1]; var maxScore = this.maxScore; var legends = createLegends({ startPoint: center, radius: innerRadius, degreeToBeDrawn: degreeToBeDrawn, maxScore: maxScore }); var startFrom = polarToCartesian(centerX, centerY, innerRadiusBorder, degreeToBeDrawn); if (this.hasChildren) { var nextLevelLegends = createLegendWithOptions({ startPoint: startFrom, center: center, startRadius: innerRadiusBorder, endRadius: middleRadius, maxScore: maxScore, degreeToBeDrawn: degreeToBeDrawn }); legends = legends.concat(nextLevelLegends); } legends.forEach(function (elem) { _this.appendToSvg(elem); }); }; AngularSunburstRadarChartComponent.prototype.addArcText = function (_a) { var arcForTextId = _a.arcForTextId, radius = _a.radius, startAngle = _a.startAngle, fontSize = _a.fontSize, endAngle = _a.endAngle, perAngle = _a.perAngle, item = _a.item; var elements = []; var center = this.globalPosition.center; var _b = __read([center.x, center.y], 2), centerX = _b[0], centerY = _b[1]; var arcForText = createArcToWriteText({ id: arcForTextId, startPoint: center, radius: radius, startAngle: startAngle, endAngle: endAngle }); elements.push(arcForText); var distance = distanceBetweenTwoPoints(centerX, centerY, radius, startAngle, endAngle); var label = getTextForAngle(item.name, distance, fontSize); elements.push(writeTextOnArc({ label: label, text: item.name, pathId: arcForTextId, 'font-size': fontSize + 'px' })); return elements; }; AngularSunburstRadarChartComponent.prototype.drawLayout = function () { var _a = this.globalPosition, innerRadius = _a.innerRadius, innerRadiusBorder = _a.innerRadiusBorder, middleRadius = _a.middleRadius, middleRadiusBorder = _a.middleRadiusBorder, outerRadius = _a.outerRadius, outerRadiusBorder = _a.outerRadiusBorder, center = _a.center; var _b = __read([center.x, center.y], 2), centerX = _b[0], centerY = _b[1]; var innerRadiusEnd = innerRadius; var innerRadiusBorderEnd = innerRadiusBorder; this.chartBorder = innerRadiusBorder; if (this.hasChildren) { var outerBorderCircle = createCircle({ x: centerX, y: centerY, radius: outerRadiusBorder, fillColor: 'none', 'stroke-width': '5', ref: this.outerBorderCircleRef }); this.appendToSvg(outerBorderCircle); var outerCircle = createCircle({ x: centerX, y: centerY, radius: outerRadius, fillColor: 'none' }); this.appendToSvg(outerCircle); innerRadiusEnd = middleRadius; innerRadiusBorderEnd = middleRadiusBorder; this.chartBorder = outerRadiusBorder; } this.appendToSvg(createCircle({ x: centerX, y: centerY, radius: innerRadiusEnd })); this.appendToSvg(createCircle({ x: centerX, y: centerY, radius: innerRadiusBorderEnd })); }; AngularSunburstRadarChartComponent.prototype.hideTooltip = function () { this.showToolTip = false; }; AngularSunburstRadarChartComponent.prototype.showTooltipText = function ($event, text) { this.tooltipLeftInPx = $event.pageX + 10 + 'px'; this.tooltipTopInPx = $event.pageY + 10 + 'px'; this.tooltipText = text; this.showToolTip = true; }; AngularSunburstRadarChartComponent.prototype.onOutOfComponent = function () { this.hideTooltip(); this.stopRotate(); }; AngularSunburstRadarChartComponent.prototype.stopRotate = function () { this.svgCursor = 'default'; this.startRotation = false; }; AngularSunburstRadarChartComponent.prototype.startRotate = function ($event) { this.startRotation = true; this.svgCursor = 'grab'; var _a = this.globalPosition, outerRadiusBorder = _a.outerRadiusBorder, center = _a.center; this.svgHandler = createSvgHandlerWithSelector('#' + this.svgId, center); this.svgHandler.startDrag($event, this.currentRotationAngle); $event.preventDefault(); }; AngularSunburstRadarChartComponent.prototype.rotateChart = function ($event) { if (this.startRotation == false) { return; } this.svgCursor = 'grabbing'; var center = this.globalPosition.center; this.currentRotationAngle = this.svgHandler.getRotationAngle($event); this.rotationPoint = getFormattedAngle(Math.round(this.currentRotationAngle), center); }; __decorate([ Input() ], AngularSunburstRadarChartComponent.prototype, "items", void 0); __decorate([ Input() ], AngularSunburstRadarChartComponent.prototype, "options", void 0); AngularSunburstRadarChartComponent = __decorate([ Component({ selector: 'lib-sunburst-radar-chart', template: "<ng-container (mouseout)=\"onOutOfComponent();\">\n\n\n <div *ngIf=\"hasError\" style=\" color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n margin-top: 5px;\npadding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n\">\n <strong>Error!</strong> {{error}}\n </div>\n\n\n\n<div class=\"app-tooltip\" *ngIf=\"showToolTip\" style=\"position: absolute; display: block;background: cornsilk; border: 1px solid black; border-radius: 5px; padding: 5px; z-index: 1002;\"\n\n [style.left]=\"tooltipLeftInPx\" [style.top]=\"tooltipTopInPx\" >\n {{tooltipText}}\n</div>\n\n<svg [attr.id]=\"svgId\"\n [attr.height]=\"size\"\n [attr.width]=\"size\"\n [attr.viewBox]=\"viewBox\"\n [style.cursor]=\"svgCursor\"\n xmlns=\"http://www.w3.org/2000/svg\">\n\n\n\n\n <animateTransform\n *ngIf=\"animateChart\"\n attributeName=\"transform\"\n begin=\"4s\"\n dur=\"500ms\"\n type=\"rotate\"\n from=\"0\"\n to=\"10\"\n\n additive=\"sum\"\n fill=\"freeze\"\n repeatCount=\"1\"\n />\n\n\n<g\n (mousemove)=\"rotateChart($event);\"\n (mousedown)=\"startRotate($event)\"\n (mouseup)=\"stopRotate()\"\n (touchmove)=\"rotateChart($event);\"\n (touchstart)=\"startRotate($event)\"\n (touchend)=\"stopRotate()\"\n [attr.transform]=\"rotationPoint\"\n [attr.id]=\"svgGroupId\"\n\n\n >\n <ng-container *ngFor=\"let element of elements\" >\n\n\n\n <ng-container [ngSwitch]=\"element.name\" >\n\n\n <circle *ngSwitchCase=\"'circle'\" [attr.cx]=\"element.options.x\" [attr.cy]=[element.options.y]\n [attr.r]=\"element.options.radius\"\n [attr.stroke-width]=\"element.options['stroke-width']\"\n [attr.stroke]=\"element.options['stroke']\"\n [attr.stroke-dasharray]=\"element.options['stroke-dasharray']\"\n [attr.stroke-opacity]=\"element.options['stroke-opacity']\"\n [attr.fill]=\"element.options['fillColor']\"\n >\n\n\n\n\n </circle>\n\n <path *ngSwitchCase=\"'path'\" [attr.d]=\"element.options.d\" [attr.fill]=[element.options.fill]\n\n [attr.stroke]=\"element.options['stroke']\"\n [attr.stroke-width]=\"element.options['stroke-width']\"\n [attr.id]=\"element.options['id']\"\n (mousemove)=\"showTooltipText($event, element.options['title']);\"\n (mouseout)=\"hideTooltip()\" >\n\n\n\n\n\n </path>\n\n<g *ngSwitchCase=\"'path-bar'\" >\n\n\n\n <path [attr.d]=\"element.options.d\"\n [attr.fill]=[element.options.fill]\n\n [attr.stroke]=\"element.options['stroke']\"\n [attr.stroke-width]=\"element.options['stroke-width']\"\n [attr.stroke-opacity]=\"element.options['stroke-opacity']\"\n [attr.fill-opacity]=\"element.options['fill-opacity']\"\n [attr.id]=\"element.options['id']\"\n (mousemove)=\"showTooltipText($event, element.options['title']);\" (mouseout)=\"hideTooltip()\" >\n\n\n\n\n <ng-container\n\n *ngIf=\"animateChart\"\n >\n\n <animate\n attributeName=\"fill\"\n [attr.from]=\"element.options['fill']\"\n to=\"transparent\"\n dur=\"1ms\"\n fill=\"freeze\" />\n <animate\n attributeName=\"stroke\"\n [attr.from]=\"element.options['fill']\"\n [attr.to]=\"element.options['fill']\"\n dur=\"1ms\"\n fill=\"freeze\" />\n <animate\n attributeName=\"stroke-width\"\n from=\"8\"\n to=\"8\"\n dur=\"1ms\"\n fill=\"freeze\" />\n <animate\n attributeName=\"stroke-dasharray\"\n from=\"1000\"\n to=\"1000\"\n dur=\"1ms\"\n fill=\"freeze\" />\n\n\n <animate\n attributeName=\"fill\"\n from=\"#FFFFFF\"\n [attr.to]=\"element.options['fill']\"\n begin=\"2s\"\n dur=\"3s\"\n fill=\"freeze\" />\n\n <animate\n attributeName=\"stroke-dashoffset\"\n from=\"1000\"\n to=\"0\"\n begin=\"1ms\"\n dur=\"3s\"\n fill=\"freeze\" />\n\n <animate\n attributeName=\"stroke-width\"\n from=\"8\"\n [attr.to]=\"element.options['stroke']\"\n begin=\"3s\"\n dur=\"1s\"\n fill=\"freeze\" />\n </ng-container>\n </path>\n\n\n\n\n</g>\n\n <text *ngSwitchCase=\"'text-on-arc'\"\n [attr.font-size]=\"element.options['font-size']\"\n\n >\n <textPath\n [attr.href]=\"element.options.href\"\n [attr.startOffset]=\"element.options.startOffset\"\n [attr.text-anchor]=\"element.options['text-anchor']\"\n >{{element.options['label']}}</textPath>\n <title>{{element.options['title']}}</title>\n\n </text>\n\n\n <line *ngSwitchCase=\"'line'\"\n [attr.x1]=\"element.options.x1\"\n [attr.y1]=\"element.options.y1\"\n [attr.x2]=\"element.options.x2\"\n [attr.y2]=\"element.options.y2\"\n [attr.stroke-width]=\"element.options.width\"\n\n [attr.stroke]=\"element.options['color']\" >\n <title>{{element.options['title']}}</title>\n </line>\n\n\n <text *ngSwitchCase=\"'text'\"\n [attr.x]=\"element.options.x\"\n [attr.y]=\"element.options.y\"\n [attr.stroke]=\"element.options.stroke\"\n [attr.stroke-width]=\"element.options['stroke-width']\"\n [attr.font-size]=\"element.options['font-size']\"\n [attr.text-anchor]=\"element.options['text-anchor']\"\n >{{element.options.content}}\n <title>{{element.options['content']}}</title>\n </text>\n\n </ng-container>\n\n\n\n </ng-container>\n\n\n </g>\n</svg>\n</ng-container>\n", styles: [".app-tooltip{background:#fff8dc;border:1px solid #000;border-radius:5px;padding:5px;z-index:1002}.growAnimation{-moz-transition:transform 2s ease-in-out;-webkit-transition:transform 2s ease-in-out;-o-transition:transform 2s ease-in-out;transform:scale(1)}.growAnimation:active{transform:scale(.5)}"] }) ], AngularSunburstRadarChartComponent); return AngularSunburstRadarChartComponent; }()); export { AngularSunburstRadarChartComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zdW5idXJzdC1yYWRhci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXN1bmJ1cnN0LXJhZGFyLWNoYXJ0LyIsInNvdXJjZXMiOlsibGliL2FuZ3VsYXItc3VuYnVyc3QtcmFkYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxLQUFLLEVBQW1DLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUYsT0FBTyxFQUFDLDRCQUE0QixFQUFFLDRCQUE0QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGtCQUFrQixFQUFpQixNQUFNLG1CQUFtQixDQUFDO0FBQzVGLE9BQU8sRUFBQyx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxhQUFhLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUMsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqSSxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQVFqRTtJQUlFO1FBSUEsdUJBQWtCLEdBQUMsS0FBSyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcs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ImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFNpbXBsZUNoYW5nZXN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjcmVhdGVDaXJjbGUsIGNyZWF0ZUxpbmUsIGNyZWF0ZVBhdGh9IGZyb20gJy4vdXRpbHMvZWxlbWVudHMnO1xuaW1wb3J0IHtjcmVhdGVBcmNUb1dyaXRlVGV4dCwgZ2V0VGV4dEZvckFuZ2xlLCB3cml0ZVRleHRPbkFyY30gZnJvbSAnLi91dGlscy90ZXh0ZWxlbWVudCc7XG5pbXBvcnQge2NyZWF0ZUlubmVyQ2hhcnRCYXJXaXRoSW5BcmMsIGNyZWF0ZU91dGVyQ2hhcnRCYXJXaXRoSW5BcmN9IGZyb20gJy4vdXRpbHMvYXJjLWJhci1jaGFydHMnO1xuaW1wb3J0IHtjYWxjdWxhdGVQb2ludEJldHdlZW4sIGdldEdsb2JhbFBvc2l0aW9ucywgR2xvYmFsUG9zaXRpb259IGZyb20gJy4vdXRpbHMvcG9zaXRpb25zJztcbmltcG9ydCB7ZGlzdGFuY2VCZXR3ZWVuVHdvUG9pbnRzLCBwb2xhclRvQ2FydGVzaWFufSBmcm9tICcuL3V0aWxzL3RyaWdub21ldHJ5JztcbmltcG9ydCB7Y3JlYXRlTGVnZW5kcywgY3JlYXRlTGVnZW5kV2l0aE9wdGlvbnN9IGZyb20gJy4vdXRpbHMvbGVnZW5kJztcbmltcG9ydCB7Zm9ybWF0SXRlbXMsIGdlbmVyYXRlUmFuZG9tQ29sb3IsIGdldEZvcm1hdHRlZEFuZ2xlLCBnZXRPcHRpb25zT3JFbXB0eSwgaGFzaENvZGV9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtnZXRBbGxBbmdsZXNCYXNlZE9uQ2hpbGQsIGdldEFsbEFuZ2xlc0Jhc2VkT25QYXJlbnQsIGdldFBvaW50c09uQ2lyY2xlQXRBbmdlbHMsIHBvc2l0aW9uc09uQW5nbGVzfSBmcm9tICcuL3V0aWxzL2FuZ2Vscyc7XG5pbXBvcnQge0FuZ3VsYXJTdmdFbGVtZW50fSBmcm9tICcuL3V0aWxzL21vZGVscyc7XG5cbmltcG9ydCB7Y3JlYXRlU3ZnSGFuZGxlcldpdGhTZWxlY3Rvcn0gZnJvbSAnLi91dGlscy9zdmctcm90YXRvcic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXN1bmJ1cnN0LXJhZGFyLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXItc3VuYnVyc3QtcmFkYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hbmd1bGFyLXN1bmJ1cnN0LXJhZGFyLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhclN1bmJ1cnN0UmFkYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuXG4gIGNvbXBvbmVudERpc3BsYXllZD1mYWxzZTtcbiAgc2hvd1Rvb2xUaXAgPSBmYWxzZTtcbiAgdG9vbHRpcFRvcEluUHggPSAnMHB4JztcbiAgdG9vbHRpcExlZnRJblB4ID0gJzBweCc7XG4gIHRvb2x0aXBUZXh0ID0gJyc7XG4gIHN2Z0lkID0gbnVsbDtcbiAgc3ZnR3JvdXBJZCA9IG51bGw7XG5cbiAgc3ZnSGFuZGxlciA9IG51bGw7XG5cbiAgY3VycmVudFJvdGF0aW9uQW5nbGUgPSAxMDtcbiAgcm90YXRpb25Qb2ludDtcbiAgc3ZnQ3Vyc29yID0gJ2RlZmF1bHQnO1xuXG5cbiAgQElucHV0KClcbiAgaXRlbXM7XG5cbiAgQElucHV0KClcbiAgb3B0aW9ucztcblxuICBzaXplOiBudW1iZXI7XG5cblxuICBtYXhTY29yZTogbnVtYmVyO1xuXG4gIGxlZ2VuZEF4aXNMaW5lUG9zaXRpb246IG51bWJlcjtcblxuICBhbmltYXRlQ2hhcnQ7XG5cbiAgc3BsaXRCYXNlZE9uQ2hpbGRyZW47XG5cbiAgdmlld0JveDtcblxuICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBpbm5lckNpcmNsZVJhZGl1cztcblxuICBpbm5lckJvcmRlckhlaWdodCA9IDMwO1xuICBvdXRlckJvcmRlckhlaWdodCA9IDMwO1xuXG5cbiAgZWxlbWVudHM6IEFuZ3VsYXJTdmdFbGVtZW50W10gPSBbXTtcbiAgZ2xvYmFsUG9zaXRpb246IEdsb2JhbFBvc2l0aW9uO1xuICBoYXNDaGlsZHJlbiA9IGZhbHNlO1xuICBjaGFydEJvcmRlcjtcbiAgb3V0ZXJCb