@acorex/charts 21.0.3-next.6 → 21.0.3-next.7

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.
Files changed (31) hide show
  1. package/fesm2022/acorex-charts-bar-chart.mjs +17 -17
  2. package/fesm2022/acorex-charts-bar-chart.mjs.map +1 -1
  3. package/fesm2022/acorex-charts-chart-legend.mjs +13 -13
  4. package/fesm2022/acorex-charts-chart-legend.mjs.map +1 -1
  5. package/fesm2022/acorex-charts-chart-tooltip.mjs +10 -10
  6. package/fesm2022/acorex-charts-chart-tooltip.mjs.map +1 -1
  7. package/fesm2022/acorex-charts-donut-chart.mjs +17 -17
  8. package/fesm2022/acorex-charts-donut-chart.mjs.map +1 -1
  9. package/fesm2022/acorex-charts-funnel-chart.mjs +13 -15
  10. package/fesm2022/acorex-charts-funnel-chart.mjs.map +1 -1
  11. package/fesm2022/acorex-charts-gauge-chart.mjs +13 -13
  12. package/fesm2022/acorex-charts-gauge-chart.mjs.map +1 -1
  13. package/fesm2022/acorex-charts-heatmap-chart.mjs +12 -12
  14. package/fesm2022/acorex-charts-heatmap-chart.mjs.map +1 -1
  15. package/fesm2022/acorex-charts-hierarchy-chart.mjs +18 -18
  16. package/fesm2022/acorex-charts-hierarchy-chart.mjs.map +1 -1
  17. package/fesm2022/acorex-charts-line-chart.mjs +14 -14
  18. package/fesm2022/acorex-charts-line-chart.mjs.map +1 -1
  19. package/fesm2022/acorex-charts.mjs +4 -4
  20. package/fesm2022/acorex-charts.mjs.map +1 -1
  21. package/package.json +13 -12
  22. package/{bar-chart/index.d.ts → types/acorex-charts-bar-chart.d.ts} +2 -1
  23. package/{donut-chart/index.d.ts → types/acorex-charts-donut-chart.d.ts} +2 -1
  24. package/{funnel-chart/index.d.ts → types/acorex-charts-funnel-chart.d.ts} +2 -1
  25. package/{gauge-chart/index.d.ts → types/acorex-charts-gauge-chart.d.ts} +2 -1
  26. package/{heatmap-chart/index.d.ts → types/acorex-charts-heatmap-chart.d.ts} +2 -1
  27. package/{hierarchy-chart/index.d.ts → types/acorex-charts-hierarchy-chart.d.ts} +3 -2
  28. package/{line-chart/index.d.ts → types/acorex-charts-line-chart.d.ts} +2 -1
  29. /package/{chart-legend/index.d.ts → types/acorex-charts-chart-legend.d.ts} +0 -0
  30. /package/{chart-tooltip/index.d.ts → types/acorex-charts-chart-tooltip.d.ts} +0 -0
  31. /package/{index.d.ts → types/acorex-charts.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../tmp-esm2022/line-chart/lib/line-chart.config.js","../tmp-esm2022/line-chart/lib/line-chart.component.js","../tmp-esm2022/line-chart/acorex-charts-line-chart.js"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nexport const AXLineChartDefaultConfig = {\n margins: {\n top: 12,\n right: 12,\n bottom: 8,\n left: 8,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\nexport const AX_LINE_CHART_CONFIG = new InjectionToken('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXLineChartDefaultConfig,\n});\nexport function lineChartConfig(config = {}) {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXNCO0lBQ3pELE9BQU8sRUFBRTtRQUNQLEdBQUcsRUFBRSxFQUFFO1FBQ1AsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsQ0FBQztRQUNULElBQUksRUFBRSxDQUFDO0tBQ1I7SUFDRCxTQUFTLEVBQUUsSUFBSTtJQUNmLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsV0FBVyxFQUFFLENBQUM7SUFDZCxXQUFXLEVBQUUsSUFBSTtJQUNqQixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxDQUFDO0lBQ2QsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEtBQUs7SUFDZixXQUFXLEVBQUUsRUFBRTtJQUNmLGFBQWEsRUFBRSxLQUFLO0lBQ3BCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFNBQVMsRUFBRSx1QkFBdUI7UUFDbEMsYUFBYSxFQUFFLGdEQUFnRDtRQUMvRCxVQUFVLEVBQUUsd0JBQXdCO1FBQ3BDLGFBQWEsRUFBRSx1QkFBdUI7S0FDdkM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQW9CLHNCQUFzQixFQUFFO0lBQ2hHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx3QkFBd0I7Q0FDeEMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGVBQWUsQ0FBQyxTQUFpQyxFQUFFO0lBQ2pFLE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyx3QkFBd0I7UUFDM0IsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhMaW5lQ2hhcnRPcHRpb24gfSBmcm9tICcuL2xpbmUtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWExpbmVDaGFydERlZmF1bHRDb25maWc6IEFYTGluZUNoYXJ0T3B0aW9uID0ge1xuICBtYXJnaW5zOiB7XG4gICAgdG9wOiAxMixcbiAgICByaWdodDogMTIsXG4gICAgYm90dG9tOiA4LFxuICAgIGxlZnQ6IDgsXG4gIH0sXG4gIHNob3dYQXhpczogdHJ1ZSxcbiAgc2hvd1lBeGlzOiB0cnVlLFxuICBzaG93R3JpZDogdHJ1ZSxcbiAgc2hvd1ZlcnRpY2FsR3JpZDogZmFsc2UsXG4gIHlBeGlzU3RhcnRzQXRaZXJvOiB0cnVlLFxuICBheGlzUGFkZGluZzogNSxcbiAgc2hvd1Rvb2x0aXA6IHRydWUsXG4gIGxpbmVXaWR0aDogMixcbiAgc2hvd1BvaW50czogdHJ1ZSxcbiAgcG9pbnRSYWRpdXM6IDQsXG4gIHNtb290aExpbmU6IGZhbHNlLFxuICBmaWxsQXJlYTogZmFsc2UsXG4gIGZpbGxPcGFjaXR5OiAyMCxcbiAgc2hvd0Nyb3NzaGFpcjogZmFsc2UsXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIG5vRGF0YTogJ05vIGRhdGEgYXZhaWxhYmxlJyxcbiAgICBub0RhdGFIZWxwOiAnUGxlYXNlIHByb3ZpZGUgZGF0YSB0byBkaXNwbGF5IHRoZSBjaGFydCcsXG4gICAgYWxsSGlkZGVuOiAnQWxsIHNlcmllcyBhcmUgaGlkZGVuJyxcbiAgICBhbGxIaWRkZW5IZWxwOiAnQ2xpY2sgbGVnZW5kIGl0ZW1zIHRvIHNob3cgc2VyaWVzIGluIHRoZSBjaGFydCcsXG4gICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWNoYXJ0LWxpbmUnLFxuICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEFYX0xJTkVfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYTGluZUNoYXJ0T3B0aW9uPignQVhfTElORV9DSEFSVF9DT05GSUcnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4gQVhMaW5lQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxMaW5lQ2hhcnRDb25maWcgPSBQYXJ0aWFsPEFYTGluZUNoYXJ0T3B0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxMaW5lQ2hhcnRDb25maWcgPSB7fSk6IEFYTGluZUNoYXJ0T3B0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIC4uLkFYTGluZUNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gIH07XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","import { AX_CHART_COLOR_PALETTE, AXChartComponent, computeTooltipPosition, formatLargeNumber, getChartColor, getEasingFunction, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, viewChild, ViewEncapsulation, } from '@angular/core';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\nexport class AXLineChartComponent extends AXChartComponent {\n data = input([], ...(ngDevMode ? [{ debugName: \"data\" }] : []));\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n pointClick = output();\n chartContainerEl = viewChild.required('chartContainer');\n d3;\n svg;\n chart;\n xScale;\n xScaleKind = 'linear';\n yScale;\n xAxis;\n yAxis;\n width;\n height;\n margin = { top: 20, right: 25, bottom: 40, left: 50 };\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n hiddenSeries = new Set();\n _fullNormalizedData = [];\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_LINE_CHART_CONFIG);\n // Inject the chart colors\n chartColors = inject(AX_CHART_COLOR_PALETTE);\n effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n // Messages with defaults\n effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n }, ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Layout & Dimensions\n MIN_DIMENSION = 100;\n DEFAULT_MARGIN_TOP = 12;\n DEFAULT_MARGIN_RIGHT = 12;\n DEFAULT_MARGIN_BOTTOM = 8;\n DEFAULT_MARGIN_LEFT = 8;\n MIN_MARGIN_BOTTOM = 28;\n MIN_MARGIN_LEFT = 36;\n X_AXIS_TITLE_GAP = 10;\n TICK_AREA_PADDING = 4;\n AXIS_TICK_PADDING = 6;\n ROTATION_TOLERANCE = 0.92;\n FORCE_ROTATE_LABEL_LENGTH = 14;\n Y_AXIS_TITLE_PADDING = 10;\n // Styling & Visual\n DEFAULT_LINE_WIDTH = 2;\n DEFAULT_POINT_RADIUS = 4;\n DEFAULT_FILL_OPACITY = 20;\n LINE_HIGHLIGHT_MULTIPLIER = 1.5;\n POINT_HIGHLIGHT_MULTIPLIER = 1.5;\n POINT_STROKE_WIDTH = 1;\n POINT_HOVER_STROKE_WIDTH = 2;\n GRID_DASH_ARRAY = '2,2';\n CROSSHAIR_DASH_ARRAY = '3,3';\n CROSSHAIR_OPACITY = 0.7;\n // Animation\n HOVER_TRANSITION_DURATION = 150;\n ANIMATION_END_BUFFER = 100;\n POINT_ANIMATION_DELAY_MS = 50;\n POINT_ANIMATION_DELAY_RATIO = 0.5;\n POINT_ANIMATION_DURATION_RATIO = 0.3;\n // Text & Labels\n CHAR_WIDTH_RATIO = 0.6;\n FONT_WIDTH_MULTIPLIER = 0.6;\n MAX_LABEL_LENGTH = 20;\n MIN_FONT_SIZE_X = 10;\n MAX_FONT_SIZE_X = 16;\n MIN_FONT_SIZE_Y = 11;\n MAX_FONT_SIZE_Y = 16;\n FONT_PADDING = 6;\n xAxisLabelLayout = {\n fontSize: 12,\n willRotate: false,\n tickAreaHeight: 24,\n displayedTickCount: 1,\n };\n /**\n * Resolves X-axis tick font size, rotation, and reserved tick area height.\n */\n resolveXAxisLabelLayout(chartWidth, categoricalLabels) {\n if (!categoricalLabels || categoricalLabels.length === 0) {\n const displayedTickCount = Math.min(12, Math.max(5, Math.floor(chartWidth / 80)));\n const fontSize = this.getXAxisTickFontSize(chartWidth, displayedTickCount);\n const tickAreaHeight = fontSize + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n return { fontSize, willRotate: false, tickAreaHeight, displayedTickCount };\n }\n const itemCount = categoricalLabels.length;\n const longestLabel = categoricalLabels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const effectiveLength = this.getEffectiveXLabelLength(longestLabel, itemCount);\n const step = itemCount > 1 ? chartWidth / (itemCount - 1) : chartWidth;\n let fontSize = this.getXAxisTickFontSize(chartWidth, itemCount);\n let effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n while (effectiveWidth > step * this.ROTATION_TOLERANCE && fontSize > this.MIN_FONT_SIZE_X) {\n fontSize--;\n effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n }\n const willRotate = longestLabel.length >= this.FORCE_ROTATE_LABEL_LENGTH ||\n effectiveWidth > step * this.ROTATION_TOLERANCE;\n if (willRotate && effectiveWidth > step) {\n while (effectiveWidth > step * 1.35 && fontSize > this.MIN_FONT_SIZE_X) {\n fontSize--;\n effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n }\n }\n const tickAreaHeight = this.estimateXAxisTickAreaHeight(fontSize, effectiveWidth, willRotate);\n let displayedTickCount = itemCount;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n displayedTickCount = Math.ceil(itemCount / 5);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n displayedTickCount = Math.ceil(itemCount / 2);\n }\n return { fontSize, willRotate, tickAreaHeight, displayedTickCount };\n }\n /**\n * Returns truncated label length used for layout calculations.\n */\n getEffectiveXLabelLength(label, itemCount) {\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return Math.min(label.length, maxLength);\n }\n /**\n * Estimates vertical space required below the X-axis for tick labels.\n */\n estimateXAxisTickAreaHeight(fontSize, effectiveLabelWidth, willRotate) {\n if (willRotate) {\n return effectiveLabelWidth * Math.SQRT1_2 + fontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n }\n return fontSize + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n }\n /**\n * Measures rendered X-axis tick label area using the axis group bounding box.\n */\n measureXAxisTickAreaHeight(axisGroup, fontSize, fallbackHeight) {\n if (!axisGroup) {\n return fallbackHeight;\n }\n try {\n const bbox = axisGroup.getBBox();\n const measured = Math.max(0, bbox.y + bbox.height) + this.TICK_AREA_PADDING;\n return Math.max(measured, fallbackHeight);\n }\n catch {\n return fallbackHeight;\n }\n }\n /**\n * Measures rendered Y-axis tick label width using SVG bounding boxes.\n */\n measureMaxYAxisTickLabelWidth(tickNodes, fontSize) {\n try {\n if (tickNodes.length > 0) {\n return Math.max(...tickNodes.map((node) => node.getBBox().width)) + this.FONT_PADDING;\n }\n }\n catch {\n // Fall through to estimation\n }\n return this.calculateMaxYAxisTickLabelWidth(fontSize);\n }\n /**\n * Calculates required bottom margin for X-axis ticks, optional rotation, and title.\n */\n calculateRequiredBottomMargin(options, chartWidth, categoricalLabels) {\n const baseBottom = options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM;\n if (options.showXAxis === false) {\n return Math.max(baseBottom, 8);\n }\n const layout = this.resolveXAxisLabelLayout(chartWidth, categoricalLabels);\n this.xAxisLabelLayout.fontSize = layout.fontSize;\n this.xAxisLabelLayout.willRotate = layout.willRotate;\n this.xAxisLabelLayout.tickAreaHeight = layout.tickAreaHeight;\n this.xAxisLabelLayout.displayedTickCount = layout.displayedTickCount;\n const titleBlock = options.xAxisLabel\n ? this.X_AXIS_TITLE_GAP + this.getAxisTitleFontSize(layout.fontSize) + 2\n : 0;\n const rotatedBuffer = layout.willRotate ? 12 : 4;\n return Math.max(baseBottom, this.MIN_MARGIN_BOTTOM, layout.tickAreaHeight + titleBlock + rotatedBuffer);\n }\n /**\n * Calculates required left margin for Y-axis ticks and title.\n */\n calculateRequiredLeftMargin(options, chartHeight) {\n const baseLeft = options.margins?.left ?? this.DEFAULT_MARGIN_LEFT;\n if (options.showYAxis === false) {\n return baseLeft;\n }\n const fontSize = this.getYAxisTickFontSize(chartHeight);\n const tickLabelWidth = this.calculateMaxYAxisTickLabelWidth(fontSize);\n const titleBlock = options.yAxisLabel\n ? this.Y_AXIS_TITLE_PADDING + this.getAxisTitleFontSize(fontSize) + 4\n : 0;\n return Math.max(baseLeft, this.MIN_MARGIN_LEFT, tickLabelWidth + this.AXIS_TICK_PADDING + titleBlock + 4);\n }\n createXAxisTitle(axesGroup, title, tickAreaHeight, tickFontSize) {\n const titleFontSize = this.getAxisTitleFontSize(tickFontSize);\n const titleY = Math.min(this.height + tickAreaHeight + this.X_AXIS_TITLE_GAP, this.height + this.margin.bottom - titleFontSize - 2);\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging')\n .attr('x', this.width / 2)\n .attr('y', titleY)\n .attr('direction', 'ltr')\n .attr('style', `\n font-size: ${titleFontSize}px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(title);\n }\n createYAxisTitle(axesGroup, title, tickFontSize, maxTickLabelWidth) {\n const titleFontSize = this.getAxisTitleFontSize(tickFontSize);\n const labelY = -maxTickLabelWidth - this.Y_AXIS_TITLE_PADDING;\n const labelX = -this.height / 2;\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .attr('style', `\n font-size: ${titleFontSize}px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `)\n .text(title);\n }\n // Data & Performance\n MAX_POINTS_TO_RENDER = 100;\n POINT_COORDINATE_PRECISION = 10;\n MANY_ITEMS_THRESHOLD = 20;\n VERY_MANY_ITEMS_THRESHOLD = 50;\n // Tooltip\n TOOLTIP_GAP = 10;\n /**\n * Normalizes input data to consistent array format with originalIndex\n */\n normalizeData(rawData) {\n if (Array.isArray(rawData)) {\n return rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n if (rawData && 'data' in rawData) {\n return [{ ...rawData, originalIndex: 0 }];\n }\n return [];\n }\n /**\n * Gets unique identifier for a series\n */\n getSeriesIdentifier(series) {\n return series.id || series.label || `series-${series.originalIndex}`;\n }\n /**\n * Calculates adaptive X-axis tick font size based on chart width and label count.\n */\n getXAxisTickFontSize(chartWidth, itemCount = 1) {\n let size = chartWidth / 42;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n size *= 0.65;\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n size *= 0.8;\n }\n return Math.max(this.MIN_FONT_SIZE_X, Math.min(this.MAX_FONT_SIZE_X, Math.round(size)));\n }\n /**\n * Calculates adaptive Y-axis tick font size based on chart height.\n */\n getYAxisTickFontSize(chartHeight) {\n const size = chartHeight / 28;\n return Math.max(this.MIN_FONT_SIZE_Y, Math.min(this.MAX_FONT_SIZE_Y, Math.round(size)));\n }\n /**\n * Calculates axis title font size relative to tick labels.\n */\n getAxisTitleFontSize(tickFontSize) {\n return Math.min(15, Math.max(12, tickFontSize));\n }\n /**\n * Estimates inner chart dimensions before margins are finalized.\n */\n estimateChartDimensions(containerWidth, containerHeight, options) {\n const outerWidth = options.width ?? Math.max(containerWidth, 1);\n const outerHeight = options.height ?? Math.max(containerHeight, 1);\n return {\n width: Math.max(outerWidth - this.margin.left - this.margin.right, this.MIN_DIMENSION),\n height: Math.max(outerHeight - this.margin.top - this.margin.bottom, this.MIN_DIMENSION),\n };\n }\n /**\n * Creates a unique key for point coordinates (for overlap detection)\n */\n createPointKey(x, y) {\n const precision = this.POINT_COORDINATE_PRECISION;\n return `${Math.round(x * precision) / precision},${Math.round(y * precision) / precision}`;\n }\n /**\n * Removes series elements from the chart\n */\n removeSeriesElements(seriesIdentifier) {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n }\n /**\n * Truncates long labels with ellipsis\n */\n truncateLabel(label, maxLength = this.MAX_LABEL_LENGTH) {\n if (label.length <= maxLength)\n return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n /**\n * Calculates maximum width needed for Y-axis tick labels\n */\n calculateMaxYAxisTickLabelWidth(fontSize) {\n const allSeriesData = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n let maxValue = 0;\n let minValue = 0;\n for (const series of allSeriesData) {\n if (series.data && series.data.length > 0) {\n for (const point of series.data) {\n if (typeof point.y === 'number') {\n maxValue = Math.max(maxValue, point.y);\n minValue = Math.min(minValue, point.y);\n }\n }\n }\n }\n // Check both max and min (for negative values)\n const maxAbsValue = Math.max(Math.abs(maxValue), Math.abs(minValue));\n const tickLabelText = Number.isFinite(maxAbsValue) ? formatLargeNumber(maxAbsValue) : '00000';\n return tickLabelText.length * fontSize * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n ngOnInit() {\n this.loadD3();\n }\n #effect = effect(() => {\n this._fullNormalizedData = this.normalizeData(this.data());\n this.effectiveOptions();\n if (this._rendered()) {\n this.updateChart();\n }\n }, ...(ngDevMode ? [{ debugName: \"#effect\" }] : []));\n ngAfterViewInit() {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n // AXChartLegendCompatible Implementation\n getLegendItems() {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n return this._fullNormalizedData.map((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: seriesIdentifier,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(seriesIdentifier),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n highlightSegment(id) {\n if (!this.svg)\n return;\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS) * this.POINT_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n }\n toggleSegment(id) {\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n }\n else {\n this.hiddenSeries.add(id);\n }\n this.updateChart();\n return !this.hiddenSeries.has(id);\n }\n async loadD3() {\n try {\n this.d3 = await import('d3');\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 createChart() {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement)\n return;\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n const visibleDataForRendering = allSeriesData.filter((series) => !this.hiddenSeries.has(this.getSeriesIdentifier(series)));\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n // Use allSeriesData for domain calculation to keep scales consistent\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n updateChart() {\n this.createChart();\n }\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svg) {\n this.d3\n ?.select(this.chartContainerEl()?.nativeElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n setupDimensions(containerElement, options) {\n const containerWidth = Math.max(containerElement.clientWidth, 1);\n const containerHeight = Math.max(containerElement.clientHeight, 1);\n this.calculateMargins(options, containerWidth, containerHeight);\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n }\n else {\n this.width = containerWidth - this.margin.left - this.margin.right;\n this.height = containerHeight - this.margin.top - this.margin.bottom;\n }\n this.width = Math.max(this.width, this.MIN_DIMENSION);\n this.height = Math.max(this.height, this.MIN_DIMENSION);\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n this.svg = svg;\n this.chart = this.svg\n .append('g')\n .attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n calculateMargins(options, containerWidth, containerHeight) {\n this.margin = {\n top: options.margins?.top ?? this.DEFAULT_MARGIN_TOP,\n right: options.margins?.right ?? this.DEFAULT_MARGIN_RIGHT,\n bottom: options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM,\n left: options.margins?.left ?? this.DEFAULT_MARGIN_LEFT,\n };\n const estimatedDimensions = this.estimateChartDimensions(containerWidth, containerHeight, options);\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n const allNumericX = allDataPoints.length === 0 || allDataPoints.every((d) => typeof d.x === 'number');\n let categoricalLabels = null;\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n categoricalLabels = [...new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))))];\n }\n this.margin.bottom = this.calculateRequiredBottomMargin(options, estimatedDimensions.width, categoricalLabels);\n this.margin.left = this.calculateRequiredLeftMargin(options, estimatedDimensions.height);\n // Second pass: margins affect inner chart size, which affects label layout\n const refinedDimensions = this.estimateChartDimensions(containerWidth, containerHeight, options);\n this.margin.bottom = this.calculateRequiredBottomMargin(options, refinedDimensions.width, categoricalLabels);\n this.margin.left = this.calculateRequiredLeftMargin(options, refinedDimensions.height);\n }\n setupScales(data) {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n if (allNumericX) {\n this.xScaleKind = 'linear';\n const xMin = this.d3.min(allDataPoints, (d) => d.x) ?? 0;\n const xMax = this.d3.max(allDataPoints, (d) => d.x) ?? 0;\n if (xMin === xMax) {\n this.xScale = this.d3\n .scaleLinear()\n .domain([xMin - 1, xMax + 1])\n .range([0, this.width]);\n }\n else {\n this.xScale = this.d3.scaleLinear().domain([xMin, xMax]).range([0, this.width]);\n }\n }\n else {\n this.xScaleKind = 'point';\n const xDomain = [];\n const seenX = new Set();\n for (const point of allDataPoints) {\n const key = String(point.x);\n if (!seenX.has(key)) {\n seenX.add(key);\n xDomain.push(key);\n }\n }\n this.xScale = this.d3\n .scalePoint()\n .domain(xDomain)\n .range([0, this.width])\n .padding(0);\n }\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n const dataYMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n const dataYMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n let yMin;\n let yMax;\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, dataYMin);\n yMax = Math.max(0, dataYMax);\n }\n else {\n yMin = dataYMin;\n yMax = dataYMax;\n }\n const yRange = yMax - yMin || 1;\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n if (yAxisStartsAtZero && dataYMin >= 0) {\n this.yScale.domain([0, this.yScale.domain()[1]]);\n }\n }\n createAxes(options) {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isPointScale = this.xScaleKind === 'point';\n const pointScale = isPointScale ? this.xScale : null;\n const isRtl = document.documentElement.dir === 'rtl' || document.body.dir === 'rtl';\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n if (showXAxis) {\n let xAxisGenerator;\n let itemCount = 0;\n if (isPointScale && pointScale) {\n itemCount = pointScale.domain().length;\n const pointLayout = this.resolveXAxisLabelLayout(this.width, pointScale.domain());\n this.xAxisLabelLayout.fontSize = pointLayout.fontSize;\n this.xAxisLabelLayout.willRotate = pointLayout.willRotate;\n this.xAxisLabelLayout.tickAreaHeight = pointLayout.tickAreaHeight;\n this.xAxisLabelLayout.displayedTickCount = pointLayout.displayedTickCount;\n // Smart tick reduction for many items (like bar chart)\n let tickValues = pointScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick for 50+ items\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n }\n else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick for 20-50 items\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n xAxisGenerator = this.d3\n .axisBottom(pointScale)\n .tickValues(tickValues)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d) => {\n const label = String(d);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n }\n else {\n // Linear scale (numeric data)\n // Let D3 determine optimal tick count, but ensure we show reasonable number\n // Calculate optimal tick count based on width\n const optimalTickCount = Math.min(12, Math.max(5, Math.floor(this.width / 80)));\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .ticks(optimalTickCount)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d) => {\n // Format numbers nicely\n const num = Number(d);\n if (Number.isInteger(num)) {\n return String(num);\n }\n return num.toFixed(1);\n });\n itemCount = optimalTickCount;\n }\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(xAxisGenerator);\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicXAxisTickFontSize = isPointScale\n ? this.xAxisLabelLayout.fontSize\n : this.getXAxisTickFontSize(this.width, itemCount);\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n if (isPointScale && pointScale && pointScale.domain().length > 0) {\n if (this.xAxisLabelLayout.willRotate) {\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n const xTickAreaHeight = this.measureXAxisTickAreaHeight(this.xAxis.node(), dynamicXAxisTickFontSize, this.xAxisLabelLayout.tickAreaHeight);\n if (options.xAxisLabel) {\n this.createXAxisTitle(axesGroup, options.xAxisLabel, xTickAreaHeight, dynamicXAxisTickFontSize);\n }\n }\n if (showYAxis) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3\n .axisLeft(this.yScale)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((value) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n // Reduce tick count for better readability with large numbers\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for millions+\n }\n else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n this.yAxis = axesGroup.append('g').attr('class', 'ax-line-chart-axis-y').call(yAxisGenerator);\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n const dynamicYAxisTickFontSize = this.getYAxisTickFontSize(this.height);\n const yTickTexts = this.yAxis.selectAll('text').attr('style', `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `);\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n }\n else {\n yTickTexts.attr('text-anchor', 'end').attr('direction', 'ltr');\n }\n const yTickNodes = (yTickTexts.nodes() || []);\n const maxTickLabelWidth = this.measureMaxYAxisTickLabelWidth(yTickNodes, dynamicYAxisTickFontSize);\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel, dynamicYAxisTickFontSize, maxTickLabelWidth);\n }\n }\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()));\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isPointScale ? undefined : this.xScale.ticks()));\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n getXPosition(point) {\n if (this.xScaleKind === 'point') {\n return this.xScale(String(point.x)) ?? 0;\n }\n return this.xScale(point.x);\n }\n renderLines(allSeriesData) {\n const getX = (d) => this.getXPosition(d);\n const lineGenerator = this.d3\n .line()\n .x(getX)\n .y((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n const areaGenerator = this.d3\n .area()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n this.svg.attr('class', 'ax-line-chart-animating');\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.removeSeriesElements(seriesIdentifier);\n return;\n }\n if (!series.data || series.data.length === 0)\n return;\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER);\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n });\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map();\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = this.createPointKey(x, y);\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)) && s.data && s.data.length > 0).length;\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex))\n .on('mouseleave', () => this.handlePointGroupLeave());\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n }\n else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n const pointRadius = this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS;\n this.d3\n .select(event.target)\n .interrupt()\n .attr('r', pointRadius * this.POINT_HIGHLIGHT_MULTIPLIER)\n .attr('stroke-width', this.POINT_HOVER_STROKE_WIDTH)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event) => this.updateTooltipPosition(event))\n .on('mouseleave', (event) => {\n this._tooltipVisible.set(false);\n const pointRadius = this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS;\n this.d3\n .select(event.target)\n .interrupt()\n .attr('r', pointRadius)\n .attr('stroke-width', this.POINT_STROKE_WIDTH)\n .attr('stroke', '#fff');\n })\n .on('click', (event, d) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n }\n else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay((_d, i) => i * Math.min(this.POINT_ANIMATION_DELAY_MS, (animationDuration || 0) * 0.05) +\n (animationDuration || 0) * this.POINT_ANIMATION_DELAY_RATIO)\n .duration((animationDuration || 0) * this.POINT_ANIMATION_DURATION_RATIO)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n }\n else {\n setTimeout(() => this.enablePointerEventsAfterAnimation(), (animationDuration || 0) + this.ANIMATION_END_BUFFER);\n }\n }\n enablePointerEventsAfterAnimation() {\n if (!this.chart || !this.svg)\n return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n handlePointGroupEnter(originalIndex) {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER);\n }\n handlePointGroupLeave() {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n getReducedDataPoints(data, maxPoints) {\n if (data.length <= maxPoints)\n return data;\n const result = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n handlePointHover(event, dataPoint, series, originalIndex) {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: formatLargeNumber(dataPoint.y),\n color: color,\n });\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n showCrosshairLines(dataPoint) {\n const x = this.getXPosition(dataPoint);\n const y = this.yScale(dataPoint.y);\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n crosshairGroup.selectAll('*').remove();\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this.scheduleTooltipPosition(0);\n }\n scheduleTooltipPosition(attempt) {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n const prev = this._tooltipPosition();\n if (prev.x !== pos.x || prev.y !== pos.y) {\n this._tooltipPosition.set(pos);\n }\n });\n }\n // computeTooltipPosition moved to shared chart utils\n handlePointClick(event, dataPoint, series) {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n showNoDataMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n showAllSeriesHiddenMessage(containerElement) {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n handleOverlappingPointsHover(event, overlappingPoints) {\n if (this.effectiveOptions().showTooltip === false)\n return;\n const tooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: formatLargeNumber(overlappingPoints[0].point.y),\n color: overlappingPoints.map(({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors)),\n };\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXLineChartComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXLineChartComponent, isStandalone: true, selector: \"ax-line-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: { pointClick: \"pointClick\" }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.25rem,.6vw,.5rem);border-radius:.5rem;overflow:hidden;contain:layout style;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden;flex-shrink:0}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\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: AXLineChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-line-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-line-chart\\\" #chartContainer>\\n <!-- Shared tooltip component -->\\n <ax-chart-tooltip\\n [visible]=\\\"tooltipVisible()\\\"\\n [position]=\\\"tooltipPosition()\\\"\\n [data]=\\\"tooltipData()\\\"\\n [showPercentage]=\\\"false\\\"\\n ></ax-chart-tooltip>\\n</div>\\n\", styles: [\"ax-line-chart{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box;--ax-comp-line-chart-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-axis-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-grid-lines-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-line-chart-bg-color: 0, 0, 0, 0;--ax-comp-line-chart-text-color: var(--ax-sys-color-on-lightest-surface)}ax-line-chart .ax-line-chart{width:100%;height:100%;position:relative;box-sizing:border-box;padding:clamp(.25rem,.6vw,.5rem);border-radius:.5rem;overflow:hidden;contain:layout style;color:rgba(var(--ax-comp-line-chart-text-color));background-color:rgb(var(--ax-comp-line-chart-bg-color))}ax-line-chart .ax-line-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden;flex-shrink:0}ax-line-chart .ax-line-chart svg g:has(text){font-family:inherit}ax-line-chart .ax-line-chart-no-data-message{text-align:center;background-color:rgb(var(--ax-comp-line-chart-bg-color));padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-icon{opacity:.6;margin-bottom:.75rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-text{font-size:1rem;font-weight:600;margin-bottom:.5rem}ax-line-chart .ax-line-chart-no-data-message .ax-line-chart-no-data-help{font-size:.8rem;opacity:.6}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydHMvbGluZS1jaGFydC9zcmMvbGliL2xpbmUtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2xpYi9saW5lLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSx1QkFBdUIsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRixPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUczRDs7R0FFRztBQVNILE1BQU0sT0FBTyxvQkFDWCxTQUFRLGdCQUFnQjtJQUd4QixJQUFJLEdBQUcsS0FBSyxDQUFtQixFQUFFLGdEQUFDLENBQUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBb0IsRUFBRSxtREFBQyxDQUFDO0lBQ3ZDLFVBQVUsR0FBRyxNQUFNLEVBQThCLENBQUM7SUFFakMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztJQUMzRixFQUFFLENBQXVCO0lBRTNCLEdBQUcsQ0FBeUQ7SUFDNUQsS0FBSyxDQUF1RDtJQUM1RCxNQUFNLENBQTBEO0lBQ2hFLFVBQVUsR0FBdUIsUUFB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QWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0RCxLQUFLLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUMxQixDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUMxRjtTQUNGLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuRixJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7dUdBaGhEVSxvQkFBb0I7MkZBQXBCLG9CQUFvQiwwZ0JDM0NqQyxtUkFTQSw2L0NEK0JZLHVCQUF1Qjs7MkZBR3RCLG9CQUFvQjtrQkFSaEMsU0FBUzsrQkFDRSxlQUFlLGlCQUdWLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUsXG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBmb3JtYXRMYXJnZU51bWJlcixcbiAgZ2V0Q2hhcnRDb2xvcixcbiAgZ2V0RWFzaW5nRnVuY3Rpb24sXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRMZWdlbmRDb21wYXRpYmxlLCBBWENoYXJ0TGVnZW5kSXRlbSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LWxlZ2VuZCc7XG5pbXBvcnQgeyBBWENoYXJ0VG9vbHRpcENvbXBvbmVudCwgQVhDaGFydFRvb2x0aXBEYXRhIH0gZnJvbSAnQGFjb3JleC9jaGFydHMvY2hhcnQtdG9vbHRpcCc7XG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEFYX0xJTkVfQ0hBUlRfQ09ORklHIH0gZnJvbSAnLi9saW5lLWNoYXJ0LmNvbmZpZyc7XG5pbXBvcnQgeyBBWExpbmVDaGFydERhdGEsIEFYTGluZUNoYXJ0T3B0aW9uLCBBWExpbmVDaGFydFBvaW50Q2xpY2tFdmVudCwgQVhMaW5lQ2hhcnRWYWx1ZSB9IGZyb20gJy4vbGluZS1jaGFydC50eXBlJztcblxuLyoqXG4gKiBMaW5lIENoYXJ0IENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGRhdGEgYXMgbGluZXMgd2l0aCBpbnRlcmFjdGl2ZSBob3ZlciBlZmZlY3RzIGFuZCBhbmltYXRpb25zXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWxpbmUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmUtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0FYQ2hhcnRUb29sdGlwQ29tcG9uZW50XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFYTGluZUNoYXJ0Q29tcG9uZW50XG4gIGV4dGVuZHMgQVhDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSwgQVhDaGFydENvbXBvbmVudEJhc2VcbntcbiAgZGF0YSA9IGlucHV0PEFYTGluZUNoYXJ0VmFsdWU+KFtdKTtcbiAgb3B0aW9ucyA9IGlucHV0PEFYTGluZUNoYXJ0T3B0aW9uPih7fSk7XG4gIHBvaW50Q2xpY2sgPSBvdXRwdXQ8QVhMaW5lQ2hhcnRQb2ludENsaWNrRXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICBwcml2YXRlIHN2ZyE6IGQzLlNlbGVjdGlvbjxTVkdTVkdFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIGNoYXJ0ITogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIHhTY2FsZSE6IGQzLlNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyPiB8IGQzLlNjYWxlUG9pbnQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSB4U2NhbGVLaW5kOiAnbGluZWFyJyB8ICdwb2ludCcgPSAnbGluZWFyJztcbiAgcHJpdmF0ZSB5U2NhbGUhOiBkMy5TY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlcj47XG4gIHByaXZhdGUgeEF4aXMhOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD47XG4gIHByaXZhdGUgeUF4aXMhOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD47XG5cbiAgcHJpdmF0ZSB3aWR0aCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBoZWlnaHQhOiBudW1iZXI7XG4gIHByaXZhdGUgbWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMjUsIGJvdHRvbTogNDAsIGxlZnQ6IDUwIH07XG5cbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcwJyxcbiAgICBwZXJjZW50YWdlOiAnMCUnLFxuICAgIGNvbG9yOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBoaWRkZW5TZXJpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfZnVsbE5vcm1hbGl6ZWREYXRhOiAoQVhMaW5lQ2hhcnREYXRhICYgeyBvcmlnaW5hbEluZGV4OiBudW1iZXIgfSlbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0xJTkVfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBJbmplY3QgdGhlIGNoYXJ0IGNvbG9yc1xuICBwcml2YXRlIGNoYXJ0Q29sb3JzID0gaW5qZWN0KEFYX0NIQVJUX0NPTE9SX1BBTEVUVEUpO1xuXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZ1Rva2VuLFxuICAgICAgLi4udGhpcy5vcHRpb25zKCksXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gTWVzc2FnZXMgd2l0aCBkZWZhdWx0c1xuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdE1lc3NhZ2VzID0ge1xuICAgICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgICAgbm9EYXRhSGVscDogJ1BsZWFzZSBwcm92aWRlIGRhdGEgdG8gZGlzcGxheSB0aGUgY2hhcnQnLFxuICAgICAgYWxsSGlkZGVuOiAnQWxsIHNlcmllcyBhcmUgaGlkZGVuJyxcbiAgICAgIGFsbEhpZGRlbkhlbHA6ICdDbGljayBsZWdlbmQgaXRlbXMgdG8gc2hvdyBzZXJpZXMgaW4gdGhlIGNoYXJ0JyxcbiAgICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1jaGFydC1saW5lJyxcbiAgICAgIGFsbEhpZGRlbkljb246ICdmYS1saWdodCBmYS1leWUtc2xhc2gnLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRNZXNzYWdlcyxcbiAgICAgIC4uLnRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLm1lc3NhZ2VzLFxuICAgIH07XG4gIH0pO1xuXG4gIC8vIExheW91dCAmIERpbWVuc2lvbnNcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRElNRU5TSU9OID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUFSR0lOX1RPUCA9IDEyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUFSR0lOX1JJR0hUID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NQVJHSU5fQk9UVE9NID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01BUkdJTl9MRUZUID0gODtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fTUFSR0lOX0JPVFRPTSA9IDI4O1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9NQVJHSU5fTEVGVCA9IDM2O1xuICBwcml2YXRlIHJlYWRvbmx5IFhfQVhJU19USVRMRV9HQVAgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0FSRUFfUEFERElORyA9IDQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgQVhJU19USUNLX1BBRERJTkcgPSA2O1xuICBwcml2YXRlIHJlYWRvbmx5IFJPVEFUSU9OX1RPTEVSQU5DRSA9IDAuOTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9SQ0VfUk9UQVRFX0xBQkVMX0xFTkdUSCA9IDE0O1xuICBwcml2YXRlIHJlYWRvbmx5IFlfQVhJU19USVRMRV9QQURESU5HID0gMTA7XG5cbiAgLy8gU3R5bGluZyAmIFZpc3VhbFxuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTElORV9XSURUSCA9IDI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9QT0lOVF9SQURJVVMgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfRklMTF9PUEFDSVRZID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTElORV9ISUdITElHSFRfTVVMVElQTElFUiA9IDEuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9ISUdITElHSFRfTVVMVElQTElFUiA9IDEuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9TVFJPS0VfV0lEVEggPSAxO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0hPVkVSX1NUUk9LRV9XSURUSCA9IDI7XG4gIHByaXZhdGUgcmVhZG9ubHkgR1JJRF9EQVNIX0FSUkFZID0gJzIsMic7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ1JPU1NIQUlSX0RBU0hfQVJSQVkgPSAnMywzJztcbiAgcHJpdmF0ZSByZWFkb25seSBDUk9TU0hBSVJfT1BBQ0lUWSA9IDAuNztcblxuICAvLyBBbmltYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBIT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuICBwcml2YXRlIHJlYWRvbmx5IEFOSU1BVElPTl9FTkRfQlVGRkVSID0gMTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0FOSU1BVElPTl9ERUxBWV9NUyA9IDUwO1xuICBwcml2YXRlIHJlYWRvbmx5IFBPSU5UX0FOSU1BVElPTl9ERUxBWV9SQVRJTyA9IDAuNTtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9BTklNQVRJT05fRFVSQVRJT05fUkFUSU8gPSAwLjM7XG5cbiAgLy8gVGV4dCAmIExhYmVsc1xuICBwcml2YXRlIHJlYWRvbmx5IENIQVJfV0lEVEhfUkFUSU8gPSAwLjY7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9OVF9XSURUSF9NVUxUSVBMSUVSID0gMC42O1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9MQUJFTF9MRU5HVEggPSAyMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRk9OVF9TSVpFX1ggPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRk9OVF9TSVpFX1ggPSAxNjtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRk9OVF9TSVpFX1kgPSAxMTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfRk9OVF9TSVpFX1kgPSAxNjtcbiAgcHJpdmF0ZSByZWFkb25seSBGT05UX1BBRERJTkcgPSA2O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgeEF4aXNMYWJlbExheW91dCA9IHtcbiAgICBmb250U2l6ZTogMTIsXG4gICAgd2lsbFJvdGF0ZTogZmFsc2UsXG4gICAgdGlja0FyZWFIZWlnaHQ6IDI0LFxuICAgIGRpc3BsYXllZFRpY2tDb3VudDogMSxcbiAgfTtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgWC1heGlzIHRpY2sgZm9udCBzaXplLCByb3RhdGlvbiwgYW5kIHJlc2VydmVkIHRpY2sgYXJlYSBoZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVYQXhpc0xhYmVsTGF5b3V0KFxuICAgIGNoYXJ0V2lkdGg6IG51bWJlcixcbiAgICBjYXRlZ29yaWNhbExhYmVsczogc3RyaW5nW10gfCBudWxsLFxuICApOiB7IGZvbnRTaXplOiBudW1iZXI7IHdpbGxSb3RhdGU6IGJvb2xlYW47IHRpY2tBcmVhSGVpZ2h0OiBudW1iZXI7IGRpc3BsYXllZFRpY2tDb3VudDogbnVtYmVyIH0ge1xuICAgIGlmICghY2F0ZWdvcmljYWxMYWJlbHMgfHwgY2F0ZWdvcmljYWxMYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBkaXNwbGF5ZWRUaWNrQ291bnQgPSBNYXRoLm1pbigxMiwgTWF0aC5tYXgoNSwgTWF0aC5mbG9vcihjaGFydFdpZHRoIC8gODApKSk7XG4gICAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZ2V0WEF4aXNUaWNrRm9udFNpemUoY2hhcnRXaWR0aCwgZGlzcGxheWVkVGlja0NvdW50KTtcbiAgICAgIGNvbnN0IHRpY2tBcmVhSGVpZ2h0ID0gZm9udFNpemUgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HICsgdGhpcy5BWElTX1RJQ0tfUEFERElORztcblxuICAgICAgcmV0dXJuIHsgZm9udFNpemUsIHdpbGxSb3RhdGU6IGZhbHNlLCB0aWNrQXJlYUhlaWdodCwgZGlzcGxheWVkVGlja0NvdW50IH07XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbUNvdW50ID0gY2F0ZWdvcmljYWxMYWJlbHMubGVuZ3RoO1xuICAgIGNvbnN0IGxvbmdlc3RMYWJlbCA9IGNhdGVnb3JpY2FsTGFiZWxzLnJlZHVjZSgoYSwgYikgPT4gKGEubGVuZ3RoID4gYi5sZW5ndGggPyBhIDogYiksICcnKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSB0aGlzLmdldEVmZmVjdGl2ZVhMYWJlbExlbmd0aChsb25nZXN0TGFiZWwsIGl0ZW1Db3VudCk7XG4gICAgY29uc3Qgc3RlcCA9IGl0ZW1Db3VudCA+IDEgPyBjaGFydFdpZHRoIC8gKGl0ZW1Db3VudCAtIDEpIDogY2hhcnRXaWR0aDtcblxuICAgIGxldCBmb250U2l6ZSA9IHRoaXMuZ2V0WEF4aXNUaWNrRm9udFNpemUoY2hhcnRXaWR0aCwgaXRlbUNvdW50KTtcbiAgICBsZXQgZWZmZWN0aXZlV2lkdGggPSBlZmZlY3RpdmVMZW5ndGggKiBmb250U2l6ZSAqIHRoaXMuQ0hBUl9XSURUSF9SQVRJTztcblxuICAgIHdoaWxlIChlZmZlY3RpdmVXaWR0aCA+IHN0ZXAgKiB0aGlzLlJPVEFUSU9OX1RPTEVSQU5DRSAmJiBmb250U2l6ZSA+IHRoaXMuTUlOX0ZPTlRfU0laRV9YKSB7XG4gICAgICBmb250U2l6ZS0tO1xuICAgICAgZWZmZWN0aXZlV2lkdGggPSBlZmZlY3RpdmVMZW5ndGggKiBmb250U2l6ZSAqIHRoaXMuQ0hBUl9XSURUSF9SQVRJTztcbiAgICB9XG5cbiAgICBjb25zdCB3aWxsUm90YXRlID1cbiAgICAgIGxvbmdlc3RMYWJlbC5sZW5ndGggPj0gdGhpcy5GT1JDRV9ST1RBVEVfTEFCRUxfTEVOR1RIIHx8XG4gICAgICBlZmZlY3RpdmVXaWR0aCA+IHN0ZXAgKiB0aGlzLlJPVEFUSU9OX1RPTEVSQU5DRTtcblxuICAgIGlmICh3aWxsUm90YXRlICYmIGVmZmVjdGl2ZVdpZHRoID4gc3RlcCkge1xuICAgICAgd2hpbGUgKGVmZmVjdGl2ZVdpZHRoID4gc3RlcCAqIDEuMzUgJiYgZm9udFNpemUgPiB0aGlzLk1JTl9GT05UX1NJWkVfWCkge1xuICAgICAgICBmb250U2l6ZS0tO1xuICAgICAgICBlZmZlY3RpdmVXaWR0aCA9IGVmZmVjdGl2ZUxlbmd0aCAqIGZvbnRTaXplICogdGhpcy5DSEFSX1dJRFRIX1JBVElPO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRpY2tBcmVhSGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZVhBeGlzVGlja0FyZWFIZWlnaHQoZm9udFNpemUsIGVmZmVjdGl2ZVdpZHRoLCB3aWxsUm90YXRlKTtcbiAgICBsZXQgZGlzcGxheWVkVGlja0NvdW50ID0gaXRlbUNvdW50O1xuICAgIGlmIChpdGVtQ291bnQgPiB0aGlzLlZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIGRpc3BsYXllZFRpY2tDb3VudCA9IE1hdGguY2VpbChpdGVtQ291bnQgLyA1KTtcbiAgICB9IGVsc2UgaWYgKGl0ZW1Db3VudCA+IHRoaXMuTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIGRpc3BsYXllZFRpY2tDb3VudCA9IE1hdGguY2VpbChpdGVtQ291bnQgLyAyKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBmb250U2l6ZSwgd2lsbFJvdGF0ZSwgdGlja0FyZWFIZWlnaHQsIGRpc3BsYXllZFRpY2tDb3VudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1bmNhdGVkIGxhYmVsIGxlbmd0aCB1c2VkIGZvciBsYXlvdXQgY2FsY3VsYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFZmZlY3RpdmVYTGFiZWxMZW5ndGgobGFiZWw6IHN0cmluZywgaXRlbUNvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heExlbmd0aCA9IGl0ZW1Db3VudCA+IHRoaXMuTUFOWV9JVEVNU19USFJFU0hPTEQgPyAxMCA6IHRoaXMuTUFYX0xBQkVMX0xFTkdUSDtcbiAgICByZXR1cm4gTWF0aC5taW4obGFiZWwubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyB2ZXJ0aWNhbCBzcGFjZSByZXF1aXJlZCBiZWxvdyB0aGUgWC1heGlzIGZvciB0aWNrIGxhYmVscy5cbiAgICovXG4gIHByaXZhdGUgZXN0aW1hdGVYQXhpc1RpY2tBcmVhSGVpZ2h0KFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgZWZmZWN0aXZlTGFiZWxXaWR0aDogbnVtYmVyLFxuICAgIHdpbGxSb3RhdGU6IGJvb2xlYW4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKHdpbGxSb3RhdGUpIHtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVMYWJlbFdpZHRoICogTWF0aC5TUVJUMV8yICsgZm9udFNpemUgKiBNYXRoLlNRUlQxXzIgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HICsgdGhpcy5BWElTX1RJQ0tfUEFERElORztcbiAgICB9XG5cbiAgICByZXR1cm4gZm9udFNpemUgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HICsgdGhpcy5BWElTX1RJQ0tfUEFERElORztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlcyByZW5kZXJlZCBYLWF4aXMgdGljayBsYWJlbCBhcmVhIHVzaW5nIHRoZSBheGlzIGdyb3VwIGJvdW5kaW5nIGJveC5cbiAgICovXG4gIHByaXZhdGUgbWVhc3VyZVhBeGlzVGlja0FyZWFIZWlnaHQoXG4gICAgYXhpc0dyb3VwOiBTVkdHRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgZm9udFNpemU6IG51bWJlcixcbiAgICBmYWxsYmFja0hlaWdodDogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGlmICghYXhpc0dyb3VwKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2tIZWlnaHQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJib3ggPSBheGlzR3JvdXAuZ2V0QkJveCgpO1xuICAgICAgY29uc3QgbWVhc3VyZWQgPSBNYXRoLm1heCgwLCBiYm94LnkgKyBiYm94LmhlaWdodCkgKyB0aGlzLlRJQ0tfQVJFQV9QQURESU5HO1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1lYXN1cmVkLCBmYWxsYmFja0hlaWdodCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsbGJhY2tIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmVzIHJlbmRlcmVkIFktYXhpcyB0aWNrIGxhYmVsIHdpZHRoIHVzaW5nIFNWRyBib3VuZGluZyBib3hlcy5cbiAgICovXG4gIHByaXZhdGUgbWVhc3VyZU1heFlBeGlzVGlja0xhYmVsV2lkdGgodGlja05vZGVzOiBTVkdUZXh0RWxlbWVudFtdLCBmb250U2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRpY2tOb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCguLi50aWNrTm9kZXMubWFwKChub2RlKSA9PiBub2RlLmdldEJCb3goKS53aWR0aCkpICsgdGhpcy5GT05UX1BBRERJTkc7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gZXN0aW1hdGlvblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoZm9udFNpemUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgcmVxdWlyZWQgYm90dG9tIG1hcmdpbiBmb3IgWC1heGlzIHRpY2tzLCBvcHRpb25hbCByb3RhdGlvbiwgYW5kIHRpdGxlLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSZXF1aXJlZEJvdHRvbU1hcmdpbihcbiAgICBvcHRpb25zOiBBWExpbmVDaGFydE9wdGlvbixcbiAgICBjaGFydFdpZHRoOiBudW1iZXIsXG4gICAgY2F0ZWdvcmljYWxMYWJlbHM6IHN0cmluZ1tdIHwgbnVsbCxcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlQm90dG9tID0gb3B0aW9ucy5tYXJnaW5zPy5ib3R0b20gPz8gdGhpcy5ERUZBVUxUX01BUkdJTl9CT1RUT007XG5cbiAgICBpZiAob3B0aW9ucy5zaG93WEF4aXMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoYmFzZUJvdHRvbSwgOCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZXNvbHZlWEF4aXNMYWJlbExheW91dChjaGFydFdpZHRoLCBjYXRlZ29yaWNhbExhYmVscyk7XG4gICAgdGhpcy54QXhpc0xhYmVsTGF5b3V0LmZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIHRoaXMueEF4aXNMYWJlbExheW91dC53aWxsUm90YXRlID0gbGF5b3V0LndpbGxSb3RhdGU7XG4gICAgdGhpcy54QXhpc0xhYmVsTGF5b3V0LnRpY2tBcmVhSGVpZ2h0ID0gbGF5b3V0LnRpY2tBcmVhSGVpZ2h0O1xuICAgIHRoaXMueEF4aXNMYWJlbExheW91dC5kaXNwbGF5ZWRUaWNrQ291bnQgPSBsYXlvdXQuZGlzcGxheWVkVGlja0NvdW50O1xuXG4gICAgY29uc3QgdGl0bGVCbG9jayA9IG9wdGlvbnMueEF4aXNMYWJlbFxuICAgICAgPyB0aGlzLlhfQVhJU19USVRMRV9HQVAgKyB0aGlzLmdldEF4aXNUaXRsZUZvbnRTaXplKGxheW91dC5mb250U2l6ZSkgKyAyXG4gICAgICA6IDA7XG4gICAgY29uc3Qgcm90YXRlZEJ1ZmZlciA9IGxheW91dC53aWxsUm90YXRlID8gMTIgOiA0O1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KGJhc2VCb3R0b20sIHRoaXMuTUlOX01BUkdJTl9CT1RUT00sIGxheW91dC50aWNrQXJlYUhlaWdodCArIHRpdGxlQmxvY2sgKyByb3RhdGVkQnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHJlcXVpcmVkIGxlZnQgbWFyZ2luIGZvciBZLWF4aXMgdGlja3MgYW5kIHRpdGxlLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVSZXF1aXJlZExlZnRNYXJnaW4ob3B0aW9uczogQVhMaW5lQ2hhcnRPcHRpb24sIGNoYXJ0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhc2VMZWZ0ID0gb3B0aW9ucy5tYXJnaW5zPy5sZWZ0ID8/IHRoaXMuREVGQVVMVF9NQVJHSU5fTEVGVDtcblxuICAgIGlmIChvcHRpb25zLnNob3dZQXhpcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBiYXNlTGVmdDtcbiAgICB9XG5cbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuZ2V0WUF4aXNUaWNrRm9udFNpemUoY2hhcnRIZWlnaHQpO1xuICAgIGNvbnN0IHRpY2tMYWJlbFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhZQXhpc1RpY2tMYWJlbFdpZHRoKGZvbnRTaXplKTtcbiAgICBjb25zdCB0aXRsZUJsb2NrID0gb3B0aW9ucy55QXhpc0xhYmVsXG4gICAgICA/IHRoaXMuWV9BWElTX1RJVExFX1BBRERJTkcgKyB0aGlzLmdldEF4aXNUaXRsZUZvbnRTaXplKGZvbnRTaXplKSArIDRcbiAgICAgIDogMDtcblxuICAgIHJldHVybiBNYXRoLm1heChiYXNlTGVmdCwgdGhpcy5NSU5fTUFSR0lOX0xFRlQsIHRpY2tMYWJlbFdpZHRoICsgdGhpcy5BWElTX1RJQ0tfUEFERElORyArIHRpdGxlQmxvY2sgKyA0KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlWEF4aXNUaXRsZShcbiAgICBheGVzR3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRpY2tBcmVhSGVpZ2h0OiBudW1iZXIsXG4gICAgdGlja0ZvbnRTaXplOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRpdGxlRm9udFNpemUgPSB0aGlzLmdldEF4aXNUaXRsZUZvbnRTaXplKHRpY2tGb250U2l6ZSk7XG4gICAgY29uc3QgdGl0bGVZID0gTWF0aC5taW4oXG4gICAgICB0aGlzLmhlaWdodCArIHRpY2tBcmVhSGVpZ2h0ICsgdGhpcy5YX0FYSVNfVElUTEVfR0FQLFxuICAgICAgdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbi5ib3R0b20gLSB0aXRsZUZvbnRTaXplIC0gMixcbiAgICApO1xuXG4gICAgYXhlc0dyb3VwXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMtbGFiZWwgYXgteC1heGlzLWxhYmVsJylcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ2hhbmdpbmcnKVxuICAgICAgLmF0dHIoJ3gnLCB0aGlzLndpZHRoIC8gMilcbiAgICAgIC5hdHRyKCd5JywgdGl0bGVZKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdzdHlsZScsXG4gICAgICAgIGBcbiAgICAgICAgZm9udC1zaXplOiAke3RpdGxlRm9udFNpemV9cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGZpbGw6IHJnYih2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtdGV4dC1jb2xvcikpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGAsXG4gICAgICApXG4gICAgICAudGV4dCh0aXRsZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVlBeGlzVGl0bGUoXG4gICAgYXhlc0dyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICB0aWNrRm9udFNpemU6IG51bWJlcixcbiAgICBtYXhUaWNrTGFiZWxXaWR0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aXRsZUZvbnRTaXplID0gdGhpcy5nZXRBeGlzVGl0bGVGb250U2l6ZSh0aWNrRm9udFNpemUpO1xuICAgIGNvbnN0IGxhYmVsWSA9IC1tYXhUaWNrTGFiZWxXaWR0aCAtIHRoaXMuWV9BWElTX1RJVExFX1BBRERJTkc7XG4gICAgY29uc3QgbGFiZWxYID0gLXRoaXMuaGVpZ2h0IC8gMjtcblxuICAgIGF4ZXNHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1heGlzLWxhYmVsIGF4LXktYXhpcy1sYWJlbCcpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXG4gICAgICAuYXR0cigneCcsIGxhYmVsWClcbiAgICAgIC5hdHRyKCd5JywgbGFiZWxZKVxuICAgICAgLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdzdHlsZScsXG4gICAgICAgIGBcbiAgICAgICAgZm9udC1zaXplOiAke3RpdGxlRm9udFNpemV9cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGZpbGw6IHJnYih2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtdGV4dC1jb2xvcikpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGAsXG4gICAgICApXG4gICAgICAudGV4dCh0aXRsZSk7XG4gIH1cblxuICAvLyBEYXRhICYgUGVyZm9ybWFuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfUE9JTlRTX1RPX1JFTkRFUiA9IDEwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBQT0lOVF9DT09SRElOQVRFX1BSRUNJU0lPTiA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BTllfSVRFTVNfVEhSRVNIT0xEID0gMjA7XG4gIHByaXZhdGUgcmVhZG9ubHkgVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCA9IDUwO1xuXG4gIC8vIFRvb2x0aXBcbiAgcHJpdmF0ZSByZWFkb25seSBUT09MVElQX0dBUCA9IDEwO1xuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGlucHV0IGRhdGEgdG8gY29uc2lzdGVudCBhcnJheSBmb3JtYXQgd2l0aCBvcmlnaW5hbEluZGV4XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZURhdGEocmF3RGF0YTogQVhMaW5lQ2hhcnRWYWx1ZSk6IChBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9KVtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdEYXRhKSkge1xuICAgICAgcmV0dXJuIHJhd0RhdGEubWFwKChzLCBpKSA9PiAoeyAuLi5zLCBvcmlnaW5hbEluZGV4OiBpIH0pKTtcbiAgICB9XG4gICAgaWYgKHJhd0RhdGEgJiYgJ2RhdGEnIGluIHJhd0RhdGEpIHtcbiAgICAgIHJldHVybiBbeyAuLi5yYXdEYXRhLCBvcmlnaW5hbEluZGV4OiAwIH1dO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXJpZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXM6IEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXJpZXMuaWQgfHwgc2VyaWVzLmxhYmVsIHx8IGBzZXJpZXMtJHtzZXJpZXMub3JpZ2luYWxJbmRleH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgYWRhcHRpdmUgWC1heGlzIHRpY2sgZm9udCBzaXplIGJhc2VkIG9uIGNoYXJ0IHdpZHRoIGFuZCBsYWJlbCBjb3VudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0WEF4aXNUaWNrRm9udFNpemUoY2hhcnRXaWR0aDogbnVtYmVyLCBpdGVtQ291bnQgPSAxKTogbnVtYmVyIHtcbiAgICBsZXQgc2l6ZSA9IGNoYXJ0V2lkdGggLyA0MjtcblxuICAgIGlmIChpdGVtQ291bnQgPiB0aGlzLlZFUllfTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIHNpemUgKj0gMC42NTtcbiAgICB9IGVsc2UgaWYgKGl0ZW1Db3VudCA+IHRoaXMuTUFOWV9JVEVNU19USFJFU0hPTEQpIHtcbiAgICAgIHNpemUgKj0gMC44O1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLk1JTl9GT05UX1NJWkVfWCwgTWF0aC5taW4odGhpcy5NQVhfRk9OVF9TSVpFX1gsIE1hdGgucm91bmQoc2l6ZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGFkYXB0aXZlIFktYXhpcyB0aWNrIGZvbnQgc2l6ZSBiYXNlZCBvbiBjaGFydCBoZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIGdldFlBeGlzVGlja0ZvbnRTaXplKGNoYXJ0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpemUgPSBjaGFydEhlaWdodCAvIDI4O1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLk1JTl9GT05UX1NJWkVfWSwgTWF0aC5taW4odGhpcy5NQVhfRk9OVF9TSVpFX1ksIE1hdGgucm91bmQoc2l6ZSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGF4aXMgdGl0bGUgZm9udCBzaXplIHJlbGF0aXZlIHRvIHRpY2sgbGFiZWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBeGlzVGl0bGVGb250U2l6ZSh0aWNrRm9udFNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKDE1LCBNYXRoLm1heCgxMiwgdGlja0ZvbnRTaXplKSk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGlubmVyIGNoYXJ0IGRpbWVuc2lvbnMgYmVmb3JlIG1hcmdpbnMgYXJlIGZpbmFsaXplZC5cbiAgICovXG4gIHByaXZhdGUgZXN0aW1hdGVDaGFydERpbWVuc2lvbnMoXG4gICAgY29udGFpbmVyV2lkdGg6IG51bWJlcixcbiAgICBjb250YWluZXJIZWlnaHQ6IG51bWJlcixcbiAgICBvcHRpb25zOiBBWExpbmVDaGFydE9wdGlvbixcbiAgKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBvdXRlcldpZHRoID0gb3B0aW9ucy53aWR0aCA/PyBNYXRoLm1heChjb250YWluZXJXaWR0aCwgMSk7XG4gICAgY29uc3Qgb3V0ZXJIZWlnaHQgPSBvcHRpb25zLmhlaWdodCA/PyBNYXRoLm1heChjb250YWluZXJIZWlnaHQsIDEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBNYXRoLm1heChvdXRlcldpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0LCB0aGlzLk1JTl9ESU1FTlNJT04pLFxuICAgICAgaGVpZ2h0OiBNYXRoLm1heChvdXRlckhlaWdodCAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbSwgdGhpcy5NSU5fRElNRU5TSU9OKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmlxdWUga2V5IGZvciBwb2ludCBjb29yZGluYXRlcyAoZm9yIG92ZXJsYXAgZGV0ZWN0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVQb2ludEtleSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlY2lzaW9uID0gdGhpcy5QT0lOVF9DT09SRElOQVRFX1BSRUNJU0lPTjtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZCh4ICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbn0sJHtNYXRoLnJvdW5kKHkgKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBzZXJpZXMgZWxlbWVudHMgZnJvbSB0aGUgY2hhcnRcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlU2VyaWVzRWxlbWVudHMoc2VyaWVzSWRlbnRpZmllcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoYC5heC1saW5lLWNoYXJ0LXNlcmllc1tkYXRhLXNlcmllcy1pZGVudGlmaWVyPVwiJHtzZXJpZXNJZGVudGlmaWVyfVwiXWApLnJlbW92ZSgpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKGAuYXgtbGluZS1jaGFydC1wb2ludHNbZGF0YS1zZXJpZXMtaWRlbnRpZmllcj1cIiR7c2VyaWVzSWRlbnRpZmllcn1cIl1gKS5yZW1vdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgbG9uZyBsYWJlbHMgd2l0aCBlbGxpcHNpc1xuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZUxhYmVsKGxhYmVsOiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gdGhpcy5NQVhfTEFCRUxfTEVOR1RIKTogc3RyaW5nIHtcbiAgICBpZiAobGFiZWwubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIGxhYmVsO1xuICAgIHJldHVybiBsYWJlbC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoIC0gMSkgKyAn4oCmJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIG1heGltdW0gd2lkdGggbmVlZGVkIGZvciBZLWF4aXMgdGljayBsYWJlbHNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlTWF4WUF4aXNUaWNrTGFiZWxXaWR0aChmb250U2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhbGxTZXJpZXNEYXRhID0gdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhLmZpbHRlcigocykgPT4gIXRoaXMuaGlkZGVuU2VyaWVzLmhhcyh0aGlzLmdldFNlcmllc0lkZW50aWZpZXIocykpKTtcblxuICAgIGxldCBtYXhWYWx1ZSA9IDA7XG4gICAgbGV0IG1pblZhbHVlID0gMDtcblxuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGFsbFNlcmllc0RhdGEpIHtcbiAgICAgIGlmIChzZXJpZXMuZGF0YSAmJiBzZXJpZXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHBvaW50LnkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXhWYWx1ZSA9IE1hdGgubWF4KG1heFZhbHVlLCBwb2ludC55KTtcbiAgICAgICAgICAgIG1pblZhbHVlID0gTWF0aC5taW4obWluVmFsdWUsIHBvaW50LnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGJvdGggbWF4IGFuZCBtaW4gKGZvciBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgY29uc3QgbWF4QWJzVmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhtYXhWYWx1ZSksIE1hdGguYWJzKG1pblZhbHVlKSk7XG4gICAgY29uc3QgdGlja0xhYmVsVGV4dCA9IE51bWJlci5pc0Zpbml0ZShtYXhBYnNWYWx1ZSkgPyBmb3JtYXRMYXJnZU51bWJlcihtYXhBYnNWYWx1ZSkgOiAnMDAwMDAnO1xuXG4gICAgcmV0dXJuIHRpY2tMYWJlbFRleHQubGVuZ3RoICogZm9udFNpemUgKiB0aGlzLkZPTlRfV0lEVEhfTVVMVElQTElFUiArIHRoaXMuRk9OVF9QQURESU5HO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkRDMoKTtcbiAgfVxuXG4gICNlZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YSA9IHRoaXMubm9ybWFsaXplRGF0YSh0aGlzLmRhdGEoKSk7XG4gICAgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG5cbiAgICBpZiAodGhpcy5fcmVuZGVyZWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRpYWxpemVkLnNldCh0cnVlKTtcbiAgICBpZiAodGhpcy5kMyAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICAgICAgdGhpcy5fcmVuZGVyZWQuc2V0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cENoYXJ0KCk7XG4gIH1cblxuICAvLyBBWENoYXJ0TGVnZW5kQ29tcGF0aWJsZSBJbXBsZW1lbnRhdGlvblxuICBnZXRMZWdlbmRJdGVtcygpOiBBWENoYXJ0TGVnZW5kSXRlbVtdIHtcbiAgICBjb25zdCB0b3RhbFN1bSA9IHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YS5yZWR1Y2UoKHN1bSwgc2VyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgc2VyaWVzLmRhdGEucmVkdWNlKChzU3VtLCBwKSA9PiBzU3VtICsgcC55LCAwKTtcbiAgICB9LCAwKTtcblxuICAgIHJldHVybiB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEubWFwKChzZXJpZXMpID0+IHtcbiAgICAgIGNvbnN0IHNlcmllc0lkZW50aWZpZXIgPSB0aGlzLmdldFNlcmllc0lkZW50aWZpZXIoc2VyaWVzKTtcbiAgICAgIGNvbnN0IHNlcmllc1N1bSA9IHNlcmllcy5kYXRhLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnksIDApO1xuICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRvdGFsU3VtID4gMCA/IChzZXJpZXNTdW0gLyB0b3RhbFN1bSkgKiAxMDAgOiAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHNlcmllc0lkZW50aWZpZXIsXG4gICAgICAgIG5hbWU6IHNlcmllcy5sYWJlbCB8fCBgU2VyaWVzICR7c2VyaWVzLm9yaWdpbmFsSW5kZXggKyAxfWAsXG4gICAgICAgIHZhbHVlOiBzZXJpZXNTdW0sXG4gICAgICAgIGNvbG9yOiBzZXJpZXMubGluZUNvbG9yIHx8IGdldENoYXJ0Q29sb3Ioc2VyaWVzLm9yaWdpbmFsSW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpLFxuICAgICAgICBoaWRkZW46IHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzZXJpZXNJZGVudGlmaWVyKSxcbiAgICAgICAgcGVyY2VudGFnZTogcGFyc2VGbG9hdChwZXJjZW50YWdlLnRvRml4ZWQoMikpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGhpZ2hsaWdodFNlZ21lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnKSByZXR1cm47XG5cbiAgICBjb25zdCBhbGxTZXJpZXNHcm91cHMgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2cuYXgtbGluZS1jaGFydC1zZXJpZXMnKTtcbiAgICBjb25zdCBhbGxQb2ludHNHcm91cHMgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoJ2cuYXgtbGluZS1jaGFydC1wb2ludHMnKTtcblxuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgYWxsU2VyaWVzR3JvdXBzLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuICAgICAgYWxsUG9pbnRzR3JvdXBzLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIGZhbHNlKS5zdHlsZSgnb3BhY2l0eScsIDEpO1xuXG4gICAgICBhbGxTZXJpZXNHcm91cHNcbiAgICAgICAgLnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gdGhpcy5ERUZBVUxUX0xJTkVfV0lEVEgpXG4gICAgICAgIC5jbGFzc2VkKCdheC1jaGFydC1oaWdobGlnaHRlZC1wYXRoJywgZmFsc2UpO1xuICAgICAgYWxsUG9pbnRzR3JvdXBzXG4gICAgICAgIC5zZWxlY3RBbGwoJ2NpcmNsZS5heC1saW5lLWNoYXJ0LXBvaW50JylcbiAgICAgICAgLmF0dHIoJ3InLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5wb2ludFJhZGl1cyA/PyB0aGlzLkRFRkFVTFRfUE9JTlRfUkFESVVTKVxuICAgICAgICAuY2xhc3NlZCgnYXgtY2hhcnQtaGlnaGxpZ2h0ZWQtcG9pbnQnLCBmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWxsU2VyaWVzR3JvdXBzLmNsYXNzZWQoJ2F4LWNoYXJ0LWRpbW1lZCcsIHRydWUpLnN0eWxlKCdvcGFjaXR5JywgMC4zKTtcbiAgICBhbGxQb2ludHNHcm91cHMuY2xhc3NlZCgnYXgtY2hhcnQtZGltbWVkJywgdHJ1ZSkuc3R5bGUoJ29wYWNpdHknLCAwLjMpO1xuXG4gICAgY29uc3QgdGFyZ2V0U2VyaWVzR3JvdXAgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoYGcuYXgtbGluZS1jaGFydC1zZXJpZXNbZGF0YS1zZXJpZXMtaWRlbnRpZmllcj1cIiR7aWR9XCJdYCk7XG4gICAgY29uc3QgdGFyZ2V0UG9pbnRzR3JvdXAgPSB0aGlzLnN2Zy5zZWxlY3RBbGwoYGcuYXgtbGluZS1jaGFydC1wb2ludHNbZGF0YS1zZXJpZXMtaWRlbnRpZmllcj1cIiR7aWR9XCJdYCk7XG5cbiAgICB0YXJnZXRTZXJpZXNHcm91cC5jbGFzc2VkKCdheC1jaGFydC1kaW1tZWQnLCBmYWxzZSkuc3R5bGUoJ29wYWNpdHknLCAxKTtcbiAgICB0YXJnZXRQb2ludHNHcm91cC5jbGFzc2VkKCdheC1jaGFydC1kaW1tZWQnLCBmYWxzZSkuc3R5bGUoJ29wYWNpdHknLCAxKTtcblxuICAgIHRhcmdldFNlcmllc0dyb3VwXG4gICAgICAuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1saW5lJylcbiAgICAgIC5hdHRyKFxuICAgICAgICAnc3Ryb2tlLXdpZHRoJyxcbiAgICAgICAgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmxpbmVXaWR0aCA/PyB0aGlzLkRFRkFVTFRfTElORV9XSURUSCkgKiB0aGlzLkxJTkVfSElHSExJR0hUX01VTFRJUExJRVIsXG4gICAgICApXG4gICAgICAuY2xhc3NlZCgnYXgtY2hhcnQtaGlnaGxpZ2h0ZWQtcGF0aCcsIHRydWUpO1xuXG4gICAgdGFyZ2V0UG9pbnRzR3JvdXBcbiAgICAgIC5zZWxlY3RBbGwoJ2NpcmNsZS5heC1saW5lLWNoYXJ0LXBvaW50JylcbiAgICAgIC5hdHRyKCdyJywgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IHRoaXMuREVGQVVMVF9QT0lOVF9SQURJVVMpICogdGhpcy5QT0lOVF9ISUdITElHSFRfTVVMVElQTElFUilcbiAgICAgIC5jbGFzc2VkKCdheC1jaGFydC1oaWdobGlnaHRlZC1wYXRoJywgdHJ1ZSk7XG4gIH1cblxuICB0b2dnbGVTZWdtZW50KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuZGVsZXRlKGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRkZW5TZXJpZXMuYWRkKGlkKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgIHJldHVybiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKGlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkRDMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZDMgPSBhd2FpdCBpbXBvcnQoJ2QzJyk7XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZDMgfHwgIXRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCkubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhbGxTZXJpZXNEYXRhID0gdGhpcy5fZnVsbE5vcm1hbGl6ZWREYXRhO1xuXG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgU1ZHIGFuZCBhbnkgZW1wdHktc3RhdGUgbWVzc2FnZXMgKHByZXNlcnZlIHRvb2x0aXAgY29tcG9uZW50KVxuICAgIHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5zZWxlY3RBbGwoJ3N2ZywgLmF4LWxpbmUtY2hhcnQtbm8tZGF0YS1tZXNzYWdlLCAuYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKVxuICAgICAgLnJlbW92ZSgpO1xuXG4gICAgaWYgKGFsbFNlcmllc0RhdGEubGVuZ3RoID09PSAwIHx8IGFsbFNlcmllc0RhdGEuZXZlcnkoKHNlcmllcykgPT4gIXNlcmllcy5kYXRhIHx8IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlzaWJsZURhdGFGb3JSZW5kZXJpbmcgPSBhbGxTZXJpZXNEYXRhLmZpbHRlcihcbiAgICAgIChzZXJpZXMpID0+ICF0aGlzLmhpZGRlblNlcmllcy5oYXModGhpcy5nZXRTZXJpZXNJZGVudGlmaWVyKHNlcmllcykpLFxuICAgICk7XG5cbiAgICBpZiAodmlzaWJsZURhdGFGb3JSZW5kZXJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBBbGwgZGF0YSBpcyBwcmVzZW50LCBidXQgYWxsIHNlcmllcyBhcmUgaGlkZGVuIGJ5IHRoZSBsZWdlbmRcbiAgICAgIHRoaXMuc2hvd0FsbFNlcmllc0hpZGRlbk1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICAvLyBTdGlsbCBzZXR1cCBiYXNpYyBTVkcgYW5kIGNoYXJ0IGdyb3VwIGZvciBjb25zaXN0ZW5jeSBpZiBuZWVkZWQsIG9yIHJldHVyblxuICAgICAgLy8gRm9yIG5vdywgd2Ugd2lsbCBzaG93IHRoZSBtZXNzYWdlIGFuZCByZXR1cm4sIGFzIHNjYWxlcy9heGVzIGNhbid0IGJlIGRyYXduLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBEaW1lbnNpb25zKGNvbnRhaW5lckVsZW1lbnQsIGNoYXJ0T3B0aW9ucyk7XG5cbiAgICAvLyBVc2UgYWxsU2VyaWVzRGF0YSBmb3IgZG9tYWluIGNhbGN1bGF0aW9uIHRvIGtlZXAgc2NhbGVzIGNvbnNpc3RlbnRcbiAgICBjb25zdCBkYXRhRm9yU2NhbGVTZXR1cCA9IGFsbFNlcmllc0RhdGEuZmlsdGVyKChzKSA9PiBzLmRhdGEgJiYgcy5kYXRhLmxlbmd0aCA+IDApO1xuICAgIGlmIChkYXRhRm9yU2NhbGVTZXR1cC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc2hvd05vRGF0YU1lc3NhZ2UoY29udGFpbmVyRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0dXBTY2FsZXMoZGF0YUZvclNjYWxlU2V0dXApO1xuICAgIHRoaXMuY3JlYXRlQXhlcyhjaGFydE9wdGlvbnMpO1xuICAgIHRoaXMucmVuZGVyTGluZXMoYWxsU2VyaWVzRGF0YSk7IC8vIFJlbmRlckxpbmVzIHdpbGwgaGFuZGxlIGhpZGluZyBiYXNlZCBvbiBoaWRkZW5TZXJpZXNcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVDaGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgdGhpcy5kM1xuICAgICAgICA/LnNlbGVjdCh0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudClcbiAgICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UsIC5heC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tbWVzc2FnZScpXG4gICAgICAgIC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnID0gbnVsbDtcbiAgICAgIHRoaXMuY2hhcnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cERpbWVuc2lvbnMoY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLm1heChjb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoLCAxKTtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodCwgMSk7XG4gICAgdGhpcy5jYWxjdWxhdGVNYXJnaW5zKG9wdGlvbnMsIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQpO1xuXG4gICAgaWYgKG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgIHRoaXMud2lkdGggPSBvcHRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2luLnRvcCAtIHRoaXMubWFyZ2luLmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IGNvbnRhaW5lcldpZHRoIC0gdGhpcy5tYXJnaW4ubGVmdCAtIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSB0aGlzLm1hcmdpbi50b3AgLSB0aGlzLm1hcmdpbi5ib3R0b207XG4gICAgfVxuXG4gICAgdGhpcy53aWR0aCA9IE1hdGgubWF4KHRoaXMud2lkdGgsIHRoaXMuTUlOX0RJTUVOU0lPTik7XG4gICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heCh0aGlzLmhlaWdodCwgdGhpcy5NSU5fRElNRU5TSU9OKTtcblxuICAgIGNvbnN0IHRvdGFsV2lkdGggPSB0aGlzLndpZHRoICsgdGhpcy5tYXJnaW4ubGVmdCArIHRoaXMubWFyZ2luLnJpZ2h0O1xuICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyB0aGlzLm1hcmdpbi50b3AgKyB0aGlzLm1hcmdpbi5ib3R0b207XG5cbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KGNvbnRhaW5lckVsZW1lbnQpXG4gICAgICAuYXBwZW5kKCdzdmcnKVxuICAgICAgLmF0dHIoJ3dpZHRoJywgJzEwMCUnKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3RvdGFsV2lkdGh9ICR7dG90YWxIZWlnaHR9YClcbiAgICAgIC5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkIG1lZXQnKTtcblxuICAgIHRoaXMuc3ZnID0gc3ZnO1xuICAgIHRoaXMuY2hhcnQgPSB0aGlzLnN2Z1xuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCR7dGhpcy5tYXJnaW4udG9wfSlgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWFyZ2lucyhvcHRpb25zOiBBWExpbmVDaGFydE9wdGlvbiwgY29udGFpbmVyV2lkdGg6IG51bWJlciwgY29udGFpbmVySGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmdpbiA9IHtcbiAgICAgIHRvcDogb3B0aW9ucy5tYXJnaW5zPy50b3AgPz8gdGhpcy5ERUZBVUxUX01BUkdJTl9UT1AsXG4gICAgICByaWdodDogb3B0aW9ucy5tYXJnaW5zPy5yaWdodCA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX1JJR0hULFxuICAgICAgYm90dG9tOiBvcHRpb25zLm1hcmdpbnM/LmJvdHRvbSA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX0JPVFRPTSxcbiAgICAgIGxlZnQ6IG9wdGlvbnMubWFyZ2lucz8ubGVmdCA/PyB0aGlzLkRFRkFVTFRfTUFSR0lOX0xFRlQsXG4gICAgfTtcblxuICAgIGNvbnN0IGVzdGltYXRlZERpbWVuc2lvbnMgPSB0aGlzLmVzdGltYXRlQ2hhcnREaW1lbnNpb25zKGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGFsbERhdGFQb2ludHMgPSB0aGlzLl9mdWxsTm9ybWFsaXplZERhdGEuZmxhdE1hcCgoc2VyaWVzKSA9PiBzZXJpZXMuZGF0YSk7XG4gICAgY29uc3QgYWxsTnVtZXJpY1ggPSBhbGxEYXRhUG9pbnRzLmxlbmd0aCA9PT0gMCB8fCBhbGxEYXRhUG9pbnRzLmV2ZXJ5KChkKSA9PiB0eXBlb2YgZC54ID09PSAnbnVtYmVyJyk7XG5cbiAgICBsZXQgY2F0ZWdvcmljYWxMYWJlbHM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKCFhbGxOdW1lcmljWCkge1xuICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHRoaXMuX2Z1bGxOb3JtYWxpemVkRGF0YS5maWx0ZXIoXG4gICAgICAgIChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzKSksXG4gICAgICApO1xuICAgICAgY2F0ZWdvcmljYWxMYWJlbHMgPSBbLi4ubmV3IFNldCh2aXNpYmxlU2VyaWVzLmZsYXRNYXAoKHNlcmllcykgPT4gc2VyaWVzLmRhdGEubWFwKChkKSA9PiBTdHJpbmcoZC54KSkpKV07XG4gICAgfVxuXG4gICAgdGhpcy5tYXJnaW4uYm90dG9tID0gdGhpcy5jYWxjdWxhdGVSZXF1aXJlZEJvdHRvbU1hcmdpbihvcHRpb25zLCBlc3RpbWF0ZWREaW1lbnNpb25zLndpZHRoLCBjYXRlZ29yaWNhbExhYmVscyk7XG4gICAgdGhpcy5tYXJnaW4ubGVmdCA9IHRoaXMuY2FsY3VsYXRlUmVxdWlyZWRMZWZ0TWFyZ2luKG9wdGlvbnMsIGVzdGltYXRlZERpbWVuc2lvbnMuaGVpZ2h0KTtcblxuICAgIC8vIFNlY29uZCBwYXNzOiBtYXJnaW5zIGFmZmVjdCBpbm5lciBjaGFydCBzaXplLCB3aGljaCBhZmZlY3RzIGxhYmVsIGxheW91dFxuICAgIGNvbnN0IHJlZmluZWREaW1lbnNpb25zID0gdGhpcy5lc3RpbWF0ZUNoYXJ0RGltZW5zaW9ucyhjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0LCBvcHRpb25zKTtcbiAgICB0aGlzLm1hcmdpbi5ib3R0b20gPSB0aGlzLmNhbGN1bGF0ZVJlcXVpcmVkQm90dG9tTWFyZ2luKG9wdGlvbnMsIHJlZmluZWREaW1lbnNpb25zLndpZHRoLCBjYXRlZ29yaWNhbExhYmVscyk7XG4gICAgdGhpcy5tYXJnaW4ubGVmdCA9IHRoaXMuY2FsY3VsYXRlUmVxdWlyZWRMZWZ0TWFyZ2luKG9wdGlvbnMsIHJlZmluZWREaW1lbnNpb25zLmhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwU2NhbGVzKGRhdGE6IChBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9KVtdKTogdm9pZCB7XG4gICAgLy8gRXhwZWN0cyBhbHJlYWR5IGZpbHRlcmVkIGRhdGEgZm9yIHNjYWxlc1xuICAgIGNvbnN0IGNoYXJ0T3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjaGFydE9wdGlvbnMuYXhpc1BhZGRpbmcgPz8gMDtcbiAgICBjb25zdCBwYWRkaW5nTXVsdGlwbGllciA9IHBhZGRpbmcgLyAxMDA7XG5cbiAgICAvLyBFbnN1cmUgZGF0YSBpcyBub3QgZW1wdHkgZm9yIHNjYWxlIGRvbWFpbiBjYWxjdWxhdGlvblxuICAgIGNvbnN0IGFsbERhdGFQb2ludHMgPSBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhLmZsYXRNYXAoKHNlcmllcykgPT4gc2VyaWVzLmRhdGEpIDogW3sgeDogMCwgeTogMCB9XTtcbiAgICBpZiAoYWxsRGF0YVBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNob3VsZCBpZGVhbGx5IG5vdCBoYXBwZW4gaWYgY3JlYXRlQ2hhcnQgZmlsdGVycyBjb3JyZWN0bHlcbiAgICAgIGFsbERhdGFQb2ludHMucHVzaCh7IHg6IDAsIHk6IDAgfSk7IC8vIERlZmF1bHQgZmFsbGJhY2sgdG8gcHJldmVudCBjcmFzaCB3aXRoIGVtcHR5IGRvbWFpblxuICAgIH1cblxuICAgIGNvbnN0IGFsbE51bWVyaWNYID0gYWxsRGF0YVBvaW50cy5ldmVyeSgoZCkgPT4gdHlwZW9mIGQueCA9PT0gJ251bWJlcicpO1xuXG4gICAgaWYgKGFsbE51bWVyaWNYKSB7XG4gICAgICB0aGlzLnhTY2FsZUtpbmQgPSAnbGluZWFyJztcbiAgICAgIGNvbnN0IHhNaW4gPSB0aGlzLmQzLm1pbihhbGxEYXRhUG9pbnRzLCAoZCkgPT4gZC54IGFzIG51bWJlcikgPz8gMDtcbiAgICAgIGNvbnN0IHhNYXggPSB0aGlzLmQzLm1heChhbGxEYXRhUG9pbnRzLCAoZCkgPT4gZC54IGFzIG51bWJlcikgPz8gMDtcblxuICAgICAgaWYgKHhNaW4gPT09IHhNYXgpIHtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzXG4gICAgICAgICAgLnNjYWxlTGluZWFyKClcbiAgICAgICAgICAuZG9tYWluKFt4TWluIC0gMSwgeE1heCArIDFdKVxuICAgICAgICAgIC5yYW5nZShbMCwgdGhpcy53aWR0aF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFt4TWluLCB4TWF4XSkucmFuZ2UoWzAsIHRoaXMud2lkdGhdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy54U2NhbGVLaW5kID0gJ3BvaW50JztcbiAgICAgIGNvbnN0IHhEb21haW46IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBzZWVuWCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBhbGxEYXRhUG9pbnRzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwb2ludC54KTtcbiAgICAgICAgaWYgKCFzZWVuWC5oYXMoa2V5KSkge1xuICAgICAgICAgIHNlZW5YLmFkZChrZXkpO1xuICAgICAgICAgIHhEb21haW4ucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMueFNjYWxlID0gdGhpcy5kM1xuICAgICAgICAuc2NhbGVQb2ludDxzdHJpbmc+KClcbiAgICAgICAgLmRvbWFpbih4RG9tYWluKVxuICAgICAgICAucmFuZ2UoWzAsIHRoaXMud2lkdGhdKVxuICAgICAgICAucGFkZGluZygwKTtcbiAgICB9XG5cbiAgICBjb25zdCB5QXhpc1N0YXJ0c0F0WmVybyA9IGNoYXJ0T3B0aW9ucy55QXhpc1N0YXJ0c0F0WmVybyAhPT0gZmFsc2U7XG4gICAgY29uc3QgZGF0YVlNaW4gPSB0aGlzLmQzLm1pbihhbGxEYXRhUG9pbnRzLCAoZCkgPT4gZC55KSA/PyAwO1xuICAgIGNvbnN0IGRhdGFZTWF4ID0gdGhpcy5kMy5tYXgoYWxsRGF0YVBvaW50cywgKGQpID0+IGQueSkgPz8gMDtcblxuICAgIGxldCB5TWluOiBudW1iZXI7XG4gICAgbGV0IHlNYXg6IG51bWJlcjtcblxuICAgIGlmICh5QXhpc1N0YXJ0c0F0WmVybykge1xuICAgICAgeU1pbiA9IE1hdGgubWluKDAsIGRhdGFZTWluKTtcbiAgICAgIHlNYXggPSBNYXRoLm1heCgwLCBkYXRhWU1heCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHlNaW4gPSBkYXRhWU1pbjtcbiAgICAgIHlNYXggPSBkYXRhWU1heDtcbiAgICB9XG5cbiAgICBjb25zdCB5UmFuZ2UgPSB5TWF4IC0geU1pbiB8fCAxO1xuXG4gICAgdGhpcy55U2NhbGUgPSB0aGlzLmQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbeU1pbiwgeU1heCArIHlSYW5nZSAqIHBhZGRpbmdNdWx0aXBsaWVyXSlcbiAgICAgIC5uaWNlKClcbiAgICAgIC5yYW5nZShbdGhpcy5oZWlnaHQsIDBdKTtcblxuICAgIGlmICh5QXhpc1N0YXJ0c0F0WmVybyAmJiBkYXRhWU1pbiA+PSAwKSB7XG4gICAgICB0aGlzLnlTY2FsZS5kb21haW4oWzAsIHRoaXMueVNjYWxlLmRvbWFpbigpWzFdXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBeGVzKG9wdGlvbnM6IEFYTGluZUNoYXJ0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc2hvd1hBeGlzID0gb3B0aW9ucy5zaG93WEF4aXMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHNob3dZQXhpcyA9IG9wdGlvbnMuc2hvd1lBeGlzICE9PSBmYWxzZTtcbiAgICBjb25zdCBzaG93R3JpZCA9IG9wdGlvbnMuc2hvd0dyaWQgIT09IGZhbHNlO1xuICAgIGNvbnN0IGlzUG9pbnRTY2FsZSA9IHRoaXMueFNjYWxlS2luZCA9PT0gJ3BvaW50JztcbiAgICBjb25zdCBwb2ludFNjYWxlID0gaXNQb2ludFNjYWxlID8gKHRoaXMueFNjYWxlIGFzIGQzLlNjYWxlUG9pbnQ8c3RyaW5nPikgOiBudWxsO1xuICAgIGNvbnN0IGlzUnRsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA9PT0gJ3J0bCcgfHwgZG9jdW1lbnQuYm9keS5kaXIgPT09ICdydGwnO1xuICAgIGNvbnN0IGF4ZXNHcm91cCA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1heGVzJyk7XG5cbiAgICBpZiAoc2hvd1hBeGlzKSB7XG4gICAgICBsZXQgeEF4aXNHZW5lcmF0b3I7XG4gICAgICBsZXQgaXRlbUNvdW50ID0gMDtcblxuICAgICAgaWYgKGlzUG9pbnRTY2FsZSAmJiBwb2ludFNjYWxlKSB7XG4gICAgICAgIGl0ZW1Db3VudCA9IHBvaW50U2NhbGUuZG9tYWluKCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwb2ludExheW91dCA9IHRoaXMucmVzb2x2ZVhBeGlzTGFiZWxMYXlvdXQodGhpcy53aWR0aCwgcG9pbnRTY2FsZS5kb21haW4oKSk7XG4gICAgICAgIHRoaXMueEF4aXNMYWJlbExheW91dC5mb250U2l6ZSA9IHBvaW50TGF5b3V0LmZvbnRTaXplO1xuICAgICAgICB0aGlzLnhBeGlzTGFiZWxMYXlvdXQud2lsbFJvdGF0ZSA9IHBvaW50TGF5b3V0LndpbGxSb3RhdGU7XG4gICAgICAgIHRoaXMueEF4aXNMYWJlbExheW91dC50aWNrQXJlYUhlaWdodCA9IHBvaW50TGF5b3V0LnRpY2tBcmVhSGVpZ2h0O1xuICAgICAgICB0aGlzLnhBeGlzTGFiZWxMYXlvdXQuZGlzcGxheWVkVGlja0NvdW50ID0gcG9pbnRMYXlvdXQuZGlzcGxheWVkVGlja0NvdW50O1xuXG4gICAgICAgIC8vIFNtYXJ0IHRpY2sgcmVkdWN0aW9uIGZvciBtYW55IGl0ZW1zIChsaWtlIGJhciBjaGFydClcbiAgICAgICAgbGV0IHRpY2tWYWx1ZXM6IHN0cmluZ1tdID0gcG9pbnRTY2FsZS5kb21haW4oKTtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA+IHRoaXMuVkVSWV9NQU5ZX0lURU1TX1RIUkVTSE9MRCkge1xuICAgICAgICAgIC8vIFNob3cgZXZlcnkgNXRoIHRpY2sgZm9yIDUwKyBpdGVtc1xuICAgICAgICAgIHRpY2tWYWx1ZXMgPSB0aWNrVmFsdWVzLmZpbHRlcigoX2QsIGkpID0+IGkgJSA1ID09PSAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtQ291bnQgPiB0aGlzLk1BTllfSVRFTVNfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgLy8gU2hvdyBldmVyeSAybmQgdGljayBmb3IgMjAtNTAgaXRlbXNcbiAgICAgICAgICB0aWNrVmFsdWVzID0gdGlja1ZhbHVlcy5maWx0ZXIoKF9kLCBpKSA9PiBpICUgMiA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgICAgICB4QXhpc0dlbmVyYXRvciA9IHRoaXMuZDNcbiAgICAgICAgICAuYXhpc0JvdHRvbShwb2ludFNjYWxlKVxuICAgICAgICAgIC50aWNrVmFsdWVzKHRpY2tWYWx1ZXMpXG4gICAgICAgICAgLnRpY2tTaXplKDUpXG4gICAgICAgICAgLnRpY2tQYWRkaW5nKDgpXG4gICAgICAgICAgLnRpY2tGb3JtYXQoKGQ6IGQzLkF4aXNEb21haW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKGQpO1xuICAgICAgICAgICAgLy8gVHJ1bmNhdGUgbG9uZyBsYWJlbHMgaW50ZWxsaWdlbnRseVxuICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gaXRlbUNvdW50ID4gdGhpcy5NQU5ZX0lURU1TX1RIUkVTSE9MRCA/IDEwIDogdGhpcy5NQVhfTEFCRUxfTEVOR1RIO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ1bmNhdGVMYWJlbChsYWJlbCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExpbmVhciBzY2FsZSAobnVtZXJpYyBkYXRhKVxuICAgICAgICAvLyBMZXQgRDMgZGV0ZXJtaW5lIG9wdGltYWwgdGljayBjb3VudCwgYnV0IGVuc3VyZSB3ZSBzaG93IHJlYXNvbmFibGUgbnVtYmVyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBvcHRpbWFsIHRpY2sgY291bnQgYmFzZWQgb24gd2lkdGhcbiAgICAgICAgY29uc3Qgb3B0aW1hbFRpY2tDb3VudCA9IE1hdGgubWluKDEyLCBNYXRoLm1heCg1LCBNYXRoLmZsb29yKHRoaXMud2lkdGggLyA4MCkpKTtcblxuICAgICAgICB4QXhpc0dlbmVyYXRvciA9IHRoaXMuZDNcbiAgICAgICAgICAuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSlcbiAgICAgICAgICAudGlja3Mob3B0aW1hbFRpY2tDb3VudClcbiAgICAgICAgICAudGlja1NpemUoNSlcbiAgICAgICAgICAudGlja1BhZGRpbmcoOClcbiAgICAgICAgICAudGlja0Zvcm1hdCgoZDogZDMuQXhpc0RvbWFpbikgPT4ge1xuICAgICAgICAgICAgLy8gRm9ybWF0IG51bWJlcnMgbmljZWx5XG4gICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIoZCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcobnVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW0udG9GaXhlZCgxKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpdGVtQ291bnQgPSBvcHRpbWFsVGlja0NvdW50O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnhBeGlzID0gYXhlc0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1heGlzLXgnKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7dGhpcy5oZWlnaHR9KWApXG4gICAgICAgIC5jYWxsKHhBeGlzR2VuZXJhdG9yKTtcblxuICAgICAgLy8gU3R5bGUgdGhlIHgtYXhpcyBwYXRoIGFuZCBsaW5lc1xuICAgICAgdGhpcy54QXhpcy5zZWxlY3RBbGwoJ3BhdGgnKS5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtYXhpcy1jb2xvciksIDAuMiknKTtcblxuICAgICAgdGhpcy54QXhpc1xuICAgICAgICAuc2VsZWN0QWxsKCdsaW5lJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1ncmlkLWxpbmVzLWNvbG9yKSwgMC4yKScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgJzIsMicpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICcwLjUnKTtcblxuICAgICAgY29uc3QgZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplID0gaXNQb2ludFNjYWxlXG4gICAgICAgID8gdGhpcy54QXhpc0xhYmVsTGF5b3V0LmZvbnRTaXplXG4gICAgICAgIDogdGhpcy5nZXRYQXhpc1RpY2tGb250U2l6ZSh0aGlzLndpZHRoLCBpdGVtQ291bnQpO1xuICAgICAgY29uc3QgeEF4aXNUaWNrcyA9IHRoaXMueEF4aXNcbiAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7ZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplfXB4YClcbiAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc0MDAnKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KScpXG4gICAgICAgIC5hdHRyKCdkaXJlY3Rpb24nLCAnbHRyJyk7XG5cbiAgICAgIGlmIChpc1BvaW50U2NhbGUgJiYgcG9pbnRTY2FsZSAmJiBwb2ludFNjYWxlLmRvbWFpbigpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMueEF4aXNMYWJlbExheW91dC53aWxsUm90YXRlKSB7XG4gICAgICAgICAgeEF4aXNUaWNrc1xuICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTQ1KScpXG4gICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ2VuZCcpXG4gICAgICAgICAgICAuYXR0cignZHgnLCAnLTAuOGVtJylcbiAgICAgICAgICAgIC5hdHRyKCdkeScsICcwLjE1ZW0nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB4VGlja0FyZWFIZWlnaHQgPSB0aGlzLm1lYXN1cmVYQXhpc1RpY2tBcmVhSGVpZ2h0KFxuICAgICAgICB0aGlzLnhBeGlzLm5vZGUoKSxcbiAgICAgICAgZHluYW1pY1hBeGlzVGlja0ZvbnRTaXplLFxuICAgICAgICB0aGlzLnhBeGlzTGFiZWxMYXlvdXQudGlja0FyZWFIZWlnaHQsXG4gICAgICApO1xuXG4gICAgICBpZiAob3B0aW9ucy54QXhpc0xhYmVsKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlWEF4aXNUaXRsZShheGVzR3JvdXAsIG9wdGlvbnMueEF4aXNMYWJlbCwgeFRpY2tBcmVhSGVpZ2h0LCBkeW5hbWljWEF4aXNUaWNrRm9udFNpemUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93WUF4aXMpIHtcbiAgICAgIC8vIENyZWF0ZSBZIGF4aXMgd2l0aCBzbWFydCBudW1iZXIgZm9ybWF0dGluZ1xuICAgICAgY29uc3QgeUF4aXNHZW5lcmF0b3IgPSB0aGlzLmQzXG4gICAgICAgIC5heGlzTGVmdCh0aGlzLnlTY2FsZSlcbiAgICAgICAgLnRpY2tTaXplKDUpXG4gICAgICAgIC50aWNrUGFkZGluZyg4KVxuICAgICAgICAudGlja0Zvcm1hdCgodmFsdWU6IG51bWJlciB8IHsgdmFsdWVPZigpOiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bVZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdmFsdWUudmFsdWVPZigpO1xuICAgICAgICAgIHJldHVybiBmb3JtYXRMYXJnZU51bWJlcihudW1WYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAvLyBSZWR1Y2UgdGljayBjb3VudCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IHdpdGggbGFyZ2UgbnVtYmVyc1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLnlTY2FsZS5kb21haW4oKVsxXTtcbiAgICAgIGlmIChtYXhWYWx1ZSA+IDFlNikge1xuICAgICAgICB5QXhpc0dlbmVyYXRvci50aWNrcyg2KTsgLy8gRmV3ZXIgdGlja3MgZm9yIG1pbGxpb25zK1xuICAgICAgfSBlbHNlIGlmIChtYXhWYWx1ZSA+IDFlMykge1xuICAgICAgICB5QXhpc0dlbmVyYXRvci50aWNrcyg4KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy55QXhpcyA9IGF4ZXNHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWF4aXMteScpLmNhbGwoeUF4aXNHZW5lcmF0b3IpO1xuXG4gICAgICAvLyBTdHlsZSB0aGUgeS1heGlzIHBhdGggYW5kIGxpbmVzXG4gICAgICB0aGlzLnlBeGlzLnNlbGVjdEFsbCgncGF0aCcpLmF0dHIoJ3N0cm9rZScsICdyZ2JhKHZhcigtLWF4LWNvbXAtbGluZS1jaGFydC1heGlzLWNvbG9yKSwgMC4yKScpO1xuXG4gICAgICB0aGlzLnlBeGlzXG4gICAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjIpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMiwyJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNScpO1xuXG4gICAgICBjb25zdCBkeW5hbWljWUF4aXNUaWNrRm9udFNpemUgPSB0aGlzLmdldFlBeGlzVGlja0ZvbnRTaXplKHRoaXMuaGVpZ2h0KTtcbiAgICAgIGNvbnN0IHlUaWNrVGV4dHMgPSB0aGlzLnlBeGlzLnNlbGVjdEFsbCgndGV4dCcpLmF0dHIoXG4gICAgICAgICdzdHlsZScsXG4gICAgICAgIGBcbiAgICAgICAgICBmb250LXNpemU6ICR7ZHluYW1pY1lBeGlzVGlja0ZvbnRTaXplfXB4O1xuICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgICAgICAgZmlsbDogcmdiYSh2YXIoLS1heC1jb21wLWxpbmUtY2hhcnQtbGFiZWxzLWNvbG9yKSwgMC43KTtcbiAgICAgICAgYCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1J0bCkge1xuICAgICAgICB5VGlja1RleHRzLmF0dHIoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5VGlja1RleHRzLmF0dHIoJ3RleHQtYW5jaG9yJywgJ2VuZCcpLmF0dHIoJ2RpcmVjdGlvbicsICdsdHInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeVRpY2tOb2RlcyA9ICh5VGlja1RleHRzLm5vZGVzKCkgfHwgW10pIGFzIFNWR1RleHRFbGVtZW50W107XG4gICAgICBjb25zdCBtYXhUaWNrTGFiZWxXaWR0aCA9IHRoaXMubWVhc3VyZU1heFlBeGlzVGlja0xhYmVsV2lkdGgoeVRpY2tOb2RlcywgZHluYW1pY1lBeGlzVGlja0ZvbnRTaXplKTtcblxuICAgICAgaWYgKG9wdGlvbnMueUF4aXNMYWJlbCkge1xuICAgICAgICB0aGlzLmNyZWF0ZVlBeGlzVGl0bGUoYXhlc0dyb3VwLCBvcHRpb25zLnlBeGlzTGFiZWwsIGR5bmFtaWNZQXhpc1RpY2tGb250U2l6ZSwgbWF4VGlja0xhYmVsV2lkdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93R3JpZCkge1xuICAgICAgY29uc3QgZ3JpZEdyb3VwID0gdGhpcy5jaGFydFxuICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtZ3JpZC1jb250YWluZXInKVxuICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXG4gICAgICBjb25zdCB5R3JpZCA9IGdyaWRHcm91cFxuICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtZ3JpZCcpXG4gICAgICAgIC5jYWxsKFxuICAgICAgICAgIHRoaXMuZDNcbiAgICAgICAgICAgIC5heGlzTGVmdCh0aGlzLnlTY2FsZSlcbiAgICAgICAgICAgIC50aWNrU2l6ZSgtdGhpcy53aWR0aClcbiAgICAgICAgICAgIC50aWNrRm9ybWF0KCgpID0+ICcnKVxuICAgICAgICAgICAgLnRpY2tWYWx1ZXModGhpcy55U2NhbGUudGlja3MoKSksXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFN0eWxlIHRoZSBncmlkIHBhdGggYW5kIGxpbmVzXG4gICAgICB5R3JpZC5zZWxlY3RBbGwoJ3BhdGgnKS5hdHRyKCdzdHJva2Utd2lkdGgnLCAnMCcpO1xuXG4gICAgICB5R3JpZFxuICAgICAgICAuc2VsZWN0QWxsKCcudGljaycpXG4gICAgICAgIC5zZWxlY3RBbGwoJ2xpbmUnKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjIpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMiwyJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1vcGFjaXR5JywgJzAuNScpO1xuXG4gICAgICBpZiAob3B0aW9ucy5zaG93VmVydGljYWxHcmlkKSB7XG4gICAgICAgIGNvbnN0IHhHcmlkID0gZ3JpZEdyb3VwXG4gICAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtZ3JpZC12ZXJ0aWNhbCcpXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke3RoaXMuaGVpZ2h0fSlgKVxuICAgICAgICAgIC5jYWxsKFxuICAgICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgICAuYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSlcbiAgICAgICAgICAgICAgLnRpY2tTaXplKC10aGlzLmhlaWdodClcbiAgICAgICAgICAgICAgLnRpY2tGb3JtYXQoKCkgPT4gJycpXG4gICAgICAgICAgICAgIC50aWNrVmFsdWVzKGlzUG9pbnRTY2FsZSA/IHVuZGVmaW5lZCA6ICh0aGlzLnhTY2FsZSBhcyBkMy5TY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlcj4pLnRpY2tzKCkpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gU3R5bGUgdGhlIHZlcnRpY2FsIGdyaWQgcGF0aCBhbmQgbGluZXNcbiAgICAgICAgeEdyaWQuc2VsZWN0QWxsKCdwYXRoJykuYXR0cignc3Ryb2tlLXdpZHRoJywgJzAnKTtcblxuICAgICAgICB4R3JpZFxuICAgICAgICAgIC5zZWxlY3RBbGwoJy50aWNrJylcbiAgICAgICAgICAuc2VsZWN0QWxsKCdsaW5lJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjE1KScpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMiwyJylcbiAgICAgICAgICAuYXR0cignc3Ryb2tlLW9wYWNpdHknLCAnMC41Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRYUG9zaXRpb24ocG9pbnQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nIH0pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnhTY2FsZUtpbmQgPT09ICdwb2ludCcpIHtcbiAgICAgIHJldHVybiAodGhpcy54U2NhbGUgYXMgZDMuU2NhbGVQb2ludDxzdHJpbmc+KShTdHJpbmcocG9pbnQueCkpID8/IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLnhTY2FsZSBhcyBkMy5TY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlcj4pKHBvaW50LnggYXMgbnVtYmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyTGluZXMoYWxsU2VyaWVzRGF0YTogKEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0pW10pOiB2b2lkIHtcbiAgICBjb25zdCBnZXRYID0gKGQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfSkgPT4gdGhpcy5nZXRYUG9zaXRpb24oZCk7XG5cbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgLmxpbmU8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PigpXG4gICAgICAueChnZXRYKVxuICAgICAgLnkoKGQpID0+IHRoaXMueVNjYWxlKGQueSkpIGFzIGQzLkxpbmU8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PjtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zbW9vdGhMaW5lICE9PSBmYWxzZSkge1xuICAgICAgbGluZUdlbmVyYXRvci5jdXJ2ZSh0aGlzLmQzLmN1cnZlTW9ub3RvbmVYKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcmVhR2VuZXJhdG9yID0gdGhpcy5kM1xuICAgICAgLmFyZWE8eyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9PigpXG4gICAgICAueChnZXRYKVxuICAgICAgLnkwKHRoaXMuaGVpZ2h0KVxuICAgICAgLnkxKChkKSA9PiB0aGlzLnlTY2FsZShkLnkpKTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zbW9vdGhMaW5lICE9PSBmYWxzZSkge1xuICAgICAgYXJlYUdlbmVyYXRvci5jdXJ2ZSh0aGlzLmQzLmN1cnZlTW9ub3RvbmVYKTtcbiAgICB9XG5cbiAgICB0aGlzLnN2Zy5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFuaW1hdGluZycpO1xuXG4gICAgY29uc3QgYWxsU2VyaWVzR3JvdXAgPSB0aGlzLmNoYXJ0XG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFsbC1zZXJpZXMnKVxuICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgIGNvbnN0IGFsbFBvaW50c0dyb3VwID0gdGhpcy5jaGFydFxuICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1hbGwtcG9pbnRzJylcbiAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0Nyb3NzaGFpciA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGFydC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWNyb3NzaGFpcicpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGFuaW1hdGlvbkVhc2luZyA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkVhc2luZyk7XG5cbiAgICBhbGxTZXJpZXNEYXRhLmZvckVhY2goKHNlcmllcykgPT4ge1xuICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXMpO1xuXG4gICAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VyaWVzRWxlbWVudHMoc2VyaWVzSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNlcmllc0dyb3VwID0gYWxsU2VyaWVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1saW5lLWNoYXJ0LXNlcmllcyBheC1saW5lLWNoYXJ0LXNlcmllcy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWApXG4gICAgICAgIC5hdHRyKCdkYXRhLXNlcmllcy1pZGVudGlmaWVyJywgc2VyaWVzSWRlbnRpZmllcilcbiAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgICAgY29uc3QgbGluZUNvbG9yID0gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKHNlcmllcy5vcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHNlcmllcy5maWxsQ29sb3IgfHwgbGluZUNvbG9yO1xuXG4gICAgICBjb25zdCBsaW5lID0gc2VyaWVzR3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5kYXR1bShzZXJpZXMuZGF0YSlcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtbGluZScpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBsaW5lQ29sb3IpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5saW5lV2lkdGggPz8gdGhpcy5ERUZBVUxUX0xJTkVfV0lEVEgpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKVxuICAgICAgICAuYXR0cignc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKVxuICAgICAgICAuYXR0cignZCcsIGxpbmVHZW5lcmF0b3IpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxuICAgICAgICAuYXR0cignc3R5bGUnLCAndHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDAuM3MgZWFzZTsnKVxuICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXG4gICAgICBsaW5lXG4gICAgICAgIC5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAgICAgICAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IHRoaXMuREVGQVVMVF9MSU5FX1dJRFRIKSAqIHRoaXMuTElORV9ISUdITElHSFRfTVVMVElQTElFUixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmxpbmVXaWR0aCA/PyB0aGlzLkRFRkFVTFRfTElORV9XSURUSCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxpbmUubm9kZSgpLmdldFRvdGFsTGVuZ3RoKCk7XG4gICAgICBsaW5lXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaGFycmF5JywgdG90YWxMZW5ndGggKyAnICcgKyB0b3RhbExlbmd0aClcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNob2Zmc2V0JywgdG90YWxMZW5ndGgpXG4gICAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAuZWFzZShhbmltYXRpb25FYXNpbmcpXG4gICAgICAgIC5hdHRyKCdzdHJva2UtZGFzaG9mZnNldCcsIDApXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGxpbmUuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuZmlsbEFyZWEpIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IHNlcmllc0dyb3VwXG4gICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgLmRhdHVtKHNlcmllcy5kYXRhKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWFyZWEnKVxuICAgICAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAuYXR0cignZCcsIGFyZWFHZW5lcmF0b3IpXG4gICAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ3RyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlOycpXG4gICAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgICAgICBhcmVhXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgYXJlYVxuICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAgICAgICAgIC5hdHRyKCdvcGFjaXR5JywgKCh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApICogMS41KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgICAgICAgICAuYXR0cignb3BhY2l0eScsICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGFyZWFcbiAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgICAgICAuYXR0cignb3BhY2l0eScsICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5maWxsT3BhY2l0eSA/PyAyMCkgLyAxMDApXG4gICAgICAgICAgLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhcmVhLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dQb2ludHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBwb2ludE1hcCA9IG5ldyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgQXJyYXk8e1xuICAgICAgICAgIHBvaW50OiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH07XG4gICAgICAgICAgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9O1xuICAgICAgICAgIG9yaWdpbmFsSW5kZXg6IG51bWJlcjtcbiAgICAgICAgfT5cbiAgICAgID4oKTtcblxuICAgICAgYWxsU2VyaWVzRGF0YS5mb3JFYWNoKChzZXJpZXMpID0+IHtcbiAgICAgICAgY29uc3Qgc2VyaWVzSWRlbnRpZmllciA9IHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzZXJpZXMpO1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5TZXJpZXMuaGFzKHNlcmllc0lkZW50aWZpZXIpIHx8ICFzZXJpZXMuZGF0YSB8fCBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2ludERhdGEgPSB0aGlzLmdldFJlZHVjZWREYXRhUG9pbnRzKHNlcmllcy5kYXRhLCB0aGlzLk1BWF9QT0lOVFNfVE9fUkVOREVSKTtcblxuICAgICAgICBwb2ludERhdGEuZm9yRWFjaCgocG9pbnQpID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gZ2V0WChwb2ludCk7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMueVNjYWxlKHBvaW50LnkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY3JlYXRlUG9pbnRLZXkoeCwgeSk7XG5cbiAgICAgICAgICBpZiAoIXBvaW50TWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBwb2ludE1hcC5zZXQoa2V5LCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50TWFwLmdldChrZXkpPy5wdXNoKHsgcG9pbnQsIHNlcmllcywgb3JpZ2luYWxJbmRleDogc2VyaWVzLm9yaWdpbmFsSW5kZXggfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBhbmltYXRpb25Db3VudGVyID0gMDtcbiAgICAgIGNvbnN0IHRvdGFsVmlzaWJsZVNlcmllc0NvdW50ID0gYWxsU2VyaWVzRGF0YS5maWx0ZXIoXG4gICAgICAgIChzKSA9PiAhdGhpcy5oaWRkZW5TZXJpZXMuaGFzKHRoaXMuZ2V0U2VyaWVzSWRlbnRpZmllcihzKSkgJiYgcy5kYXRhICYmIHMuZGF0YS5sZW5ndGggPiAwLFxuICAgICAgKS5sZW5ndGg7XG5cbiAgICAgIGFsbFNlcmllc0RhdGEuZm9yRWFjaCgoc2VyaWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcmllc0lkZW50aWZpZXIgPSB0aGlzLmdldFNlcmllc0lkZW50aWZpZXIoc2VyaWVzKTtcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuU2VyaWVzLmhhcyhzZXJpZXNJZGVudGlmaWVyKSB8fCAhc2VyaWVzLmRhdGEgfHwgc2VyaWVzLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZUNvbG9yID0gc2VyaWVzLmxpbmVDb2xvciB8fCBnZXRDaGFydENvbG9yKHNlcmllcy5vcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcbiAgICAgICAgY29uc3QgcG9pbnRzR3JvdXAgPSBhbGxQb2ludHNHcm91cFxuICAgICAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGBheC1saW5lLWNoYXJ0LXBvaW50cyBheC1saW5lLWNoYXJ0LXBvaW50cy0ke3Nlcmllcy5vcmlnaW5hbEluZGV4fWApXG4gICAgICAgICAgLmF0dHIoJ2RhdGEtc2VyaWVzLWlkZW50aWZpZXInLCBzZXJpZXNJZGVudGlmaWVyKVxuICAgICAgICAgIC5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cbiAgICAgICAgcG9pbnRzR3JvdXBcbiAgICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLmhhbmRsZVBvaW50R3JvdXBFbnRlcihzZXJpZXMub3JpZ2luYWxJbmRleCkpXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4gdGhpcy5oYW5kbGVQb2ludEdyb3VwTGVhdmUoKSk7XG5cbiAgICAgICAgY29uc3QgcG9pbnREYXRhID0gdGhpcy5nZXRSZWR1Y2VkRGF0YVBvaW50cyhzZXJpZXMuZGF0YSwgdGhpcy5NQVhfUE9JTlRTX1RPX1JFTkRFUik7XG5cbiAgICAgICAgcG9pbnRzR3JvdXBcbiAgICAgICAgICAuc2VsZWN0QWxsKCdjaXJjbGUnKVxuICAgICAgICAgIC5kYXRhKHBvaW50RGF0YSlcbiAgICAgICAgICAuZW50ZXIoKVxuICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtcG9pbnQnKVxuICAgICAgICAgIC5hdHRyKCdjeCcsIGdldFgpXG4gICAgICAgICAgLmF0dHIoJ2N5JywgKGQpID0+IHRoaXMueVNjYWxlKGQueSkpXG4gICAgICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgICAgIC5hdHRyKCdmaWxsJywgbGluZUNvbG9yKVxuICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnI2ZmZicpXG4gICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteCcsIChkKSA9PiBkLngpXG4gICAgICAgICAgLmF0dHIoJ2RhdGEteScsIChkKSA9PiBkLnkpXG4gICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpXG4gICAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKVxuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudDogTW91c2VFdmVudCwgZDogeyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4ID0gZ2V0WChkKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnlTY2FsZShkLnkpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jcmVhdGVQb2ludEtleSh4LCB5KTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nUG9pbnRzID0gcG9pbnRNYXAuZ2V0KGtleSkgfHwgW107XG5cbiAgICAgICAgICAgIGlmIChvdmVybGFwcGluZ1BvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlT3ZlcmxhcHBpbmdQb2ludHNIb3ZlcihldmVudCwgb3ZlcmxhcHBpbmdQb2ludHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQb2ludEhvdmVyKGV2ZW50LCBkLCBzZXJpZXMsIHNlcmllcy5vcmlnaW5hbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcG9pbnRSYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5wb2ludFJhZGl1cyA/PyB0aGlzLkRFRkFVTFRfUE9JTlRfUkFESVVTO1xuICAgICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgICAuc2VsZWN0KGV2ZW50LnRhcmdldCBhcyBTVkdDaXJjbGVFbGVtZW50KVxuICAgICAgICAgICAgICAuaW50ZXJydXB0KClcbiAgICAgICAgICAgICAgLmF0dHIoJ3InLCBwb2ludFJhZGl1cyAqIHRoaXMuUE9JTlRfSElHSExJR0hUX01VTFRJUExJRVIpXG4gICAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aGlzLlBPSU5UX0hPVkVSX1NUUk9LRV9XSURUSClcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZScsIGByZ2IodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWJnLWNvbG9yKSlgKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2Vtb3ZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCkpXG4gICAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRSYWRpdXMgPSB0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5wb2ludFJhZGl1cyA/PyB0aGlzLkRFRkFVTFRfUE9JTlRfUkFESVVTO1xuICAgICAgICAgICAgdGhpcy5kM1xuICAgICAgICAgICAgICAuc2VsZWN0KGV2ZW50LnRhcmdldCBhcyBTVkdDaXJjbGVFbGVtZW50KVxuICAgICAgICAgICAgICAuaW50ZXJydXB0KClcbiAgICAgICAgICAgICAgLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRoaXMuUE9JTlRfU1RST0tFX1dJRFRIKVxuICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyNmZmYnKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignY2xpY2snLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeCA9IGdldFgoZCk7XG4gICAgICAgICAgICBjb25zdCB5ID0gdGhpcy55U2NhbGUoZC55KTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY3JlYXRlUG9pbnRLZXkoeCwgeSk7XG4gICAgICAgICAgICBjb25zdCBvdmVybGFwcGluZ1BvaW50cyA9IHBvaW50TWFwLmdldChrZXkpIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAob3ZlcmxhcHBpbmdQb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBvdmVybGFwcGluZ1BvaW50cy5mb3JFYWNoKCh7IHBvaW50LCBzZXJpZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUG9pbnRDbGljayhldmVudCwgcG9pbnQsIHNlcmllcyk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQb2ludENsaWNrKGV2ZW50LCBkLCBzZXJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kZWxheShcbiAgICAgICAgICAgIChfZDogeyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9LCBpOiBudW1iZXIpID0+XG4gICAgICAgICAgICAgIGkgKiBNYXRoLm1pbih0aGlzLlBPSU5UX0FOSU1BVElPTl9ERUxBWV9NUywgKGFuaW1hdGlvbkR1cmF0aW9uIHx8IDApICogMC4wNSkgK1xuICAgICAgICAgICAgICAoYW5pbWF0aW9uRHVyYXRpb24gfHwgMCkgKiB0aGlzLlBPSU5UX0FOSU1BVElPTl9ERUxBWV9SQVRJTyxcbiAgICAgICAgICApXG4gICAgICAgICAgLmR1cmF0aW9uKChhbmltYXRpb25EdXJhdGlvbiB8fCAwKSAqIHRoaXMuUE9JTlRfQU5JTUFUSU9OX0RVUkFUSU9OX1JBVElPKVxuICAgICAgICAgIC5lYXNlKGFuaW1hdGlvbkVhc2luZylcbiAgICAgICAgICAuYXR0cigncicsIHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnBvaW50UmFkaXVzID8/IHRoaXMuREVGQVVMVF9QT0lOVF9SQURJVVMpXG4gICAgICAgICAgLm9uKCdlbmQnLCAoZCwgaSwgbm9kZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChpID09PSBub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbkNvdW50ZXIrKztcbiAgICAgICAgICAgICAgaWYgKGFuaW1hdGlvbkNvdW50ZXIgPj0gdG90YWxWaXNpYmxlU2VyaWVzQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVBvaW50ZXJFdmVudHNBZnRlckFuaW1hdGlvbigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmVuYWJsZVBvaW50ZXJFdmVudHNBZnRlckFuaW1hdGlvbigpLCAoYW5pbWF0aW9uRHVyYXRpb24gfHwgMCkgKyB0aGlzLkFOSU1BVElPTl9FTkRfQlVGRkVSKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBvaW50ZXJFdmVudHNBZnRlckFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hhcnQgfHwgIXRoaXMuc3ZnKSByZXR1cm47XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWFsbC1zZXJpZXMnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtc2VyaWVzJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LWxpbmUnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTtcbiAgICB0aGlzLmNoYXJ0LnNlbGVjdEFsbCgnLmF4LWxpbmUtY2hhcnQtYXJlYScpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1hbGwtcG9pbnRzJykuYXR0cigncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5jaGFydC5zZWxlY3RBbGwoJy5heC1saW5lLWNoYXJ0LXBvaW50cycpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuY2hhcnQuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1wb2ludCcpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpO1xuICAgIHRoaXMuc3ZnLmNsYXNzZWQoJ2F4LWxpbmUtY2hhcnQtYW5pbWF0aW5nJywgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQb2ludEdyb3VwRW50ZXIob3JpZ2luYWxJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydFxuICAgICAgLnNlbGVjdChgLmF4LWxpbmUtY2hhcnQtc2VyaWVzLSR7b3JpZ2luYWxJbmRleH0gLmF4LWxpbmUtY2hhcnQtbGluZWApXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24odGhpcy5IT1ZFUl9UUkFOU0lUSU9OX0RVUkFUSU9OKVxuICAgICAgLmF0dHIoXG4gICAgICAgICdzdHJva2Utd2lkdGgnLFxuICAgICAgICAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IHRoaXMuREVGQVVMVF9MSU5FX1dJRFRIKSAqIHRoaXMuTElORV9ISUdITElHSFRfTVVMVElQTElFUixcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBvaW50R3JvdXBMZWF2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0XG4gICAgICAuc2VsZWN0QWxsKCcuYXgtbGluZS1jaGFydC1saW5lJylcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5kdXJhdGlvbih0aGlzLkhPVkVSX1RSQU5TSVRJT05fRFVSQVRJT04pXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkubGluZVdpZHRoID8/IHRoaXMuREVGQVVMVF9MSU5FX1dJRFRIKTtcblxuICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93Q3Jvc3NoYWlyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoYXJ0LnNlbGVjdCgnLmF4LWxpbmUtY2hhcnQtY3Jvc3NoYWlyJykuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWR1Y2VkRGF0YVBvaW50cyhcbiAgICBkYXRhOiBBcnJheTx7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0+LFxuICAgIG1heFBvaW50czogbnVtYmVyLFxuICApOiBBcnJheTx7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gbWF4UG9pbnRzKSByZXR1cm4gZGF0YTtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHsgeDogbnVtYmVyIHwgc3RyaW5nOyB5OiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKGRhdGEubGVuZ3RoIC8gbWF4UG9pbnRzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IHN0ZXApIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGFbaV0pO1xuICAgIH1cbiAgICBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSAhPT0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhW2RhdGEubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQb2ludEhvdmVyKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIGRhdGFQb2ludDogQVhMaW5lQ2hhcnREYXRhWydkYXRhJ11bbnVtYmVyXSxcbiAgICBzZXJpZXM6IEFYTGluZUNoYXJ0RGF0YSAmIHsgb3JpZ2luYWxJbmRleDogbnVtYmVyIH0sXG4gICAgb3JpZ2luYWxJbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXAgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBjb2xvciA9IHNlcmllcy5saW5lQ29sb3IgfHwgZ2V0Q2hhcnRDb2xvcihvcmlnaW5hbEluZGV4LCB0aGlzLmNoYXJ0Q29sb3JzKTtcblxuICAgICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgICAgdGl0bGU6IGRhdGFQb2ludC50b29sdGlwTGFiZWwgfHwgc2VyaWVzLnRvb2x0aXBMYWJlbCB8fCBzZXJpZXMubGFiZWwgfHwgYFNlcmllcyAke29yaWdpbmFsSW5kZXggKyAxfWAsXG4gICAgICAgIHZhbHVlOiBmb3JtYXRMYXJnZU51bWJlcihkYXRhUG9pbnQueSksXG4gICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG5cbiAgICAgIGlmICh0aGlzLmVmZmVjdGl2ZU9wdGlvbnMoKS5zaG93Q3Jvc3NoYWlyID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuc2hvd0Nyb3NzaGFpckxpbmVzKGRhdGFQb2ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q3Jvc3NoYWlyTGluZXMoZGF0YVBvaW50OiB7IHg6IG51bWJlciB8IHN0cmluZzsgeTogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICBjb25zdCB4ID0gdGhpcy5nZXRYUG9zaXRpb24oZGF0YVBvaW50KTtcbiAgICBjb25zdCB5ID0gdGhpcy55U2NhbGUoZGF0YVBvaW50LnkpO1xuXG4gICAgbGV0IGNyb3NzaGFpckdyb3VwID0gdGhpcy5jaGFydC5zZWxlY3QoJy5heC1saW5lLWNoYXJ0LWNyb3NzaGFpcicpO1xuICAgIGlmIChjcm9zc2hhaXJHcm91cC5lbXB0eSgpKSB7XG4gICAgICBjcm9zc2hhaXJHcm91cCA9IHRoaXMuY2hhcnQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1jcm9zc2hhaXInKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG4gICAgfVxuXG4gICAgY3Jvc3NoYWlyR3JvdXAuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG5cbiAgICBjcm9zc2hhaXJHcm91cFxuICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1jcm9zc2hhaXItdmVydGljYWwnKVxuICAgICAgLmF0dHIoJ3gxJywgeClcbiAgICAgIC5hdHRyKCd5MScsIDApXG4gICAgICAuYXR0cigneDInLCB4KVxuICAgICAgLmF0dHIoJ3kyJywgdGhpcy5oZWlnaHQpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjUpJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMywzJylcbiAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC43KVxuICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblxuICAgIGNyb3NzaGFpckdyb3VwXG4gICAgICAuYXBwZW5kKCdsaW5lJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LWNyb3NzaGFpci1ob3Jpem9udGFsJylcbiAgICAgIC5hdHRyKCd4MScsIDApXG4gICAgICAuYXR0cigneTEnLCB5KVxuICAgICAgLmF0dHIoJ3gyJywgdGhpcy53aWR0aClcbiAgICAgIC5hdHRyKCd5MicsIHkpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1saW5lLWNoYXJ0LWdyaWQtbGluZXMtY29sb3IpLCAwLjUpJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxKVxuICAgICAgLmF0dHIoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMywzJylcbiAgICAgIC5hdHRyKCdvcGFjaXR5JywgMC43KVxuICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnNjaGVkdWxlVG9vbHRpcFBvc2l0aW9uKDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVRvb2x0aXBQb3NpdGlvbihhdHRlbXB0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl90b29sdGlwUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHM7XG4gICAgICBpZiAoIWNvb3Jkcykge1xuICAgICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lckVsKSB7XG4gICAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoIXRvb2x0aXBFbCAmJiB0aGlzLl90b29sdGlwVmlzaWJsZSgpICYmIGF0dGVtcHQgPCAzKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVUb29sdGlwUG9zaXRpb24oYXR0ZW1wdCArIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbCA/IHRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gICAgICBjb25zdCBwb3MgPSBjb21wdXRlVG9vbHRpcFBvc2l0aW9uKHJlY3QsIHRvb2x0aXBSZWN0LCBjb29yZHMueCwgY29vcmRzLnksIHRoaXMuVE9PTFRJUF9HQVApO1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgaWYgKHByZXYueCAhPT0gcG9zLnggfHwgcHJldi55ICE9PSBwb3MueSkge1xuICAgICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb21wdXRlVG9vbHRpcFBvc2l0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRDbGljayhcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBkYXRhUG9pbnQ6IEFYTGluZUNoYXJ0RGF0YVsnZGF0YSddW251bWJlcl0sXG4gICAgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnBvaW50Q2xpY2suZW1pdCh7XG4gICAgICBzZXJpZXM6IHNlcmllcywgLy8gc2VyaWVzIHN0aWxsIHJlZmVycyB0byB0aGUgZnVsbCBzZXJpZXMgZGF0YSB3aXRoIG9yaWdpbmFsSW5kZXhcbiAgICAgIHBvaW50OiBkYXRhUG9pbnQsXG4gICAgICBldmVudDoge1xuICAgICAgICBuYXRpdmVFdmVudDogZXZlbnQsXG4gICAgICAgIHNlbmRlcjogdGhpcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dOb0RhdGFNZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIG9ubHkgY2hhcnQgU1ZHIGFuZCBwcmV2aW91cyBlbXB0eS1zdGF0ZSBtZXNzYWdlcyB0byBhdm9pZCByZW1vdmluZyB0b29sdGlwXG4gICAgdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UsIC5heC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tbWVzc2FnZScpXG4gICAgICAucmVtb3ZlKCk7XG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UnKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAuc3R5bGUoJ2xlZnQnLCAnNTAlJylcbiAgICAgIC5zdHlsZSgndG9wJywgJzUwJScpXG4gICAgICAuc3R5bGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1uby1kYXRhLWljb24nKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNicpXG4gICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnMC43NXJlbScpXG4gICAgICAuaHRtbChgPGkgY2xhc3M9XCIke3RoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGFJY29ufSBmYS0yeFwiPjwvaT5gKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1uby1kYXRhLXRleHQnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMXJlbScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXG4gICAgICAuc3R5bGUoJ21hcmdpbi1ib3R0b20nLCAnMC41cmVtJylcbiAgICAgIC50ZXh0KHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKS5ub0RhdGEpO1xuXG4gICAgbWVzc2FnZUNvbnRhaW5lclxuICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdheC1saW5lLWNoYXJ0LW5vLWRhdGEtaGVscCcpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcwLjhyZW0nKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNicpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkubm9EYXRhSGVscCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dBbGxTZXJpZXNIaWRkZW5NZXNzYWdlKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIG9ubHkgY2hhcnQgU1ZHIGFuZCBwcmV2aW91cyBlbXB0eS1zdGF0ZSBtZXNzYWdlcyB0byBhdm9pZCByZW1vdmluZyB0b29sdGlwXG4gICAgdGhpcy5kM1xuICAgICAgLnNlbGVjdChjb250YWluZXJFbGVtZW50KVxuICAgICAgLnNlbGVjdEFsbCgnc3ZnLCAuYXgtbGluZS1jaGFydC1uby1kYXRhLW1lc3NhZ2UsIC5heC1saW5lLWNoYXJ0LWFsbC1oaWRkZW4tbWVzc2FnZScpXG4gICAgICAucmVtb3ZlKCk7XG4gICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZDNcbiAgICAgIC5zZWxlY3QoY29udGFpbmVyRWxlbWVudClcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLW1lc3NhZ2UnKSAvLyBEaWZmZXJlbnQgY2xhc3NcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdsZWZ0JywgJzUwJScpXG4gICAgICAuc3R5bGUoJ3RvcCcsICc1MCUnKVxuICAgICAgLnN0eWxlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC01MCUsIC01MCUpJyk7XG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi1pY29uJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNzVyZW0nKVxuICAgICAgLmh0bWwoYDxpIGNsYXNzPVwiJHt0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuSWNvbn0gZmEtMnhcIj48L2k+YCk7IC8vIERpZmZlcmVudCBpY29uXG5cbiAgICBtZXNzYWdlQ29udGFpbmVyXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4LWxpbmUtY2hhcnQtYWxsLWhpZGRlbi10ZXh0JylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzFyZW0nKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdtYXJnaW4tYm90dG9tJywgJzAuNXJlbScpXG4gICAgICAudGV4dCh0aGlzLmVmZmVjdGl2ZU1lc3NhZ2VzKCkuYWxsSGlkZGVuKTtcblxuICAgIG1lc3NhZ2VDb250YWluZXJcbiAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXgtbGluZS1jaGFydC1hbGwtaGlkZGVuLWhlbHAnKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMC44cmVtJylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjYnKVxuICAgICAgLnRleHQodGhpcy5lZmZlY3RpdmVNZXNzYWdlcygpLmFsbEhpZGRlbkhlbHApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVPdmVybGFwcGluZ1BvaW50c0hvdmVyKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG92ZXJsYXBwaW5nUG9pbnRzOiBBcnJheTx7XG4gICAgICBwb2ludDogeyB4OiBudW1iZXIgfCBzdHJpbmc7IHk6IG51bWJlciB9O1xuICAgICAgc2VyaWVzOiBBWExpbmVDaGFydERhdGEgJiB7IG9yaWdpbmFsSW5kZXg6IG51bWJlciB9O1xuICAgICAgb3JpZ2luYWxJbmRleDogbnVtYmVyO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXAgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICBjb25zdCB0b29sdGlwRGF0YTogQVhDaGFydFRvb2x0aXBEYXRhID0ge1xuICAgICAgdGl0bGU6IG92ZXJsYXBwaW5nUG9pbnRzLm1hcCgoeyBzZXJpZXMgfSkgPT4gc2VyaWVzLmxhYmVsKSxcbiAgICAgIHZhbHVlOiBmb3JtYXRMYXJnZU51bWJlcihvdmVybGFwcGluZ1BvaW50c1swXS5wb2ludC55KSxcbiAgICAgIGNvbG9yOiBvdmVybGFwcGluZ1BvaW50cy5tYXAoXG4gICAgICAgICh7IHNlcmllcyB9KSA9PiBzZXJpZXMubGluZUNvbG9yIHx8IGdldENoYXJ0Q29sb3Ioc2VyaWVzLm9yaWdpbmFsSW5kZXgsIHRoaXMuY2hhcnRDb2xvcnMpLFxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHRvb2x0aXBEYXRhKTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dDcm9zc2hhaXIgPT09IHRydWUgJiYgb3ZlcmxhcHBpbmdQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zaG93Q3Jvc3NoYWlyTGluZXMob3ZlcmxhcHBpbmdQb2ludHNbMF0ucG9pbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWxpbmUtY2hhcnRcIiAjY2hhcnRDb250YWluZXI+XG4gIDwhLS0gU2hhcmVkIHRvb2x0aXAgY29tcG9uZW50IC0tPlxuICA8YXgtY2hhcnQtdG9vbHRpcFxuICAgIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIlxuICAgIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiXG4gICAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiXG4gICAgW3Nob3dQZXJjZW50YWdlXT1cImZhbHNlXCJcbiAgPjwvYXgtY2hhcnQtdG9vbHRpcD5cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1saW5lLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2xpbmUtY2hhcnQvc3JjL2Fjb3JleC1jaGFydHMtbGluZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-line-chart.mjs","sources":["../../../../packages/charts/line-chart/src/lib/line-chart.config.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.ts","../../../../packages/charts/line-chart/src/lib/line-chart.component.html","../../../../packages/charts/line-chart/src/acorex-charts-line-chart.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXLineChartOption } from './line-chart.type';\n\nexport const AXLineChartDefaultConfig: AXLineChartOption = {\n margins: {\n top: 12,\n right: 12,\n bottom: 8,\n left: 8,\n },\n showXAxis: true,\n showYAxis: true,\n showGrid: true,\n showVerticalGrid: false,\n yAxisStartsAtZero: true,\n axisPadding: 5,\n showTooltip: true,\n lineWidth: 2,\n showPoints: true,\n pointRadius: 4,\n smoothLine: false,\n fillArea: false,\n fillOpacity: 20,\n showCrosshair: false,\n animationDuration: 1000,\n animationEasing: 'cubic-out',\n messages: {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n },\n};\n\nexport const AX_LINE_CHART_CONFIG = new InjectionToken<AXLineChartOption>('AX_LINE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXLineChartDefaultConfig,\n});\n\nexport type PartialLineChartConfig = Partial<AXLineChartOption>;\n\nexport function lineChartConfig(config: PartialLineChartConfig = {}): AXLineChartOption {\n const result = {\n ...AXLineChartDefaultConfig,\n ...config,\n };\n return result;\n}\n","import {\n AX_CHART_COLOR_PALETTE,\n AXChartComponent,\n AXChartComponentBase,\n computeTooltipPosition,\n formatLargeNumber,\n getChartColor,\n getEasingFunction,\n} from '@acorex/charts';\nimport { AXChartLegendCompatible, AXChartLegendItem } from '@acorex/charts/chart-legend';\nimport { AXChartTooltipComponent, AXChartTooltipData } from '@acorex/charts/chart-tooltip';\n\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport type * as d3 from 'd3';\nimport { AX_LINE_CHART_CONFIG } from './line-chart.config';\nimport { AXLineChartData, AXLineChartOption, AXLineChartPointClickEvent, AXLineChartValue } from './line-chart.type';\n\n/**\n * Line Chart Component for rendering data as lines with interactive hover effects and animations\n */\n@Component({\n selector: 'ax-line-chart',\n templateUrl: './line-chart.component.html',\n styleUrls: ['./line-chart.component.css'],\n encapsulation: ViewEncapsulation.None,\n imports: [AXChartTooltipComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXLineChartComponent\n extends AXChartComponent\n implements OnInit, AfterViewInit, OnDestroy, AXChartLegendCompatible, AXChartComponentBase\n{\n data = input<AXLineChartValue>([]);\n options = input<AXLineChartOption>({});\n pointClick = output<AXLineChartPointClickEvent>();\n\n private readonly chartContainerEl = viewChild.required<ElementRef<HTMLDivElement>>('chartContainer');\n protected d3!: typeof import('d3');\n\n private svg!: d3.Selection<SVGSVGElement, unknown, null, undefined>;\n private chart!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private xScale!: d3.ScaleLinear<number, number> | d3.ScalePoint<string>;\n private xScaleKind: 'linear' | 'point' = 'linear';\n private yScale!: d3.ScaleLinear<number, number>;\n private xAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n private yAxis!: d3.Selection<SVGGElement, unknown, null, undefined>;\n\n private width!: number;\n private height!: number;\n private margin = { top: 20, right: 25, bottom: 40, left: 50 };\n\n private _tooltipVisible = signal(false);\n private _tooltipPosition = signal({ x: 0, y: 0 });\n private _tooltipData = signal<AXChartTooltipData>({\n title: '',\n value: '0',\n percentage: '0%',\n color: '',\n });\n private _tooltipRafId: number | null = null;\n private _pendingTooltipCoords: { x: number; y: number } | null = null;\n\n private _initialized = signal(false);\n private _rendered = signal(false);\n private hiddenSeries = new Set<string>();\n private _fullNormalizedData: (AXLineChartData & { originalIndex: number })[] = [];\n\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_LINE_CHART_CONFIG);\n\n // Inject the chart colors\n private chartColors = inject(AX_CHART_COLOR_PALETTE);\n\n protected effectiveOptions = computed(() => {\n return {\n ...this.configToken,\n ...this.options(),\n };\n });\n\n // Messages with defaults\n protected effectiveMessages = computed(() => {\n const defaultMessages = {\n noData: 'No data available',\n noDataHelp: 'Please provide data to display the chart',\n allHidden: 'All series are hidden',\n allHiddenHelp: 'Click legend items to show series in the chart',\n noDataIcon: 'fa-light fa-chart-line',\n allHiddenIcon: 'fa-light fa-eye-slash',\n };\n return {\n ...defaultMessages,\n ...this.effectiveOptions().messages,\n };\n });\n\n // Layout & Dimensions\n private readonly MIN_DIMENSION = 100;\n private readonly DEFAULT_MARGIN_TOP = 12;\n private readonly DEFAULT_MARGIN_RIGHT = 12;\n private readonly DEFAULT_MARGIN_BOTTOM = 8;\n private readonly DEFAULT_MARGIN_LEFT = 8;\n private readonly MIN_MARGIN_BOTTOM = 28;\n private readonly MIN_MARGIN_LEFT = 36;\n private readonly X_AXIS_TITLE_GAP = 10;\n private readonly TICK_AREA_PADDING = 4;\n private readonly AXIS_TICK_PADDING = 6;\n private readonly ROTATION_TOLERANCE = 0.92;\n private readonly FORCE_ROTATE_LABEL_LENGTH = 14;\n private readonly Y_AXIS_TITLE_PADDING = 10;\n\n // Styling & Visual\n private readonly DEFAULT_LINE_WIDTH = 2;\n private readonly DEFAULT_POINT_RADIUS = 4;\n private readonly DEFAULT_FILL_OPACITY = 20;\n private readonly LINE_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_HIGHLIGHT_MULTIPLIER = 1.5;\n private readonly POINT_STROKE_WIDTH = 1;\n private readonly POINT_HOVER_STROKE_WIDTH = 2;\n private readonly GRID_DASH_ARRAY = '2,2';\n private readonly CROSSHAIR_DASH_ARRAY = '3,3';\n private readonly CROSSHAIR_OPACITY = 0.7;\n\n // Animation\n private readonly HOVER_TRANSITION_DURATION = 150;\n private readonly ANIMATION_END_BUFFER = 100;\n private readonly POINT_ANIMATION_DELAY_MS = 50;\n private readonly POINT_ANIMATION_DELAY_RATIO = 0.5;\n private readonly POINT_ANIMATION_DURATION_RATIO = 0.3;\n\n // Text & Labels\n private readonly CHAR_WIDTH_RATIO = 0.6;\n private readonly FONT_WIDTH_MULTIPLIER = 0.6;\n private readonly MAX_LABEL_LENGTH = 20;\n private readonly MIN_FONT_SIZE_X = 10;\n private readonly MAX_FONT_SIZE_X = 16;\n private readonly MIN_FONT_SIZE_Y = 11;\n private readonly MAX_FONT_SIZE_Y = 16;\n private readonly FONT_PADDING = 6;\n\n private readonly xAxisLabelLayout = {\n fontSize: 12,\n willRotate: false,\n tickAreaHeight: 24,\n displayedTickCount: 1,\n };\n\n /**\n * Resolves X-axis tick font size, rotation, and reserved tick area height.\n */\n private resolveXAxisLabelLayout(\n chartWidth: number,\n categoricalLabels: string[] | null,\n ): { fontSize: number; willRotate: boolean; tickAreaHeight: number; displayedTickCount: number } {\n if (!categoricalLabels || categoricalLabels.length === 0) {\n const displayedTickCount = Math.min(12, Math.max(5, Math.floor(chartWidth / 80)));\n const fontSize = this.getXAxisTickFontSize(chartWidth, displayedTickCount);\n const tickAreaHeight = fontSize + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n\n return { fontSize, willRotate: false, tickAreaHeight, displayedTickCount };\n }\n\n const itemCount = categoricalLabels.length;\n const longestLabel = categoricalLabels.reduce((a, b) => (a.length > b.length ? a : b), '');\n const effectiveLength = this.getEffectiveXLabelLength(longestLabel, itemCount);\n const step = itemCount > 1 ? chartWidth / (itemCount - 1) : chartWidth;\n\n let fontSize = this.getXAxisTickFontSize(chartWidth, itemCount);\n let effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n\n while (effectiveWidth > step * this.ROTATION_TOLERANCE && fontSize > this.MIN_FONT_SIZE_X) {\n fontSize--;\n effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n }\n\n const willRotate =\n longestLabel.length >= this.FORCE_ROTATE_LABEL_LENGTH ||\n effectiveWidth > step * this.ROTATION_TOLERANCE;\n\n if (willRotate && effectiveWidth > step) {\n while (effectiveWidth > step * 1.35 && fontSize > this.MIN_FONT_SIZE_X) {\n fontSize--;\n effectiveWidth = effectiveLength * fontSize * this.CHAR_WIDTH_RATIO;\n }\n }\n\n const tickAreaHeight = this.estimateXAxisTickAreaHeight(fontSize, effectiveWidth, willRotate);\n let displayedTickCount = itemCount;\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n displayedTickCount = Math.ceil(itemCount / 5);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n displayedTickCount = Math.ceil(itemCount / 2);\n }\n\n return { fontSize, willRotate, tickAreaHeight, displayedTickCount };\n }\n\n /**\n * Returns truncated label length used for layout calculations.\n */\n private getEffectiveXLabelLength(label: string, itemCount: number): number {\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return Math.min(label.length, maxLength);\n }\n\n /**\n * Estimates vertical space required below the X-axis for tick labels.\n */\n private estimateXAxisTickAreaHeight(\n fontSize: number,\n effectiveLabelWidth: number,\n willRotate: boolean,\n ): number {\n if (willRotate) {\n return effectiveLabelWidth * Math.SQRT1_2 + fontSize * Math.SQRT1_2 + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n }\n\n return fontSize + this.TICK_AREA_PADDING + this.AXIS_TICK_PADDING;\n }\n\n /**\n * Measures rendered X-axis tick label area using the axis group bounding box.\n */\n private measureXAxisTickAreaHeight(\n axisGroup: SVGGElement | null | undefined,\n fontSize: number,\n fallbackHeight: number,\n ): number {\n if (!axisGroup) {\n return fallbackHeight;\n }\n\n try {\n const bbox = axisGroup.getBBox();\n const measured = Math.max(0, bbox.y + bbox.height) + this.TICK_AREA_PADDING;\n return Math.max(measured, fallbackHeight);\n } catch {\n return fallbackHeight;\n }\n }\n\n /**\n * Measures rendered Y-axis tick label width using SVG bounding boxes.\n */\n private measureMaxYAxisTickLabelWidth(tickNodes: SVGTextElement[], fontSize: number): number {\n try {\n if (tickNodes.length > 0) {\n return Math.max(...tickNodes.map((node) => node.getBBox().width)) + this.FONT_PADDING;\n }\n } catch {\n // Fall through to estimation\n }\n\n return this.calculateMaxYAxisTickLabelWidth(fontSize);\n }\n\n /**\n * Calculates required bottom margin for X-axis ticks, optional rotation, and title.\n */\n private calculateRequiredBottomMargin(\n options: AXLineChartOption,\n chartWidth: number,\n categoricalLabels: string[] | null,\n ): number {\n const baseBottom = options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM;\n\n if (options.showXAxis === false) {\n return Math.max(baseBottom, 8);\n }\n\n const layout = this.resolveXAxisLabelLayout(chartWidth, categoricalLabels);\n this.xAxisLabelLayout.fontSize = layout.fontSize;\n this.xAxisLabelLayout.willRotate = layout.willRotate;\n this.xAxisLabelLayout.tickAreaHeight = layout.tickAreaHeight;\n this.xAxisLabelLayout.displayedTickCount = layout.displayedTickCount;\n\n const titleBlock = options.xAxisLabel\n ? this.X_AXIS_TITLE_GAP + this.getAxisTitleFontSize(layout.fontSize) + 2\n : 0;\n const rotatedBuffer = layout.willRotate ? 12 : 4;\n\n return Math.max(baseBottom, this.MIN_MARGIN_BOTTOM, layout.tickAreaHeight + titleBlock + rotatedBuffer);\n }\n\n /**\n * Calculates required left margin for Y-axis ticks and title.\n */\n private calculateRequiredLeftMargin(options: AXLineChartOption, chartHeight: number): number {\n const baseLeft = options.margins?.left ?? this.DEFAULT_MARGIN_LEFT;\n\n if (options.showYAxis === false) {\n return baseLeft;\n }\n\n const fontSize = this.getYAxisTickFontSize(chartHeight);\n const tickLabelWidth = this.calculateMaxYAxisTickLabelWidth(fontSize);\n const titleBlock = options.yAxisLabel\n ? this.Y_AXIS_TITLE_PADDING + this.getAxisTitleFontSize(fontSize) + 4\n : 0;\n\n return Math.max(baseLeft, this.MIN_MARGIN_LEFT, tickLabelWidth + this.AXIS_TICK_PADDING + titleBlock + 4);\n }\n\n private createXAxisTitle(\n axesGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n title: string,\n tickAreaHeight: number,\n tickFontSize: number,\n ): void {\n const titleFontSize = this.getAxisTitleFontSize(tickFontSize);\n const titleY = Math.min(\n this.height + tickAreaHeight + this.X_AXIS_TITLE_GAP,\n this.height + this.margin.bottom - titleFontSize - 2,\n );\n\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-x-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'hanging')\n .attr('x', this.width / 2)\n .attr('y', titleY)\n .attr('direction', 'ltr')\n .attr(\n 'style',\n `\n font-size: ${titleFontSize}px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(title);\n }\n\n private createYAxisTitle(\n axesGroup: d3.Selection<SVGGElement, unknown, null, undefined>,\n title: string,\n tickFontSize: number,\n maxTickLabelWidth: number,\n ): void {\n const titleFontSize = this.getAxisTitleFontSize(tickFontSize);\n const labelY = -maxTickLabelWidth - this.Y_AXIS_TITLE_PADDING;\n const labelX = -this.height / 2;\n\n axesGroup\n .append('text')\n .attr('class', 'ax-line-chart-axis-label ax-y-axis-label')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .attr('transform', 'rotate(-90)')\n .attr('x', labelX)\n .attr('y', labelY)\n .attr('direction', 'ltr')\n .attr(\n 'style',\n `\n font-size: ${titleFontSize}px;\n font-weight: 500;\n fill: rgb(var(--ax-comp-line-chart-text-color));\n pointer-events: none;\n `,\n )\n .text(title);\n }\n\n // Data & Performance\n private readonly MAX_POINTS_TO_RENDER = 100;\n private readonly POINT_COORDINATE_PRECISION = 10;\n private readonly MANY_ITEMS_THRESHOLD = 20;\n private readonly VERY_MANY_ITEMS_THRESHOLD = 50;\n\n // Tooltip\n private readonly TOOLTIP_GAP = 10;\n\n /**\n * Normalizes input data to consistent array format with originalIndex\n */\n private normalizeData(rawData: AXLineChartValue): (AXLineChartData & { originalIndex: number })[] {\n if (Array.isArray(rawData)) {\n return rawData.map((s, i) => ({ ...s, originalIndex: i }));\n }\n if (rawData && 'data' in rawData) {\n return [{ ...rawData, originalIndex: 0 }];\n }\n return [];\n }\n\n /**\n * Gets unique identifier for a series\n */\n private getSeriesIdentifier(series: AXLineChartData & { originalIndex: number }): string {\n return series.id || series.label || `series-${series.originalIndex}`;\n }\n\n /**\n * Calculates adaptive X-axis tick font size based on chart width and label count.\n */\n private getXAxisTickFontSize(chartWidth: number, itemCount = 1): number {\n let size = chartWidth / 42;\n\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n size *= 0.65;\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n size *= 0.8;\n }\n\n return Math.max(this.MIN_FONT_SIZE_X, Math.min(this.MAX_FONT_SIZE_X, Math.round(size)));\n }\n\n /**\n * Calculates adaptive Y-axis tick font size based on chart height.\n */\n private getYAxisTickFontSize(chartHeight: number): number {\n const size = chartHeight / 28;\n return Math.max(this.MIN_FONT_SIZE_Y, Math.min(this.MAX_FONT_SIZE_Y, Math.round(size)));\n }\n\n /**\n * Calculates axis title font size relative to tick labels.\n */\n private getAxisTitleFontSize(tickFontSize: number): number {\n return Math.min(15, Math.max(12, tickFontSize));\n }\n\n /**\n * Estimates inner chart dimensions before margins are finalized.\n */\n private estimateChartDimensions(\n containerWidth: number,\n containerHeight: number,\n options: AXLineChartOption,\n ): { width: number; height: number } {\n const outerWidth = options.width ?? Math.max(containerWidth, 1);\n const outerHeight = options.height ?? Math.max(containerHeight, 1);\n\n return {\n width: Math.max(outerWidth - this.margin.left - this.margin.right, this.MIN_DIMENSION),\n height: Math.max(outerHeight - this.margin.top - this.margin.bottom, this.MIN_DIMENSION),\n };\n }\n\n /**\n * Creates a unique key for point coordinates (for overlap detection)\n */\n private createPointKey(x: number, y: number): string {\n const precision = this.POINT_COORDINATE_PRECISION;\n return `${Math.round(x * precision) / precision},${Math.round(y * precision) / precision}`;\n }\n\n /**\n * Removes series elements from the chart\n */\n private removeSeriesElements(seriesIdentifier: string): void {\n this.chart.selectAll(`.ax-line-chart-series[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n this.chart.selectAll(`.ax-line-chart-points[data-series-identifier=\"${seriesIdentifier}\"]`).remove();\n }\n\n /**\n * Truncates long labels with ellipsis\n */\n private truncateLabel(label: string, maxLength: number = this.MAX_LABEL_LENGTH): string {\n if (label.length <= maxLength) return label;\n return label.substring(0, maxLength - 1) + '…';\n }\n\n /**\n * Calculates maximum width needed for Y-axis tick labels\n */\n private calculateMaxYAxisTickLabelWidth(fontSize: number): number {\n const allSeriesData = this._fullNormalizedData.filter((s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)));\n\n let maxValue = 0;\n let minValue = 0;\n\n for (const series of allSeriesData) {\n if (series.data && series.data.length > 0) {\n for (const point of series.data) {\n if (typeof point.y === 'number') {\n maxValue = Math.max(maxValue, point.y);\n minValue = Math.min(minValue, point.y);\n }\n }\n }\n }\n\n // Check both max and min (for negative values)\n const maxAbsValue = Math.max(Math.abs(maxValue), Math.abs(minValue));\n const tickLabelText = Number.isFinite(maxAbsValue) ? formatLargeNumber(maxAbsValue) : '00000';\n\n return tickLabelText.length * fontSize * this.FONT_WIDTH_MULTIPLIER + this.FONT_PADDING;\n }\n\n ngOnInit(): void {\n this.loadD3();\n }\n\n #effect = effect(() => {\n this._fullNormalizedData = this.normalizeData(this.data());\n this.effectiveOptions();\n\n if (this._rendered()) {\n this.updateChart();\n }\n });\n\n ngAfterViewInit(): void {\n this._initialized.set(true);\n if (this.d3 && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n\n ngOnDestroy(): void {\n this.cleanupChart();\n }\n\n // AXChartLegendCompatible Implementation\n getLegendItems(): AXChartLegendItem[] {\n const totalSum = this._fullNormalizedData.reduce((sum, series) => {\n return sum + series.data.reduce((sSum, p) => sSum + p.y, 0);\n }, 0);\n\n return this._fullNormalizedData.map((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n const seriesSum = series.data.reduce((sum, p) => sum + p.y, 0);\n const percentage = totalSum > 0 ? (seriesSum / totalSum) * 100 : 0;\n return {\n id: seriesIdentifier,\n name: series.label || `Series ${series.originalIndex + 1}`,\n value: seriesSum,\n color: series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n hidden: this.hiddenSeries.has(seriesIdentifier),\n percentage: parseFloat(percentage.toFixed(2)),\n };\n });\n }\n\n highlightSegment(id: string | null): void {\n if (!this.svg) return;\n\n const allSeriesGroups = this.svg.selectAll('g.ax-line-chart-series');\n const allPointsGroups = this.svg.selectAll('g.ax-line-chart-points');\n\n if (id === null) {\n allSeriesGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n allPointsGroups.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n allSeriesGroups\n .selectAll('.ax-line-chart-line')\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .classed('ax-chart-highlighted-path', false);\n allPointsGroups\n .selectAll('circle.ax-line-chart-point')\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .classed('ax-chart-highlighted-point', false);\n return;\n }\n\n allSeriesGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n allPointsGroups.classed('ax-chart-dimmed', true).style('opacity', 0.3);\n\n const targetSeriesGroup = this.svg.selectAll(`g.ax-line-chart-series[data-series-identifier=\"${id}\"]`);\n const targetPointsGroup = this.svg.selectAll(`g.ax-line-chart-points[data-series-identifier=\"${id}\"]`);\n\n targetSeriesGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n targetPointsGroup.classed('ax-chart-dimmed', false).style('opacity', 1);\n\n targetSeriesGroup\n .selectAll('.ax-line-chart-line')\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n )\n .classed('ax-chart-highlighted-path', true);\n\n targetPointsGroup\n .selectAll('circle.ax-line-chart-point')\n .attr('r', (this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS) * this.POINT_HIGHLIGHT_MULTIPLIER)\n .classed('ax-chart-highlighted-path', true);\n }\n\n toggleSegment(id: string): boolean {\n if (this.hiddenSeries.has(id)) {\n this.hiddenSeries.delete(id);\n } else {\n this.hiddenSeries.add(id);\n }\n this.updateChart();\n return !this.hiddenSeries.has(id);\n }\n\n protected async loadD3(): Promise<void> {\n try {\n this.d3 = await import('d3');\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 public createChart(): void {\n if (!this.d3 || !this.chartContainerEl()?.nativeElement) return;\n\n const containerElement = this.chartContainerEl().nativeElement;\n const allSeriesData = this._fullNormalizedData;\n\n // Clear previous SVG and any empty-state messages (preserve tooltip component)\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n\n if (allSeriesData.length === 0 || allSeriesData.every((series) => !series.data || series.data.length === 0)) {\n this.showNoDataMessage(containerElement);\n return;\n }\n\n const visibleDataForRendering = allSeriesData.filter(\n (series) => !this.hiddenSeries.has(this.getSeriesIdentifier(series)),\n );\n\n if (visibleDataForRendering.length === 0) {\n // All data is present, but all series are hidden by the legend\n this.showAllSeriesHiddenMessage(containerElement);\n // Still setup basic SVG and chart group for consistency if needed, or return\n // For now, we will show the message and return, as scales/axes can't be drawn.\n return;\n }\n\n const chartOptions = this.effectiveOptions();\n this.setupDimensions(containerElement, chartOptions);\n\n // Use allSeriesData for domain calculation to keep scales consistent\n const dataForScaleSetup = allSeriesData.filter((s) => s.data && s.data.length > 0);\n if (dataForScaleSetup.length === 0) {\n this.showNoDataMessage(containerElement);\n return;\n }\n this.setupScales(dataForScaleSetup);\n this.createAxes(chartOptions);\n this.renderLines(allSeriesData); // RenderLines will handle hiding based on hiddenSeries\n }\n\n public updateChart(): void {\n this.createChart();\n }\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.svg) {\n this.d3\n ?.select(this.chartContainerEl()?.nativeElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n this.svg = null;\n this.chart = null;\n }\n this._tooltipVisible.set(false);\n }\n\n private setupDimensions(containerElement: HTMLElement, options: AXLineChartOption): void {\n const containerWidth = Math.max(containerElement.clientWidth, 1);\n const containerHeight = Math.max(containerElement.clientHeight, 1);\n this.calculateMargins(options, containerWidth, containerHeight);\n\n if (options.width && options.height) {\n this.width = options.width - this.margin.left - this.margin.right;\n this.height = options.height - this.margin.top - this.margin.bottom;\n } else {\n this.width = containerWidth - this.margin.left - this.margin.right;\n this.height = containerHeight - this.margin.top - this.margin.bottom;\n }\n\n this.width = Math.max(this.width, this.MIN_DIMENSION);\n this.height = Math.max(this.height, this.MIN_DIMENSION);\n\n const totalWidth = this.width + this.margin.left + this.margin.right;\n const totalHeight = this.height + this.margin.top + this.margin.bottom;\n\n const svg = this.d3\n .select(containerElement)\n .append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${totalWidth} ${totalHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n\n this.svg = svg;\n this.chart = this.svg\n .append('g')\n .attr('transform', `translate(${this.margin.left},${this.margin.top})`);\n }\n\n private calculateMargins(options: AXLineChartOption, containerWidth: number, containerHeight: number): void {\n this.margin = {\n top: options.margins?.top ?? this.DEFAULT_MARGIN_TOP,\n right: options.margins?.right ?? this.DEFAULT_MARGIN_RIGHT,\n bottom: options.margins?.bottom ?? this.DEFAULT_MARGIN_BOTTOM,\n left: options.margins?.left ?? this.DEFAULT_MARGIN_LEFT,\n };\n\n const estimatedDimensions = this.estimateChartDimensions(containerWidth, containerHeight, options);\n const allDataPoints = this._fullNormalizedData.flatMap((series) => series.data);\n const allNumericX = allDataPoints.length === 0 || allDataPoints.every((d) => typeof d.x === 'number');\n\n let categoricalLabels: string[] | null = null;\n if (!allNumericX) {\n const visibleSeries = this._fullNormalizedData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)),\n );\n categoricalLabels = [...new Set(visibleSeries.flatMap((series) => series.data.map((d) => String(d.x))))];\n }\n\n this.margin.bottom = this.calculateRequiredBottomMargin(options, estimatedDimensions.width, categoricalLabels);\n this.margin.left = this.calculateRequiredLeftMargin(options, estimatedDimensions.height);\n\n // Second pass: margins affect inner chart size, which affects label layout\n const refinedDimensions = this.estimateChartDimensions(containerWidth, containerHeight, options);\n this.margin.bottom = this.calculateRequiredBottomMargin(options, refinedDimensions.width, categoricalLabels);\n this.margin.left = this.calculateRequiredLeftMargin(options, refinedDimensions.height);\n }\n\n private setupScales(data: (AXLineChartData & { originalIndex: number })[]): void {\n // Expects already filtered data for scales\n const chartOptions = this.effectiveOptions();\n const padding = chartOptions.axisPadding ?? 0;\n const paddingMultiplier = padding / 100;\n\n // Ensure data is not empty for scale domain calculation\n const allDataPoints = data.length > 0 ? data.flatMap((series) => series.data) : [{ x: 0, y: 0 }];\n if (allDataPoints.length === 0) {\n // Should ideally not happen if createChart filters correctly\n allDataPoints.push({ x: 0, y: 0 }); // Default fallback to prevent crash with empty domain\n }\n\n const allNumericX = allDataPoints.every((d) => typeof d.x === 'number');\n\n if (allNumericX) {\n this.xScaleKind = 'linear';\n const xMin = this.d3.min(allDataPoints, (d) => d.x as number) ?? 0;\n const xMax = this.d3.max(allDataPoints, (d) => d.x as number) ?? 0;\n\n if (xMin === xMax) {\n this.xScale = this.d3\n .scaleLinear()\n .domain([xMin - 1, xMax + 1])\n .range([0, this.width]);\n } else {\n this.xScale = this.d3.scaleLinear().domain([xMin, xMax]).range([0, this.width]);\n }\n } else {\n this.xScaleKind = 'point';\n const xDomain: string[] = [];\n const seenX = new Set<string>();\n for (const point of allDataPoints) {\n const key = String(point.x);\n if (!seenX.has(key)) {\n seenX.add(key);\n xDomain.push(key);\n }\n }\n\n this.xScale = this.d3\n .scalePoint<string>()\n .domain(xDomain)\n .range([0, this.width])\n .padding(0);\n }\n\n const yAxisStartsAtZero = chartOptions.yAxisStartsAtZero !== false;\n const dataYMin = this.d3.min(allDataPoints, (d) => d.y) ?? 0;\n const dataYMax = this.d3.max(allDataPoints, (d) => d.y) ?? 0;\n\n let yMin: number;\n let yMax: number;\n\n if (yAxisStartsAtZero) {\n yMin = Math.min(0, dataYMin);\n yMax = Math.max(0, dataYMax);\n } else {\n yMin = dataYMin;\n yMax = dataYMax;\n }\n\n const yRange = yMax - yMin || 1;\n\n this.yScale = this.d3\n .scaleLinear()\n .domain([yMin, yMax + yRange * paddingMultiplier])\n .nice()\n .range([this.height, 0]);\n\n if (yAxisStartsAtZero && dataYMin >= 0) {\n this.yScale.domain([0, this.yScale.domain()[1]]);\n }\n }\n\n private createAxes(options: AXLineChartOption): void {\n const showXAxis = options.showXAxis !== false;\n const showYAxis = options.showYAxis !== false;\n const showGrid = options.showGrid !== false;\n const isPointScale = this.xScaleKind === 'point';\n const pointScale = isPointScale ? (this.xScale as d3.ScalePoint<string>) : null;\n const isRtl = document.documentElement.dir === 'rtl' || document.body.dir === 'rtl';\n const axesGroup = this.chart.append('g').attr('class', 'ax-line-chart-axes');\n\n if (showXAxis) {\n let xAxisGenerator;\n let itemCount = 0;\n\n if (isPointScale && pointScale) {\n itemCount = pointScale.domain().length;\n const pointLayout = this.resolveXAxisLabelLayout(this.width, pointScale.domain());\n this.xAxisLabelLayout.fontSize = pointLayout.fontSize;\n this.xAxisLabelLayout.willRotate = pointLayout.willRotate;\n this.xAxisLabelLayout.tickAreaHeight = pointLayout.tickAreaHeight;\n this.xAxisLabelLayout.displayedTickCount = pointLayout.displayedTickCount;\n\n // Smart tick reduction for many items (like bar chart)\n let tickValues: string[] = pointScale.domain();\n if (itemCount > this.VERY_MANY_ITEMS_THRESHOLD) {\n // Show every 5th tick for 50+ items\n tickValues = tickValues.filter((_d, i) => i % 5 === 0);\n } else if (itemCount > this.MANY_ITEMS_THRESHOLD) {\n // Show every 2nd tick for 20-50 items\n tickValues = tickValues.filter((_d, i) => i % 2 === 0);\n }\n\n xAxisGenerator = this.d3\n .axisBottom(pointScale)\n .tickValues(tickValues)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n const label = String(d);\n // Truncate long labels intelligently\n const maxLength = itemCount > this.MANY_ITEMS_THRESHOLD ? 10 : this.MAX_LABEL_LENGTH;\n return this.truncateLabel(label, maxLength);\n });\n } else {\n // Linear scale (numeric data)\n // Let D3 determine optimal tick count, but ensure we show reasonable number\n // Calculate optimal tick count based on width\n const optimalTickCount = Math.min(12, Math.max(5, Math.floor(this.width / 80)));\n\n xAxisGenerator = this.d3\n .axisBottom(this.xScale)\n .ticks(optimalTickCount)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((d: d3.AxisDomain) => {\n // Format numbers nicely\n const num = Number(d);\n if (Number.isInteger(num)) {\n return String(num);\n }\n return num.toFixed(1);\n });\n\n itemCount = optimalTickCount;\n }\n\n this.xAxis = axesGroup\n .append('g')\n .attr('class', 'ax-line-chart-axis-x')\n .attr('transform', `translate(0,${this.height})`)\n .call(xAxisGenerator);\n\n // Style the x-axis path and lines\n this.xAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.xAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicXAxisTickFontSize = isPointScale\n ? this.xAxisLabelLayout.fontSize\n : this.getXAxisTickFontSize(this.width, itemCount);\n const xAxisTicks = this.xAxis\n .selectAll('text')\n .style('font-size', `${dynamicXAxisTickFontSize}px`)\n .style('font-weight', '400')\n .style('fill', 'rgba(var(--ax-comp-line-chart-labels-color), 0.7)')\n .attr('direction', 'ltr');\n\n if (isPointScale && pointScale && pointScale.domain().length > 0) {\n if (this.xAxisLabelLayout.willRotate) {\n xAxisTicks\n .attr('transform', 'rotate(-45)')\n .style('text-anchor', 'end')\n .attr('dx', '-0.8em')\n .attr('dy', '0.15em');\n }\n }\n\n const xTickAreaHeight = this.measureXAxisTickAreaHeight(\n this.xAxis.node(),\n dynamicXAxisTickFontSize,\n this.xAxisLabelLayout.tickAreaHeight,\n );\n\n if (options.xAxisLabel) {\n this.createXAxisTitle(axesGroup, options.xAxisLabel, xTickAreaHeight, dynamicXAxisTickFontSize);\n }\n }\n\n if (showYAxis) {\n // Create Y axis with smart number formatting\n const yAxisGenerator = this.d3\n .axisLeft(this.yScale)\n .tickSize(5)\n .tickPadding(8)\n .tickFormat((value: number | { valueOf(): number }) => {\n const numValue = typeof value === 'number' ? value : value.valueOf();\n return formatLargeNumber(numValue);\n });\n\n // Reduce tick count for better readability with large numbers\n const maxValue = this.yScale.domain()[1];\n if (maxValue > 1e6) {\n yAxisGenerator.ticks(6); // Fewer ticks for millions+\n } else if (maxValue > 1e3) {\n yAxisGenerator.ticks(8);\n }\n\n this.yAxis = axesGroup.append('g').attr('class', 'ax-line-chart-axis-y').call(yAxisGenerator);\n\n // Style the y-axis path and lines\n this.yAxis.selectAll('path').attr('stroke', 'rgba(var(--ax-comp-line-chart-axis-color), 0.2)');\n\n this.yAxis\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n const dynamicYAxisTickFontSize = this.getYAxisTickFontSize(this.height);\n const yTickTexts = this.yAxis.selectAll('text').attr(\n 'style',\n `\n font-size: ${dynamicYAxisTickFontSize}px;\n font-weight: 400;\n fill: rgba(var(--ax-comp-line-chart-labels-color), 0.7);\n `,\n );\n\n if (isRtl) {\n yTickTexts.attr('text-anchor', 'start');\n } else {\n yTickTexts.attr('text-anchor', 'end').attr('direction', 'ltr');\n }\n\n const yTickNodes = (yTickTexts.nodes() || []) as SVGTextElement[];\n const maxTickLabelWidth = this.measureMaxYAxisTickLabelWidth(yTickNodes, dynamicYAxisTickFontSize);\n\n if (options.yAxisLabel) {\n this.createYAxisTitle(axesGroup, options.yAxisLabel, dynamicYAxisTickFontSize, maxTickLabelWidth);\n }\n }\n\n if (showGrid) {\n const gridGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-grid-container')\n .attr('pointer-events', 'none');\n\n const yGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid')\n .call(\n this.d3\n .axisLeft(this.yScale)\n .tickSize(-this.width)\n .tickFormat(() => '')\n .tickValues(this.yScale.ticks()),\n );\n\n // Style the grid path and lines\n yGrid.selectAll('path').attr('stroke-width', '0');\n\n yGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.2)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n\n if (options.showVerticalGrid) {\n const xGrid = gridGroup\n .append('g')\n .attr('class', 'ax-line-chart-grid-vertical')\n .attr('transform', `translate(0,${this.height})`)\n .call(\n this.d3\n .axisBottom(this.xScale)\n .tickSize(-this.height)\n .tickFormat(() => '')\n .tickValues(isPointScale ? undefined : (this.xScale as d3.ScaleLinear<number, number>).ticks()),\n );\n\n // Style the vertical grid path and lines\n xGrid.selectAll('path').attr('stroke-width', '0');\n\n xGrid\n .selectAll('.tick')\n .selectAll('line')\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.15)')\n .attr('stroke-dasharray', '2,2')\n .attr('stroke-opacity', '0.5');\n }\n }\n }\n\n private getXPosition(point: { x: number | string }): number {\n if (this.xScaleKind === 'point') {\n return (this.xScale as d3.ScalePoint<string>)(String(point.x)) ?? 0;\n }\n\n return (this.xScale as d3.ScaleLinear<number, number>)(point.x as number);\n }\n\n private renderLines(allSeriesData: (AXLineChartData & { originalIndex: number })[]): void {\n const getX = (d: { x: number | string; y: number }) => this.getXPosition(d);\n\n const lineGenerator = this.d3\n .line<{ x: number | string; y: number }>()\n .x(getX)\n .y((d) => this.yScale(d.y)) as d3.Line<{ x: number | string; y: number }>;\n\n if (this.effectiveOptions().smoothLine !== false) {\n lineGenerator.curve(this.d3.curveMonotoneX);\n }\n\n const areaGenerator = this.d3\n .area<{ x: number | string; y: number }>()\n .x(getX)\n .y0(this.height)\n .y1((d) => this.yScale(d.y));\n\n if (this.effectiveOptions().smoothLine !== false) {\n areaGenerator.curve(this.d3.curveMonotoneX);\n }\n\n this.svg.attr('class', 'ax-line-chart-animating');\n\n const allSeriesGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-series')\n .attr('pointer-events', 'none');\n\n const allPointsGroup = this.chart\n .append('g')\n .attr('class', 'ax-line-chart-all-points')\n .attr('pointer-events', 'none');\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n const animationDuration = this.effectiveOptions().animationDuration;\n const animationEasing = getEasingFunction(this.d3, this.effectiveOptions().animationEasing);\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n\n if (this.hiddenSeries.has(seriesIdentifier)) {\n this.removeSeriesElements(seriesIdentifier);\n return;\n }\n if (!series.data || series.data.length === 0) return;\n\n const seriesGroup = allSeriesGroup\n .append('g')\n .attr('class', `ax-line-chart-series ax-line-chart-series-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const fillColor = series.fillColor || lineColor;\n\n const line = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-line')\n .attr('stroke', lineColor)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH)\n .attr('stroke-linejoin', 'round')\n .attr('stroke-linecap', 'round')\n .attr('d', lineGenerator)\n .attr('fill', 'none')\n .attr('style', 'transition: stroke-width 0.3s ease;')\n .attr('pointer-events', 'none');\n\n line\n .on('mouseenter', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n })\n .on('mouseleave', () => {\n line\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n });\n\n const totalLength = line.node().getTotalLength();\n line\n .attr('stroke-dasharray', totalLength + ' ' + totalLength)\n .attr('stroke-dashoffset', totalLength)\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('stroke-dashoffset', 0)\n .on('end', function () {\n line.attr('pointer-events', 'all');\n });\n\n if (this.effectiveOptions().fillArea) {\n const area = seriesGroup\n .append('path')\n .datum(series.data)\n .attr('class', 'ax-line-chart-area')\n .attr('fill', fillColor)\n .attr('opacity', 0)\n .attr('d', areaGenerator)\n .attr('style', 'transition: opacity 0.3s ease;')\n .attr('pointer-events', 'none');\n\n area\n .on('mouseenter', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', ((this.effectiveOptions().fillOpacity ?? 20) / 100) * 1.5);\n })\n .on('mouseleave', () => {\n area\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100);\n });\n\n area\n .transition()\n .duration(animationDuration)\n .ease(animationEasing)\n .attr('opacity', (this.effectiveOptions().fillOpacity ?? 20) / 100)\n .on('end', function () {\n area.attr('pointer-events', 'all');\n });\n }\n });\n\n if (this.effectiveOptions().showPoints !== false) {\n const pointMap = new Map<\n string,\n Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>\n >();\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointData.forEach((point) => {\n const x = getX(point);\n const y = this.yScale(point.y);\n const key = this.createPointKey(x, y);\n\n if (!pointMap.has(key)) {\n pointMap.set(key, []);\n }\n pointMap.get(key)?.push({ point, series, originalIndex: series.originalIndex });\n });\n });\n\n let animationCounter = 0;\n const totalVisibleSeriesCount = allSeriesData.filter(\n (s) => !this.hiddenSeries.has(this.getSeriesIdentifier(s)) && s.data && s.data.length > 0,\n ).length;\n\n allSeriesData.forEach((series) => {\n const seriesIdentifier = this.getSeriesIdentifier(series);\n if (this.hiddenSeries.has(seriesIdentifier) || !series.data || series.data.length === 0) {\n return;\n }\n\n const lineColor = series.lineColor || getChartColor(series.originalIndex, this.chartColors);\n const pointsGroup = allPointsGroup\n .append('g')\n .attr('class', `ax-line-chart-points ax-line-chart-points-${series.originalIndex}`)\n .attr('data-series-identifier', seriesIdentifier)\n .attr('pointer-events', 'none');\n\n pointsGroup\n .on('mouseenter', () => this.handlePointGroupEnter(series.originalIndex))\n .on('mouseleave', () => this.handlePointGroupLeave());\n\n const pointData = this.getReducedDataPoints(series.data, this.MAX_POINTS_TO_RENDER);\n\n pointsGroup\n .selectAll('circle')\n .data(pointData)\n .enter()\n .append('circle')\n .attr('class', 'ax-line-chart-point')\n .attr('cx', getX)\n .attr('cy', (d) => this.yScale(d.y))\n .attr('r', 0)\n .attr('fill', lineColor)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1)\n .attr('data-x', (d) => d.x)\n .attr('data-y', (d) => d.y)\n .style('cursor', 'pointer')\n .attr('pointer-events', 'none')\n .on('mouseenter', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n this.handleOverlappingPointsHover(event, overlappingPoints);\n } else {\n this.handlePointHover(event, d, series, series.originalIndex);\n }\n\n const pointRadius = this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS;\n this.d3\n .select(event.target as SVGCircleElement)\n .interrupt()\n .attr('r', pointRadius * this.POINT_HIGHLIGHT_MULTIPLIER)\n .attr('stroke-width', this.POINT_HOVER_STROKE_WIDTH)\n .attr('stroke', `rgb(var(--ax-comp-line-chart-bg-color))`);\n })\n .on('mousemove', (event: MouseEvent) => this.updateTooltipPosition(event))\n .on('mouseleave', (event: MouseEvent) => {\n this._tooltipVisible.set(false);\n const pointRadius = this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS;\n this.d3\n .select(event.target as SVGCircleElement)\n .interrupt()\n .attr('r', pointRadius)\n .attr('stroke-width', this.POINT_STROKE_WIDTH)\n .attr('stroke', '#fff');\n })\n .on('click', (event: MouseEvent, d: { x: number | string; y: number }) => {\n const x = getX(d);\n const y = this.yScale(d.y);\n const key = this.createPointKey(x, y);\n const overlappingPoints = pointMap.get(key) || [];\n\n if (overlappingPoints.length > 1) {\n overlappingPoints.forEach(({ point, series }) => {\n this.handlePointClick(event, point, series);\n });\n } else {\n this.handlePointClick(event, d, series);\n }\n })\n .transition()\n .delay(\n (_d: { x: number | string; y: number }, i: number) =>\n i * Math.min(this.POINT_ANIMATION_DELAY_MS, (animationDuration || 0) * 0.05) +\n (animationDuration || 0) * this.POINT_ANIMATION_DELAY_RATIO,\n )\n .duration((animationDuration || 0) * this.POINT_ANIMATION_DURATION_RATIO)\n .ease(animationEasing)\n .attr('r', this.effectiveOptions().pointRadius ?? this.DEFAULT_POINT_RADIUS)\n .on('end', (d, i, nodes) => {\n if (i === nodes.length - 1) {\n animationCounter++;\n if (animationCounter >= totalVisibleSeriesCount) {\n this.enablePointerEventsAfterAnimation();\n }\n }\n });\n });\n } else {\n setTimeout(() => this.enablePointerEventsAfterAnimation(), (animationDuration || 0) + this.ANIMATION_END_BUFFER);\n }\n }\n\n private enablePointerEventsAfterAnimation(): void {\n if (!this.chart || !this.svg) return;\n this.chart.selectAll('.ax-line-chart-all-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-series').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-line').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-area').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-all-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-points').attr('pointer-events', 'all');\n this.chart.selectAll('.ax-line-chart-point').attr('pointer-events', 'all');\n this.svg.classed('ax-line-chart-animating', false);\n }\n\n private handlePointGroupEnter(originalIndex: number): void {\n this.chart\n .select(`.ax-line-chart-series-${originalIndex} .ax-line-chart-line`)\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr(\n 'stroke-width',\n (this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH) * this.LINE_HIGHLIGHT_MULTIPLIER,\n );\n }\n\n private handlePointGroupLeave(): void {\n this.chart\n .selectAll('.ax-line-chart-line')\n .transition()\n .duration(this.HOVER_TRANSITION_DURATION)\n .attr('stroke-width', this.effectiveOptions().lineWidth ?? this.DEFAULT_LINE_WIDTH);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.chart.select('.ax-line-chart-crosshair').selectAll('*').remove();\n }\n }\n\n private getReducedDataPoints(\n data: Array<{ x: number | string; y: number }>,\n maxPoints: number,\n ): Array<{ x: number | string; y: number }> {\n if (data.length <= maxPoints) return data;\n const result: Array<{ x: number | string; y: number }> = [];\n const step = Math.ceil(data.length / maxPoints);\n for (let i = 0; i < data.length; i += step) {\n result.push(data[i]);\n }\n if (result[result.length - 1] !== data[data.length - 1]) {\n result.push(data[data.length - 1]);\n }\n return result;\n }\n\n private handlePointHover(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n originalIndex: number,\n ): void {\n if (this.effectiveOptions().showTooltip !== false) {\n const color = series.lineColor || getChartColor(originalIndex, this.chartColors);\n\n this._tooltipData.set({\n title: dataPoint.tooltipLabel || series.tooltipLabel || series.label || `Series ${originalIndex + 1}`,\n value: formatLargeNumber(dataPoint.y),\n color: color,\n });\n\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true) {\n this.showCrosshairLines(dataPoint);\n }\n }\n }\n\n private showCrosshairLines(dataPoint: { x: number | string; y: number }): void {\n const x = this.getXPosition(dataPoint);\n const y = this.yScale(dataPoint.y);\n\n let crosshairGroup = this.chart.select('.ax-line-chart-crosshair');\n if (crosshairGroup.empty()) {\n crosshairGroup = this.chart.append('g').attr('class', 'ax-line-chart-crosshair').attr('pointer-events', 'none');\n }\n\n crosshairGroup.selectAll('*').remove();\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-vertical')\n .attr('x1', x)\n .attr('y1', 0)\n .attr('x2', x)\n .attr('y2', this.height)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\n\n crosshairGroup\n .append('line')\n .attr('class', 'ax-line-chart-crosshair-horizontal')\n .attr('x1', 0)\n .attr('y1', y)\n .attr('x2', this.width)\n .attr('y2', y)\n .attr('stroke', 'rgba(var(--ax-comp-line-chart-grid-lines-color), 0.5)')\n .attr('stroke-width', 1)\n .attr('stroke-dasharray', '3,3')\n .attr('opacity', 0.7)\n .attr('pointer-events', 'none');\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.scheduleTooltipPosition(0);\n }\n\n private scheduleTooltipPosition(attempt: number): void {\n this._tooltipRafId = requestAnimationFrame(() => {\n const coords = this._pendingTooltipCoords;\n if (!coords) {\n this._tooltipRafId = null;\n return;\n }\n\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl) {\n this._tooltipRafId = null;\n return;\n }\n\n const tooltipEl = containerEl.querySelector('.chart-tooltip') as HTMLElement | null;\n if (!tooltipEl && this._tooltipVisible() && attempt < 3) {\n this.scheduleTooltipPosition(attempt + 1);\n return;\n }\n\n this._tooltipRafId = null;\n const rect = containerEl.getBoundingClientRect();\n const tooltipRect = tooltipEl ? tooltipEl.getBoundingClientRect() : null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x, coords.y, this.TOOLTIP_GAP);\n const prev = this._tooltipPosition();\n if (prev.x !== pos.x || prev.y !== pos.y) {\n this._tooltipPosition.set(pos);\n }\n });\n }\n\n // computeTooltipPosition moved to shared chart utils\n\n private handlePointClick(\n event: MouseEvent,\n dataPoint: AXLineChartData['data'][number],\n series: AXLineChartData & { originalIndex: number },\n ): void {\n this.pointClick.emit({\n series: series, // series still refers to the full series data with originalIndex\n point: dataPoint,\n event: {\n nativeEvent: event,\n sender: this,\n },\n });\n }\n\n private showNoDataMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-no-data-message')\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().noDataIcon} fa-2x\"></i>`);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().noData);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-no-data-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().noDataHelp);\n }\n\n private showAllSeriesHiddenMessage(containerElement: HTMLElement): void {\n // Remove only chart SVG and previous empty-state messages to avoid removing tooltip\n this.d3\n .select(containerElement)\n .selectAll('svg, .ax-line-chart-no-data-message, .ax-line-chart-all-hidden-message')\n .remove();\n const messageContainer = this.d3\n .select(containerElement)\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-message') // Different class\n .style('position', 'absolute')\n .style('left', '50%')\n .style('top', '50%')\n .style('transform', 'translate(-50%, -50%)');\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-icon')\n .style('opacity', '0.6')\n .style('margin-bottom', '0.75rem')\n .html(`<i class=\"${this.effectiveMessages().allHiddenIcon} fa-2x\"></i>`); // Different icon\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-text')\n .style('font-size', '1rem')\n .style('font-weight', '600')\n .style('margin-bottom', '0.5rem')\n .text(this.effectiveMessages().allHidden);\n\n messageContainer\n .append('div')\n .attr('class', 'ax-line-chart-all-hidden-help')\n .style('font-size', '0.8rem')\n .style('opacity', '0.6')\n .text(this.effectiveMessages().allHiddenHelp);\n }\n\n private handleOverlappingPointsHover(\n event: MouseEvent,\n overlappingPoints: Array<{\n point: { x: number | string; y: number };\n series: AXLineChartData & { originalIndex: number };\n originalIndex: number;\n }>,\n ): void {\n if (this.effectiveOptions().showTooltip === false) return;\n\n const tooltipData: AXChartTooltipData = {\n title: overlappingPoints.map(({ series }) => series.label),\n value: formatLargeNumber(overlappingPoints[0].point.y),\n color: overlappingPoints.map(\n ({ series }) => series.lineColor || getChartColor(series.originalIndex, this.chartColors),\n ),\n };\n\n this._tooltipData.set(tooltipData);\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n\n if (this.effectiveOptions().showCrosshair === true && overlappingPoints.length > 0) {\n this.showCrosshairLines(overlappingPoints[0].point);\n }\n }\n}\n","<div class=\"ax-line-chart\" #chartContainer>\n <!-- Shared tooltip component -->\n <ax-chart-tooltip\n [visible]=\"tooltipVisible()\"\n [position]=\"tooltipPosition()\"\n [data]=\"tooltipData()\"\n [showPercentage]=\"false\"\n ></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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"}