@acorex/charts 20.9.2 → 20.9.3

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.
@@ -10,6 +10,7 @@ const AXGaugeChartDefaultConfig = {
10
10
  cornerRadius: 5,
11
11
  showValue: true,
12
12
  showTooltip: true,
13
+ showDataLabels: true,
13
14
  animationDuration: 750,
14
15
  animationEasing: 'cubic-out',
15
16
  messages: {
@@ -83,6 +84,10 @@ class AXGaugeChartComponent extends AXChartComponent {
83
84
  TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;
84
85
  TICK_LABEL_SIDE_PADDING = 6;
85
86
  LABEL_TICK_CLEARANCE = 4;
87
+ MIN_SEGMENT_CHORD_FOR_LABEL = 28;
88
+ MIN_SEGMENT_RING_FOR_LABEL = 14;
89
+ MIN_SEGMENT_LABEL_FONT = 10;
90
+ MAX_SEGMENT_LABEL_FONT = 16;
86
91
  instanceId = createChartInstanceId('ax-gauge');
87
92
  get bgGradientId() {
88
93
  return `${this.instanceId}-bg-gradient`;
@@ -324,23 +329,28 @@ class AXGaugeChartComponent extends AXChartComponent {
324
329
  const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));
325
330
  // Start from the minimum value angle
326
331
  let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);
332
+ const labeledSegments = [];
327
333
  sortedThresholds.forEach((threshold, i) => {
328
334
  const endAngle = angles[i];
329
335
  // Skip if end angle is not greater than start angle
330
336
  if (endAngle <= previousEndAngle)
331
337
  return;
338
+ const startAngle = previousEndAngle;
332
339
  const arcPath = chartGroup
333
340
  .append('path')
334
341
  .attr('d', arc({
335
342
  innerRadius,
336
343
  outerRadius,
337
- startAngle: previousEndAngle,
344
+ startAngle,
338
345
  endAngle,
339
346
  }))
340
347
  .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)
341
348
  .attr('class', 'gauge-arc threshold-arc')
342
349
  .attr('data-value', threshold.value)
343
350
  .style('cursor', 'pointer');
351
+ if (threshold.label) {
352
+ labeledSegments.push({ startAngle, endAngle, label: threshold.label });
353
+ }
344
354
  // Add tooltip interaction
345
355
  if (this.effectiveOptions().showTooltip) {
346
356
  // Convert angles back to values for tooltip
@@ -394,6 +404,88 @@ class AXGaugeChartComponent extends AXChartComponent {
394
404
  });
395
405
  }
396
406
  }
407
+ if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {
408
+ this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);
409
+ }
410
+ }
411
+ /**
412
+ * Draws threshold labels centered on each segment arc when space allows.
413
+ */
414
+ drawSegmentLabels(chartGroup, segments, innerRadius, outerRadius) {
415
+ const labelArc = this.d3
416
+ .arc()
417
+ .innerRadius(innerRadius)
418
+ .outerRadius(outerRadius * 0.98);
419
+ const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');
420
+ const ringWidth = outerRadius - innerRadius;
421
+ const labelRadius = innerRadius + ringWidth / 2;
422
+ const animationDuration = this.effectiveOptions().animationDuration ?? 750;
423
+ segments.forEach((segment) => {
424
+ const angle = segment.endAngle - segment.startAngle;
425
+ const chordLength = 2 * labelRadius * Math.sin(angle / 2);
426
+ const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);
427
+ if (fontSize <= 0)
428
+ return;
429
+ const availableWidth = chordLength * 0.8;
430
+ const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);
431
+ if (!text)
432
+ return;
433
+ const centroid = labelArc.centroid({
434
+ innerRadius,
435
+ outerRadius: outerRadius * 0.98,
436
+ startAngle: segment.startAngle,
437
+ endAngle: segment.endAngle,
438
+ });
439
+ labelGroup
440
+ .append('text')
441
+ .attr('class', 'gauge-segment-label')
442
+ .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)
443
+ .attr('text-anchor', 'middle')
444
+ .attr('dominant-baseline', 'middle')
445
+ .style('pointer-events', 'none')
446
+ .style('font-size', `${fontSize}px`)
447
+ .style('font-weight', '600')
448
+ .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')
449
+ .style('opacity', 0)
450
+ .text(text)
451
+ .transition()
452
+ .duration(animationDuration)
453
+ .style('opacity', 1);
454
+ });
455
+ }
456
+ calculateSegmentLabelFontSize(angle, ringWidth, chordLength) {
457
+ if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {
458
+ return 0;
459
+ }
460
+ const ringBasedSize = ringWidth * 0.45;
461
+ const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));
462
+ const maxByChord = chordLength / (2 * 0.65);
463
+ const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);
464
+ if (fontSize < this.MIN_SEGMENT_LABEL_FONT)
465
+ return 0;
466
+ return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;
467
+ }
468
+ getFittedSegmentLabel(label, fontSize, availableWidth) {
469
+ if (!label)
470
+ return '';
471
+ if (this.doesSegmentLabelFit(label, fontSize, availableWidth))
472
+ return label;
473
+ return this.truncateSegmentLabel(label, fontSize, availableWidth);
474
+ }
475
+ doesSegmentLabelFit(text, fontSize, availableWidth) {
476
+ return text.length * fontSize * 0.65 <= availableWidth;
477
+ }
478
+ truncateSegmentLabel(text, fontSize, availableWidth) {
479
+ const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);
480
+ const availableForText = availableWidth - fontSize * 0.7;
481
+ if (availableForText <= 0)
482
+ return '';
483
+ const maxChars = Math.floor(availableForText / charWidth);
484
+ if (maxChars <= 0)
485
+ return '';
486
+ if (text.length <= maxChars)
487
+ return text;
488
+ return `${text.substring(0, Math.max(1, maxChars))}…`;
397
489
  }
