@rivet-health/design-system 2.1.0 → 2.2.0

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.
@@ -52,7 +52,7 @@ function getMinorIntervalFormat(interval) {
52
52
  case Interval.MONTH:
53
53
  return '%b';
54
54
  case Interval.YEAR:
55
- return "'%y";
55
+ return '%Y';
56
56
  }
57
57
  }
58
58
  function getMajorInterval(interval) {
@@ -97,7 +97,7 @@ export class TimeSeriesComponent {
97
97
  this.dateRange$ = this.input$.pipe(map(getDateRange), shareReplay({ refCount: true, bufferSize: 1 }));
98
98
  this.binInterval$ = this.dateRange$.pipe(map(([minDate, maxDate]) => {
99
99
  const diff = timeDay.count(new Date(minDate), new Date(maxDate));
100
- if (diff >= 730) {
100
+ if (diff >= 365 * 3) {
101
101
  return Interval.YEAR;
102
102
  }
103
103
  else if (diff >= 365) {
@@ -170,7 +170,7 @@ export class TimeSeriesComponent {
170
170
  const xMajorTicks = timeInterval
171
171
  .range(tickFloor, tickCeiling)
172
172
  .map(tickDate => ({
173
- label: majorFormatter(tickDate),
173
+ label: xMajorInterval === binInterval ? '' : majorFormatter(tickDate),
174
174
  value: tickDate.valueOf(),
175
175
  }));
176
176
  const x = { xMax: maxDateValue, xScale, xMinorTicks, xMajorTicks };
@@ -180,7 +180,7 @@ export class TimeSeriesComponent {
180
180
  ...series.data.map(({ value }) => value),
181
181
  ], []);
182
182
  const yMax = config.max ?? Math.max(...flattenedValues);
183
- const yMin = config.min ?? Math.min(...flattenedValues);
183
+ const yMin = config.min ?? Math.min(...flattenedValues, 0);
184
184
  const yScale = scaleLinear()
185
185
  .domain([yMin, yMax])
186
186
  .range([
@@ -273,10 +273,10 @@ export class TimeSeriesComponent {
273
273
  }
274
274
  }
275
275
  TimeSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
276
- TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility"], outputs: ["itemClick"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
276
+ TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(d.y1.yMin)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility"], outputs: ["itemClick"] }, { kind: "component", type: i5.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
277
277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, decorators: [{
278
278
  type: Component,
279
- args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
279
+ args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(d.y1.yMin)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
280
280
  }], propDecorators: { input: [{
281
281
  type: Input
282
282
  }], width: [{
@@ -284,4 +284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
284
284
  }], height: [{
285
285
  type: Input
286
286
  }] } });
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90aW1lLXNlcmllcy90aW1lLXNlcmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RpbWUtc2VyaWVzL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUVMLE9BQU8sRUFDUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsR0FDVCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQXdCZCxJQUFLLFFBS0o7QUFMRCxXQUFLLFFBQVE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gseUJBQWEsQ0FBQTtJQUNiLDJCQUFlLENBQUE7SUFDZix5QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxJLFFBQVEsS0FBUixRQUFRLFFBS1o7QUFnQ0QsU0FBUyxlQUFlLENBQUMsUUFBa0I7SUFDekMsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxRQUFRLENBQUMsR0FBRztZQUNmLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLEtBQUssUUFB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QUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQy9CLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDOUMsQ0FBQztvQkFDRixJQUFJLEtBQUssRUFBRTt3QkFDVCxPQUFPLENBQUMsSUFBSSxDQUFDOzRCQUNYLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzs0QkFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7eUJBQy9DLENBQUMsQ0FBQztxQkFDSjtpQkFDRjthQUNGO1lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDSCxDQUFDO0tBQ0g7SUEvUEMsSUFDSSxLQUFLLENBQUMsQ0FBa0I7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUdELElBQ0ksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUdELElBQ0ksTUFBTSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQzs7Z0hBeEJVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHFIQ3BKaEMsdWxJQTRJQTsyRkRRYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBWTNDLEtBQUs7c0JBRFIsS0FBSztnQkFPRixLQUFLO3NCQURSLEtBQUs7Z0JBT0YsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IGxpbmUgfSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQge1xuICBDb3VudGFibGVUaW1lSW50ZXJ2YWwsXG4gIHRpbWVEYXksXG4gIHRpbWVNb250aCxcbiAgdGltZVdlZWssXG4gIHRpbWVZZWFyLFxufSBmcm9tICdkMy10aW1lJztcbmltcG9ydCB7IHRpbWVGb3JtYXQgfSBmcm9tICdkMy10aW1lLWZvcm1hdCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgdHlwZSBEYXRhUG9pbnQgPSB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGRhdGU6IERhdGU7XG59O1xuXG50eXBlIFNlcmllcyA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3JUb2tlbjogc3RyaW5nO1xuICBkYXRhOiBEYXRhUG9pbnRbXTtcbiAgc3R5bGU/OiAnc29saWQnIHwgJ2Rhc2hlZCc7XG59O1xuXG50eXBlIFlDb25maWcgPSB7XG4gIHBvaW50UmVkdWNlcjogKHBvaW50czogRGF0YVBvaW50W10pID0+IG51bWJlcjtcbiAgdmFsdWVGb3JtYXR0ZXI6IChyZWR1Y2VkVmFsdWU6IG51bWJlcikgPT4gc3RyaW5nO1xuICBzZXJpZXM6IFNlcmllc1tdO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRpbWVTZXJpZXNJbnB1dCA9IFtZQ29uZmlnXSB8IFtZQ29uZmlnLCBZQ29uZmlnXTtcblxuZW51bSBJbnRlcnZhbCB7XG4gIERBWSA9ICdkYXknLFxuICBXRUVLID0gJ3dlZWsnLFxuICBNT05USCA9ICdtb250aCcsXG4gIFlFQVIgPSAneWVhcicsXG59XG5cbnR5cGUgTGVnZW5kSXRlbSA9IHsgbGFiZWw6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH07XG5cbnR5cGUgWFRpY2sgPSB7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfTtcblxudHlwZSBNYXJrZXIgPSBEYXRhUG9pbnQgJiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG5cbnR5cGUgWURyYXdEYXRhID0gWUNvbmZpZyAmIHtcbiAgc2VyaWVzOiAoU2VyaWVzICYge1xuICAgIHBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgc3Ryb2tlOiBzdHJpbmc7XG4gICAgbWFya2VyczogTWFya2VyW107XG4gIH0pW107XG4gIHlNYXg6IG51bWJlcjtcbiAgeU1pbjogbnVtYmVyO1xuICB5U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj47XG4gIHlUaWNrczogbnVtYmVyW107XG59O1xuXG50eXBlIERyYXdEYXRhID0ge1xuICB2aWV3Qm94OiBzdHJpbmc7XG4gIHg6IHtcbiAgICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj47XG4gICAgeE1pbm9yVGlja3M6IFhUaWNrW107XG4gICAgeE1ham9yVGlja3M6IFhUaWNrW107XG4gICAgeE1heDogRGF0ZTtcbiAgfTtcbiAgeTE6IFlEcmF3RGF0YTtcbiAgeTI/OiBZRHJhd0RhdGE7XG59O1xuXG5mdW5jdGlvbiBnZXRUaW1lSW50ZXJ2YWwoaW50ZXJ2YWw6IEludGVydmFsKTogQ291bnRhYmxlVGltZUludGVydmFsIHtcbiAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgIGNhc2UgSW50ZXJ2YWwuREFZOlxuICAgICAgcmV0dXJuIHRpbWVEYXk7XG4gICAgY2FzZSBJbnRlcnZhbC5XRUVLOlxuICAgICAgcmV0dXJuIHRpbWVXZWVrO1xuICAgIGNhc2UgSW50ZXJ2YWwuTU9OVEg6XG4gICAgICByZXR1cm4gdGltZU1vbnRoO1xuICAgIGNhc2UgSW50ZXJ2YWwuWUVBUjpcbiAgICAgIHJldHVybiB0aW1lWWVhcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRlUmFuZ2UoY29uZmlnczogWUNvbmZpZ1tdKTogW0RhdGUsIERhdGVdIHtcbiAgbGV0IG1pbiA9IEluZmluaXR5O1xuICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBzZXJpZXMgb2YgY29uZmlnLnNlcmllcykge1xuICAgICAgZm9yIChjb25zdCB7IGRhdGUgfSBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHZhbHVlKTtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3IERhdGUobWluKSwgbmV3IERhdGUobWF4KV07XG59XG5cbmZ1bmN0aW9uIGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQoaW50ZXJ2YWw6IEludGVydmFsKSB7XG4gIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICBjYXNlIEludGVydmFsLkRBWTpcbiAgICBjYXNlIEludGVydmFsLldFRUs6XG4gICAgICByZXR1cm4gJyUtZCc7XG4gICAgY2FzZSBJbnRlcnZhbC5NT05USDpcbiAgICAgIHJldHVybiAnJWInO1xuICAgIGNhc2UgSW50ZXJ2YWwuWUVBUjpcbiAgICAgIHJldHVybiBcIicleVwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1ham9ySW50ZXJ2YWwoaW50ZXJ2YWw6IEludGVydmFsKSB7XG4gIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICBjYXNlIEludGVydmFsLkRBWTpcbiAgICBjYXNlIEludGVydmFsLldFRUs6XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuTU9OVEg7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBJbnRlcnZhbC5ZRUFSO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1ham9ySW50ZXJ2YWxGb3JtYXQoaW50ZXJ2YWw6IEludGVydmFsKSB7XG4gIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICBjYXNlIEludGVydmFsLllFQVI6XG4gICAgICByZXR1cm4gJyVZJztcbiAgICBjYXNlIEludGVydmFsLk1PTlRIOlxuICAgICAgcmV0dXJuICclYiAlWSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJWQnO1xuICB9XG59XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy4gU2VlIGNvbW1pdCBlMjM4YzJkLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXRpbWUtc2VyaWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGltZS1zZXJpZXMuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGltZVNlcmllc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2VyaWVzSW5wdXQ+KFtcbiAgICB7XG4gICAgICBwb2ludFJlZHVjZXI6IHBvaW50cyA9PlxuICAgICAgICBwb2ludHMucmVkdWNlKCh0b3RhbCwgeyB2YWx1ZSB9KSA9PiB0b3RhbCArIHZhbHVlLCAwKSxcbiAgICAgIHZhbHVlRm9ybWF0dGVyOiB2ID0+IG5ldyBEZWNpbWFsUGlwZSgnZW4tVVMnKS50cmFuc2Zvcm0odikgPz8gJycsXG4gICAgICBzZXJpZXM6IFtdLFxuICAgIH0sXG4gIF0pO1xuICBASW5wdXQoKVxuICBzZXQgaW5wdXQodjogVGltZVNlcmllc0lucHV0KSB7XG4gICAgdGhpcy5pbnB1dCQubmV4dCh2KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIEBJbnB1dCgpXG4gIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDI1Nik7XG4gIEBJbnB1dCgpXG4gIHNldCBoZWlnaHQodjogbnVtYmVyKSB7XG4gICAgdGhpcy5oZWlnaHQkLm5leHQodik7XG4gIH1cblxuICByZWFkb25seSBCT1RUT01fT0ZGU0VUID0gMjQ7XG4gIHJlYWRvbmx5IExFRlRfT0ZGU0VUID0gNDg7XG4gIHJlYWRvbmx5IFRPUF9QQURESU5HID0gMTY7XG4gIHJlYWRvbmx5IExFRlRfUklHSFRfUEFERElORyA9IDg7XG4gIHJlYWRvbmx5IEJPVFRPTV9QQURESU5HID0gODtcbiAgcmVhZG9ubHkgWV9USUNLX0NPVU5UID0gNTtcbiAgcmVhZG9ubHkgWF9NSU5PUl9USUNLX0xJTUlUID0gMTU7XG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlJCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGdldERhdGVSYW5nZSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBiaW5JbnRlcnZhbCQgPSB0aGlzLmRhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKFttaW5EYXRlLCBtYXhEYXRlXSkgPT4ge1xuICAgICAgY29uc3QgZGlmZiA9IHRpbWVEYXkuY291bnQobmV3IERhdGUobWluRGF0ZSksIG5ldyBEYXRlKG1heERhdGUpKTtcbiAgICAgIGlmIChkaWZmID49IDczMCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuWUVBUjtcbiAgICAgIH0gZWxzZSBpZiAoZGlmZiA+PSAzNjUpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLk1PTlRIO1xuICAgICAgfSBlbHNlIGlmIChkaWZmID49IDkwKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5XRUVLO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLkRBWTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGJpbm5lZERhdGEkID0gY29tYmluZUxhdGVzdChbdGhpcy5pbnB1dCQsIHRoaXMuYmluSW50ZXJ2YWwkXSkucGlwZShcbiAgICBtYXAoKFtpbnB1dCwgYmluSW50ZXJ2YWxdKSA9PlxuICAgICAgaW5wdXQubWFwKChjb25maWcpOiBZQ29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgc2VyaWVzOiBjb25maWcuc2VyaWVzLm1hcChzZXJpZXMgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmlubmVkID0gbmV3IE1hcDxudW1iZXIsIERhdGFQb2ludFtdPigpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBzZXJpZXMuZGF0YSkge1xuICAgICAgICAgICAgICBjb25zdCBiaW4gPSBnZXRUaW1lSW50ZXJ2YWwoYmluSW50ZXJ2YWwpXG4gICAgICAgICAgICAgICAgLmZsb29yKHBvaW50LmRhdGUpXG4gICAgICAgICAgICAgICAgLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgaWYgKCFiaW5uZWQuaGFzKGJpbikpIHtcbiAgICAgICAgICAgICAgICBiaW5uZWQuc2V0KGJpbiwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJpbm5lZC5nZXQoYmluKSEucHVzaChwb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgICAgIGRhdGE6IFsuLi5iaW5uZWQuZW50cmllcygpXS5tYXAoKFtkYXRlVmFsdWUsIHBvaW50c10pID0+ICh7XG4gICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoZGF0ZVZhbHVlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29uZmlnLnBvaW50UmVkdWNlcihwb2ludHMpLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGJpbm5lZERhdGVSYW5nZSQgPSB0aGlzLmJpbm5lZERhdGEkLnBpcGUoXG4gICAgbWFwKGdldERhdGVSYW5nZSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBkcmF3RGF0YSQ6IE9ic2VydmFibGU8RHJhd0RhdGE+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5iaW5uZWREYXRhJCxcbiAgICB0aGlzLmJpbm5lZERhdGVSYW5nZSQsXG4gICAgdGhpcy5iaW5JbnRlcnZhbCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Jpbm5lZERhdGEsIGJpbm5lZERhdGVSYW5nZSwgYmluSW50ZXJ2YWwsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICBjb25zdCB2aWV3Qm94ID0gYDAgMCAke3dpZHRofSAke2hlaWdodH1gO1xuXG4gICAgICBjb25zdCB4U2NhbGUgPSBzY2FsZUxpbmVhcigpXG4gICAgICAgIC5kb21haW4oYmlubmVkRGF0ZVJhbmdlKVxuICAgICAgICAucmFuZ2UoW1xuICAgICAgICAgIHRoaXMuTEVGVF9PRkZTRVQgKyB0aGlzLkxFRlRfUklHSFRfUEFERElORyxcbiAgICAgICAgICB3aWR0aCAtIHRoaXMuTEVGVF9SSUdIVF9QQURESU5HICogMixcbiAgICAgICAgXSk7XG4gICAgICBjb25zdCB4TWlub3JJbnRlcnZhbEZvcm1hdCA9IGdldE1pbm9ySW50ZXJ2YWxGb3JtYXQoYmluSW50ZXJ2YWwpO1xuICAgICAgY29uc3QgW21pbkRhdGVWYWx1ZSwgbWF4RGF0ZVZhbHVlXSA9IGJpbm5lZERhdGVSYW5nZTtcbiAgICAgIGNvbnN0IG1pbm9yRm9ybWF0dGVyID0gdGltZUZvcm1hdCh4TWlub3JJbnRlcnZhbEZvcm1hdCk7XG4gICAgICBjb25zdCB4TWlub3JUaWNrcyA9IGdldFRpbWVJbnRlcnZhbChiaW5JbnRlcnZhbClcbiAgICAgICAgLnJhbmdlKG1pbkRhdGVWYWx1ZSwgdGltZURheS5vZmZzZXQobWF4RGF0ZVZhbHVlLCAxKSlcbiAgICAgICAgLm1hcChkYXRlID0+ICh7XG4gICAgICAgICAgdmFsdWU6IGRhdGUudmFsdWVPZigpLFxuICAgICAgICAgIGxhYmVsOiBtaW5vckZvcm1hdHRlcihkYXRlKSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoKF8sIGksIGFycikgPT5cbiAgICAgICAgICBhcnIubGVuZ3RoID4gdGhpcy5YX01JTk9SX1RJQ0tfTElNSVRcbiAgICAgICAgICAgID8gaSAlIE1hdGgucm91bmQoYXJyLmxlbmd0aCAvIHRoaXMuWF9NSU5PUl9USUNLX0xJTUlUKSA9PT0gMFxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICApO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWwgPSBnZXRNYWpvckludGVydmFsKGJpbkludGVydmFsKTtcbiAgICAgIGNvbnN0IHhNYWpvckludGVydmFsRm9ybWF0ID0gZ2V0TWFqb3JJbnRlcnZhbEZvcm1hdCh4TWFqb3JJbnRlcnZhbCk7XG4gICAgICBjb25zdCB0aW1lSW50ZXJ2YWwgPSBnZXRUaW1lSW50ZXJ2YWwoeE1ham9ySW50ZXJ2YWwpO1xuICAgICAgY29uc3QgdGlja0Zsb29yID0gdGltZUludGVydmFsLmZsb29yKG1pbkRhdGVWYWx1ZSk7XG4gICAgICBjb25zdCB0aWNrQ2VpbGluZyA9IHRpbWVJbnRlcnZhbC5jZWlsKHRpbWVEYXkub2Zmc2V0KG1heERhdGVWYWx1ZSwgMSkpO1xuICAgICAgY29uc3QgbWFqb3JGb3JtYXR0ZXIgPSB0aW1lRm9ybWF0KHhNYWpvckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IHhNYWpvclRpY2tzID0gdGltZUludGVydmFsXG4gICAgICAgIC5yYW5nZSh0aWNrRmxvb3IsIHRpY2tDZWlsaW5nKVxuICAgICAgICAubWFwKHRpY2tEYXRlID0+ICh7XG4gICAgICAgICAgbGFiZWw6IG1ham9yRm9ybWF0dGVyKHRpY2tEYXRlKSxcbiAgICAgICAgICB2YWx1ZTogdGlja0RhdGUudmFsdWVPZigpLFxuICAgICAgICB9KSk7XG4gICAgICBjb25zdCB4ID0geyB4TWF4OiBtYXhEYXRlVmFsdWUsIHhTY2FsZSwgeE1pbm9yVGlja3MsIHhNYWpvclRpY2tzIH07XG5cbiAgICAgIGNvbnN0IFt5MSwgeTJdID0gYmlubmVkRGF0YS5tYXAoY29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgZmxhdHRlbmVkVmFsdWVzID0gY29uZmlnLnNlcmllcy5yZWR1Y2U8bnVtYmVyW10+KFxuICAgICAgICAgICh2YWx1ZXMsIHNlcmllcykgPT4gW1xuICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICAgICAgLi4uc2VyaWVzLmRhdGEubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB5TWF4ID0gY29uZmlnLm1heCA/PyBNYXRoLm1heCguLi5mbGF0dGVuZWRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB5TWluID0gY29uZmlnLm1pbiA/PyBNYXRoLm1pbiguLi5mbGF0dGVuZWRWYWx1ZXMpO1xuICAgICAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcigpXG4gICAgICAgICAgLmRvbWFpbihbeU1pbiwgeU1heF0pXG4gICAgICAgICAgLnJhbmdlKFtcbiAgICAgICAgICAgIGhlaWdodCAtXG4gICAgICAgICAgICAgIHRoaXMuQk9UVE9NX09GRlNFVCAtXG4gICAgICAgICAgICAgICh0aGlzLkJPVFRPTV9QQURESU5HICsgdGhpcy5UT1BfUEFERElORyksXG4gICAgICAgICAgICB0aGlzLlRPUF9QQURESU5HLFxuICAgICAgICAgIF0pO1xuICAgICAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3ModGhpcy5ZX1RJQ0tfQ09VTlQpO1xuICAgICAgICBjb25zdCBzZXJpZXMgPSBjb25maWcuc2VyaWVzLm1hcChzZXJpZXMgPT4gKHtcbiAgICAgICAgICAuLi5zZXJpZXMsXG4gICAgICAgICAgcGF0aDogbGluZTxEYXRhUG9pbnQ+KClcbiAgICAgICAgICAgIC54KGQgPT4geFNjYWxlKGQuZGF0ZSkpXG4gICAgICAgICAgICAueShkID0+IHlTY2FsZShkLnZhbHVlKSkoc2VyaWVzLmRhdGEpLFxuICAgICAgICAgIHN0cm9rZTogYHZhcigke3Nlcmllcy5jb2xvclRva2VufSlgLFxuICAgICAgICAgIG1hcmtlcnM6IHNlcmllcy5kYXRhLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgICAgLi4ucG9pbnQsXG4gICAgICAgICAgICB4OiB4U2NhbGUocG9pbnQuZGF0ZSksXG4gICAgICAgICAgICB5OiB5U2NhbGUocG9pbnQudmFsdWUpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzZXJpZXMsXG4gICAgICAgICAgeU1heCxcbiAgICAgICAgICB5TWluLFxuICAgICAgICAgIHlTY2FsZSxcbiAgICAgICAgICB5VGlja3MsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHkyLCBjb2VyY2UgeTEncyB0aWNrcyB0byBiZSB2aXN1YWxseSBlcXVpdmFsZW50IHRvIHkyJ3MgdGlja3MuXG4gICAgICBpZiAoeTI/LnlUaWNrcykge1xuICAgICAgICBjb25zdCB0aWNrQ29udmVyc2lvblNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5yYW5nZSh5MS55U2NhbGUuZG9tYWluKCkpXG4gICAgICAgICAgLmRvbWFpbih5Mi55U2NhbGUuZG9tYWluKCkpO1xuICAgICAgICB5MS55VGlja3MgPSB5Mi55VGlja3MubWFwKHRpY2tDb252ZXJzaW9uU2NhbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB2aWV3Qm94LCB4LCB5MSwgeTIgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGxlZ2VuZCQgPSB0aGlzLmJpbm5lZERhdGEkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT5cbiAgICAgIGJpbm5lZERhdGEucmVkdWNlPExlZ2VuZEl0ZW1bXT4oXG4gICAgICAgIChpdGVtcywgY29uZmlnKSA9PiBbXG4gICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgLi4uY29uZmlnLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogc2VyaWVzLmxhYmVsLFxuICAgICAgICAgICAgY29sb3JUb2tlbjogc2VyaWVzLmNvbG9yVG9rZW4sXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgICBbXSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmJpbm5lZERhdGEkLnBpcGUoXG4gICAgbWFwKGJpbm5lZERhdGEgPT5cbiAgICAgIGJpbm5lZERhdGEuZXZlcnkoY29uZmlnID0+XG4gICAgICAgIGNvbmZpZy5zZXJpZXMuZXZlcnkoc2VyaWVzID0+IHNlcmllcy5kYXRhLmxlbmd0aCA9PT0gMCksXG4gICAgICApLFxuICAgICksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBob3ZlcmVkTWFya2VyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIGV2ZW50OiBNb3VzZUV2ZW50O1xuICAgIG1hcmtlcjogTWFya2VyO1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgY2FsbG91dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmhvdmVyZWRNYXJrZXIkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZE1hcmtlciwgZHJhd0RhdGFdKSA9PiB7XG4gICAgICBpZiAoIWhvdmVyZWRNYXJrZXIpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZE1hcmtlci5ldmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IG1hcmtlclJlY3QgPSAoPFNWR0NpcmNsZUVsZW1lbnQ+dGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHBhZGRpbmcgPSA4O1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIG1hcmtlclJlY3QubGVmdCAtIHBhZGRpbmcsXG4gICAgICAgIG1hcmtlclJlY3QudG9wIC0gcGFkZGluZyxcbiAgICAgICAgbWFya2VyUmVjdC53aWR0aCArIHBhZGRpbmcgKiAyLFxuICAgICAgICBtYXJrZXJSZWN0LmhlaWdodCArIHBhZGRpbmcgKiAyLFxuICAgICAgKTtcblxuICAgICAgdHlwZSBNZXRyaWMgPSB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGRyYXdEYXRhLnkxLnNlcmllcykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHNlcmllcy5tYXJrZXJzLmZpbmQoXG4gICAgICAgICAgbWFya2VyID0+IG1hcmtlci54ID09PSBob3ZlcmVkTWFya2VyLm1hcmtlci54LFxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBtZXRyaWNzLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBkcmF3RGF0YS55MS52YWx1ZUZvcm1hdHRlcihtYXRjaC52YWx1ZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRyYXdEYXRhLnkyKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGRyYXdEYXRhLnkyLnNlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gc2VyaWVzLm1hcmtlcnMuZmluZChcbiAgICAgICAgICAgIG1hcmtlciA9PiBtYXJrZXIueCA9PT0gaG92ZXJlZE1hcmtlci5tYXJrZXIueCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgbWV0cmljcy5wdXNoKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGRyYXdEYXRhLnkyLnZhbHVlRm9ybWF0dGVyKG1hdGNoLnZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBhbmNob3IsIG1ldHJpY3MgfTtcbiAgICB9KSxcbiAgKTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueC54TWFqb3JUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKHRpY2sudmFsdWUpXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICB3aWR0aD1cIjFcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZC55MS55U2NhbGUoMClcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwieC1tYWpvci10aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKHRpY2sudmFsdWUpXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnkxLnlTY2FsZSgwKVwiXG4gICAgICAgIGR4PVwiNFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueC54TWlub3JUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ4LW1pbm9yLXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImQueC54U2NhbGUodGljay52YWx1ZSlcIlxuICAgICAgICBbYXR0ci55XT1cImQueTEueVNjYWxlKDApXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICBkb21pbmFudC1iYXNlbGluZT1cImhhbmdpbmdcIlxuICAgICAgICBkeT1cIjhcIlxuICAgICAgPlxuICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICAgIDx0aXRsZT57eyB0aWNrLnZhbHVlIHwgZGF0ZSB9fTwvdGl0bGU+XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTEueVRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZC55MS55U2NhbGUodGljaylcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBoZWlnaHQ9XCIxXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dCBjbGFzcz1cInktdGljay1sYWJlbFwiIHg9XCIwXCIgW2F0dHIueV09XCJkLnkxLnlTY2FsZSh0aWNrKVwiIGR5PVwiLTRcIj5cbiAgICAgICAge3sgZC55MS52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueTI/LnlUaWNrc1wiPlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ5LXRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImQueC54U2NhbGUoZC54LnhNYXgpXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnkyPy55U2NhbGUodGljaylcIlxuICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgIGR5PVwiLTRcIlxuICAgICAgPlxuICAgICAgICB7eyBkLnkyPy52YWx1ZUZvcm1hdHRlcih0aWNrKSB9fVxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cblxuICAgIDxnICpuZ0lmPVwiaG92ZXJlZE1hcmtlciQgfCBhc3luYzsgbGV0IGhvdmVyZWRNYXJrZXJcIj5cbiAgICAgIDxsaW5lXG4gICAgICAgIGNsYXNzPVwiaG92ZXItcnVsZVwiXG4gICAgICAgIFthdHRyLngxXT1cImhvdmVyZWRNYXJrZXIubWFya2VyLnhcIlxuICAgICAgICBbYXR0ci55MV09XCJkLnkxLnlTY2FsZSgwKVwiXG4gICAgICAgIFthdHRyLngyXT1cImhvdmVyZWRNYXJrZXIubWFya2VyLnhcIlxuICAgICAgICBbYXR0ci55Ml09XCJkLnkxLnlTY2FsZShkLnkxLnlNYXgpXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0XCJcbiAgICAgIC8+XG4gICAgPC9nPlxuXG4gICAgPG5nLXRlbXBsYXRlICNzZXJpZXNUcGwgbGV0LXNlcmllcz1cInNlcmllc1wiPlxuICAgICAgPHBhdGhcbiAgICAgICAgY2xhc3M9XCJkYXRhIHBhdGhcIlxuICAgICAgICBbY2xhc3MubWFya2VyLWhvdmVyZWRdPVwiISEoaG92ZXJlZE1hcmtlciQgfCBhc3luYylcIlxuICAgICAgICBbYXR0ci5kXT1cInNlcmllcy5wYXRoXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNlcmllcy5zdHJva2VcIlxuICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlcmllcy5zdHlsZSA9PT0gJ2Rhc2hlZCcgPyAnNCcgOiBudWxsXCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8Y2lyY2xlXG4gICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2Ygc2VyaWVzLm1hcmtlcnNcIlxuICAgICAgICBjbGFzcz1cImRhdGEgbWFya2VyXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggPT09IG1hcmtlci54XCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggIT09IG1hcmtlci54XG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmN4XT1cIm1hcmtlci54XCJcbiAgICAgICAgW2F0dHIuY3ldPVwibWFya2VyLnlcIlxuICAgICAgICByPVwiMy41XCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIFthdHRyLnN0cm9rZV09XCJzZXJpZXMuc3Ryb2tlXCJcbiAgICAgICAgKG1vdXNlb3Zlcik9XCJob3ZlcmVkTWFya2VyJC5uZXh0KHsgZXZlbnQ6ICRldmVudCwgbWFya2VyOiBtYXJrZXIgfSlcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkTWFya2VyJC5uZXh0KG51bGwpXCJcbiAgICAgID48L2NpcmNsZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55MS5zZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZXJpZXNUcGw7IGNvbnRleHQ6IHsgc2VyaWVzOiBzZXJpZXMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55Mj8uc2VyaWVzXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VyaWVzVHBsOyBjb250ZXh0OiB7IHNlcmllczogc2VyaWVzIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZz5cbiAgPC9zdmc+XG4gIDxsZWdlbmQ+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGVnZW5kJCB8IGFzeW5jXCJcbiAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgIFtjb2xvclRva2VuXT1cIml0ZW0uY29sb3JUb2tlblwiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLWNlbnRlcidcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Lm1ldHJpY3NcIj5cbiAgICAgICAgPGRpdj57eyBtZXRyaWMubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgbWV0cmljLnZhbHVlIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi90aW1lLXNlcmllcy90aW1lLXNlcmllcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3RpbWUtc2VyaWVzL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUVMLE9BQU8sRUFDUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsR0FDVCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQXdCZCxJQUFLLFFBS0o7QUFMRCxXQUFLLFFBQVE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gseUJBQWEsQ0FBQTtJQUNiLDJCQUFlLENBQUE7SUFDZix5QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxJLFFBQVEsS0FBUixRQUFRLFFBS1o7QUFnQ0QsU0FBUyxlQUFlLENBQUMsUUFBa0I7SUFDekMsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxRQUFRLENBQUMsR0FBRztZQUNmLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLEtBQUssUUFB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YWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgeyBsaW5lIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHtcbiAgQ291bnRhYmxlVGltZUludGVydmFsLFxuICB0aW1lRGF5LFxuICB0aW1lTW9udGgsXG4gIHRpbWVXZWVrLFxuICB0aW1lWWVhcixcbn0gZnJvbSAnZDMtdGltZSc7XG5pbXBvcnQgeyB0aW1lRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgRGF0YVBvaW50ID0ge1xuICB2YWx1ZTogbnVtYmVyO1xuICBkYXRlOiBEYXRlO1xufTtcblxudHlwZSBTZXJpZXMgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNvbG9yVG9rZW46IHN0cmluZztcbiAgZGF0YTogRGF0YVBvaW50W107XG4gIHN0eWxlPzogJ3NvbGlkJyB8ICdkYXNoZWQnO1xufTtcblxudHlwZSBZQ29uZmlnID0ge1xuICBwb2ludFJlZHVjZXI6IChwb2ludHM6IERhdGFQb2ludFtdKSA9PiBudW1iZXI7XG4gIHZhbHVlRm9ybWF0dGVyOiAocmVkdWNlZFZhbHVlOiBudW1iZXIpID0+IHN0cmluZztcbiAgc2VyaWVzOiBTZXJpZXNbXTtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBUaW1lU2VyaWVzSW5wdXQgPSBbWUNvbmZpZ10gfCBbWUNvbmZpZywgWUNvbmZpZ107XG5cbmVudW0gSW50ZXJ2YWwge1xuICBEQVkgPSAnZGF5JyxcbiAgV0VFSyA9ICd3ZWVrJyxcbiAgTU9OVEggPSAnbW9udGgnLFxuICBZRUFSID0gJ3llYXInLFxufVxuXG50eXBlIExlZ2VuZEl0ZW0gPSB7IGxhYmVsOiBzdHJpbmc7IGNvbG9yVG9rZW46IHN0cmluZyB9O1xuXG50eXBlIFhUaWNrID0geyB2YWx1ZTogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH07XG5cbnR5cGUgTWFya2VyID0gRGF0YVBvaW50ICYgeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuXG50eXBlIFlEcmF3RGF0YSA9IFlDb25maWcgJiB7XG4gIHNlcmllczogKFNlcmllcyAmIHtcbiAgICBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0cm9rZTogc3RyaW5nO1xuICAgIG1hcmtlcnM6IE1hcmtlcltdO1xuICB9KVtdO1xuICB5TWF4OiBudW1iZXI7XG4gIHlNaW46IG51bWJlcjtcbiAgeVNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICB5VGlja3M6IG51bWJlcltdO1xufTtcblxudHlwZSBEcmF3RGF0YSA9IHtcbiAgdmlld0JveDogc3RyaW5nO1xuICB4OiB7XG4gICAgeFNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICAgIHhNaW5vclRpY2tzOiBYVGlja1tdO1xuICAgIHhNYWpvclRpY2tzOiBYVGlja1tdO1xuICAgIHhNYXg6IERhdGU7XG4gIH07XG4gIHkxOiBZRHJhd0RhdGE7XG4gIHkyPzogWURyYXdEYXRhO1xufTtcblxuZnVuY3Rpb24gZ2V0VGltZUludGVydmFsKGludGVydmFsOiBJbnRlcnZhbCk6IENvdW50YWJsZVRpbWVJbnRlcnZhbCB7XG4gIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICBjYXNlIEludGVydmFsLkRBWTpcbiAgICAgIHJldHVybiB0aW1lRGF5O1xuICAgIGNhc2UgSW50ZXJ2YWwuV0VFSzpcbiAgICAgIHJldHVybiB0aW1lV2VlaztcbiAgICBjYXNlIEludGVydmFsLk1PTlRIOlxuICAgICAgcmV0dXJuIHRpbWVNb250aDtcbiAgICBjYXNlIEludGVydmFsLllFQVI6XG4gICAgICByZXR1cm4gdGltZVllYXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVJhbmdlKGNvbmZpZ3M6IFlDb25maWdbXSk6IFtEYXRlLCBEYXRlXSB7XG4gIGxldCBtaW4gPSBJbmZpbml0eTtcbiAgbGV0IG1heCA9IC1JbmZpbml0eTtcbiAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGNvbmZpZy5zZXJpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgeyBkYXRlIH0gb2Ygc2VyaWVzLmRhdGEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2YWx1ZSk7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW25ldyBEYXRlKG1pbiksIG5ldyBEYXRlKG1heCldO1xufVxuXG5mdW5jdGlvbiBnZXRNaW5vckludGVydmFsRm9ybWF0KGludGVydmFsOiBJbnRlcnZhbCkge1xuICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgY2FzZSBJbnRlcnZhbC5EQVk6XG4gICAgY2FzZSBJbnRlcnZhbC5XRUVLOlxuICAgICAgcmV0dXJuICclLWQnO1xuICAgIGNhc2UgSW50ZXJ2YWwuTU9OVEg6XG4gICAgICByZXR1cm4gJyViJztcbiAgICBjYXNlIEludGVydmFsLllFQVI6XG4gICAgICByZXR1cm4gJyVZJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYWpvckludGVydmFsKGludGVydmFsOiBJbnRlcnZhbCkge1xuICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgY2FzZSBJbnRlcnZhbC5EQVk6XG4gICAgY2FzZSBJbnRlcnZhbC5XRUVLOlxuICAgICAgcmV0dXJuIEludGVydmFsLk1PTlRIO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuWUVBUjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYWpvckludGVydmFsRm9ybWF0KGludGVydmFsOiBJbnRlcnZhbCkge1xuICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgY2FzZSBJbnRlcnZhbC5ZRUFSOlxuICAgICAgcmV0dXJuICclWSc7XG4gICAgY2FzZSBJbnRlcnZhbC5NT05USDpcbiAgICAgIHJldHVybiAnJWIgJVknO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyVkJztcbiAgfVxufVxuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuIFNlZSBjb21taXQgZTIzOGMyZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi10aW1lLXNlcmllcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90aW1lLXNlcmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWUtc2VyaWVzLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVTZXJpZXNDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVNlcmllc0lucHV0PihbXG4gICAge1xuICAgICAgcG9pbnRSZWR1Y2VyOiBwb2ludHMgPT5cbiAgICAgICAgcG9pbnRzLnJlZHVjZSgodG90YWwsIHsgdmFsdWUgfSkgPT4gdG90YWwgKyB2YWx1ZSwgMCksXG4gICAgICB2YWx1ZUZvcm1hdHRlcjogdiA9PiBuZXcgRGVjaW1hbFBpcGUoJ2VuLVVTJykudHJhbnNmb3JtKHYpID8/ICcnLFxuICAgICAgc2VyaWVzOiBbXSxcbiAgICB9LFxuICBdKTtcbiAgQElucHV0KClcbiAgc2V0IGlucHV0KHY6IFRpbWVTZXJpZXNJbnB1dCkge1xuICAgIHRoaXMuaW5wdXQkLm5leHQodik7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPig5NjApO1xuICBASW5wdXQoKVxuICBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigyNTYpO1xuICBASW5wdXQoKVxuICBzZXQgaGVpZ2h0KHY6IG51bWJlcikge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG5cbiAgcmVhZG9ubHkgQk9UVE9NX09GRlNFVCA9IDI0O1xuICByZWFkb25seSBMRUZUX09GRlNFVCA9IDQ4O1xuICByZWFkb25seSBUT1BfUEFERElORyA9IDE2O1xuICByZWFkb25seSBMRUZUX1JJR0hUX1BBRERJTkcgPSA4O1xuICByZWFkb25seSBCT1RUT01fUEFERElORyA9IDg7XG4gIHJlYWRvbmx5IFlfVElDS19DT1VOVCA9IDU7XG4gIHJlYWRvbmx5IFhfTUlOT1JfVElDS19MSU1JVCA9IDE1O1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChnZXREYXRlUmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmluSW50ZXJ2YWwkID0gdGhpcy5kYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKChbbWluRGF0ZSwgbWF4RGF0ZV0pID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSB0aW1lRGF5LmNvdW50KG5ldyBEYXRlKG1pbkRhdGUpLCBuZXcgRGF0ZShtYXhEYXRlKSk7XG4gICAgICBpZiAoZGlmZiA+PSAzNjUgKiAzKSB7XG4gICAgICAgIHJldHVybiBJbnRlcnZhbC5ZRUFSO1xuICAgICAgfSBlbHNlIGlmIChkaWZmID49IDM2NSkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuTU9OVEg7XG4gICAgICB9IGVsc2UgaWYgKGRpZmYgPj0gOTApIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLldFRUs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuREFZO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0YSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlucHV0JCwgdGhpcy5iaW5JbnRlcnZhbCRdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCBiaW5JbnRlcnZhbF0pID0+XG4gICAgICBpbnB1dC5tYXAoKGNvbmZpZyk6IFlDb25maWcgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBzZXJpZXM6IGNvbmZpZy5zZXJpZXMubWFwKHNlcmllcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5uZWQgPSBuZXcgTWFwPG51bWJlciwgRGF0YVBvaW50W10+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHNlcmllcy5kYXRhKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJpbiA9IGdldFRpbWVJbnRlcnZhbChiaW5JbnRlcnZhbClcbiAgICAgICAgICAgICAgICAuZmxvb3IocG9pbnQuZGF0ZSlcbiAgICAgICAgICAgICAgICAudmFsdWVPZigpO1xuICAgICAgICAgICAgICBpZiAoIWJpbm5lZC5oYXMoYmluKSkge1xuICAgICAgICAgICAgICAgIGJpbm5lZC5zZXQoYmluLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYmlubmVkLmdldChiaW4pIS5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnNlcmllcyxcbiAgICAgICAgICAgICAgZGF0YTogWy4uLmJpbm5lZC5lbnRyaWVzKCldLm1hcCgoW2RhdGVWYWx1ZSwgcG9pbnRzXSkgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZShkYXRlVmFsdWUpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb25maWcucG9pbnRSZWR1Y2VyKHBvaW50cyksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgYmlubmVkRGF0ZVJhbmdlJCA9IHRoaXMuYmlubmVkRGF0YSQucGlwZShcbiAgICBtYXAoZ2V0RGF0ZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIHJlYWRvbmx5IGRyYXdEYXRhJDogT2JzZXJ2YWJsZTxEcmF3RGF0YT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmJpbm5lZERhdGEkLFxuICAgIHRoaXMuYmlubmVkRGF0ZVJhbmdlJCxcbiAgICB0aGlzLmJpbkludGVydmFsJCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmhlaWdodCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbYmlubmVkRGF0YSwgYmlubmVkRGF0ZVJhbmdlLCBiaW5JbnRlcnZhbCwgd2lkdGgsIGhlaWdodF0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWA7XG5cbiAgICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihiaW5uZWREYXRlUmFuZ2UpXG4gICAgICAgIC5yYW5nZShbXG4gICAgICAgICAgdGhpcy5MRUZUX09GRlNFVCArIHRoaXMuTEVGVF9SSUdIVF9QQURESU5HLFxuICAgICAgICAgIHdpZHRoIC0gdGhpcy5MRUZUX1JJR0hUX1BBRERJTkcgKiAyLFxuICAgICAgICBdKTtcbiAgICAgIGNvbnN0IHhNaW5vckludGVydmFsRm9ybWF0ID0gZ2V0TWlub3JJbnRlcnZhbEZvcm1hdChiaW5JbnRlcnZhbCk7XG4gICAgICBjb25zdCBbbWluRGF0ZVZhbHVlLCBtYXhEYXRlVmFsdWVdID0gYmlubmVkRGF0ZVJhbmdlO1xuICAgICAgY29uc3QgbWlub3JGb3JtYXR0ZXIgPSB0aW1lRm9ybWF0KHhNaW5vckludGVydmFsRm9ybWF0KTtcbiAgICAgIGNvbnN0IHhNaW5vclRpY2tzID0gZ2V0VGltZUludGVydmFsKGJpbkludGVydmFsKVxuICAgICAgICAucmFuZ2UobWluRGF0ZVZhbHVlLCB0aW1lRGF5Lm9mZnNldChtYXhEYXRlVmFsdWUsIDEpKVxuICAgICAgICAubWFwKGRhdGUgPT4gKHtcbiAgICAgICAgICB2YWx1ZTogZGF0ZS52YWx1ZU9mKCksXG4gICAgICAgICAgbGFiZWw6IG1pbm9yRm9ybWF0dGVyKGRhdGUpLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoXywgaSwgYXJyKSA9PlxuICAgICAgICAgIGFyci5sZW5ndGggPiB0aGlzLlhfTUlOT1JfVElDS19MSU1JVFxuICAgICAgICAgICAgPyBpICUgTWF0aC5yb3VuZChhcnIubGVuZ3RoIC8gdGhpcy5YX01JTk9SX1RJQ0tfTElNSVQpID09PSAwXG4gICAgICAgICAgICA6IHRydWUsXG4gICAgICAgICk7XG4gICAgICBjb25zdCB4TWFqb3JJbnRlcnZhbCA9IGdldE1ham9ySW50ZXJ2YWwoYmluSW50ZXJ2YWwpO1xuICAgICAgY29uc3QgeE1ham9ySW50ZXJ2YWxGb3JtYXQgPSBnZXRNYWpvckludGVydmFsRm9ybWF0KHhNYWpvckludGVydmFsKTtcbiAgICAgIGNvbnN0IHRpbWVJbnRlcnZhbCA9IGdldFRpbWVJbnRlcnZhbCh4TWFqb3JJbnRlcnZhbCk7XG4gICAgICBjb25zdCB0aWNrRmxvb3IgPSB0aW1lSW50ZXJ2YWwuZmxvb3IobWluRGF0ZVZhbHVlKTtcbiAgICAgIGNvbnN0IHRpY2tDZWlsaW5nID0gdGltZUludGVydmFsLmNlaWwodGltZURheS5vZmZzZXQobWF4RGF0ZVZhbHVlLCAxKSk7XG4gICAgICBjb25zdCBtYWpvckZvcm1hdHRlciA9IHRpbWVGb3JtYXQoeE1ham9ySW50ZXJ2YWxGb3JtYXQpO1xuICAgICAgY29uc3QgeE1ham9yVGlja3MgPSB0aW1lSW50ZXJ2YWxcbiAgICAgICAgLnJhbmdlKHRpY2tGbG9vciwgdGlja0NlaWxpbmcpXG4gICAgICAgIC5tYXAodGlja0RhdGUgPT4gKHtcbiAgICAgICAgICBsYWJlbDogeE1ham9ySW50ZXJ2YWwgPT09IGJpbkludGVydmFsID8gJycgOiBtYWpvckZvcm1hdHRlcih0aWNrRGF0ZSksXG4gICAgICAgICAgdmFsdWU6IHRpY2tEYXRlLnZhbHVlT2YoKSxcbiAgICAgICAgfSkpO1xuICAgICAgY29uc3QgeCA9IHsgeE1heDogbWF4RGF0ZVZhbHVlLCB4U2NhbGUsIHhNaW5vclRpY2tzLCB4TWFqb3JUaWNrcyB9O1xuXG4gICAgICBjb25zdCBbeTEsIHkyXSA9IGJpbm5lZERhdGEubWFwKGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZFZhbHVlcyA9IGNvbmZpZy5zZXJpZXMucmVkdWNlPG51bWJlcltdPihcbiAgICAgICAgICAodmFsdWVzLCBzZXJpZXMpID0+IFtcbiAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgIC4uLnNlcmllcy5kYXRhLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeU1heCA9IGNvbmZpZy5tYXggPz8gTWF0aC5tYXgoLi4uZmxhdHRlbmVkVmFsdWVzKTtcbiAgICAgICAgY29uc3QgeU1pbiA9IGNvbmZpZy5taW4gPz8gTWF0aC5taW4oLi4uZmxhdHRlbmVkVmFsdWVzLCAwKTtcbiAgICAgICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5kb21haW4oW3lNaW4sIHlNYXhdKVxuICAgICAgICAgIC5yYW5nZShbXG4gICAgICAgICAgICBoZWlnaHQgLVxuICAgICAgICAgICAgICB0aGlzLkJPVFRPTV9PRkZTRVQgLVxuICAgICAgICAgICAgICAodGhpcy5CT1RUT01fUEFERElORyArIHRoaXMuVE9QX1BBRERJTkcpLFxuICAgICAgICAgICAgdGhpcy5UT1BfUEFERElORyxcbiAgICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKHRoaXMuWV9USUNLX0NPVU5UKTtcbiAgICAgICAgY29uc3Qgc2VyaWVzID0gY29uZmlnLnNlcmllcy5tYXAoc2VyaWVzID0+ICh7XG4gICAgICAgICAgLi4uc2VyaWVzLFxuICAgICAgICAgIHBhdGg6IGxpbmU8RGF0YVBvaW50PigpXG4gICAgICAgICAgICAueChkID0+IHhTY2FsZShkLmRhdGUpKVxuICAgICAgICAgICAgLnkoZCA9PiB5U2NhbGUoZC52YWx1ZSkpKHNlcmllcy5kYXRhKSxcbiAgICAgICAgICBzdHJva2U6IGB2YXIoJHtzZXJpZXMuY29sb3JUb2tlbn0pYCxcbiAgICAgICAgICBtYXJrZXJzOiBzZXJpZXMuZGF0YS5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICAgIC4uLnBvaW50LFxuICAgICAgICAgICAgeDogeFNjYWxlKHBvaW50LmRhdGUpLFxuICAgICAgICAgICAgeTogeVNjYWxlKHBvaW50LnZhbHVlKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgc2VyaWVzLFxuICAgICAgICAgIHlNYXgsXG4gICAgICAgICAgeU1pbixcbiAgICAgICAgICB5U2NhbGUsXG4gICAgICAgICAgeVRpY2tzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSB5MiwgY29lcmNlIHkxJ3MgdGlja3MgdG8gYmUgdmlzdWFsbHkgZXF1aXZhbGVudCB0byB5MidzIHRpY2tzLlxuICAgICAgaWYgKHkyPy55VGlja3MpIHtcbiAgICAgICAgY29uc3QgdGlja0NvbnZlcnNpb25TY2FsZSA9IHNjYWxlTGluZWFyKClcbiAgICAgICAgICAucmFuZ2UoeTEueVNjYWxlLmRvbWFpbigpKVxuICAgICAgICAgIC5kb21haW4oeTIueVNjYWxlLmRvbWFpbigpKTtcbiAgICAgICAgeTEueVRpY2tzID0geTIueVRpY2tzLm1hcCh0aWNrQ29udmVyc2lvblNjYWxlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdmlld0JveCwgeCwgeTEsIHkyIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICByZWFkb25seSBsZWdlbmQkID0gdGhpcy5iaW5uZWREYXRhJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+XG4gICAgICBiaW5uZWREYXRhLnJlZHVjZTxMZWdlbmRJdGVtW10+KFxuICAgICAgICAoaXRlbXMsIGNvbmZpZykgPT4gW1xuICAgICAgICAgIC4uLml0ZW1zLFxuICAgICAgICAgIC4uLmNvbmZpZy5zZXJpZXMubWFwKHNlcmllcyA9PiAoe1xuICAgICAgICAgICAgbGFiZWw6IHNlcmllcy5sYWJlbCxcbiAgICAgICAgICAgIGNvbG9yVG9rZW46IHNlcmllcy5jb2xvclRva2VuLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSxcbiAgICAgICAgW10sXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgcmVhZG9ubHkgZW1wdHkkID0gdGhpcy5iaW5uZWREYXRhJC5waXBlKFxuICAgIG1hcChiaW5uZWREYXRhID0+XG4gICAgICBiaW5uZWREYXRhLmV2ZXJ5KGNvbmZpZyA9PlxuICAgICAgICBjb25maWcuc2VyaWVzLmV2ZXJ5KHNlcmllcyA9PiBzZXJpZXMuZGF0YS5sZW5ndGggPT09IDApLFxuICAgICAgKSxcbiAgICApLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgcmVhZG9ubHkgaG92ZXJlZE1hcmtlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgICBtYXJrZXI6IE1hcmtlcjtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIHJlYWRvbmx5IGNhbGxvdXQkID0gY29tYmluZUxhdGVzdChbdGhpcy5ob3ZlcmVkTWFya2VyJCwgdGhpcy5kcmF3RGF0YSRdKS5waXBlKFxuICAgIG1hcCgoW2hvdmVyZWRNYXJrZXIsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkTWFya2VyKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGhvdmVyZWRNYXJrZXIuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBtYXJrZXJSZWN0ID0gKDxTVkdDaXJjbGVFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBtYXJrZXJSZWN0LmxlZnQgLSBwYWRkaW5nLFxuICAgICAgICBtYXJrZXJSZWN0LnRvcCAtIHBhZGRpbmcsXG4gICAgICAgIG1hcmtlclJlY3Qud2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgICAgbWFya2VyUmVjdC5oZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICAgICk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHNlcmllcyBvZiBkcmF3RGF0YS55MS5zZXJpZXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzZXJpZXMubWFya2Vycy5maW5kKFxuICAgICAgICAgIG1hcmtlciA9PiBtYXJrZXIueCA9PT0gaG92ZXJlZE1hcmtlci5tYXJrZXIueCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbWV0cmljcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogZHJhd0RhdGEueTEudmFsdWVGb3JtYXR0ZXIobWF0Y2gudmFsdWUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmF3RGF0YS55Mikge1xuICAgICAgICBmb3IgKGNvbnN0IHNlcmllcyBvZiBkcmF3RGF0YS55Mi5zZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHNlcmllcy5tYXJrZXJzLmZpbmQoXG4gICAgICAgICAgICBtYXJrZXIgPT4gbWFya2VyLnggPT09IGhvdmVyZWRNYXJrZXIubWFya2VyLngsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIG1ldHJpY3MucHVzaCh7XG4gICAgICAgICAgICAgIGxhYmVsOiBzZXJpZXMubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOiBkcmF3RGF0YS55Mi52YWx1ZUZvcm1hdHRlcihtYXRjaC52YWx1ZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICk7XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIShlbXB0eSQgfCBhc3luYyk7IGVsc2UgemVyb1N0YXRlXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gID5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLngueE1ham9yVGlja3NcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwidGlja1wiXG4gICAgICAgIFthdHRyLnhdPVwiZC54LnhTY2FsZSh0aWNrLnZhbHVlKVwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgd2lkdGg9XCIxXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImQueTEueVNjYWxlKGQueTEueU1pbilcIlxuICAgICAgPjwvcmVjdD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwieC1tYWpvci10aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKHRpY2sudmFsdWUpXCJcbiAgICAgICAgW2F0dHIueV09XCJkLnkxLnlTY2FsZShkLnkxLnlNaW4pXCJcbiAgICAgICAgZHg9XCI0XCJcbiAgICAgICAgZHk9XCItNFwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54LnhNaW5vclRpY2tzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cIngtbWlub3ItdGljay1sYWJlbFwiXG4gICAgICAgIFthdHRyLnhdPVwiZC54LnhTY2FsZSh0aWNrLnZhbHVlKVwiXG4gICAgICAgIFthdHRyLnldPVwiZC55MS55U2NhbGUoZC55MS55TWluKVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU9XCJoYW5naW5nXCJcbiAgICAgICAgZHk9XCI4XCJcbiAgICAgID5cbiAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgICA8dGl0bGU+e3sgdGljay52YWx1ZSB8IGRhdGUgfX08L3RpdGxlPlxuICAgICAgPC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnkxLnlUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICBbYXR0ci55XT1cImQueTEueVNjYWxlKHRpY2spXCJcbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgaGVpZ2h0PVwiMVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHQgY2xhc3M9XCJ5LXRpY2stbGFiZWxcIiB4PVwiMFwiIFthdHRyLnldPVwiZC55MS55U2NhbGUodGljaylcIiBkeT1cIi00XCI+XG4gICAgICAgIHt7IGQueTEudmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnkyPy55VGlja3NcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIGNsYXNzPVwieS10aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkLngueFNjYWxlKGQueC54TWF4KVwiXG4gICAgICAgIFthdHRyLnldPVwiZC55Mj8ueVNjYWxlKHRpY2spXCJcbiAgICAgICAgdGV4dC1hbmNob3I9XCJlbmRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgZC55Mj8udmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG5cbiAgICA8ZyAqbmdJZj1cImhvdmVyZWRNYXJrZXIkIHwgYXN5bmM7IGxldCBob3ZlcmVkTWFya2VyXCI+XG4gICAgICA8bGluZVxuICAgICAgICBjbGFzcz1cImhvdmVyLXJ1bGVcIlxuICAgICAgICBbYXR0ci54MV09XCJob3ZlcmVkTWFya2VyLm1hcmtlci54XCJcbiAgICAgICAgW2F0dHIueTFdPVwiZC55MS55U2NhbGUoZC55MS55TWluKVwiXG4gICAgICAgIFthdHRyLngyXT1cImhvdmVyZWRNYXJrZXIubWFya2VyLnhcIlxuICAgICAgICBbYXR0ci55Ml09XCJkLnkxLnlTY2FsZShkLnkxLnlNYXgpXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0XCJcbiAgICAgIC8+XG4gICAgPC9nPlxuXG4gICAgPG5nLXRlbXBsYXRlICNzZXJpZXNUcGwgbGV0LXNlcmllcz1cInNlcmllc1wiPlxuICAgICAgPHBhdGhcbiAgICAgICAgY2xhc3M9XCJkYXRhIHBhdGhcIlxuICAgICAgICBbY2xhc3MubWFya2VyLWhvdmVyZWRdPVwiISEoaG92ZXJlZE1hcmtlciQgfCBhc3luYylcIlxuICAgICAgICBbYXR0ci5kXT1cInNlcmllcy5wYXRoXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNlcmllcy5zdHJva2VcIlxuICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlcmllcy5zdHlsZSA9PT0gJ2Rhc2hlZCcgPyAnNCcgOiBudWxsXCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8Y2lyY2xlXG4gICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2Ygc2VyaWVzLm1hcmtlcnNcIlxuICAgICAgICBjbGFzcz1cImRhdGEgbWFya2VyXCJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggPT09IG1hcmtlci54XCJcbiAgICAgICAgW2NsYXNzLmJsdXJyZWRdPVwiXG4gICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpICE9PSBudWxsICYmXG4gICAgICAgICAgKGhvdmVyZWRNYXJrZXIkIHwgYXN5bmMpPy5tYXJrZXI/LnggIT09IG1hcmtlci54XG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmN4XT1cIm1hcmtlci54XCJcbiAgICAgICAgW2F0dHIuY3ldPVwibWFya2VyLnlcIlxuICAgICAgICByPVwiMy41XCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIFthdHRyLnN0cm9rZV09XCJzZXJpZXMuc3Ryb2tlXCJcbiAgICAgICAgKG1vdXNlb3Zlcik9XCJob3ZlcmVkTWFya2VyJC5uZXh0KHsgZXZlbnQ6ICRldmVudCwgbWFya2VyOiBtYXJrZXIgfSlcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkTWFya2VyJC5uZXh0KG51bGwpXCJcbiAgICAgID48L2NpcmNsZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55MS5zZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZXJpZXNUcGw7IGNvbnRleHQ6IHsgc2VyaWVzOiBzZXJpZXMgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCBzZXJpZXMgb2YgZC55Mj8uc2VyaWVzXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VyaWVzVHBsOyBjb250ZXh0OiB7IHNlcmllczogc2VyaWVzIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZz5cbiAgPC9zdmc+XG4gIDxsZWdlbmQ+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGVnZW5kJCB8IGFzeW5jXCJcbiAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgIFtjb2xvclRva2VuXT1cIml0ZW0uY29sb3JUb2tlblwiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLWNlbnRlcidcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Lm1ldHJpY3NcIj5cbiAgICAgICAgPGRpdj57eyBtZXRyaWMubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgbWV0cmljLnZhbHVlIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -742,7 +742,7 @@ function getMinorIntervalFormat(interval) {
742
742
  case Interval.MONTH:
743
743
  return '%b';
744
744
  case Interval.YEAR:
745
- return "'%y";
745
+ return '%Y';
746
746
  }
747
747
  }
748
748
  function getMajorInterval(interval) {
@@ -787,7 +787,7 @@ class TimeSeriesComponent {
787
787
  this.dateRange$ = this.input$.pipe(map(getDateRange$1), shareReplay({ refCount: true, bufferSize: 1 }));
788
788
  this.binInterval$ = this.dateRange$.pipe(map(([minDate, maxDate]) => {
789
789
  const diff = timeDay.count(new Date(minDate), new Date(maxDate));
790
- if (diff >= 730) {
790
+ if (diff >= 365 * 3) {
791
791
  return Interval.YEAR;
792
792
  }
793
793
  else if (diff >= 365) {
@@ -854,7 +854,7 @@ class TimeSeriesComponent {
854
854
  const xMajorTicks = timeInterval
855
855
  .range(tickFloor, tickCeiling)
856
856
  .map(tickDate => ({
857
- label: majorFormatter(tickDate),
857
+ label: xMajorInterval === binInterval ? '' : majorFormatter(tickDate),
858
858
  value: tickDate.valueOf(),
859
859
  }));
860
860
  const x = { xMax: maxDateValue, xScale, xMinorTicks, xMajorTicks };
@@ -865,7 +865,7 @@ class TimeSeriesComponent {
865
865
  ...series.data.map(({ value }) => value),
866
866
  ], []);
867
867
  const yMax = (_a = config.max) !== null && _a !== void 0 ? _a : Math.max(...flattenedValues);
868
- const yMin = (_b = config.min) !== null && _b !== void 0 ? _b : Math.min(...flattenedValues);
868
+ const yMin = (_b = config.min) !== null && _b !== void 0 ? _b : Math.min(...flattenedValues, 0);
869
869
  const yScale = scaleLinear()
870
870
  .domain([yMin, yMax])
871
871
  .range([
@@ -946,10 +946,10 @@ class TimeSeriesComponent {
946
946
  }
947
947
  }
948
948
  TimeSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
949
- TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility"], outputs: ["itemClick"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
949
+ TimeSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TimeSeriesComponent, selector: "riv-time-series", inputs: { input: "input", width: "width", height: "height" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(d.y1.yMin)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "directive", type: CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility"], outputs: ["itemClick"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
950
950
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TimeSeriesComponent, decorators: [{
951
951
  type: Component,
952
- args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(0)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(0)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(0)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
952
+ args: [{ selector: 'riv-time-series', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let d\"\n [attr.viewBox]=\"d.viewBox\"\n >\n <g *ngFor=\"let tick of d.x.xMajorTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n y=\"0\"\n width=\"1\"\n [attr.height]=\"d.y1.yScale(d.y1.yMin)\"\n ></rect>\n <text\n class=\"x-major-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ tick.label }}\n </text>\n </g>\n <g *ngFor=\"let tick of d.x.xMinorTicks\">\n <text\n class=\"x-minor-tick-label\"\n [attr.x]=\"d.x.xScale(tick.value)\"\n [attr.y]=\"d.y1.yScale(d.y1.yMin)\"\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n dy=\"8\"\n >\n {{ tick.label }}\n <title>{{ tick.value | date }}</title>\n </text>\n </g>\n <g *ngFor=\"let tick of d.y1.yTicks\">\n <rect\n class=\"tick\"\n x=\"0\"\n [attr.y]=\"d.y1.yScale(tick)\"\n width=\"100%\"\n height=\"1\"\n ></rect>\n <text class=\"y-tick-label\" x=\"0\" [attr.y]=\"d.y1.yScale(tick)\" dy=\"-4\">\n {{ d.y1.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngFor=\"let tick of d.y2?.yTicks\">\n <text\n class=\"y-tick-label\"\n [attr.x]=\"d.x.xScale(d.x.xMax)\"\n [attr.y]=\"d.y2?.yScale(tick)\"\n text-anchor=\"end\"\n dy=\"-4\"\n >\n {{ d.y2?.valueFormatter(tick) }}\n </text>\n </g>\n\n <g *ngIf=\"hoveredMarker$ | async; let hoveredMarker\">\n <line\n class=\"hover-rule\"\n [attr.x1]=\"hoveredMarker.marker.x\"\n [attr.y1]=\"d.y1.yScale(d.y1.yMin)\"\n [attr.x2]=\"hoveredMarker.marker.x\"\n [attr.y2]=\"d.y1.yScale(d.y1.yMax)\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n\n <ng-template #seriesTpl let-series=\"series\">\n <path\n class=\"data path\"\n [class.marker-hovered]=\"!!(hoveredMarker$ | async)\"\n [attr.d]=\"series.path\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n [attr.stroke-dasharray]=\"series.style === 'dashed' ? '4' : null\"\n ></path>\n <circle\n *ngFor=\"let marker of series.markers\"\n class=\"data marker\"\n [class.focused]=\"(hoveredMarker$ | async)?.marker?.x === marker.x\"\n [class.blurred]=\"\n (hoveredMarker$ | async) !== null &&\n (hoveredMarker$ | async)?.marker?.x !== marker.x\n \"\n [attr.cx]=\"marker.x\"\n [attr.cy]=\"marker.y\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"series.stroke\"\n (mouseover)=\"hoveredMarker$.next({ event: $event, marker: marker })\"\n (mouseleave)=\"hoveredMarker$.next(null)\"\n ></circle>\n </ng-template>\n <g *ngFor=\"let series of d.y1.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n <g *ngFor=\"let series of d.y2?.series\">\n <ng-container\n *ngTemplateOutlet=\"seriesTpl; context: { series: series }\"\n ></ng-container>\n </g>\n </svg>\n <legend>\n <riv-legend-item\n *ngFor=\"let item of legend$ | async\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state></riv-zero-state>\n</ng-template>\n", styles: [".container{display:flex;flex-direction:column;gap:var(--size-xlarge)}.y-tick-label,.x-major-tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.x-minor-tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast);text-anchor:middle}.tick{fill:var(--gray-20)}.data.path{transition:stroke-opacity var(--short-transition)}.data.path.marker-hovered{stroke-opacity:.4}.data.marker{fill:var(--surface-light-0);transition:stroke-opacity var(--short-transition)}.data.marker.focused{stroke-opacity:1;filter:drop-shadow(0 1px 1px rgba(10,2,22,.15))}.data.marker.blurred{stroke-opacity:.4}.hover-rule{stroke:var(--gray-20)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:flex;gap:var(--size-medium)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
953
953
  }], propDecorators: { input: [{
954
954
  type: Input
955
955
  }], width: [{