@ogidor/dashboard 1.0.2 → 1.0.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.
@@ -1,80 +1,48 @@
1
- import { OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';
2
- import { GridsterConfig } from 'angular-gridster2';
1
+ import { OnInit, OnDestroy, OnChanges, SimpleChanges, EventEmitter, TemplateRef } from '@angular/core';
3
2
  import { DashboardStateService } from './dashboard-state.service';
4
- import { Page, Widget, WidgetType, DashboardTheme, LineBarData, DonutData } from './models';
3
+ import { Page, Widget, DashboardTheme } from './models';
5
4
  import * as i0 from "@angular/core";
6
5
  export declare class DashboardComponent implements OnInit, OnDestroy, OnChanges {
7
- private stateService;
6
+ stateService: DashboardStateService;
8
7
  initialLayout?: string;
9
8
  theme?: DashboardTheme;
9
+ /**
10
+ * Emits when the user clicks "Add Widget".
11
+ * The consumer should open their own dialog and call `stateService.addWidget(...)`.
12
+ */
13
+ addWidgetRequested: EventEmitter<void>;
14
+ /**
15
+ * Emits the Widget when the user clicks the edit (pen) icon on a card.
16
+ * The consumer should open their own edit UI and call `stateService.updateWidget(...)`.
17
+ */
18
+ editWidgetRequested: EventEmitter<Widget>;
19
+ /**
20
+ * Optional: consumer can provide an `<ng-template widgetCell let-widget="widget">` child
21
+ * to render custom content inside every card body.
22
+ */
23
+ cellTemplate?: TemplateRef<{
24
+ widget: Widget;
25
+ }>;
10
26
  resolvedTheme: Required<DashboardTheme>;
11
27
  wrapperStyles: Record<string, string>;
12
- options: GridsterConfig;
13
28
  pages: Page[];
14
29
  activePageId: string;
15
30
  activePage?: Page;
16
- dialogOpen: boolean;
17
- dialogType: WidgetType;
18
- dialogTitle: string;
19
- dialogCategories: string;
20
- dialogSeries: {
21
- name: string;
22
- dataRaw: string;
23
- }[];
24
- dialogSlices: {
25
- label: string;
26
- value: number | null;
27
- }[];
28
- readonly widgetTypes: {
29
- value: WidgetType;
30
- label: string;
31
- icon: string;
32
- }[];
31
+ isPoppedOut: boolean;
33
32
  private subs;
34
33
  constructor(stateService: DashboardStateService);
35
34
  ngOnChanges(changes: SimpleChanges): void;
36
35
  ngOnInit(): void;
37
36
  ngOnDestroy(): void;
38
- private applyTheme;
39
- private updateActivePage;
37
+ onItemChanged(widget: Widget): void;
38
+ onRemoveWidget(widgetId: string): void;
40
39
  onSelectPage(id: string): void;
41
40
  onAddPage(): void;
42
41
  onRemovePage(event: Event, id: string): void;
43
- openDialog(): void;
44
- closeDialog(): void;
45
- addSeries(): void;
46
- removeSeries(i: number): void;
47
- addSlice(): void;
48
- removeSlice(i: number): void;
49
- confirmAddWidget(): void;
50
- editDialogOpen: boolean;
51
- editingWidget?: Widget;
52
- editWidgetType: WidgetType;
53
- editTitle: string;
54
- editCardColor: string;
55
- editColors: string[];
56
- editSeries: {
57
- name: string;
58
- dataRaw: string;
59
- }[];
60
- editCategories: string;
61
- editSlices: {
62
- label: string;
63
- value: number | null;
64
- }[];
65
- private readonly DEFAULT_COLORS;
66
- openEditDialog(widget: Widget): void;
67
- closeEditDialog(): void;
68
- getEditSeriesLabel(i: number): string;
69
- addEditSeries(): void;
70
- removeEditSeries(i: number): void;
71
- addEditSlice(): void;
72
- removeEditSlice(i: number): void;
73
- confirmEditWidget(): void;
74
- onAddWidget(type: WidgetType): void;
75
- updateWidgetData(widgetId: string, data: LineBarData | DonutData): void;
76
- removeWidgetHandler: (id: string) => void;
42
+ onPopOut(event: Event, pageId: string): void;
77
43
  serializeLayout(): string;
44
+ private applyTheme;
45
+ private updateActivePage;
78
46
  static ɵfac: i0.ɵɵFactoryDeclaration<DashboardComponent, never>;
79
- static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "app-dashboard", never, { "initialLayout": "initialLayout"; "theme": "theme"; }, {}, never, never, false, never>;
47
+ static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "app-dashboard", never, { "initialLayout": "initialLayout"; "theme": "theme"; }, { "addWidgetRequested": "addWidgetRequested"; "editWidgetRequested": "editWidgetRequested"; }, ["cellTemplate"], never, false, never>;
80
48
  }
package/app/models.d.ts CHANGED
@@ -1,41 +1,26 @@
1
- export type WidgetType = 'DONUT' | 'LINE' | 'BAR';
2
- /** A single named series for LINE and BAR charts */
3
- export interface ChartSeries {
4
- /** Label shown in the legend */
5
- name: string;
6
- /** Array of numeric data points */
7
- data: number[];
8
- /** Optional per-series x-axis category labels */
9
- categories?: string[];
10
- }
11
- /** Data shape for LINE and BAR widgets */
12
- export interface LineBarData {
13
- /** One or more data series */
14
- series: ChartSeries[];
15
- /** X-axis category labels shared across all series */
16
- categories?: string[];
17
- }
18
- /** Data shape for DONUT widgets */
19
- export interface DonutData {
20
- /** Numeric slice values — must match the length of `labels` */
21
- series: number[];
22
- /** Label for each slice */
23
- labels?: string[];
24
- }
1
+ /**
2
+ * A single widget on the grid.
3
+ * The lib is content-agnostic — `data` can hold anything the consumer needs.
4
+ */
25
5
  export interface Widget {
26
6
  id: string;
27
- type: WidgetType;
7
+ /** Grid column (0-based) */
28
8
  x: number;
9
+ /** Grid row (0-based) */
29
10
  y: number;
11
+ /** Number of columns this widget spans */
30
12
  cols: number;
13
+ /** Number of rows this widget spans */
31
14
  rows: number;
32
- /** Typed as LineBarData | DonutData depending on `type` */
33
- data: LineBarData | DonutData;
15
+ /** Display title shown in the card header */
34
16
  title: string;
35
- /** Optional per-widget series colors. Overrides the global theme chartColors. */
36
- colors?: string[];
37
17
  /** Optional per-widget card background color. Overrides the global theme widgetCardColor. */
38
18
  cardColor?: string;
19
+ /**
20
+ * Arbitrary consumer data.
21
+ * The lib stores and syncs this but never inspects it.
22
+ */
23
+ data?: any;
39
24
  }
40
25
  export interface Page {
41
26
  id: string;
@@ -57,17 +42,12 @@ export interface DashboardTheme {
57
42
  panelColor?: string;
58
43
  /** Background color of individual widget cards. Default: `#2c2c2e` */
59
44
  widgetCardColor?: string;
60
- /** Primary text / foreground color used inside charts. Default: `#8e8e93` */
61
- chartForeColor?: string;
62
- /** Primary accent color (active tabs, add-page button hover, etc.). Default: `#0a84ff` */
45
+ /** Primary foreground/text color. Default: `#8e8e93` */
46
+ foreColor?: string;
47
+ /** Primary accent color (active tabs, buttons, etc.). Default: `#0a84ff` */
63
48
  accentColor?: string;
64
- /** Danger/close color used on the remove-widget button hover. Default: `#ff453a` */
49
+ /** Danger color used on remove-widget button hover. Default: `#ff453a` */
65
50
  dangerColor?: string;
66
- /**
67
- * Array of colors fed to ApexCharts series.
68
- * Default: `['#0a84ff', '#30d158', '#ff9f0a', '#bf5af2', '#ff453a']`
69
- */
70
- chartColors?: string[];
71
51
  /** Font family applied to the whole dashboard. Default: system-ui stack */
72
52
  fontFamily?: string;
73
53
  }
@@ -1,40 +1,13 @@
1
- import { EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { Widget, DashboardTheme } from './models';
3
- import { DashboardStateService } from './dashboard-state.service';
4
- import { ApexAxisChartSeries, ApexChart, ApexXAxis, ApexDataLabels, ApexStroke, ApexYAxis, ApexTitleSubtitle, ApexLegend, ApexPlotOptions, ApexTooltip, ApexTheme } from 'ng-apexcharts';
5
3
  import * as i0 from "@angular/core";
6
- export type ChartOptions = {
7
- series: ApexAxisChartSeries | number[];
8
- chart: ApexChart;
9
- xaxis: ApexXAxis;
10
- stroke: ApexStroke;
11
- dataLabels: ApexDataLabels;
12
- yaxis: ApexYAxis;
13
- title: ApexTitleSubtitle;
14
- labels: string[];
15
- legend: ApexLegend;
16
- plotOptions: ApexPlotOptions;
17
- tooltip: ApexTooltip;
18
- theme: ApexTheme;
19
- colors: string[];
20
- };
21
- export declare class WidgetRendererComponent implements OnInit, OnChanges, OnDestroy {
22
- private stateService;
4
+ export declare class WidgetRendererComponent implements OnChanges {
23
5
  widget: Widget;
24
- onRemoveWidget: (id: string) => void;
25
6
  theme?: Required<DashboardTheme>;
26
7
  editRequested: EventEmitter<Widget>;
27
- chartOptions: Partial<ChartOptions>;
28
- cardStyles: Record<string, string>;
29
- private subs;
30
- constructor(stateService: DashboardStateService);
31
- ngOnInit(): void;
8
+ removeRequested: EventEmitter<string>;
9
+ cardBg: string;
32
10
  ngOnChanges(changes: SimpleChanges): void;
33
- ngOnDestroy(): void;
34
- private applyStyles;
35
- private resolvedColors;
36
- private initChart;
37
- onRemove(): void;
38
11
  static ɵfac: i0.ɵɵFactoryDeclaration<WidgetRendererComponent, never>;
39
- static ɵcmp: i0.ɵɵComponentDeclaration<WidgetRendererComponent, "app-widget-renderer", never, { "widget": "widget"; "onRemoveWidget": "onRemoveWidget"; "theme": "theme"; }, { "editRequested": "editRequested"; }, never, never, false, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<WidgetRendererComponent, "app-widget-renderer", never, { "widget": "widget"; "theme": "theme"; }, { "editRequested": "editRequested"; "removeRequested": "removeRequested"; }, never, ["*"], false, never>;
40
13
  }
@@ -1,65 +1,57 @@
1
- import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
1
+ import { NgModule } from '@angular/core';
2
2
  import { BrowserModule } from '@angular/platform-browser';
3
3
  import { CommonModule } from '@angular/common';
4
- import { FormsModule } from '@angular/forms';
5
- import { GridsterModule } from 'angular-gridster2';
6
- import { NgApexchartsModule } from 'ng-apexcharts';
7
4
  import { DashboardComponent } from './dashboard.component';
8
5
  import { WidgetRendererComponent } from './widget-renderer.component';
6
+ import { CustomGridComponent, GridCellDirective } from './custom-grid.component';
9
7
  import { DashboardStateService } from './dashboard-state.service';
10
8
  import * as i0 from "@angular/core";
11
9
  export class DashboardModule {
12
10
  }
13
11
  DashboardModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
14
12
  DashboardModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, declarations: [DashboardComponent,
15
- WidgetRendererComponent], imports: [CommonModule,
16
- FormsModule,
17
- GridsterModule,
18
- NgApexchartsModule], exports: [DashboardComponent,
19
- WidgetRendererComponent] });
20
- DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [DashboardStateService], imports: [CommonModule,
21
- FormsModule,
22
- GridsterModule,
23
- NgApexchartsModule] });
13
+ WidgetRendererComponent,
14
+ CustomGridComponent,
15
+ GridCellDirective], imports: [CommonModule], exports: [DashboardComponent,
16
+ WidgetRendererComponent,
17
+ CustomGridComponent,
18
+ GridCellDirective] });
19
+ DashboardModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, providers: [DashboardStateService], imports: [CommonModule] });
24
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardModule, decorators: [{
25
21
  type: NgModule,
26
22
  args: [{
27
23
  declarations: [
28
24
  DashboardComponent,
29
- WidgetRendererComponent
25
+ WidgetRendererComponent,
26
+ CustomGridComponent,
27
+ GridCellDirective,
30
28
  ],
31
29
  imports: [
32
30
  CommonModule,
33
- FormsModule,
34
- GridsterModule,
35
- NgApexchartsModule
36
31
  ],
37
32
  providers: [DashboardStateService],
38
33
  exports: [
39
34
  DashboardComponent,
40
- WidgetRendererComponent
35
+ WidgetRendererComponent,
36
+ CustomGridComponent,
37
+ GridCellDirective,
41
38
  ],
42
- schemas: [NO_ERRORS_SCHEMA]
43
39
  }]
44
40
  }] });