398
490
  /**
399
491
  * Shows tooltip for a threshold arc
@@ -753,11 +845,11 @@ class AXGaugeChartComponent extends AXChartComponent {
753
845
  return radians * this.DEGREES_PER_RADIAN;
754
846
  }
755
847
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
756
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXGaugeChartComponent, isStandalone: true, selector: "ax-gauge-chart", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n", styles: [".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
848
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.3", type: AXGaugeChartComponent, isStandalone: true, selector: "ax-gauge-chart", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "chartContainerEl", first: true, predicate: ["chartContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n", styles: [".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\n"], dependencies: [{ kind: "component", type: AXChartTooltipComponent, selector: "ax-chart-tooltip", inputs: ["data", "position", "visible", "showPercentage", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
757
849
  }
758
850
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXGaugeChartComponent, decorators: [{
759
851
  type: Component,
760
- args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n", styles: [".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\n"] }]
852
+ args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-gauge-chart\" role=\"img\" #chartContainer>\n <ax-chart-tooltip [data]=\"tooltipData()\" [position]=\"tooltipPosition()\" [visible]=\"tooltipVisible()\"></ax-chart-tooltip>\n</div>\n", styles: [".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\n"] }]
761
853
  }], ctorParameters: () => [] });
762
854
 
763
855
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSxtQkFBbUI7S0FDaEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEdhdWdlQ2hhcnRPcHRpb24gPSB7XG4gIG1pblZhbHVlOiAwLFxuICBtYXhWYWx1ZTogMTAwLFxuICBnYXVnZVdpZHRoOiAyMixcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBzaG93VmFsdWU6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBhbmltYXRpb25EdXJhdGlvbjogNzUwLFxuICBhbmltYXRpb25FYXNpbmc6ICdjdWJpYy1vdXQnLFxuICBtZXNzYWdlczoge1xuICAgIC4uLkFYX0NIQVJUX0RFRkFVTFRfTUVTU0FHRVMsXG4gICAgbm9EYXRhSWNvbjogJ2ZhLWxpZ2h0IGZhLWdhdWdlJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBBWF9HQVVHRV9DSEFSVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48QVhHYXVnZUNoYXJ0T3B0aW9uPignQVhfR0FVR0VfQ0hBUlRfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IEFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG59KTtcblxuZXhwb3J0IHR5cGUgUGFydGlhbEdhdWdlQ2hhcnRDb25maWcgPSBQYXJ0aWFsPEFYR2F1Z2VDaGFydE9wdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXVnZUNoYXJ0Q29uZmlnKGNvbmZpZzogUGFydGlhbEdhdWdlQ2hhcnRDb25maWcgPSB7fSk6IEFYR2F1Z2VDaGFydE9wdGlvbiB7XG4gIHJldHVybiB7XG4gICAgLi4uQVhHYXVnZUNoYXJ0RGVmYXVsdENvbmZpZyxcbiAgICAuLi5jb25maWcsXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcubWVzc2FnZXMsXG4gICAgICAuLi5jb25maWcubWVzc2FnZXMsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==","import { AXChartComponent, computeTooltipPosition, createChartInstanceId, formatLargeNumber, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\n instanceId = createChartInstanceId('ax-gauge');\n get bgGradientId() {\n return `${this.instanceId}-bg-gradient`;\n }\n thresholdGradientId(index) {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n const containerElement = this.chartContainerEl().nativeElement;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n const currentValue = this.value();\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN6RCxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLEtBQUssR0FBRyxLQUFLLENBQW9CLENBQUMsaURBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsOENBQThDO0lBQ3RDLFVBQVUsR0FBeUIsSUFBSSxD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LEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQy9GLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7UUFDMUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxVQUFVLENBQUM7SUFDL0YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsT0FBZTtRQUN0QyxPQUFPLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDM0MsQ0FBQzt1R0ExMkJVLHFCQUFxQjsyRkFBckIscUJBQXFCLHVlQzNDbEMseU1BR0EscTVDRHFDWSx1QkFBdUI7OzJGQUd0QixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFYQ2hhcnRDb21wb25lbnQsXG4gIEFYQ2hhcnRDb21wb25lbnRCYXNlLFxuICBjb21wdXRlVG9vbHRpcFBvc2l0aW9uLFxuICBjcmVhdGVDaGFydEluc3RhbmNlSWQsXG4gIGZvcm1hdExhcmdlTnVtYmVyLFxuICBnZXRFYXNpbmdGdW5jdGlvbixcbiAgbWVyZ2VDaGFydE1lc3NhZ2VzLFxuICBtZXJnZUNoYXJ0T3B0aW9ucyxcbiAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UsXG59IGZyb20gJ0BhY29yZXgvY2hhcnRzJztcbmltcG9ydCB7IEFYQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBBWENoYXJ0VG9vbHRpcERhdGEgfSBmcm9tICdAYWNvcmV4L2NoYXJ0cy9jaGFydC10b29sdGlwJztcblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7IEFYX0dBVUdFX0NIQVJUX0NPTkZJRyB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQuY29uZmlnJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiwgQVhHYXVnZUNoYXJ0VmFsdWUgfSBmcm9tICcuL2dhdWdlLWNoYXJ0LnR5cGUnO1xuXG4vKipcbiAqIEdhdWdlIENoYXJ0IENvbXBvbmVudFxuICogUmVuZGVycyBhIHNlbWktY2lyY3VsYXIgZ2F1Z2UgY2hhcnQgd2l0aCBhbmltYXRlZCBuZWVkbGUgYW5kIHRocmVzaG9sZHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZ2F1Z2UtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYXVnZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQVhDaGFydFRvb2x0aXBDb21wb25lbnRdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhHYXVnZUNoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQVhDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQVhDaGFydENvbXBvbmVudEJhc2Uge1xuICAvLyBJbnB1dHNcbiAgLyoqIENoYXJ0IHZhbHVlIGlucHV0ICovXG4gIHZhbHVlID0gaW5wdXQ8QVhHYXVnZUNoYXJ0VmFsdWU+KDApO1xuXG4gIC8qKiBDaGFydCBvcHRpb25zIGlucHV0ICovXG4gIG9wdGlvbnMgPSBpbnB1dDxBWEdhdWdlQ2hhcnRPcHRpb24+KHt9KTtcblxuICAvLyBDaGFydCBjb250YWluZXIgcmVmZXJlbmNlXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb250YWluZXJFbCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NoYXJ0Q29udGFpbmVyJyk7XG5cbiAgLy8gU1ZHIGVsZW1lbnQgcmVmZXJlbmNlIChjcmVhdGVkIGluIHRoZSBjb2RlKVxuICBwcml2YXRlIHN2Z0VsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBEMyByZWZlcmVuY2UgLSBsb2FkZWQgYXN5bmNocm9ub3VzbHlcbiAgcHJvdGVjdGVkIGQzITogdHlwZW9mIGltcG9ydCgnZDMnKTtcblxuICAvLyBTaWduYWxzIGZvciBjb21wb25lbnQgc3RhdGVcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF9yZW5kZXJlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3ByZXZWYWx1ZSA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBUcmFjayBwcmV2aW91cyBvcHRpb25zIHRvIGRldGVjdCBjaGFuZ2VzXG4gIHByaXZhdGUgX3ByZXZPcHRpb25zU3RyaW5nID0gJyc7XG5cbiAgLy8gQ2FjaGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERPTSByZWFkc1xuICBwcml2YXRlIF9sYXN0Q29udGFpbmVyUmVjdDogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVG9vbHRpcCBzaWduYWxzXG4gIHByaXZhdGUgX3Rvb2x0aXBWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFBvc2l0aW9uID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcERhdGEgPSBzaWduYWw8QVhDaGFydFRvb2x0aXBEYXRhPih7XG4gICAgdGl0bGU6ICcnLFxuICAgIHZhbHVlOiAnJyxcbiAgfSk7XG4gIHByaXZhdGUgX3Rvb2x0aXBSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3BlbmRpbmdUb29sdGlwQ29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHBvc2UgdG9vbHRpcCBzaWduYWxzIGFzIHJlYWQtb25seSBmb3IgdGhlIHRlbXBsYXRlXG4gIHByb3RlY3RlZCB0b29sdGlwVmlzaWJsZSA9IHRoaXMuX3Rvb2x0aXBWaXNpYmxlLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBQb3NpdGlvbiA9IHRoaXMuX3Rvb2x0aXBQb3NpdGlvbi5hc1JlYWRvbmx5KCk7XG4gIHByb3RlY3RlZCB0b29sdGlwRGF0YSA9IHRoaXMuX3Rvb2x0aXBEYXRhLmFzUmVhZG9ubHkoKTtcblxuICAvLyBJbmplY3QgY29uZmlndXJhdGlvblxuICBwcml2YXRlIGNvbmZpZ1Rva2VuID0gaW5qZWN0KEFYX0dBVUdFX0NIQVJUX0NPTkZJRyk7XG5cbiAgLy8gQ29tcHV0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gbWVyZ2VDaGFydE9wdGlvbnModGhpcy5jb25maWdUb2tlbiwgdGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgZWZmZWN0aXZlTWVzc2FnZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIG1lcmdlQ2hhcnRNZXNzYWdlcyh0aGlzLmNvbmZpZ1Rva2VuLm1lc3NhZ2VzLCB0aGlzLm9wdGlvbnMoKT8ubWVzc2FnZXMpLFxuICApO1xuXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IFRPT0xUSVBfR0FQID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgSEFMRl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUVVBUlRFUl9DSVJDTEVfUkFESUFOUyA9IE1hdGguUEkgLyAyO1xuICBwcml2YXRlIHJlYWRvbmx5IERFR1JFRVNfUEVSX1JBRElBTiA9IDE4MCAvIE1hdGguUEk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0hBUlRfRURHRV9QQURESU5HID0gMTI7XG4gIHByaXZhdGUgcmVhZG9ubHkgVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPID0gMC42MjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX1NJREVfUEFERElORyA9IDY7XG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfVElDS19DTEVBUkFOQ0UgPSA0O1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBjcmVhdGVDaGFydEluc3RhbmNlSWQoJ2F4LWdhdWdlJyk7XG5cbiAgcHJpdmF0ZSBnZXQgYmdHcmFkaWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaW5zdGFuY2VJZH0tYmctZ3JhZGllbnRgO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJlc2hvbGRHcmFkaWVudElkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LXRocmVzaG9sZC1ncmFkaWVudC0ke2luZGV4fWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gcmVkcmF3IHRoZSBjaGFydFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcmV2VmFsdWUuc2V0KGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsIHx8ICF0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3ByZXZPcHRpb25zU3RyaW5nID09PSBvcHRpb25zU3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZERpYWwoY3VycmVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmQzKSByZXR1cm47IC8vIEFscmVhZHkgbG9hZGVkXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBnYXVnZSBjaGFydCB3aXRoIGFsbCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtY2hhcnQtZW1wdHknKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuXG4gICAgaWYgKHRoaXMudmFsdWUoKSA9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kMykge1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKTtcbiAgICAgICAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UodGhpcy5kMywgY29udGFpbmVyRWxlbWVudCwge1xuICAgICAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICAgICAgdGl0bGU6IG1lc3NhZ2VzLm5vRGF0YSxcbiAgICAgICAgICBoZWxwOiBtZXNzYWdlcy5ub0RhdGFIZWxwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCkgYXMgbnVtYmVyO1xuXG4gICAgLy8gQ3JlYXRlIFNWRyBlbGVtZW50XG4gICAgdGhpcy5zdmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBHZXQgY3VycmVudCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gU3RvcmUgb3B0aW9ucyBzdHJpbmcgZm9yIGNvbXBhcmlzb25cbiAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNob3dWYWx1ZSwgbGFiZWwgPSAnJywgZ2F1Z2VXaWR0aCwgY29ybmVyUmFkaXVzLCBhbmltYXRpb25EdXJhdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0aHJlc2hvbGRzID0gb3B0aW9ucy50aHJlc2hvbGRzID8/IFtdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlc3BvbnNpdmUgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIENhY2hlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSB7IHdpZHRoOiBjb250YWluZXJXaWR0aCwgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgfTtcblxuICAgIC8vIERldGVybWluZSBjaGFydCBkaW1lbnNpb25zIC0gdXNlIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gY29udGFpbmVySGVpZ2h0O1xuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGltZW5zaW9uc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVdpZHRoID0gTWF0aC5tYXgod2lkdGggfHwgMSwgMSk7XG4gICAgY29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0IHx8IDEsIDEpO1xuXG4gICAgLy8gRm9yIGEgc2VtaS1jaXJjdWxhciBnYXVnZSwgd2lkdGggc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgdHdpY2UgdGhlIGhlaWdodFxuICAgIGNvbnN0IHNpemUgPSBNYXRoLm1pbihlZmZlY3RpdmVXaWR0aCwgZWZmZWN0aXZlSGVpZ2h0ICogMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2luIGFzIHBlcmNlbnRhZ2Ugb2Ygc2l6ZSAoNS04JSB3aXRoIHJlYXNvbmFibGUgYm91bmRzKVxuICAgIGNvbnN0IG1hcmdpblJhdGlvID0gMC4wODtcbiAgICBjb25zdCBtYXJnaW4gPSBNYXRoLm1heCg1LCBNYXRoLm1pbihzaXplICogbWFyZ2luUmF0aW8sIDMwKSk7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSB0aGlzLmdldFRpY2tDb3VudChzaXplKTtcbiAgICBjb25zdCB0aWNrRm9udFB4ID0gdGhpcy5nZXRUaWNrRm9udFNpemUoc2l6ZSk7XG4gICAgY29uc3QgbWF4VGlja0xhYmVsV2lkdGggPSB0aGlzLmVzdGltYXRlTWF4VGlja0xhYmVsV2lkdGgodGlja0NvdW50LCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRpY2tGb250UHgpO1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbigoc2l6ZSAvIDIpICogMC4xMiwgMTQpKTtcbiAgICAvLyBLZWVwIGxhYmVscyBjbG9zZXIgdG8gdGhlIGdhdWdlIGFyYyB3aGlsZSBwcmVzZXJ2aW5nIHJlYWRhYmlsaXR5LlxuICAgIGNvbnN0IGxhYmVsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oKHNpemUgLyAyKSAqIDAuMDYsIDE0KSk7XG4gICAgY29uc3QgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCA9IGxhYmVsR2FwICsgdGlja0ZvbnRQeCAqIDAuMzU7XG4gICAgY29uc3QgdGlja0xhYmVsU3BhY2UgPSB0aWNrTGVuZ3RoICsgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCArIHRpY2tGb250UHg7XG4gICAgY29uc3QgdG90YWxWZXJ0aWNhbFNwYWNlID0gc2l6ZSAvIDIgKyB0aWNrTGFiZWxTcGFjZTtcblxuICAgIC8vIExhYmVscyBhdCBlZGdlIHRpY2tzIHVzZSBzdGFydC9lbmQgYW5jaG9ycywgc28gdGhleSBjYW4gZXh0ZW5kIGJ5IG5lYXIgZnVsbCB3aWR0aC5cbiAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IE1hdGgubWF4KDE4LCBtYXhUaWNrTGFiZWxXaWR0aCArIDgpO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBzaXplICsgaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuICAgIGNvbnN0IHZpZXdCb3hXaWR0aCA9IHRvdGFsV2lkdGggKyB0aGlzLkNIQVJUX0VER0VfUEFERElORyAqIDI7XG4gICAgY29uc3Qgdmlld0JveEhlaWdodCA9IHRvdGFsVmVydGljYWxTcGFjZSArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HICogMjtcblxuICAgIC8vIFNldCB1cCBTVkcgd2l0aCByZXNwb25zaXZlIHZpZXdCb3ggdGhhdCBhY2NvdW50cyBmb3Igb3ZlcmZsb3dcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KHRoaXMuc3ZnRWxlbWVudClcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt2aWV3Qm94V2lkdGh9ICR7dmlld0JveEhlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjaGFydCBjZW50ZXJlZCBob3Jpem9udGFsbHkgd2l0aCBwYWRkaW5nLCBwb3NpdGlvbmVkIHRvIHNob3cgb25seSB0aGUgdG9wIGhhbGZcbiAgICBjb25zdCBjaGFydEdyb3VwID0gc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKFxuICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgYHRyYW5zbGF0ZSgke3NpemUgLyAyICsgaG9yaXpvbnRhbFBhZGRpbmcgKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30sICR7c2l6ZSAvIDIgLSBtYXJnaW4gKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30pYCxcbiAgICAgICk7XG5cbiAgICAvLyBEZWZpbmUgZ2F1Z2UgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyIC0gbWFyZ2luO1xuICAgIGNvbnN0IGRlc2lyZWRHYXVnZVdpZHRoID0gdHlwZW9mIGdhdWdlV2lkdGggPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4oZ2F1Z2VXaWR0aCkgPyBnYXVnZVdpZHRoIDogMzA7XG4gICAgLy8gUmVzcGVjdCBleHBsaWNpdCBnYXVnZVdpZHRoIGluIHB4IHdpdGggc2FuZSBhYnNvbHV0ZSBib3VuZHMuXG4gICAgY29uc3QgY2xhbXBlZEdhdWdlV2lkdGggPSBNYXRoLm1heCg2LCBNYXRoLm1pbihkZXNpcmVkR2F1Z2VXaWR0aCwgcmFkaXVzICogMC43KSk7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgLSBjbGFtcGVkR2F1Z2VXaWR0aDtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHJhZGl1cztcblxuICAgIC8vIENyZWF0ZSBncmFkaWVudCBkZWZpbml0aW9uc1xuICAgIHRoaXMuY3JlYXRlR3JhZGllbnRzKHN2ZywgdGhyZXNob2xkcyk7XG5cbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgIHRoaXMuZHJhd0JhY2tncm91bmRBcmMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gRHJhdyB0aGUgdGhyZXNob2xkIGFyY3MgaWYgdGhyZXNob2xkcyBleGlzdFxuICAgIGlmICh0aHJlc2hvbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZHJhd1RocmVzaG9sZHMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRocmVzaG9sZHMsIGNvcm5lclJhZGl1cyk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aWNrIG1hcmtzXG4gICAgdGhpcy5kcmF3VGlja3MoY2hhcnRHcm91cCwgb3V0ZXJSYWRpdXMsIG1pblZhbHVlLCBtYXhWYWx1ZSwgc2l6ZSwgdGlja0NvdW50LCB0aWNrRm9udFB4KTtcblxuICAgIC8vIERyYXcgdGhlIGRpYWwvbmVlZGxlIHdpdGggYW5pbWF0aW9uXG4gICAgdGhpcy5kcmF3RGlhbChjaGFydEdyb3VwLCByYWRpdXMsIGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhbmltYXRpb25EdXJhdGlvbik7XG5cbiAgICAvLyBEcmF3IHRoZSB2YWx1ZSBkaXNwbGF5IChhZnRlciB0aGUgZGlhbCBzbyBpdCdzIG9uIHRvcClcbiAgICBpZiAoc2hvd1ZhbHVlKSB7XG4gICAgICB0aGlzLmRyYXdWYWx1ZURpc3BsYXkoY2hhcnRHcm91cCwgY3VycmVudFZhbHVlLCBsYWJlbCwgcmFkaXVzLCBzaXplKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgaW5pdGlhbGx5XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIG9wdGlvbnMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb25seSB0aGUgdmFsdWUgZGlzcGxheSBhbmQgZGlhbCBwb3NpdGlvbiB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIGNoYXJ0XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVBbmREaWFsKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICBjb25zdCBtYXhWYWx1ZSA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgb3B0aW9ucy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kMy5zZWxlY3QodGhpcy5zdmdFbGVtZW50KTtcblxuICAgIC8vIFVwZGF0ZSB2YWx1ZSB0ZXh0XG4gICAgc3ZnLnNlbGVjdCgnLmdhdWdlLXZhbHVlJykudGV4dChjdXJyZW50VmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBVcGRhdGUgbmVlZGxlIHBvc2l0aW9uXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3QoJy5nYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3QmFja2dyb3VuZEFyYyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGNvcm5lclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYXJjIGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5zdGFydEFuZ2xlKC10aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIFN0YXJ0IGZyb20gYm90dG9tICgtOTAgZGVncmVlcylcbiAgICAgIC5lbmRBbmdsZSh0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIEVuZCBhdCB0b3AgKDkwIGRlZ3JlZXMpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IGJhY2tncm91bmQgYXJjXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdGggPSBjaGFydEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgYmFja2dyb3VuZEFyYylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgZ2F1Z2UtYmFzZScpXG4gICAgICAuYXR0cignZmlsbCcsIGB1cmwoIyR7dGhpcy5iZ0dyYWRpZW50SWR9KWApXG4gICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDBweCAycHggM3B4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgIC8vIEFkZCB0b29sdGlwIGZvciBzaW5nbGUgYXJjIGlmIG5vIHRocmVzaG9sZHNcbiAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMgfHwgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJhY2tncm91bmRQYXRoXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHRocmVzaG9sZHMgYXJjc1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGhyZXNob2xkcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH1bXSxcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBnZW5lcmF0b3JcbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cyAqIDAuOTgpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBTb3J0IHRocmVzaG9sZHMgYnkgdmFsdWUgaW4gYXNjZW5kaW5nIG9yZGVyIChvbmx5IGlmIG5lZWRlZClcbiAgICBjb25zdCBzb3J0ZWRUaHJlc2hvbGRzID0gdGhyZXNob2xkcy5sZW5ndGggPiAxID8gWy4uLnRocmVzaG9sZHNdLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSA6IHRocmVzaG9sZHM7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWxsIGFuZ2xlcyBmaXJzdCB1c2luZyB0aGUgY29sb3IgYW5nbGUgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbmdsZXMgPSBzb3J0ZWRUaHJlc2hvbGRzLm1hcCgodCkgPT4gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHQudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpO1xuXG4gICAgLy8gU3RhcnQgZnJvbSB0aGUgbWluaW11bSB2YWx1ZSBhbmdsZVxuICAgIGxldCBwcmV2aW91c0VuZEFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKG1pblZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuXG4gICAgc29ydGVkVGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVuZEFuZ2xlID0gYW5nbGVzW2ldO1xuXG4gICAgICAvLyBTa2lwIGlmIGVuZCBhbmdsZSBpcyBub3QgZ3JlYXRlciB0aGFuIHN0YXJ0IGFuZ2xlXG4gICAgICBpZiAoZW5kQW5nbGUgPD0gcHJldmlvdXNFbmRBbmdsZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmNQYXRoID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5hdHRyKCdmaWxsJywgdGhyZXNob2xkLmNvbG9yIHx8IGB1cmwoIyR7dGhpcy50aHJlc2hvbGRHcmFkaWVudElkKGkpfSlgKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIHRocmVzaG9sZC1hcmMnKVxuICAgICAgICAuYXR0cignZGF0YS12YWx1ZScsIHRocmVzaG9sZC52YWx1ZSlcbiAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAncG9pbnRlcicpO1xuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBpbnRlcmFjdGlvblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIC8vIENvbnZlcnQgYW5nbGVzIGJhY2sgdG8gdmFsdWVzIGZvciB0b29sdGlwXG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHRocmVzaG9sZC52YWx1ZTtcblxuICAgICAgICBhcmNQYXRoXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dUaHJlc2hvbGRUb29sdGlwKGV2ZW50LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgdGhyZXNob2xkLmNvbG9yLCB0aHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwcmV2aW91cyBlbmQgYW5nbGUgZm9yIHRoZSBuZXh0IHRocmVzaG9sZFxuICAgICAgcHJldmlvdXNFbmRBbmdsZSA9IGVuZEFuZ2xlO1xuICAgIH0pO1xuXG4gICAgLy8gRHJhdyB0aGUgbGFzdCBzZWdtZW50IGlmIHRoZSBsYXN0IHRocmVzaG9sZCBpcyBsZXNzIHRoYW4gdGhlIG1heCB2YWx1ZVxuICAgIGlmIChwcmV2aW91c0VuZEFuZ2xlIDwgdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSB7XG4gICAgICBjb25zdCBsYXN0QXJjID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCBgdXJsKCMke3RoaXMuYmdHcmFkaWVudElkfSlgKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIHRocmVzaG9sZC1hcmMnKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIC8vIEFkZCB0b29sdGlwIGZvciB0aGUgbGFzdCBzZWdtZW50XG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHRoaXMuYW5nbGVUb1ZhbHVlKHByZXZpb3VzRW5kQW5nbGUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gbWF4VmFsdWU7XG4gICAgICAgIGNvbnN0IGxhc3RUaHJlc2hvbGQgPSB0aHJlc2hvbGRzW3RocmVzaG9sZHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdEFyY1xuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIGxhc3RUaHJlc2hvbGQuY29sb3IsIGxhc3RUaHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdG9vbHRpcCBmb3IgYSB0aHJlc2hvbGQgYXJjXG4gICAqL1xuICBwcml2YXRlIHNob3dUaHJlc2hvbGRUb29sdGlwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHN0YXJ0VmFsdWU6IG51bWJlcixcbiAgICBlbmRWYWx1ZTogbnVtYmVyLFxuICAgIGNvbG9yOiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSB0b29sdGlwIGRhdGFcbiAgICB0aGlzLl90b29sdGlwRGF0YS5zZXQoe1xuICAgICAgdGl0bGU6IGxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7c3RhcnRWYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7ZW5kVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6IGNvbG9yLFxuICAgIH0pO1xuXG4gICAgLy8gU2hvdyB0b29sdGlwXG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KHRydWUpO1xuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciB0aGUgZW50aXJlIHJhbmdlIHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBzaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGlmICghb3B0aW9ucy5zaG93VG9vbHRpcCkgcmV0dXJuO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICB0aXRsZTogb3B0aW9ucy5sYWJlbCB8fCAnUmFuZ2UnLFxuICAgICAgdmFsdWU6IGAke29wdGlvbnMubWluVmFsdWUudG9Mb2NhbGVTdHJpbmcoKX0gLSAke29wdGlvbnMubWF4VmFsdWUudG9Mb2NhbGVTdHJpbmcoKX1gLFxuICAgICAgY29sb3I6ICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyxcbiAgICB9KTtcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gICAgaWYgKHRoaXMuX3Rvb2x0aXBSYWZJZCAhPSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5fdG9vbHRpcFJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcztcbiAgICAgIGlmICghY29vcmRzKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjb250YWluZXJFbCkgcmV0dXJuO1xuICAgICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgdG9vbHRpcEVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNoYXJ0LXRvb2x0aXAnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBFbD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgPz8gbnVsbDtcbiAgICAgIGNvbnN0IHBvcyA9IGNvbXB1dGVUb29sdGlwUG9zaXRpb24ocmVjdCwgdG9vbHRpcFJlY3QsIGNvb3Jkcy54ICsgMTAsIGNvb3Jkcy55IC0gMTAsIHRoaXMuVE9PTFRJUF9HQVApO1xuICAgICAgdGhpcy5fdG9vbHRpcFBvc2l0aW9uLnNldChwb3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSB0b29sdGlwXG4gICAqL1xuICBwcml2YXRlIGhpZGVUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGNoYXJ0IHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGNsZWFudXBDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBSYWZJZCk7XG4gICAgICB0aGlzLl90b29sdGlwUmFmSWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9wZW5kaW5nVG9vbHRpcENvb3JkcyA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5zdmdFbGVtZW50KSB7XG4gICAgICB0aGlzLnN2Z0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN2Z0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtY2hhcnQtZW1wdHknKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZ3JhZGllbnQgZGVmaW5pdGlvbnMgZm9yIHRocmVzaG9sZHNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlR3JhZGllbnRzKFxuICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR1NWR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgdGhyZXNob2xkczogeyB2YWx1ZTogbnVtYmVyOyBjb2xvcjogc3RyaW5nIH1bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmcyA9IHN2Zy5hcHBlbmQoJ2RlZnMnKTtcblxuICAgIC8vIENyZWF0ZSBhIHJhZGlhbCBncmFkaWVudCBmb3IgdGhlIGJhY2tncm91bmRcbiAgICBjb25zdCBiZ0dyYWRpZW50ID0gZGVmc1xuICAgICAgLmFwcGVuZCgncmFkaWFsR3JhZGllbnQnKVxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy5iZ0dyYWRpZW50SWQpXG4gICAgICAuYXR0cignY3gnLCAnNTAlJylcbiAgICAgIC5hdHRyKCdjeScsICc1MCUnKVxuICAgICAgLmF0dHIoJ3InLCAnNTAlJylcbiAgICAgIC5hdHRyKCdncmFkaWVudFVuaXRzJywgJ3VzZXJTcGFjZU9uVXNlJyk7XG5cbiAgICAvLyBHZXQgQ1NTIHZhcmlhYmxlIGZvciB0cmFjayBjb2xvclxuICAgIGlmICh0aHJlc2hvbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRGVmYXVsdCBncmFkaWVudCB3aGVuIG5vIHRocmVzaG9sZHMgYXJlIHByb3ZpZGVkXG4gICAgICBiZ0dyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcwJScpLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpKScpO1xuICAgICAgYmdHcmFkaWVudFxuICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgLmF0dHIoJ29mZnNldCcsICcxMDAlJylcbiAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSwgMC44KScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZ0dyYWRpZW50LmFwcGVuZCgnc3RvcCcpLmF0dHIoJ29mZnNldCcsICcwJScpLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpKScpO1xuICAgICAgYmdHcmFkaWVudFxuICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgLmF0dHIoJ29mZnNldCcsICcxMDAlJylcbiAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSwgMC44KScpO1xuXG4gICAgICAvLyBDcmVhdGUgZ3JhZGllbnRzIGZvciBlYWNoIHRocmVzaG9sZFxuICAgICAgdGhyZXNob2xkcy5mb3JFYWNoKCh0aHJlc2hvbGQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBkZWZzXG4gICAgICAgICAgLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKVxuICAgICAgICAgIC5hdHRyKCdpZCcsIHRoaXMudGhyZXNob2xkR3JhZGllbnRJZChpKSlcbiAgICAgICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpXG4gICAgICAgICAgLmF0dHIoJ3gxJywgJy0xJylcbiAgICAgICAgICAuYXR0cigneTEnLCAnMCcpXG4gICAgICAgICAgLmF0dHIoJ3gyJywgJzEnKVxuICAgICAgICAgIC5hdHRyKCd5MicsICcwJyk7XG5cbiAgICAgICAgZ3JhZGllbnRcbiAgICAgICAgICAuYXBwZW5kKCdzdG9wJylcbiAgICAgICAgICAuYXR0cignb2Zmc2V0JywgJzAlJylcbiAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIHRoaXMuZDMuY29sb3IodGhyZXNob2xkLmNvbG9yKT8uYnJpZ2h0ZXIoMC41KS50b1N0cmluZygpIHx8IHRocmVzaG9sZC5jb2xvcik7XG5cbiAgICAgICAgZ3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzEwMCUnKS5hdHRyKCdzdG9wLWNvbG9yJywgdGhyZXNob2xkLmNvbG9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aWNrIG1hcmtzIGFuZCBsYWJlbHMgYXJvdW5kIHRoZSBnYXVnZVxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGlja3MoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgdGlja0NvdW50OiBudW1iZXIsXG4gICAgdGlja0ZvbnRQeDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aWNrTGVuZ3RoID0gTWF0aC5tYXgoNCwgTWF0aC5taW4ocmFkaXVzICogMC4xMiwgMTQpKTtcbiAgICBjb25zdCBiYXNlTGFiZWxPZmZzZXQgPSB0aGlzLmdldEJhc2VMYWJlbE9mZnNldChyYWRpdXMsIHRpY2tMZW5ndGgsIHRpY2tGb250UHgpO1xuICAgIGNvbnN0IHRpY2tHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAndGlja3MnKTtcblxuICAgIGNvbnN0IHRpY2tWYWx1ZXMgPSBbXSBhcyBudW1iZXJbXTtcbiAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gbWluVmFsdWUpIC8gKHRpY2tDb3VudCAtIDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcbiAgICAgIHRpY2tWYWx1ZXMucHVzaChtaW5WYWx1ZSArIGkgKiBzdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWNrTWV0cmljcyA9IHRpY2tWYWx1ZXMubWFwKCh0aWNrKSA9PiB7XG4gICAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUodGljaywgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICAgIGNvbnN0IHJhZGlhbnMgPSBhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJhZGlhbnMsXG4gICAgICAgIGNvczogTWF0aC5jb3MocmFkaWFucyksXG4gICAgICAgIHNpbjogTWF0aC5zaW4ocmFkaWFucyksXG4gICAgICAgIGxhYmVsOiB0aGlzLmZvcm1hdFRpY2tWYWx1ZSh0aWNrLCBtaW5WYWx1ZSwgbWF4VmFsdWUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRpY2tNZXRyaWNzLmZvckVhY2goKG1ldHJpYykgPT4ge1xuICAgICAgdGlja0dyb3VwXG4gICAgICAgIC5hcHBlbmQoJ2xpbmUnKVxuICAgICAgICAuYXR0cigneDEnLCBtZXRyaWMuY29zICogKHJhZGl1cyArIDUpKVxuICAgICAgICAuYXR0cigneTEnLCBtZXRyaWMuc2luICogKHJhZGl1cyArIDUpKVxuICAgICAgICAuYXR0cigneDInLCBtZXRyaWMuY29zICogKHJhZGl1cyArIHRpY2tMZW5ndGgpKVxuICAgICAgICAuYXR0cigneTInLCBtZXRyaWMuc2luICogKHJhZGl1cyArIHRpY2tMZW5ndGgpKVxuICAgICAgICAuYXR0cignc3Ryb2tlJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC41KScpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRleHRTZWxlY3Rpb24gPSB0aWNrR3JvdXBcbiAgICAgIC5zZWxlY3RBbGw8U1ZHVGV4dEVsZW1lbnQsICh0eXBlb2YgdGlja01ldHJpY3MpW251bWJlcl0+KCd0ZXh0LmdhdWdlLXRpY2stbGFiZWwnKVxuICAgICAgLmRhdGEodGlja01ldHJpY3MpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdGljay1sYWJlbCcpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIDApXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvciksIDAuNyknKVxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHt0aWNrRm9udFB4fXB4YClcbiAgICAgIC50ZXh0KChkKSA9PiBkLmxhYmVsKTtcblxuICAgIHRleHRTZWxlY3Rpb24uZWFjaCgoZCwgaW5kZXgsIG5vZGVzKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaW5kZXhdO1xuICAgICAgbGV0IGJib3hXaWR0aCA9IHRoaXMuZXN0aW1hdGVMYWJlbFdpZHRoKGQubGFiZWwsIHRpY2tGb250UHgpO1xuICAgICAgbGV0IGJib3hIZWlnaHQgPSB0aWNrRm9udFB4O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmJveCA9IG5vZGUuZ2V0QkJveCgpO1xuICAgICAgICBpZiAoYmJveC53aWR0aCA+IDApIGJib3hXaWR0aCA9IGJib3gud2lkdGg7XG4gICAgICAgIGlmIChiYm94LmhlaWdodCA+IDApIGJib3hIZWlnaHQgPSBiYm94LmhlaWdodDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGVzdGltYXRlcy5cbiAgICAgIH1cblxuICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5nZXRUaWNrTGFiZWxBbmNob3IoZC5jb3MpO1xuICAgICAgY29uc3QgbmVhckVkZ2VFeHRlbnQgPSB0aGlzLmdldE5lYXJFZGdlUHJvamVjdGlvbihhbmNob3IsIGQuY29zLCBkLnNpbiwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICAgIGNvbnN0IHJlcXVpcmVkT2Zmc2V0ID0gdGlja0xlbmd0aCArIHRoaXMuTEFCRUxfVElDS19DTEVBUkFOQ0UgKyBuZWFyRWRnZUV4dGVudDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUxhYmVsT2Zmc2V0ID0gTWF0aC5tYXgoYmFzZUxhYmVsT2Zmc2V0LCByZXF1aXJlZE9mZnNldCk7XG4gICAgICBjb25zdCBudWRnZSA9IHRpY2tGb250UHggKiAwLjE7XG5cbiAgICAgIGNvbnN0IHggPSBkLmNvcyAqIChyYWRpdXMgKyBlZmZlY3RpdmVMYWJlbE9mZnNldCkgKyAoYW5jaG9yID09PSAnc3RhcnQnID8gbnVkZ2UgOiBhbmNob3IgPT09ICdlbmQnID8gLW51ZGdlIDogMCk7XG4gICAgICBjb25zdCB5ID0gZC5zaW4gKiAocmFkaXVzICsgZWZmZWN0aXZlTGFiZWxPZmZzZXQpO1xuXG4gICAgICB0aGlzLmQzLnNlbGVjdChub2RlKS5hdHRyKCd4JywgeCkuYXR0cigneScsIHkpLmF0dHIoJ3RleHQtYW5jaG9yJywgYW5jaG9yKS5hdHRyKCdkb21pbmFudC1iYXNlbGluZScsICdtaWRkbGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGlja0NvdW50KHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHNpemUgPCAyMDApIHJldHVybiAzO1xuICAgIGlmIChzaXplIDwgMzAwKSByZXR1cm4gNDtcbiAgICBpZiAoc2l6ZSA8IDQwMCkgcmV0dXJuIDU7XG4gICAgaWYgKHNpemUgPiA1MjApIHJldHVybiA3O1xuICAgIHJldHVybiA1O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrRm9udFNpemUoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMTQsIE1hdGgubWluKDE4LCBNYXRoLmZsb29yKHNpemUgLyAzNSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmFzZUxhYmVsT2Zmc2V0KHJhZGl1czogbnVtYmVyLCB0aWNrTGVuZ3RoOiBudW1iZXIsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbGFiZWxHYXAgPSBNYXRoLm1heCg2LCBNYXRoLm1pbihyYWRpdXMgKiAwLjA2LCAxNCkpO1xuICAgIHJldHVybiB0aWNrTGVuZ3RoICsgbGFiZWxHYXAgKyB0aWNrRm9udFB4ICogMC4yO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrTGFiZWxBbmNob3IoY29zVmFsdWU6IG51bWJlcik6ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnIHtcbiAgICBpZiAoY29zVmFsdWUgPiAwLjM1KSByZXR1cm4gJ3N0YXJ0JztcbiAgICBpZiAoY29zVmFsdWUgPCAtMC4zNSkgcmV0dXJuICdlbmQnO1xuICAgIHJldHVybiAnbWlkZGxlJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmVhckVkZ2VQcm9qZWN0aW9uKFxuICAgIGFuY2hvcjogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCcsXG4gICAgY29zVmFsdWU6IG51bWJlcixcbiAgICBzaW5WYWx1ZTogbnVtYmVyLFxuICAgIGJib3hXaWR0aDogbnVtYmVyLFxuICAgIGJib3hIZWlnaHQ6IG51bWJlcixcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBhYnNDb3MgPSBNYXRoLmFicyhjb3NWYWx1ZSk7XG4gICAgY29uc3QgYWJzU2luID0gTWF0aC5hYnMoc2luVmFsdWUpO1xuICAgIGNvbnN0IGhhbGZIZWlnaHRQcm9qZWN0aW9uID0gYWJzU2luICogKGJib3hIZWlnaHQgLyAyKTtcblxuICAgIC8vIEZvciBzdGFydC9lbmQgYW5jaG9yZWQgbGFiZWxzIG9uIGVkZ2UgdGlja3MsIHRoZSBuZWFyZXN0IHNpZGUgaXMgY2xvc2UgdG8gdGhlIGFuY2hvciBwb2ludC5cbiAgICBpZiAoYW5jaG9yID09PSAnc3RhcnQnIHx8IGFuY2hvciA9PT0gJ2VuZCcpIHtcbiAgICAgIHJldHVybiBoYWxmSGVpZ2h0UHJvamVjdGlvbiArIGFic0NvcyAqIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gICAgfVxuXG4gICAgLy8gRm9yIGNlbnRlcmVkIGxhYmVscywgbmVhcmVzdCBzaWRlIGluY2x1ZGVzIGhhbGYgdGV4dCB3aWR0aCBwcm9qZWN0aW9uLlxuICAgIHJldHVybiBhYnNDb3MgKiAoYmJveFdpZHRoIC8gMikgKyBoYWxmSGVpZ2h0UHJvamVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGlja1ZhbHVlKHRpY2s6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heFZhbHVlIC0gbWluVmFsdWU7XG4gICAgaWYgKHZhbHVlUmFuZ2UgPD0gMTApIHtcbiAgICAgIHJldHVybiB0aWNrLnRvRml4ZWQoMikucmVwbGFjZSgvXFwuPzArJC8sICcnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlUmFuZ2UgPCAxMDAwKSB7XG4gICAgICByZXR1cm4gdGljayAlIDEgPT09IDAgPyB0aWNrLnRvU3RyaW5nKCkgOiB0aWNrLnRvRml4ZWQoMSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRMYXJnZU51bWJlcihNYXRoLnJvdW5kKHRpY2spKTtcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVMYWJlbFdpZHRoKGxhYmVsOiBzdHJpbmcsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGxhYmVsLmxlbmd0aCAqIHRpY2tGb250UHggKiB0aGlzLlRJQ0tfTEFCRUxfQ0hBUl9XSURUSF9SQVRJTyArIHRoaXMuVElDS19MQUJFTF9TSURFX1BBRERJTkc7XG4gIH1cblxuICBwcml2YXRlIGVzdGltYXRlTWF4VGlja0xhYmVsV2lkdGgodGlja0NvdW50OiBudW1iZXIsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIsIHRpY2tGb250UHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRpY2tDb3VudCA8PSAxKSByZXR1cm4gdGlja0ZvbnRQeDtcbiAgICBjb25zdCBzdGVwID0gKG1heFZhbHVlIC0gbWluVmFsdWUpIC8gKHRpY2tDb3VudCAtIDEpO1xuICAgIGxldCBtYXhDaGFycyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmZvcm1hdFRpY2tWYWx1ZShtaW5WYWx1ZSArIGkgKiBzdGVwLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgbWF4Q2hhcnMgPSBNYXRoLm1heChtYXhDaGFycywgbGFiZWwubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIG1heENoYXJzICogdGlja0ZvbnRQeCAqIHRoaXMuVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPICsgdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgdmFsdWUgYW5kIGxhYmVsIHRleHQgaW4gdGhlIGNlbnRlclxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VmFsdWVEaXNwbGF5KFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBQeC1iYXNlZCBzY2FsaW5nIGZvciByb2J1c3Qgc21hbGwvbGFyZ2Ugc2l6ZXMgd2l0aCBiZXR0ZXIgc21hbGwtc2l6ZSBoYW5kbGluZ1xuICAgIGNvbnN0IHZhbHVlRm9udFB4ID0gTWF0aC5tYXgoMTgsIE1hdGgubWluKDMyLCBNYXRoLmZsb29yKHNpemUgLyA4KSkpO1xuICAgIGNvbnN0IGxhYmVsRm9udFB4ID0gTWF0aC5tYXgoMTAsIE1hdGgubWluKDE2LCBNYXRoLmZsb29yKHZhbHVlRm9udFB4ICogMC41NSkpKTtcbiAgICAvLyBNb3JlIHZlcnRpY2FsIGdhcCBmb3Igc21hbGwgc2l6ZXM6IHVzZSBsYXJnZXIgYmFzZSB2YWx1ZVxuICAgIGNvbnN0IHZlcnRpY2FsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oMTIsIE1hdGguZmxvb3Ioc2l6ZSAvIDQwKSkpO1xuXG4gICAgLy8gQ3JlYXRlIGdyb3VwIGZvciB0aGUgdmFsdWUgZGlzcGxheVxuICAgIGNvbnN0IHZhbHVlR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXZhbHVlLWRpc3BsYXknKS5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcblxuICAgIC8vIEFkZCB2YWx1ZSBkaXNwbGF5XG4gICAgdmFsdWVHcm91cFxuICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdmFsdWUnKVxuICAgICAgLmF0dHIoJ3gnLCAwKVxuICAgICAgLmF0dHIoJ3knLCByYWRpdXMgKiAwLjE1ICsgdmFsdWVGb250UHgpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3ZhbHVlRm9udFB4fXB4YClcbiAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSknKVxuICAgICAgLnRleHQodmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBBZGQgbGFiZWwgZGlzcGxheSAoaWYgcHJvdmlkZWQpXG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICB2YWx1ZUdyb3VwXG4gICAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbGFiZWwnKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5hdHRyKCd5JywgcmFkaXVzICogMC4yNCArIHZhbHVlRm9udFB4ICsgdmVydGljYWxHYXApXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7bGFiZWxGb250UHh9cHhgKVxuICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdGV4dC1jb2xvcikpJylcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuOCcpXG4gICAgICAgIC50ZXh0KGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGRpYWwvbmVlZGxlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIHdpdGggYW5pbWF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRyYXdEaWFsKFxuICAgIGNoYXJ0R3JvdXA6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDbGFtcCB2YWx1ZSB0byBtaW4vbWF4IHJhbmdlXG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5tYXgobWluVmFsdWUsIE1hdGgubWluKG1heFZhbHVlLCB2YWx1ZSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZ2xlIGZvciBuZWVkbGUgYmFzZWQgb24gdmFsdWVcbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuc2NhbGVWYWx1ZVRvQW5nbGUoY2xhbXBlZFZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgIGNvbnN0IGFuZ2xlSW5EZWdyZWVzID0gdGhpcy5yYWRpYW5zVG9EZWdyZWVzKGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKTtcblxuICAgIC8vIENyZWF0ZSBhIGdyb3VwIGZvciB0aGUgbmVlZGxlXG4gICAgY29uc3QgZGlhbEdyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdkaWFsJyk7XG5cbiAgICAvLyBEcmF3IHRoZSBuZWVkbGUgd2l0aCBpbml0aWFsIHBvc2l0aW9uIGF0IG1pbmltdW0gdmFsdWVcbiAgICBjb25zdCBuZWVkbGVQYXRoID0gZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgdGhpcy5jcmVhdGVOZWVkbGVQYXRoKHJhZGl1cykpXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtbmVlZGxlJylcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LW5lZWRsZS1jb2xvcikpJylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7dGhpcy5yYWRpYW5zVG9EZWdyZWVzKC10aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpfSlgKTsgLy8gU3RhcnQgYXQgLTE4MCBkZWdyZWVzIChsZWZ0KVxuXG4gICAgLy8gQWRkIGEgY2VudGVyIGNpcmNsZVxuICAgIGRpYWxHcm91cFxuICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgIC5hdHRyKCdjeCcsIDApXG4gICAgICAuYXR0cignY3knLCAwKVxuICAgICAgLmF0dHIoJ3InLCByYWRpdXMgKiAwLjA4KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICcjZmZmJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAyKTtcblxuICAgIC8vIEFkZCBhIHNtYWxsZXIgd2hpdGUgY2VudGVyXG4gICAgZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2N4JywgMClcbiAgICAgIC5hdHRyKCdjeScsIDApXG4gICAgICAuYXR0cigncicsIHJhZGl1cyAqIDAuMDMpXG4gICAgICAuYXR0cignZmlsbCcsICcjZmZmJyk7XG5cbiAgICAvLyBHZXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgY29uc3QgZWFzaW5nRnVuY3Rpb24gPSBnZXRFYXNpbmdGdW5jdGlvbih0aGlzLmQzLCB0aGlzLm9wdGlvbnMoKT8uYW5pbWF0aW9uRWFzaW5nKTtcblxuICAgIC8vIEFuaW1hdGUgdGhlIG5lZWRsZSBmcm9tIG1pbiB0byBjdXJyZW50IHZhbHVlXG4gICAgbmVlZGxlUGF0aFxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8vIGdldEVhc2luZ0Z1bmN0aW9uIG1vdmVkIHRvIHNoYXJlZCBjaGFydCB1dGlsc1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGF0aCBzdHJpbmcgZm9yIHRoZSBuZWVkbGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTmVlZGxlUGF0aChyYWRpdXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbmVlZGxlTGVuZ3RoID0gcmFkaXVzICogMC44O1xuICAgIGNvbnN0IG5lZWRsZVdpZHRoID0gcmFkaXVzICogMC4wNjtcbiAgICByZXR1cm4gYE0gMCwke25lZWRsZVdpZHRoIC8gMn0gTCAke25lZWRsZUxlbmd0aH0sMCBMIDAsJHstbmVlZGxlV2lkdGggLyAyfSBaYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgYSB2YWx1ZSB0byBhbiBhbmdsZSAoaW4gcmFkaWFucylcbiAgICovXG4gIHByaXZhdGUgc2NhbGVWYWx1ZVRvQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gdmFsdWVSYW5nZSkgKiB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gIH1cblxuICAvKipcbiAgICogU2NhbGVzIGEgdmFsdWUgdG8gYW4gYW5nbGUgZm9yIGNvbG9yIGFyY3MgKGluIHJhZGlhbnMpXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVmFsdWVUb0NvbG9yQW5nbGUodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgcmV0dXJuICgodmFsdWUgLSBtaW4pIC8gdmFsdWVSYW5nZSkgKiB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gYW5nbGUgYmFjayB0byBhIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFuZ2xlVG9WYWx1ZShhbmdsZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICByZXR1cm4gbWluICsgKChhbmdsZSArIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUykgLyB0aGlzLkhBTEZfQ0lSQ0xFX1JBRElBTlMpICogdmFsdWVSYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyByYWRpYW5zIHRvIGRlZ3JlZXNcbiAgICovXG4gIHByaXZhdGUgcmFkaWFuc1RvRGVncmVlcyhyYWRpYW5zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByYWRpYW5zICogdGhpcy5ERUdSRUVTX1BFUl9SQURJQU47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1nYXVnZS1jaGFydFwiIHJvbGU9XCJpbWdcIiAjY2hhcnRDb250YWluZXI+XG4gIDxheC1jaGFydC10b29sdGlwIFtkYXRhXT1cInRvb2x0aXBEYXRhKClcIiBbcG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uKClcIiBbdmlzaWJsZV09XCJ0b29sdGlwVmlzaWJsZSgpXCI+PC9heC1jaGFydC10b29sdGlwPlxuPC9kaXY+XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-charts-gauge-chart.mjs","sources":["../tmp-esm2022/gauge-chart/lib/gauge-chart.config.js","../tmp-esm2022/gauge-chart/lib/gauge-chart.component.js","../tmp-esm2022/gauge-chart/acorex-charts-gauge-chart.js"],"sourcesContent":["import { AX_CHART_DEFAULT_MESSAGES } from '@acorex/charts';\nimport { InjectionToken } from '@angular/core';\nexport const AXGaugeChartDefaultConfig = {\n minValue: 0,\n maxValue: 100,\n gaugeWidth: 22,\n cornerRadius: 5,\n showValue: true,\n showTooltip: true,\n showDataLabels: true,\n animationDuration: 750,\n animationEasing: 'cubic-out',\n messages: {\n ...AX_CHART_DEFAULT_MESSAGES,\n noDataIcon: 'fa-light fa-gauge',\n },\n};\nexport const AX_GAUGE_CHART_CONFIG = new InjectionToken('AX_GAUGE_CHART_CONFIG', {\n providedIn: 'root',\n factory: () => AXGaugeChartDefaultConfig,\n});\nexport function gaugeChartConfig(config = {}) {\n return {\n ...AXGaugeChartDefaultConfig,\n ...config,\n messages: {\n ...AXGaugeChartDefaultConfig.messages,\n ...config.messages,\n },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXVCO0lBQzNELFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixVQUFVLEVBQUUsRUFBRTtJQUNkLFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsSUFBSTtJQUNwQixpQkFBaUIsRUFBRSxHQUFHO0lBQ3RCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFFBQVEsRUFBRTtRQUNSLEdBQUcseUJBQXlCO1FBQzVCLFVBQVUsRUFBRSxtQkFBbUI7S0FDaEM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXFCLHVCQUF1QixFQUFFO0lBQ25HLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyx5QkFBeUI7Q0FDekMsQ0FBQyxDQUFDO0FBSUgsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7SUFDbkUsT0FBTztRQUNMLEdBQUcseUJBQXlCO1FBQzVCLEdBQUcsTUFBTTtRQUNULFFBQVEsRUFBRTtZQUNSLEdBQUcseUJBQXlCLENBQUMsUUFBUTtZQUNyQyxHQUFHLE1BQU0sQ0FBQyxRQUFRO1NBQ25CO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTIH0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYR2F1Z2VDaGFydE9wdGlvbiB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbmV4cG9ydCBjb25zdCBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnOiBBWEdhdWdlQ2hhcnRPcHRpb24gPSB7XG4gIG1pblZhbHVlOiAwLFxuICBtYXhWYWx1ZTogMTAwLFxuICBnYXVnZVdpZHRoOiAyMixcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBzaG93VmFsdWU6IHRydWUsXG4gIHNob3dUb29sdGlwOiB0cnVlLFxuICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgYW5pbWF0aW9uRHVyYXRpb246IDc1MCxcbiAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWMtb3V0JyxcbiAgbWVzc2FnZXM6IHtcbiAgICAuLi5BWF9DSEFSVF9ERUZBVUxUX01FU1NBR0VTLFxuICAgIG5vRGF0YUljb246ICdmYS1saWdodCBmYS1nYXVnZScsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgQVhfR0FVR0VfQ0hBUlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPEFYR2F1Z2VDaGFydE9wdGlvbj4oJ0FYX0dBVUdFX0NIQVJUX0NPTkZJRycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiBBWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0gUGFydGlhbDxBWEdhdWdlQ2hhcnRPcHRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F1Z2VDaGFydENvbmZpZyhjb25maWc6IFBhcnRpYWxHYXVnZUNoYXJ0Q29uZmlnID0ge30pOiBBWEdhdWdlQ2hhcnRPcHRpb24ge1xuICByZXR1cm4ge1xuICAgIC4uLkFYR2F1Z2VDaGFydERlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAuLi5BWEdhdWdlQ2hhcnREZWZhdWx0Q29uZmlnLm1lc3NhZ2VzLFxuICAgICAgLi4uY29uZmlnLm1lc3NhZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=","import { AXChartComponent, computeTooltipPosition, createChartInstanceId, formatLargeNumber, getEasingFunction, mergeChartMessages, mergeChartOptions, renderChartEmptyMessage, } from '@acorex/charts';\nimport { AXChartTooltipComponent } from '@acorex/charts/chart-tooltip';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, afterNextRender, computed, effect, inject, input, signal, viewChild, } from '@angular/core';\nimport { AX_GAUGE_CHART_CONFIG } from './gauge-chart.config';\nimport * as i0 from \"@angular/core\";\n/**\n * Gauge Chart Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\nexport class AXGaugeChartComponent extends AXChartComponent {\n // Inputs\n /** Chart value input */\n value = input(0, ...(ngDevMode ? [{ debugName: \"value\" }] : []));\n /** Chart options input */\n options = input({}, ...(ngDevMode ? [{ debugName: \"options\" }] : []));\n // Chart container reference\n chartContainerEl = viewChild.required('chartContainer');\n // SVG element reference (created in the code)\n svgElement = null;\n // D3 reference - loaded asynchronously\n d3;\n // Signals for component state\n _initialized = signal(false, ...(ngDevMode ? [{ debugName: \"_initialized\" }] : []));\n _rendered = signal(false, ...(ngDevMode ? [{ debugName: \"_rendered\" }] : []));\n _prevValue = signal(null, ...(ngDevMode ? [{ debugName: \"_prevValue\" }] : []));\n // Track previous options to detect changes\n _prevOptionsString = '';\n // Cache for container dimensions to avoid repeated DOM reads\n _lastContainerRect = null;\n // Tooltip signals\n _tooltipVisible = signal(false, ...(ngDevMode ? [{ debugName: \"_tooltipVisible\" }] : []));\n _tooltipPosition = signal({ x: 0, y: 0 }, ...(ngDevMode ? [{ debugName: \"_tooltipPosition\" }] : []));\n _tooltipData = signal({\n title: '',\n value: '',\n }, ...(ngDevMode ? [{ debugName: \"_tooltipData\" }] : []));\n _tooltipRafId = null;\n _pendingTooltipCoords = null;\n // Expose tooltip signals as read-only for the template\n tooltipVisible = this._tooltipVisible.asReadonly();\n tooltipPosition = this._tooltipPosition.asReadonly();\n tooltipData = this._tooltipData.asReadonly();\n // Inject configuration\n configToken = inject(AX_GAUGE_CHART_CONFIG);\n // Computed configuration options\n effectiveOptions = computed(() => mergeChartOptions(this.configToken, this.options()), ...(ngDevMode ? [{ debugName: \"effectiveOptions\" }] : []));\n effectiveMessages = computed(() => mergeChartMessages(this.configToken.messages, this.options()?.messages), ...(ngDevMode ? [{ debugName: \"effectiveMessages\" }] : []));\n // Constants\n TOOLTIP_GAP = 10;\n HALF_CIRCLE_RADIANS = Math.PI;\n QUARTER_CIRCLE_RADIANS = Math.PI / 2;\n DEGREES_PER_RADIAN = 180 / Math.PI;\n CHART_EDGE_PADDING = 12;\n TICK_LABEL_CHAR_WIDTH_RATIO = 0.62;\n TICK_LABEL_SIDE_PADDING = 6;\n LABEL_TICK_CLEARANCE = 4;\n MIN_SEGMENT_CHORD_FOR_LABEL = 28;\n MIN_SEGMENT_RING_FOR_LABEL = 14;\n MIN_SEGMENT_LABEL_FONT = 10;\n MAX_SEGMENT_LABEL_FONT = 16;\n instanceId = createChartInstanceId('ax-gauge');\n get bgGradientId() {\n return `${this.instanceId}-bg-gradient`;\n }\n thresholdGradientId(index) {\n return `${this.instanceId}-threshold-gradient-${index}`;\n }\n constructor() {\n super();\n // Dynamically load D3 and initialize the chart when the component is ready\n afterNextRender(() => {\n this._initialized.set(true);\n this.loadD3();\n });\n // Watch for changes to redraw the chart\n effect(() => {\n const currentValue = this.value();\n const options = this.effectiveOptions();\n this._prevValue.set(currentValue);\n if (this._rendered()) {\n const optionsString = JSON.stringify(options);\n if (currentValue == null || !this.svgElement) {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n else if (this._prevOptionsString === optionsString) {\n this.updateValueAndDial(currentValue);\n }\n else {\n this._prevOptionsString = optionsString;\n this.updateChart();\n }\n }\n });\n }\n ngOnDestroy() {\n this.cleanupChart();\n }\n /**\n * Loads D3.js dynamically\n */\n async loadD3() {\n if (this.d3)\n return; // Already loaded\n try {\n this.d3 = await import('d3');\n // If container is ready, create chart\n if (this._initialized() && this.chartContainerEl()) {\n this.createChart();\n this._rendered.set(true);\n }\n }\n catch (error) {\n console.error('Failed to load D3.js:', error);\n }\n }\n /**\n * Creates the gauge chart with all elements\n */\n createChart() {\n const containerElement = this.chartContainerEl().nativeElement;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n containerElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n if (this.value() == null) {\n if (this.d3) {\n const messages = this.effectiveMessages();\n renderChartEmptyMessage(this.d3, containerElement, {\n icon: messages.noDataIcon,\n title: messages.noData,\n help: messages.noDataHelp,\n });\n }\n this._rendered.set(true);\n return;\n }\n const currentValue = this.value();\n // Create SVG element\n this.svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n containerElement.appendChild(this.svgElement);\n // Get current options\n const options = this.effectiveOptions();\n // Store options string for comparison\n this._prevOptionsString = JSON.stringify(options);\n const { minValue, maxValue, showValue, label = '', gaugeWidth, cornerRadius, animationDuration } = options;\n const thresholds = options.thresholds ?? [];\n // Calculate responsive dimensions\n const containerWidth = containerElement.clientWidth;\n const containerHeight = containerElement.clientHeight;\n // Cache container dimensions\n this._lastContainerRect = { width: containerWidth, height: containerHeight };\n // Determine chart dimensions - use options if provided, otherwise use container dimensions\n const width = options.width ?? containerWidth;\n const height = options.height ?? containerHeight;\n // Ensure minimum dimensions\n const effectiveWidth = Math.max(width || 1, 1);\n const effectiveHeight = Math.max(height || 1, 1);\n // For a semi-circular gauge, width should be approximately twice the height\n const size = Math.min(effectiveWidth, effectiveHeight * 2);\n // Calculate margin as percentage of size (5-8% with reasonable bounds)\n const marginRatio = 0.08;\n const margin = Math.max(5, Math.min(size * marginRatio, 30));\n const tickCount = this.getTickCount(size);\n const tickFontPx = this.getTickFontSize(size);\n const maxTickLabelWidth = this.estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx);\n const tickLength = Math.max(4, Math.min((size / 2) * 0.12, 14));\n // Keep labels closer to the gauge arc while preserving readability.\n const labelGap = Math.max(6, Math.min((size / 2) * 0.06, 14));\n const labelOffsetFromTickEnd = labelGap + tickFontPx * 0.35;\n const tickLabelSpace = tickLength + labelOffsetFromTickEnd + tickFontPx;\n const totalVerticalSpace = size / 2 + tickLabelSpace;\n // Labels at edge ticks use start/end anchors, so they can extend by near full width.\n const horizontalPadding = Math.max(18, maxTickLabelWidth + 8);\n const totalWidth = size + horizontalPadding * 2;\n const viewBoxWidth = totalWidth + this.CHART_EDGE_PADDING * 2;\n const viewBoxHeight = totalVerticalSpace + this.CHART_EDGE_PADDING * 2;\n // Set up SVG with responsive viewBox that accounts for overflow\n const svg = this.d3\n .select(this.svgElement)\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('viewBox', `0 0 ${viewBoxWidth} ${viewBoxHeight}`)\n .attr('preserveAspectRatio', 'xMidYMid meet');\n // Create a group for the chart centered horizontally with padding, positioned to show only the top half\n const chartGroup = svg\n .append('g')\n .attr('transform', `translate(${size / 2 + horizontalPadding + this.CHART_EDGE_PADDING}, ${size / 2 - margin + this.CHART_EDGE_PADDING})`);\n // Define gauge parameters\n const radius = size / 2 - margin;\n const desiredGaugeWidth = typeof gaugeWidth === 'number' && !Number.isNaN(gaugeWidth) ? gaugeWidth : 30;\n // Respect explicit gaugeWidth in px with sane absolute bounds.\n const clampedGaugeWidth = Math.max(6, Math.min(desiredGaugeWidth, radius * 0.7));\n const innerRadius = radius - clampedGaugeWidth;\n const outerRadius = radius;\n // Create gradient definitions\n this.createGradients(svg, thresholds);\n // Draw the background arc\n this.drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius);\n // Draw the threshold arcs if thresholds exist\n if (thresholds.length > 0) {\n this.drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius);\n }\n // Draw tick marks\n this.drawTicks(chartGroup, outerRadius, minValue, maxValue, size, tickCount, tickFontPx);\n // Draw the dial/needle with animation\n this.drawDial(chartGroup, radius, currentValue, minValue, maxValue, animationDuration);\n // Draw the value display (after the dial so it's on top)\n if (showValue) {\n this.drawValueDisplay(chartGroup, currentValue, label, radius, size);\n }\n // Hide tooltip initially\n this._tooltipVisible.set(false);\n }\n /**\n * Updates the chart when options change\n */\n updateChart() {\n this.createChart();\n }\n /**\n * Updates only the value display and dial position without recreating the chart\n */\n updateValueAndDial(value) {\n if (!this.svgElement)\n return;\n const options = this.effectiveOptions();\n const minValue = options.minValue;\n const maxValue = options.maxValue;\n const animationDuration = options.animationDuration;\n const easingFunction = getEasingFunction(this.d3, options.animationEasing);\n const currentValue = value;\n const svg = this.d3.select(this.svgElement);\n // Update value text\n svg.select('.gauge-value').text(currentValue.toLocaleString());\n // Update needle position\n const angle = this.scaleValueToAngle(currentValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n svg\n .select('.gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n /**\n * Draw the background arc\n */\n drawBackgroundArc(chartGroup, innerRadius, outerRadius, cornerRadius) {\n // Create arc for the background\n const backgroundArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .startAngle(-this.QUARTER_CIRCLE_RADIANS) // Start from bottom (-90 degrees)\n .endAngle(this.QUARTER_CIRCLE_RADIANS) // End at top (90 degrees)\n .cornerRadius(cornerRadius);\n // Draw background arc\n const backgroundPath = chartGroup\n .append('path')\n .attr('d', backgroundArc)\n .attr('class', 'gauge-arc gauge-base')\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('filter', 'drop-shadow(0px 2px 3px rgba(0,0,0,0.1))');\n // Add tooltip for single arc if no thresholds\n if (!this.effectiveOptions().thresholds || this.effectiveOptions().thresholds.length === 0) {\n backgroundPath\n .style('cursor', 'pointer')\n .on('mouseenter', (event) => {\n if (!this.effectiveOptions().showTooltip)\n return;\n this.showSingleRangeTooltip(event);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n /**\n * Draw the thresholds arcs\n */\n drawThresholds(chartGroup, innerRadius, outerRadius, minValue, maxValue, thresholds, cornerRadius) {\n // Create arc generator\n const arc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98)\n .cornerRadius(cornerRadius);\n // Sort thresholds by value in ascending order (only if needed)\n const sortedThresholds = thresholds.length > 1 ? [...thresholds].sort((a, b) => a.value - b.value) : thresholds;\n // Calculate all angles first using the color angle calculation\n const angles = sortedThresholds.map((t) => this.scaleValueToColorAngle(t.value, minValue, maxValue));\n // Start from the minimum value angle\n let previousEndAngle = this.scaleValueToColorAngle(minValue, minValue, maxValue);\n const labeledSegments = [];\n sortedThresholds.forEach((threshold, i) => {\n const endAngle = angles[i];\n // Skip if end angle is not greater than start angle\n if (endAngle <= previousEndAngle)\n return;\n const startAngle = previousEndAngle;\n const arcPath = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n }))\n .attr('fill', threshold.color || `url(#${this.thresholdGradientId(i)})`)\n .attr('class', 'gauge-arc threshold-arc')\n .attr('data-value', threshold.value)\n .style('cursor', 'pointer');\n if (threshold.label) {\n labeledSegments.push({ startAngle, endAngle, label: threshold.label });\n }\n // Add tooltip interaction\n if (this.effectiveOptions().showTooltip) {\n // Convert angles back to values for tooltip\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = threshold.value;\n arcPath\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, threshold.color, threshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n // Update the previous end angle for the next threshold\n previousEndAngle = endAngle;\n });\n // Draw the last segment if the last threshold is less than the max value\n if (previousEndAngle < this.QUARTER_CIRCLE_RADIANS) {\n const lastArc = chartGroup\n .append('path')\n .attr('d', arc({\n innerRadius,\n outerRadius,\n startAngle: previousEndAngle,\n endAngle: this.QUARTER_CIRCLE_RADIANS,\n }))\n .attr('fill', `url(#${this.bgGradientId})`)\n .attr('class', 'gauge-arc threshold-arc')\n .style('cursor', 'pointer');\n // Add tooltip for the last segment\n if (this.effectiveOptions().showTooltip) {\n const startValue = this.angleToValue(previousEndAngle, minValue, maxValue);\n const endValue = maxValue;\n const lastThreshold = thresholds[thresholds.length - 1];\n lastArc\n .on('mouseenter', (event) => {\n this.showThresholdTooltip(event, startValue, endValue, lastThreshold.color, lastThreshold.label);\n })\n .on('mousemove', (event) => {\n if (this._tooltipVisible()) {\n this.updateTooltipPosition(event);\n }\n })\n .on('mouseleave', () => {\n this.hideTooltip();\n });\n }\n }\n if (this.effectiveOptions().showDataLabels !== false && labeledSegments.length > 0) {\n this.drawSegmentLabels(chartGroup, labeledSegments, innerRadius, outerRadius);\n }\n }\n /**\n * Draws threshold labels centered on each segment arc when space allows.\n */\n drawSegmentLabels(chartGroup, segments, innerRadius, outerRadius) {\n const labelArc = this.d3\n .arc()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius * 0.98);\n const labelGroup = chartGroup.append('g').attr('class', 'gauge-segment-labels');\n const ringWidth = outerRadius - innerRadius;\n const labelRadius = innerRadius + ringWidth / 2;\n const animationDuration = this.effectiveOptions().animationDuration ?? 750;\n segments.forEach((segment) => {\n const angle = segment.endAngle - segment.startAngle;\n const chordLength = 2 * labelRadius * Math.sin(angle / 2);\n const fontSize = this.calculateSegmentLabelFontSize(angle, ringWidth, chordLength);\n if (fontSize <= 0)\n return;\n const availableWidth = chordLength * 0.8;\n const text = this.getFittedSegmentLabel(segment.label, fontSize, availableWidth);\n if (!text)\n return;\n const centroid = labelArc.centroid({\n innerRadius,\n outerRadius: outerRadius * 0.98,\n startAngle: segment.startAngle,\n endAngle: segment.endAngle,\n });\n labelGroup\n .append('text')\n .attr('class', 'gauge-segment-label')\n .attr('transform', `translate(${centroid[0]}, ${centroid[1]})`)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .style('pointer-events', 'none')\n .style('font-size', `${fontSize}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-data-labels-color))')\n .style('opacity', 0)\n .text(text)\n .transition()\n .duration(animationDuration)\n .style('opacity', 1);\n });\n }\n calculateSegmentLabelFontSize(angle, ringWidth, chordLength) {\n if (chordLength < this.MIN_SEGMENT_CHORD_FOR_LABEL || ringWidth < this.MIN_SEGMENT_RING_FOR_LABEL) {\n return 0;\n }\n const ringBasedSize = ringWidth * 0.45;\n const angleScale = Math.min(1, 0.7 + 0.3 * (angle / (this.HALF_CIRCLE_RADIANS / 3)));\n const maxByChord = chordLength / (2 * 0.65);\n const fontSize = Math.min(ringBasedSize * angleScale, maxByChord);\n if (fontSize < this.MIN_SEGMENT_LABEL_FONT)\n return 0;\n return Math.round(Math.max(this.MIN_SEGMENT_LABEL_FONT, Math.min(fontSize, this.MAX_SEGMENT_LABEL_FONT)) * 2) / 2;\n }\n getFittedSegmentLabel(label, fontSize, availableWidth) {\n if (!label)\n return '';\n if (this.doesSegmentLabelFit(label, fontSize, availableWidth))\n return label;\n return this.truncateSegmentLabel(label, fontSize, availableWidth);\n }\n doesSegmentLabelFit(text, fontSize, availableWidth) {\n return text.length * fontSize * 0.65 <= availableWidth;\n }\n truncateSegmentLabel(text, fontSize, availableWidth) {\n const charWidth = fontSize * (fontSize <= 10 ? 0.7 : 0.65);\n const availableForText = availableWidth - fontSize * 0.7;\n if (availableForText <= 0)\n return '';\n const maxChars = Math.floor(availableForText / charWidth);\n if (maxChars <= 0)\n return '';\n if (text.length <= maxChars)\n return text;\n return `${text.substring(0, Math.max(1, maxChars))}…`;\n }\n /**\n * Shows tooltip for a threshold arc\n */\n showThresholdTooltip(event, startValue, endValue, color, label) {\n // Create tooltip data\n this._tooltipData.set({\n title: label || 'Range',\n value: `${startValue.toLocaleString()} - ${endValue.toLocaleString()}`,\n color: color,\n });\n // Show tooltip\n this._tooltipVisible.set(true);\n this.updateTooltipPosition(event);\n }\n /**\n * Shows tooltip for the entire range when no thresholds are defined\n */\n showSingleRangeTooltip(event) {\n const options = this.effectiveOptions();\n if (!options.showTooltip)\n return;\n this.updateTooltipPosition(event);\n this._tooltipData.set({\n title: options.label || 'Range',\n value: `${options.minValue.toLocaleString()} - ${options.maxValue.toLocaleString()}`,\n color: 'rgb(var(--ax-comp-gauge-chart-track-color))',\n });\n this._tooltipVisible.set(true);\n }\n updateTooltipPosition(event) {\n this._pendingTooltipCoords = { x: event.clientX, y: event.clientY };\n if (this._tooltipRafId != null)\n return;\n this._tooltipRafId = requestAnimationFrame(() => {\n this._tooltipRafId = null;\n const coords = this._pendingTooltipCoords;\n if (!coords)\n return;\n const containerEl = this.chartContainerEl()?.nativeElement;\n if (!containerEl)\n return;\n const rect = containerEl.getBoundingClientRect();\n const tooltipEl = containerEl.querySelector('.chart-tooltip');\n const tooltipRect = tooltipEl?.getBoundingClientRect() ?? null;\n const pos = computeTooltipPosition(rect, tooltipRect, coords.x + 10, coords.y - 10, this.TOOLTIP_GAP);\n this._tooltipPosition.set(pos);\n });\n }\n /**\n * Hides the tooltip\n */\n hideTooltip() {\n this._tooltipVisible.set(false);\n }\n /**\n * Cleans up chart resources\n */\n cleanupChart() {\n if (this._tooltipRafId != null) {\n cancelAnimationFrame(this._tooltipRafId);\n this._tooltipRafId = null;\n }\n this._pendingTooltipCoords = null;\n if (this.svgElement) {\n this.svgElement.remove();\n this.svgElement = null;\n }\n this.chartContainerEl()?.nativeElement.querySelectorAll('.ax-chart-empty').forEach((el) => el.remove());\n this._tooltipVisible.set(false);\n this._lastContainerRect = null;\n }\n /**\n * Creates gradient definitions for thresholds\n */\n createGradients(svg, thresholds) {\n const defs = svg.append('defs');\n // Create a radial gradient for the background\n const bgGradient = defs\n .append('radialGradient')\n .attr('id', this.bgGradientId)\n .attr('cx', '50%')\n .attr('cy', '50%')\n .attr('r', '50%')\n .attr('gradientUnits', 'userSpaceOnUse');\n // Get CSS variable for track color\n if (thresholds.length === 0) {\n // Default gradient when no thresholds are provided\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n }\n else {\n bgGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgb(var(--ax-comp-gauge-chart-track-color))');\n bgGradient\n .append('stop')\n .attr('offset', '100%')\n .attr('stop-color', 'rgba(var(--ax-comp-gauge-chart-track-color), 0.8)');\n // Create gradients for each threshold\n thresholds.forEach((threshold, i) => {\n const gradient = defs\n .append('linearGradient')\n .attr('id', this.thresholdGradientId(i))\n .attr('gradientUnits', 'userSpaceOnUse')\n .attr('x1', '-1')\n .attr('y1', '0')\n .attr('x2', '1')\n .attr('y2', '0');\n gradient\n .append('stop')\n .attr('offset', '0%')\n .attr('stop-color', this.d3.color(threshold.color)?.brighter(0.5).toString() || threshold.color);\n gradient.append('stop').attr('offset', '100%').attr('stop-color', threshold.color);\n });\n }\n }\n /**\n * Draws tick marks and labels around the gauge\n */\n drawTicks(chartGroup, radius, minValue, maxValue, size, tickCount, tickFontPx) {\n const tickLength = Math.max(4, Math.min(radius * 0.12, 14));\n const baseLabelOffset = this.getBaseLabelOffset(radius, tickLength, tickFontPx);\n const tickGroup = chartGroup.append('g').attr('class', 'ticks');\n const tickValues = [];\n const step = (maxValue - minValue) / (tickCount - 1);\n for (let i = 0; i < tickCount; i++) {\n tickValues.push(minValue + i * step);\n }\n const tickMetrics = tickValues.map((tick) => {\n const angle = this.scaleValueToAngle(tick, minValue, maxValue);\n const radians = angle - this.QUARTER_CIRCLE_RADIANS;\n return {\n radians,\n cos: Math.cos(radians),\n sin: Math.sin(radians),\n label: this.formatTickValue(tick, minValue, maxValue),\n };\n });\n tickMetrics.forEach((metric) => {\n tickGroup\n .append('line')\n .attr('x1', metric.cos * (radius + 5))\n .attr('y1', metric.sin * (radius + 5))\n .attr('x2', metric.cos * (radius + tickLength))\n .attr('y2', metric.sin * (radius + tickLength))\n .attr('stroke', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.5)')\n .attr('stroke-width', 2);\n });\n const textSelection = tickGroup\n .selectAll('text.gauge-tick-label')\n .data(tickMetrics)\n .enter()\n .append('text')\n .attr('class', 'gauge-tick-label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('fill', 'rgba(var(--ax-comp-gauge-chart-text-color), 0.7)')\n .style('font-size', `${tickFontPx}px`)\n .text((d) => d.label);\n textSelection.each((d, index, nodes) => {\n const node = nodes[index];\n let bboxWidth = this.estimateLabelWidth(d.label, tickFontPx);\n let bboxHeight = tickFontPx;\n try {\n const bbox = node.getBBox();\n if (bbox.width > 0)\n bboxWidth = bbox.width;\n if (bbox.height > 0)\n bboxHeight = bbox.height;\n }\n catch {\n // Keep fallback estimates.\n }\n const anchor = this.getTickLabelAnchor(d.cos);\n const nearEdgeExtent = this.getNearEdgeProjection(anchor, d.cos, d.sin, bboxWidth, bboxHeight);\n const requiredOffset = tickLength + this.LABEL_TICK_CLEARANCE + nearEdgeExtent;\n const effectiveLabelOffset = Math.max(baseLabelOffset, requiredOffset);\n const nudge = tickFontPx * 0.1;\n const x = d.cos * (radius + effectiveLabelOffset) + (anchor === 'start' ? nudge : anchor === 'end' ? -nudge : 0);\n const y = d.sin * (radius + effectiveLabelOffset);\n this.d3.select(node).attr('x', x).attr('y', y).attr('text-anchor', anchor).attr('dominant-baseline', 'middle');\n });\n }\n getTickCount(size) {\n if (size < 200)\n return 3;\n if (size < 300)\n return 4;\n if (size < 400)\n return 5;\n if (size > 520)\n return 7;\n return 5;\n }\n getTickFontSize(size) {\n return Math.max(14, Math.min(18, Math.floor(size / 35)));\n }\n getBaseLabelOffset(radius, tickLength, tickFontPx) {\n const labelGap = Math.max(6, Math.min(radius * 0.06, 14));\n return tickLength + labelGap + tickFontPx * 0.2;\n }\n getTickLabelAnchor(cosValue) {\n if (cosValue > 0.35)\n return 'start';\n if (cosValue < -0.35)\n return 'end';\n return 'middle';\n }\n getNearEdgeProjection(anchor, cosValue, sinValue, bboxWidth, bboxHeight) {\n const absCos = Math.abs(cosValue);\n const absSin = Math.abs(sinValue);\n const halfHeightProjection = absSin * (bboxHeight / 2);\n // For start/end anchored labels on edge ticks, the nearest side is close to the anchor point.\n if (anchor === 'start' || anchor === 'end') {\n return halfHeightProjection + absCos * this.TICK_LABEL_SIDE_PADDING;\n }\n // For centered labels, nearest side includes half text width projection.\n return absCos * (bboxWidth / 2) + halfHeightProjection;\n }\n formatTickValue(tick, minValue, maxValue) {\n const valueRange = maxValue - minValue;\n if (valueRange <= 10) {\n return tick.toFixed(2).replace(/\\.?0+$/, '');\n }\n if (valueRange < 1000) {\n return tick % 1 === 0 ? tick.toString() : tick.toFixed(1);\n }\n return formatLargeNumber(Math.round(tick));\n }\n estimateLabelWidth(label, tickFontPx) {\n return label.length * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n estimateMaxTickLabelWidth(tickCount, minValue, maxValue, tickFontPx) {\n if (tickCount <= 1)\n return tickFontPx;\n const step = (maxValue - minValue) / (tickCount - 1);\n let maxChars = 0;\n for (let i = 0; i < tickCount; i++) {\n const label = this.formatTickValue(minValue + i * step, minValue, maxValue);\n maxChars = Math.max(maxChars, label.length);\n }\n return maxChars * tickFontPx * this.TICK_LABEL_CHAR_WIDTH_RATIO + this.TICK_LABEL_SIDE_PADDING;\n }\n /**\n * Draws the value and label text in the center\n */\n drawValueDisplay(chartGroup, value, label, radius, size) {\n // Px-based scaling for robust small/large sizes with better small-size handling\n const valueFontPx = Math.max(18, Math.min(32, Math.floor(size / 8)));\n const labelFontPx = Math.max(10, Math.min(16, Math.floor(valueFontPx * 0.55)));\n // More vertical gap for small sizes: use larger base value\n const verticalGap = Math.max(6, Math.min(12, Math.floor(size / 40)));\n // Create group for the value display\n const valueGroup = chartGroup.append('g').attr('class', 'gauge-value-display').attr('text-anchor', 'middle');\n // Add value display\n valueGroup\n .append('text')\n .attr('class', 'gauge-value')\n .attr('x', 0)\n .attr('y', radius * 0.15 + valueFontPx)\n .style('font-size', `${valueFontPx}px`)\n .style('font-weight', '600')\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .text(value.toLocaleString());\n // Add label display (if provided)\n if (label) {\n valueGroup\n .append('text')\n .attr('class', 'gauge-label')\n .attr('x', 0)\n .attr('y', radius * 0.24 + valueFontPx + verticalGap)\n .style('font-size', `${labelFontPx}px`)\n .style('fill', 'rgb(var(--ax-comp-gauge-chart-text-color))')\n .style('opacity', '0.8')\n .text(label);\n }\n }\n /**\n * Draws the dial/needle pointing to the current value with animation\n */\n drawDial(chartGroup, radius, value, minValue, maxValue, animationDuration) {\n // Clamp value to min/max range\n const clampedValue = Math.max(minValue, Math.min(maxValue, value));\n // Calculate angle for needle based on value\n const angle = this.scaleValueToAngle(clampedValue, minValue, maxValue);\n const angleInDegrees = this.radiansToDegrees(angle - this.QUARTER_CIRCLE_RADIANS);\n // Create a group for the needle\n const dialGroup = chartGroup.append('g').attr('class', 'dial');\n // Draw the needle with initial position at minimum value\n const needlePath = dialGroup\n .append('path')\n .attr('d', this.createNeedlePath(radius))\n .attr('class', 'gauge-needle')\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('transform', `rotate(${this.radiansToDegrees(-this.HALF_CIRCLE_RADIANS)})`); // Start at -180 degrees (left)\n // Add a center circle\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.08)\n .attr('fill', 'rgb(var(--ax-comp-gauge-chart-needle-color))')\n .attr('stroke', '#fff')\n .attr('stroke-width', 2);\n // Add a smaller white center\n dialGroup\n .append('circle')\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', radius * 0.03)\n .attr('fill', '#fff');\n // Get easing function\n const easingFunction = getEasingFunction(this.d3, this.options()?.animationEasing);\n // Animate the needle from min to current value\n needlePath\n .transition()\n .duration(animationDuration)\n .ease(easingFunction)\n .attr('transform', `rotate(${angleInDegrees})`);\n }\n // getEasingFunction moved to shared chart utils\n /**\n * Creates a path string for the needle\n */\n createNeedlePath(radius) {\n const needleLength = radius * 0.8;\n const needleWidth = radius * 0.06;\n return `M 0,${needleWidth / 2} L ${needleLength},0 L 0,${-needleWidth / 2} Z`;\n }\n /**\n * Scales a value to an angle (in radians)\n */\n scaleValueToAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Scales a value to an angle for color arcs (in radians)\n */\n scaleValueToColorAngle(value, min, max) {\n const valueRange = max - min || 1;\n return ((value - min) / valueRange) * this.HALF_CIRCLE_RADIANS - this.QUARTER_CIRCLE_RADIANS;\n }\n /**\n * Converts an angle back to a value\n */\n angleToValue(angle, min, max) {\n const valueRange = max - min || 1;\n return min + ((angle + this.QUARTER_CIRCLE_RADIANS) / this.HALF_CIRCLE_RADIANS) * valueRange;\n }\n /**\n * Converts radians to degrees\n */\n radiansToDegrees(radians) {\n return radians * this.DEGREES_PER_RADIAN;\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.2.0\", version: \"20.3.3\", type: AXGaugeChartComponent, isStandalone: true, selector: \"ax-gauge-chart\", inputs: { value: { classPropertyName: \"value\", publicName: \"value\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"chartContainerEl\", first: true, predicate: [\"chartContainer\"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"], dependencies: [{ kind: \"component\", type: AXChartTooltipComponent, selector: \"ax-chart-tooltip\", inputs: [\"data\", \"position\", \"visible\", \"showPercentage\", \"style\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.3\", ngImport: i0, type: AXGaugeChartComponent, decorators: [{\n type: Component,\n args: [{ selector: 'ax-gauge-chart', encapsulation: ViewEncapsulation.None, imports: [AXChartTooltipComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"ax-gauge-chart\\\" role=\\\"img\\\" #chartContainer>\\n <ax-chart-tooltip [data]=\\\"tooltipData()\\\" [position]=\\\"tooltipPosition()\\\" [visible]=\\\"tooltipVisible()\\\"></ax-chart-tooltip>\\n</div>\\n\", styles: [\".ax-chart-empty{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:1rem;pointer-events:none}.ax-chart-empty__card{text-align:center;padding:1.5rem;border-radius:.5rem;border:1px solid rgba(var(--ax-sys-color-surface));width:80%;max-width:300px;box-sizing:border-box}.ax-chart-empty__icon{opacity:.6;margin-bottom:.75rem}.ax-chart-empty__title{font-size:1rem;font-weight:600;margin-bottom:.5rem}.ax-chart-empty__help{font-size:.8rem;opacity:.6}ax-gauge-chart{display:block;width:100%;height:100%;min-height:clamp(220px,38vw,360px);box-sizing:border-box;--ax-comp-gauge-chart-bg-color: 0, 0, 0, 0;--ax-comp-gauge-chart-text-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-data-labels-color: var(--ax-sys-color-on-lightest-surface);--ax-comp-gauge-chart-track-color: var(--ax-sys-color-dark-surface);--ax-comp-gauge-chart-needle-color: var(--ax-sys-color-primary-500)}ax-gauge-chart .ax-gauge-chart{position:relative;width:100%;height:100%;min-height:0;box-sizing:border-box;padding:clamp(.5rem,1.2vw,.875rem);overflow:hidden;color:rgb(var(--ax-comp-gauge-chart-text-color));background-color:rgba(var(--ax-comp-gauge-chart-bg-color));border-radius:.5rem}ax-gauge-chart .ax-gauge-chart svg{display:block;width:100%;height:100%;max-width:100%;max-height:100%;overflow:hidden}ax-gauge-chart .ax-gauge-chart svg g:has(text){font-family:inherit}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2hhcnRzL2dhdWdlLWNoYXJ0L3NyYy9saWIvZ2F1Z2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsdUJBQXVCLEVBQXNCLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHN0Q7OztHQUdHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGdCQUFnQjtJQUN6RCxTQUFTO0lBQ1Qsd0JBQXdCO0lBQ3hCLEtBQUssR0FBRyxLQUFLLENBQW9CLENBQUMsaURBQUMsQ0FBQztJQUVwQywwQkFBMEI7SUFDMUIsT0FBTyxHQUFHLEtBQUssQ0FBcUIsRUFBRSxtREFBQyxDQUFDO0lBRXhDLDRCQUE0QjtJQUNYLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLGdCQUFnQixDQUFDLENBQUM7SUFFckcsOENBQThDO0lBQ3RDLFVBQVUsR0FBeUIsSUFBSSxD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QUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQVhDaGFydENvbXBvbmVudCxcbiAgQVhDaGFydENvbXBvbmVudEJhc2UsXG4gIGNvbXB1dGVUb29sdGlwUG9zaXRpb24sXG4gIGNyZWF0ZUNoYXJ0SW5zdGFuY2VJZCxcbiAgZm9ybWF0TGFyZ2VOdW1iZXIsXG4gIGdldEVhc2luZ0Z1bmN0aW9uLFxuICBtZXJnZUNoYXJ0TWVzc2FnZXMsXG4gIG1lcmdlQ2hhcnRPcHRpb25zLFxuICByZW5kZXJDaGFydEVtcHR5TWVzc2FnZSxcbn0gZnJvbSAnQGFjb3JleC9jaGFydHMnO1xuaW1wb3J0IHsgQVhDaGFydFRvb2x0aXBDb21wb25lbnQsIEFYQ2hhcnRUb29sdGlwRGF0YSB9IGZyb20gJ0BhY29yZXgvY2hhcnRzL2NoYXJ0LXRvb2x0aXAnO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgQVhfR0FVR0VfQ0hBUlRfQ09ORklHIH0gZnJvbSAnLi9nYXVnZS1jaGFydC5jb25maWcnO1xuaW1wb3J0IHsgQVhHYXVnZUNoYXJ0T3B0aW9uLCBBWEdhdWdlQ2hhcnRWYWx1ZSB9IGZyb20gJy4vZ2F1Z2UtY2hhcnQudHlwZSc7XG5cbi8qKlxuICogR2F1Z2UgQ2hhcnQgQ29tcG9uZW50XG4gKiBSZW5kZXJzIGEgc2VtaS1jaXJjdWxhciBnYXVnZSBjaGFydCB3aXRoIGFuaW1hdGVkIG5lZWRsZSBhbmQgdGhyZXNob2xkc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC1nYXVnZS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYXVnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhdWdlLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtBWENoYXJ0VG9vbHRpcENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBWEdhdWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBBWENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBWENoYXJ0Q29tcG9uZW50QmFzZSB7XG4gIC8vIElucHV0c1xuICAvKiogQ2hhcnQgdmFsdWUgaW5wdXQgKi9cbiAgdmFsdWUgPSBpbnB1dDxBWEdhdWdlQ2hhcnRWYWx1ZT4oMCk7XG5cbiAgLyoqIENoYXJ0IG9wdGlvbnMgaW5wdXQgKi9cbiAgb3B0aW9ucyA9IGlucHV0PEFYR2F1Z2VDaGFydE9wdGlvbj4oe30pO1xuXG4gIC8vIENoYXJ0IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydENvbnRhaW5lckVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY2hhcnRDb250YWluZXInKTtcblxuICAvLyBTVkcgZWxlbWVudCByZWZlcmVuY2UgKGNyZWF0ZWQgaW4gdGhlIGNvZGUpXG4gIHByaXZhdGUgc3ZnRWxlbWVudDogU1ZHU1ZHRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEQzIHJlZmVyZW5jZSAtIGxvYWRlZCBhc3luY2hyb25vdXNseVxuICBwcm90ZWN0ZWQgZDMhOiB0eXBlb2YgaW1wb3J0KCdkMycpO1xuXG4gIC8vIFNpZ25hbHMgZm9yIGNvbXBvbmVudCBzdGF0ZVxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX3JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBfcHJldlZhbHVlID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRyYWNrIHByZXZpb3VzIG9wdGlvbnMgdG8gZGV0ZWN0IGNoYW5nZXNcbiAgcHJpdmF0ZSBfcHJldk9wdGlvbnNTdHJpbmcgPSAnJztcblxuICAvLyBDYWNoZSBmb3IgY29udGFpbmVyIGRpbWVuc2lvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgRE9NIHJlYWRzXG4gIHByaXZhdGUgX2xhc3RDb250YWluZXJSZWN0OiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICAvLyBUb29sdGlwIHNpZ25hbHNcbiAgcHJpdmF0ZSBfdG9vbHRpcFZpc2libGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIF90b29sdGlwUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBwcml2YXRlIF90b29sdGlwRGF0YSA9IHNpZ25hbDxBWENoYXJ0VG9vbHRpcERhdGE+KHtcbiAgICB0aXRsZTogJycsXG4gICAgdmFsdWU6ICcnLFxuICB9KTtcbiAgcHJpdmF0ZSBfdG9vbHRpcFJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcGVuZGluZ1Rvb2x0aXBDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEV4cG9zZSB0b29sdGlwIHNpZ25hbHMgYXMgcmVhZC1vbmx5IGZvciB0aGUgdGVtcGxhdGVcbiAgcHJvdGVjdGVkIHRvb2x0aXBWaXNpYmxlID0gdGhpcy5fdG9vbHRpcFZpc2libGUuYXNSZWFkb25seSgpO1xuICBwcm90ZWN0ZWQgdG9vbHRpcFBvc2l0aW9uID0gdGhpcy5fdG9vbHRpcFBvc2l0aW9uLmFzUmVhZG9ubHkoKTtcbiAgcHJvdGVjdGVkIHRvb2x0aXBEYXRhID0gdGhpcy5fdG9vbHRpcERhdGEuYXNSZWFkb25seSgpO1xuXG4gIC8vIEluamVjdCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnVG9rZW4gPSBpbmplY3QoQVhfR0FVR0VfQ0hBUlRfQ09ORklHKTtcblxuICAvLyBDb21wdXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgcHJvdGVjdGVkIGVmZmVjdGl2ZU9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiBtZXJnZUNoYXJ0T3B0aW9ucyh0aGlzLmNvbmZpZ1Rva2VuLCB0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByb3RlY3RlZCBlZmZlY3RpdmVNZXNzYWdlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgbWVyZ2VDaGFydE1lc3NhZ2VzKHRoaXMuY29uZmlnVG9rZW4ubWVzc2FnZXMsIHRoaXMub3B0aW9ucygpPy5tZXNzYWdlcyksXG4gICk7XG5cbiAgLy8gQ29uc3RhbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgVE9PTFRJUF9HQVAgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBIQUxGX0NJUkNMRV9SQURJQU5TID0gTWF0aC5QSTtcbiAgcHJpdmF0ZSByZWFkb25seSBRVUFSVEVSX0NJUkNMRV9SQURJQU5TID0gTWF0aC5QSSAvIDI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVHUkVFU19QRVJfUkFESUFOID0gMTgwIC8gTWF0aC5QSTtcbiAgcHJpdmF0ZSByZWFkb25seSBDSEFSVF9FREdFX1BBRERJTkcgPSAxMjtcbiAgcHJpdmF0ZSByZWFkb25seSBUSUNLX0xBQkVMX0NIQVJfV0lEVEhfUkFUSU8gPSAwLjYyO1xuICBwcml2YXRlIHJlYWRvbmx5IFRJQ0tfTEFCRUxfU0lERV9QQURESU5HID0gNjtcbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9USUNLX0NMRUFSQU5DRSA9IDQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1NFR01FTlRfQ0hPUkRfRk9SX0xBQkVMID0gMjg7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX1NFR01FTlRfUklOR19GT1JfTEFCRUwgPSAxNDtcbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fU0VHTUVOVF9MQUJFTF9GT05UID0gMTA7XG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX1NFR01FTlRfTEFCRUxfRk9OVCA9IDE2O1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBjcmVhdGVDaGFydEluc3RhbmNlSWQoJ2F4LWdhdWdlJyk7XG5cbiAgcHJpdmF0ZSBnZXQgYmdHcmFkaWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaW5zdGFuY2VJZH0tYmctZ3JhZGllbnRgO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJlc2hvbGRHcmFkaWVudElkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluc3RhbmNlSWR9LXRocmVzaG9sZC1ncmFkaWVudC0ke2luZGV4fWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgRDMgYW5kIGluaXRpYWxpemUgdGhlIGNoYXJ0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmxvYWREMygpO1xuICAgIH0pO1xuXG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgdG8gcmVkcmF3IHRoZSBjaGFydFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcmV2VmFsdWUuc2V0KGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlZCgpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsIHx8ICF0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3ByZXZPcHRpb25zU3RyaW5nID09PSBvcHRpb25zU3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZERpYWwoY3VycmVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmc7XG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIEQzLmpzIGR5bmFtaWNhbGx5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZEQzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmQzKSByZXR1cm47IC8vIEFscmVhZHkgbG9hZGVkXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5kMyA9IGF3YWl0IGltcG9ydCgnZDMnKTtcbiAgICAgIC8vIElmIGNvbnRhaW5lciBpcyByZWFkeSwgY3JlYXRlIGNoYXJ0XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQoKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXJ0KCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgRDMuanM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBnYXVnZSBjaGFydCB3aXRoIGFsbCBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmNoYXJ0Q29udGFpbmVyRWwoKS5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMuc3ZnRWxlbWVudCkge1xuICAgICAgdGhpcy5zdmdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtY2hhcnQtZW1wdHknKS5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuXG4gICAgaWYgKHRoaXMudmFsdWUoKSA9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kMykge1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZWZmZWN0aXZlTWVzc2FnZXMoKTtcbiAgICAgICAgcmVuZGVyQ2hhcnRFbXB0eU1lc3NhZ2UodGhpcy5kMywgY29udGFpbmVyRWxlbWVudCwge1xuICAgICAgICAgIGljb246IG1lc3NhZ2VzLm5vRGF0YUljb24sXG4gICAgICAgICAgdGl0bGU6IG1lc3NhZ2VzLm5vRGF0YSxcbiAgICAgICAgICBoZWxwOiBtZXNzYWdlcy5ub0RhdGFIZWxwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlcmVkLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlKCkgYXMgbnVtYmVyO1xuXG4gICAgLy8gQ3JlYXRlIFNWRyBlbGVtZW50XG4gICAgdGhpcy5zdmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3ZnRWxlbWVudCk7XG5cbiAgICAvLyBHZXQgY3VycmVudCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuXG4gICAgLy8gU3RvcmUgb3B0aW9ucyBzdHJpbmcgZm9yIGNvbXBhcmlzb25cbiAgICB0aGlzLl9wcmV2T3B0aW9uc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyBtaW5WYWx1ZSwgbWF4VmFsdWUsIHNob3dWYWx1ZSwgbGFiZWwgPSAnJywgZ2F1Z2VXaWR0aCwgY29ybmVyUmFkaXVzLCBhbmltYXRpb25EdXJhdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0aHJlc2hvbGRzID0gb3B0aW9ucy50aHJlc2hvbGRzID8/IFtdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlc3BvbnNpdmUgZGltZW5zaW9uc1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIC8vIENhY2hlIGNvbnRhaW5lciBkaW1lbnNpb25zXG4gICAgdGhpcy5fbGFzdENvbnRhaW5lclJlY3QgPSB7IHdpZHRoOiBjb250YWluZXJXaWR0aCwgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgfTtcblxuICAgIC8vIERldGVybWluZSBjaGFydCBkaW1lbnNpb25zIC0gdXNlIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgY29udGFpbmVyIGRpbWVuc2lvbnNcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPz8gY29udGFpbmVyV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgPz8gY29udGFpbmVySGVpZ2h0O1xuXG4gICAgLy8gRW5zdXJlIG1pbmltdW0gZGltZW5zaW9uc1xuICAgIGNvbnN0IGVmZmVjdGl2ZVdpZHRoID0gTWF0aC5tYXgod2lkdGggfHwgMSwgMSk7XG4gICAgY29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0IHx8IDEsIDEpO1xuXG4gICAgLy8gRm9yIGEgc2VtaS1jaXJjdWxhciBnYXVnZSwgd2lkdGggc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgdHdpY2UgdGhlIGhlaWdodFxuICAgIGNvbnN0IHNpemUgPSBNYXRoLm1pbihlZmZlY3RpdmVXaWR0aCwgZWZmZWN0aXZlSGVpZ2h0ICogMik7XG5cbiAgICAvLyBDYWxjdWxhdGUgbWFyZ2luIGFzIHBlcmNlbnRhZ2Ugb2Ygc2l6ZSAoNS04JSB3aXRoIHJlYXNvbmFibGUgYm91bmRzKVxuICAgIGNvbnN0IG1hcmdpblJhdGlvID0gMC4wODtcbiAgICBjb25zdCBtYXJnaW4gPSBNYXRoLm1heCg1LCBNYXRoLm1pbihzaXplICogbWFyZ2luUmF0aW8sIDMwKSk7XG5cbiAgICBjb25zdCB0aWNrQ291bnQgPSB0aGlzLmdldFRpY2tDb3VudChzaXplKTtcbiAgICBjb25zdCB0aWNrRm9udFB4ID0gdGhpcy5nZXRUaWNrRm9udFNpemUoc2l6ZSk7XG4gICAgY29uc3QgbWF4VGlja0xhYmVsV2lkdGggPSB0aGlzLmVzdGltYXRlTWF4VGlja0xhYmVsV2lkdGgodGlja0NvdW50LCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRpY2tGb250UHgpO1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbigoc2l6ZSAvIDIpICogMC4xMiwgMTQpKTtcbiAgICAvLyBLZWVwIGxhYmVscyBjbG9zZXIgdG8gdGhlIGdhdWdlIGFyYyB3aGlsZSBwcmVzZXJ2aW5nIHJlYWRhYmlsaXR5LlxuICAgIGNvbnN0IGxhYmVsR2FwID0gTWF0aC5tYXgoNiwgTWF0aC5taW4oKHNpemUgLyAyKSAqIDAuMDYsIDE0KSk7XG4gICAgY29uc3QgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCA9IGxhYmVsR2FwICsgdGlja0ZvbnRQeCAqIDAuMzU7XG4gICAgY29uc3QgdGlja0xhYmVsU3BhY2UgPSB0aWNrTGVuZ3RoICsgbGFiZWxPZmZzZXRGcm9tVGlja0VuZCArIHRpY2tGb250UHg7XG4gICAgY29uc3QgdG90YWxWZXJ0aWNhbFNwYWNlID0gc2l6ZSAvIDIgKyB0aWNrTGFiZWxTcGFjZTtcblxuICAgIC8vIExhYmVscyBhdCBlZGdlIHRpY2tzIHVzZSBzdGFydC9lbmQgYW5jaG9ycywgc28gdGhleSBjYW4gZXh0ZW5kIGJ5IG5lYXIgZnVsbCB3aWR0aC5cbiAgICBjb25zdCBob3Jpem9udGFsUGFkZGluZyA9IE1hdGgubWF4KDE4LCBtYXhUaWNrTGFiZWxXaWR0aCArIDgpO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBzaXplICsgaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuICAgIGNvbnN0IHZpZXdCb3hXaWR0aCA9IHRvdGFsV2lkdGggKyB0aGlzLkNIQVJUX0VER0VfUEFERElORyAqIDI7XG4gICAgY29uc3Qgdmlld0JveEhlaWdodCA9IHRvdGFsVmVydGljYWxTcGFjZSArIHRoaXMuQ0hBUlRfRURHRV9QQURESU5HICogMjtcblxuICAgIC8vIFNldCB1cCBTVkcgd2l0aCByZXNwb25zaXZlIHZpZXdCb3ggdGhhdCBhY2NvdW50cyBmb3Igb3ZlcmZsb3dcbiAgICBjb25zdCBzdmcgPSB0aGlzLmQzXG4gICAgICAuc2VsZWN0KHRoaXMuc3ZnRWxlbWVudClcbiAgICAgIC5hdHRyKCd3aWR0aCcsICcxMDAlJylcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCAnMTAwJScpXG4gICAgICAuYXR0cigndmlld0JveCcsIGAwIDAgJHt2aWV3Qm94V2lkdGh9ICR7dmlld0JveEhlaWdodH1gKVxuICAgICAgLmF0dHIoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBjaGFydCBjZW50ZXJlZCBob3Jpem9udGFsbHkgd2l0aCBwYWRkaW5nLCBwb3NpdGlvbmVkIHRvIHNob3cgb25seSB0aGUgdG9wIGhhbGZcbiAgICBjb25zdCBjaGFydEdyb3VwID0gc3ZnXG4gICAgICAuYXBwZW5kKCdnJylcbiAgICAgIC5hdHRyKFxuICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgYHRyYW5zbGF0ZSgke3NpemUgLyAyICsgaG9yaXpvbnRhbFBhZGRpbmcgKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30sICR7c2l6ZSAvIDIgLSBtYXJnaW4gKyB0aGlzLkNIQVJUX0VER0VfUEFERElOR30pYCxcbiAgICAgICk7XG5cbiAgICAvLyBEZWZpbmUgZ2F1Z2UgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyIC0gbWFyZ2luO1xuICAgIGNvbnN0IGRlc2lyZWRHYXVnZVdpZHRoID0gdHlwZW9mIGdhdWdlV2lkdGggPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4oZ2F1Z2VXaWR0aCkgPyBnYXVnZVdpZHRoIDogMzA7XG4gICAgLy8gUmVzcGVjdCBleHBsaWNpdCBnYXVnZVdpZHRoIGluIHB4IHdpdGggc2FuZSBhYnNvbHV0ZSBib3VuZHMuXG4gICAgY29uc3QgY2xhbXBlZEdhdWdlV2lkdGggPSBNYXRoLm1heCg2LCBNYXRoLm1pbihkZXNpcmVkR2F1Z2VXaWR0aCwgcmFkaXVzICogMC43KSk7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSByYWRpdXMgLSBjbGFtcGVkR2F1Z2VXaWR0aDtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHJhZGl1cztcblxuICAgIC8vIENyZWF0ZSBncmFkaWVudCBkZWZpbml0aW9uc1xuICAgIHRoaXMuY3JlYXRlR3JhZGllbnRzKHN2ZywgdGhyZXNob2xkcyk7XG5cbiAgICAvLyBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgIHRoaXMuZHJhd0JhY2tncm91bmRBcmMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgLy8gRHJhdyB0aGUgdGhyZXNob2xkIGFyY3MgaWYgdGhyZXNob2xkcyBleGlzdFxuICAgIGlmICh0aHJlc2hvbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZHJhd1RocmVzaG9sZHMoY2hhcnRHcm91cCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBtaW5WYWx1ZSwgbWF4VmFsdWUsIHRocmVzaG9sZHMsIGNvcm5lclJhZGl1cyk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyB0aWNrIG1hcmtzXG4gICAgdGhpcy5kcmF3VGlja3MoY2hhcnRHcm91cCwgb3V0ZXJSYWRpdXMsIG1pblZhbHVlLCBtYXhWYWx1ZSwgc2l6ZSwgdGlja0NvdW50LCB0aWNrRm9udFB4KTtcblxuICAgIC8vIERyYXcgdGhlIGRpYWwvbmVlZGxlIHdpdGggYW5pbWF0aW9uXG4gICAgdGhpcy5kcmF3RGlhbChjaGFydEdyb3VwLCByYWRpdXMsIGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlLCBhbmltYXRpb25EdXJhdGlvbik7XG5cbiAgICAvLyBEcmF3IHRoZSB2YWx1ZSBkaXNwbGF5IChhZnRlciB0aGUgZGlhbCBzbyBpdCdzIG9uIHRvcClcbiAgICBpZiAoc2hvd1ZhbHVlKSB7XG4gICAgICB0aGlzLmRyYXdWYWx1ZURpc3BsYXkoY2hhcnRHcm91cCwgY3VycmVudFZhbHVlLCBsYWJlbCwgcmFkaXVzLCBzaXplKTtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgaW5pdGlhbGx5XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjaGFydCB3aGVuIG9wdGlvbnMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb25seSB0aGUgdmFsdWUgZGlzcGxheSBhbmQgZGlhbCBwb3NpdGlvbiB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIGNoYXJ0XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVBbmREaWFsKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpO1xuICAgIGNvbnN0IG1pblZhbHVlID0gb3B0aW9ucy5taW5WYWx1ZTtcbiAgICBjb25zdCBtYXhWYWx1ZSA9IG9wdGlvbnMubWF4VmFsdWU7XG4gICAgY29uc3QgYW5pbWF0aW9uRHVyYXRpb24gPSBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gZ2V0RWFzaW5nRnVuY3Rpb24odGhpcy5kMywgb3B0aW9ucy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5kMy5zZWxlY3QodGhpcy5zdmdFbGVtZW50KTtcblxuICAgIC8vIFVwZGF0ZSB2YWx1ZSB0ZXh0XG4gICAgc3ZnLnNlbGVjdCgnLmdhdWdlLXZhbHVlJykudGV4dChjdXJyZW50VmFsdWUudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICAvLyBVcGRhdGUgbmVlZGxlIHBvc2l0aW9uXG4gICAgY29uc3QgYW5nbGUgPSB0aGlzLnNjYWxlVmFsdWVUb0FuZ2xlKGN1cnJlbnRWYWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBhbmdsZUluRGVncmVlcyA9IHRoaXMucmFkaWFuc1RvRGVncmVlcyhhbmdsZSAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3QoJy5nYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGFuaW1hdGlvbkR1cmF0aW9uKVxuICAgICAgLmVhc2UoZWFzaW5nRnVuY3Rpb24pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlSW5EZWdyZWVzfSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IHRoZSBiYWNrZ3JvdW5kIGFyY1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3QmFja2dyb3VuZEFyYyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIGNvcm5lclJhZGl1czogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYXJjIGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJhY2tncm91bmRBcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cylcbiAgICAgIC5zdGFydEFuZ2xlKC10aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIFN0YXJ0IGZyb20gYm90dG9tICgtOTAgZGVncmVlcylcbiAgICAgIC5lbmRBbmdsZSh0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpIC8vIEVuZCBhdCB0b3AgKDkwIGRlZ3JlZXMpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBEcmF3IGJhY2tncm91bmQgYXJjXG4gICAgY29uc3QgYmFja2dyb3VuZFBhdGggPSBjaGFydEdyb3VwXG4gICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgIC5hdHRyKCdkJywgYmFja2dyb3VuZEFyYylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1hcmMgZ2F1Z2UtYmFzZScpXG4gICAgICAuYXR0cignZmlsbCcsIGB1cmwoIyR7dGhpcy5iZ0dyYWRpZW50SWR9KWApXG4gICAgICAuYXR0cignZmlsdGVyJywgJ2Ryb3Atc2hhZG93KDBweCAycHggM3B4IHJnYmEoMCwwLDAsMC4xKSknKTtcblxuICAgIC8vIEFkZCB0b29sdGlwIGZvciBzaW5nbGUgYXJjIGlmIG5vIHRocmVzaG9sZHNcbiAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnRocmVzaG9sZHMgfHwgdGhpcy5lZmZlY3RpdmVPcHRpb25zKCkudGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJhY2tncm91bmRQYXRoXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKVxuICAgICAgICAub24oJ21vdXNlZW50ZXInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5zaG93U2luZ2xlUmFuZ2VUb29sdGlwKGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcFZpc2libGUoKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIHRocmVzaG9sZHMgYXJjc1xuICAgKi9cbiAgcHJpdmF0ZSBkcmF3VGhyZXNob2xkcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgaW5uZXJSYWRpdXM6IG51bWJlcixcbiAgICBvdXRlclJhZGl1czogbnVtYmVyLFxuICAgIG1pblZhbHVlOiBudW1iZXIsXG4gICAgbWF4VmFsdWU6IG51bWJlcixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH1bXSxcbiAgICBjb3JuZXJSYWRpdXM6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGFyYyBnZW5lcmF0b3JcbiAgICBjb25zdCBhcmMgPSB0aGlzLmQzXG4gICAgICAuYXJjKClcbiAgICAgIC5pbm5lclJhZGl1cyhpbm5lclJhZGl1cylcbiAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1cyAqIDAuOTgpXG4gICAgICAuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cyk7XG5cbiAgICAvLyBTb3J0IHRocmVzaG9sZHMgYnkgdmFsdWUgaW4gYXNjZW5kaW5nIG9yZGVyIChvbmx5IGlmIG5lZWRlZClcbiAgICBjb25zdCBzb3J0ZWRUaHJlc2hvbGRzID0gdGhyZXNob2xkcy5sZW5ndGggPiAxID8gWy4uLnRocmVzaG9sZHNdLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgLSBiLnZhbHVlKSA6IHRocmVzaG9sZHM7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWxsIGFuZ2xlcyBmaXJzdCB1c2luZyB0aGUgY29sb3IgYW5nbGUgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbmdsZXMgPSBzb3J0ZWRUaHJlc2hvbGRzLm1hcCgodCkgPT4gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKHQudmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSkpO1xuXG4gICAgLy8gU3RhcnQgZnJvbSB0aGUgbWluaW11bSB2YWx1ZSBhbmdsZVxuICAgIGxldCBwcmV2aW91c0VuZEFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9Db2xvckFuZ2xlKG1pblZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgIGNvbnN0IGxhYmVsZWRTZWdtZW50czoge1xuICAgICAgc3RhcnRBbmdsZTogbnVtYmVyO1xuICAgICAgZW5kQW5nbGU6IG51bWJlcjtcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgfVtdID0gW107XG5cbiAgICBzb3J0ZWRUaHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCwgaSkgPT4ge1xuICAgICAgY29uc3QgZW5kQW5nbGUgPSBhbmdsZXNbaV07XG5cbiAgICAgIC8vIFNraXAgaWYgZW5kIGFuZ2xlIGlzIG5vdCBncmVhdGVyIHRoYW4gc3RhcnQgYW5nbGVcbiAgICAgIGlmIChlbmRBbmdsZSA8PSBwcmV2aW91c0VuZEFuZ2xlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSBwcmV2aW91c0VuZEFuZ2xlO1xuICAgICAgY29uc3QgYXJjUGF0aCA9IGNoYXJ0R3JvdXBcbiAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICdkJyxcbiAgICAgICAgICBhcmMoe1xuICAgICAgICAgICAgaW5uZXJSYWRpdXMsXG4gICAgICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgICAgIHN0YXJ0QW5nbGUsXG4gICAgICAgICAgICBlbmRBbmdsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuYXR0cignZmlsbCcsIHRocmVzaG9sZC5jb2xvciB8fCBgdXJsKCMke3RoaXMudGhyZXNob2xkR3JhZGllbnRJZChpKX0pYClcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLWFyYyB0aHJlc2hvbGQtYXJjJylcbiAgICAgICAgLmF0dHIoJ2RhdGEtdmFsdWUnLCB0aHJlc2hvbGQudmFsdWUpXG4gICAgICAgIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcblxuICAgICAgaWYgKHRocmVzaG9sZC5sYWJlbCkge1xuICAgICAgICBsYWJlbGVkU2VnbWVudHMucHVzaCh7IHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBsYWJlbDogdGhyZXNob2xkLmxhYmVsIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG9vbHRpcCBpbnRlcmFjdGlvblxuICAgICAgaWYgKHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLnNob3dUb29sdGlwKSB7XG4gICAgICAgIC8vIENvbnZlcnQgYW5nbGVzIGJhY2sgdG8gdmFsdWVzIGZvciB0b29sdGlwXG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB0aGlzLmFuZ2xlVG9WYWx1ZShwcmV2aW91c0VuZEFuZ2xlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHRocmVzaG9sZC52YWx1ZTtcblxuICAgICAgICBhcmNQYXRoXG4gICAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dUaHJlc2hvbGRUb29sdGlwKGV2ZW50LCBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgdGhyZXNob2xkLmNvbG9yLCB0aHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwcmV2aW91cyBlbmQgYW5nbGUgZm9yIHRoZSBuZXh0IHRocmVzaG9sZFxuICAgICAgcHJldmlvdXNFbmRBbmdsZSA9IGVuZEFuZ2xlO1xuICAgIH0pO1xuXG4gICAgLy8gRHJhdyB0aGUgbGFzdCBzZWdtZW50IGlmIHRoZSBsYXN0IHRocmVzaG9sZCBpcyBsZXNzIHRoYW4gdGhlIG1heCB2YWx1ZVxuICAgIGlmIChwcmV2aW91c0VuZEFuZ2xlIDwgdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSB7XG4gICAgICBjb25zdCBsYXN0QXJjID0gY2hhcnRHcm91cFxuICAgICAgICAuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ2QnLFxuICAgICAgICAgIGFyYyh7XG4gICAgICAgICAgICBpbm5lclJhZGl1cyxcbiAgICAgICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogcHJldmlvdXNFbmRBbmdsZSxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCBgdXJsKCMke3RoaXMuYmdHcmFkaWVudElkfSlgKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZ2F1Z2UtYXJjIHRocmVzaG9sZC1hcmMnKVxuICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICdwb2ludGVyJyk7XG5cbiAgICAgIC8vIEFkZCB0b29sdGlwIGZvciB0aGUgbGFzdCBzZWdtZW50XG4gICAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd1Rvb2x0aXApIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHRoaXMuYW5nbGVUb1ZhbHVlKHByZXZpb3VzRW5kQW5nbGUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gbWF4VmFsdWU7XG4gICAgICAgIGNvbnN0IGxhc3RUaHJlc2hvbGQgPSB0aHJlc2hvbGRzW3RocmVzaG9sZHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdEFyY1xuICAgICAgICAgIC5vbignbW91c2VlbnRlcicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93VGhyZXNob2xkVG9vbHRpcChldmVudCwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIGxhc3RUaHJlc2hvbGQuY29sb3IsIGxhc3RUaHJlc2hvbGQubGFiZWwpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5lZmZlY3RpdmVPcHRpb25zKCkuc2hvd0RhdGFMYWJlbHMgIT09IGZhbHNlICYmIGxhYmVsZWRTZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRyYXdTZWdtZW50TGFiZWxzKGNoYXJ0R3JvdXAsIGxhYmVsZWRTZWdtZW50cywgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhyZXNob2xkIGxhYmVscyBjZW50ZXJlZCBvbiBlYWNoIHNlZ21lbnQgYXJjIHdoZW4gc3BhY2UgYWxsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3U2VnbWVudExhYmVscyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgc2VnbWVudHM6IHsgc3RhcnRBbmdsZTogbnVtYmVyOyBlbmRBbmdsZTogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH1bXSxcbiAgICBpbm5lclJhZGl1czogbnVtYmVyLFxuICAgIG91dGVyUmFkaXVzOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGxhYmVsQXJjID0gdGhpcy5kM1xuICAgICAgLmFyYygpXG4gICAgICAuaW5uZXJSYWRpdXMoaW5uZXJSYWRpdXMpXG4gICAgICAub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMgKiAwLjk4KTtcblxuICAgIGNvbnN0IGxhYmVsR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2dhdWdlLXNlZ21lbnQtbGFiZWxzJyk7XG4gICAgY29uc3QgcmluZ1dpZHRoID0gb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cztcbiAgICBjb25zdCBsYWJlbFJhZGl1cyA9IGlubmVyUmFkaXVzICsgcmluZ1dpZHRoIC8gMjtcbiAgICBjb25zdCBhbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuZWZmZWN0aXZlT3B0aW9ucygpLmFuaW1hdGlvbkR1cmF0aW9uID8/IDc1MDtcblxuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gc2VnbWVudC5lbmRBbmdsZSAtIHNlZ21lbnQuc3RhcnRBbmdsZTtcbiAgICAgIGNvbnN0IGNob3JkTGVuZ3RoID0gMiAqIGxhYmVsUmFkaXVzICogTWF0aC5zaW4oYW5nbGUgLyAyKTtcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5jYWxjdWxhdGVTZWdtZW50TGFiZWxGb250U2l6ZShhbmdsZSwgcmluZ1dpZHRoLCBjaG9yZExlbmd0aCk7XG4gICAgICBpZiAoZm9udFNpemUgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGNob3JkTGVuZ3RoICogMC44O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuZ2V0Rml0dGVkU2VnbWVudExhYmVsKHNlZ21lbnQubGFiZWwsIGZvbnRTaXplLCBhdmFpbGFibGVXaWR0aCk7XG4gICAgICBpZiAoIXRleHQpIHJldHVybjtcblxuICAgICAgY29uc3QgY2VudHJvaWQgPSBsYWJlbEFyYy5jZW50cm9pZCh7XG4gICAgICAgIGlubmVyUmFkaXVzLFxuICAgICAgICBvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMgKiAwLjk4LFxuICAgICAgICBzdGFydEFuZ2xlOiBzZWdtZW50LnN0YXJ0QW5nbGUsXG4gICAgICAgIGVuZEFuZ2xlOiBzZWdtZW50LmVuZEFuZ2xlLFxuICAgICAgfSk7XG5cbiAgICAgIGxhYmVsR3JvdXBcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1zZWdtZW50LWxhYmVsJylcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtjZW50cm9pZFswXX0sICR7Y2VudHJvaWRbMV19KWApXG4gICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnbWlkZGxlJylcbiAgICAgICAgLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdub25lJylcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtmb250U2l6ZX1weGApXG4gICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnNjAwJylcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LWRhdGEtbGFiZWxzLWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAudGV4dCh0ZXh0KVxuICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgIC5kdXJhdGlvbihhbmltYXRpb25EdXJhdGlvbilcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVNlZ21lbnRMYWJlbEZvbnRTaXplKGFuZ2xlOiBudW1iZXIsIHJpbmdXaWR0aDogbnVtYmVyLCBjaG9yZExlbmd0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoY2hvcmRMZW5ndGggPCB0aGlzLk1JTl9TRUdNRU5UX0NIT1JEX0ZPUl9MQUJFTCB8fCByaW5nV2lkdGggPCB0aGlzLk1JTl9TRUdNRU5UX1JJTkdfRk9SX0xBQkVMKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByaW5nQmFzZWRTaXplID0gcmluZ1dpZHRoICogMC40NTtcbiAgICBjb25zdCBhbmdsZVNjYWxlID0gTWF0aC5taW4oMSwgMC43ICsgMC4zICogKGFuZ2xlIC8gKHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyAvIDMpKSk7XG4gICAgY29uc3QgbWF4QnlDaG9yZCA9IGNob3JkTGVuZ3RoIC8gKDIgKiAwLjY1KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IE1hdGgubWluKHJpbmdCYXNlZFNpemUgKiBhbmdsZVNjYWxlLCBtYXhCeUNob3JkKTtcblxuICAgIGlmIChmb250U2l6ZSA8IHRoaXMuTUlOX1NFR01FTlRfTEFCRUxfRk9OVCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5tYXgodGhpcy5NSU5fU0VHTUVOVF9MQUJFTF9GT05ULCBNYXRoLm1pbihmb250U2l6ZSwgdGhpcy5NQVhfU0VHTUVOVF9MQUJFTF9GT05UKSkgKiAyKSAvIDI7XG4gIH1cblxuICBwcml2YXRlIGdldEZpdHRlZFNlZ21lbnRMYWJlbChsYWJlbDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIWxhYmVsKSByZXR1cm4gJyc7XG4gICAgaWYgKHRoaXMuZG9lc1NlZ21lbnRMYWJlbEZpdChsYWJlbCwgZm9udFNpemUsIGF2YWlsYWJsZVdpZHRoKSkgcmV0dXJuIGxhYmVsO1xuICAgIHJldHVybiB0aGlzLnRydW5jYXRlU2VnbWVudExhYmVsKGxhYmVsLCBmb250U2l6ZSwgYXZhaWxhYmxlV2lkdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkb2VzU2VnbWVudExhYmVsRml0KHRleHQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ZXh0Lmxlbmd0aCAqIGZvbnRTaXplICogMC42NSA8PSBhdmFpbGFibGVXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgdHJ1bmNhdGVTZWdtZW50TGFiZWwodGV4dDogc3RyaW5nLCBmb250U2l6ZTogbnVtYmVyLCBhdmFpbGFibGVXaWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjaGFyV2lkdGggPSBmb250U2l6ZSAqIChmb250U2l6ZSA8PSAxMCA/IDAuNyA6IDAuNjUpO1xuICAgIGNvbnN0IGF2YWlsYWJsZUZvclRleHQgPSBhdmFpbGFibGVXaWR0aCAtIGZvbnRTaXplICogMC43O1xuICAgIGlmIChhdmFpbGFibGVGb3JUZXh0IDw9IDApIHJldHVybiAnJztcblxuICAgIGNvbnN0IG1heENoYXJzID0gTWF0aC5mbG9vcihhdmFpbGFibGVGb3JUZXh0IC8gY2hhcldpZHRoKTtcbiAgICBpZiAobWF4Q2hhcnMgPD0gMCkgcmV0dXJuICcnO1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhDaGFycykgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIGAke3RleHQuc3Vic3RyaW5nKDAsIE1hdGgubWF4KDEsIG1heENoYXJzKSl94oCmYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0b29sdGlwIGZvciBhIHRocmVzaG9sZCBhcmNcbiAgICovXG4gIHByaXZhdGUgc2hvd1RocmVzaG9sZFRvb2x0aXAoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3RhcnRWYWx1ZTogbnVtYmVyLFxuICAgIGVuZFZhbHVlOiBudW1iZXIsXG4gICAgY29sb3I6IHN0cmluZyxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHRvb2x0aXAgZGF0YVxuICAgIHRoaXMuX3Rvb2x0aXBEYXRhLnNldCh7XG4gICAgICB0aXRsZTogbGFiZWwgfHwgJ1JhbmdlJyxcbiAgICAgIHZhbHVlOiBgJHtzdGFydFZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9IC0gJHtlbmRWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogY29sb3IsXG4gICAgfSk7XG5cbiAgICAvLyBTaG93IHRvb2x0aXBcbiAgICB0aGlzLl90b29sdGlwVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy51cGRhdGVUb29sdGlwUG9zaXRpb24oZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRvb2x0aXAgZm9yIHRoZSBlbnRpcmUgcmFuZ2Ugd2hlbiBubyB0aHJlc2hvbGRzIGFyZSBkZWZpbmVkXG4gICAqL1xuICBwcml2YXRlIHNob3dTaW5nbGVSYW5nZVRvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5lZmZlY3RpdmVPcHRpb25zKCk7XG4gICAgaWYgKCFvcHRpb25zLnNob3dUb29sdGlwKSByZXR1cm47XG5cbiAgICB0aGlzLnVwZGF0ZVRvb2x0aXBQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5fdG9vbHRpcERhdGEuc2V0KHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLmxhYmVsIHx8ICdSYW5nZScsXG4gICAgICB2YWx1ZTogYCR7b3B0aW9ucy5taW5WYWx1ZS50b0xvY2FsZVN0cmluZygpfSAtICR7b3B0aW9ucy5tYXhWYWx1ZS50b0xvY2FsZVN0cmluZygpfWAsXG4gICAgICBjb2xvcjogJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRyYWNrLWNvbG9yKSknLFxuICAgIH0pO1xuICAgIHRoaXMuX3Rvb2x0aXBWaXNpYmxlLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9vbHRpcFBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1Rvb2x0aXBDb29yZHMgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICBpZiAodGhpcy5fdG9vbHRpcFJhZklkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLl90b29sdGlwUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5fdG9vbHRpcFJhZklkID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzO1xuICAgICAgaWYgKCFjb29yZHMpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jaGFydENvbnRhaW5lckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB0b29sdGlwRWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY2hhcnQtdG9vbHRpcCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IHRvb2x0aXBSZWN0ID0gdG9vbHRpcEVsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsO1xuICAgICAgY29uc3QgcG9zID0gY29tcHV0ZVRvb2x0aXBQb3NpdGlvbihyZWN0LCB0b29sdGlwUmVjdCwgY29vcmRzLnggKyAxMCwgY29vcmRzLnkgLSAxMCwgdGhpcy5UT09MVElQX0dBUCk7XG4gICAgICB0aGlzLl90b29sdGlwUG9zaXRpb24uc2V0KHBvcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIHRvb2x0aXBcbiAgICovXG4gIHByaXZhdGUgaGlkZVRvb2x0aXAoKTogdm9pZCB7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdXAgY2hhcnQgcmVzb3VyY2VzXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cENoYXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl90b29sdGlwUmFmSWQgIT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFJhZklkKTtcbiAgICAgIHRoaXMuX3Rvb2x0aXBSYWZJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdUb29sdGlwQ29vcmRzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnN2Z0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3ZnRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2hhcnRDb250YWluZXJFbCgpPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5heC1jaGFydC1lbXB0eScpLmZvckVhY2goKGVsKSA9PiBlbC5yZW1vdmUoKSk7XG4gICAgdGhpcy5fdG9vbHRpcFZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLl9sYXN0Q29udGFpbmVyUmVjdCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBncmFkaWVudCBkZWZpbml0aW9ucyBmb3IgdGhyZXNob2xkc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVHcmFkaWVudHMoXG4gICAgc3ZnOiBkMy5TZWxlY3Rpb248U1ZHU1ZHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICB0aHJlc2hvbGRzOiB7IHZhbHVlOiBudW1iZXI7IGNvbG9yOiBzdHJpbmcgfVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpO1xuXG4gICAgLy8gQ3JlYXRlIGEgcmFkaWFsIGdyYWRpZW50IGZvciB0aGUgYmFja2dyb3VuZFxuICAgIGNvbnN0IGJnR3JhZGllbnQgPSBkZWZzXG4gICAgICAuYXBwZW5kKCdyYWRpYWxHcmFkaWVudCcpXG4gICAgICAuYXR0cignaWQnLCB0aGlzLmJnR3JhZGllbnRJZClcbiAgICAgIC5hdHRyKCdjeCcsICc1MCUnKVxuICAgICAgLmF0dHIoJ2N5JywgJzUwJScpXG4gICAgICAuYXR0cigncicsICc1MCUnKVxuICAgICAgLmF0dHIoJ2dyYWRpZW50VW5pdHMnLCAndXNlclNwYWNlT25Vc2UnKTtcblxuICAgIC8vIEdldCBDU1MgdmFyaWFibGUgZm9yIHRyYWNrIGNvbG9yXG4gICAgaWYgKHRocmVzaG9sZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBEZWZhdWx0IGdyYWRpZW50IHdoZW4gbm8gdGhyZXNob2xkcyBhcmUgcHJvdmlkZWRcbiAgICAgIGJnR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzAlJykuYXR0cignc3RvcC1jb2xvcicsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyk7XG4gICAgICBiZ0dyYWRpZW50XG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpLCAwLjgpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJnR3JhZGllbnQuYXBwZW5kKCdzdG9wJykuYXR0cignb2Zmc2V0JywgJzAlJykuYXR0cignc3RvcC1jb2xvcicsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10cmFjay1jb2xvcikpJyk7XG4gICAgICBiZ0dyYWRpZW50XG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsICdyZ2JhKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtdHJhY2stY29sb3IpLCAwLjgpJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBncmFkaWVudHMgZm9yIGVhY2ggdGhyZXNob2xkXG4gICAgICB0aHJlc2hvbGRzLmZvckVhY2goKHRocmVzaG9sZCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBncmFkaWVudCA9IGRlZnNcbiAgICAgICAgICAuYXBwZW5kKCdsaW5lYXJHcmFkaWVudCcpXG4gICAgICAgICAgLmF0dHIoJ2lkJywgdGhpcy50aHJlc2hvbGRHcmFkaWVudElkKGkpKVxuICAgICAgICAgIC5hdHRyKCdncmFkaWVudFVuaXRzJywgJ3VzZXJTcGFjZU9uVXNlJylcbiAgICAgICAgICAuYXR0cigneDEnLCAnLTEnKVxuICAgICAgICAgIC5hdHRyKCd5MScsICcwJylcbiAgICAgICAgICAuYXR0cigneDInLCAnMScpXG4gICAgICAgICAgLmF0dHIoJ3kyJywgJzAnKTtcblxuICAgICAgICBncmFkaWVudFxuICAgICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAgIC5hdHRyKCdvZmZzZXQnLCAnMCUnKVxuICAgICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgdGhpcy5kMy5jb2xvcih0aHJlc2hvbGQuY29sb3IpPy5icmlnaHRlcigwLjUpLnRvU3RyaW5nKCkgfHwgdGhyZXNob2xkLmNvbG9yKTtcblxuICAgICAgICBncmFkaWVudC5hcHBlbmQoJ3N0b3AnKS5hdHRyKCdvZmZzZXQnLCAnMTAwJScpLmF0dHIoJ3N0b3AtY29sb3InLCB0aHJlc2hvbGQuY29sb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRpY2sgbWFya3MgYW5kIGxhYmVscyBhcm91bmQgdGhlIGdhdWdlXG4gICAqL1xuICBwcml2YXRlIGRyYXdUaWNrcyhcbiAgICBjaGFydEdyb3VwOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICB0aWNrQ291bnQ6IG51bWJlcixcbiAgICB0aWNrRm9udFB4OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRpY2tMZW5ndGggPSBNYXRoLm1heCg0LCBNYXRoLm1pbihyYWRpdXMgKiAwLjEyLCAxNCkpO1xuICAgIGNvbnN0IGJhc2VMYWJlbE9mZnNldCA9IHRoaXMuZ2V0QmFzZUxhYmVsT2Zmc2V0KHJhZGl1cywgdGlja0xlbmd0aCwgdGlja0ZvbnRQeCk7XG4gICAgY29uc3QgdGlja0dyb3VwID0gY2hhcnRHcm91cC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICd0aWNrcycpO1xuXG4gICAgY29uc3QgdGlja1ZhbHVlcyA9IFtdIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBtaW5WYWx1ZSkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgdGlja1ZhbHVlcy5wdXNoKG1pblZhbHVlICsgaSAqIHN0ZXApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpY2tNZXRyaWNzID0gdGlja1ZhbHVlcy5tYXAoKHRpY2spID0+IHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZSh0aWNrLCBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xuICAgICAgY29uc3QgcmFkaWFucyA9IGFuZ2xlIC0gdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmFkaWFucyxcbiAgICAgICAgY29zOiBNYXRoLmNvcyhyYWRpYW5zKSxcbiAgICAgICAgc2luOiBNYXRoLnNpbihyYWRpYW5zKSxcbiAgICAgICAgbGFiZWw6IHRoaXMuZm9ybWF0VGlja1ZhbHVlKHRpY2ssIG1pblZhbHVlLCBtYXhWYWx1ZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGlja01ldHJpY3MuZm9yRWFjaCgobWV0cmljKSA9PiB7XG4gICAgICB0aWNrR3JvdXBcbiAgICAgICAgLmFwcGVuZCgnbGluZScpXG4gICAgICAgIC5hdHRyKCd4MScsIG1ldHJpYy5jb3MgKiAocmFkaXVzICsgNSkpXG4gICAgICAgIC5hdHRyKCd5MScsIG1ldHJpYy5zaW4gKiAocmFkaXVzICsgNSkpXG4gICAgICAgIC5hdHRyKCd4MicsIG1ldHJpYy5jb3MgKiAocmFkaXVzICsgdGlja0xlbmd0aCkpXG4gICAgICAgIC5hdHRyKCd5MicsIG1ldHJpYy5zaW4gKiAocmFkaXVzICsgdGlja0xlbmd0aCkpXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCAncmdiYSh2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpLCAwLjUpJylcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdGV4dFNlbGVjdGlvbiA9IHRpY2tHcm91cFxuICAgICAgLnNlbGVjdEFsbDxTVkdUZXh0RWxlbWVudCwgKHR5cGVvZiB0aWNrTWV0cmljcylbbnVtYmVyXT4oJ3RleHQuZ2F1Z2UtdGljay1sYWJlbCcpXG4gICAgICAuZGF0YSh0aWNrTWV0cmljcylcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS10aWNrLWxhYmVsJylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgMClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3JnYmEodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSwgMC43KScpXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGAke3RpY2tGb250UHh9cHhgKVxuICAgICAgLnRleHQoKGQpID0+IGQubGFiZWwpO1xuXG4gICAgdGV4dFNlbGVjdGlvbi5lYWNoKChkLCBpbmRleCwgbm9kZXMpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpbmRleF07XG4gICAgICBsZXQgYmJveFdpZHRoID0gdGhpcy5lc3RpbWF0ZUxhYmVsV2lkdGgoZC5sYWJlbCwgdGlja0ZvbnRQeCk7XG4gICAgICBsZXQgYmJveEhlaWdodCA9IHRpY2tGb250UHg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYm94ID0gbm9kZS5nZXRCQm94KCk7XG4gICAgICAgIGlmIChiYm94LndpZHRoID4gMCkgYmJveFdpZHRoID0gYmJveC53aWR0aDtcbiAgICAgICAgaWYgKGJib3guaGVpZ2h0ID4gMCkgYmJveEhlaWdodCA9IGJib3guaGVpZ2h0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEtlZXAgZmFsbGJhY2sgZXN0aW1hdGVzLlxuICAgICAgfVxuXG4gICAgICBjb25zdCBhbmNob3IgPSB0aGlzLmdldFRpY2tMYWJlbEFuY2hvcihkLmNvcyk7XG4gICAgICBjb25zdCBuZWFyRWRnZUV4dGVudCA9IHRoaXMuZ2V0TmVhckVkZ2VQcm9qZWN0aW9uKGFuY2hvciwgZC5jb3MsIGQuc2luLCBiYm94V2lkdGgsIGJib3hIZWlnaHQpO1xuICAgICAgY29uc3QgcmVxdWlyZWRPZmZzZXQgPSB0aWNrTGVuZ3RoICsgdGhpcy5MQUJFTF9USUNLX0NMRUFSQU5DRSArIG5lYXJFZGdlRXh0ZW50O1xuICAgICAgY29uc3QgZWZmZWN0aXZlTGFiZWxPZmZzZXQgPSBNYXRoLm1heChiYXNlTGFiZWxPZmZzZXQsIHJlcXVpcmVkT2Zmc2V0KTtcbiAgICAgIGNvbnN0IG51ZGdlID0gdGlja0ZvbnRQeCAqIDAuMTtcblxuICAgICAgY29uc3QgeCA9IGQuY29zICogKHJhZGl1cyArIGVmZmVjdGl2ZUxhYmVsT2Zmc2V0KSArIChhbmNob3IgPT09ICdzdGFydCcgPyBudWRnZSA6IGFuY2hvciA9PT0gJ2VuZCcgPyAtbnVkZ2UgOiAwKTtcbiAgICAgIGNvbnN0IHkgPSBkLnNpbiAqIChyYWRpdXMgKyBlZmZlY3RpdmVMYWJlbE9mZnNldCk7XG5cbiAgICAgIHRoaXMuZDMuc2VsZWN0KG5vZGUpLmF0dHIoJ3gnLCB4KS5hdHRyKCd5JywgeSkuYXR0cigndGV4dC1hbmNob3InLCBhbmNob3IpLmF0dHIoJ2RvbWluYW50LWJhc2VsaW5lJywgJ21pZGRsZScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaWNrQ291bnQoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoc2l6ZSA8IDIwMCkgcmV0dXJuIDM7XG4gICAgaWYgKHNpemUgPCAzMDApIHJldHVybiA0O1xuICAgIGlmIChzaXplIDwgNDAwKSByZXR1cm4gNTtcbiAgICBpZiAoc2l6ZSA+IDUyMCkgcmV0dXJuIDc7XG4gICAgcmV0dXJuIDU7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tGb250U2l6ZShzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgxNCwgTWF0aC5taW4oMTgsIE1hdGguZmxvb3Ioc2l6ZSAvIDM1KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXNlTGFiZWxPZmZzZXQocmFkaXVzOiBudW1iZXIsIHRpY2tMZW5ndGg6IG51bWJlciwgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBsYWJlbEdhcCA9IE1hdGgubWF4KDYsIE1hdGgubWluKHJhZGl1cyAqIDAuMDYsIDE0KSk7XG4gICAgcmV0dXJuIHRpY2tMZW5ndGggKyBsYWJlbEdhcCArIHRpY2tGb250UHggKiAwLjI7XG4gIH1cblxuICBwcml2YXRlIGdldFRpY2tMYWJlbEFuY2hvcihjb3NWYWx1ZTogbnVtYmVyKTogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCcge1xuICAgIGlmIChjb3NWYWx1ZSA+IDAuMzUpIHJldHVybiAnc3RhcnQnO1xuICAgIGlmIChjb3NWYWx1ZSA8IC0wLjM1KSByZXR1cm4gJ2VuZCc7XG4gICAgcmV0dXJuICdtaWRkbGUnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZWFyRWRnZVByb2plY3Rpb24oXG4gICAgYW5jaG9yOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJyxcbiAgICBjb3NWYWx1ZTogbnVtYmVyLFxuICAgIHNpblZhbHVlOiBudW1iZXIsXG4gICAgYmJveFdpZHRoOiBudW1iZXIsXG4gICAgYmJveEhlaWdodDogbnVtYmVyLFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGFic0NvcyA9IE1hdGguYWJzKGNvc1ZhbHVlKTtcbiAgICBjb25zdCBhYnNTaW4gPSBNYXRoLmFicyhzaW5WYWx1ZSk7XG4gICAgY29uc3QgaGFsZkhlaWdodFByb2plY3Rpb24gPSBhYnNTaW4gKiAoYmJveEhlaWdodCAvIDIpO1xuXG4gICAgLy8gRm9yIHN0YXJ0L2VuZCBhbmNob3JlZCBsYWJlbHMgb24gZWRnZSB0aWNrcywgdGhlIG5lYXJlc3Qgc2lkZSBpcyBjbG9zZSB0byB0aGUgYW5jaG9yIHBvaW50LlxuICAgIGlmIChhbmNob3IgPT09ICdzdGFydCcgfHwgYW5jaG9yID09PSAnZW5kJykge1xuICAgICAgcmV0dXJuIGhhbGZIZWlnaHRQcm9qZWN0aW9uICsgYWJzQ29zICogdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgICB9XG5cbiAgICAvLyBGb3IgY2VudGVyZWQgbGFiZWxzLCBuZWFyZXN0IHNpZGUgaW5jbHVkZXMgaGFsZiB0ZXh0IHdpZHRoIHByb2plY3Rpb24uXG4gICAgcmV0dXJuIGFic0NvcyAqIChiYm94V2lkdGggLyAyKSArIGhhbGZIZWlnaHRQcm9qZWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaWNrVmFsdWUodGljazogbnVtYmVyLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZVJhbmdlID0gbWF4VmFsdWUgLSBtaW5WYWx1ZTtcbiAgICBpZiAodmFsdWVSYW5nZSA8PSAxMCkge1xuICAgICAgcmV0dXJuIHRpY2sudG9GaXhlZCgyKS5yZXBsYWNlKC9cXC4/MCskLywgJycpO1xuICAgIH1cbiAgICBpZiAodmFsdWVSYW5nZSA8IDEwMDApIHtcbiAgICAgIHJldHVybiB0aWNrICUgMSA9PT0gMCA/IHRpY2sudG9TdHJpbmcoKSA6IHRpY2sudG9GaXhlZCgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdExhcmdlTnVtYmVyKE1hdGgucm91bmQodGljaykpO1xuICB9XG5cbiAgcHJpdmF0ZSBlc3RpbWF0ZUxhYmVsV2lkdGgobGFiZWw6IHN0cmluZywgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbGFiZWwubGVuZ3RoICogdGlja0ZvbnRQeCAqIHRoaXMuVElDS19MQUJFTF9DSEFSX1dJRFRIX1JBVElPICsgdGhpcy5USUNLX0xBQkVMX1NJREVfUEFERElORztcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVNYXhUaWNrTGFiZWxXaWR0aCh0aWNrQ291bnQ6IG51bWJlciwgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlciwgdGlja0ZvbnRQeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGlja0NvdW50IDw9IDEpIHJldHVybiB0aWNrRm9udFB4O1xuICAgIGNvbnN0IHN0ZXAgPSAobWF4VmFsdWUgLSBtaW5WYWx1ZSkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgbGV0IG1heENoYXJzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpY2tDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuZm9ybWF0VGlja1ZhbHVlKG1pblZhbHVlICsgaSAqIHN0ZXAsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgICBtYXhDaGFycyA9IE1hdGgubWF4KG1heENoYXJzLCBsYWJlbC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gbWF4Q2hhcnMgKiB0aWNrRm9udFB4ICogdGhpcy5USUNLX0xBQkVMX0NIQVJfV0lEVEhfUkFUSU8gKyB0aGlzLlRJQ0tfTEFCRUxfU0lERV9QQURESU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSB2YWx1ZSBhbmQgbGFiZWwgdGV4dCBpbiB0aGUgY2VudGVyXG4gICAqL1xuICBwcml2YXRlIGRyYXdWYWx1ZURpc3BsYXkoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICByYWRpdXM6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIFB4LWJhc2VkIHNjYWxpbmcgZm9yIHJvYnVzdCBzbWFsbC9sYXJnZSBzaXplcyB3aXRoIGJldHRlciBzbWFsbC1zaXplIGhhbmRsaW5nXG4gICAgY29uc3QgdmFsdWVGb250UHggPSBNYXRoLm1heCgxOCwgTWF0aC5taW4oMzIsIE1hdGguZmxvb3Ioc2l6ZSAvIDgpKSk7XG4gICAgY29uc3QgbGFiZWxGb250UHggPSBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTYsIE1hdGguZmxvb3IodmFsdWVGb250UHggKiAwLjU1KSkpO1xuICAgIC8vIE1vcmUgdmVydGljYWwgZ2FwIGZvciBzbWFsbCBzaXplczogdXNlIGxhcmdlciBiYXNlIHZhbHVlXG4gICAgY29uc3QgdmVydGljYWxHYXAgPSBNYXRoLm1heCg2LCBNYXRoLm1pbigxMiwgTWF0aC5mbG9vcihzaXplIC8gNDApKSk7XG5cbiAgICAvLyBDcmVhdGUgZ3JvdXAgZm9yIHRoZSB2YWx1ZSBkaXNwbGF5XG4gICAgY29uc3QgdmFsdWVHcm91cCA9IGNoYXJ0R3JvdXAuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZ2F1Z2UtdmFsdWUtZGlzcGxheScpLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xuXG4gICAgLy8gQWRkIHZhbHVlIGRpc3BsYXlcbiAgICB2YWx1ZUdyb3VwXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS12YWx1ZScpXG4gICAgICAuYXR0cigneCcsIDApXG4gICAgICAuYXR0cigneScsIHJhZGl1cyAqIDAuMTUgKyB2YWx1ZUZvbnRQeClcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgYCR7dmFsdWVGb250UHh9cHhgKVxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3JnYih2YXIoLS1heC1jb21wLWdhdWdlLWNoYXJ0LXRleHQtY29sb3IpKScpXG4gICAgICAudGV4dCh2YWx1ZS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIC8vIEFkZCBsYWJlbCBkaXNwbGF5IChpZiBwcm92aWRlZClcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIHZhbHVlR3JvdXBcbiAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1sYWJlbCcpXG4gICAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgICAgLmF0dHIoJ3knLCByYWRpdXMgKiAwLjI0ICsgdmFsdWVGb250UHggKyB2ZXJ0aWNhbEdhcClcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBgJHtsYWJlbEZvbnRQeH1weGApXG4gICAgICAgIC5zdHlsZSgnZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC10ZXh0LWNvbG9yKSknKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC44JylcbiAgICAgICAgLnRleHQobGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgZGlhbC9uZWVkbGUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgd2l0aCBhbmltYXRpb25cbiAgICovXG4gIHByaXZhdGUgZHJhd0RpYWwoXG4gICAgY2hhcnRHcm91cDogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbWluVmFsdWU6IG51bWJlcixcbiAgICBtYXhWYWx1ZTogbnVtYmVyLFxuICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIC8vIENsYW1wIHZhbHVlIHRvIG1pbi9tYXggcmFuZ2VcbiAgICBjb25zdCBjbGFtcGVkVmFsdWUgPSBNYXRoLm1heChtaW5WYWx1ZSwgTWF0aC5taW4obWF4VmFsdWUsIHZhbHVlKSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5nbGUgZm9yIG5lZWRsZSBiYXNlZCBvbiB2YWx1ZVxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5zY2FsZVZhbHVlVG9BbmdsZShjbGFtcGVkVmFsdWUsIG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gICAgY29uc3QgYW5nbGVJbkRlZ3JlZXMgPSB0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoYW5nbGUgLSB0aGlzLlFVQVJURVJfQ0lSQ0xFX1JBRElBTlMpO1xuXG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBuZWVkbGVcbiAgICBjb25zdCBkaWFsR3JvdXAgPSBjaGFydEdyb3VwLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2RpYWwnKTtcblxuICAgIC8vIERyYXcgdGhlIG5lZWRsZSB3aXRoIGluaXRpYWwgcG9zaXRpb24gYXQgbWluaW11bSB2YWx1ZVxuICAgIGNvbnN0IG5lZWRsZVBhdGggPSBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgLmF0dHIoJ2QnLCB0aGlzLmNyZWF0ZU5lZWRsZVBhdGgocmFkaXVzKSlcbiAgICAgIC5hdHRyKCdjbGFzcycsICdnYXVnZS1uZWVkbGUnKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAncmdiKHZhcigtLWF4LWNvbXAtZ2F1Z2UtY2hhcnQtbmVlZGxlLWNvbG9yKSknKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGByb3RhdGUoJHt0aGlzLnJhZGlhbnNUb0RlZ3JlZXMoLXRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyl9KWApOyAvLyBTdGFydCBhdCAtMTgwIGRlZ3JlZXMgKGxlZnQpXG5cbiAgICAvLyBBZGQgYSBjZW50ZXIgY2lyY2xlXG4gICAgZGlhbEdyb3VwXG4gICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgLmF0dHIoJ2N4JywgMClcbiAgICAgIC5hdHRyKCdjeScsIDApXG4gICAgICAuYXR0cigncicsIHJhZGl1cyAqIDAuMDgpXG4gICAgICAuYXR0cignZmlsbCcsICdyZ2IodmFyKC0tYXgtY29tcC1nYXVnZS1jaGFydC1uZWVkbGUtY29sb3IpKScpXG4gICAgICAuYXR0cignc3Ryb2tlJywgJyNmZmYnKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpO1xuXG4gICAgLy8gQWRkIGEgc21hbGxlciB3aGl0ZSBjZW50ZXJcbiAgICBkaWFsR3JvdXBcbiAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXG4gICAgICAuYXR0cignY3gnLCAwKVxuICAgICAgLmF0dHIoJ2N5JywgMClcbiAgICAgIC5hdHRyKCdyJywgcmFkaXVzICogMC4wMylcbiAgICAgIC5hdHRyKCdmaWxsJywgJyNmZmYnKTtcblxuICAgIC8vIEdldCBlYXNpbmcgZnVuY3Rpb25cbiAgICBjb25zdCBlYXNpbmdGdW5jdGlvbiA9IGdldEVhc2luZ0Z1bmN0aW9uKHRoaXMuZDMsIHRoaXMub3B0aW9ucygpPy5hbmltYXRpb25FYXNpbmcpO1xuXG4gICAgLy8gQW5pbWF0ZSB0aGUgbmVlZGxlIGZyb20gbWluIHRvIGN1cnJlbnQgdmFsdWVcbiAgICBuZWVkbGVQYXRoXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pXG4gICAgICAuZWFzZShlYXNpbmdGdW5jdGlvbilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7YW5nbGVJbkRlZ3JlZXN9KWApO1xuICB9XG5cbiAgLy8gZ2V0RWFzaW5nRnVuY3Rpb24gbW92ZWQgdG8gc2hhcmVkIGNoYXJ0IHV0aWxzXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXRoIHN0cmluZyBmb3IgdGhlIG5lZWRsZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVOZWVkbGVQYXRoKHJhZGl1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZWVkbGVMZW5ndGggPSByYWRpdXMgKiAwLjg7XG4gICAgY29uc3QgbmVlZGxlV2lkdGggPSByYWRpdXMgKiAwLjA2O1xuICAgIHJldHVybiBgTSAwLCR7bmVlZGxlV2lkdGggLyAyfSBMICR7bmVlZGxlTGVuZ3RofSwwIEwgMCwkey1uZWVkbGVXaWR0aCAvIDJ9IFpgO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlcyBhIHZhbHVlIHRvIGFuIGFuZ2xlIChpbiByYWRpYW5zKVxuICAgKi9cbiAgcHJpdmF0ZSBzY2FsZVZhbHVlVG9BbmdsZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgLyB2YWx1ZVJhbmdlKSAqIHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZXMgYSB2YWx1ZSB0byBhbiBhbmdsZSBmb3IgY29sb3IgYXJjcyAoaW4gcmFkaWFucylcbiAgICovXG4gIHByaXZhdGUgc2NhbGVWYWx1ZVRvQ29sb3JBbmdsZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlUmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICByZXR1cm4gKCh2YWx1ZSAtIG1pbikgLyB2YWx1ZVJhbmdlKSAqIHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUyAtIHRoaXMuUVVBUlRFUl9DSVJDTEVfUkFESUFOUztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhbmdsZSBiYWNrIHRvIGEgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYW5nbGVUb1ZhbHVlKGFuZ2xlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWVSYW5nZSA9IG1heCAtIG1pbiB8fCAxO1xuICAgIHJldHVybiBtaW4gKyAoKGFuZ2xlICsgdGhpcy5RVUFSVEVSX0NJUkNMRV9SQURJQU5TKSAvIHRoaXMuSEFMRl9DSVJDTEVfUkFESUFOUykgKiB2YWx1ZVJhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHJhZGlhbnMgdG8gZGVncmVlc1xuICAgKi9cbiAgcHJpdmF0ZSByYWRpYW5zVG9EZWdyZWVzKHJhZGlhbnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiB0aGlzLkRFR1JFRVNfUEVSX1JBRElBTjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF4LWdhdWdlLWNoYXJ0XCIgcm9sZT1cImltZ1wiICNjaGFydENvbnRhaW5lcj5cbiAgPGF4LWNoYXJ0LXRvb2x0aXAgW2RhdGFdPVwidG9vbHRpcERhdGEoKVwiIFtwb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24oKVwiIFt2aXNpYmxlXT1cInRvb2x0aXBWaXNpYmxlKClcIj48L2F4LWNoYXJ0LXRvb2x0aXA+XG48L2Rpdj5cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NoYXJ0cy9nYXVnZS1jaGFydC9zcmMvYWNvcmV4LWNoYXJ0cy1nYXVnZS1jaGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
@@ -29,6 +29,11 @@ interface AXGaugeChartData {
29
29
  * Default: `var(--ax-sys-color-on-lightest-surface)`
30
30
  * Usage: `rgb(var(--ax-comp-gauge-chart-text-color))`
31
31
  *
32
+ * ### `--ax-comp-gauge-chart-data-labels-color`
33
+ * Text color for threshold segment labels.
34
+ * Default: `var(--ax-sys-color-on-lightest-surface)`
35
+ * Usage: `rgb(var(--ax-comp-gauge-chart-data-labels-color))`
36
+ *
32
37
  * ### `--ax-comp-gauge-chart-track-color`
33
38
  * Color for the gauge track (background arc).
34
39
  * Default: `var(--ax-sys-color-gray-200)`
@@ -70,6 +75,12 @@ interface AXGaugeChartOption {
70
75
  cornerRadius?: number;
71
76
  showValue?: boolean;
72
77
  showTooltip?: boolean;
78
+ /**
79
+ * Whether to show labels inside threshold segments
80
+ * Labels use each threshold's `label` and only appear on segments large enough to fit text
81
+ * Default: true
82
+ */
83
+ showDataLabels?: boolean;
73
84
  thresholds?: {
74
85
  value: number;
75
86
  color: string;
@@ -125,6 +136,10 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
125
136
  private readonly TICK_LABEL_CHAR_WIDTH_RATIO;
126
137
  private readonly TICK_LABEL_SIDE_PADDING;
127
138
  private readonly LABEL_TICK_CLEARANCE;
139
+ private readonly MIN_SEGMENT_CHORD_FOR_LABEL;
140
+ private readonly MIN_SEGMENT_RING_FOR_LABEL;
141
+ private readonly MIN_SEGMENT_LABEL_FONT;
142
+ private readonly MAX_SEGMENT_LABEL_FONT;
128
143
  private readonly instanceId;
129
144
  private get bgGradientId();
130
145
  private thresholdGradientId;
@@ -154,6 +169,14 @@ declare class AXGaugeChartComponent extends AXChartComponent implements OnDestro
154
169
  * Draw the thresholds arcs
155
170
  */
156
171
  private drawThresholds;
172
+ /**
173
+ * Draws threshold labels centered on each segment arc when space allows.
174
+ */
175
+ private drawSegmentLabels;
176
+ private calculateSegmentLabelFontSize;
177
+ private getFittedSegmentLabel;
178
+ private doesSegmentLabelFit;
179
+ private truncateSegmentLabel;
157
180
  /**
158
181
  * Shows tooltip for a threshold arc
159
182
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acorex/charts",
3
- "version": "20.9.2",
3
+ "version": "20.9.3",
4
4
  "peerDependencies": {
5
5
  "d3": ">=7.9.0"
6
6
  },