@acorex/charts 21.0.3-next.33 → 21.0.3-next.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-charts-bar-chart.mjs +18 -18
- package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-legend.mjs +13 -13
- package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
- package/fesm2022/acorex-charts-chart-tooltip.mjs +10 -10
- package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-charts-donut-chart.mjs +18 -18
- package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-funnel-chart.mjs +15 -17
- package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-gauge-chart.mjs +15 -15
- package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-heatmap-chart.mjs +14 -14
- package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-hierarchy-chart.mjs +19 -19
- package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts-line-chart.mjs +15 -15
- package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
- package/fesm2022/acorex-charts.mjs +4 -4
- package/fesm2022/acorex-charts.mjs.map +1 -1
- package/package.json +13 -12
- /package/{bar-chart/index.d.ts → types/acorex-charts-bar-chart.d.ts} +0 -0
- /package/{chart-legend/index.d.ts → types/acorex-charts-chart-legend.d.ts} +0 -0
- /package/{chart-tooltip/index.d.ts → types/acorex-charts-chart-tooltip.d.ts} +0 -0
- /package/{donut-chart/index.d.ts → types/acorex-charts-donut-chart.d.ts} +0 -0
- /package/{funnel-chart/index.d.ts → types/acorex-charts-funnel-chart.d.ts} +0 -0
- /package/{gauge-chart/index.d.ts → types/acorex-charts-gauge-chart.d.ts} +0 -0
- /package/{heatmap-chart/index.d.ts → types/acorex-charts-heatmap-chart.d.ts} +0 -0
- /package/{hierarchy-chart/index.d.ts → types/acorex-charts-hierarchy-chart.d.ts} +0 -0
- /package/{line-chart/index.d.ts → types/acorex-charts-line-chart.d.ts} +0 -0
- /package/{index.d.ts → types/acorex-charts.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSxtQkFBbUI7S0FDaEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEdhdWdlQ2hhcnRPcHRpb24gPSB7XG4gIG1pblZhbHVlOiAwLFxuICBtYXhWYWx1ZTogMTAwLFxuICBnYXVnZVdpZHRoOiAyMixcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBzaG93VmFsdWU6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBhbmltYXRpb25EdXJhdGlvbjogNzUwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIC4uLkFYX0NIQVJUX0RFRkFVTFRfTUVTU0FHRVMsXG4gICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWdhdWdlJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9HQVVHRV9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhHYXVnZUNoYXJ0T3B0aW9uPignQVhfR0FVR0VfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG59KTtcblxuZXhwb3J0IHR5cGUgUGFydGlhbEdhdWdlQ2hhcnRDb25maWcgPSBQYXJ0aWFsPEFYR2F1Z2VDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXVnZUNoYXJ0Q29uZmlnKGNvbmZpZzogUGFydGlhbEdhdWdlQ2hhcnRDb25maWcgPSB7fSk6IEFYR2F1Z2VDaGFydE9wdGlvbiB7XG4gIHJldHVybiB7XG4gICAgLi4uQVhHYXVnZUNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcubWVzc2FnZXMsXG4gICAgICAuLi5jb25maWcubWVzc2FnZXMsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==","import { AXChartComponent, computeTooltipPosition, createChartInstanceId, formatLargeNumber, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\n instanceId = createChartInstanceId('ax-gauge');\n get bgGradientId() {\n return `${this.instanceId}-bg-gradient`;\n }\n thresholdGradientId(index) {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n const containerElement = this.chartContainerEl().nativeElement;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n const currentValue = this.value();\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN6RCxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLEtBQUssR0FBRyxLQUFLLENBQW9CLENBQUMsaURBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsOENBQThDO0lBQ3RDLFVBQVUsR0FBeUIsSUFBSSxD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LEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQy9GLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7UUFDMUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsT0FBZTtRQUN0QyxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDM0MsQ0FBQzt1R0ExMkJVLHFCQUFxQjsyRkFBckIscUJBQXFCLHVlQzNDbEMseU1BR0EscTVDRHFDWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBjcmVhdGVDaGFydEluc3RhbmNlSWQsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiwgQVhHYXVnZUNoYXJ0VmFsdWUgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEdhdWdlIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UgY2hhcnQgd2l0aCBhbmltYXRlZCBuZWVkbGUgYW5kIHRocmVzaG9sZHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZ2F1Z2UtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYXVnZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhHYXVnZUNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQVhDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydENvbXBvbmVudEJhc2Uge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IHZhbHVlIGlucHV0ICovXG4gIHZhbHVlID0gaW5wdXQ8QVhHYXVnZUNoYXJ0VmFsdWU+KDApO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEdhdWdlQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gU1ZHIGVsZW1lbnQgcmVmZXJlbmNlIChjcmVhdGVkIGluIHRoZSBjb2RlKVxuICBwcml2YXRlIHN2Z0VsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3ByZXZWYWx1ZSA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBUcmFjayBwcmV2aW91cyBvcHRpb25zIHRvIGRldGVjdCBjaGFuZ2VzXG4gIHByaXZhdGUgX3ByZXZPcHRpb25zU3RyaW5nID0gJyc7XG5cbiAgLy8gQ2FjaGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERPTSByZWFkc1xuICBwcml2YXRlIF9sYXN0Q29udGFpbmVyUmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVG9vbHRpcCBzaWduYWxzXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHBvc2UgdG9vbHRpcCBzaWduYWxzIGFzIHJlYWQtb25seSBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0dBVUdFX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gQ29tcHV0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gbWVyZ2VDaGFydE9wdGlvbnModGhpcy5jb25maWdUb2tlbiwgdGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPID0gMC42MjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX1NJREVfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfVElDS19DTEVBUkFOQ0UgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBjcmVhdGVDaGFydEluc3RhbmNlSWQoJ2F4LWdhdWdlJyk7XG5cbiAgcHJpdmF0ZSBnZXQgYmdHcmFkaWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaW5zdGFuY2VJZH0tYmctZ3JhZGllbnRgO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJlc2hvbGRHcmFkaWVudElkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LXRocmVzaG9sZC1ncmFkaWVudC0ke2luZGV4fWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gcmVkcmF3IHRoZSBjaGFydFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcmV2VmFsdWUuc2V0KGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsIHx8ICF0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3ByZXZPcHRpb25zU3RyaW5nID09PSBvcHRpb25zU3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZERpYWwoY3VycmVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmQzKSByZXR1cm47IC8vIEFscmVhZHkgbG9hZGVkXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBnYXVnZSBjaGFydCB3aXRoIGFsbCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtY2hhcnQtZW1wdHknKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuXG4gICAgaWYgKHRoaXMudmFsdWUoKSA9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kMykge1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKTtcbiAgICAgICAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UodGhpcy5kMywgY29udGFpbmVyRWxlbWVudCwge1xuICAgICAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICAgICAgdGl0bGU6IG1lc3NhZ2VzLm5vRGF0YSxcbiAgICAgICAgICBoZWxwOiBtZXNzYWdlcy5ub0RhdGFIZWxwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCkgYXMgbnVtYmVyO1xuXG4gICAgLy8gQ3JlYXRlIFNWRyBlbGVtZW50XG4gICAgdGhpcy5zdmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBHZXQgY3VycmVudCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gU3RvcmUgb3B0aW9ucyBzdHJpbmcgZm9yIGNvbXBhcmlzb25cbiAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNob3dWYWx1ZSwgbGFiZWwgPSAnJywgZ2F1Z2VXaWR0aCwgY29ybmVyUmFkaXVzLCBhbmltYXRpb25EdXJhdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0aHJlc2hvbGRzID0gb3B0aW9ucy50aHJlc2hvbGRzID8/IFtdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlc3BvbnNpdmUgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIENhY2hlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSB7IHdpZHRoOiBjb250YWluZXJXaWR0aCwgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgfTtcblxuICAgIC8vIERldGVybWluZSBjaGFydCBkaW1lbnNpb25zIC0gdXNlIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gY29udGFpbmVySGVpZ2h0O1xuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGltZW5zaW9uc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVdpZHRoID0gTWF0aC5tYXgod2lkdGggfHwgMSwgMSk7XG4gICAgY29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0IHx8IDEsIDEpO1xuXG4gICAgLy8gRm9yIGEgc2VtaS1jaXJjdWxhciBnYXVnZSwgd2lkdGggc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgdHdpY2UgdGhlIGhlaWdodFxuICAgIGNvbnN0IHNpemUgPSBNYXRoLm1pbihlZmZlY3RpdmVXaWR0aCwgZWZmZWN0aXZlSGVpZ2h0ICogMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2luIGFzIHBlcmNlbnRhZ2Ugb2Ygc2l6ZSAoNS04JSB3aXRoIHJlYXNvbmFibGUgYm91bmRzKVxuICAgIGNvbnN0IG1hcmdpblJhdGlvID0gMC4wODtcbiAgICBjb25zdCBtYXJnaW4gPSBNYXRoLm1heCg1LCBNYXRoLm1pbihzaXplICogbWFyZ2luUmF0aW8sIDMwKSk7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSB0aGlzLmdldFRpY2tDb3VudChzaXplKTtcbiAgICBjb25zdCB0aWNrRm9udFB4ID0gdGhpcy5nZXRUaWNrRm9udFNpemUoc2l6ZSk7XG4gICAgY29uc3QgbWF4VGlja0xhYmVsV2lkdGggPSB0aGlzLmVzdGltYXRlTWF4VGlja0xhYmVsV2lkdGgodGlja0NvdW50LCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRpY2tGb250UHgpO1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbigoc2l6ZSAvIDIpICogMC4xMiwgMTQpKTtcbiAgICAvLyBLZWVwIGxhYmVscyBjbG9zZXIgdG8gdGhlIGdhdWdlIGFyYyB3aGlsZSBwcmVzZXJ2aW5nIHJlYWRhYmlsaXR5LlxuICAgIGNvbnN0IGxhYmVsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oKHNpemUgLyAyKSAqIDAuMDYsIDE0KSk7XG4gICAgY29uc3QgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCA9IGxhYmVsR2FwICsgdGlja0ZvbnRQeCAqIDAuMzU7XG4gICAgY29uc3QgdGlja0xhYmVsU3BhY2UgPSB0aWNrTGVuZ3RoICsgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCArIHRpY2tGb250UHg7XG4gICAgY29uc3QgdG90YWxWZXJ0aWNhbFNwYWNlID0gc2l6ZSAvIDIgKyB0aWNrTGFiZWxTcGFjZTtcblxuICAgIC8vIExhYmVscyBhdCBlZGdlIHRpY2tzIHVzZSBzdGFydC9lbmQgYW5jaG9ycywgc28gdGhleSBjYW4gZXh0ZW5kIGJ5IG5lYXIgZnVsbCB3aWR0aC5cbiAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IE1hdGgubWF4KDE4LCBtYXhUaWNrTGFiZWxXaWR0aCArIDgpO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBzaXplICsgaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuICAgIGNvbnN0IHZpZXdCb3hXaWR0aCA9IHRvdGFsV2lkdGggKyB0aGlzLkNIQVJUX0VER0VfUEFERElORyAqIDI7XG4gICAgY29uc3Qgdmlld0JveEhlaWdodCA9IHRvdGFsVmVydGljYWxTcGFjZSArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HICogMjtcblxuICAgIC8vIFNldCB1cCBTVkcgd2l0aCByZXNwb25zaXZlIHZpZXdCb3ggdGhhdCBhY2NvdW50cyBmb3Igb3ZlcmZsb3dcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KHRoaXMuc3ZnRWxlbWVudClcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt2aWV3Qm94V2lkdGh9ICR7dmlld0JveEhlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjaGFydCBjZW50ZXJlZCBob3Jpem9udGFsbHkgd2l0aCBwYWRkaW5nLCBwb3NpdGlvbmVkIHRvIHNob3cgb25seSB0aGUgdG9wIGhhbGZcbiAgICBjb25zdCBjaGFydEdyb3VwID0gc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKFxuICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgYHRyYW5zbGF0ZSgke3NpemUgLyAyICsgaG9yaXpvbnRhbFBhZGRpbmcgKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30sICR7c2l6ZSAvIDIgLSBtYXJnaW4gKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30pYCxcbiAgICAgICk7XG5cbiAgICAvLyBEZWZpbmUgZ2F1Z2UgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyIC0gbWFyZ2luO1xuICAgIGNvbnN0IGRlc2lyZWRHYXVnZVdpZHRoID0gdHlwZW9mIGdhdWdlV2lkdGggPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4oZ2F1Z2VXaWR0aCkgPyBnYXVnZVdpZHRoIDogMzA7XG4gICAgLy8gUmVzcGVjdCBleHBsaWNpdCBnYXVnZVdpZHRoIGluIHB4IHdpdGggc2FuZSBhYnNvbHV0ZSBib3VuZHMuXG4gICAgY29uc3QgY2xhbXBlZEdhdWdlV2lkdGggPSBNYXRoLm1heCg2LCBNYXRoLm1pbihkZXNpcmVkR2F1Z2VXaWR0aCwgcmFkaXVzICogMC43KSk7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgLSBjbGFtcGVkR2F1Z2VXaWR0aDtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHJhZGl1cztcblxuICAgIC8vIENyZWF0ZSBncmFkaWVudCBkZWZpbml0aW9uc1xuICAgIHRoaXMuY3JlYXRlR3JhZGllbnRzKHN2ZywgdGhyZXNob2xkcyk7XG5cbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgIHRoaXMuZHJhd0JhY2tncm91bmRBcmMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gRHJhdyB0aGUgdGhyZXNob2xkIGFyY3MgaWYgdGhyZXNob2xkcyBleGlzdFxuICAgIGlmICh0aHJlc2hvbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZHJhd1RocmVzaG9sZHMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRocmVzaG9sZHMsIGNvcm5lclJhZGl1cyk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aWNrIG1hcmtzXG4gICAgdGhpcy5kcmF3VGlja3MoY2hhcnRHcm91cCwgb3V0ZXJSYWRpdXMsIG1pblZhbHVlLCBtYXhWYWx1ZSwgc2l6ZSwgdGlja0NvdW50LCB0aWNrRm9udFB4KTtcblxuICAgIC8vIERyYXcgdGhlIGRpYWwvbmVlZGxlIHdpdGggYW5pbWF0aW9uXG4gICAgdGhpcy5kcmF3RGlhbChjaGFydEdyb3VwLCByYWRpdXMsIGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhbmltYXRpb25EdXJhdGlvbik7XG5cbiAgICAvLyBEcmF3IHRoZSB2YWx1ZSBkaXNwbGF5IChhZnRlciB0aGUgZGlhbCBzbyBpdCdzIG9uIHRvcClcbiAgICBpZiAoc2hvd1ZhbHVlKSB7XG4gICAgICB0aGlzLmRyYXdWYWx1ZURpc3BsYXkoY2hhcnRHcm91cCwgY3VycmVudFZhbHVlLCBsYWJlbCwgcmFkaXVzLCBzaXplKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgaW5pdGlhbGx5XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIG9wdGlvbnMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb25seSB0aGUgdmFsdWUgZGlzcGxheSBhbmQgZGlhbCBwb3NpdGlvbiB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIGNoYXJ0XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVBbmREaWFsKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICBjb25zdCBtYXhWYWx1ZSA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgb3B0aW9ucy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kMy5zZWxlY3QodGhpcy5zdmdFbGVtZW50KTtcblxuICAgIC8vIFVwZGF0ZSB2YWx1ZSB0ZXh0XG4gICAgc3ZnLnNlbGVjdCgnLmdhdWdlLXZhbHVlJykudGV4dChjdXJyZW50VmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBVcGRhdGUgbmVlZGxlIHBvc2l0aW9uXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3QoJy5nYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3QmFja2dyb3VuZEFyYyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGNvcm5lclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYXJjIGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5zdGFydEFuZ2xlKC10aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIFN0YXJ0IGZyb20gYm90dG9tICgtOTAgZGVncmVlcylcbiAgICAgIC5lbmRBbmdsZSh0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIEVuZCBhdCB0b3AgKDkwIGRlZ3JlZXMpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IGJhY2tncm91bmQgYXJjXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdGggPSBjaGFydEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgYmFja2dyb3VuZEFyYylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgZ2F1Z2UtYmFzZScpXG4gICAgICAuYXR0cignZmlsbCcsIGB1cmwoIyR7dGhpcy5iZ0dyYWRpZW50SWR9KWApXG4gICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDBweCAycHggM3B4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgIC8vIEFkZCB0b29sdGlwIGZvciBzaW5nbGUgYXJjIGlmIG5vIHRocmVzaG9sZHNcbiAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMgfHwgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJhY2tncm91bmRQYXRoXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHRocmVzaG9sZHMgYXJjc1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGhyZXNob2xkcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH1bXSxcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBnZW5lcmF0b3JcbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cyAqIDAuOTgpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBTb3J0IHRocmVzaG9sZHMgYnkgdmFsdWUgaW4gYXNjZW5kaW5nIG9yZGVyIChvbmx5IGlmIG5lZWRlZClcbiAgICBjb25zdCBzb3J0ZWRUaHJlc2hvbGRzID0gdGhyZXNob2xkcy5sZW5ndGggPiAxID8gWy4uLnRocmVzaG9sZHNdLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSA6IHRocmVzaG9sZHM7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWxsIGFuZ2xlcyBmaXJzdCB1c2luZyB0aGUgY29sb3IgYW5nbGUgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbmdsZXMgPSBzb3J0ZWRUaHJlc2hvbGRzLm1hcCgodCkgPT4gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHQudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpO1xuXG4gICAgLy8gU3RhcnQgZnJvbSB0aGUgbWluaW11bSB2YWx1ZSBhbmdsZVxuICAgIGxldCBwcmV2aW91c0VuZEFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKG1pblZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuXG4gICAgc29ydGVkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVuZEFuZ2xlID0gYW5nbGVzW2ldO1xuXG4gICAgICAvLyBTa2lwIGlmIGVuZCBhbmdsZSBpcyBub3QgZ3JlYXRlciB0aGFuIHN0YXJ0IGFuZ2xlXG4gICAgICBpZiAoZW5kQW5nbGUgPD0gcHJldmlvdXNFbmRBbmdsZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmNQYXRoID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgdGhyZXNob2xkLmNvbG9yIHx8IGB1cmwoIyR7dGhpcy50aHJlc2hvbGRHcmFkaWVudElkKGkpfSlgKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIHRocmVzaG9sZC1hcmMnKVxuICAgICAgICAuYXR0cignZGF0YS12YWx1ZScsIHRocmVzaG9sZC52YWx1ZSlcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBpbnRlcmFjdGlvblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIC8vIENvbnZlcnQgYW5nbGVzIGJhY2sgdG8gdmFsdWVzIGZvciB0b29sdGlwXG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHRocmVzaG9sZC52YWx1ZTtcblxuICAgICAgICBhcmNQYXRoXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dUaHJlc2hvbGRUb29sdGlwKGV2ZW50LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgdGhyZXNob2xkLmNvbG9yLCB0aHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwcmV2aW91cyBlbmQgYW5nbGUgZm9yIHRoZSBuZXh0IHRocmVzaG9sZFxuICAgICAgcHJldmlvdXNFbmRBbmdsZSA9IGVuZEFuZ2xlO1xuICAgIH0pO1xuXG4gICAgLy8gRHJhdyB0aGUgbGFzdCBzZWdtZW50IGlmIHRoZSBsYXN0IHRocmVzaG9sZCBpcyBsZXNzIHRoYW4gdGhlIG1heCB2YWx1ZVxuICAgIGlmIChwcmV2aW91c0VuZEFuZ2xlIDwgdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSB7XG4gICAgICBjb25zdCBsYXN0QXJjID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCBgdXJsKCMke3RoaXMuYmdHcmFkaWVudElkfSlgKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIHRocmVzaG9sZC1hcmMnKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIC8vIEFkZCB0b29sdGlwIGZvciB0aGUgbGFzdCBzZWdtZW50XG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHRoaXMuYW5nbGVUb1ZhbHVlKHByZXZpb3VzRW5kQW5nbGUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gbWF4VmFsdWU7XG4gICAgICAgIGNvbnN0IGxhc3RUaHJlc2hvbGQgPSB0aHJlc2hvbGRzW3RocmVzaG9sZHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdEFyY1xuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIGxhc3RUaHJlc2hvbGQuY29sb3IsIGxhc3RUaHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdG9vbHRpcCBmb3IgYSB0aHJlc2hvbGQgYXJjXG4gICAqL1xuICBwcml2YXRlIHNob3dUaHJlc2hvbGRUb29sdGlwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHN0YXJ0VmFsdWU6IG51bWJlcixcbiAgICBlbmRWYWx1ZTogbnVtYmVyLFxuICAgIGNvbG9yOiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSB0b29sdGlwIGRhdGFcbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7c3RhcnRWYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7ZW5kVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6IGNvbG9yLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciB0aGUgZW50aXJlIHJhbmdlIHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGlmICghb3B0aW9ucy5zaG93VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICB0aXRsZTogb3B0aW9ucy5sYWJlbCB8fCAnUmFuZ2UnLFxuICAgICAgdmFsdWU6IGAke29wdGlvbnMubWluVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX0gLSAke29wdGlvbnMubWF4VmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6ICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyxcbiAgICB9KTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgPz8gbnVsbDtcbiAgICAgIGNvbnN0IHBvcyA9IGNvbXB1dGVUb29sdGlwUG9zaXRpb24ocmVjdCwgdG9vbHRpcFJlY3QsIGNvb3Jkcy54ICsgMTAsIGNvb3Jkcy55IC0gMTAsIHRoaXMuVE9PTFRJUF9HQVApO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSB0b29sdGlwXG4gICAqL1xuICBwcml2YXRlIGhpZGVUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBSYWZJZCk7XG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5zdmdFbGVtZW50KSB7XG4gICAgICB0aGlzLnN2Z0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN2Z0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtY2hhcnQtZW1wdHknKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZ3JhZGllbnQgZGVmaW5pdGlvbnMgZm9yIHRocmVzaG9sZHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlR3JhZGllbnRzKFxuICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR1NWR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdGhyZXNob2xkczogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nIH1bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTtcblxuICAgIC8vIENyZWF0ZSBhIHJhZGlhbCBncmFkaWVudCBmb3IgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiZ0dyYWRpZW50ID0gZGVmc1xuICAgICAgLmFwcGVuZCgncmFkaWFsR3JhZGllbnQnKVxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy5iZ0dyYWRpZW50SWQpXG4gICAgICAuYXR0cignY3gnLCAnNTAlJylcbiAgICAgIC5hdHRyKCdjeScsICc1MCUnKVxuICAgICAgLmF0dHIoJ3InLCAnNTAlJylcbiAgICAgIC5hdHRyKCdncmFkaWVudFVuaXRzJywgJ3VzZXJTcGFjZU9uVXNlJyk7XG5cbiAgICAvLyBHZXQgQ1NTIHZhcmlhYmxlIGZvciB0cmFjayBjb2xvclxuICAgIGlmICh0aHJlc2hvbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRGVmYXVsdCBncmFkaWVudCB3aGVuIG5vIHRocmVzaG9sZHMgYXJlIHByb3ZpZGVkXG4gICAgICBiZ0dyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcwJScpLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpKScpO1xuICAgICAgYmdHcmFkaWVudFxuICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgLmF0dHIoJ29mZnNldCcsICcxMDAlJylcbiAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSwgMC44KScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZ0dyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcwJScpLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpKScpO1xuICAgICAgYmdHcmFkaWVudFxuICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgLmF0dHIoJ29mZnNldCcsICcxMDAlJylcbiAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSwgMC44KScpO1xuXG4gICAgICAvLyBDcmVhdGUgZ3JhZGllbnRzIGZvciBlYWNoIHRocmVzaG9sZFxuICAgICAgdGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBkZWZzXG4gICAgICAgICAgLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKVxuICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMudGhyZXNob2xkR3JhZGllbnRJZChpKSlcbiAgICAgICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgJy0xJylcbiAgICAgICAgICAuYXR0cigneTEnLCAnMCcpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgJzEnKVxuICAgICAgICAgIC5hdHRyKCd5MicsICcwJyk7XG5cbiAgICAgICAgZ3JhZGllbnRcbiAgICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgICAuYXR0cignb2Zmc2V0JywgJzAlJylcbiAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIHRoaXMuZDMuY29sb3IodGhyZXNob2xkLmNvbG9yKT8uYnJpZ2h0ZXIoMC41KS50b1N0cmluZygpIHx8IHRocmVzaG9sZC5jb2xvcik7XG5cbiAgICAgICAgZ3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzEwMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgdGhyZXNob2xkLmNvbG9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aWNrIG1hcmtzIGFuZCBsYWJlbHMgYXJvdW5kIHRoZSBnYXVnZVxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGlja3MoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgdGlja0NvdW50OiBudW1iZXIsXG4gICAgdGlja0ZvbnRQeDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aWNrTGVuZ3RoID0gTWF0aC5tYXgoNCwgTWF0aC5taW4ocmFkaXVzICogMC4xMiwgMTQpKTtcbiAgICBjb25zdCBiYXNlTGFiZWxPZmZzZXQgPSB0aGlzLmdldEJhc2VMYWJlbE9mZnNldChyYWRpdXMsIHRpY2tMZW5ndGgsIHRpY2tGb250UHgpO1xuICAgIGNvbnN0IHRpY2tHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAndGlja3MnKTtcblxuICAgIGNvbnN0IHRpY2tWYWx1ZXMgPSBbXSBhcyBudW1iZXJbXTtcbiAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gbWluVmFsdWUpIC8gKHRpY2tDb3VudCAtIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcbiAgICAgIHRpY2tWYWx1ZXMucHVzaChtaW5WYWx1ZSArIGkgKiBzdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrTWV0cmljcyA9IHRpY2tWYWx1ZXMubWFwKCh0aWNrKSA9PiB7XG4gICAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUodGljaywgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgIGNvbnN0IHJhZGlhbnMgPSBhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJhZGlhbnMsXG4gICAgICAgIGNvczogTWF0aC5jb3MocmFkaWFucyksXG4gICAgICAgIHNpbjogTWF0aC5zaW4ocmFkaWFucyksXG4gICAgICAgIGxhYmVsOiB0aGlzLmZvcm1hdFRpY2tWYWx1ZSh0aWNrLCBtaW5WYWx1ZSwgbWF4VmFsdWUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRpY2tNZXRyaWNzLmZvckVhY2goKG1ldHJpYykgPT4ge1xuICAgICAgdGlja0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAuYXR0cigneDEnLCBtZXRyaWMuY29zICogKHJhZGl1cyArIDUpKVxuICAgICAgICAuYXR0cigneTEnLCBtZXRyaWMuc2luICogKHJhZGl1cyArIDUpKVxuICAgICAgICAuYXR0cigneDInLCBtZXRyaWMuY29zICogKHJhZGl1cyArIHRpY2tMZW5ndGgpKVxuICAgICAgICAuYXR0cigneTInLCBtZXRyaWMuc2luICogKHJhZGl1cyArIHRpY2tMZW5ndGgpKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC41KScpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRleHRTZWxlY3Rpb24gPSB0aWNrR3JvdXBcbiAgICAgIC5zZWxlY3RBbGw8U1ZHVGV4dEVsZW1lbnQsICh0eXBlb2YgdGlja01ldHJpY3MpW251bWJlcl0+KCd0ZXh0LmdhdWdlLXRpY2stbGFiZWwnKVxuICAgICAgLmRhdGEodGlja01ldHJpY3MpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdGljay1sYWJlbCcpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIDApXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvciksIDAuNyknKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt0aWNrRm9udFB4fXB4YClcbiAgICAgIC50ZXh0KChkKSA9PiBkLmxhYmVsKTtcblxuICAgIHRleHRTZWxlY3Rpb24uZWFjaCgoZCwgaW5kZXgsIG5vZGVzKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaW5kZXhdO1xuICAgICAgbGV0IGJib3hXaWR0aCA9IHRoaXMuZXN0aW1hdGVMYWJlbFdpZHRoKGQubGFiZWwsIHRpY2tGb250UHgpO1xuICAgICAgbGV0IGJib3hIZWlnaHQgPSB0aWNrRm9udFB4O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmJveCA9IG5vZGUuZ2V0QkJveCgpO1xuICAgICAgICBpZiAoYmJveC53aWR0aCA+IDApIGJib3hXaWR0aCA9IGJib3gud2lkdGg7XG4gICAgICAgIGlmIChiYm94LmhlaWdodCA+IDApIGJib3hIZWlnaHQgPSBiYm94LmhlaWdodDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGVzdGltYXRlcy5cbiAgICAgIH1cblxuICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5nZXRUaWNrTGFiZWxBbmNob3IoZC5jb3MpO1xuICAgICAgY29uc3QgbmVhckVkZ2VFeHRlbnQgPSB0aGlzLmdldE5lYXJFZGdlUHJvamVjdGlvbihhbmNob3IsIGQuY29zLCBkLnNpbiwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICAgIGNvbnN0IHJlcXVpcmVkT2Zmc2V0ID0gdGlja0xlbmd0aCArIHRoaXMuTEFCRUxfVElDS19DTEVBUkFOQ0UgKyBuZWFyRWRnZUV4dGVudDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUxhYmVsT2Zmc2V0ID0gTWF0aC5tYXgoYmFzZUxhYmVsT2Zmc2V0LCByZXF1aXJlZE9mZnNldCk7XG4gICAgICBjb25zdCBudWRnZSA9IHRpY2tGb250UHggKiAwLjE7XG5cbiAgICAgIGNvbnN0IHggPSBkLmNvcyAqIChyYWRpdXMgKyBlZmZlY3RpdmVMYWJlbE9mZnNldCkgKyAoYW5jaG9yID09PSAnc3RhcnQnID8gbnVkZ2UgOiBhbmNob3IgPT09ICdlbmQnID8gLW51ZGdlIDogMCk7XG4gICAgICBjb25zdCB5ID0gZC5zaW4gKiAocmFkaXVzICsgZWZmZWN0aXZlTGFiZWxPZmZzZXQpO1xuXG4gICAgICB0aGlzLmQzLnNlbGVjdChub2RlKS5hdHRyKCd4JywgeCkuYXR0cigneScsIHkpLmF0dHIoJ3RleHQtYW5jaG9yJywgYW5jaG9yKS5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0NvdW50KHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHNpemUgPCAyMDApIHJldHVybiAzO1xuICAgIGlmIChzaXplIDwgMzAwKSByZXR1cm4gNDtcbiAgICBpZiAoc2l6ZSA8IDQwMCkgcmV0dXJuIDU7XG4gICAgaWYgKHNpemUgPiA1MjApIHJldHVybiA3O1xuICAgIHJldHVybiA1O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrRm9udFNpemUoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMTQsIE1hdGgubWluKDE4LCBNYXRoLmZsb29yKHNpemUgLyAzNSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmFzZUxhYmVsT2Zmc2V0KHJhZGl1czogbnVtYmVyLCB0aWNrTGVuZ3RoOiBudW1iZXIsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbGFiZWxHYXAgPSBNYXRoLm1heCg2LCBNYXRoLm1pbihyYWRpdXMgKiAwLjA2LCAxNCkpO1xuICAgIHJldHVybiB0aWNrTGVuZ3RoICsgbGFiZWxHYXAgKyB0aWNrRm9udFB4ICogMC4yO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrTGFiZWxBbmNob3IoY29zVmFsdWU6IG51bWJlcik6ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnIHtcbiAgICBpZiAoY29zVmFsdWUgPiAwLjM1KSByZXR1cm4gJ3N0YXJ0JztcbiAgICBpZiAoY29zVmFsdWUgPCAtMC4zNSkgcmV0dXJuICdlbmQnO1xuICAgIHJldHVybiAnbWlkZGxlJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmVhckVkZ2VQcm9qZWN0aW9uKFxuICAgIGFuY2hvcjogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCcsXG4gICAgY29zVmFsdWU6IG51bWJlcixcbiAgICBzaW5WYWx1ZTogbnVtYmVyLFxuICAgIGJib3hXaWR0aDogbnVtYmVyLFxuICAgIGJib3hIZWlnaHQ6IG51bWJlcixcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBhYnNDb3MgPSBNYXRoLmFicyhjb3NWYWx1ZSk7XG4gICAgY29uc3QgYWJzU2luID0gTWF0aC5hYnMoc2luVmFsdWUpO1xuICAgIGNvbnN0IGhhbGZIZWlnaHRQcm9qZWN0aW9uID0gYWJzU2luICogKGJib3hIZWlnaHQgLyAyKTtcblxuICAgIC8vIEZvciBzdGFydC9lbmQgYW5jaG9yZWQgbGFiZWxzIG9uIGVkZ2UgdGlja3MsIHRoZSBuZWFyZXN0IHNpZGUgaXMgY2xvc2UgdG8gdGhlIGFuY2hvciBwb2ludC5cbiAgICBpZiAoYW5jaG9yID09PSAnc3RhcnQnIHx8IGFuY2hvciA9PT0gJ2VuZCcpIHtcbiAgICAgIHJldHVybiBoYWxmSGVpZ2h0UHJvamVjdGlvbiArIGFic0NvcyAqIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gICAgfVxuXG4gICAgLy8gRm9yIGNlbnRlcmVkIGxhYmVscywgbmVhcmVzdCBzaWRlIGluY2x1ZGVzIGhhbGYgdGV4dCB3aWR0aCBwcm9qZWN0aW9uLlxuICAgIHJldHVybiBhYnNDb3MgKiAoYmJveFdpZHRoIC8gMikgKyBoYWxmSGVpZ2h0UHJvamVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGlja1ZhbHVlKHRpY2s6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heFZhbHVlIC0gbWluVmFsdWU7XG4gICAgaWYgKHZhbHVlUmFuZ2UgPD0gMTApIHtcbiAgICAgIHJldHVybiB0aWNrLnRvRml4ZWQoMikucmVwbGFjZSgvXFwuPzArJC8sICcnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlUmFuZ2UgPCAxMDAwKSB7XG4gICAgICByZXR1cm4gdGljayAlIDEgPT09IDAgPyB0aWNrLnRvU3RyaW5nKCkgOiB0aWNrLnRvRml4ZWQoMSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRMYXJnZU51bWJlcihNYXRoLnJvdW5kKHRpY2spKTtcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVMYWJlbFdpZHRoKGxhYmVsOiBzdHJpbmcsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxhYmVsLmxlbmd0aCAqIHRpY2tGb250UHggKiB0aGlzLlRJQ0tfTEFCRUxfQ0hBUl9XSURUSF9SQVRJTyArIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gIH1cblxuICBwcml2YXRlIGVzdGltYXRlTWF4VGlja0xhYmVsV2lkdGgodGlja0NvdW50OiBudW1iZXIsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRpY2tDb3VudCA8PSAxKSByZXR1cm4gdGlja0ZvbnRQeDtcbiAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gbWluVmFsdWUpIC8gKHRpY2tDb3VudCAtIDEpO1xuICAgIGxldCBtYXhDaGFycyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmZvcm1hdFRpY2tWYWx1ZShtaW5WYWx1ZSArIGkgKiBzdGVwLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgbWF4Q2hhcnMgPSBNYXRoLm1heChtYXhDaGFycywgbGFiZWwubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIG1heENoYXJzICogdGlja0ZvbnRQeCAqIHRoaXMuVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPICsgdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgdmFsdWUgYW5kIGxhYmVsIHRleHQgaW4gdGhlIGNlbnRlclxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VmFsdWVEaXNwbGF5KFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBQeC1iYXNlZCBzY2FsaW5nIGZvciByb2J1c3Qgc21hbGwvbGFyZ2Ugc2l6ZXMgd2l0aCBiZXR0ZXIgc21hbGwtc2l6ZSBoYW5kbGluZ1xuICAgIGNvbnN0IHZhbHVlRm9udFB4ID0gTWF0aC5tYXgoMTgsIE1hdGgubWluKDMyLCBNYXRoLmZsb29yKHNpemUgLyA4KSkpO1xuICAgIGNvbnN0IGxhYmVsRm9udFB4ID0gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE2LCBNYXRoLmZsb29yKHZhbHVlRm9udFB4ICogMC41NSkpKTtcbiAgICAvLyBNb3JlIHZlcnRpY2FsIGdhcCBmb3Igc21hbGwgc2l6ZXM6IHVzZSBsYXJnZXIgYmFzZSB2YWx1ZVxuICAgIGNvbnN0IHZlcnRpY2FsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oMTIsIE1hdGguZmxvb3Ioc2l6ZSAvIDQwKSkpO1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdmFsdWUgZGlzcGxheVxuICAgIGNvbnN0IHZhbHVlR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXZhbHVlLWRpc3BsYXknKS5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB2YWx1ZSBkaXNwbGF5XG4gICAgdmFsdWVHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdmFsdWUnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCByYWRpdXMgKiAwLjE1ICsgdmFsdWVGb250UHgpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3ZhbHVlRm9udFB4fXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSknKVxuICAgICAgLnRleHQodmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBBZGQgbGFiZWwgZGlzcGxheSAoaWYgcHJvdmlkZWQpXG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICB2YWx1ZUdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbGFiZWwnKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5hdHRyKCd5JywgcmFkaXVzICogMC4yNCArIHZhbHVlRm9udFB4ICsgdmVydGljYWxHYXApXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7bGFiZWxGb250UHh9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAgIC50ZXh0KGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGRpYWwvbmVlZGxlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIHdpdGggYW5pbWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRyYXdEaWFsKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDbGFtcCB2YWx1ZSB0byBtaW4vbWF4IHJhbmdlXG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5tYXgobWluVmFsdWUsIE1hdGgubWluKG1heFZhbHVlLCB2YWx1ZSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZ2xlIGZvciBuZWVkbGUgYmFzZWQgb24gdmFsdWVcbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUoY2xhbXBlZFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgIGNvbnN0IGFuZ2xlSW5EZWdyZWVzID0gdGhpcy5yYWRpYW5zVG9EZWdyZWVzKGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbmVlZGxlXG4gICAgY29uc3QgZGlhbEdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkaWFsJyk7XG5cbiAgICAvLyBEcmF3IHRoZSBuZWVkbGUgd2l0aCBpbml0aWFsIHBvc2l0aW9uIGF0IG1pbmltdW0gdmFsdWVcbiAgICBjb25zdCBuZWVkbGVQYXRoID0gZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgdGhpcy5jcmVhdGVOZWVkbGVQYXRoKHJhZGl1cykpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbmVlZGxlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7dGhpcy5yYWRpYW5zVG9EZWdyZWVzKC10aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpfSlgKTsgLy8gU3RhcnQgYXQgLTE4MCBkZWdyZWVzIChsZWZ0KVxuXG4gICAgLy8gQWRkIGEgY2VudGVyIGNpcmNsZVxuICAgIGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgIC5hdHRyKCdjeCcsIDApXG4gICAgICAuYXR0cignY3knLCAwKVxuICAgICAgLmF0dHIoJ3InLCByYWRpdXMgKiAwLjA4KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICcjZmZmJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcblxuICAgIC8vIEFkZCBhIHNtYWxsZXIgd2hpdGUgY2VudGVyXG4gICAgZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2N4JywgMClcbiAgICAgIC5hdHRyKCdjeScsIDApXG4gICAgICAuYXR0cigncicsIHJhZGl1cyAqIDAuMDMpXG4gICAgICAuYXR0cignZmlsbCcsICcjZmZmJyk7XG5cbiAgICAvLyBHZXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgY29uc3QgZWFzaW5nRnVuY3Rpb24gPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLm9wdGlvbnMoKT8uYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIEFuaW1hdGUgdGhlIG5lZWRsZSBmcm9tIG1pbiB0byBjdXJyZW50IHZhbHVlXG4gICAgbmVlZGxlUGF0aFxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGF0aCBzdHJpbmcgZm9yIHRoZSBuZWVkbGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTmVlZGxlUGF0aChyYWRpdXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbmVlZGxlTGVuZ3RoID0gcmFkaXVzICogMC44O1xuICAgIGNvbnN0IG5lZWRsZVdpZHRoID0gcmFkaXVzICogMC4wNjtcbiAgICByZXR1cm4gYE0gMCwke25lZWRsZVdpZHRoIC8gMn0gTCAke25lZWRsZUxlbmd0aH0sMCBMIDAsJHstbmVlZGxlV2lkdGggLyAyfSBaYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgYSB2YWx1ZSB0byBhbiBhbmdsZSAoaW4gcmFkaWFucylcbiAgICovXG4gIHByaXZhdGUgc2NhbGVWYWx1ZVRvQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gdmFsdWVSYW5nZSkgKiB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGVzIGEgdmFsdWUgdG8gYW4gYW5nbGUgZm9yIGNvbG9yIGFyY3MgKGluIHJhZGlhbnMpXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVmFsdWVUb0NvbG9yQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gdmFsdWVSYW5nZSkgKiB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gYW5nbGUgYmFjayB0byBhIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFuZ2xlVG9WYWx1ZShhbmdsZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICByZXR1cm4gbWluICsgKChhbmdsZSArIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykgLyB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpICogdmFsdWVSYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyByYWRpYW5zIHRvIGRlZ3JlZXNcbiAgICovXG4gIHByaXZhdGUgcmFkaWFuc1RvRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByYWRpYW5zICogdGhpcy5ERUdSRUVTX1BFUl9SQURJQU47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1nYXVnZS1jaGFydFwiIHJvbGU9XCJpbWdcIiAjY2hhcnRDb250YWluZXI+XG4gIDxheC1jaGFydC10b29sdGlwIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIiBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIiBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCI+PC9heC1jaGFydC10b29sdGlwPlxuPC9kaXY+XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../../../../packages/charts/gauge-chart/src/lib/gauge-chart.config.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.ts","../../../../packages/charts/gauge-chart/src/lib/gauge-chart.component.html","../../../../packages/charts/gauge-chart/src/acorex-charts-gauge-chart.ts"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nimport { AXGaugeChartOption } from './gauge-chart.type';\n\nexport const AXGaugeChartDefaultConfig: AXGaugeChartOption = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\n\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken<AXGaugeChartOption>('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\n\nexport type PartialGaugeChartConfig = Partial<AXGaugeChartOption>;\n\nexport function gaugeChartConfig(config: PartialGaugeChartConfig = {}): AXGaugeChartOption {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n","import {\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n createChartInstanceId,\n formatLargeNumber,\n getEasingFunction,\n mergeChartMessages,\n mergeChartOptions,\n renderChartEmptyMessage,\n} from '@acorex/charts';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport { AXGaugeChartOption, AXGaugeChartValue } from './gauge-chart.type';\n\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\n@Component({\n selector: 'ax-gauge-chart',\n templateUrl: './gauge-chart.component.html',\n styleUrls: ['./gauge-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXGaugeChartComponent extends AXChartComponent implements OnDestroy, AXChartComponentBase {\n // Inputs\n /** Chart value input */\n value = input<AXGaugeChartValue>(0);\n\n /** Chart options input */\n options = input<AXGaugeChartOption>({});\n\n // Chart container reference\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n\n // SVG element reference (created in the code)\n private svgElement: SVGSVGElement | null = null;\n\n // D3 reference - loaded asynchronously\n protected d3!: typeof import('d3');\n\n // Signals for component state\n private _initialized = signal(false);\n private _rendered = signal(false);\n private _prevValue = signal<number | null>(null);\n\n // Track previous options to detect changes\n private _prevOptionsString = '';\n\n // Cache for container dimensions to avoid repeated DOM reads\n private _lastContainerRect: { width: number; height: number } | null = null;\n\n // Tooltip signals\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n // Expose tooltip signals as read-only for the template\n protected tooltipVisible = this._tooltipVisible.asReadonly();\n protected tooltipPosition = this._tooltipPosition.asReadonly();\n protected tooltipData = this._tooltipData.asReadonly();\n\n // Inject configuration\n private configToken = inject(AX_GAUGE_CHART_CONFIG);\n\n // Computed configuration options\n protected effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()));\n\n protected effectiveMessages = computed(() =>\n mergeChartMessages(this.configToken.messages, this.options()?.messages),\n );\n\n // Constants\n private readonly TOOLTIP_GAP = 10;\n private readonly HALF_CIRCLE_RADIANS = Math.PI;\n private readonly QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n private readonly DEGREES_PER_RADIAN = 180 / Math.PI;\n private readonly CHART_EDGE_PADDING = 12;\n private readonly TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n private readonly TICK_LABEL_SIDE_PADDING = 6;\n private readonly LABEL_TICK_CLEARANCE = 4;\n private readonly instanceId = createChartInstanceId('ax-gauge');\n\n private get bgGradientId(): string {\n return `${this.instanceId}-bg-gradient`;\n }\n\n private thresholdGradientId(index: number): string {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\n\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n\n // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n } else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n } else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n /**\n * Loads D3.js dynamically\n */\n protected async loadD3(): Promise<void> {\n if (this.d3) return; // Already loaded\n\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n } catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n\n /**\n * Creates the gauge chart with all elements\n */\n public createChart(): void {\n const containerElement = this.chartContainerEl().nativeElement;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n\n const currentValue = this.value() as number;\n\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n\n // Get current options\n const options = this.effectiveOptions();\n\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr(\n 'transform',\n `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`,\n );\n\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n\n /**\n * Updates the chart when options change\n */\n public updateChart(): void {\n this.createChart();\n }\n\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n public updateValueAndDial(value: number): void {\n if (!this.svgElement) return;\n\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n /**\n * Draw the background arc\n */\n private drawBackgroundArc(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n cornerRadius: number,\n ): void {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip) return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n\n /**\n * Draw the thresholds arcs\n */\n private drawThresholds(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n innerRadius: number,\n outerRadius: number,\n minValue: number,\n maxValue: number,\n thresholds: { value: number; color: string; label?: string }[],\n cornerRadius: number,\n ): void {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle) return;\n\n const arcPath = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }),\n )\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr(\n 'd',\n arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }),\n )\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n\n /**\n * Shows tooltip for a threshold arc\n */\n private showThresholdTooltip(\n event: MouseEvent,\n startValue: number,\n endValue: number,\n color: string,\n label?: string,\n ): void {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n private showSingleRangeTooltip(event: MouseEvent): void {\n const options = this.effectiveOptions();\n if (!options.showTooltip) return;\n\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n\n private updateTooltipPosition(event: MouseEvent): void {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null) return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords) return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n\n /**\n * Hides the tooltip\n */\n private hideTooltip(): void {\n this._tooltipVisible.set(false);\n }\n\n /**\n * Cleans up chart resources\n */\n public cleanupChart(): void {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n\n /**\n * Creates gradient definitions for thresholds\n */\n private createGradients(\n svg: d3.Selection<SVGSVGElement, unknown, null, undefined>,\n thresholds: { value: number; color: string }[],\n ): void {\n const defs = svg.append('defs');\n\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n } else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n\n /**\n * Draws tick marks and labels around the gauge\n */\n private drawTicks(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n minValue: number,\n maxValue: number,\n size: number,\n tickCount: number,\n tickFontPx: number,\n ): void {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n\n const tickValues = [] as number[];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n\n const textSelection = tickGroup\n .selectAll<SVGTextElement, (typeof tickMetrics)[number]>('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0) bboxWidth = bbox.width;\n if (bbox.height > 0) bboxHeight = bbox.height;\n } catch {\n // Keep fallback estimates.\n }\n\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n\n private getTickCount(size: number): number {\n if (size < 200) return 3;\n if (size < 300) return 4;\n if (size < 400) return 5;\n if (size > 520) return 7;\n return 5;\n }\n\n private getTickFontSize(size: number): number {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n\n private getBaseLabelOffset(radius: number, tickLength: number, tickFontPx: number): number {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n\n private getTickLabelAnchor(cosValue: number): 'start' | 'middle' | 'end' {\n if (cosValue > 0.35) return 'start';\n if (cosValue < -0.35) return 'end';\n return 'middle';\n }\n\n private getNearEdgeProjection(\n anchor: 'start' | 'middle' | 'end',\n cosValue: number,\n sinValue: number,\n bboxWidth: number,\n bboxHeight: number,\n ): number {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n\n private formatTickValue(tick: number, minValue: number, maxValue: number): string {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n\n private estimateLabelWidth(label: string, tickFontPx: number): number {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n private estimateMaxTickLabelWidth(tickCount: number, minValue: number, maxValue: number, tickFontPx: number): number {\n if (tickCount <= 1) return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n\n /**\n * Draws the value and label text in the center\n */\n private drawValueDisplay(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n value: number,\n label: string,\n radius: number,\n size: number,\n ): void {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n private drawDial(\n chartGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n radius: number,\n value: number,\n minValue: number,\n maxValue: number,\n animationDuration: number,\n ): void {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n\n // getEasingFunction moved to shared chart utils\n\n /**\n * Creates a path string for the needle\n */\n private createNeedlePath(radius: number): string {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n\n /**\n * Scales a value to an angle (in radians)\n */\n private scaleValueToAngle(value: number, min: number, max: number): number {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n private scaleValueToColorAngle(value: number, min: number, max: number): number {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n\n /**\n * Converts an angle back to a value\n */\n private angleToValue(angle: number, min: number, max: number): number {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n\n /**\n * Converts radians to degrees\n */\n private radiansToDegrees(radians: number): number {\n return radians * this.DEGREES_PER_RADIAN;\n }\n}\n","<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -44,8 +44,8 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
44
44
|
// Inject config at the top level
|
|
45
45
|
defaultConfig = inject(AX_HEATMAP_CHART_CONFIG);
|
|
46
46
|
// Inputs
|
|
47
|
-
data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
|
|
48
|
-
options = input({}, ...(ngDevMode ? [{ debugName: "options" }] : []));
|
|
47
|
+
data = input([], ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
48
|
+
options = input({}, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
49
49
|
// Outputs
|
|
50
50
|
/** Emitted when a heatmap cell is clicked */
|
|
51
51
|
cellClick = output();
|
|
@@ -54,18 +54,18 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
54
54
|
// Internal State
|
|
55
55
|
svg;
|
|
56
56
|
d3;
|
|
57
|
-
_d3Ready = signal(false, ...(ngDevMode ? [{ debugName: "_d3Ready" }] : []));
|
|
57
|
+
_d3Ready = signal(false, ...(ngDevMode ? [{ debugName: "_d3Ready" }] : /* istanbul ignore next */ []));
|
|
58
58
|
platformService = inject(AXPlatform);
|
|
59
|
-
isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : []));
|
|
59
|
+
isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : /* istanbul ignore next */ []));
|
|
60
60
|
directionSub;
|
|
61
61
|
// Tooltip State
|
|
62
|
-
tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: "tooltipVisible" }] : []));
|
|
63
|
-
tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "tooltipPosition" }] : []));
|
|
64
|
-
tooltipData = signal({ title: '', value: '' }, ...(ngDevMode ? [{ debugName: "tooltipData" }] : []));
|
|
62
|
+
tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: "tooltipVisible" }] : /* istanbul ignore next */ []));
|
|
63
|
+
tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []));
|
|
64
|
+
tooltipData = signal({ title: '', value: '' }, ...(ngDevMode ? [{ debugName: "tooltipData" }] : /* istanbul ignore next */ []));
|
|
65
65
|
_tooltipRafId = null;
|
|
66
66
|
// Computed options (referencing the already injected defaultConfig)
|
|
67
|
-
effectiveOptions = computed(() => mergeChartOptions(this.defaultConfig, this.options()), ...(ngDevMode ? [{ debugName: "effectiveOptions" }] : []));
|
|
68
|
-
effectiveMessages = computed(() => mergeChartMessages(this.defaultConfig.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: "effectiveMessages" }] : []));
|
|
67
|
+
effectiveOptions = computed(() => mergeChartOptions(this.defaultConfig, this.options()), ...(ngDevMode ? [{ debugName: "effectiveOptions" }] : /* istanbul ignore next */ []));
|
|
68
|
+
effectiveMessages = computed(() => mergeChartMessages(this.defaultConfig.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: "effectiveMessages" }] : /* istanbul ignore next */ []));
|
|
69
69
|
constructor() {
|
|
70
70
|
super();
|
|
71
71
|
afterNextRender(() => {
|
|
@@ -389,13 +389,13 @@ class AXHeatmapChartComponent extends AXChartComponent {
|
|
|
389
389
|
texts.attr('transform', null).style('text-anchor', 'middle').attr('dx', null).attr('dy', '0.71em');
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
393
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
392
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHeatmapChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
393
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXHeatmapChartComponent, isStandalone: true, selector: "ax-heatmap-chart", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellClick: "cellClick" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-heatmap-chart-container\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n </ax-chart-tooltip>\n @if (data()?.length === 0) {\n <div class=\"ax-chart-empty\">\n <div class=\"ax-chart-empty__card\">\n <div class=\"ax-chart-empty__icon\">\n <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n </div>\n </div>\n }\n</div>\n", styles: [".ax-chart-empty{position:absolute;inset:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-heatmap-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-heatmap-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-bg-color: 0, 0, 0, 0}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:rgba(var(--ax-comp-heatmap-chart-bg-color))}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg g:has(text){font-family:inherit}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-labels-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.2)}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
394
394
|
}
|
|
395
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
395
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHeatmapChartComponent, decorators: [{
|
|
396
396
|
type: Component,
|
|
397
|
-
args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-heatmap-chart-container\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n </ax-chart-tooltip>\n @if (data()?.length === 0) {\n <div class=\"ax-chart-empty\">\n <div class=\"ax-chart-empty__card\">\n <div class=\"ax-chart-empty__icon\">\n <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n </div>\n </div>\n }\n</div>\n", styles: [".ax-chart-empty{position:absolute;
|
|
398
|
-
}], ctorParameters: () => [] });
|
|
397
|
+
args: [{ selector: 'ax-heatmap-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-heatmap-chart-container\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\">\n </ax-chart-tooltip>\n @if (data()?.length === 0) {\n <div class=\"ax-chart-empty\">\n <div class=\"ax-chart-empty__card\">\n <div class=\"ax-chart-empty__icon\">\n <i [class]=\"effectiveMessages().noDataIcon + ' fa-2x'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"ax-chart-empty__title\">{{ effectiveMessages().noData }}</div>\n <div class=\"ax-chart-empty__help\">{{ effectiveMessages().noDataHelp }}</div>\n </div>\n </div>\n }\n</div>\n", styles: [".ax-chart-empty{position:absolute;inset:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-heatmap-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-heatmap-chart-axis-label-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-heatmap-chart-bg-color: 0, 0, 0, 0}ax-heatmap-chart .ax-heatmap-chart-container{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:1rem;overflow:hidden;background-color:rgba(var(--ax-comp-heatmap-chart-bg-color))}ax-heatmap-chart .ax-heatmap-chart-container svg{display:block;width:100%;height:100%;overflow:visible}ax-heatmap-chart .ax-heatmap-chart-container svg g:has(text){font-family:inherit}ax-heatmap-chart .ax-heatmap-chart-container svg .cell{transition:stroke .15s ease}ax-heatmap-chart .ax-heatmap-chart-container svg .cell:hover{stroke:rgba(var(--ax-comp-heatmap-chart-labels-color),.6);stroke-width:2px}ax-heatmap-chart .ax-heatmap-chart-container svg line,ax-heatmap-chart .ax-heatmap-chart-container svg .domain{stroke:rgba(var(--ax-comp-heatmap-chart-axis-color),.2)}\n"] }]
|
|
398
|
+
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], cellClick: [{ type: i0.Output, args: ["cellClick"] }], containerRef: [{ type: i0.ViewChild, args: ['chartContainer', { isSignal: true }] }] } });
|
|
399
399
|
|
|
400
400
|
/**
|
|
401
401
|
* Generated bundle index. Do not edit.
|