pdm-ui-kit 0.1.12 → 0.1.13

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.
@@ -5,32 +5,29 @@ export class PdmChartComponent {
5
5
  constructor() {
6
6
  this.type = 'bar';
7
7
  this.className = '';
8
- this.title = 'Bar Chart - Interactive';
9
- this.description = 'Showing total visitors for the last 3 months';
10
- this.desktopLabel = 'Desktop';
11
- this.desktopValue = '24,828';
12
- this.mobileLabel = 'Mobile';
13
- this.mobileValue = '25,010';
14
- this.labels = ['Apr 9', 'Apr 19', 'Apr 29', 'May 9', 'May 19', 'May 29', 'Jun 9', 'Jun 19', 'Jun 30'];
15
- this.bars = [
16
- 48, 21, 53, 69, 56, 77, 12, 54, 61, 59, 66, 27, 24, 27, 84, 62, 44, 18, 45, 57,
17
- 45, 72, 56, 15, 73, 25, 59, 86, 49, 59, 69, 93, 96, 72, 30, 58, 75, 67, 43, 43,
18
- 84, 89, 62, 96, 59, 72, 82, 34, 34, 70, 62, 42, 40, 80, 60, 33, 67, 34, 34, 88,
19
- 22, 84, 19, 62, 56, 43, 95, 70, 67, 89, 84, 31, 18, 92, 16, 87, 54, 44, 91, 23,
20
- 67, 77, 49, 59, 93, 26, 29, 81, 84, 30, 22, 84
21
- ];
22
- this.line = [40, 28, 56, 49, 73, 67, 81, 58, 92];
23
- this.pie = [35, 28, 20, 17];
24
- this.radar = [72, 58, 88, 64, 79, 70];
25
- this.radialValue = 76;
26
- this.radialLabel = 'Completion';
27
- this.radialDescription = 'Updated monthly';
28
- this.tooltipTitle = 'June 2024';
29
- this.tooltipPrimaryLabel = 'Desktop';
30
- this.tooltipPrimaryValue = '12,450';
31
- this.tooltipSecondaryLabel = 'Mobile';
32
- this.tooltipSecondaryValue = '8,110';
33
- this.pieLabels = ['Desktop', 'Mobile', 'Tablet', 'Other'];
8
+ this.title = '';
9
+ this.description = '';
10
+ this.desktopLabel = '';
11
+ this.desktopValue = '';
12
+ this.mobileLabel = '';
13
+ this.mobileValue = '';
14
+ this.labels = [];
15
+ this.bars = [];
16
+ this.line = [];
17
+ this.pie = [];
18
+ this.radar = [];
19
+ this.radialValue = 0;
20
+ this.radialLabel = '';
21
+ this.radialDescription = '';
22
+ this.tooltipTitle = '';
23
+ this.tooltipPrimaryLabel = '';
24
+ this.tooltipPrimaryValue = '';
25
+ this.tooltipSecondaryLabel = '';
26
+ this.tooltipSecondaryValue = '';
27
+ this.pieLabels = [];
28
+ this.tooltipHint = '';
29
+ this.radarMetricPrefix = 'Metric';
30
+ this.emptyLabel = 'No data available';
34
31
  }
35
32
  get normalizedBars() {
36
33
  if (!this.bars.length) {
@@ -122,10 +119,10 @@ export class PdmChartComponent {
122
119
  }
123
120
  }
124
121
  PdmChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
125
- PdmChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmChartComponent, selector: "pdm-chart", inputs: { type: "type", className: "className", title: "title", description: "description", desktopLabel: "desktopLabel", desktopValue: "desktopValue", mobileLabel: "mobileLabel", mobileValue: "mobileValue", labels: "labels", bars: "bars", line: "line", pie: "pie", radar: "radar", radialValue: "radialValue", radialLabel: "radialLabel", radialDescription: "radialDescription", tooltipTitle: "tooltipTitle", tooltipPrimaryLabel: "tooltipPrimaryLabel", tooltipPrimaryValue: "tooltipPrimaryValue", tooltipSecondaryLabel: "tooltipSecondaryLabel", tooltipSecondaryValue: "tooltipSecondaryValue", pieLabels: "pieLabels" }, ngImport: i0, template: "<section [ngClass]=\"['w-full rounded-lg border border-border bg-card text-card-foreground', className]\">\n <div class=\"flex w-full items-stretch border-b border-border\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 px-6 pb-3 pt-4\">\n <h3 class=\"m-0 text-sm font-semibold leading-none tracking-tight\">{{ title }}</h3>\n <p class=\"m-0 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n\n <div class=\"flex h-24\">\n <div class=\"flex h-full w-44 flex-col justify-center border-l border-border bg-muted px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ desktopLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ desktopValue }}</span>\n </div>\n <div class=\"flex h-full w-44 flex-col justify-center px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ mobileLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ mobileValue }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"w-full p-6\">\n <ng-container [ngSwitch]=\"type\">\n <div *ngSwitchCase=\"'bar'\" class=\"flex h-60 w-full flex-col justify-end gap-2\">\n <div class=\"relative h-48 w-full overflow-hidden\">\n <div class=\"absolute bottom-0 left-0 right-0 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/2 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-3/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute inset-x-0 bottom-0 flex h-48 items-end gap-0.5 px-0.5\">\n <div *ngFor=\"let bar of normalizedBars\" class=\"w-1.5 rounded-sm bg-primary\" [style.height.px]=\"bar\"></div>\n </div>\n </div>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'line'\" class=\"flex h-60 w-full flex-col gap-2\">\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'area'\" class=\"flex h-60 w-full flex-col gap-2\">\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <defs>\n <linearGradient id=\"pdm-chart-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.35\"></stop>\n <stop offset=\"100%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.02\"></stop>\n </linearGradient>\n </defs>\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"areaPath\" fill=\"url(#pdm-chart-area-gradient)\"></path>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'pie'\" class=\"flex items-center gap-6\">\n <div class=\"relative h-40 w-40 rounded-full\" [style.background]=\"pieGradient\">\n <div class=\"absolute inset-7 rounded-full bg-card\"></div>\n </div>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let segment of pieSegments\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <div class=\"flex items-center gap-2\">\n <span class=\"size-2.5 rounded-full\" [style.background]=\"segment.color\"></span>\n <span class=\"text-sm\">{{ segment.label }}</span>\n </div>\n <span class=\"text-sm font-medium\">{{ segment.size | number: '1.0-0' }}%</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radar'\" class=\"flex items-center gap-6\">\n <svg viewBox=\"0 0 160 160\" class=\"h-44 w-44\">\n <polygon points=\"80,8 144,44 144,116 80,152 16,116 16,44\" fill=\"none\" stroke=\"hsl(var(--border))\"></polygon>\n <polygon points=\"80,28 126,54 126,106 80,132 34,106 34,54\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.75\"></polygon>\n <polygon points=\"80,48 109,64 109,96 80,112 51,96 51,64\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.55\"></polygon>\n <polygon [attr.points]=\"radarPoints\" fill=\"hsl(var(--primary))\" fill-opacity=\"0.22\" stroke=\"hsl(var(--primary))\" stroke-width=\"2\"></polygon>\n </svg>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let item of radar; index as i\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2 text-sm\">\n <span class=\"text-muted-foreground\">Metric {{ i + 1 }}</span>\n <span class=\"font-medium\">{{ item }}</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radial'\" class=\"flex items-center justify-between gap-6\">\n <div class=\"relative flex size-44 items-center justify-center\">\n <svg viewBox=\"0 0 96 96\" class=\"size-40 -rotate-90\">\n <circle cx=\"48\" cy=\"48\" r=\"42\" fill=\"none\" stroke=\"hsl(var(--muted))\" stroke-width=\"10\"></circle>\n <circle\n cx=\"48\"\n cy=\"48\"\n r=\"42\"\n fill=\"none\"\n stroke=\"hsl(var(--primary))\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"263.89\"\n [attr.stroke-dashoffset]=\"radialStrokeOffset\"\n ></circle>\n </svg>\n <div class=\"absolute text-center\">\n <div class=\"text-2xl font-semibold\">{{ radialValue }}%</div>\n <div class=\"text-xs text-muted-foreground\">{{ radialLabel }}</div>\n </div>\n </div>\n <div class=\"flex-1\">\n <p class=\"m-0 text-sm font-medium\">{{ radialLabel }}</p>\n <p class=\"m-0 mt-1 text-sm text-muted-foreground\">{{ radialDescription }}</p>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'tooltips'\" class=\"grid gap-3\">\n <div class=\"inline-flex w-fit min-w-56 flex-col gap-2 rounded-lg border border-border bg-card p-3 shadow-sm\">\n <p class=\"m-0 text-xs font-medium text-muted-foreground\">{{ tooltipTitle }}</p>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipPrimaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipPrimaryValue }}</span>\n </div>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipSecondaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipSecondaryValue }}</span>\n </div>\n </div>\n <p class=\"m-0 text-xs text-muted-foreground\">Tooltip style preparado para charts de l\u00EDnea, \u00E1rea y barras.</p>\n </div>\n </ng-container>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
122
+ PdmChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmChartComponent, selector: "pdm-chart", inputs: { type: "type", className: "className", title: "title", description: "description", desktopLabel: "desktopLabel", desktopValue: "desktopValue", mobileLabel: "mobileLabel", mobileValue: "mobileValue", labels: "labels", bars: "bars", line: "line", pie: "pie", radar: "radar", radialValue: "radialValue", radialLabel: "radialLabel", radialDescription: "radialDescription", tooltipTitle: "tooltipTitle", tooltipPrimaryLabel: "tooltipPrimaryLabel", tooltipPrimaryValue: "tooltipPrimaryValue", tooltipSecondaryLabel: "tooltipSecondaryLabel", tooltipSecondaryValue: "tooltipSecondaryValue", pieLabels: "pieLabels", tooltipHint: "tooltipHint", radarMetricPrefix: "radarMetricPrefix", emptyLabel: "emptyLabel" }, ngImport: i0, template: "<section [ngClass]=\"['w-full rounded-lg border border-border bg-card text-card-foreground', className]\">\n <div *ngIf=\"title || description || desktopLabel || desktopValue || mobileLabel || mobileValue\" class=\"flex w-full items-stretch border-b border-border\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 px-6 pb-3 pt-4\">\n <h3 *ngIf=\"title\" class=\"m-0 text-sm font-semibold leading-none tracking-tight\">{{ title }}</h3>\n <p *ngIf=\"description\" class=\"m-0 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n\n <div *ngIf=\"desktopLabel || desktopValue || mobileLabel || mobileValue\" class=\"flex h-24\">\n <div class=\"flex h-full w-44 flex-col justify-center border-l border-border bg-muted px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ desktopLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ desktopValue }}</span>\n </div>\n <div class=\"flex h-full w-44 flex-col justify-center px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ mobileLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ mobileValue }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"w-full p-6\">\n <ng-container [ngSwitch]=\"type\">\n <div *ngSwitchCase=\"'bar'\" class=\"flex h-60 w-full flex-col justify-end gap-2\">\n <p *ngIf=\"normalizedBars.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <div class=\"relative h-48 w-full overflow-hidden\">\n <div class=\"absolute bottom-0 left-0 right-0 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/2 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-3/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute inset-x-0 bottom-0 flex h-48 items-end gap-0.5 px-0.5\">\n <div *ngFor=\"let bar of normalizedBars\" class=\"w-1.5 rounded-sm bg-primary\" [style.height.px]=\"bar\"></div>\n </div>\n </div>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'line'\" class=\"flex h-60 w-full flex-col gap-2\">\n <p *ngIf=\"normalizedLine.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'area'\" class=\"flex h-60 w-full flex-col gap-2\">\n <p *ngIf=\"normalizedLine.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <defs>\n <linearGradient id=\"pdm-chart-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.35\"></stop>\n <stop offset=\"100%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.02\"></stop>\n </linearGradient>\n </defs>\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"areaPath\" fill=\"url(#pdm-chart-area-gradient)\"></path>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'pie'\" class=\"flex items-center gap-6\">\n <div class=\"relative h-40 w-40 rounded-full\" [style.background]=\"pieGradient\">\n <div class=\"absolute inset-7 rounded-full bg-card\"></div>\n </div>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let segment of pieSegments\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <div class=\"flex items-center gap-2\">\n <span class=\"size-2.5 rounded-full\" [style.background]=\"segment.color\"></span>\n <span class=\"text-sm\">{{ segment.label }}</span>\n </div>\n <span class=\"text-sm font-medium\">{{ segment.size | number: '1.0-0' }}%</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radar'\" class=\"flex items-center gap-6\">\n <svg viewBox=\"0 0 160 160\" class=\"h-44 w-44\">\n <polygon points=\"80,8 144,44 144,116 80,152 16,116 16,44\" fill=\"none\" stroke=\"hsl(var(--border))\"></polygon>\n <polygon points=\"80,28 126,54 126,106 80,132 34,106 34,54\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.75\"></polygon>\n <polygon points=\"80,48 109,64 109,96 80,112 51,96 51,64\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.55\"></polygon>\n <polygon [attr.points]=\"radarPoints\" fill=\"hsl(var(--primary))\" fill-opacity=\"0.22\" stroke=\"hsl(var(--primary))\" stroke-width=\"2\"></polygon>\n </svg>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let item of radar; index as i\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2 text-sm\">\n <span class=\"text-muted-foreground\">{{ radarMetricPrefix }} {{ i + 1 }}</span>\n <span class=\"font-medium\">{{ item }}</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radial'\" class=\"flex items-center justify-between gap-6\">\n <div class=\"relative flex size-44 items-center justify-center\">\n <svg viewBox=\"0 0 96 96\" class=\"size-40 -rotate-90\">\n <circle cx=\"48\" cy=\"48\" r=\"42\" fill=\"none\" stroke=\"hsl(var(--muted))\" stroke-width=\"10\"></circle>\n <circle\n cx=\"48\"\n cy=\"48\"\n r=\"42\"\n fill=\"none\"\n stroke=\"hsl(var(--primary))\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"263.89\"\n [attr.stroke-dashoffset]=\"radialStrokeOffset\"\n ></circle>\n </svg>\n <div class=\"absolute text-center\">\n <div class=\"text-2xl font-semibold\">{{ radialValue }}%</div>\n <div class=\"text-xs text-muted-foreground\">{{ radialLabel }}</div>\n </div>\n </div>\n <div class=\"flex-1\">\n <p class=\"m-0 text-sm font-medium\">{{ radialLabel }}</p>\n <p class=\"m-0 mt-1 text-sm text-muted-foreground\">{{ radialDescription }}</p>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'tooltips'\" class=\"grid gap-3\">\n <div class=\"inline-flex w-fit min-w-56 flex-col gap-2 rounded-lg border border-border bg-card p-3 shadow-sm\">\n <p class=\"m-0 text-xs font-medium text-muted-foreground\">{{ tooltipTitle }}</p>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipPrimaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipPrimaryValue }}</span>\n </div>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipSecondaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipSecondaryValue }}</span>\n </div>\n </div>\n <p *ngIf=\"tooltipHint\" class=\"m-0 text-xs text-muted-foreground\">{{ tooltipHint }}</p>\n </div>\n </ng-container>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
126
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmChartComponent, decorators: [{
127
124
  type: Component,
128
- args: [{ selector: 'pdm-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['w-full rounded-lg border border-border bg-card text-card-foreground', className]\">\n <div class=\"flex w-full items-stretch border-b border-border\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 px-6 pb-3 pt-4\">\n <h3 class=\"m-0 text-sm font-semibold leading-none tracking-tight\">{{ title }}</h3>\n <p class=\"m-0 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n\n <div class=\"flex h-24\">\n <div class=\"flex h-full w-44 flex-col justify-center border-l border-border bg-muted px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ desktopLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ desktopValue }}</span>\n </div>\n <div class=\"flex h-full w-44 flex-col justify-center px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ mobileLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ mobileValue }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"w-full p-6\">\n <ng-container [ngSwitch]=\"type\">\n <div *ngSwitchCase=\"'bar'\" class=\"flex h-60 w-full flex-col justify-end gap-2\">\n <div class=\"relative h-48 w-full overflow-hidden\">\n <div class=\"absolute bottom-0 left-0 right-0 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/2 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-3/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute inset-x-0 bottom-0 flex h-48 items-end gap-0.5 px-0.5\">\n <div *ngFor=\"let bar of normalizedBars\" class=\"w-1.5 rounded-sm bg-primary\" [style.height.px]=\"bar\"></div>\n </div>\n </div>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'line'\" class=\"flex h-60 w-full flex-col gap-2\">\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'area'\" class=\"flex h-60 w-full flex-col gap-2\">\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <defs>\n <linearGradient id=\"pdm-chart-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.35\"></stop>\n <stop offset=\"100%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.02\"></stop>\n </linearGradient>\n </defs>\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"areaPath\" fill=\"url(#pdm-chart-area-gradient)\"></path>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'pie'\" class=\"flex items-center gap-6\">\n <div class=\"relative h-40 w-40 rounded-full\" [style.background]=\"pieGradient\">\n <div class=\"absolute inset-7 rounded-full bg-card\"></div>\n </div>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let segment of pieSegments\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <div class=\"flex items-center gap-2\">\n <span class=\"size-2.5 rounded-full\" [style.background]=\"segment.color\"></span>\n <span class=\"text-sm\">{{ segment.label }}</span>\n </div>\n <span class=\"text-sm font-medium\">{{ segment.size | number: '1.0-0' }}%</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radar'\" class=\"flex items-center gap-6\">\n <svg viewBox=\"0 0 160 160\" class=\"h-44 w-44\">\n <polygon points=\"80,8 144,44 144,116 80,152 16,116 16,44\" fill=\"none\" stroke=\"hsl(var(--border))\"></polygon>\n <polygon points=\"80,28 126,54 126,106 80,132 34,106 34,54\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.75\"></polygon>\n <polygon points=\"80,48 109,64 109,96 80,112 51,96 51,64\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.55\"></polygon>\n <polygon [attr.points]=\"radarPoints\" fill=\"hsl(var(--primary))\" fill-opacity=\"0.22\" stroke=\"hsl(var(--primary))\" stroke-width=\"2\"></polygon>\n </svg>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let item of radar; index as i\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2 text-sm\">\n <span class=\"text-muted-foreground\">Metric {{ i + 1 }}</span>\n <span class=\"font-medium\">{{ item }}</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radial'\" class=\"flex items-center justify-between gap-6\">\n <div class=\"relative flex size-44 items-center justify-center\">\n <svg viewBox=\"0 0 96 96\" class=\"size-40 -rotate-90\">\n <circle cx=\"48\" cy=\"48\" r=\"42\" fill=\"none\" stroke=\"hsl(var(--muted))\" stroke-width=\"10\"></circle>\n <circle\n cx=\"48\"\n cy=\"48\"\n r=\"42\"\n fill=\"none\"\n stroke=\"hsl(var(--primary))\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"263.89\"\n [attr.stroke-dashoffset]=\"radialStrokeOffset\"\n ></circle>\n </svg>\n <div class=\"absolute text-center\">\n <div class=\"text-2xl font-semibold\">{{ radialValue }}%</div>\n <div class=\"text-xs text-muted-foreground\">{{ radialLabel }}</div>\n </div>\n </div>\n <div class=\"flex-1\">\n <p class=\"m-0 text-sm font-medium\">{{ radialLabel }}</p>\n <p class=\"m-0 mt-1 text-sm text-muted-foreground\">{{ radialDescription }}</p>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'tooltips'\" class=\"grid gap-3\">\n <div class=\"inline-flex w-fit min-w-56 flex-col gap-2 rounded-lg border border-border bg-card p-3 shadow-sm\">\n <p class=\"m-0 text-xs font-medium text-muted-foreground\">{{ tooltipTitle }}</p>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipPrimaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipPrimaryValue }}</span>\n </div>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipSecondaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipSecondaryValue }}</span>\n </div>\n </div>\n <p class=\"m-0 text-xs text-muted-foreground\">Tooltip style preparado para charts de l\u00EDnea, \u00E1rea y barras.</p>\n </div>\n </ng-container>\n </div>\n</section>\n" }]
125
+ args: [{ selector: 'pdm-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['w-full rounded-lg border border-border bg-card text-card-foreground', className]\">\n <div *ngIf=\"title || description || desktopLabel || desktopValue || mobileLabel || mobileValue\" class=\"flex w-full items-stretch border-b border-border\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-1 px-6 pb-3 pt-4\">\n <h3 *ngIf=\"title\" class=\"m-0 text-sm font-semibold leading-none tracking-tight\">{{ title }}</h3>\n <p *ngIf=\"description\" class=\"m-0 text-sm text-muted-foreground\">{{ description }}</p>\n </div>\n\n <div *ngIf=\"desktopLabel || desktopValue || mobileLabel || mobileValue\" class=\"flex h-24\">\n <div class=\"flex h-full w-44 flex-col justify-center border-l border-border bg-muted px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ desktopLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ desktopValue }}</span>\n </div>\n <div class=\"flex h-full w-44 flex-col justify-center px-6 py-4\">\n <span class=\"text-xs text-muted-foreground\">{{ mobileLabel }}</span>\n <span class=\"mt-1 text-2xl font-semibold\">{{ mobileValue }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"w-full p-6\">\n <ng-container [ngSwitch]=\"type\">\n <div *ngSwitchCase=\"'bar'\" class=\"flex h-60 w-full flex-col justify-end gap-2\">\n <p *ngIf=\"normalizedBars.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <div class=\"relative h-48 w-full overflow-hidden\">\n <div class=\"absolute bottom-0 left-0 right-0 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-1/2 border-t border-border opacity-50\"></div>\n <div class=\"absolute left-0 right-0 top-3/4 border-t border-border opacity-50\"></div>\n <div class=\"absolute inset-x-0 bottom-0 flex h-48 items-end gap-0.5 px-0.5\">\n <div *ngFor=\"let bar of normalizedBars\" class=\"w-1.5 rounded-sm bg-primary\" [style.height.px]=\"bar\"></div>\n </div>\n </div>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'line'\" class=\"flex h-60 w-full flex-col gap-2\">\n <p *ngIf=\"normalizedLine.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'area'\" class=\"flex h-60 w-full flex-col gap-2\">\n <p *ngIf=\"normalizedLine.length === 0\" class=\"m-0 text-sm text-muted-foreground\">{{ emptyLabel }}</p>\n <svg viewBox=\"0 0 320 180\" class=\"h-48 w-full\">\n <defs>\n <linearGradient id=\"pdm-chart-area-gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.35\"></stop>\n <stop offset=\"100%\" stop-color=\"hsl(var(--primary))\" stop-opacity=\"0.02\"></stop>\n </linearGradient>\n </defs>\n <line x1=\"0\" y1=\"180\" x2=\"320\" y2=\"180\" stroke=\"hsl(var(--border))\" stroke-width=\"1\"></line>\n <line x1=\"0\" y1=\"135\" x2=\"320\" y2=\"135\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"90\" x2=\"320\" y2=\"90\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <line x1=\"0\" y1=\"45\" x2=\"320\" y2=\"45\" stroke=\"hsl(var(--border))\" stroke-width=\"1\" opacity=\"0.5\"></line>\n <path [attr.d]=\"areaPath\" fill=\"url(#pdm-chart-area-gradient)\"></path>\n <path [attr.d]=\"linePath\" fill=\"none\" stroke=\"hsl(var(--primary))\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <div *ngIf=\"labels.length\" class=\"flex h-4 w-full items-center justify-between gap-2\">\n <span *ngFor=\"let label of labels\" class=\"truncate text-xs text-muted-foreground\">{{ label }}</span>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'pie'\" class=\"flex items-center gap-6\">\n <div class=\"relative h-40 w-40 rounded-full\" [style.background]=\"pieGradient\">\n <div class=\"absolute inset-7 rounded-full bg-card\"></div>\n </div>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let segment of pieSegments\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2\">\n <div class=\"flex items-center gap-2\">\n <span class=\"size-2.5 rounded-full\" [style.background]=\"segment.color\"></span>\n <span class=\"text-sm\">{{ segment.label }}</span>\n </div>\n <span class=\"text-sm font-medium\">{{ segment.size | number: '1.0-0' }}%</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radar'\" class=\"flex items-center gap-6\">\n <svg viewBox=\"0 0 160 160\" class=\"h-44 w-44\">\n <polygon points=\"80,8 144,44 144,116 80,152 16,116 16,44\" fill=\"none\" stroke=\"hsl(var(--border))\"></polygon>\n <polygon points=\"80,28 126,54 126,106 80,132 34,106 34,54\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.75\"></polygon>\n <polygon points=\"80,48 109,64 109,96 80,112 51,96 51,64\" fill=\"none\" stroke=\"hsl(var(--border))\" opacity=\"0.55\"></polygon>\n <polygon [attr.points]=\"radarPoints\" fill=\"hsl(var(--primary))\" fill-opacity=\"0.22\" stroke=\"hsl(var(--primary))\" stroke-width=\"2\"></polygon>\n </svg>\n <div class=\"grid flex-1 gap-2\">\n <div *ngFor=\"let item of radar; index as i\" class=\"flex items-center justify-between rounded-md border border-border px-3 py-2 text-sm\">\n <span class=\"text-muted-foreground\">{{ radarMetricPrefix }} {{ i + 1 }}</span>\n <span class=\"font-medium\">{{ item }}</span>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'radial'\" class=\"flex items-center justify-between gap-6\">\n <div class=\"relative flex size-44 items-center justify-center\">\n <svg viewBox=\"0 0 96 96\" class=\"size-40 -rotate-90\">\n <circle cx=\"48\" cy=\"48\" r=\"42\" fill=\"none\" stroke=\"hsl(var(--muted))\" stroke-width=\"10\"></circle>\n <circle\n cx=\"48\"\n cy=\"48\"\n r=\"42\"\n fill=\"none\"\n stroke=\"hsl(var(--primary))\"\n stroke-width=\"10\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"263.89\"\n [attr.stroke-dashoffset]=\"radialStrokeOffset\"\n ></circle>\n </svg>\n <div class=\"absolute text-center\">\n <div class=\"text-2xl font-semibold\">{{ radialValue }}%</div>\n <div class=\"text-xs text-muted-foreground\">{{ radialLabel }}</div>\n </div>\n </div>\n <div class=\"flex-1\">\n <p class=\"m-0 text-sm font-medium\">{{ radialLabel }}</p>\n <p class=\"m-0 mt-1 text-sm text-muted-foreground\">{{ radialDescription }}</p>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'tooltips'\" class=\"grid gap-3\">\n <div class=\"inline-flex w-fit min-w-56 flex-col gap-2 rounded-lg border border-border bg-card p-3 shadow-sm\">\n <p class=\"m-0 text-xs font-medium text-muted-foreground\">{{ tooltipTitle }}</p>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipPrimaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipPrimaryValue }}</span>\n </div>\n <div class=\"flex items-center justify-between text-sm\">\n <span>{{ tooltipSecondaryLabel }}</span>\n <span class=\"font-semibold\">{{ tooltipSecondaryValue }}</span>\n </div>\n </div>\n <p *ngIf=\"tooltipHint\" class=\"m-0 text-xs text-muted-foreground\">{{ tooltipHint }}</p>\n </div>\n </ng-container>\n </div>\n</section>\n" }]
129
126
  }], propDecorators: { type: [{
130
127
  type: Input
131
128
  }], className: [{
@@ -170,5 +167,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
170
167
  type: Input
171
168
  }], pieLabels: [{
172
169
  type: Input
170
+ }], tooltipHint: [{
171
+ type: Input
172
+ }], radarMetricPrefix: [{
173
+ type: Input
174
+ }], emptyLabel: [{
175
+ type: Input
173
176
  }] } });
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBUzFFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFNVyxTQUFJLEdBQWlCLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsVUFBSyxHQUFHLHlCQUF5QixDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsOENBQThDLENBQUM7UUFFN0QsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFDekIsaUJBQVksR0FBRyxRQUFRLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFFdkIsV0FBTSxHQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzRyxTQUFJLEdBQWE7WUFDeEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDOUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1NBQy9DLENBQUM7UUFDTyxTQUFJLEdBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELFFBQUcsR0FBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLFVBQUssR0FBYSxDQUFD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WTtzQkFBcEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFBkbUNoYXJ0VHlwZSA9ICdhcmVhJyB8ICdiYXInIHwgJ2xpbmUnIHwgJ3BpZScgfCAncmFkYXInIHwgJ3JhZGlhbCcgfCAndG9vbHRpcHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZG0tY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1DaGFydENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHR5cGU6IFBkbUNoYXJ0VHlwZSA9ICdiYXInO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgdGl0bGUgPSAnQmFyIENoYXJ0IC0gSW50ZXJhY3RpdmUnO1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICdTaG93aW5nIHRvdGFsIHZpc2l0b3JzIGZvciB0aGUgbGFzdCAzIG1vbnRocyc7XG5cbiAgQElucHV0KCkgZGVza3RvcExhYmVsID0gJ0Rlc2t0b3AnO1xuICBASW5wdXQoKSBkZXNrdG9wVmFsdWUgPSAnMjQsODI4JztcbiAgQElucHV0KCkgbW9iaWxlTGFiZWwgPSAnTW9iaWxlJztcbiAgQElucHV0KCkgbW9iaWxlVmFsdWUgPSAnMjUsMDEwJztcblxuICBASW5wdXQoKSBsYWJlbHM6IHN0cmluZ1tdID0gWydBcHIgOScsICdBcHIgMTknLCAnQXByIDI5JywgJ01heSA5JywgJ01heSAxOScsICdNYXkgMjknLCAnSnVuIDknLCAnSnVuIDE5JywgJ0p1biAzMCddO1xuXG4gIEBJbnB1dCgpIGJhcnM6IG51bWJlcltdID0gW1xuICAgIDQ4LCAyMSwgNTMsIDY5LCA1NiwgNzcsIDEyLCA1NCwgNjEsIDU5LCA2NiwgMjcsIDI0LCAyNywgODQsIDYyLCA0NCwgMTgsIDQ1LCA1NyxcbiAgICA0NSwgNzIsIDU2LCAxNSwgNzMsIDI1LCA1OSwgODYsIDQ5LCA1OSwgNjksIDkzLCA5NiwgNzIsIDMwLCA1OCwgNzUsIDY3LCA0MywgNDMsXG4gICAgODQsIDg5LCA2MiwgOTYsIDU5LCA3MiwgODIsIDM0LCAzNCwgNzAsIDYyLCA0MiwgNDAsIDgwLCA2MCwgMzMsIDY3LCAzNCwgMzQsIDg4LFxuICAgIDIyLCA4NCwgMTksIDYyLCA1NiwgNDMsIDk1LCA3MCwgNjcsIDg5LCA4NCwgMzEsIDE4LCA5MiwgMTYsIDg3LCA1NCwgNDQsIDkxLCAyMyxcbiAgICA2NywgNzcsIDQ5LCA1OSwgOTMsIDI2LCAyOSwgODEsIDg0LCAzMCwgMjIsIDg0XG4gIF07XG4gIEBJbnB1dCgpIGxpbmU6IG51bWJlcltdID0gWzQwLCAyOCwgNTYsIDQ5LCA3MywgNjcsIDgxLCA1OCwgOTJdO1xuICBASW5wdXQoKSBwaWU6IG51bWJlcltdID0gWzM1LCAyOCwgMjAsIDE3XTtcbiAgQElucHV0KCkgcmFkYXI6IG51bWJlcltdID0gWzcyLCA1OCwgODgsIDY0LCA3OSwgNzBdO1xuICBASW5wdXQoKSByYWRpYWxWYWx1ZSA9IDc2O1xuICBASW5wdXQoKSByYWRpYWxMYWJlbCA9ICdDb21wbGV0aW9uJztcbiAgQElucHV0KCkgcmFkaWFsRGVzY3JpcHRpb24gPSAnVXBkYXRlZCBtb250aGx5JztcbiAgQElucHV0KCkgdG9vbHRpcFRpdGxlID0gJ0p1bmUgMjAyNCc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQcmltYXJ5TGFiZWwgPSAnRGVza3RvcCc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQcmltYXJ5VmFsdWUgPSAnMTIsNDUwJztcbiAgQElucHV0KCkgdG9vbHRpcFNlY29uZGFyeUxhYmVsID0gJ01vYmlsZSc7XG4gIEBJbnB1dCgpIHRvb2x0aXBTZWNvbmRhcnlWYWx1ZSA9ICc4LDExMCc7XG4gIEBJbnB1dCgpIHBpZUxhYmVsczogc3RyaW5nW10gPSBbJ0Rlc2t0b3AnLCAnTW9iaWxlJywgJ1RhYmxldCcsICdPdGhlciddO1xuXG4gIGdldCBub3JtYWxpemVkQmFycygpOiBudW1iZXJbXSB7XG4gICAgaWYgKCF0aGlzLmJhcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4udGhpcy5iYXJzKTtcbiAgICBpZiAobWF4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5iYXJzLm1hcCgoKSA9PiAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iYXJzLm1hcCgodmFsdWUpID0+IE1hdGgubWF4KDgsIE1hdGgucm91bmQoKHZhbHVlIC8gbWF4KSAqIDE4MykpKTtcbiAgfVxuXG4gIGdldCBub3JtYWxpemVkTGluZSgpOiBudW1iZXJbXSB7XG4gICAgaWYgKCF0aGlzLmxpbmUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4udGhpcy5saW5lKTtcbiAgICBpZiAobWF4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5saW5lLm1hcCgoKSA9PiAxNzApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxpbmUubWFwKCh2YWx1ZSkgPT4gMTgwIC0gTWF0aC5yb3VuZCgodmFsdWUgLyBtYXgpICogMTUwKSk7XG4gIH1cblxuICBnZXQgbGluZVBhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLm5vcm1hbGl6ZWRMaW5lO1xuICAgIGlmICghcG9pbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBwb2ludHMubGVuZ3RoID4gMSA/IDMyMCAvIChwb2ludHMubGVuZ3RoIC0gMSkgOiAwO1xuICAgIHJldHVybiBwb2ludHNcbiAgICAgIC5tYXAoKHksIGluZGV4KSA9PiBgJHtpbmRleCA9PT0gMCA/ICdNJyA6ICdMJ30gJHtNYXRoLnJvdW5kKGluZGV4ICogc3RlcCl9ICR7eX1gKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBhcmVhUGF0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVQYXRoID0gdGhpcy5saW5lUGF0aDtcbiAgICBpZiAoIWxpbmVQYXRoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2xpbmVQYXRofSBMIDMyMCAxODAgTCAwIDE4MCBaYDtcbiAgfVxuXG4gIGdldCBwaWVTZWdtZW50cygpOiB7IGNvbG9yOiBzdHJpbmc7IHNpemU6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMucGllLnJlZHVjZSgoYWNjLCB2YWx1ZSkgPT4gYWNjICsgTWF0aC5tYXgodmFsdWUsIDApLCAwKTtcbiAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBjb25zdCBjb2xvcnMgPSBbJ2hzbCh2YXIoLS1jaGFydC0xKSknLCAnaHNsKHZhcigtLWNoYXJ0LTIpKScsICdoc2wodmFyKC0tY2hhcnQtMykpJywgJ2hzbCh2YXIoLS1jaGFydC00KSknXTtcbiAgICByZXR1cm4gdGhpcy5waWUubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNpemUgPSAoTWF0aC5tYXgodmFsdWUsIDApIC8gdG90YWwpICogMTAwO1xuICAgICAgY29uc3Qgc2VnbWVudCA9IHtcbiAgICAgICAgY29sb3I6IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdLFxuICAgICAgICBzaXplLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGxhYmVsOiB0aGlzLnBpZUxhYmVsc1tpbmRleF0gPz8gYFNlcmllcyAke2luZGV4ICsgMX1gXG4gICAgICB9O1xuICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwaWVHcmFkaWVudCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5waWVTZWdtZW50cztcbiAgICBpZiAoIXNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICdjb25pYy1ncmFkaWVudChoc2wodmFyKC0tbXV0ZWQpKSAwIDEwMCUpJztcbiAgICB9XG5cbiAgICByZXR1cm4gYGNvbmljLWdyYWRpZW50KCR7c2VnbWVudHNcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IGAke3NlZ21lbnQuY29sb3J9ICR7c2VnbWVudC5vZmZzZXR9JSAke3NlZ21lbnQub2Zmc2V0ICsgc2VnbWVudC5zaXplfSVgKVxuICAgICAgLmpvaW4oJywgJyl9KWA7XG4gIH1cblxuICBnZXQgcmFkYXJQb2ludHMoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnJhZGFyLnNsaWNlKDAsIDYpO1xuICAgIGlmICghdmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLnZhbHVlcywgMSk7XG4gICAgY29uc3QgcmFkaXVzID0gNzI7XG4gICAgY29uc3QgY2VudGVyID0gODA7XG4gICAgcmV0dXJuIHZhbHVlc1xuICAgICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gKChNYXRoLlBJICogMikgLyB2YWx1ZXMubGVuZ3RoKSAqIGluZGV4IC0gTWF0aC5QSSAvIDI7XG4gICAgICAgIGNvbnN0IHZhbHVlUmFkaXVzID0gKE1hdGgubWF4KHZhbHVlLCAwKSAvIG1heCkgKiByYWRpdXM7XG4gICAgICAgIGNvbnN0IHggPSBjZW50ZXIgKyBNYXRoLmNvcyhhbmdsZSkgKiB2YWx1ZVJhZGl1cztcbiAgICAgICAgY29uc3QgeSA9IGNlbnRlciArIE1hdGguc2luKGFuZ2xlKSAqIHZhbHVlUmFkaXVzO1xuICAgICAgICByZXR1cm4gYCR7eH0sJHt5fWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCByYWRpYWxTdHJva2VPZmZzZXQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBib3VuZGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5yYWRpYWxWYWx1ZSwgMTAwKSk7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IDIgKiBNYXRoLlBJICogNDI7XG4gICAgcmV0dXJuIGNpcmN1bWZlcmVuY2UgLSAoYm91bmRlZCAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xuICB9XG59XG4iLCI8c2VjdGlvbiBbbmdDbGFzc109XCJbJ3ctZnVsbCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLCBjbGFzc05hbWVdXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1zdHJldGNoIGJvcmRlci1iIGJvcmRlci1ib3JkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBtaW4tdy0wIGZsZXgtMSBmbGV4LWNvbCBnYXAtMSBweC02IHBiLTMgcHQtNFwiPlxuICAgICAgPGgzIGNsYXNzPVwibS0wIHRleHQtc20gZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHRcIj57eyB0aXRsZSB9fTwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGRlc2NyaXB0aW9uIH19PC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC0yNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHctNDQgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgYm9yZGVyLWJvcmRlciBiZy1tdXRlZCBweC02IHB5LTRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGRlc2t0b3BMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0xIHRleHQtMnhsIGZvbnQtc2VtaWJvbGRcIj57eyBkZXNrdG9wVmFsdWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LTQ0IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIHB4LTYgcHktNFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgbW9iaWxlTGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMSB0ZXh0LTJ4bCBmb250LXNlbWlib2xkXCI+e3sgbW9iaWxlVmFsdWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInctZnVsbCBwLTZcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0eXBlXCI+XG4gICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInYmFyJ1wiIGNsYXNzPVwiZmxleCBoLTYwIHctZnVsbCBmbGV4LWNvbCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC00OCB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCByaWdodC0wIGJvcmRlci10IGJvcmRlci1ib3JkZXIgb3BhY2l0eS01MFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgcmlnaHQtMCB0b3AtMS80IGJvcmRlci10IGJvcmRlci1ib3JkZXIgb3BhY2l0eS01MFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgcmlnaHQtMCB0b3AtMS8yIGJvcmRlci10IGJvcmRlci1ib3JkZXIgb3BhY2l0eS01MFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTAgcmlnaHQtMCB0b3AtMy80IGJvcmRlci10IGJvcmRlci1ib3JkZXIgb3BhY2l0eS01MFwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC14LTAgYm90dG9tLTAgZmxleCBoLTQ4IGl0ZW1zLWVuZCBnYXAtMC41IHB4LTAuNVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYmFyIG9mIG5vcm1hbGl6ZWRCYXJzXCIgY2xhc3M9XCJ3LTEuNSByb3VuZGVkLXNtIGJnLXByaW1hcnlcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImJhclwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC00IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2xpbmUnXCIgY2xhc3M9XCJmbGV4IGgtNjAgdy1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMjAgMTgwXCIgY2xhc3M9XCJoLTQ4IHctZnVsbFwiPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiMTgwXCIgeDI9XCIzMjBcIiB5Mj1cIjE4MFwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCIxMzVcIiB4Mj1cIjMyMFwiIHkyPVwiMTM1XCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIG9wYWNpdHk9XCIwLjVcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCI5MFwiIHgyPVwiMzIwXCIgeTI9XCI5MFwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIiBvcGFjaXR5PVwiMC41XCI+PC9saW5lPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiNDVcIiB4Mj1cIjMyMFwiIHkyPVwiNDVcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBzdHJva2Utd2lkdGg9XCIxXCIgb3BhY2l0eT1cIjAuNVwiPjwvbGluZT5cbiAgICAgICAgICA8cGF0aCBbYXR0ci5kXT1cImxpbmVQYXRoXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJoc2wodmFyKC0tcHJpbWFyeSkpXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC00IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2FyZWEnXCIgY2xhc3M9XCJmbGV4IGgtNjAgdy1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMjAgMTgwXCIgY2xhc3M9XCJoLTQ4IHctZnVsbFwiPlxuICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicGRtLWNoYXJ0LWFyZWEtZ3JhZGllbnRcIiB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjBcIiB5Mj1cIjFcIj5cbiAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PVwiMCVcIiBzdG9wLWNvbG9yPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiIHN0b3Atb3BhY2l0eT1cIjAuMzVcIj48L3N0b3A+XG4gICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjEwMCVcIiBzdG9wLWNvbG9yPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiIHN0b3Atb3BhY2l0eT1cIjAuMDJcIj48L3N0b3A+XG4gICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjE4MFwiIHgyPVwiMzIwXCIgeTI9XCIxODBcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBzdHJva2Utd2lkdGg9XCIxXCI+PC9saW5lPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiMTM1XCIgeDI9XCIzMjBcIiB5Mj1cIjEzNVwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIiBvcGFjaXR5PVwiMC41XCI+PC9saW5lPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiOTBcIiB4Mj1cIjMyMFwiIHkyPVwiOTBcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBzdHJva2Utd2lkdGg9XCIxXCIgb3BhY2l0eT1cIjAuNVwiPjwvbGluZT5cbiAgICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjQ1XCIgeDI9XCIzMjBcIiB5Mj1cIjQ1XCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIG9wYWNpdHk9XCIwLjVcIj48L2xpbmU+XG4gICAgICAgICAgPHBhdGggW2F0dHIuZF09XCJhcmVhUGF0aFwiIGZpbGw9XCJ1cmwoI3BkbS1jaGFydC1hcmVhLWdyYWRpZW50KVwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aCBbYXR0ci5kXT1cImxpbmVQYXRoXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJoc2wodmFyKC0tcHJpbWFyeSkpXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC00IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3BpZSdcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC02XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLTQwIHctNDAgcm91bmRlZC1mdWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicGllR3JhZGllbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtNyByb3VuZGVkLWZ1bGwgYmctY2FyZFwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZmxleC0xIGdhcC0yXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiBwaWVTZWdtZW50c1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaXplLTIuNSByb3VuZGVkLWZ1bGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJzZWdtZW50LmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc21cIj57eyBzZWdtZW50LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW1cIj57eyBzZWdtZW50LnNpemUgfCBudW1iZXI6ICcxLjAtMCcgfX0lPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCIncmFkYXInXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNlwiPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTYwIDE2MFwiIGNsYXNzPVwiaC00NCB3LTQ0XCI+XG4gICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiODAsOCAxNDQsNDQgMTQ0LDExNiA4MCwxNTIgMTYsMTE2IDE2LDQ0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIj48L3BvbHlnb24+XG4gICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiODAsMjggMTI2LDU0IDEyNiwxMDYgODAsMTMyIDM0LDEwNiAzNCw1NFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgb3BhY2l0eT1cIjAuNzVcIj48L3BvbHlnb24+XG4gICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiODAsNDggMTA5LDY0IDEwOSw5NiA4MCwxMTIgNTEsOTYgNTEsNjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIG9wYWNpdHk9XCIwLjU1XCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDxwb2x5Z29uIFthdHRyLnBvaW50c109XCJyYWRhclBvaW50c1wiIGZpbGw9XCJoc2wodmFyKC0tcHJpbWFyeSkpXCIgZmlsbC1vcGFjaXR5PVwiMC4yMlwiIHN0cm9rZT1cImhzbCh2YXIoLS1wcmltYXJ5KSlcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9wb2x5Z29uPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZmxleC0xIGdhcC0yXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiByYWRhcjsgaW5kZXggYXMgaVwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgcHgtMyBweS0yIHRleHQtc21cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+TWV0cmljIHt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiPnt7IGl0ZW0gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpYWwnXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggc2l6ZS00NCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgOTYgOTZcIiBjbGFzcz1cInNpemUtNDAgLXJvdGF0ZS05MFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQ4XCIgY3k9XCI0OFwiIHI9XCI0MlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiaHNsKHZhcigtLW11dGVkKSlcIiBzdHJva2Utd2lkdGg9XCIxMFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBjeD1cIjQ4XCJcbiAgICAgICAgICAgICAgY3k9XCI0OFwiXG4gICAgICAgICAgICAgIHI9XCI0MlwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEwXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCIyNjMuODlcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaG9mZnNldF09XCJyYWRpYWxTdHJva2VPZmZzZXRcIlxuICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGRcIj57eyByYWRpYWxWYWx1ZSB9fSU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHJhZGlhbExhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtLTAgdGV4dC1zbSBmb250LW1lZGl1bVwiPnt7IHJhZGlhbExhYmVsIH19PC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwibS0wIG10LTEgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyByYWRpYWxEZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3Rvb2x0aXBzJ1wiIGNsYXNzPVwiZ3JpZCBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWZsZXggdy1maXQgbWluLXctNTYgZmxleC1jb2wgZ2FwLTIgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1jYXJkIHAtMyBzaGFkb3ctc21cIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHRvb2x0aXBUaXRsZSB9fTwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHRleHQtc21cIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRvb2x0aXBQcmltYXJ5TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eyB0b29sdGlwUHJpbWFyeVZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gdGV4dC1zbVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgdG9vbHRpcFNlY29uZGFyeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3sgdG9vbHRpcFNlY29uZGFyeVZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9XCJtLTAgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5Ub29sdGlwIHN0eWxlIHByZXBhcmFkbyBwYXJhIGNoYXJ0cyBkZSBsw61uZWEsIMOhcmVhIHkgYmFycmFzLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBUzFFLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFNVyxTQUFJLEdBQWlCLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBRWpCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBRWpCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFdEIsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUNwQixTQUFJLEdBQWEsRUFBRSxDQUFDO1FBQ3BCLFFBQUcsR0FBYSxFQUFFLENBQUM7UUFDbkIsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDdkIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QiwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDM0IsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLGNBQVMsR0FBYSxFQUFFLENB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bnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIFBkbUNoYXJ0VHlwZSA9ICdhcmVhJyB8ICdiYXInIHwgJ2xpbmUnIHwgJ3BpZScgfCAncmFkYXInIHwgJ3JhZGlhbCcgfCAndG9vbHRpcHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZG0tY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1DaGFydENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHR5cGU6IFBkbUNoYXJ0VHlwZSA9ICdiYXInO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgdGl0bGUgPSAnJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb24gPSAnJztcblxuICBASW5wdXQoKSBkZXNrdG9wTGFiZWwgPSAnJztcbiAgQElucHV0KCkgZGVza3RvcFZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIG1vYmlsZUxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIG1vYmlsZVZhbHVlID0gJyc7XG5cbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGJhcnM6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIGxpbmU6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHBpZTogbnVtYmVyW10gPSBbXTtcbiAgQElucHV0KCkgcmFkYXI6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHJhZGlhbFZhbHVlID0gMDtcbiAgQElucHV0KCkgcmFkaWFsTGFiZWwgPSAnJztcbiAgQElucHV0KCkgcmFkaWFsRGVzY3JpcHRpb24gPSAnJztcbiAgQElucHV0KCkgdG9vbHRpcFRpdGxlID0gJyc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQcmltYXJ5TGFiZWwgPSAnJztcbiAgQElucHV0KCkgdG9vbHRpcFByaW1hcnlWYWx1ZSA9ICcnO1xuICBASW5wdXQoKSB0b29sdGlwU2Vjb25kYXJ5TGFiZWwgPSAnJztcbiAgQElucHV0KCkgdG9vbHRpcFNlY29uZGFyeVZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIHBpZUxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgdG9vbHRpcEhpbnQgPSAnJztcbiAgQElucHV0KCkgcmFkYXJNZXRyaWNQcmVmaXggPSAnTWV0cmljJztcbiAgQElucHV0KCkgZW1wdHlMYWJlbCA9ICdObyBkYXRhIGF2YWlsYWJsZSc7XG5cbiAgZ2V0IG5vcm1hbGl6ZWRCYXJzKCk6IG51bWJlcltdIHtcbiAgICBpZiAoIXRoaXMuYmFycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi50aGlzLmJhcnMpO1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJhcnMubWFwKCgpID0+IDApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJhcnMubWFwKCh2YWx1ZSkgPT4gTWF0aC5tYXgoOCwgTWF0aC5yb3VuZCgodmFsdWUgLyBtYXgpICogMTgzKSkpO1xuICB9XG5cbiAgZ2V0IG5vcm1hbGl6ZWRMaW5lKCk6IG51bWJlcltdIHtcbiAgICBpZiAoIXRoaXMubGluZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi50aGlzLmxpbmUpO1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmUubWFwKCgpID0+IDE3MCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubGluZS5tYXAoKHZhbHVlKSA9PiAxODAgLSBNYXRoLnJvdW5kKCh2YWx1ZSAvIG1heCkgKiAxNTApKTtcbiAgfVxuXG4gIGdldCBsaW5lUGF0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMubm9ybWFsaXplZExpbmU7XG4gICAgaWYgKCFwb2ludHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcCA9IHBvaW50cy5sZW5ndGggPiAxID8gMzIwIC8gKHBvaW50cy5sZW5ndGggLSAxKSA6IDA7XG4gICAgcmV0dXJuIHBvaW50c1xuICAgICAgLm1hcCgoeSwgaW5kZXgpID0+IGAke2luZGV4ID09PSAwID8gJ00nIDogJ0wnfSAke01hdGgucm91bmQoaW5kZXggKiBzdGVwKX0gJHt5fWApXG4gICAgICAuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IGFyZWFQYXRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVBhdGggPSB0aGlzLmxpbmVQYXRoO1xuICAgIGlmICghbGluZVBhdGgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7bGluZVBhdGh9IEwgMzIwIDE4MCBMIDAgMTgwIFpgO1xuICB9XG5cbiAgZ2V0IHBpZVNlZ21lbnRzKCk6IHsgY29sb3I6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyBvZmZzZXQ6IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5waWUucmVkdWNlKChhY2MsIHZhbHVlKSA9PiBhY2MgKyBNYXRoLm1heCh2YWx1ZSwgMCksIDApO1xuICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGNvbnN0IGNvbG9ycyA9IFsnaHNsKHZhcigtLWNoYXJ0LTEpKScsICdoc2wodmFyKC0tY2hhcnQtMikpJywgJ2hzbCh2YXIoLS1jaGFydC0zKSknLCAnaHNsKHZhcigtLWNoYXJ0LTQpKSddO1xuICAgIHJldHVybiB0aGlzLnBpZS5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IChNYXRoLm1heCh2YWx1ZSwgMCkgLyB0b3RhbCkgKiAxMDA7XG4gICAgICBjb25zdCBzZWdtZW50ID0ge1xuICAgICAgICBjb2xvcjogY29sb3JzW2luZGV4ICUgY29sb3JzLmxlbmd0aF0sXG4gICAgICAgIHNpemUsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgbGFiZWw6IHRoaXMucGllTGFiZWxzW2luZGV4XSA/PyBgU2VyaWVzICR7aW5kZXggKyAxfWBcbiAgICAgIH07XG4gICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHBpZUdyYWRpZW50KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnBpZVNlZ21lbnRzO1xuICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ2NvbmljLWdyYWRpZW50KGhzbCh2YXIoLS1tdXRlZCkpIDAgMTAwJSknO1xuICAgIH1cblxuICAgIHJldHVybiBgY29uaWMtZ3JhZGllbnQoJHtzZWdtZW50c1xuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gYCR7c2VnbWVudC5jb2xvcn0gJHtzZWdtZW50Lm9mZnNldH0lICR7c2VnbWVudC5vZmZzZXQgKyBzZWdtZW50LnNpemV9JWApXG4gICAgICAuam9pbignLCAnKX0pYDtcbiAgfVxuXG4gIGdldCByYWRhclBvaW50cygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMucmFkYXIuc2xpY2UoMCwgNik7XG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4udmFsdWVzLCAxKTtcbiAgICBjb25zdCByYWRpdXMgPSA3MjtcbiAgICBjb25zdCBjZW50ZXIgPSA4MDtcbiAgICByZXR1cm4gdmFsdWVzXG4gICAgICAubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYW5nbGUgPSAoKE1hdGguUEkgKiAyKSAvIHZhbHVlcy5sZW5ndGgpICogaW5kZXggLSBNYXRoLlBJIC8gMjtcbiAgICAgICAgY29uc3QgdmFsdWVSYWRpdXMgPSAoTWF0aC5tYXgodmFsdWUsIDApIC8gbWF4KSAqIHJhZGl1cztcbiAgICAgICAgY29uc3QgeCA9IGNlbnRlciArIE1hdGguY29zKGFuZ2xlKSAqIHZhbHVlUmFkaXVzO1xuICAgICAgICBjb25zdCB5ID0gY2VudGVyICsgTWF0aC5zaW4oYW5nbGUpICogdmFsdWVSYWRpdXM7XG4gICAgICAgIHJldHVybiBgJHt4fSwke3l9YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignICcpO1xuICB9XG5cbiAgZ2V0IHJhZGlhbFN0cm9rZU9mZnNldCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJvdW5kZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnJhZGlhbFZhbHVlLCAxMDApKTtcbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiA0MjtcbiAgICByZXR1cm4gY2lyY3VtZmVyZW5jZSAtIChib3VuZGVkIC8gMTAwKSAqIGNpcmN1bWZlcmVuY2U7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIFtuZ0NsYXNzXT1cIlsndy1mdWxsIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCcsIGNsYXNzTmFtZV1cIj5cbiAgPGRpdiAqbmdJZj1cInRpdGxlIHx8IGRlc2NyaXB0aW9uIHx8IGRlc2t0b3BMYWJlbCB8fCBkZXNrdG9wVmFsdWUgfHwgbW9iaWxlTGFiZWwgfHwgbW9iaWxlVmFsdWVcIiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLXN0cmV0Y2ggYm9yZGVyLWIgYm9yZGVyLWJvcmRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1pbi13LTAgZmxleC0xIGZsZXgtY29sIGdhcC0xIHB4LTYgcGItMyBwdC00XCI+XG4gICAgICA8aDMgKm5nSWY9XCJ0aXRsZVwiIGNsYXNzPVwibS0wIHRleHQtc20gZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHRcIj57eyB0aXRsZSB9fTwvaDM+XG4gICAgICA8cCAqbmdJZj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJtLTAgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBkZXNjcmlwdGlvbiB9fTwvcD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJkZXNrdG9wTGFiZWwgfHwgZGVza3RvcFZhbHVlIHx8IG1vYmlsZUxhYmVsIHx8IG1vYmlsZVZhbHVlXCIgY2xhc3M9XCJmbGV4IGgtMjRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LTQ0IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGJvcmRlci1sIGJvcmRlci1ib3JkZXIgYmctbXV0ZWQgcHgtNiBweS00XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBkZXNrdG9wTGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMSB0ZXh0LTJ4bCBmb250LXNlbWlib2xkXCI+e3sgZGVza3RvcFZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgdy00NCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBweC02IHB5LTRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IG1vYmlsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTEgdGV4dC0yeGwgZm9udC1zZW1pYm9sZFwiPnt7IG1vYmlsZVZhbHVlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcC02XCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHlwZVwiPlxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2JhcidcIiBjbGFzcz1cImZsZXggaC02MCB3LWZ1bGwgZmxleC1jb2wganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgPHAgKm5nSWY9XCJub3JtYWxpemVkQmFycy5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm0tMCB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGVtcHR5TGFiZWwgfX08L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBoLTQ4IHctZnVsbCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgYm90dG9tLTAgbGVmdC0wIHJpZ2h0LTAgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBvcGFjaXR5LTUwXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCByaWdodC0wIHRvcC0xLzQgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBvcGFjaXR5LTUwXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCByaWdodC0wIHRvcC0xLzIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBvcGFjaXR5LTUwXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCByaWdodC0wIHRvcC0zLzQgYm9yZGVyLXQgYm9yZGVyLWJvcmRlciBvcGFjaXR5LTUwXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LXgtMCBib3R0b20tMCBmbGV4IGgtNDggaXRlbXMtZW5kIGdhcC0wLjUgcHgtMC41XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBiYXIgb2Ygbm9ybWFsaXplZEJhcnNcIiBjbGFzcz1cInctMS41IHJvdW5kZWQtc20gYmctcHJpbWFyeVwiIFtzdHlsZS5oZWlnaHQucHhdPVwiYmFyXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibGFiZWxzLmxlbmd0aFwiIGNsYXNzPVwiZmxleCBoLTQgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgbGFiZWxzXCIgY2xhc3M9XCJ0cnVuY2F0ZSB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInbGluZSdcIiBjbGFzcz1cImZsZXggaC02MCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgPHAgKm5nSWY9XCJub3JtYWxpemVkTGluZS5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm0tMCB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGVtcHR5TGFiZWwgfX08L3A+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMjAgMTgwXCIgY2xhc3M9XCJoLTQ4IHctZnVsbFwiPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiMTgwXCIgeDI9XCIzMjBcIiB5Mj1cIjE4MFwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCIxMzVcIiB4Mj1cIjMyMFwiIHkyPVwiMTM1XCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIG9wYWNpdHk9XCIwLjVcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCI5MFwiIHgyPVwiMzIwXCIgeTI9XCI5MFwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIiBvcGFjaXR5PVwiMC41XCI+PC9saW5lPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiNDVcIiB4Mj1cIjMyMFwiIHkyPVwiNDVcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBzdHJva2Utd2lkdGg9XCIxXCIgb3BhY2l0eT1cIjAuNVwiPjwvbGluZT5cbiAgICAgICAgICA8cGF0aCBbYXR0ci5kXT1cImxpbmVQYXRoXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJoc2wodmFyKC0tcHJpbWFyeSkpXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxhYmVscy5sZW5ndGhcIiBjbGFzcz1cImZsZXggaC00IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ2FyZWEnXCIgY2xhc3M9XCJmbGV4IGgtNjAgdy1mdWxsIGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgIDxwICpuZ0lmPVwibm9ybWFsaXplZExpbmUubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJtLTAgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBlbXB0eUxhYmVsIH19PC9wPlxuICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzIwIDE4MFwiIGNsYXNzPVwiaC00OCB3LWZ1bGxcIj5cbiAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInBkbS1jaGFydC1hcmVhLWdyYWRpZW50XCIgeDE9XCIwXCIgeTE9XCIwXCIgeDI9XCIwXCIgeTI9XCIxXCI+XG4gICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjAlXCIgc3RvcC1jb2xvcj1cImhzbCh2YXIoLS1wcmltYXJ5KSlcIiBzdG9wLW9wYWNpdHk9XCIwLjM1XCI+PC9zdG9wPlxuICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9XCIxMDAlXCIgc3RvcC1jb2xvcj1cImhzbCh2YXIoLS1wcmltYXJ5KSlcIiBzdG9wLW9wYWNpdHk9XCIwLjAyXCI+PC9zdG9wPlxuICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCIxODBcIiB4Mj1cIjMyMFwiIHkyPVwiMTgwXCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgc3Ryb2tlLXdpZHRoPVwiMVwiPjwvbGluZT5cbiAgICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjEzNVwiIHgyPVwiMzIwXCIgeTI9XCIxMzVcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBzdHJva2Utd2lkdGg9XCIxXCIgb3BhY2l0eT1cIjAuNVwiPjwvbGluZT5cbiAgICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjkwXCIgeDI9XCIzMjBcIiB5Mj1cIjkwXCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIG9wYWNpdHk9XCIwLjVcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCIwXCIgeTE9XCI0NVwiIHgyPVwiMzIwXCIgeTI9XCI0NVwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIHN0cm9rZS13aWR0aD1cIjFcIiBvcGFjaXR5PVwiMC41XCI+PC9saW5lPlxuICAgICAgICAgIDxwYXRoIFthdHRyLmRdPVwiYXJlYVBhdGhcIiBmaWxsPVwidXJsKCNwZG0tY2hhcnQtYXJlYS1ncmFkaWVudClcIj48L3BhdGg+XG4gICAgICAgICAgPHBhdGggW2F0dHIuZF09XCJsaW5lUGF0aFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJsYWJlbHMubGVuZ3RoXCIgY2xhc3M9XCJmbGV4IGgtNCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIiBjbGFzcz1cInRydW5jYXRlIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidwaWUnXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaC00MCB3LTQwIHJvdW5kZWQtZnVsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInBpZUdyYWRpZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LTcgcm91bmRlZC1mdWxsIGJnLWNhcmRcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGZsZXgtMSBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2YgcGllU2VnbWVudHNcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2l6ZS0yLjUgcm91bmRlZC1mdWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic2VnbWVudC5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgc2VnbWVudC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+e3sgc2VnbWVudC5zaXplIHwgbnVtYmVyOiAnMS4wLTAnIH19JTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGFyJ1wiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTZcIj5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2MCAxNjBcIiBjbGFzcz1cImgtNDQgdy00NFwiPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjgwLDggMTQ0LDQ0IDE0NCwxMTYgODAsMTUyIDE2LDExNiAxNiw0NFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiaHNsKHZhcigtLWJvcmRlcikpXCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjgwLDI4IDEyNiw1NCAxMjYsMTA2IDgwLDEzMiAzNCwxMDYgMzQsNTRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImhzbCh2YXIoLS1ib3JkZXIpKVwiIG9wYWNpdHk9XCIwLjc1XCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjgwLDQ4IDEwOSw2NCAxMDksOTYgODAsMTEyIDUxLDk2IDUxLDY0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJoc2wodmFyKC0tYm9yZGVyKSlcIiBvcGFjaXR5PVwiMC41NVwiPjwvcG9seWdvbj5cbiAgICAgICAgICA8cG9seWdvbiBbYXR0ci5wb2ludHNdPVwicmFkYXJQb2ludHNcIiBmaWxsPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiIGZpbGwtb3BhY2l0eT1cIjAuMjJcIiBzdHJva2U9XCJoc2wodmFyKC0tcHJpbWFyeSkpXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjwvcG9seWdvbj5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGZsZXgtMSBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcmFkYXI7IGluZGV4IGFzIGlcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIHB4LTMgcHktMiB0ZXh0LXNtXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHJhZGFyTWV0cmljUHJlZml4IH19IHt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiPnt7IGl0ZW0gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidyYWRpYWwnXCIgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggc2l6ZS00NCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgOTYgOTZcIiBjbGFzcz1cInNpemUtNDAgLXJvdGF0ZS05MFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQ4XCIgY3k9XCI0OFwiIHI9XCI0MlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiaHNsKHZhcigtLW11dGVkKSlcIiBzdHJva2Utd2lkdGg9XCIxMFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBjeD1cIjQ4XCJcbiAgICAgICAgICAgICAgY3k9XCI0OFwiXG4gICAgICAgICAgICAgIHI9XCI0MlwiXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiaHNsKHZhcigtLXByaW1hcnkpKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEwXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCIyNjMuODlcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaG9mZnNldF09XCJyYWRpYWxTdHJva2VPZmZzZXRcIlxuICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGRcIj57eyByYWRpYWxWYWx1ZSB9fSU8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHJhZGlhbExhYmVsIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtLTAgdGV4dC1zbSBmb250LW1lZGl1bVwiPnt7IHJhZGlhbExhYmVsIH19PC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwibS0wIG10LTEgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyByYWRpYWxEZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3Rvb2x0aXBzJ1wiIGNsYXNzPVwiZ3JpZCBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLWZsZXggdy1maXQgbWluLXctNTYgZmxleC1jb2wgZ2FwLTIgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1jYXJkIHAtMyBzaGFkb3ctc21cIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHRvb2x0aXBUaXRsZSB9fTwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHRleHQtc21cIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRvb2x0aXBQcmltYXJ5TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eyB0b29sdGlwUHJpbWFyeVZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gdGV4dC1zbVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgdG9vbHRpcFNlY29uZGFyeUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3sgdG9vbHRpcFNlY29uZGFyeVZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgKm5nSWY9XCJ0b29sdGlwSGludFwiIGNsYXNzPVwibS0wIHRleHQteHMgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgdG9vbHRpcEhpbnQgfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
@@ -4,15 +4,15 @@ import * as i1 from "@angular/common";
4
4
  export class PdmDataTableComponent {
5
5
  constructor() {
6
6
  this.className = '';
7
- this.filterPlaceholder = 'Filter emails...';
7
+ this.filterPlaceholder = 'Filter...';
8
8
  this.columnsLabel = 'Columns';
9
- this.rows = [
10
- { id: '1', status: 'Success', email: 'ken99@yahoo.com', amount: '$316.00' },
11
- { id: '2', status: 'Success', email: 'abe45@gmail.com', amount: '$242.00' },
12
- { id: '3', status: 'Processing', email: 'monserrat44@gmail.com', amount: '$837.00' },
13
- { id: '4', status: 'Success', email: 'silas22@gmail.com', amount: '$874.00' },
14
- { id: '5', status: 'Failed', email: 'carmella@hotmail.com', amount: '$721.00' }
15
- ];
9
+ this.statusLabel = 'Status';
10
+ this.emailLabel = 'Email';
11
+ this.amountLabel = 'Amount';
12
+ this.previousLabel = 'Previous';
13
+ this.nextLabel = 'Next';
14
+ this.emptyLabel = 'No results.';
15
+ this.rows = [];
16
16
  this.page = 1;
17
17
  this.pageSize = 5;
18
18
  this.query = '';
@@ -59,16 +59,28 @@ export class PdmDataTableComponent {
59
59
  }
60
60
  }
61
61
  PdmDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
62
- PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full max-w-3xl flex-col items-end', className]\">\n <div class=\"flex w-full items-center justify-between py-4\">\n <input\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button type=\"button\" class=\"inline-flex h-9 items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"w-full overflow-hidden rounded-md border border-border bg-background\">\n <table class=\"w-full border-collapse text-sm text-foreground\">\n <thead>\n <tr class=\"border-b border-border\">\n <th class=\"w-10 px-2 text-left font-medium\"><input type=\"checkbox\" class=\"h-4 w-4 rounded-sm border border-input\" /></th>\n <th class=\"w-32 px-2 py-2 text-left font-medium\">Status</th>\n <th class=\"px-2 py-2 text-left font-medium\">\n <button type=\"button\" class=\"inline-flex items-center gap-1 rounded-sm px-3 py-2 text-sm\">\n <span>Email</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </th>\n <th class=\"w-24 px-2 py-2 text-right font-medium\">Amount</th>\n <th class=\"px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" class=\"border-b border-border last:border-b-0\">\n <td class=\"px-2 py-2\"><input type=\"checkbox\" [checked]=\"row.selected\" (change)=\"onToggleRow(row, $event)\" class=\"h-4 w-4 rounded-sm border border-input\" /></td>\n <td class=\"px-2 py-2\">{{ row.status }}</td>\n <td class=\"px-2 py-2\">{{ row.email }}</td>\n <td class=\"px-2 py-2 text-right\">{{ row.amount }}</td>\n <td class=\"px-2 py-2\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center\" (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"flex w-full items-center gap-2 py-4\">\n <p class=\"flex-1 pr-2 text-sm text-muted-foreground\">{{ selectedCount }} of {{ rows.length }} row(s) selected.</p>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page <= 1\" (click)=\"previous()\">Previous</button>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page >= totalPages\" (click)=\"next()\">Next</button>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
62
+ PdmDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDataTableComponent, selector: "pdm-data-table", inputs: { className: "className", filterPlaceholder: "filterPlaceholder", columnsLabel: "columnsLabel", statusLabel: "statusLabel", emailLabel: "emailLabel", amountLabel: "amountLabel", previousLabel: "previousLabel", nextLabel: "nextLabel", emptyLabel: "emptyLabel", rows: "rows", page: "page", pageSize: "pageSize", query: "query" }, outputs: { queryChange: "queryChange", rowAction: "rowAction", pageChange: "pageChange", selectionChange: "selectionChange" }, ngImport: i0, template: "<section [ngClass]=\"['flex w-full max-w-3xl flex-col items-end', className]\">\n <div class=\"flex w-full items-center justify-between py-4\">\n <input\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button type=\"button\" class=\"inline-flex h-9 items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"w-full overflow-hidden rounded-md border border-border bg-background\">\n <table class=\"w-full border-collapse text-sm text-foreground\">\n <thead>\n <tr class=\"border-b border-border\">\n <th class=\"w-10 px-2 text-left font-medium\"><input type=\"checkbox\" class=\"h-4 w-4 rounded-sm border border-input\" /></th>\n <th class=\"w-32 px-2 py-2 text-left font-medium\">{{ statusLabel }}</th>\n <th class=\"px-2 py-2 text-left font-medium\">\n <button type=\"button\" class=\"inline-flex items-center gap-1 rounded-sm px-3 py-2 text-sm\">\n <span>{{ emailLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </th>\n <th class=\"w-24 px-2 py-2 text-right font-medium\">{{ amountLabel }}</th>\n <th class=\"px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" class=\"border-b border-border last:border-b-0\">\n <td class=\"px-2 py-2\"><input type=\"checkbox\" [checked]=\"row.selected\" (change)=\"onToggleRow(row, $event)\" class=\"h-4 w-4 rounded-sm border border-input\" /></td>\n <td class=\"px-2 py-2\">{{ row.status }}</td>\n <td class=\"px-2 py-2\">{{ row.email }}</td>\n <td class=\"px-2 py-2 text-right\">{{ row.amount }}</td>\n <td class=\"px-2 py-2\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center\" (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n <tr *ngIf=\"pagedRows.length === 0\">\n <td colspan=\"5\" class=\"px-3 py-6 text-center text-sm text-muted-foreground\">{{ emptyLabel }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"flex w-full items-center gap-2 py-4\">\n <p class=\"flex-1 pr-2 text-sm text-muted-foreground\">{{ selectedCount }} of {{ rows.length }} row(s) selected.</p>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page <= 1\" (click)=\"previous()\">{{ previousLabel }}</button>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page >= totalPages\" (click)=\"next()\">{{ nextLabel }}</button>\n </div>\n</section>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
63
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDataTableComponent, decorators: [{
64
64
  type: Component,
65
- args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full max-w-3xl flex-col items-end', className]\">\n <div class=\"flex w-full items-center justify-between py-4\">\n <input\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button type=\"button\" class=\"inline-flex h-9 items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"w-full overflow-hidden rounded-md border border-border bg-background\">\n <table class=\"w-full border-collapse text-sm text-foreground\">\n <thead>\n <tr class=\"border-b border-border\">\n <th class=\"w-10 px-2 text-left font-medium\"><input type=\"checkbox\" class=\"h-4 w-4 rounded-sm border border-input\" /></th>\n <th class=\"w-32 px-2 py-2 text-left font-medium\">Status</th>\n <th class=\"px-2 py-2 text-left font-medium\">\n <button type=\"button\" class=\"inline-flex items-center gap-1 rounded-sm px-3 py-2 text-sm\">\n <span>Email</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </th>\n <th class=\"w-24 px-2 py-2 text-right font-medium\">Amount</th>\n <th class=\"px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" class=\"border-b border-border last:border-b-0\">\n <td class=\"px-2 py-2\"><input type=\"checkbox\" [checked]=\"row.selected\" (change)=\"onToggleRow(row, $event)\" class=\"h-4 w-4 rounded-sm border border-input\" /></td>\n <td class=\"px-2 py-2\">{{ row.status }}</td>\n <td class=\"px-2 py-2\">{{ row.email }}</td>\n <td class=\"px-2 py-2 text-right\">{{ row.amount }}</td>\n <td class=\"px-2 py-2\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center\" (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"flex w-full items-center gap-2 py-4\">\n <p class=\"flex-1 pr-2 text-sm text-muted-foreground\">{{ selectedCount }} of {{ rows.length }} row(s) selected.</p>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page <= 1\" (click)=\"previous()\">Previous</button>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page >= totalPages\" (click)=\"next()\">Next</button>\n </div>\n</section>\n" }]
65
+ args: [{ selector: 'pdm-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section [ngClass]=\"['flex w-full max-w-3xl flex-col items-end', className]\">\n <div class=\"flex w-full items-center justify-between py-4\">\n <input\n type=\"text\"\n [placeholder]=\"filterPlaceholder\"\n [value]=\"query\"\n (input)=\"onQueryInput($event)\"\n class=\"h-9 flex-1 rounded-md border border-input bg-transparent px-3 py-1 text-sm text-foreground shadow-sm placeholder:text-muted-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n />\n\n <button type=\"button\" class=\"inline-flex h-9 items-center gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm font-medium text-foreground shadow-sm\">\n <span>{{ columnsLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4 text-foreground\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 10L12 15L17 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"w-full overflow-hidden rounded-md border border-border bg-background\">\n <table class=\"w-full border-collapse text-sm text-foreground\">\n <thead>\n <tr class=\"border-b border-border\">\n <th class=\"w-10 px-2 text-left font-medium\"><input type=\"checkbox\" class=\"h-4 w-4 rounded-sm border border-input\" /></th>\n <th class=\"w-32 px-2 py-2 text-left font-medium\">{{ statusLabel }}</th>\n <th class=\"px-2 py-2 text-left font-medium\">\n <button type=\"button\" class=\"inline-flex items-center gap-1 rounded-sm px-3 py-2 text-sm\">\n <span>{{ emailLabel }}</span>\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 6L4 10L8 14M16 18L20 14L16 10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n </button>\n </th>\n <th class=\"w-24 px-2 py-2 text-right font-medium\">{{ amountLabel }}</th>\n <th class=\"px-2 py-2\"></th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let row of pagedRows\" class=\"border-b border-border last:border-b-0\">\n <td class=\"px-2 py-2\"><input type=\"checkbox\" [checked]=\"row.selected\" (change)=\"onToggleRow(row, $event)\" class=\"h-4 w-4 rounded-sm border border-input\" /></td>\n <td class=\"px-2 py-2\">{{ row.status }}</td>\n <td class=\"px-2 py-2\">{{ row.email }}</td>\n <td class=\"px-2 py-2 text-right\">{{ row.amount }}</td>\n <td class=\"px-2 py-2\">\n <button type=\"button\" class=\"inline-flex h-8 w-8 items-center justify-center\" (click)=\"onAction(row)\">\n <svg viewBox=\"0 0 24 24\" class=\"h-4 w-4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n <circle cx=\"18\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"></circle>\n </svg>\n </button>\n </td>\n </tr>\n <tr *ngIf=\"pagedRows.length === 0\">\n <td colspan=\"5\" class=\"px-3 py-6 text-center text-sm text-muted-foreground\">{{ emptyLabel }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"flex w-full items-center gap-2 py-4\">\n <p class=\"flex-1 pr-2 text-sm text-muted-foreground\">{{ selectedCount }} of {{ rows.length }} row(s) selected.</p>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page <= 1\" (click)=\"previous()\">{{ previousLabel }}</button>\n <button type=\"button\" class=\"h-9 rounded-md border border-input bg-background px-4 text-sm font-medium text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50\" [disabled]=\"page >= totalPages\" (click)=\"next()\">{{ nextLabel }}</button>\n </div>\n</section>\n" }]
66
66
  }], propDecorators: { className: [{
67
67
  type: Input
68
68
  }], filterPlaceholder: [{
69
69
  type: Input
70
70
  }], columnsLabel: [{
71
71
  type: Input
72
+ }], statusLabel: [{
73
+ type: Input
74
+ }], emailLabel: [{
75
+ type: Input
76
+ }], amountLabel: [{
77
+ type: Input
78
+ }], previousLabel: [{
79
+ type: Input
80
+ }], nextLabel: [{
81
+ type: Input
82
+ }], emptyLabel: [{
83
+ type: Input
72
84
  }], rows: [{
73
85
  type: Input
74
86
  }], page: [{
@@ -86,4 +98,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
86
98
  }], selectionChange: [{
87
99
  type: Output
88
100
  }] } });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZWhHLE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysc0JBQWlCLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFDekIsU0FBSSxHQUFzQjtZQUNqQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUMzRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUMzRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUNwRixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtZQUM3RSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVB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QUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFRRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkbURhdGFUYWJsZVJvdyB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBlbWFpbDogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgc2VsZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZG0tZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUGRtRGF0YVRhYmxlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJ0ZpbHRlciBlbWFpbHMuLi4nO1xuICBASW5wdXQoKSBjb2x1bW5zTGFiZWwgPSAnQ29sdW1ucyc7XG4gIEBJbnB1dCgpIHJvd3M6IFBkbURhdGFUYWJsZVJvd1tdID0gW1xuICAgIHsgaWQ6ICcxJywgc3RhdHVzOiAnU3VjY2VzcycsIGVtYWlsOiAna2VuOTlAeWFob28uY29tJywgYW1vdW50OiAnJDMxNi4wMCcgfSxcbiAgICB7IGlkOiAnMicsIHN0YXR1czogJ1N1Y2Nlc3MnLCBlbWFpbDogJ2FiZTQ1QGdtYWlsLmNvbScsIGFtb3VudDogJyQyNDIuMDAnIH0sXG4gICAgeyBpZDogJzMnLCBzdGF0dXM6ICdQcm9jZXNzaW5nJywgZW1haWw6ICdtb25zZXJyYXQ0NEBnbWFpbC5jb20nLCBhbW91bnQ6ICckODM3LjAwJyB9LFxuICAgIHsgaWQ6ICc0Jywgc3RhdHVzOiAnU3VjY2VzcycsIGVtYWlsOiAnc2lsYXMyMkBnbWFpbC5jb20nLCBhbW91bnQ6ICckODc0LjAwJyB9LFxuICAgIHsgaWQ6ICc1Jywgc3RhdHVzOiAnRmFpbGVkJywgZW1haWw6ICdjYXJtZWxsYUBob3RtYWlsLmNvbScsIGFtb3VudDogJyQ3MjEuMDAnIH1cbiAgXTtcblxuICBASW5wdXQoKSBwYWdlID0gMTtcbiAgQElucHV0KCkgcGFnZVNpemUgPSA1O1xuICBASW5wdXQoKSBxdWVyeSA9ICcnO1xuXG4gIEBPdXRwdXQoKSBxdWVyeUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcm93QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZzsgc2VsZWN0ZWQ6IGJvb2xlYW4gfT4oKTtcblxuICBnZXQgZmlsdGVyZWRSb3dzKCk6IFBkbURhdGFUYWJsZVJvd1tdIHtcbiAgICBjb25zdCBxID0gdGhpcy5xdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXEpIHJldHVybiB0aGlzLnJvd3M7XG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHIpID0+IHIuZW1haWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSk7XG4gIH1cblxuICBnZXQgcGFnZWRSb3dzKCk6IFBkbURhdGFUYWJsZVJvd1tdIHtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemU7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xuICB9XG5cbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gcm93LnNlbGVjdGVkKS5sZW5ndGg7XG4gIH1cblxuICBvblF1ZXJ5SW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMucXVlcnlDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvblRvZ2dsZVJvdyhyb3c6IFBkbURhdGFUYWJsZVJvdywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7IGlkOiByb3cuaWQsIHNlbGVjdGVkOiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgfSk7XG4gIH1cblxuICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYWdlIDw9IDEpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgLSAxKTtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnZSA+PSB0aGlzLnRvdGFsUGFnZXMpIHJldHVybjtcbiAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UgKyAxKTtcbiAgfVxuXG4gIG9uQWN0aW9uKHJvdzogUGRtRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5yb3dBY3Rpb24uZW1pdChyb3cuaWQpO1xuICB9XG59XG4iLCI8c2VjdGlvbiBbbmdDbGFzc109XCJbJ2ZsZXggdy1mdWxsIG1heC13LTN4bCBmbGV4LWNvbCBpdGVtcy1lbmQnLCBjbGFzc05hbWVdXCI+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB5LTRcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgICBbdmFsdWVdPVwicXVlcnlcIlxuICAgICAgKGlucHV0KT1cIm9uUXVlcnlJbnB1dCgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiaC05IGZsZXgtMSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0xIHRleHQtc20gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmRcIlxuICAgIC8+XG5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImlubGluZS1mbGV4IGgtOSBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbVwiPlxuICAgICAgPHNwYW4+e3sgY29sdW1uc0xhYmVsIH19PC9zcGFuPlxuICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00IHRleHQtZm9yZWdyb3VuZFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTcgMTBMMTIgMTVMMTcgMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInctZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1iYWNrZ3JvdW5kXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidy1mdWxsIGJvcmRlci1jb2xsYXBzZSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZFwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyXCI+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidy0xMCBweC0yIHRleHQtbGVmdCBmb250LW1lZGl1bVwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImgtNCB3LTQgcm91bmRlZC1zbSBib3JkZXIgYm9yZGVyLWlucHV0XCIgLz48L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInctMzIgcHgtMiBweS0yIHRleHQtbGVmdCBmb250LW1lZGl1bVwiPlN0YXR1czwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwicHgtMiBweS0yIHRleHQtbGVmdCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbSBweC0zIHB5LTIgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICA8c3Bhbj5FbWFpbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3M9XCJoLTQgdy00XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDZMNCAxMEw4IDE0TTE2IDE4TDIwIDE0TDE2IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwidy0yNCBweC0yIHB5LTIgdGV4dC1yaWdodCBmb250LW1lZGl1bVwiPkFtb3VudDwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwicHgtMiBweS0yXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZWRSb3dzXCIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIGxhc3Q6Ym9yZGVyLWItMFwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJyb3cuc2VsZWN0ZWRcIiAoY2hhbmdlKT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiIGNsYXNzPVwiaC00IHctNCByb3VuZGVkLXNtIGJvcmRlciBib3JkZXItaW5wdXRcIiAvPjwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicHgtMiBweS0yXCI+e3sgcm93LnN0YXR1cyB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicHgtMiBweS0yXCI+e3sgcm93LmVtYWlsIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJweC0yIHB5LTIgdGV4dC1yaWdodFwiPnt7IHJvdy5hbW91bnQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiIChjbGljayk9XCJvbkFjdGlvbihyb3cpXCI+XG4gICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzPVwiaC00IHctNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCIxMlwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjE4XCIgY3k9XCIxMlwiIHI9XCIxLjVcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMiBweS00XCI+XG4gICAgPHAgY2xhc3M9XCJmbGV4LTEgcHItMiB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHNlbGVjdGVkQ291bnQgfX0gb2Yge3sgcm93cy5sZW5ndGggfX0gcm93KHMpIHNlbGVjdGVkLjwvcD5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImgtOSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpvcGFjaXR5LTUwXCIgW2Rpc2FibGVkXT1cInBhZ2UgPD0gMVwiIChjbGljayk9XCJwcmV2aW91cygpXCI+UHJldmlvdXM8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImgtOSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpvcGFjaXR5LTUwXCIgW2Rpc2FibGVkXT1cInBhZ2UgPj0gdG90YWxQYWdlc1wiIChjbGljayk9XCJuZXh0KClcIj5OZXh0PC9idXR0b24+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZWhHLE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysc0JBQWlCLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxPQUFPLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxVQUFVLENBQUM7UUFDM0IsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUNuQixlQUFVLEdBQUcsYUFBYSxDQUFDO1FBQzNCLFNBQUksR0FBc0IsRUFBRSxDQUFDO1FBRTdCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVWLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN4QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFxQyxDQUFDO0tBMkNuRjtJQXpDQyxJQUFJLFlBQVk7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMs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O2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGRtRGF0YVRhYmxlUm93IHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkbS1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZG1EYXRhVGFibGVDb21wb25lbnQge1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgQElucHV0KCkgZmlsdGVyUGxhY2Vob2xkZXIgPSAnRmlsdGVyLi4uJztcbiAgQElucHV0KCkgY29sdW1uc0xhYmVsID0gJ0NvbHVtbnMnO1xuICBASW5wdXQoKSBzdGF0dXNMYWJlbCA9ICdTdGF0dXMnO1xuICBASW5wdXQoKSBlbWFpbExhYmVsID0gJ0VtYWlsJztcbiAgQElucHV0KCkgYW1vdW50TGFiZWwgPSAnQW1vdW50JztcbiAgQElucHV0KCkgcHJldmlvdXNMYWJlbCA9ICdQcmV2aW91cyc7XG4gIEBJbnB1dCgpIG5leHRMYWJlbCA9ICdOZXh0JztcbiAgQElucHV0KCkgZW1wdHlMYWJlbCA9ICdObyByZXN1bHRzLic7XG4gIEBJbnB1dCgpIHJvd3M6IFBkbURhdGFUYWJsZVJvd1tdID0gW107XG5cbiAgQElucHV0KCkgcGFnZSA9IDE7XG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gNTtcbiAgQElucHV0KCkgcXVlcnkgPSAnJztcblxuICBAT3V0cHV0KCkgcXVlcnlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJvd0FjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmc7IHNlbGVjdGVkOiBib29sZWFuIH0+KCk7XG5cbiAgZ2V0IGZpbHRlcmVkUm93cygpOiBQZG1EYXRhVGFibGVSb3dbXSB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSByZXR1cm4gdGhpcy5yb3dzO1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKChyKSA9PiByLmVtYWlsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgZ2V0IHBhZ2VkUm93cygpOiBQZG1EYXRhVGFibGVSb3dbXSB7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcbiAgfVxuXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5zZWxlY3RlZCkubGVuZ3RoO1xuICB9XG5cbiAgb25RdWVyeUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25Ub2dnbGVSb3cocm93OiBQZG1EYXRhVGFibGVSb3csIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBpZDogcm93LmlkLCBzZWxlY3RlZDogKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkIH0pO1xuICB9XG5cbiAgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnZSA8PSAxKSByZXR1cm47XG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlIC0gMSk7XG4gIH1cblxuICBuZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2UgPj0gdGhpcy50b3RhbFBhZ2VzKSByZXR1cm47XG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlICsgMSk7XG4gIH1cblxuICBvbkFjdGlvbihyb3c6IFBkbURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIHRoaXMucm93QWN0aW9uLmVtaXQocm93LmlkKTtcbiAgfVxufVxuIiwiPHNlY3Rpb24gW25nQ2xhc3NdPVwiWydmbGV4IHctZnVsbCBtYXgtdy0zeGwgZmxleC1jb2wgaXRlbXMtZW5kJywgY2xhc3NOYW1lXVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00XCI+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyUGxhY2Vob2xkZXJcIlxuICAgICAgW3ZhbHVlXT1cInF1ZXJ5XCJcbiAgICAgIChpbnB1dCk9XCJvblF1ZXJ5SW5wdXQoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cImgtOSBmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLXRyYW5zcGFyZW50IHB4LTMgcHktMSB0ZXh0LXNtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kXCJcbiAgICAvPlxuXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBoLTkgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc21cIj5cbiAgICAgIDxzcGFuPnt7IGNvbHVtbnNMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGNsYXNzPVwiaC00IHctNCB0ZXh0LWZvcmVncm91bmRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk03IDEwTDEyIDE1TDE3IDEwXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZFwiPlxuICAgIDx0YWJsZSBjbGFzcz1cInctZnVsbCBib3JkZXItY29sbGFwc2UgdGV4dC1zbSB0ZXh0LWZvcmVncm91bmRcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLWJvcmRlclwiPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInctMTAgcHgtMiB0ZXh0LWxlZnQgZm9udC1tZWRpdW1cIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJoLTQgdy00IHJvdW5kZWQtc20gYm9yZGVyIGJvcmRlci1pbnB1dFwiIC8+PC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3LTMyIHB4LTIgcHktMiB0ZXh0LWxlZnQgZm9udC1tZWRpdW1cIj57eyBzdGF0dXNMYWJlbCB9fTwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwicHgtMiBweS0yIHRleHQtbGVmdCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbSBweC0zIHB5LTIgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBlbWFpbExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImgtNCB3LTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggNkw0IDEwTDggMTRNMTYgMThMMjAgMTRMMTYgMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJ3LTI0IHB4LTIgcHktMiB0ZXh0LXJpZ2h0IGZvbnQtbWVkaXVtXCI+e3sgYW1vdW50TGFiZWwgfX08L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInB4LTIgcHktMlwiPjwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8dGJvZHk+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBhZ2VkUm93c1wiIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLWJvcmRlciBsYXN0OmJvcmRlci1iLTBcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJweC0yIHB5LTJcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwicm93LnNlbGVjdGVkXCIgKGNoYW5nZSk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIiBjbGFzcz1cImgtNCB3LTQgcm91bmRlZC1zbSBib3JkZXIgYm9yZGVyLWlucHV0XCIgLz48L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPnt7IHJvdy5zdGF0dXMgfX08L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInB4LTIgcHktMlwiPnt7IHJvdy5lbWFpbCB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicHgtMiBweS0yIHRleHQtcmlnaHRcIj57eyByb3cuYW1vdW50IH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJweC0yIHB5LTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5saW5lLWZsZXggaC04IHctOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiAoY2xpY2spPVwib25BY3Rpb24ocm93KVwiPlxuICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cImgtNCB3LTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiMTJcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxOFwiIGN5PVwiMTJcIiByPVwiMS41XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdJZj1cInBhZ2VkUm93cy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIiBjbGFzcz1cInB4LTMgcHktNiB0ZXh0LWNlbnRlciB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGVtcHR5TGFiZWwgfX08L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGdhcC0yIHB5LTRcIj5cbiAgICA8cCBjbGFzcz1cImZsZXgtMSBwci0yIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgc2VsZWN0ZWRDb3VudCB9fSBvZiB7eyByb3dzLmxlbmd0aCB9fSByb3cocykgc2VsZWN0ZWQuPC9wPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaC05IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgc2hhZG93LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOm9wYWNpdHktNTBcIiBbZGlzYWJsZWRdPVwicGFnZSA8PSAxXCIgKGNsaWNrKT1cInByZXZpb3VzKClcIj57eyBwcmV2aW91c0xhYmVsIH19PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJoLTkgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6b3BhY2l0eS01MFwiIFtkaXNhYmxlZF09XCJwYWdlID49IHRvdGFsUGFnZXNcIiAoY2xpY2spPVwibmV4dCgpXCI+e3sgbmV4dExhYmVsIH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19