45
41
  /**
46
- * Root module for local demo / testing purposes.
47
- * In the final NPM package, users would only import the `DashboardModule`.
42
+ * Root module for local demo / testing purposes only.
43
+ * Library consumers import DashboardModule, not AppModule.
48
44
  */
49
45
  export class AppModule {
50
46
  }
51
47
  AppModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
52
48
  AppModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: AppModule, bootstrap: [DashboardComponent], imports: [BrowserModule, DashboardModule] });
53
- AppModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppModule, imports: [BrowserModule,
54
- DashboardModule] });
49
+ AppModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppModule, imports: [BrowserModule, DashboardModule] });
55
50
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppModule, decorators: [{
56
51
  type: NgModule,
57
52
  args: [{
58
- imports: [
59
- BrowserModule,
60
- DashboardModule
61
- ],
62
- bootstrap: [DashboardComponent]
53
+ imports: [BrowserModule, DashboardModule],
54
+ bootstrap: [DashboardComponent],
63
55
  }]
64
56
  }] });
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBb0JsRSxNQUFNLE9BQU8sZUFBZTs7NkdBQWYsZUFBZTs4R0FBZixlQUFlLGlCQWhCeEIsa0JBQWtCO1FBQ2xCLHVCQUF1QixhQUd2QixZQUFZO1FBQ1osV0FBVztRQUNYLGNBQWM7UUFDZCxrQkFBa0IsYUFJbEIsa0JBQWtCO1FBQ2xCLHVCQUF1Qjs4R0FJZCxlQUFlLGFBUGYsQ0FBQyxxQkFBcUIsQ0FBQyxZQUxoQyxZQUFZO1FBQ1osV0FBVztRQUNYLGNBQWM7UUFDZCxrQkFBa0I7NEZBU1QsZUFBZTtrQkFsQjNCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNuQjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDNUI7O0FBR0Q7OztHQUdHO0FBUUgsTUFBTSxPQUFPLFNBQVM7O3VHQUFULFNBQVM7d0dBQVQsU0FBUyxjQUZSLGtCQUFrQixhQUg1QixhQUFhLEVBUkosZUFBZTt3R0FhZixTQUFTLFlBTGxCLGFBQWE7UUFDYixlQUFlOzRGQUlOLFNBQVM7a0JBUHJCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLGFBQWE7d0JBQ2IsZUFBZTtxQkFDaEI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE5PX0VSUk9SU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdyaWRzdGVyTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1ncmlkc3RlcjInO1xuaW1wb3J0IHsgTmdBcGV4Y2hhcnRzTW9kdWxlIH0gZnJvbSAnbmctYXBleGNoYXJ0cyc7XG5cbmltcG9ydCB7IERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4vZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2Rhc2hib2FyZC1zdGF0ZS5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRGFzaGJvYXJkQ29tcG9uZW50LFxuICAgIFdpZGdldFJlbmRlcmVyQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgR3JpZHN0ZXJNb2R1bGUsXG4gICAgTmdBcGV4Y2hhcnRzTW9kdWxlXG4gIF0sXG4gIHByb3ZpZGVyczogW0Rhc2hib2FyZFN0YXRlU2VydmljZV0sXG4gIGV4cG9ydHM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnRcbiAgXSxcbiAgc2NoZW1hczogW05PX0VSUk9SU19TQ0hFTUFdXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZE1vZHVsZSB7IH1cblxuLyoqXG4gKiBSb290IG1vZHVsZSBmb3IgbG9jYWwgZGVtbyAvIHRlc3RpbmcgcHVycG9zZXMuXG4gKiBJbiB0aGUgZmluYWwgTlBNIHBhY2thZ2UsIHVzZXJzIHdvdWxkIG9ubHkgaW1wb3J0IHRoZSBgRGFzaGJvYXJkTW9kdWxlYC5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIEJyb3dzZXJNb2R1bGUsXG4gICAgRGFzaGJvYXJkTW9kdWxlXG4gIF0sXG4gIGJvb3RzdHJhcDogW0Rhc2hib2FyZENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQXBwTW9kdWxlIHsgfVxuIl19
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvYXBwLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBb0JsRSxNQUFNLE9BQU8sZUFBZTs7NkdBQWYsZUFBZTs4R0FBZixlQUFlLGlCQWhCeEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsaUJBQWlCLGFBR2pCLFlBQVksYUFJWixrQkFBa0I7UUFDbEIsdUJBQXVCO1FBQ3ZCLG1CQUFtQjtRQUNuQixpQkFBaUI7OEdBR1IsZUFBZSxhQVJmLENBQUMscUJBQXFCLENBQUMsWUFGaEMsWUFBWTs0RkFVSCxlQUFlO2tCQWxCM0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTtxQkFDYjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDbEMsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7aUJBQ0Y7O0FBR0Q7OztHQUdHO0FBS0gsTUFBTSxPQUFPLFNBQVM7O3VHQUFULFNBQVM7d0dBQVQsU0FBUyxjQUZSLGtCQUFrQixhQURwQixhQUFhLEVBUFosZUFBZTt3R0FVZixTQUFTLFlBSFYsYUFBYSxFQUFFLGVBQWU7NEZBRzdCLFNBQVM7a0JBSnJCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztvQkFDekMsU0FBUyxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4vZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21HcmlkQ29tcG9uZW50LCBHcmlkQ2VsbERpcmVjdGl2ZSB9IGZyb20gJy4vY3VzdG9tLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IERhc2hib2FyZFN0YXRlU2VydmljZSB9IGZyb20gJy4vZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBEYXNoYm9hcmRDb21wb25lbnQsXG4gICAgV2lkZ2V0UmVuZGVyZXJDb21wb25lbnQsXG4gICAgQ3VzdG9tR3JpZENvbXBvbmVudCxcbiAgICBHcmlkQ2VsbERpcmVjdGl2ZSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbRGFzaGJvYXJkU3RhdGVTZXJ2aWNlXSxcbiAgZXhwb3J0czogW1xuICAgIERhc2hib2FyZENvbXBvbmVudCxcbiAgICBXaWRnZXRSZW5kZXJlckNvbXBvbmVudCxcbiAgICBDdXN0b21HcmlkQ29tcG9uZW50LFxuICAgIEdyaWRDZWxsRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRNb2R1bGUge31cblxuLyoqXG4gKiBSb290IG1vZHVsZSBmb3IgbG9jYWwgZGVtbyAvIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAqIExpYnJhcnkgY29uc3VtZXJzIGltcG9ydCBEYXNoYm9hcmRNb2R1bGUsIG5vdCBBcHBNb2R1bGUuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlLCBEYXNoYm9hcmRNb2R1bGVdLFxuICBib290c3RyYXA6IFtEYXNoYm9hcmRDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiJdfQ==