@tetacom/svg-charts 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/chart/chart-container/series/area-series/area-series.component.d.ts +31 -0
  2. package/chart/chart-container/series/block-area-series/block-area-series.component.d.ts +31 -0
  3. package/chart/chart-container/series/block-series/block-series.component.d.ts +23 -0
  4. package/chart/chart-container/series/public-api.d.ts +6 -0
  5. package/chart/chart-container/series-host/series-host.component.d.ts +0 -1
  6. package/chart/chart-container/tooltip/tooltip.component.d.ts +4 -3
  7. package/chart/chart.module.d.ts +6 -3
  8. package/chart/default/defaultSeriesTypeMapping.d.ts +3 -0
  9. package/chart/directives/zoomable.directive.d.ts +2 -1
  10. package/chart/model/axis-options.d.ts +1 -0
  11. package/chart/model/base-point.d.ts +3 -1
  12. package/chart/model/enum/fill-type.d.ts +4 -0
  13. package/chart/model/enum/series-type.d.ts +4 -1
  14. package/chart/model/i-broadcast-message.d.ts +1 -0
  15. package/chart/model/i-chart-config.d.ts +3 -2
  16. package/chart/model/public-api.d.ts +1 -0
  17. package/chart/model/series.d.ts +2 -0
  18. package/chart/model/tooltip-options.d.ts +2 -1
  19. package/chart/service/zoom.service.d.ts +1 -1
  20. package/esm2020/chart/chart-container/chart-container.component.mjs +13 -8
  21. package/esm2020/chart/chart-container/series/area-series/area-series.component.mjs +174 -0
  22. package/esm2020/chart/chart-container/series/block-area-series/block-area-series.component.mjs +195 -0
  23. package/esm2020/chart/chart-container/series/block-series/block-series.component.mjs +47 -0
  24. package/esm2020/chart/chart-container/series/line/line-series.component.mjs +8 -5
  25. package/esm2020/chart/chart-container/series/public-api.mjs +7 -0
  26. package/esm2020/chart/chart-container/series/scatter-series/scatter-series.component.mjs +1 -74
  27. package/esm2020/chart/chart-container/series-host/series-host.component.mjs +3 -10
  28. package/esm2020/chart/chart-container/tooltip/tooltip.component.mjs +2 -2
  29. package/esm2020/chart/chart.module.mjs +26 -3
  30. package/esm2020/chart/default/default-axis-config.mjs +2 -1
  31. package/esm2020/chart/default/default-series-config.mjs +4 -1
  32. package/esm2020/chart/default/defaultSeriesTypeMapping.mjs +13 -0
  33. package/esm2020/chart/directives/zoomable.directive.mjs +5 -3
  34. package/esm2020/chart/legend/legend.component.mjs +5 -2
  35. package/esm2020/chart/model/axis-options.mjs +1 -1
  36. package/esm2020/chart/model/base-point.mjs +1 -1
  37. package/esm2020/chart/model/enum/fill-type.mjs +6 -0
  38. package/esm2020/chart/model/enum/series-type.mjs +5 -2
  39. package/esm2020/chart/model/i-broadcast-message.mjs +1 -1
  40. package/esm2020/chart/model/i-chart-config.mjs +1 -1
  41. package/esm2020/chart/model/public-api.mjs +2 -1
  42. package/esm2020/chart/model/series.mjs +1 -1
  43. package/esm2020/chart/model/tooltip-options.mjs +1 -1
  44. package/esm2020/chart/service/brush.service.mjs +18 -7
  45. package/esm2020/chart/service/chart.service.mjs +4 -2
  46. package/esm2020/chart/service/scale.service.mjs +8 -2
  47. package/esm2020/chart/service/zoom.service.mjs +47 -24
  48. package/esm2020/public-api.mjs +2 -2
  49. package/fesm2015/tetacom-svg-charts.mjs +537 -134
  50. package/fesm2015/tetacom-svg-charts.mjs.map +1 -1
  51. package/fesm2020/tetacom-svg-charts.mjs +524 -128
  52. package/fesm2020/tetacom-svg-charts.mjs.map +1 -1
  53. package/package.json +1 -1
  54. package/public-api.d.ts +1 -0
@@ -0,0 +1,31 @@
1
+ import { ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';
2
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
3
+ import { BasePoint } from '../../../model/base-point';
4
+ import { ChartService } from '../../../service/chart.service';
5
+ import { ScaleService } from '../../../service/scale.service';
6
+ import { ZoomService } from '../../../service/zoom.service';
7
+ import { Observable } from 'rxjs';
8
+ import { FillType } from '../../../model/enum/fill-type';
9
+ import * as i0 from "@angular/core";
10
+ export declare class AreaSeriesComponent<T extends BasePoint> extends SeriesBaseComponent<T> implements OnInit {
11
+ protected svc: ChartService;
12
+ protected cdr: ChangeDetectorRef;
13
+ protected scaleService: ScaleService;
14
+ protected zoomService: ZoomService;
15
+ protected element: ElementRef;
16
+ transform: Observable<Pick<BasePoint, 'x' | 'y'>>;
17
+ display: Observable<number>;
18
+ path: Observable<string>;
19
+ svgElement: SVGGeometryElement;
20
+ x: any;
21
+ y: any;
22
+ id: string;
23
+ fillType: typeof FillType;
24
+ constructor(svc: ChartService, cdr: ChangeDetectorRef, scaleService: ScaleService, zoomService: ZoomService, element: ElementRef);
25
+ ngOnInit(): void;
26
+ ngAfterViewInit(): void;
27
+ getMarkers(): T[];
28
+ getTransform(event: any, x: Map<number, any>, y: Map<number, any>): Pick<BasePoint, 'x' | 'y'>;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<AreaSeriesComponent<any>, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<AreaSeriesComponent<any>, "svg:svg[teta-area-series]", never, {}, {}, never, never>;
31
+ }
@@ -0,0 +1,31 @@
1
+ import { ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';
2
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
3
+ import { BasePoint } from '../../../model/base-point';
4
+ import { ChartService } from '../../../service/chart.service';
5
+ import { ScaleService } from '../../../service/scale.service';
6
+ import { ZoomService } from '../../../service/zoom.service';
7
+ import { Observable } from 'rxjs';
8
+ import { FillType } from '../../../model/enum/fill-type';
9
+ import * as i0 from "@angular/core";
10
+ export declare class BlockAreaSeriesComponent<T extends BasePoint> extends SeriesBaseComponent<T> implements OnInit {
11
+ protected svc: ChartService;
12
+ protected cdr: ChangeDetectorRef;
13
+ protected scaleService: ScaleService;
14
+ protected zoomService: ZoomService;
15
+ protected element: ElementRef;
16
+ transform: Observable<Pick<BasePoint, 'x' | 'y'>>;
17
+ display: Observable<number>;
18
+ path: Observable<string>;
19
+ svgElement: SVGGeometryElement;
20
+ x: any;
21
+ y: any;
22
+ id: string;
23
+ fillType: typeof FillType;
24
+ constructor(svc: ChartService, cdr: ChangeDetectorRef, scaleService: ScaleService, zoomService: ZoomService, element: ElementRef);
25
+ ngOnInit(): void;
26
+ ngAfterViewInit(): void;
27
+ getMarkers(): T[];
28
+ getTransform(event: any, x: Map<number, any>, y: Map<number, any>): Pick<BasePoint, 'x' | 'y'>;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<BlockAreaSeriesComponent<any>, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<BlockAreaSeriesComponent<any>, "svg:svg[teta-block-area-series]", never, {}, {}, never, never>;
31
+ }
@@ -0,0 +1,23 @@
1
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, OnInit } from '@angular/core';
2
+ import { BasePoint } from '../../../model/base-point';
3
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
4
+ import { Observable } from 'rxjs';
5
+ import { ChartService } from '../../../service/chart.service';
6
+ import { ScaleService } from '../../../service/scale.service';
7
+ import { ZoomService } from '../../../service/zoom.service';
8
+ import * as i0 from "@angular/core";
9
+ export declare class BlockSeriesComponent<T extends BasePoint> extends SeriesBaseComponent<T> implements OnInit, AfterViewInit {
10
+ protected svc: ChartService;
11
+ protected cdr: ChangeDetectorRef;
12
+ protected scaleService: ScaleService;
13
+ protected zoomService: ZoomService;
14
+ protected element: ElementRef;
15
+ x: Observable<any>;
16
+ y: Observable<any>;
17
+ displayPoints: Observable<BasePoint[]>;
18
+ constructor(svc: ChartService, cdr: ChangeDetectorRef, scaleService: ScaleService, zoomService: ZoomService, element: ElementRef);
19
+ ngOnInit(): void;
20
+ ngAfterViewInit(): void;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<BlockSeriesComponent<any>, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<BlockSeriesComponent<any>, "svg:svg[teta-block-series]", never, {}, {}, never, never>;
23
+ }
@@ -0,0 +1,6 @@
1
+ export * from './bar/bar-series.component';
2
+ export * from './block-area-series/block-area-series.component';
3
+ export * from './block-series/block-series.component';
4
+ export * from './line/line-series.component';
5
+ export * from './scatter-series/scatter-series.component';
6
+ export * from './area-series/area-series.component';
@@ -11,7 +11,6 @@ export declare class SeriesHostComponent<T extends BasePoint> implements OnInit
11
11
  series: Series<T>;
12
12
  size: DOMRect;
13
13
  rect: any;
14
- private defaultSeriesTypeMapping;
15
14
  private _init;
16
15
  private _componentRef;
17
16
  constructor(viewContainerRef: ViewContainerRef, chartService: ChartService);
@@ -2,7 +2,8 @@ import { ChangeDetectorRef, NgZone, OnDestroy, OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { ChartService } from '../../service/chart.service';
4
4
  import { ZoomService } from '../../service/zoom.service';
5
- import { DomSanitizer } from '@angular/platform-browser';
5
+ import { IDisplayTooltip } from '../../model/i-display-tooltip';
6
+ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
6
7
  import { IChartConfig } from '../../model/i-chart-config';
7
8
  import * as i0 from "@angular/core";
8
9
  export declare class TooltipComponent implements OnInit, OnDestroy {
@@ -19,8 +20,8 @@ export declare class TooltipComponent implements OnInit, OnDestroy {
19
20
  bottom: string;
20
21
  right: string;
21
22
  }>;
22
- displayTooltips: Observable<string>;
23
- tooltips: any[];
23
+ displayTooltips: Observable<SafeHtml>;
24
+ tooltips: IDisplayTooltip[];
24
25
  private alive;
25
26
  display: Observable<number>;
26
27
  constructor(svc: ChartService, cdr: ChangeDetectorRef, zoomService: ZoomService, sanitizer: DomSanitizer, _zone: NgZone);
@@ -14,10 +14,13 @@ import * as i12 from "./chart-container/series/bar/bar-series.component";
14
14
  import * as i13 from "./chart-container/tooltip/tooltip.component";
15
15
  import * as i14 from "./directives/zoomable.directive";
16
16
  import * as i15 from "./directives/brushable.directive";
17
- import * as i16 from "./chart-container/series/scatter-series/scatter-series.component";
18
- import * as i17 from "@angular/common";
17
+ import * as i16 from "./chart-container/series/area-series/area-series.component";
18
+ import * as i17 from "./chart-container/series/scatter-series/scatter-series.component";
19
+ import * as i18 from "./chart-container/series/block-series/block-series.component";
20
+ import * as i19 from "./chart-container/series/block-area-series/block-area-series.component";
21
+ import * as i20 from "@angular/common";
19
22
  export declare class ChartModule {
20
23
  static ɵfac: i0.ɵɵFactoryDeclaration<ChartModule, never>;
21
- static ɵmod: i0.ɵɵNgModuleDeclaration<ChartModule, [typeof i1.ChartComponent, typeof i2.SeriesHostComponent, typeof i3.ChartContainerComponent, typeof i4.LegendComponent, typeof i5.SeriesBaseComponent, typeof i6.LineSeriesComponent, typeof i7.GridlinesComponent, typeof i8.XAxisComponent, typeof i9.YAxisComponent, typeof i10.PlotlineComponent, typeof i11.PlotBandComponent, typeof i12.BarSeriesComponent, typeof i13.TooltipComponent, typeof i14.ZoomableDirective, typeof i15.BrushableDirective, typeof i16.ScatterSeriesComponent], [typeof i17.CommonModule], [typeof i1.ChartComponent]>;
24
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ChartModule, [typeof i1.ChartComponent, typeof i2.SeriesHostComponent, typeof i3.ChartContainerComponent, typeof i4.LegendComponent, typeof i5.SeriesBaseComponent, typeof i6.LineSeriesComponent, typeof i7.GridlinesComponent, typeof i8.XAxisComponent, typeof i9.YAxisComponent, typeof i10.PlotlineComponent, typeof i11.PlotBandComponent, typeof i12.BarSeriesComponent, typeof i13.TooltipComponent, typeof i14.ZoomableDirective, typeof i15.BrushableDirective, typeof i16.AreaSeriesComponent, typeof i17.ScatterSeriesComponent, typeof i18.BlockSeriesComponent, typeof i19.BlockAreaSeriesComponent], [typeof i20.CommonModule], [typeof i1.ChartComponent, typeof i6.LineSeriesComponent, typeof i12.BarSeriesComponent, typeof i17.ScatterSeriesComponent, typeof i16.AreaSeriesComponent, typeof i18.BlockSeriesComponent, typeof i19.BlockAreaSeriesComponent]>;
22
25
  static ɵinj: i0.ɵɵInjectorDeclaration<ChartModule>;
23
26
  }
@@ -0,0 +1,3 @@
1
+ import { SeriesType } from '../model/enum/series-type';
2
+ import { SeriesBaseComponent } from '../base/series-base.component';
3
+ export declare const defaultSeriesTypeMapping: Map<SeriesType, typeof SeriesBaseComponent>;
@@ -9,10 +9,11 @@ export declare class ZoomableDirective {
9
9
  config?: IChartConfig;
10
10
  axis?: Axis;
11
11
  size?: DOMRect;
12
+ brushScale?: any;
12
13
  private zoomable;
13
14
  constructor(element: ElementRef, svc: ZoomService);
14
15
  ngOnInit(): void;
15
16
  ngAfterViewInit(): void;
16
17
  static ɵfac: i0.ɵɵFactoryDeclaration<ZoomableDirective, never>;
17
- static ɵdir: i0.ɵɵDirectiveDeclaration<ZoomableDirective, "[tetaZoomable]", never, { "config": "config"; "axis": "axis"; "size": "size"; }, {}, never>;
18
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ZoomableDirective, "[tetaZoomable]", never, { "config": "config"; "axis": "axis"; "size": "size"; "brushScale": "brushScale"; }, {}, never>;
18
19
  }
@@ -14,6 +14,7 @@ export interface AxisOptions {
14
14
  zoom?: boolean;
15
15
  inverted?: boolean;
16
16
  opposite?: boolean;
17
+ niceTicks?: boolean;
17
18
  plotBands?: PlotBand[];
18
19
  plotLines?: PlotLine[];
19
20
  }
@@ -4,6 +4,8 @@ export interface BasePoint {
4
4
  x1?: number;
5
5
  y: number;
6
6
  y1?: number;
7
- color?: number;
7
+ iconId?: string;
8
+ color?: string;
9
+ text?: string;
8
10
  marker?: MarkerOptions;
9
11
  }
@@ -0,0 +1,4 @@
1
+ export declare enum FillType {
2
+ default = 0,
3
+ gradient = 1
4
+ }
@@ -1,5 +1,8 @@
1
1
  export declare enum SeriesType {
2
2
  line = 0,
3
3
  bar = 1,
4
- scatter = 2
4
+ area = 2,
5
+ scatter = 3,
6
+ block = 4,
7
+ blockArea = 5
5
8
  }
@@ -4,6 +4,7 @@ import { BrushType } from './enum/brush-type';
4
4
  export interface ZoomMessage {
5
5
  event: D3ZoomEvent<any, any>;
6
6
  axis?: Axis;
7
+ brushDomain?: number[];
7
8
  }
8
9
  export interface BrushMessage {
9
10
  event: D3BrushEvent<any>;
@@ -15,9 +15,10 @@ export interface IChartConfig {
15
15
  syncChannel?: string;
16
16
  };
17
17
  brush?: {
18
- enable: boolean;
18
+ enable?: boolean;
19
19
  type: BrushType;
20
- axisIndex?: number;
20
+ from?: number;
21
+ to?: number;
21
22
  };
22
23
  legend?: {
23
24
  enable?: boolean;
@@ -6,6 +6,7 @@ export * from './i-broadcast-message';
6
6
  export * from './i-chart-config';
7
7
  export * from './i-chart-event';
8
8
  export * from './i-point-move';
9
+ export * from './i-display-tooltip';
9
10
  export * from './marker-options';
10
11
  export * from './plot-band';
11
12
  export * from './plot-line';
@@ -2,6 +2,7 @@ import { BasePoint } from './base-point';
2
2
  import { SeriesType } from './enum/series-type';
3
3
  import { SeriesBaseComponent } from '../base/series-base.component';
4
4
  import { SvgAttributes } from './svg-attributes';
5
+ import { FillType } from './enum/fill-type';
5
6
  export interface Series<T extends BasePoint> {
6
7
  id?: number | string;
7
8
  type: SeriesType;
@@ -12,6 +13,7 @@ export interface Series<T extends BasePoint> {
12
13
  component?: typeof SeriesBaseComponent;
13
14
  visible?: boolean;
14
15
  color?: string;
16
+ fillType?: FillType;
15
17
  showInLegend?: boolean;
16
18
  style?: SvgAttributes;
17
19
  }
@@ -1,8 +1,9 @@
1
1
  import { TooltipTracking } from './enum/tooltip-tracking';
2
+ import { IDisplayTooltip } from './i-display-tooltip';
2
3
  export interface TooltipOptions {
3
4
  enable?: boolean;
4
5
  showMarkers?: boolean;
5
6
  showLine?: boolean;
6
7
  tracking?: TooltipTracking;
7
- format?: (data: any) => any;
8
+ format?: (data: IDisplayTooltip[]) => string;
8
9
  }
@@ -11,7 +11,7 @@ export declare class ZoomService {
11
11
  zoomed: Observable<IChartEvent<Axis>>;
12
12
  private zoomed$;
13
13
  constructor(broadcastService: BroadcastService);
14
- applyZoom(svgElement: ElementRef, config: IChartConfig, size: DOMRect, axis?: Axis): void;
14
+ applyZoom(svgElement: ElementRef, config: IChartConfig, size: DOMRect, axis?: Axis, brushScale?: any): void;
15
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ZoomService, never>;
16
16
  static ɵprov: i0.ɵɵInjectableDeclaration<ZoomService>;
17
17
  }
@@ -1,6 +1,7 @@
1
1
  import { ChangeDetectionStrategy, Component, } from '@angular/core';
2
- import { combineLatest, map, tap } from 'rxjs';
2
+ import { combineLatest, map, tap, withLatestFrom } from 'rxjs';
3
3
  import { AxisOrientation } from '../model/enum/axis-orientation';
4
+ import { BrushType } from '../model/enum/brush-type';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../service/chart.service";
6
7
  import * as i2 from "../service/scale.service";
@@ -34,8 +35,12 @@ export class ChartContainerComponent {
34
35
  this.xAxisMap = this._scaleService.xAxisMap;
35
36
  this.yScaleMap = this._scaleService.yScaleMap;
36
37
  this.xScaleMap = this._scaleService.xScaleMap;
37
- this.brushScale = this._scaleService.xScaleMap.pipe(map((map) => {
38
- return map.get(0);
38
+ this.brushScale = combineLatest([
39
+ this._scaleService.xScaleMap,
40
+ this._scaleService.yScaleMap,
41
+ ]).pipe(withLatestFrom(this.config), map((data) => {
42
+ const [[x, y], config] = data;
43
+ return config.brush?.type === BrushType.x ? x.get(0) : y.get(0);
39
44
  }));
40
45
  this.visibleRect = combineLatest([
41
46
  this.size,
@@ -61,8 +66,8 @@ export class ChartContainerComponent {
61
66
  return {
62
67
  x: left,
63
68
  y: top,
64
- width: size.width - left - right + 1,
65
- height: size.height - top - bottom + 1,
69
+ width: size.width - left - right,
70
+ height: size.height - top - bottom,
66
71
  };
67
72
  }), tap((_) => this._cdr.detectChanges()));
68
73
  }
@@ -125,9 +130,9 @@ export class ChartContainerComponent {
125
130
  }
126
131
  }
127
132
  ChartContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartContainerComponent, deps: [{ token: i1.ChartService }, { token: i0.ChangeDetectorRef }, { token: i2.ScaleService }, { token: i3.ZoomService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
128
- ChartContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: ChartContainerComponent, selector: "teta-chart-container", ngImport: i0, template: "<ng-container *ngIf=\"{\n size: size | async,\n config: config | async,\n xAxisMap: xAxisMap | async,\n yAxisMap: yAxisMap | async,\n xScaleMap: xScaleMap | async,\n yScaleMap: yScaleMap | async\n} as data\">\n\n <teta-tooltip *ngIf=\"data.config?.tooltip?.enable\" [size]=\"data.size\" [config]=\"data.config\"></teta-tooltip>\n <svg height=\"100%\" width=\"100%\" class=\"position-absolute\">\n <g class=\"y-axis-container\">\n <ng-container *ngFor=\"let item of data.yAxisMap | keyvalue; trackBy: identify\">\n <g\n teta-y-axis\n [axis]=\"item.value\"\n [scale]=\"data.yScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"item.value.options.opposite ? 0 : -item.value.selfSize\"\n [attr.y]=\"0\"\n [attr.height]=\"data.size.width\"\n [attr.width]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n </g>\n <g class=\"x-axis-container\">\n <ng-container *ngFor=\"let item of data.xAxisMap | keyvalue; trackBy: identify\">\n <g\n teta-x-axis\n [axis]=\"item.value\"\n [scale]=\"data.xScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"data.size.width\"\n [attr.height]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n </g>\n </svg>\n <ng-container *ngIf=\"visibleRect | async as rect\">\n <svg\n tetaBrushable\n tetaZoomable\n [size]=\"data.size\"\n [brushScale]=\"brushScale | async\"\n [config]=\"config | async\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.transform]=\"'translate('+ rect.x +', '+ rect.y +')'\"\n [attr.viewBox]=\"'0 0 ' + rect.width + ' ' + rect.height\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousemove)=\"mouseMove($event)\">\n <g>\n <g>\n <g class=\"gridlines\"\n teta-gridlines\n [size]=\"data.size\"\n [xScaleMap]=\"data.xScaleMap\"\n [yScaleMap]=\"data.yScaleMap\"></g>\n <g class=\"x-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n\n <g class=\"x-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"series-container\">\n <g teta-series-host\n *ngFor=\"let series of data.config.series\"\n [config]=\"data.config\"\n [series]=\"series\"\n [size]=\"data.size\"></g>\n </g>\n </g>\n </g>\n </svg>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-width:0;min-height:0}:host .zoomable:hover{cursor:grab}:host .zoomable:active{cursor:grabbing}\n"], components: [{ type: i4.TooltipComponent, selector: "teta-tooltip", inputs: ["size", "config"] }, { type: i5.YAxisComponent, selector: "[teta-y-axis]", inputs: ["axis", "scale", "size"] }, { type: i6.XAxisComponent, selector: "[teta-x-axis]", inputs: ["axis", "scale", "size"] }, { type: i7.GridlinesComponent, selector: "[teta-gridlines]", inputs: ["size", "xScaleMap", "yScaleMap"] }, { type: i8.PlotlineComponent, selector: "[teta-plot-line]", inputs: ["plotLine", "size", "axis", "scale"] }, { type: i9.PlotBandComponent, selector: "[teta-plot-band]", inputs: ["plotBand", "axis", "scale", "size"] }, { type: i10.SeriesHostComponent, selector: "[teta-series-host]", inputs: ["config", "series", "size", "rect"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.ZoomableDirective, selector: "[tetaZoomable]", inputs: ["config", "axis", "size"] }, { type: i13.BrushableDirective, selector: "svg:svg[tetaBrushable]", inputs: ["config", "size", "brushScale"] }], pipes: { "async": i11.AsyncPipe, "keyvalue": i11.KeyValuePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
133
+ ChartContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: ChartContainerComponent, selector: "teta-chart-container", ngImport: i0, template: "<ng-container *ngIf=\"{\n size: size | async,\n config: config | async,\n xAxisMap: xAxisMap | async,\n yAxisMap: yAxisMap | async,\n xScaleMap: xScaleMap | async,\n yScaleMap: yScaleMap | async\n} as data\">\n\n <teta-tooltip *ngIf=\"data.config?.tooltip?.enable\" [size]=\"data.size\" [config]=\"data.config\"></teta-tooltip>\n <svg height=\"100%\" width=\"100%\" class=\"position-absolute\">\n <g class=\"y-axis-container\">\n <ng-container *ngFor=\"let item of data.yAxisMap | keyvalue; trackBy: identify\">\n <ng-container *ngIf=\"item.value.options.visible\">\n <g\n teta-y-axis\n [axis]=\"item.value\"\n [scale]=\"data.yScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [brushScale]=\"brushScale | async\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"item.value.options.opposite ? 0 : -item.value.selfSize\"\n [attr.y]=\"0\"\n [attr.height]=\"data.size.height\"\n [attr.width]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n\n </ng-container>\n </g>\n <g class=\"x-axis-container\">\n <ng-container *ngFor=\"let item of data.xAxisMap | keyvalue; trackBy: identify\">\n <ng-container *ngIf=\"item.value.options.visible\">\n <g\n teta-x-axis\n [axis]=\"item.value\"\n [scale]=\"data.xScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [brushScale]=\"brushScale | async\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"data.size.width\"\n [attr.height]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n\n </ng-container>\n </g>\n </svg>\n <ng-container *ngIf=\"visibleRect | async as rect\">\n <svg\n tetaBrushable\n tetaZoomable\n [size]=\"data.size\"\n [brushScale]=\"brushScale | async\"\n [config]=\"config | async\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.transform]=\"'translate('+ rect.x +', '+ rect.y +')'\"\n [attr.viewBox]=\"'0 0 ' + rect.width + ' ' + rect.height\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousemove)=\"mouseMove($event)\">\n <g>\n <g>\n <g class=\"gridlines\"\n teta-gridlines\n [size]=\"data.size\"\n [xScaleMap]=\"data.xScaleMap\"\n [yScaleMap]=\"data.yScaleMap\"></g>\n <g class=\"x-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n\n <g class=\"x-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"series-container\">\n <g teta-series-host\n *ngFor=\"let series of data.config.series\"\n [config]=\"data.config\"\n [series]=\"series\"\n [size]=\"data.size\"></g>\n </g>\n </g>\n </g>\n </svg>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-width:0;min-height:0}:host .zoomable:hover{cursor:grab}:host .zoomable:active{cursor:grabbing}\n"], components: [{ type: i4.TooltipComponent, selector: "teta-tooltip", inputs: ["size", "config"] }, { type: i5.YAxisComponent, selector: "[teta-y-axis]", inputs: ["axis", "scale", "size"] }, { type: i6.XAxisComponent, selector: "[teta-x-axis]", inputs: ["axis", "scale", "size"] }, { type: i7.GridlinesComponent, selector: "[teta-gridlines]", inputs: ["size", "xScaleMap", "yScaleMap"] }, { type: i8.PlotlineComponent, selector: "[teta-plot-line]", inputs: ["plotLine", "size", "axis", "scale"] }, { type: i9.PlotBandComponent, selector: "[teta-plot-band]", inputs: ["plotBand", "axis", "scale", "size"] }, { type: i10.SeriesHostComponent, selector: "[teta-series-host]", inputs: ["config", "series", "size", "rect"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.ZoomableDirective, selector: "[tetaZoomable]", inputs: ["config", "axis", "size", "brushScale"] }, { type: i13.BrushableDirective, selector: "svg:svg[tetaBrushable]", inputs: ["config", "size", "brushScale"] }], pipes: { "async": i11.AsyncPipe, "keyvalue": i11.KeyValuePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
129
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartContainerComponent, decorators: [{
130
135
  type: Component,
131
- args: [{ selector: 'teta-chart-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{\n size: size | async,\n config: config | async,\n xAxisMap: xAxisMap | async,\n yAxisMap: yAxisMap | async,\n xScaleMap: xScaleMap | async,\n yScaleMap: yScaleMap | async\n} as data\">\n\n <teta-tooltip *ngIf=\"data.config?.tooltip?.enable\" [size]=\"data.size\" [config]=\"data.config\"></teta-tooltip>\n <svg height=\"100%\" width=\"100%\" class=\"position-absolute\">\n <g class=\"y-axis-container\">\n <ng-container *ngFor=\"let item of data.yAxisMap | keyvalue; trackBy: identify\">\n <g\n teta-y-axis\n [axis]=\"item.value\"\n [scale]=\"data.yScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"item.value.options.opposite ? 0 : -item.value.selfSize\"\n [attr.y]=\"0\"\n [attr.height]=\"data.size.width\"\n [attr.width]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n </g>\n <g class=\"x-axis-container\">\n <ng-container *ngFor=\"let item of data.xAxisMap | keyvalue; trackBy: identify\">\n <g\n teta-x-axis\n [axis]=\"item.value\"\n [scale]=\"data.xScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"data.size.width\"\n [attr.height]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n </g>\n </svg>\n <ng-container *ngIf=\"visibleRect | async as rect\">\n <svg\n tetaBrushable\n tetaZoomable\n [size]=\"data.size\"\n [brushScale]=\"brushScale | async\"\n [config]=\"config | async\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.transform]=\"'translate('+ rect.x +', '+ rect.y +')'\"\n [attr.viewBox]=\"'0 0 ' + rect.width + ' ' + rect.height\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousemove)=\"mouseMove($event)\">\n <g>\n <g>\n <g class=\"gridlines\"\n teta-gridlines\n [size]=\"data.size\"\n [xScaleMap]=\"data.xScaleMap\"\n [yScaleMap]=\"data.yScaleMap\"></g>\n <g class=\"x-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n\n <g class=\"x-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"series-container\">\n <g teta-series-host\n *ngFor=\"let series of data.config.series\"\n [config]=\"data.config\"\n [series]=\"series\"\n [size]=\"data.size\"></g>\n </g>\n </g>\n </g>\n </svg>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-width:0;min-height:0}:host .zoomable:hover{cursor:grab}:host .zoomable:active{cursor:grabbing}\n"] }]
136
+ args: [{ selector: 'teta-chart-container', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{\n size: size | async,\n config: config | async,\n xAxisMap: xAxisMap | async,\n yAxisMap: yAxisMap | async,\n xScaleMap: xScaleMap | async,\n yScaleMap: yScaleMap | async\n} as data\">\n\n <teta-tooltip *ngIf=\"data.config?.tooltip?.enable\" [size]=\"data.size\" [config]=\"data.config\"></teta-tooltip>\n <svg height=\"100%\" width=\"100%\" class=\"position-absolute\">\n <g class=\"y-axis-container\">\n <ng-container *ngFor=\"let item of data.yAxisMap | keyvalue; trackBy: identify\">\n <ng-container *ngIf=\"item.value.options.visible\">\n <g\n teta-y-axis\n [axis]=\"item.value\"\n [scale]=\"data.yScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [brushScale]=\"brushScale | async\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"item.value.options.opposite ? 0 : -item.value.selfSize\"\n [attr.y]=\"0\"\n [attr.height]=\"data.size.height\"\n [attr.width]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n\n </ng-container>\n </g>\n <g class=\"x-axis-container\">\n <ng-container *ngFor=\"let item of data.xAxisMap | keyvalue; trackBy: identify\">\n <ng-container *ngIf=\"item.value.options.visible\">\n <g\n teta-x-axis\n [axis]=\"item.value\"\n [scale]=\"data.xScaleMap.get(item.key)\"\n [size]=\"data.size\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></g>\n\n <rect\n tetaZoomable\n fill-opacity=\"0\"\n [brushScale]=\"brushScale | async\"\n [axis]=\"item.value\"\n [config]=\"config | async\"\n [size]=\"data.size\"\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"data.size.width\"\n [attr.height]=\"item.value.selfSize\"\n [attr.transform]=\"getTranslate(item.value, data.size) | async\"></rect>\n </ng-container>\n\n </ng-container>\n </g>\n </svg>\n <ng-container *ngIf=\"visibleRect | async as rect\">\n <svg\n tetaBrushable\n tetaZoomable\n [size]=\"data.size\"\n [brushScale]=\"brushScale | async\"\n [config]=\"config | async\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.transform]=\"'translate('+ rect.x +', '+ rect.y +')'\"\n [attr.viewBox]=\"'0 0 ' + rect.width + ' ' + rect.height\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousemove)=\"mouseMove($event)\">\n <g>\n <g>\n <g class=\"gridlines\"\n teta-gridlines\n [size]=\"data.size\"\n [xScaleMap]=\"data.xScaleMap\"\n [yScaleMap]=\"data.yScaleMap\"></g>\n <g class=\"x-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotline-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-line *ngFor=\"let plotLine of axis.plotLines\"\n [plotLine]=\"plotLine\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n\n <g class=\"x-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.xAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.xScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.xAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"y-axis-plotband-container\">\n <ng-container *ngFor=\"let axis of data.config.yAxis; let i = index\">\n <g teta-plot-band *ngFor=\"let plotBand of axis.plotBands\"\n [plotBand]=\"plotBand\"\n [scale]=\"data.yScaleMap.get(i)\"\n [size]=\"data.size\"\n [axis]=\"data.yAxisMap.get(i)\"></g>\n </ng-container>\n </g>\n <g class=\"series-container\">\n <g teta-series-host\n *ngFor=\"let series of data.config.series\"\n [config]=\"data.config\"\n [series]=\"series\"\n [size]=\"data.size\"></g>\n </g>\n </g>\n </g>\n </svg>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;min-width:0;min-height:0}:host .zoomable:hover{cursor:grab}:host .zoomable:active{cursor:grabbing}\n"] }]
132
137
  }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; } });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC1jb250YWluZXIvY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC1jb250YWluZXIvY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQVUsR0FBRyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWFqRSxNQUFNLE9BQU8sdUJBQXVCO0lBZ0NsQyxZQUNVLElBQWtCLEVBQ2xCLElBQXVCLEVBQ3ZCLGFBQTJCLEVBQzNCLFlBQXlCLEVBQ3pCLFdBQXVCO1FBSnZCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUF0QnpCLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUdoQzthQUNBLEdBQUcsQ0FDRixJQUFJLEVBQ0osQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBTyxFQUFFLEVBQUUsQ0FDcEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUNuRTthQUNBLEdBQUcsQ0FDRixLQUFLLEVBQ0wsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENB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QUcsQ0FBQzthQUNMO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGVBQWUsQ0FBQyxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sYUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7b0JBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGtCQUFrQjtvQkFDakMsQ0FBQyxDQUFDLG9CQUNOLEtBQUssR0FBRyxHQUFHLENBQUM7YUFDYjtZQUVELE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQUs7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsRUFBRTtRQUNBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOztvSEEzTFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsNERDeEJwQyxneUpBNEhBOzJGRHBHYSx1QkFBdUI7a0JBTm5DLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDaGFydENvbmZpZyB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcbmltcG9ydCB7IENoYXJ0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBeGlzIH0gZnJvbSAnLi4vY29yZS9heGlzL2F4aXMnO1xuaW1wb3J0IHsgQXhpc09yaWVudGF0aW9uIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9heGlzLW9yaWVudGF0aW9uJztcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvc2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhcnRFdmVudCB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtZXZlbnQnO1xuaW1wb3J0IHsgWm9vbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3pvb20uc2VydmljZSc7XG5cbnR5cGUgT3Bwb3NpdGUgPSBib29sZWFuO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZXRhLWNoYXJ0LWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFydC1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uZmlnOiBPYnNlcnZhYmxlPElDaGFydENvbmZpZz47XG5cbiAgeUF4aXNNYXA6IE9ic2VydmFibGU8TWFwPG51bWJlciwgQXhpcz4+O1xuICB4QXhpc01hcDogT2JzZXJ2YWJsZTxNYXA8bnVtYmVyLCBBeGlzPj47XG4gIHlTY2FsZU1hcDogT2JzZXJ2YWJsZTxNYXA8bnVtYmVyLCBhbnk+PjtcbiAgeFNjYWxlTWFwOiBPYnNlcnZhYmxlPE1hcDxudW1iZXIsIGFueT4+O1xuICBzaXplOiBPYnNlcnZhYmxlPERPTVJlY3Q+O1xuICB2aXNpYmxlUmVjdDogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIGJydXNoU2NhbGU6IE9ic2VydmFibGU8YW55PjtcblxuICBwcml2YXRlIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgdW5pcUlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBmaWx0ZXJQb3NpdGlvbk1hcCA9IG5ldyBNYXA8XG4gICAgT3Bwb3NpdGUsXG4gICAgKGF4aXM6IEF4aXMpID0+IChfOiBBeGlzKSA9PiBib29sZWFuXG4gID4oKVxuICAgIC5zZXQoXG4gICAgICB0cnVlLFxuICAgICAgKGF4aXMpID0+IChfOiBBeGlzKSA9PlxuICAgICAgICBfLm9wdGlvbnMub3Bwb3NpdGUgJiYgXy5vcHRpb25zLnZpc2libGUgJiYgYXhpcy5pbmRleCA8PSBfLmluZGV4XG4gICAgKVxuICAgIC5zZXQoXG4gICAgICBmYWxzZSxcbiAgICAgIChheGlzKSA9PiAoXzogQXhpcykgPT5cbiAgICAgICAgXy5vcHRpb25zLm9wcG9zaXRlICE9PSB0cnVlICYmXG4gICAgICAgIF8ub3B0aW9ucy52aXNpYmxlICYmXG4gICAgICAgIF8uaW5kZXggPD0gYXhpcy5pbmRleFxuICAgICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfc3ZjOiBDaGFydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9zY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZSxcbiAgICBwcml2YXRlIF96b29tU2VydmljZTogWm9vbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICApIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuX3N2Yy5jb25maWc7XG4gICAgdGhpcy5zaXplID0gdGhpcy5fc3ZjLnNpemU7XG4gICAgdGhpcy55QXhpc01hcCA9IHRoaXMuX3NjYWxlU2VydmljZS55QXhpc01hcDtcbiAgICB0aGlzLnhBeGlzTWFwID0gdGhpcy5fc2NhbGVTZXJ2aWNlLnhBeGlzTWFwO1xuICAgIHRoaXMueVNjYWxlTWFwID0gdGhpcy5fc2NhbGVTZXJ2aWNlLnlTY2FsZU1hcDtcbiAgICB0aGlzLnhTY2FsZU1hcCA9IHRoaXMuX3NjYWxlU2VydmljZS54U2NhbGVNYXA7XG5cbiAgICB0aGlzLmJydXNoU2NhbGUgPSB0aGlzLl9zY2FsZVNlcnZpY2UueFNjYWxlTWFwLnBpcGUoXG4gICAgICBtYXAoKG1hcCkgPT4ge1xuICAgICAgICByZXR1cm4gbWFwLmdldCgwKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMudmlzaWJsZVJlY3QgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc2l6ZSxcbiAgICAgIHRoaXMueEF4aXNNYXAsXG4gICAgICB0aGlzLnlBeGlzTWFwLFxuICAgICAgdGhpcy5fem9vbVNlcnZpY2Uuem9vbWVkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChcbiAgICAgICAgICBkYXRhOiBbRE9NUmVjdCwgTWFwPG51bWJlciwgYW55PiwgTWFwPG51bWJlciwgYW55PiwgSUNoYXJ0RXZlbnQ8QXhpcz5dXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtzaXplLCB4LCB5XSA9IGRhdGE7XG4gICAgICAgICAgY29uc3QgeUF4ZXNBcnJheSA9IFsuLi55LnZhbHVlcygpXTtcbiAgICAgICAgICBjb25zdCB4QXhlc0FycmF5ID0gWy4uLngudmFsdWVzKCldO1xuICAgICAgICAgIGNvbnN0IGxlZnQgPSB5QXhlc0FycmF5XG4gICAgICAgICAgICAuZmlsdGVyKChfKSA9PiBfLm9wdGlvbnMub3Bwb3NpdGUgIT09IHRydWUgJiYgXy5vcHRpb25zLnZpc2libGUpXG4gICAgICAgICAgICAucmVkdWNlKHRoaXMuc3VtU2l6ZSwgMCk7XG5cbiAgICAgICAgICBjb25zdCByaWdodCA9IHlBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHhBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAhPT0gdHJ1ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIGNvbnN0IHRvcCA9IHhBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wLFxuICAgICAgICAgICAgd2lkdGg6IHNpemUud2lkdGggLSBsZWZ0IC0gcmlnaHQgKyAxLFxuICAgICAgICAgICAgaGVpZ2h0OiBzaXplLmhlaWdodCAtIHRvcCAtIGJvdHRvbSArIDEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIHRhcCgoXykgPT4gdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51bmlxSWQgPSAoRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KTtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdKSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykgfHwgIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3ZjLnNldFNpemUoZW50cmllc1swXS5jb250ZW50UmVjdCk7XG4gICAgfSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge31cblxuICBwcml2YXRlIHN1bVNpemUgPSAoYWNjLCBjdXJyKSA9PiBhY2MgKyBjdXJyLnNlbGZTaXplO1xuXG4gIGdldFRyYW5zbGF0ZShheGlzPzogQXhpcywgc2l6ZT86IERPTVJlY3QpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLnhBeGlzTWFwLCB0aGlzLnlBeGlzTWFwXSkucGlwZShcbiAgICAgIG1hcCgoZGF0YTogW01hcDxudW1iZXIsIEF4aXM+LCBNYXA8bnVtYmVyLCBBeGlzPl0pID0+IHtcbiAgICAgICAgY29uc3QgW3gsIHldID0gZGF0YTtcbiAgICAgICAgY29uc3QgeEF4ZXNBcnJheSA9IFsuLi54LnZhbHVlcygpXTtcbiAgICAgICAgY29uc3QgeUF4ZXNBcnJheSA9IFsuLi55LnZhbHVlcygpXTtcblxuICAgICAgICBjb25zdCBvcHBvc2l0ZUZpbHRlciA9IHRoaXMuZmlsdGVyUG9zaXRpb25NYXAuZ2V0KHRydWUpO1xuICAgICAgICBjb25zdCBub25PcHBvc2l0ZUZpbHRlciA9IHRoaXMuZmlsdGVyUG9zaXRpb25NYXAuZ2V0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBvcHBvc2l0ZU9mZnNldFkgPSB5QXhlc0FycmF5LmZpbHRlcihvcHBvc2l0ZUZpbHRlcihheGlzKSk7XG4gICAgICAgIGNvbnN0IG5vbk9wcG9zaXRlT2Zmc2V0WSA9IHlBeGVzQXJyYXkuZmlsdGVyKG5vbk9wcG9zaXRlRmlsdGVyKGF4aXMpKTtcblxuICAgICAgICBjb25zdCBvcHBvc2l0ZU9mZnNldFggPSB4QXhlc0FycmF5LmZpbHRlcihvcHBvc2l0ZUZpbHRlcihheGlzKSk7XG4gICAgICAgIGNvbnN0IG5vbk9wcG9zaXRlT2Zmc2V0WCA9IHhBeGVzQXJyYXkuZmlsdGVyKG5vbk9wcG9zaXRlRmlsdGVyKGF4aXMpKTtcblxuICAgICAgICBjb25zdCBvcHBvc2l0ZVRyYW5zbGF0ZVkgPSBvcHBvc2l0ZU9mZnNldFkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cnIpID0+IGFjYyArIGN1cnIuc2VsZlNpemUsXG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub25PcHBpc3RlVHJhbnNsYXRlWSA9IG5vbk9wcG9zaXRlT2Zmc2V0WS5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZSxcbiAgICAgICAgICAwXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVUcmFuc2xhdGVYID0gb3Bwb3NpdGVPZmZzZXRYLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjdXJyKSA9PiBhY2MgKyBjdXJyLnNlbGZTaXplLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBub25PcHBpc3RlVHJhbnNsYXRlWCA9IG5vbk9wcG9zaXRlT2Zmc2V0WC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZSxcbiAgICAgICAgICAwXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbGVmdCA9IHlBeGVzQXJyYXlcbiAgICAgICAgICAuZmlsdGVyKChfKSA9PiBfLm9wdGlvbnMudmlzaWJsZSAmJiBfLm9wdGlvbnMub3Bwb3NpdGUgIT09IHRydWUpXG4gICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MgKyBjdXJyLnNlbGZTaXplLCAwKTtcblxuICAgICAgICBjb25zdCB0b3AgPSB4QXhlc0FycmF5XG4gICAgICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnZpc2libGUgJiYgXy5vcHRpb25zLm9wcG9zaXRlID09PSB0cnVlKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZSwgMCk7XG5cbiAgICAgICAgaWYgKGF4aXMub3JpZW50YXRpb24gPT09IEF4aXNPcmllbnRhdGlvbi54KSB7XG4gICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtsZWZ0fSwgJHtcbiAgICAgICAgICAgIGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgICAgICA/IG9wcG9zaXRlVHJhbnNsYXRlWFxuICAgICAgICAgICAgICA6IHNpemUuaGVpZ2h0IC0gbm9uT3BwaXN0ZVRyYW5zbGF0ZVhcbiAgICAgICAgICB9KWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXhpcy5vcmllbnRhdGlvbiA9PT0gQXhpc09yaWVudGF0aW9uLnkpIHtcbiAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke1xuICAgICAgICAgICAgYXhpcy5vcHRpb25zLm9wcG9zaXRlXG4gICAgICAgICAgICAgID8gc2l6ZS53aWR0aCAtIG9wcG9zaXRlVHJhbnNsYXRlWVxuICAgICAgICAgICAgICA6IG5vbk9wcGlzdGVUcmFuc2xhdGVZXG4gICAgICAgICAgfSwgJHt0b3B9KWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpZGVudGlmeShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpdGVtLnZhbHVlLmluZGV4O1xuICB9XG5cbiAgbW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5fc3ZjLnNldFBvaW50ZXJNb3ZlKGV2ZW50KTtcbiAgfVxuXG4gIG1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICB0aGlzLl9zdmMuc2V0UG9pbnRlck1vdmUoZXZlbnQpO1xuICB9XG5cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51bmlxSWQ7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ7XG4gIHNpemU6IHNpemUgfCBhc3luYyxcbiAgY29uZmlnOiBjb25maWcgfCBhc3luYyxcbiAgeEF4aXNNYXA6IHhBeGlzTWFwIHwgYXN5bmMsXG4gIHlBeGlzTWFwOiB5QXhpc01hcCB8IGFzeW5jLFxuICB4U2NhbGVNYXA6IHhTY2FsZU1hcCB8IGFzeW5jLFxuICB5U2NhbGVNYXA6IHlTY2FsZU1hcCB8IGFzeW5jXG59IGFzIGRhdGFcIj5cblxuICA8dGV0YS10b29sdGlwICpuZ0lmPVwiZGF0YS5jb25maWc/LnRvb2x0aXA/LmVuYWJsZVwiIFtzaXplXT1cImRhdGEuc2l6ZVwiIFtjb25maWddPVwiZGF0YS5jb25maWdcIj48L3RldGEtdG9vbHRpcD5cbiAgPHN2ZyBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiPlxuICAgIDxnIGNsYXNzPVwieS1heGlzLWNvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhLnlBeGlzTWFwIHwga2V5dmFsdWU7IHRyYWNrQnk6IGlkZW50aWZ5XCI+XG4gICAgICAgIDxnXG4gICAgICAgICAgdGV0YS15LWF4aXNcbiAgICAgICAgICBbYXhpc109XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICBbc2NhbGVdPVwiZGF0YS55U2NhbGVNYXAuZ2V0KGl0ZW0ua2V5KVwiXG4gICAgICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiZ2V0VHJhbnNsYXRlKGl0ZW0udmFsdWUsIGRhdGEuc2l6ZSkgfCBhc3luY1wiPjwvZz5cbiAgICAgICAgPHJlY3RcbiAgICAgICAgICB0ZXRhWm9vbWFibGVcbiAgICAgICAgICBmaWxsLW9wYWNpdHk9XCIwXCJcbiAgICAgICAgICBbYXhpc109XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZyB8IGFzeW5jXCJcbiAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgIFthdHRyLnhdPVwiaXRlbS52YWx1ZS5vcHRpb25zLm9wcG9zaXRlID8gMCA6IC1pdGVtLnZhbHVlLnNlbGZTaXplXCJcbiAgICAgICAgICBbYXR0ci55XT1cIjBcIlxuICAgICAgICAgIFthdHRyLmhlaWdodF09XCJkYXRhLnNpemUud2lkdGhcIlxuICAgICAgICAgIFthdHRyLndpZHRoXT1cIml0ZW0udmFsdWUuc2VsZlNpemVcIlxuICAgICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJnZXRUcmFuc2xhdGUoaXRlbS52YWx1ZSwgZGF0YS5zaXplKSB8IGFzeW5jXCI+PC9yZWN0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICAgIDxnIGNsYXNzPVwieC1heGlzLWNvbnRhaW5lclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhLnhBeGlzTWFwIHwga2V5dmFsdWU7IHRyYWNrQnk6IGlkZW50aWZ5XCI+XG4gICAgICAgIDxnXG4gICAgICAgICAgdGV0YS14LWF4aXNcbiAgICAgICAgICBbYXhpc109XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICBbc2NhbGVdPVwiZGF0YS54U2NhbGVNYXAuZ2V0KGl0ZW0ua2V5KVwiXG4gICAgICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiZ2V0VHJhbnNsYXRlKGl0ZW0udmFsdWUsIGRhdGEuc2l6ZSkgfCBhc3luY1wiPjwvZz5cblxuICAgICAgICA8cmVjdFxuICAgICAgICAgIHRldGFab29tYWJsZVxuICAgICAgICAgIGZpbGwtb3BhY2l0eT1cIjBcIlxuICAgICAgICAgIFtheGlzXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgIFtjb25maWddPVwiY29uZmlnIHwgYXN5bmNcIlxuICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgW2F0dHIueF09XCIwXCJcbiAgICAgICAgICBbYXR0ci55XT1cIjBcIlxuICAgICAgICAgIFthdHRyLndpZHRoXT1cImRhdGEuc2l6ZS53aWR0aFwiXG4gICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIml0ZW0udmFsdWUuc2VsZlNpemVcIlxuICAgICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJnZXRUcmFuc2xhdGUoaXRlbS52YWx1ZSwgZGF0YS5zaXplKSB8IGFzeW5jXCI+PC9yZWN0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9nPlxuICA8L3N2Zz5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpc2libGVSZWN0IHwgYXN5bmMgYXMgcmVjdFwiPlxuICAgIDxzdmdcbiAgICAgIHRldGFCcnVzaGFibGVcbiAgICAgIHRldGFab29tYWJsZVxuICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgIFticnVzaFNjYWxlXT1cImJydXNoU2NhbGUgfCBhc3luY1wiXG4gICAgICBbY29uZmlnXT1cImNvbmZpZyB8IGFzeW5jXCJcbiAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKCcrIHJlY3QueCArJywgJysgcmVjdC55ICsnKSdcIlxuICAgICAgW2F0dHIudmlld0JveF09XCInMCAwICcgKyByZWN0LndpZHRoICsgJyAnICsgcmVjdC5oZWlnaHRcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwibW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgICAgIChtb3VzZW1vdmUpPVwibW91c2VNb3ZlKCRldmVudClcIj5cbiAgICAgIDxnPlxuICAgICAgICA8Zz5cbiAgICAgICAgICA8ZyBjbGFzcz1cImdyaWRsaW5lc1wiXG4gICAgICAgICAgICAgdGV0YS1ncmlkbGluZXNcbiAgICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgICAgIFt4U2NhbGVNYXBdPVwiZGF0YS54U2NhbGVNYXBcIlxuICAgICAgICAgICAgIFt5U2NhbGVNYXBdPVwiZGF0YS55U2NhbGVNYXBcIj48L2c+XG4gICAgICAgICAgPGcgY2xhc3M9XCJ4LWF4aXMtcGxvdGxpbmUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBheGlzIG9mIGRhdGEuY29uZmlnLnhBeGlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDxnIHRldGEtcGxvdC1saW5lICpuZ0Zvcj1cImxldCBwbG90TGluZSBvZiBheGlzLnBsb3RMaW5lc1wiXG4gICAgICAgICAgICAgICAgIFtwbG90TGluZV09XCJwbG90TGluZVwiXG4gICAgICAgICAgICAgICAgIFtzY2FsZV09XCJkYXRhLnhTY2FsZU1hcC5nZXQoaSlcIlxuICAgICAgICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgICAgICAgICBbYXhpc109XCJkYXRhLnhBeGlzTWFwLmdldChpKVwiPjwvZz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8ZyBjbGFzcz1cInktYXhpcy1wbG90bGluZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGF4aXMgb2YgZGF0YS5jb25maWcueUF4aXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGcgdGV0YS1wbG90LWxpbmUgKm5nRm9yPVwibGV0IHBsb3RMaW5lIG9mIGF4aXMucGxvdExpbmVzXCJcbiAgICAgICAgICAgICAgICAgW3Bsb3RMaW5lXT1cInBsb3RMaW5lXCJcbiAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImRhdGEueVNjYWxlTWFwLmdldChpKVwiXG4gICAgICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICAgICAgIFtheGlzXT1cImRhdGEueUF4aXNNYXAuZ2V0KGkpXCI+PC9nPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9nPlxuXG4gICAgICAgICAgPGcgY2xhc3M9XCJ4LWF4aXMtcGxvdGJhbmQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBheGlzIG9mIGRhdGEuY29uZmlnLnhBeGlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDxnIHRldGEtcGxvdC1iYW5kICpuZ0Zvcj1cImxldCBwbG90QmFuZCBvZiBheGlzLnBsb3RCYW5kc1wiXG4gICAgICAgICAgICAgICAgIFtwbG90QmFuZF09XCJwbG90QmFuZFwiXG4gICAgICAgICAgICAgICAgIFtzY2FsZV09XCJkYXRhLnhTY2FsZU1hcC5nZXQoaSlcIlxuICAgICAgICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgICAgICAgICBbYXhpc109XCJkYXRhLnhBeGlzTWFwLmdldChpKVwiPjwvZz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8ZyBjbGFzcz1cInktYXhpcy1wbG90YmFuZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGF4aXMgb2YgZGF0YS5jb25maWcueUF4aXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGcgdGV0YS1wbG90LWJhbmQgKm5nRm9yPVwibGV0IHBsb3RCYW5kIG9mIGF4aXMucGxvdEJhbmRzXCJcbiAgICAgICAgICAgICAgICAgW3Bsb3RCYW5kXT1cInBsb3RCYW5kXCJcbiAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImRhdGEueVNjYWxlTWFwLmdldChpKVwiXG4gICAgICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICAgICAgIFtheGlzXT1cImRhdGEueUF4aXNNYXAuZ2V0KGkpXCI+PC9nPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9nPlxuICAgICAgICAgIDxnIGNsYXNzPVwic2VyaWVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGcgdGV0YS1zZXJpZXMtaG9zdFxuICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlcmllcyBvZiBkYXRhLmNvbmZpZy5zZXJpZXNcIlxuICAgICAgICAgICAgICAgW2NvbmZpZ109XCJkYXRhLmNvbmZpZ1wiXG4gICAgICAgICAgICAgICBbc2VyaWVzXT1cInNlcmllc1wiXG4gICAgICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIj48L2c+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L2c+XG4gICAgICA8L2c+XG4gICAgPC9zdmc+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC1jb250YWluZXIvY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC1jb250YWluZXIvY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFjLEdBQUcsRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSWpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBVXJELE1BQU0sT0FBTyx1QkFBdUI7SUFnQ2xDLFlBQ1UsSUFBa0IsRUFDbEIsSUFBdUIsRUFDdkIsYUFBMkIsRUFDM0IsWUFBeUIsRUFDekIsV0FBdUI7UUFKdkIsU0FBSSxHQUFKLElBQUksQ0FBYztRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQXRCekIsc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBR2hDO2FBQ0EsR0FBRyxDQUNGLElBQUksRUFDSixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFPLEVBQUUsRUFBRSxDQUNwQixDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQ25F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RkQzR2EsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQ2hhcnRDb25maWcgfSBmcm9tICcuLi9tb2RlbC9pLWNoYXJ0LWNvbmZpZyc7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCB0YXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBeGlzIH0gZnJvbSAnLi4vY29yZS9heGlzL2F4aXMnO1xuaW1wb3J0IHsgQXhpc09yaWVudGF0aW9uIH0gZnJvbSAnLi4vbW9kZWwvZW51bS9heGlzLW9yaWVudGF0aW9uJztcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvc2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhcnRFdmVudCB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtZXZlbnQnO1xuaW1wb3J0IHsgWm9vbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3pvb20uc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFR5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtL2JydXNoLXR5cGUnO1xuXG50eXBlIE9wcG9zaXRlID0gYm9vbGVhbjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV0YS1jaGFydC1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQtY29udGFpbmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbnRhaW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbmZpZzogT2JzZXJ2YWJsZTxJQ2hhcnRDb25maWc+O1xuXG4gIHlBeGlzTWFwOiBPYnNlcnZhYmxlPE1hcDxudW1iZXIsIEF4aXM+PjtcbiAgeEF4aXNNYXA6IE9ic2VydmFibGU8TWFwPG51bWJlciwgQXhpcz4+O1xuICB5U2NhbGVNYXA6IE9ic2VydmFibGU8TWFwPG51bWJlciwgYW55Pj47XG4gIHhTY2FsZU1hcDogT2JzZXJ2YWJsZTxNYXA8bnVtYmVyLCBhbnk+PjtcbiAgc2l6ZTogT2JzZXJ2YWJsZTxET01SZWN0PjtcbiAgdmlzaWJsZVJlY3Q6IE9ic2VydmFibGU8YW55PjtcblxuICBicnVzaFNjYWxlOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHVuaXFJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgZmlsdGVyUG9zaXRpb25NYXAgPSBuZXcgTWFwPFxuICAgIE9wcG9zaXRlLFxuICAgIChheGlzOiBBeGlzKSA9PiAoXzogQXhpcykgPT4gYm9vbGVhblxuICA+KClcbiAgICAuc2V0KFxuICAgICAgdHJ1ZSxcbiAgICAgIChheGlzKSA9PiAoXzogQXhpcykgPT5cbiAgICAgICAgXy5vcHRpb25zLm9wcG9zaXRlICYmIF8ub3B0aW9ucy52aXNpYmxlICYmIGF4aXMuaW5kZXggPD0gXy5pbmRleFxuICAgIClcbiAgICAuc2V0KFxuICAgICAgZmFsc2UsXG4gICAgICAoYXhpcykgPT4gKF86IEF4aXMpID0+XG4gICAgICAgIF8ub3B0aW9ucy5vcHBvc2l0ZSAhPT0gdHJ1ZSAmJlxuICAgICAgICBfLm9wdGlvbnMudmlzaWJsZSAmJlxuICAgICAgICBfLmluZGV4IDw9IGF4aXMuaW5kZXhcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3N2YzogQ2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfem9vbVNlcnZpY2U6IFpvb21TZXJ2aWNlLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLl9zdmMuY29uZmlnO1xuICAgIHRoaXMuc2l6ZSA9IHRoaXMuX3N2Yy5zaXplO1xuICAgIHRoaXMueUF4aXNNYXAgPSB0aGlzLl9zY2FsZVNlcnZpY2UueUF4aXNNYXA7XG4gICAgdGhpcy54QXhpc01hcCA9IHRoaXMuX3NjYWxlU2VydmljZS54QXhpc01hcDtcbiAgICB0aGlzLnlTY2FsZU1hcCA9IHRoaXMuX3NjYWxlU2VydmljZS55U2NhbGVNYXA7XG4gICAgdGhpcy54U2NhbGVNYXAgPSB0aGlzLl9zY2FsZVNlcnZpY2UueFNjYWxlTWFwO1xuXG4gICAgdGhpcy5icnVzaFNjYWxlID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLl9zY2FsZVNlcnZpY2UueFNjYWxlTWFwLFxuICAgICAgdGhpcy5fc2NhbGVTZXJ2aWNlLnlTY2FsZU1hcCxcbiAgICBdKS5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5jb25maWcpLFxuICAgICAgbWFwKChkYXRhOiBbW01hcDxudW1iZXIsIGFueT4sIE1hcDxudW1iZXIsIGFueT5dLCBJQ2hhcnRDb25maWddKSA9PiB7XG4gICAgICAgIGNvbnN0IFtbeCwgeV0sIGNvbmZpZ10gPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiBjb25maWcuYnJ1c2g/LnR5cGUgPT09IEJydXNoVHlwZS54ID8geC5nZXQoMCkgOiB5LmdldCgwKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMudmlzaWJsZVJlY3QgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc2l6ZSxcbiAgICAgIHRoaXMueEF4aXNNYXAsXG4gICAgICB0aGlzLnlBeGlzTWFwLFxuICAgICAgdGhpcy5fem9vbVNlcnZpY2Uuem9vbWVkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChcbiAgICAgICAgICBkYXRhOiBbRE9NUmVjdCwgTWFwPG51bWJlciwgYW55PiwgTWFwPG51bWJlciwgYW55PiwgSUNoYXJ0RXZlbnQ8QXhpcz5dXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtzaXplLCB4LCB5XSA9IGRhdGE7XG4gICAgICAgICAgY29uc3QgeUF4ZXNBcnJheSA9IFsuLi55LnZhbHVlcygpXTtcbiAgICAgICAgICBjb25zdCB4QXhlc0FycmF5ID0gWy4uLngudmFsdWVzKCldO1xuICAgICAgICAgIGNvbnN0IGxlZnQgPSB5QXhlc0FycmF5XG4gICAgICAgICAgICAuZmlsdGVyKChfKSA9PiBfLm9wdGlvbnMub3Bwb3NpdGUgIT09IHRydWUgJiYgXy5vcHRpb25zLnZpc2libGUpXG4gICAgICAgICAgICAucmVkdWNlKHRoaXMuc3VtU2l6ZSwgMCk7XG5cbiAgICAgICAgICBjb25zdCByaWdodCA9IHlBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHhBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAhPT0gdHJ1ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIGNvbnN0IHRvcCA9IHhBeGVzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy5vcHBvc2l0ZSAmJiBfLm9wdGlvbnMudmlzaWJsZSlcbiAgICAgICAgICAgIC5yZWR1Y2UodGhpcy5zdW1TaXplLCAwKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wLFxuICAgICAgICAgICAgd2lkdGg6IHNpemUud2lkdGggLSBsZWZ0IC0gcmlnaHQsXG4gICAgICAgICAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0IC0gdG9wIC0gYm90dG9tLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICB0YXAoKF8pID0+IHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCkpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudW5pcUlkID0gKERhdGUubm93KCkgKyBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNik7XG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXM6IFJlc2l6ZU9ic2VydmVyRW50cnlbXSkgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpIHx8ICFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N2Yy5zZXRTaXplKGVudHJpZXNbMF0uY29udGVudFJlY3QpO1xuICAgIH0pO1xuICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHt9XG5cbiAgcHJpdmF0ZSBzdW1TaXplID0gKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZTtcblxuICBnZXRUcmFuc2xhdGUoYXhpcz86IEF4aXMsIHNpemU/OiBET01SZWN0KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy54QXhpc01hcCwgdGhpcy55QXhpc01hcF0pLnBpcGUoXG4gICAgICBtYXAoKGRhdGE6IFtNYXA8bnVtYmVyLCBBeGlzPiwgTWFwPG51bWJlciwgQXhpcz5dKSA9PiB7XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IHhBeGVzQXJyYXkgPSBbLi4ueC52YWx1ZXMoKV07XG4gICAgICAgIGNvbnN0IHlBeGVzQXJyYXkgPSBbLi4ueS52YWx1ZXMoKV07XG5cbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVGaWx0ZXIgPSB0aGlzLmZpbHRlclBvc2l0aW9uTWFwLmdldCh0cnVlKTtcbiAgICAgICAgY29uc3Qgbm9uT3Bwb3NpdGVGaWx0ZXIgPSB0aGlzLmZpbHRlclBvc2l0aW9uTWFwLmdldChmYWxzZSk7XG5cbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPZmZzZXRZID0geUF4ZXNBcnJheS5maWx0ZXIob3Bwb3NpdGVGaWx0ZXIoYXhpcykpO1xuICAgICAgICBjb25zdCBub25PcHBvc2l0ZU9mZnNldFkgPSB5QXhlc0FycmF5LmZpbHRlcihub25PcHBvc2l0ZUZpbHRlcihheGlzKSk7XG5cbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPZmZzZXRYID0geEF4ZXNBcnJheS5maWx0ZXIob3Bwb3NpdGVGaWx0ZXIoYXhpcykpO1xuICAgICAgICBjb25zdCBub25PcHBvc2l0ZU9mZnNldFggPSB4QXhlc0FycmF5LmZpbHRlcihub25PcHBvc2l0ZUZpbHRlcihheGlzKSk7XG5cbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVUcmFuc2xhdGVZID0gb3Bwb3NpdGVPZmZzZXRZLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjdXJyKSA9PiBhY2MgKyBjdXJyLnNlbGZTaXplLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm9uT3BwaXN0ZVRyYW5zbGF0ZVkgPSBub25PcHBvc2l0ZU9mZnNldFkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cnIpID0+IGFjYyArIGN1cnIuc2VsZlNpemUsXG4gICAgICAgICAgMFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG9wcG9zaXRlVHJhbnNsYXRlWCA9IG9wcG9zaXRlT2Zmc2V0WC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZSxcbiAgICAgICAgICAwXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgbm9uT3BwaXN0ZVRyYW5zbGF0ZVggPSBub25PcHBvc2l0ZU9mZnNldFgucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGN1cnIpID0+IGFjYyArIGN1cnIuc2VsZlNpemUsXG4gICAgICAgICAgMFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGxlZnQgPSB5QXhlc0FycmF5XG4gICAgICAgICAgLmZpbHRlcigoXykgPT4gXy5vcHRpb25zLnZpc2libGUgJiYgXy5vcHRpb25zLm9wcG9zaXRlICE9PSB0cnVlKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci5zZWxmU2l6ZSwgMCk7XG5cbiAgICAgICAgY29uc3QgdG9wID0geEF4ZXNBcnJheVxuICAgICAgICAgIC5maWx0ZXIoKF8pID0+IF8ub3B0aW9ucy52aXNpYmxlICYmIF8ub3B0aW9ucy5vcHBvc2l0ZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAucmVkdWNlKChhY2MsIGN1cnIpID0+IGFjYyArIGN1cnIuc2VsZlNpemUsIDApO1xuXG4gICAgICAgIGlmIChheGlzLm9yaWVudGF0aW9uID09PSBBeGlzT3JpZW50YXRpb24ueCkge1xuICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7bGVmdH0sICR7XG4gICAgICAgICAgICBheGlzLm9wdGlvbnMub3Bwb3NpdGVcbiAgICAgICAgICAgICAgPyBvcHBvc2l0ZVRyYW5zbGF0ZVhcbiAgICAgICAgICAgICAgOiBzaXplLmhlaWdodCAtIG5vbk9wcGlzdGVUcmFuc2xhdGVYXG4gICAgICAgICAgfSlgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF4aXMub3JpZW50YXRpb24gPT09IEF4aXNPcmllbnRhdGlvbi55KSB7XG4gICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtcbiAgICAgICAgICAgIGF4aXMub3B0aW9ucy5vcHBvc2l0ZVxuICAgICAgICAgICAgICA/IHNpemUud2lkdGggLSBvcHBvc2l0ZVRyYW5zbGF0ZVlcbiAgICAgICAgICAgICAgOiBub25PcHBpc3RlVHJhbnNsYXRlWVxuICAgICAgICAgIH0sICR7dG9wfSlgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaWRlbnRpZnkoaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZS5pbmRleDtcbiAgfVxuXG4gIG1vdXNlTW92ZShldmVudCkge1xuICAgIHRoaXMuX3N2Yy5zZXRQb2ludGVyTW92ZShldmVudCk7XG4gIH1cblxuICBtb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgdGhpcy5fc3ZjLnNldFBvaW50ZXJNb3ZlKGV2ZW50KTtcbiAgfVxuXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudW5pcUlkO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwie1xuICBzaXplOiBzaXplIHwgYXN5bmMsXG4gIGNvbmZpZzogY29uZmlnIHwgYXN5bmMsXG4gIHhBeGlzTWFwOiB4QXhpc01hcCB8IGFzeW5jLFxuICB5QXhpc01hcDogeUF4aXNNYXAgfCBhc3luYyxcbiAgeFNjYWxlTWFwOiB4U2NhbGVNYXAgfCBhc3luYyxcbiAgeVNjYWxlTWFwOiB5U2NhbGVNYXAgfCBhc3luY1xufSBhcyBkYXRhXCI+XG5cbiAgPHRldGEtdG9vbHRpcCAqbmdJZj1cImRhdGEuY29uZmlnPy50b29sdGlwPy5lbmFibGVcIiBbc2l6ZV09XCJkYXRhLnNpemVcIiBbY29uZmlnXT1cImRhdGEuY29uZmlnXCI+PC90ZXRhLXRvb2x0aXA+XG4gIDxzdmcgaGVpZ2h0PVwiMTAwJVwiIHdpZHRoPVwiMTAwJVwiIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGVcIj5cbiAgICA8ZyBjbGFzcz1cInktYXhpcy1jb250YWluZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YS55QXhpc01hcCB8IGtleXZhbHVlOyB0cmFja0J5OiBpZGVudGlmeVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS52YWx1ZS5vcHRpb25zLnZpc2libGVcIj5cbiAgICAgICAgICA8Z1xuICAgICAgICAgICAgdGV0YS15LWF4aXNcbiAgICAgICAgICAgIFtheGlzXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgW3NjYWxlXT1cImRhdGEueVNjYWxlTWFwLmdldChpdGVtLmtleSlcIlxuICAgICAgICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJnZXRUcmFuc2xhdGUoaXRlbS52YWx1ZSwgZGF0YS5zaXplKSB8IGFzeW5jXCI+PC9nPlxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICB0ZXRhWm9vbWFibGVcbiAgICAgICAgICAgIGZpbGwtb3BhY2l0eT1cIjBcIlxuICAgICAgICAgICAgW2JydXNoU2NhbGVdPVwiYnJ1c2hTY2FsZSB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtheGlzXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWcgfCBhc3luY1wiXG4gICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgICAgW2F0dHIueF09XCJpdGVtLnZhbHVlLm9wdGlvbnMub3Bwb3NpdGUgPyAwIDogLWl0ZW0udmFsdWUuc2VsZlNpemVcIlxuICAgICAgICAgICAgW2F0dHIueV09XCIwXCJcbiAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJkYXRhLnNpemUuaGVpZ2h0XCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIml0ZW0udmFsdWUuc2VsZlNpemVcIlxuICAgICAgICAgICAgW2F0dHIudHJhbnNmb3JtXT1cImdldFRyYW5zbGF0ZShpdGVtLnZhbHVlLCBkYXRhLnNpemUpIHwgYXN5bmNcIj48L3JlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2c+XG4gICAgPGcgY2xhc3M9XCJ4LWF4aXMtY29udGFpbmVyXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGEueEF4aXNNYXAgfCBrZXl2YWx1ZTsgdHJhY2tCeTogaWRlbnRpZnlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udmFsdWUub3B0aW9ucy52aXNpYmxlXCI+XG4gICAgICAgICAgPGdcbiAgICAgICAgICAgIHRldGEteC1heGlzXG4gICAgICAgICAgICBbYXhpc109XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgIFtzY2FsZV09XCJkYXRhLnhTY2FsZU1hcC5nZXQoaXRlbS5rZXkpXCJcbiAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiZ2V0VHJhbnNsYXRlKGl0ZW0udmFsdWUsIGRhdGEuc2l6ZSkgfCBhc3luY1wiPjwvZz5cblxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICB0ZXRhWm9vbWFibGVcbiAgICAgICAgICAgIGZpbGwtb3BhY2l0eT1cIjBcIlxuICAgICAgICAgICAgW2JydXNoU2NhbGVdPVwiYnJ1c2hTY2FsZSB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtheGlzXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWcgfCBhc3luY1wiXG4gICAgICAgICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgICAgICAgW2F0dHIueF09XCIwXCJcbiAgICAgICAgICAgIFthdHRyLnldPVwiMFwiXG4gICAgICAgICAgICBbYXR0ci53aWR0aF09XCJkYXRhLnNpemUud2lkdGhcIlxuICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIml0ZW0udmFsdWUuc2VsZlNpemVcIlxuICAgICAgICAgICAgW2F0dHIudHJhbnNmb3JtXT1cImdldFRyYW5zbGF0ZShpdGVtLnZhbHVlLCBkYXRhLnNpemUpIHwgYXN5bmNcIj48L3JlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlzaWJsZVJlY3QgfCBhc3luYyBhcyByZWN0XCI+XG4gICAgPHN2Z1xuICAgICAgdGV0YUJydXNoYWJsZVxuICAgICAgdGV0YVpvb21hYmxlXG4gICAgICBbc2l6ZV09XCJkYXRhLnNpemVcIlxuICAgICAgW2JydXNoU2NhbGVdPVwiYnJ1c2hTY2FsZSB8IGFzeW5jXCJcbiAgICAgIFtjb25maWddPVwiY29uZmlnIHwgYXN5bmNcIlxuICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoJysgcmVjdC54ICsnLCAnKyByZWN0LnkgKycpJ1wiXG4gICAgICBbYXR0ci52aWV3Qm94XT1cIicwIDAgJyArIHJlY3Qud2lkdGggKyAnICcgKyByZWN0LmhlaWdodFwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZUxlYXZlKCRldmVudClcIlxuICAgICAgKG1vdXNlbW92ZSk9XCJtb3VzZU1vdmUoJGV2ZW50KVwiPlxuICAgICAgPGc+XG4gICAgICAgIDxnPlxuICAgICAgICAgIDxnIGNsYXNzPVwiZ3JpZGxpbmVzXCJcbiAgICAgICAgICAgICB0ZXRhLWdyaWRsaW5lc1xuICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICAgW3hTY2FsZU1hcF09XCJkYXRhLnhTY2FsZU1hcFwiXG4gICAgICAgICAgICAgW3lTY2FsZU1hcF09XCJkYXRhLnlTY2FsZU1hcFwiPjwvZz5cbiAgICAgICAgICA8ZyBjbGFzcz1cIngtYXhpcy1wbG90bGluZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGF4aXMgb2YgZGF0YS5jb25maWcueEF4aXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGcgdGV0YS1wbG90LWxpbmUgKm5nRm9yPVwibGV0IHBsb3RMaW5lIG9mIGF4aXMucGxvdExpbmVzXCJcbiAgICAgICAgICAgICAgICAgW3Bsb3RMaW5lXT1cInBsb3RMaW5lXCJcbiAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImRhdGEueFNjYWxlTWFwLmdldChpKVwiXG4gICAgICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICAgICAgIFtheGlzXT1cImRhdGEueEF4aXNNYXAuZ2V0KGkpXCI+PC9nPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9nPlxuICAgICAgICAgIDxnIGNsYXNzPVwieS1heGlzLXBsb3RsaW5lLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXhpcyBvZiBkYXRhLmNvbmZpZy55QXhpczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8ZyB0ZXRhLXBsb3QtbGluZSAqbmdGb3I9XCJsZXQgcGxvdExpbmUgb2YgYXhpcy5wbG90TGluZXNcIlxuICAgICAgICAgICAgICAgICBbcGxvdExpbmVdPVwicGxvdExpbmVcIlxuICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiZGF0YS55U2NhbGVNYXAuZ2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgICAgICAgICAgICAgW2F4aXNdPVwiZGF0YS55QXhpc01hcC5nZXQoaSlcIj48L2c+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2c+XG5cbiAgICAgICAgICA8ZyBjbGFzcz1cIngtYXhpcy1wbG90YmFuZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGF4aXMgb2YgZGF0YS5jb25maWcueEF4aXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGcgdGV0YS1wbG90LWJhbmQgKm5nRm9yPVwibGV0IHBsb3RCYW5kIG9mIGF4aXMucGxvdEJhbmRzXCJcbiAgICAgICAgICAgICAgICAgW3Bsb3RCYW5kXT1cInBsb3RCYW5kXCJcbiAgICAgICAgICAgICAgICAgW3NjYWxlXT1cImRhdGEueFNjYWxlTWFwLmdldChpKVwiXG4gICAgICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiXG4gICAgICAgICAgICAgICAgIFtheGlzXT1cImRhdGEueEF4aXNNYXAuZ2V0KGkpXCI+PC9nPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9nPlxuICAgICAgICAgIDxnIGNsYXNzPVwieS1heGlzLXBsb3RiYW5kLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXhpcyBvZiBkYXRhLmNvbmZpZy55QXhpczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8ZyB0ZXRhLXBsb3QtYmFuZCAqbmdGb3I9XCJsZXQgcGxvdEJhbmQgb2YgYXhpcy5wbG90QmFuZHNcIlxuICAgICAgICAgICAgICAgICBbcGxvdEJhbmRdPVwicGxvdEJhbmRcIlxuICAgICAgICAgICAgICAgICBbc2NhbGVdPVwiZGF0YS55U2NhbGVNYXAuZ2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgW3NpemVdPVwiZGF0YS5zaXplXCJcbiAgICAgICAgICAgICAgICAgW2F4aXNdPVwiZGF0YS55QXhpc01hcC5nZXQoaSlcIj48L2c+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2c+XG4gICAgICAgICAgPGcgY2xhc3M9XCJzZXJpZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZyB0ZXRhLXNlcmllcy1ob3N0XG4gICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VyaWVzIG9mIGRhdGEuY29uZmlnLnNlcmllc1wiXG4gICAgICAgICAgICAgICBbY29uZmlnXT1cImRhdGEuY29uZmlnXCJcbiAgICAgICAgICAgICAgIFtzZXJpZXNdPVwic2VyaWVzXCJcbiAgICAgICAgICAgICAgIFtzaXplXT1cImRhdGEuc2l6ZVwiPjwvZz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvZz5cbiAgICA8L3N2Zz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==