ngx-material-entity 18.0.0 → 18.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/components/custom-table/custom-table-configuration.model.d.ts +65 -0
  2. package/components/custom-table/custom-table.component.d.ts +111 -0
  3. package/components/edit-page/edit-page.component.d.ts +5 -1
  4. package/components/input/array/array-date-input/array-date-input.component.d.ts +2 -2
  5. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +3 -3
  6. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +3 -3
  7. package/components/input/array/array-table.class.d.ts +25 -19
  8. package/components/input/input.component.d.ts +99 -80
  9. package/components/input/relations/references-many-input/references-many-input.component.d.ts +12 -17
  10. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +5 -5
  11. package/components/table/table-data.d.ts +9 -4
  12. package/components/table/table.component.d.ts +15 -37
  13. package/decorators/array/array-decorator-internal.data.d.ts +5 -1
  14. package/decorators/array/array-decorator.data.d.ts +38 -82
  15. package/decorators/references-many/references-many-decorator-internal.data.d.ts +3 -1
  16. package/decorators/references-many/references-many-decorator.data.d.ts +13 -1
  17. package/directives/dynamic-style-class.directive.d.ts +4 -5
  18. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +5 -6
  19. package/esm2022/components/create-page/create-page.component.mjs +6 -7
  20. package/esm2022/components/custom-table/custom-table-configuration.model.mjs +37 -0
  21. package/esm2022/components/custom-table/custom-table.component.mjs +213 -0
  22. package/esm2022/components/edit-page/edit-page.component.mjs +19 -9
  23. package/esm2022/components/form/form.component.mjs +5 -6
  24. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +16 -20
  25. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +27 -26
  26. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +17 -21
  27. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +4 -4
  28. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +4 -4
  29. package/esm2022/components/input/array/array-table.class.mjs +51 -43
  30. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +5 -6
  31. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +4 -4
  32. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +4 -7
  33. package/esm2022/components/input/file/file-input/file-input.component.mjs +4 -5
  34. package/esm2022/components/input/input.component.mjs +143 -106
  35. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +4 -5
  36. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +40 -55
  37. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +4 -5
  38. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +4 -5
  39. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
  40. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +9 -8
  41. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +22 -14
  42. package/esm2022/components/table/table-data.mjs +1 -1
  43. package/esm2022/components/table/table.component.mjs +40 -107
  44. package/esm2022/components/tooltip/tooltip.component.mjs +3 -3
  45. package/esm2022/decorators/array/array-decorator-internal.data.mjs +14 -1
  46. package/esm2022/decorators/array/array-decorator.data.mjs +33 -2
  47. package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +1 -1
  48. package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +8 -1
  49. package/esm2022/decorators/references-many/references-many-decorator.data.mjs +1 -1
  50. package/esm2022/directives/dynamic-style-class.directive.mjs +5 -5
  51. package/esm2022/directives/tooltip.directive.mjs +4 -1
  52. package/esm2022/functions/get-changes-tooltip-content.function.mjs +23 -0
  53. package/esm2022/functions/get-validation-errors-tooltip-content.function.mjs +23 -0
  54. package/esm2022/functions/table-column-value-to-sort-value.function.mjs +29 -0
  55. package/esm2022/public-api.mjs +3 -2
  56. package/esm2022/utilities/date.utilities.mjs +7 -6
  57. package/esm2022/utilities/entity.utilities.mjs +23 -7
  58. package/esm2022/utilities/validation.utilities.mjs +2 -2
  59. package/fesm2022/ngx-material-entity.mjs +2550 -2224
  60. package/fesm2022/ngx-material-entity.mjs.map +1 -1
  61. package/functions/get-changes-tooltip-content.function.d.ts +13 -0
  62. package/functions/table-column-value-to-sort-value.function.d.ts +9 -0
  63. package/package.json +1 -1
  64. package/public-api.d.ts +2 -1
  65. package/utilities/entity.utilities.d.ts +7 -3
  66. package/esm2022/functions/get-validation-errors-tooltip-content.function.ts.mjs +0 -23
  67. /package/functions/{get-validation-errors-tooltip-content.function.ts.d.ts → get-validation-errors-tooltip-content.function.d.ts} +0 -0
@@ -7,7 +7,7 @@ import { EditEntityDataInternal } from './edit-entity.builder';
7
7
  import { BaseEntityType } from '../../../classes/entity.model';
8
8
  import { NgxGlobalDefaultValues } from '../../../global-configuration-values';
9
9
  import { EntityService } from '../../../services/entity.service';
10
- import { EntityTab, EntityUtilities } from '../../../utilities/entity.utilities';
10
+ import { Difference, EntityUtilities } from '../../../utilities/entity.utilities';
11
11
  import { ValidationError } from '../../../utilities/validation.utilities';
12
12
  import * as i0 from "@angular/core";
13
13
  /**
@@ -31,10 +31,6 @@ export declare class NgxMatEntityEditDialogComponent<EntityType extends BaseEnti
31
31
  * Contains HelperMethods around handling Entities and their property-metadata.
32
32
  */
33
33
  EntityUtilities: typeof EntityUtilities;
34
- /**
35
- * The tabs of the dialog.
36
- */
37
- entityTabs: EntityTab<EntityType>[];
38
34
  /**
39
35
  * The service of the provided entity.
40
36
  */
@@ -59,6 +55,10 @@ export declare class NgxMatEntityEditDialogComponent<EntityType extends BaseEnti
59
55
  * The validation errors of the entity.
60
56
  */
61
57
  validationErrors: ValidationError[];
58
+ /**
59
+ * All the changes that have been done to the entity.
60
+ */
61
+ changes: Difference<EntityType>[];
62
62
  /**
63
63
  * What to display inside the tooltip.
64
64
  */
@@ -2,10 +2,14 @@ import { Type } from '@angular/core';
2
2
  import { NgxMatEntityBaseDisplayColumnValueComponent } from './display-column-value/base-display-column-value.component';
3
3
  import { BaseEntityType, EntityClassNewable, EntityServiceClassNewable } from '../../classes/entity.model';
4
4
  import { ConfirmDialogData } from '../confirm-dialog/confirm-dialog-data';
5
+ /**
6
+ * The value that can be displayed inside a table column.
7
+ */
8
+ export type TableColumnValue = string | number | Date;
5
9
  /**
6
10
  * The Definition of a Column inside the table.
7
11
  */
8
- export interface DisplayColumn<EntityType extends BaseEntityType<EntityType>> {
12
+ export interface DisplayColumn<T> {
9
13
  /**
10
14
  * The name inside the header.
11
15
  */
@@ -13,12 +17,12 @@ export interface DisplayColumn<EntityType extends BaseEntityType<EntityType>> {
13
17
  /**
14
18
  * What to display inside the row.
15
19
  */
16
- value: (entity: EntityType) => string;
20
+ value: (value: T) => TableColumnValue;
17
21
  /**
18
22
  * A custom component to use instead of the value.
19
23
  * You still need to provide a value function for the sorting by header to work.
20
24
  */
21
- Component?: Type<NgxMatEntityBaseDisplayColumnValueComponent<EntityType>>;
25
+ Component?: Type<NgxMatEntityBaseDisplayColumnValueComponent<T>>;
22
26
  /**
23
27
  * Whether or not the click event should be disabled.
24
28
  * This can be useful if your component has a custom way to handle clicks.
@@ -28,7 +32,7 @@ export interface DisplayColumn<EntityType extends BaseEntityType<EntityType>> {
28
32
  /**
29
33
  * Dynamic css class that should be applied based on a condition.
30
34
  */
31
- export type DynamicStyleClasses<EntityType extends BaseEntityType<EntityType>> = (entity: EntityType) => string[];
35
+ export type DynamicStyleClasses<T> = (value: T) => string[];
32
36
  /**
33
37
  * A table action that will run regardless if something has been selected in the table.
34
38
  */
@@ -197,6 +201,7 @@ export interface BaseData<EntityType extends BaseEntityType<EntityType>> {
197
201
  * Configuration for css classes that should be applied to table rows based on a condition.
198
202
  * This could be used to eg. Set the background color to green when an item has the status completed etc.
199
203
  * INFO: You need to use ng-deep or apply the styling in the styles.scss.
204
+ * @default () => []
200
205
  */
201
206
  dynamicRowStyleClasses?: DynamicStyleClasses<EntityType>;
202
207
  }
@@ -1,15 +1,11 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
1
  import { EnvironmentInjector, EventEmitter, OnInit } from '@angular/core';
3
2
  import { MatDialog } from '@angular/material/dialog';
4
- import { MatPaginator } from '@angular/material/paginator';
5
- import { MatSort } from '@angular/material/sort';
6
- import { MatTableDataSource } from '@angular/material/table';
7
3
  import { Router } from '@angular/router';
8
4
  import { DisplayColumn, TableData } from './table-data';
9
5
  import { BaseTableActionInternal, TableActionInternal, TableDataInternal } from './table-data.builder';
10
6
  import { BaseEntityType, Entity } from '../../classes/entity.model';
11
7
  import { NgxGlobalDefaultValues } from '../../global-configuration-values';
12
- import { SelectionUtilities } from '../../utilities/selection.utilities';
8
+ import { CustomTableConfiguration } from '../custom-table/custom-table-configuration.model';
13
9
  import * as i0 from "@angular/core";
14
10
  /**
15
11
  * Generates a fully functional table for displaying, creating, updating and deleting entities
@@ -35,42 +31,30 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
35
31
  */
36
32
  data: TableDataInternal<EntityType>;
37
33
  /**
38
- * Whether or not the table content is currently loading.
39
- */
40
- isLoading: boolean;
41
- /**
42
- * Whether or not the current user is allowed to create entries for the table.
43
- */
44
- allowCreate: boolean;
45
- private entityService;
46
- /**
47
- * The paginator from the html.
34
+ * Configuration for the table.
48
35
  */
49
- paginator: MatPaginator;
36
+ tableConfig: CustomTableConfiguration<EntityType>;
50
37
  /**
51
- * The sort from the html.
38
+ * The entities to display inside the table.
52
39
  */
53
- sort: MatSort;
40
+ entities: EntityType[];
54
41
  /**
55
- * The filter (search) from the html.
42
+ * A search string for filtering table results.
56
43
  */
57
- filter: string;
44
+ searchString: string;
58
45
  /**
59
- * The columns of the table.
46
+ * The currently selected entities.
60
47
  */
61
- displayedColumns: string[];
48
+ selected: EntityType[];
62
49
  /**
63
- * The table dataSource.
64
- */
65
- dataSource: MatTableDataSource<EntityType>;
66
- /**
67
- * The selection of the table.
50
+ * Whether or not the table content is currently loading.
68
51
  */
69
- selection: SelectionModel<EntityType>;
52
+ isLoading: boolean;
70
53
  /**
71
- * Provides functionality around material selections inside of tables.
54
+ * Whether or not the current user is allowed to create entries for the table.
72
55
  */
73
- SelectionUtilities: typeof SelectionUtilities;
56
+ allowCreate: boolean;
57
+ private entityService;
74
58
  /**
75
59
  * The internal BaseTableAction. Sets default values.
76
60
  */
@@ -93,10 +77,9 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
93
77
  /**
94
78
  * Edits an entity. This either calls the edit-Method provided by the user or uses a default edit-dialog.
95
79
  * @param entity - The entity that should be updated.
96
- * @param dCol - The display column. Is needed if a custom component was used that handles the click event differently.
97
80
  * @throws When no EntityClass was provided, as a new call is needed to initialize metadata.
98
81
  */
99
- editEntity(entity: EntityType, dCol: DisplayColumn<EntityType>): void;
82
+ editEntity(entity: EntityType): void;
100
83
  /**
101
84
  * Whether updating the provided entity is allowed.
102
85
  * @param entity - The entity that the user wants to edit.
@@ -131,11 +114,6 @@ export declare class NgxMatEntityTableComponent<EntityType extends BaseEntityTyp
131
114
  * @returns Whether or not the Action can be used.
132
115
  */
133
116
  tableActionDisabled(action: TableActionInternal<EntityType>): boolean;
134
- /**
135
- * Applies the search input to filter the table entries.
136
- * @param event - The keyup-event which contains the search-string of the user.
137
- */
138
- applyFilter(event: Event): void;
139
117
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatEntityTableComponent<any>, never>;
140
118
  static ɵcmp: i0.ɵɵComponentDeclaration<NgxMatEntityTableComponent<any>, "ngx-mat-entity-table", never, { "tableData": { "alias": "tableData"; "required": true; }; }, { "unsavedDialogChanges": "unsavedDialogChanges"; }, never, never, true, never>;
141
119
  }
@@ -2,7 +2,7 @@ import { DateFilterFn } from '@angular/material/datepicker';
2
2
  import { AutocompleteStringChipsArrayDecoratorConfig, DateArrayDecoratorConfig, DateRangeArrayDecoratorConfig, DateTimeArrayDecoratorConfig, EditArrayItemDialogData, EntityArrayDecoratorConfig, StringChipsArrayDecoratorConfig } from './array-decorator.data';
3
3
  import { BaseEntityType, EntityClassNewable } from '../../classes/entity.model';
4
4
  import { ConfirmDialogData } from '../../components/confirm-dialog/confirm-dialog-data';
5
- import { CreateData, DisplayColumn } from '../../components/table/table-data';
5
+ import { CreateData, DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
6
6
  import { NgxGlobalDefaultValues } from '../../global-configuration-values';
7
7
  import { Time } from '../../utilities/date.utilities';
8
8
  import { DecoratorTypes } from '../base/decorator-types.enum';
@@ -28,6 +28,7 @@ export declare class EntityArrayDecoratorConfigInternal<EntityType extends BaseE
28
28
  duplicatesErrorDialog: ConfirmDialogData;
29
29
  EntityClass: EntityClassNewable<EntityType>;
30
30
  displayColumns: DisplayColumn<EntityType>[];
31
+ dynamicRowStyleClasses: DynamicStyleClasses<EntityType>;
31
32
  createDialogData?: CreateData;
32
33
  editDialogData: EditArrayItemDialogDataInternal<EntityType>;
33
34
  createInline: boolean;
@@ -47,6 +48,7 @@ export declare class DateArrayDecoratorConfigInternal extends PropertyDecoratorC
47
48
  addButtonLabel: string;
48
49
  removeButtonLabel: string;
49
50
  missingErrorMessage: string;
51
+ dynamicRowStyleClasses: DynamicStyleClasses<Date>;
50
52
  min?: (date?: Date) => Date;
51
53
  max?: (date?: Date) => Date;
52
54
  filter?: DateFilterFn<Date | null | undefined>;
@@ -65,6 +67,7 @@ export declare class DateTimeArrayDecoratorConfigInternal extends PropertyDecora
65
67
  missingErrorMessage: string;
66
68
  times: DropdownValue<Time>[];
67
69
  timeDisplayName: string;
70
+ dynamicRowStyleClasses: DynamicStyleClasses<Date>;
68
71
  minDate?: (date?: Date) => Date;
69
72
  maxDate?: (date?: Date) => Date;
70
73
  filterDate?: DateFilterFn<Date | null | undefined>;
@@ -86,6 +89,7 @@ export declare class DateRangeArrayDecoratorConfigInternal extends PropertyDecor
86
89
  missingErrorMessage: string;
87
90
  placeholderStart: string;
88
91
  placeholderEnd: string;
92
+ dynamicRowStyleClasses: DynamicStyleClasses<DateRange>;
89
93
  minStart?: (date?: Date) => Date;
90
94
  maxStart?: (date?: Date) => Date;
91
95
  minEnd?: (date?: Date) => Date;
@@ -1,7 +1,7 @@
1
1
  import { DateFilterFn } from '@angular/material/datepicker';
2
2
  import { BaseEntityType, EntityClassNewable } from '../../classes/entity.model';
3
3
  import { ConfirmDialogData } from '../../components/confirm-dialog/confirm-dialog-data';
4
- import { CreateData, DisplayColumn } from '../../components/table/table-data';
4
+ import { CreateData, DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
5
5
  import { Time } from '../../utilities/date.utilities';
6
6
  import { DecoratorTypes } from '../base/decorator-types.enum';
7
7
  import { DropdownValue } from '../base/dropdown-value.interface';
@@ -9,7 +9,7 @@ import { PropertyDecoratorConfig } from '../base/property-decorator.data';
9
9
  import { DateRange } from '../date/date-decorator.data';
10
10
  import { StringAutocompleteValues } from '../string/string-decorator.data';
11
11
  /**
12
- * Interface definition for the @array metadata.
12
+ * Base definition for the @array metadata.
13
13
  */
14
14
  export declare abstract class ArrayDecoratorConfig<ValueType> extends PropertyDecoratorConfig<ValueType> {
15
15
  /**
@@ -26,6 +26,37 @@ export declare abstract class ArrayDecoratorConfig<ValueType> extends PropertyDe
26
26
  */
27
27
  duplicatesErrorDialog?: ConfirmDialogData;
28
28
  }
29
+ /**
30
+ * Base definition for the @array table metadata.
31
+ */
32
+ declare abstract class ArrayTableDecoratorConfig<ValueType> extends ArrayDecoratorConfig<ValueType[]> {
33
+ /**
34
+ * The definition of the columns to display. Consists of the displayName to show in the header of the row
35
+ * and the value, which is a function that generates the value to display inside a column.
36
+ */
37
+ displayColumns: DisplayColumn<ValueType>[];
38
+ /**
39
+ * Configuration for css classes that should be applied to table rows based on a condition.
40
+ * This could be used to eg. Set the background color to green when an item has the status completed etc.
41
+ * INFO: You need to use ng-deep or apply the styling in the styles.scss.
42
+ * @default () => []
43
+ */
44
+ dynamicRowStyleClasses?: DynamicStyleClasses<ValueType>;
45
+ /**
46
+ * The error-message to display when the array is required but contains no values.
47
+ */
48
+ missingErrorMessage?: string;
49
+ /**
50
+ * The label for the add button.
51
+ * @default 'Add'
52
+ */
53
+ addButtonLabel?: string;
54
+ /**
55
+ * The label for the remove button.
56
+ * @default 'Remove'
57
+ */
58
+ removeButtonLabel?: string;
59
+ }
29
60
  /**
30
61
  * The dialog data for the entities array edit dialog.
31
62
  */
@@ -46,17 +77,12 @@ export interface EditArrayItemDialogData<EntityType extends BaseEntityType<Entit
46
77
  /**
47
78
  * Definition for an array of Entities.
48
79
  */
49
- export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<EntityType>> extends ArrayDecoratorConfig<EntityType[]> {
80
+ export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<EntityType>> extends ArrayTableDecoratorConfig<EntityType> {
50
81
  itemType: DecoratorTypes.OBJECT;
51
82
  /**
52
83
  * The EntityClass used for generating the create inputs.
53
84
  */
54
85
  EntityClass: EntityClassNewable<EntityType>;
55
- /**
56
- * The definition of the columns to display. Consists of the displayName to show in the header of the row
57
- * and the value, which is a function that generates the value to display inside a column.
58
- */
59
- displayColumns: DisplayColumn<EntityType>[];
60
86
  /**
61
87
  * The data for the add-item-dialog.
62
88
  * Can be omitted when adding items inline.
@@ -73,45 +99,12 @@ export interface EntityArrayDecoratorConfig<EntityType extends BaseEntityType<En
73
99
  * @default true
74
100
  */
75
101
  createInline?: boolean;
76
- /**
77
- * The label for the add button when createInline is true.
78
- * @default 'Add'
79
- */
80
- addButtonLabel?: string;
81
- /**
82
- * The label for the remove button when createInline is true.
83
- * @default 'Remove'
84
- */
85
- removeButtonLabel?: string;
86
- /**
87
- * The error-message to display when the array is required but contains no values.
88
- */
89
- missingErrorMessage?: string;
90
102
  }
91
103
  /**
92
104
  * Definition for an array of Dates.
93
105
  */
94
- export interface DateArrayDecoratorConfig extends ArrayDecoratorConfig<Date[]> {
106
+ export interface DateArrayDecoratorConfig extends ArrayTableDecoratorConfig<Date> {
95
107
  itemType: DecoratorTypes.DATE;
96
- /**
97
- * The definition of the columns to display. Consists of the displayName to show in the header of the row
98
- * and the value, which is a function that generates the value to display inside a column.
99
- */
100
- displayColumns: DisplayColumn<Date>[];
101
- /**
102
- * The label for the add button.
103
- * @default 'Add'
104
- */
105
- addButtonLabel?: string;
106
- /**
107
- * The label for the remove button.
108
- * @default 'Remove'
109
- */
110
- removeButtonLabel?: string;
111
- /**
112
- * The error-message to display when the array is required but contains no values.
113
- */
114
- missingErrorMessage?: string;
115
108
  /**
116
109
  * A function to get the minimum value of the date.
117
110
  */
@@ -128,27 +121,8 @@ export interface DateArrayDecoratorConfig extends ArrayDecoratorConfig<Date[]> {
128
121
  /**
129
122
  * Definition for an array of DateTimes.
130
123
  */
131
- export interface DateTimeArrayDecoratorConfig extends ArrayDecoratorConfig<Date[]> {
124
+ export interface DateTimeArrayDecoratorConfig extends ArrayTableDecoratorConfig<Date> {
132
125
  itemType: DecoratorTypes.DATE_TIME;
133
- /**
134
- * The definition of the columns to display. Consists of the displayName to show in the header of the row
135
- * and the value, which is a function that generates the value to display inside a column.
136
- */
137
- displayColumns: DisplayColumn<Date>[];
138
- /**
139
- * The label for the add button.
140
- * @default 'Add'
141
- */
142
- addButtonLabel?: string;
143
- /**
144
- * The label for the remove button.
145
- * @default 'Remove'
146
- */
147
- removeButtonLabel?: string;
148
- /**
149
- * The error-message to display when the array is required but contains no values.
150
- */
151
- missingErrorMessage?: string;
152
126
  /**
153
127
  * The selectable times.
154
128
  */
@@ -186,27 +160,8 @@ export interface DateTimeArrayDecoratorConfig extends ArrayDecoratorConfig<Date[
186
160
  /**
187
161
  * Definition for an array of DateRanges.
188
162
  */
189
- export interface DateRangeArrayDecoratorConfig extends ArrayDecoratorConfig<DateRange[]> {
163
+ export interface DateRangeArrayDecoratorConfig extends ArrayTableDecoratorConfig<DateRange> {
190
164
  itemType: DecoratorTypes.DATE_RANGE;
191
- /**
192
- * The definition of the columns to display. Consists of the displayName to show in the header of the row
193
- * and the value, which is a function that generates the value to display inside a column.
194
- */
195
- displayColumns: DisplayColumn<DateRange>[];
196
- /**
197
- * The label for the add button.
198
- * @default 'Add'
199
- */
200
- addButtonLabel?: string;
201
- /**
202
- * The label for the remove button.
203
- * @default 'Remove'
204
- */
205
- removeButtonLabel?: string;
206
- /**
207
- * The error-message to display when the array is required but contains no values.
208
- */
209
- missingErrorMessage?: string;
210
165
  /**
211
166
  * A function to get the minimum value of the start date.
212
167
  */
@@ -293,3 +248,4 @@ export interface AutocompleteStringChipsArrayDecoratorConfig extends ArrayDecora
293
248
  */
294
249
  restrictToOptions?: boolean;
295
250
  }
251
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { ReferencesManyDecoratorConfig } from './references-many-decorator.data';
2
2
  import { BaseEntityType } from '../../classes/entity.model';
3
- import { DisplayColumn } from '../../components/table/table-data';
3
+ import { DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
4
4
  import { NgxGlobalDefaultValues } from '../../global-configuration-values';
5
5
  import { DropdownValue } from '../base/dropdown-value.interface';
6
6
  import { PropertyDecoratorConfigInternal } from '../base/property-decorator-internal.data';
@@ -11,6 +11,8 @@ export declare class ReferencesManyDecoratorConfigInternal<EntityType extends Ba
11
11
  getReferencedEntities: () => Promise<EntityType[]>;
12
12
  getDropdownValues: (referencedEntities: EntityType[]) => DropdownValue<string>[];
13
13
  getEntityForId: (entityId: string, allReferencedEntities: EntityType[]) => EntityType;
14
+ emptyErrorMessage: string;
15
+ dynamicRowStyleClasses: DynamicStyleClasses<EntityType>;
14
16
  displayColumns: DisplayColumn<EntityType>[];
15
17
  addButtonLabel: string;
16
18
  removeButtonLabel: string;
@@ -1,5 +1,5 @@
1
1
  import { BaseEntityType } from '../../classes/entity.model';
2
- import { DisplayColumn } from '../../components/table/table-data';
2
+ import { DisplayColumn, DynamicStyleClasses } from '../../components/table/table-data';
3
3
  import { DropdownValue } from '../base/dropdown-value.interface';
4
4
  import { PropertyDecoratorConfig } from '../base/property-decorator.data';
5
5
  /**
@@ -18,6 +18,18 @@ export interface ReferencesManyDecoratorConfig<EntityType extends BaseEntityType
18
18
  * Gets the referenced entity for the given id.
19
19
  */
20
20
  getEntityForId?: (entityId: string, allReferencedEntities: EntityType[]) => EntityType;
21
+ /**
22
+ * The error message to display when an array property is required and empty.
23
+ * @default 'Needs to contain at least one value'
24
+ */
25
+ emptyErrorMessage?: string;
26
+ /**
27
+ * Configuration for css classes that should be applied to table rows based on a condition.
28
+ * This could be used to eg. Set the background color to green when an item has the status completed etc.
29
+ * INFO: You need to use ng-deep or apply the styling in the styles.scss.
30
+ * @default () => []
31
+ */
32
+ dynamicRowStyleClasses?: DynamicStyleClasses<EntityType>;
21
33
  /**
22
34
  * The definition of the columns to display. Consists of the displayName to show in the header of the row
23
35
  * and the value, which is a function that generates the value to display inside a column.
@@ -1,25 +1,24 @@
1
1
  import { ElementRef, OnChanges, Renderer2 } from '@angular/core';
2
- import { BaseEntityType } from '../classes/entity.model';
3
2
  import { DynamicStyleClasses } from '../components/table/table-data';
4
3
  import * as i0 from "@angular/core";
5
4
  /**
6
5
  * Dynamically applies css classes based on a provided function.
7
6
  */
8
- export declare class DynamicStyleClassDirective<EntityType extends BaseEntityType<EntityType>> implements OnChanges {
7
+ export declare class DynamicStyleClassDirective<T> implements OnChanges {
9
8
  private readonly element;
10
9
  private readonly renderer;
11
10
  private styleClassesApplied;
12
11
  /**
13
12
  * The function that gets the css classes to dynamically apply.
14
13
  */
15
- dynamicStyleClasses: DynamicStyleClasses<EntityType>;
14
+ dynamicStyleClasses: DynamicStyleClasses<T>;
16
15
  /**
17
16
  * The input for the dynamic style classes function.
18
17
  */
19
- entity: EntityType;
18
+ value: T;
20
19
  constructor(element: ElementRef, renderer: Renderer2);
21
20
  ngOnChanges(): void;
22
21
  private applyDynamicClasses;
23
22
  static ɵfac: i0.ɵɵFactoryDeclaration<DynamicStyleClassDirective<any>, never>;
24
- static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicStyleClassDirective<any>, "[dynamicStyleClasses]", never, { "dynamicStyleClasses": { "alias": "dynamicStyleClasses"; "required": true; }; "entity": { "alias": "entity"; "required": true; }; }, {}, never, never, true, never>;
23
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DynamicStyleClassDirective<any>, "[dynamicStyleClasses]", never, { "dynamicStyleClasses": { "alias": "dynamicStyleClasses"; "required": true; }; "value": { "alias": "value"; "required": true; }; }, {}, never, never, true, never>;
25
24
  }
@@ -1,4 +1,4 @@
1
- import { NgFor, NgIf } from '@angular/common';
1
+ import { CommonModule } from '@angular/common';
2
2
  import { Component, Inject } from '@angular/core';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { MatButtonModule } from '@angular/material/button';
@@ -50,18 +50,17 @@ export class NgxMatEntityConfirmDialogComponent {
50
50
  this.dialogRef.close(false);
51
51
  }
52
52
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: NGX_COMPLETE_GLOBAL_DEFAULT_VALUES }], target: i0.ɵɵFactoryTarget.Component });
53
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgxMatEntityConfirmDialogComponent, isStandalone: true, selector: "ngx-mat-entity-confirm-dialog", ngImport: i0, template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: NgxMatEntityConfirmDialogComponent, isStandalone: true, selector: "ngx-mat-entity-confirm-dialog", ngImport: i0, template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
54
54
  }
55
55
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgxMatEntityConfirmDialogComponent, decorators: [{
56
56
  type: Component,
57
57
  args: [{ selector: 'ngx-mat-entity-confirm-dialog', standalone: true, imports: [
58
- NgIf,
59
- NgFor,
58
+ CommonModule,
60
59
  MatDialogModule,
61
60
  FormsModule,
62
61
  MatCheckboxModule,
63
62
  MatButtonModule
64
- ], template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}mat-dialog-actions{justify-content:space-between}\n"] }]
63
+ ], template: "@if (data.title) {\n <h2 mat-dialog-title>{{data.title}}</h2>\n}\n\n<mat-dialog-content>\n @for (paragraph of data.text; track $index) {\n <p>{{paragraph}}</p>\n }\n @if (data.requireConfirmation) {\n <div class=\"checkbox-wrapper\">\n <mat-checkbox name=\"confirm\" [(ngModel)]=\"confirm\">\n {{data.confirmationText}}\n </mat-checkbox>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (data.type === 'delete') {\n <button type=\"button\" mat-raised-button color=\"warn\" class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'delete') {\n <button type=\"button\" mat-raised-button class=\"confirm-button\" [disabled]=\"data.requireConfirmation && !confirm\" (click)=\"confirmAction()\">\n {{data.confirmButtonLabel}}\n </button>\n }\n @if (data.type !== 'info-only') {\n <button type=\"button\" mat-raised-button class=\"cancel-button\" (click)=\"cancel()\">\n {{data.cancelButtonLabel}}\n </button>\n }\n</mat-dialog-actions>", styles: [".checkbox-wrapper{min-height:50px;display:flex}.checkbox-wrapper>mat-checkbox{align-self:center}\n", "::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}\n"] }]
65
64
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
66
65
  type: Inject,
67
66
  args: [MAT_DIALOG_DATA]
@@ -69,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImpor
69
68
  type: Inject,
70
69
  args: [NGX_COMPLETE_GLOBAL_DEFAULT_VALUES]
71
70
  }] }] });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUcxRixPQUFPLEVBQUUsd0JBQXdCLEVBQTZCLE1BQU0sK0JBQStCLENBQUM7QUFDcEcsT0FBTyxFQUFFLGtDQUFrQyxFQUEwQixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7QUFFL0c7Ozs7R0FJRztBQWVILE1BQU0sT0FBTyxrQ0FBa0M7SUFhdEI7SUFFQTtJQUVFO0lBZnZCOztPQUVHO0lBQ0gsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUV6Qjs7T0FFRztJQUNILElBQUksQ0FBNkI7SUFFakMsWUFDcUIsU0FBMkQsRUFFM0QsU0FBNEIsRUFFMUIsWUFBb0M7UUFKdEMsY0FBUyxHQUFULFNBQVMsQ0FBa0Q7UUFFM0QsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFFMUIsaUJBQVksR0FBWixZQUFZLENBQXdCO0lBQ3hELENBQUM7SUFFSixRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7dUdBckNRLGtDQUFrQyw4Q0FjL0IsZUFBZSxhQUVmLGtDQUFrQzsyRkFoQnJDLGtDQUFrQyx5RkM5Qi9DLGd0Q0FpQ3FCLDRNRFRiLGVBQWUseWJBQ2YsV0FBVyw4VkFDWCxpQkFBaUIsNldBQ2pCLGVBQWU7OzJGQUdWLGtDQUFrQztrQkFkOUMsU0FBUzsrQkFDSSwrQkFBK0IsY0FHN0IsSUFBSSxXQUNQO3dCQUNMLElBQUk7d0JBQ0osS0FBSzt3QkFDTCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsaUJBQWlCO3dCQUNqQixlQUFlO3FCQUNsQjs7MEJBZ0JJLE1BQU07MkJBQUMsZUFBZTs7MEJBRXRCLE1BQU07MkJBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGEgfSBmcm9tICcuL2NvbmZpcm0tZGlhbG9nLWRhdGEnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyLCBDb25maXJtRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi9jb25maXJtLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgTkdYX0NPTVBMRVRFX0dMT0JBTF9ERUZBVUxUX1ZBTFVFUywgTmd4R2xvYmFsRGVmYXVsdFZhbHVlcyB9IGZyb20gJy4uLy4uL2dsb2JhbC1jb25maWd1cmF0aW9uLXZhbHVlcyc7XG5cbi8qKlxuICogVGhlIERpYWxvZyB1c2VkIHdoZW5ldmVyIGNvbmZpcm1hdGlvbiBieSB0aGUgdXNlciBpcyByZXF1aXJlZCAoZS5nLiBXaGVuIHRoZSB1c2VyIHRyaWVzIHRvIGRlbGV0ZSBhbiBlbnRpdHkpLlxuICpcbiAqIENhbiBiZSBjdXN0b21pemVkIHdpdGggdGhlIE1BVF9ESUFMT0dfREFUQSBcImlucHV0RGF0YVwiLiBDdXN0b21pemF0aW9uIG9wdGlvbnMgYXJlIGRlZmluZWQgaW4gXCJDb25maXJtRGlhbG9nRGF0YVwiLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWNvbmZpcm0tZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29uZmlybS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIG5lZWRzIHRvIHRpY2sgYSBjaGVja2JveCB0byBlbmFibGUgdGhlIGNvbmZpcm0gYnV0dG9uLlxuICAgICAqL1xuICAgIGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGRhdGEgb2YgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBkYXRhITogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSlcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnB1dERhdGE6IENvbmZpcm1EaWFsb2dEYXRhLFxuICAgICAgICBASW5qZWN0KE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMpXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxDb25maWc6IE5neEdsb2JhbERlZmF1bHRWYWx1ZXNcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmdsb2JhbENvbmZpZywgdGhpcy5pbnB1dERhdGEpLmdldFJlc3VsdCgpO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZGlhbG9nIHdpdGggdHJ1ZSB0byBzaWduYWwgdGhhdCB0aGUgYWN0aW9uIHNob3VsZCBiZSBydW4uXG4gICAgICovXG4gICAgY29uZmlybUFjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgY2FuY2VsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShmYWxzZSk7XG4gICAgfVxufSIsIkBpZiAoZGF0YS50aXRsZSkge1xuICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS50aXRsZX19PC9oMj5cbn1cblxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICBAZm9yIChwYXJhZ3JhcGggb2YgZGF0YS50ZXh0OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHA+e3twYXJhZ3JhcGh9fTwvcD5cbiAgICB9XG4gICAgQGlmIChkYXRhLnJlcXVpcmVDb25maXJtYXRpb24pIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggbmFtZT1cImNvbmZpcm1cIiBbKG5nTW9kZWwpXT1cImNvbmZpcm1cIj5cbiAgICAgICAgICAgICAgICB7e2RhdGEuY29uZmlybWF0aW9uVGV4dH19XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgQGlmIChkYXRhLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIGNsYXNzPVwiY29uZmlybS1idXR0b25cIiBbZGlzYWJsZWRdPVwiZGF0YS5yZXF1aXJlQ29uZmlybWF0aW9uICYmICFjb25maXJtXCIgKGNsaWNrKT1cImNvbmZpcm1BY3Rpb24oKVwiPlxuICAgICAgICAgICAge3tkYXRhLmNvbmZpcm1CdXR0b25MYWJlbH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICBAaWYgKGRhdGEudHlwZSAhPT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJjb25maXJtLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb24gJiYgIWNvbmZpcm1cIiAoY2xpY2spPVwiY29uZmlybUFjdGlvbigpXCI+XG4gICAgICAgICAgICB7e2RhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoZGF0YS50eXBlICE9PSAnaW5mby1vbmx5Jykge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiY2FuY2VsKClcIj5cbiAgICAgICAgICAgIHt7ZGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBNkIsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsa0NBQWtDLEVBQTBCLE1BQU0sbUNBQW1DLENBQUM7Ozs7OztBQUUvRzs7OztHQUlHO0FBY0gsTUFBTSxPQUFPLGtDQUFrQztJQWF0QjtJQUVBO0lBRUU7SUFmdkI7O09BRUc7SUFDSCxPQUFPLEdBQVksS0FBSyxDQUFDO0lBRXpCOztPQUVHO0lBQ0gsSUFBSSxDQUE2QjtJQUVqQyxZQUNxQixTQUEyRCxFQUUzRCxTQUE0QixFQUUxQixZQUFvQztRQUp0QyxjQUFTLEdBQVQsU0FBUyxDQUFrRDtRQUUzRCxjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUUxQixpQkFBWSxHQUFaLFlBQVksQ0FBd0I7SUFDeEQsQ0FBQztJQUVKLFFBQVE7UUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzt1R0FyQ1Esa0NBQWtDLDhDQWMvQixlQUFlLGFBRWYsa0NBQWtDOzJGQWhCckMsa0NBQWtDLHlGQzdCL0MsZ3RDQWlDcUIseWlCRFhiLFlBQVksOEJBQ1osZUFBZSx5YkFDZixXQUFXLDhWQUNYLGlCQUFpQiw2V0FDakIsZUFBZTs7MkZBR1Ysa0NBQWtDO2tCQWI5QyxTQUFTOytCQUNJLCtCQUErQixjQUc3QixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsaUJBQWlCO3dCQUNqQixlQUFlO3FCQUNsQjs7MEJBZ0JJLE1BQU07MkJBQUMsZUFBZTs7MEJBRXRCLE1BQU07MkJBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhIH0gZnJvbSAnLi9jb25maXJtLWRpYWxvZy1kYXRhJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlciwgQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4vY29uZmlybS1kaWFsb2ctZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IE5HWF9DT01QTEVURV9HTE9CQUxfREVGQVVMVF9WQUxVRVMsIE5neEdsb2JhbERlZmF1bHRWYWx1ZXMgfSBmcm9tICcuLi8uLi9nbG9iYWwtY29uZmlndXJhdGlvbi12YWx1ZXMnO1xuXG4vKipcbiAqIFRoZSBEaWFsb2cgdXNlZCB3aGVuZXZlciBjb25maXJtYXRpb24gYnkgdGhlIHVzZXIgaXMgcmVxdWlyZWQgKGUuZy4gV2hlbiB0aGUgdXNlciB0cmllcyB0byBkZWxldGUgYW4gZW50aXR5KS5cbiAqXG4gKiBDYW4gYmUgY3VzdG9taXplZCB3aXRoIHRoZSBNQVRfRElBTE9HX0RBVEEgXCJpbnB1dERhdGFcIi4gQ3VzdG9taXphdGlvbiBvcHRpb25zIGFyZSBkZWZpbmVkIGluIFwiQ29uZmlybURpYWxvZ0RhdGFcIi5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1jb25maXJtLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb25maXJtLWRpYWxvZy5jb21wb25lbnQuc2NzcycsICcuLi8uLi9zY3NzL2RpYWxvZy1zdHlsZXMuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHVzZXIgbmVlZHMgdG8gdGljayBhIGNoZWNrYm94IHRvIGVuYWJsZSB0aGUgY29uZmlybSBidXR0b24uXG4gICAgICovXG4gICAgY29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGRhdGEhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudD4sXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RGF0YTogQ29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgIEBJbmplY3QoTkdYX0NPTVBMRVRFX0dMT0JBTF9ERUZBVUxUX1ZBTFVFUylcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdsb2JhbENvbmZpZzogTmd4R2xvYmFsRGVmYXVsdFZhbHVlc1xuICAgICkge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZ2xvYmFsQ29uZmlnLCB0aGlzLmlucHV0RGF0YSkuZ2V0UmVzdWx0KCk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBkaWFsb2cgd2l0aCB0cnVlIHRvIHNpZ25hbCB0aGF0IHRoZSBhY3Rpb24gc2hvdWxkIGJlIHJ1bi5cbiAgICAgKi9cbiAgICBjb25maXJtQWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjYW5jZWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKGZhbHNlKTtcbiAgICB9XG59IiwiQGlmIChkYXRhLnRpdGxlKSB7XG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3tkYXRhLnRpdGxlfX08L2gyPlxufVxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIEBmb3IgKHBhcmFncmFwaCBvZiBkYXRhLnRleHQ7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8cD57e3BhcmFncmFwaH19PC9wPlxuICAgIH1cbiAgICBAaWYgKGRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBuYW1lPVwiY29uZmlybVwiIFsobmdNb2RlbCldPVwiY29uZmlybVwiPlxuICAgICAgICAgICAgICAgIHt7ZGF0YS5jb25maXJtYXRpb25UZXh0fX1cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICBAaWYgKGRhdGEudHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgY2xhc3M9XCJjb25maXJtLWJ1dHRvblwiIFtkaXNhYmxlZF09XCJkYXRhLnJlcXVpcmVDb25maXJtYXRpb24gJiYgIWNvbmZpcm1cIiAoY2xpY2spPVwiY29uZmlybUFjdGlvbigpXCI+XG4gICAgICAgICAgICB7e2RhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoZGF0YS50eXBlICE9PSAnZGVsZXRlJykge1xuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImNvbmZpcm0tYnV0dG9uXCIgW2Rpc2FibGVkXT1cImRhdGEucmVxdWlyZUNvbmZpcm1hdGlvbiAmJiAhY29uZmlybVwiIChjbGljayk9XCJjb25maXJtQWN0aW9uKClcIj5cbiAgICAgICAgICAgIHt7ZGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgQGlmIChkYXRhLnR5cGUgIT09ICdpbmZvLW9ubHknKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAge3tkYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+Il19