ngx-material-entity 1.0.0 → 1.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 (112) hide show
  1. package/README.md +11 -5
  2. package/capsulation/jszip.utilities.d.ts +12 -0
  3. package/capsulation/reflect.utilities.d.ts +1 -1
  4. package/classes/date.utilities.d.ts +3 -3
  5. package/classes/entity.model.d.ts +1 -1
  6. package/classes/entity.utilities.d.ts +26 -5
  7. package/classes/file.utilities.d.ts +13 -0
  8. package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +1 -2
  9. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +1 -3
  10. package/components/input/array/array-table.class.d.ts +5 -6
  11. package/components/input/base-input.component.d.ts +29 -3
  12. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +1 -1
  13. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +1 -1
  14. package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +1 -1
  15. package/components/input/custom/custom.component.d.ts +3 -3
  16. package/components/input/date/date-input/date-input.component.d.ts +1 -3
  17. package/components/input/date/date-range-input/date-range-input.component.d.ts +2 -3
  18. package/components/input/date/date-time-input/date-time-input.component.d.ts +2 -3
  19. package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
  20. package/components/input/file/file-image-input/file-image-input.component.d.ts +1 -1
  21. package/components/input/file/file-input/file-input.component.d.ts +8 -7
  22. package/components/input/input.component.d.ts +17 -5
  23. package/components/input/input.module.d.ts +38 -34
  24. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +1 -1
  25. package/components/input/number/number-input/number-input.component.d.ts +1 -1
  26. package/components/input/number/number-slider-input/number-slider-input.component.d.ts +9 -0
  27. package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +2 -2
  28. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +1 -1
  29. package/components/input/string/string-input/string-input.component.d.ts +1 -1
  30. package/components/input/string/string-password-input/string-password-input.component.d.ts +15 -0
  31. package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +1 -1
  32. package/components/table/create-dialog/create-entity-dialog.component.d.ts +2 -2
  33. package/components/table/create-dialog/create-entity-dialog.module.d.ts +2 -1
  34. package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +4 -0
  35. package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +2 -1
  36. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +8 -4
  37. package/components/table/edit-dialog/edit-entity-dialog.module.d.ts +3 -2
  38. package/components/table/table-data.builder.d.ts +4 -3
  39. package/components/table/table-data.d.ts +12 -4
  40. package/decorators/base/decorator-types.enum.d.ts +5 -3
  41. package/decorators/base/property-decorator-internal.data.d.ts +2 -0
  42. package/decorators/base/property-decorator.data.d.ts +15 -0
  43. package/decorators/custom/custom-decorator.data.d.ts +4 -0
  44. package/decorators/file/file-decorator-internal.data.d.ts +2 -0
  45. package/decorators/file/file-decorator.data.d.ts +9 -1
  46. package/decorators/number/number-decorator-internal.data.d.ts +20 -1
  47. package/decorators/number/number-decorator.data.d.ts +27 -1
  48. package/decorators/number/number.decorator.d.ts +2 -2
  49. package/decorators/string/string-decorator-internal.data.d.ts +14 -1
  50. package/decorators/string/string-decorator.data.d.ts +37 -1
  51. package/decorators/string/string.decorator.d.ts +2 -2
  52. package/esm2020/capsulation/jszip.utilities.mjs +18 -0
  53. package/esm2020/capsulation/reflect.utilities.mjs +1 -1
  54. package/esm2020/classes/date.utilities.mjs +3 -3
  55. package/esm2020/classes/entity.model.mjs +1 -1
  56. package/esm2020/classes/entity.utilities.mjs +108 -31
  57. package/esm2020/classes/file.utilities.mjs +42 -2
  58. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +2 -2
  59. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +6 -6
  60. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +5 -5
  61. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +6 -6
  62. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +9 -25
  63. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +9 -28
  64. package/esm2020/components/input/array/array-table.class.mjs +10 -13
  65. package/esm2020/components/input/base-input.component.mjs +28 -2
  66. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +4 -6
  67. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +3 -3
  68. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +4 -6
  69. package/esm2020/components/input/custom/custom.component.mjs +2 -1
  70. package/esm2020/components/input/date/date-input/date-input.component.mjs +3 -4
  71. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +6 -6
  72. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +13 -13
  73. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +4 -5
  74. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +21 -16
  75. package/esm2020/components/input/file/file-input/file-input.component.mjs +58 -31
  76. package/esm2020/components/input/input.component.mjs +36 -30
  77. package/esm2020/components/input/input.module.mjs +18 -4
  78. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +3 -3
  79. package/esm2020/components/input/number/number-input/number-input.component.mjs +3 -3
  80. package/esm2020/components/input/number/number-slider-input/number-slider-input.component.mjs +17 -0
  81. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +5 -7
  82. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +3 -3
  83. package/esm2020/components/input/string/string-input/string-input.component.mjs +3 -3
  84. package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +36 -0
  85. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +3 -3
  86. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +9 -8
  87. package/esm2020/components/table/create-dialog/create-entity-dialog.module.mjs +8 -4
  88. package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +1 -1
  89. package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +4 -3
  90. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +16 -12
  91. package/esm2020/components/table/edit-dialog/edit-entity-dialog.module.mjs +5 -1
  92. package/esm2020/components/table/table-data.builder.mjs +13 -10
  93. package/esm2020/components/table/table-data.mjs +1 -1
  94. package/esm2020/components/table/table.component.mjs +16 -14
  95. package/esm2020/decorators/base/base-property.decorator.mjs +1 -1
  96. package/esm2020/decorators/base/decorator-types.enum.mjs +3 -1
  97. package/esm2020/decorators/base/property-decorator-internal.data.mjs +6 -1
  98. package/esm2020/decorators/base/property-decorator.data.mjs +1 -1
  99. package/esm2020/decorators/custom/custom-decorator.data.mjs +1 -1
  100. package/esm2020/decorators/file/file-decorator-internal.data.mjs +3 -1
  101. package/esm2020/decorators/file/file-decorator.data.mjs +1 -1
  102. package/esm2020/decorators/number/number-decorator-internal.data.mjs +24 -1
  103. package/esm2020/decorators/number/number-decorator.data.mjs +1 -1
  104. package/esm2020/decorators/number/number.decorator.mjs +9 -7
  105. package/esm2020/decorators/string/string-decorator-internal.data.mjs +16 -1
  106. package/esm2020/decorators/string/string-decorator.data.mjs +1 -1
  107. package/esm2020/decorators/string/string.decorator.mjs +13 -13
  108. package/fesm2015/ngx-material-entity.mjs +567 -287
  109. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  110. package/fesm2020/ngx-material-entity.mjs +536 -270
  111. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  112. package/package.json +2 -1
@@ -3,7 +3,7 @@ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum
3
3
  import { BaseEntityType } from '../../../../classes/entity.model';
4
4
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
5
  import * as i0 from "@angular/core";
6
- export declare class NumberInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.NUMBER> implements OnInit {
6
+ export declare class NumberInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.NUMBER, number> implements OnInit {
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<NumberInputComponent<any>, never>;
8
8
  static ɵcmp: i0.ɵɵComponentDeclaration<NumberInputComponent<any>, "number-input", never, {}, {}, never, never>;
9
9
  }
@@ -0,0 +1,9 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum';
3
+ import { BaseEntityType } from '../../../../classes/entity.model';
4
+ import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
+ import * as i0 from "@angular/core";
6
+ export declare class NumberSliderInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.NUMBER_SLIDER, number> implements OnInit {
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<NumberSliderInputComponent<any>, never>;
8
+ static ɵcmp: i0.ɵɵComponentDeclaration<NumberSliderInputComponent<any>, "number-slider-input", never, {}, {}, never, never>;
9
+ }
@@ -3,7 +3,7 @@ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum
3
3
  import { BaseEntityType } from '../../../../classes/entity.model';
4
4
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
5
  import * as i0 from "@angular/core";
6
- export declare class StringAutocompleteInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_AUTOCOMPLETE> implements OnInit {
6
+ export declare class StringAutocompleteInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_AUTOCOMPLETE, string> implements OnInit {
7
7
  autocompleteStrings: string[];
8
8
  filteredAutocompleteStrings: string[];
9
9
  ngOnInit(): void;
@@ -12,7 +12,7 @@ export declare class StringAutocompleteInputComponent<EntityType extends BaseEnt
12
12
  *
13
13
  * @param input - The input of the user.
14
14
  */
15
- filterAutocompleteStrings(input: unknown): void;
15
+ filterAutocompleteStrings(input?: string): void;
16
16
  static ɵfac: i0.ɵɵFactoryDeclaration<StringAutocompleteInputComponent<any>, never>;
17
17
  static ɵcmp: i0.ɵɵComponentDeclaration<StringAutocompleteInputComponent<any>, "string-autocomplete-input", never, {}, {}, never, never>;
18
18
  }
@@ -3,7 +3,7 @@ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum
3
3
  import { BaseEntityType } from '../../../../classes/entity.model';
4
4
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
5
  import * as i0 from "@angular/core";
6
- export declare class StringDropdownInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_DROPDOWN> implements OnInit {
6
+ export declare class StringDropdownInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_DROPDOWN, string> implements OnInit {
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<StringDropdownInputComponent<any>, never>;
8
8
  static ɵcmp: i0.ɵɵComponentDeclaration<StringDropdownInputComponent<any>, "string-dropdown-input", never, {}, {}, never, never>;
9
9
  }
@@ -3,7 +3,7 @@ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum
3
3
  import { BaseEntityType } from '../../../../classes/entity.model';
4
4
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
5
  import * as i0 from "@angular/core";
6
- export declare class StringInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING> implements OnInit {
6
+ export declare class StringInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING, string> implements OnInit {
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<StringInputComponent<any>, never>;
8
8
  static ɵcmp: i0.ɵɵComponentDeclaration<StringInputComponent<any>, "string-input", never, {}, {}, never, never>;
9
9
  }
@@ -0,0 +1,15 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum';
3
+ import { BaseEntityType } from '../../../../classes/entity.model';
4
+ import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
+ import * as i0 from "@angular/core";
6
+ export declare class StringPasswordInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_PASSWORD, string> implements OnInit {
7
+ hide: boolean;
8
+ hideConfirm: boolean;
9
+ confirmRequired: boolean;
10
+ confirmPassword?: string;
11
+ ngOnInit(): void;
12
+ passwordInput(): void;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<StringPasswordInputComponent<any>, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<StringPasswordInputComponent<any>, "string-password-input", never, {}, {}, never, never>;
15
+ }
@@ -3,7 +3,7 @@ import { DecoratorTypes } from '../../../../decorators/base/decorator-types.enum
3
3
  import { BaseEntityType } from '../../../../classes/entity.model';
4
4
  import { NgxMatEntityBaseInputComponent } from '../../base-input.component';
5
5
  import * as i0 from "@angular/core";
6
- export declare class StringTextboxInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_TEXTBOX> implements OnInit {
6
+ export declare class StringTextboxInputComponent<EntityType extends BaseEntityType<EntityType>> extends NgxMatEntityBaseInputComponent<EntityType, DecoratorTypes.STRING_TEXTBOX, string> implements OnInit {
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<StringTextboxInputComponent<any>, never>;
8
8
  static ɵcmp: i0.ɵɵComponentDeclaration<StringTextboxInputComponent<any>, "string-textbox-input", never, {}, {}, never, never>;
9
9
  }
@@ -1,7 +1,7 @@
1
1
  import { Injector, OnInit } from '@angular/core';
2
2
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
3
3
  import { EntityService } from '../../../classes/entity.service';
4
- import { EntityRow, EntityUtilities } from '../../../classes/entity.utilities';
4
+ import { EntityTab, EntityUtilities } from '../../../classes/entity.utilities';
5
5
  import { CreateEntityDialogDataInternal } from './create-entity-dialog-data.builder';
6
6
  import { CreateEntityDialogData } from './create-entity-dialog-data';
7
7
  import { BaseEntityType } from '../../../classes/entity.model';
@@ -18,7 +18,7 @@ export declare class NgxMatEntityCreateDialogComponent<EntityType extends BaseEn
18
18
  private readonly injector;
19
19
  private readonly dialog;
20
20
  EntityUtilities: typeof EntityUtilities;
21
- entityRows: EntityRow<EntityType>[];
21
+ entityTabs: EntityTab<EntityType>[];
22
22
  entityService: EntityService<EntityType>;
23
23
  data: CreateEntityDialogDataInternal<EntityType>;
24
24
  isEntityValid: boolean;
@@ -5,8 +5,9 @@ import * as i3 from "../../input/input.module";
5
5
  import * as i4 from "@angular/material/dialog";
6
6
  import * as i5 from "@angular/forms";
7
7
  import * as i6 from "@angular/material/button";
8
+ import * as i7 from "@angular/material/tabs";
8
9
  export declare class NgxMatEntityCreateDialogModule {
9
10
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatEntityCreateDialogModule, never>;
10
- static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityCreateDialogModule, [typeof i1.NgxMatEntityCreateDialogComponent], [typeof i2.CommonModule, typeof i3.NgxMatEntityInputModule, typeof i4.MatDialogModule, typeof i5.FormsModule, typeof i6.MatButtonModule], [typeof i1.NgxMatEntityCreateDialogComponent]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityCreateDialogModule, [typeof i1.NgxMatEntityCreateDialogComponent], [typeof i2.CommonModule, typeof i3.NgxMatEntityInputModule, typeof i4.MatDialogModule, typeof i5.FormsModule, typeof i6.MatButtonModule, typeof i7.MatTabsModule], [typeof i1.NgxMatEntityCreateDialogComponent]>;
11
12
  static ɵinj: i0.ɵɵInjectorDeclaration<NgxMatEntityCreateDialogModule>;
12
13
  }
@@ -22,4 +22,8 @@ export interface EditEntityDialogData<EntityType extends BaseEntityType<EntityTy
22
22
  * Whether or not the user can delete this specific entity.
23
23
  */
24
24
  allowDelete?: (entity: EntityType) => boolean;
25
+ /**
26
+ * Whether or not the user can update this specific entity.
27
+ */
28
+ allowUpdate?: (entity: EntityType) => boolean;
25
29
  }
@@ -11,8 +11,9 @@ export declare class EditEntityDialogDataInternal<EntityType extends BaseEntityT
11
11
  entity: EntityType;
12
12
  EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>;
13
13
  editDialogData: EditDialogDataInternal<EntityType>;
14
+ allowUpdate: (entity: EntityType) => boolean;
14
15
  allowDelete: (entity: EntityType) => boolean;
15
- constructor(entity: EntityType, EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>, editDialogData: EditDialogDataInternal<EntityType>, allowDelete: (entity: EntityType) => boolean);
16
+ constructor(entity: EntityType, EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>, editDialogData: EditDialogDataInternal<EntityType>, allowUpdate: (entity: EntityType) => boolean, allowDelete: (entity: EntityType) => boolean);
16
17
  }
17
18
  /**
18
19
  * The Builder for the EditEntityDialogData. Sets default values.
@@ -1,7 +1,7 @@
1
1
  import { Injector, OnInit } from '@angular/core';
2
2
  import { MatDialog, MatDialogRef } from '@angular/material/dialog';
3
3
  import { EntityService } from '../../../classes/entity.service';
4
- import { EntityRow, EntityUtilities } from '../../../classes/entity.utilities';
4
+ import { EntityTab, EntityUtilities } from '../../../classes/entity.utilities';
5
5
  import { EditEntityDialogData } from './edit-entity-dialog-data';
6
6
  import { EditEntityDialogDataInternal } from './edit-entity-dialog.builder';
7
7
  import { BaseEntityType } from '../../../classes/entity.model';
@@ -18,15 +18,19 @@ export declare class NgxMatEntityEditDialogComponent<EntityType extends BaseEnti
18
18
  private readonly injector;
19
19
  private readonly dialog;
20
20
  EntityUtilities: typeof EntityUtilities;
21
- entityRows: EntityRow<EntityType>[];
21
+ entityTabs: EntityTab<EntityType>[];
22
22
  entityService: EntityService<EntityType>;
23
23
  entityPriorChanges: EntityType;
24
24
  data: EditEntityDialogDataInternal<EntityType>;
25
25
  isEntityValid: boolean;
26
- isEntityDirty: Promise<boolean>;
26
+ isEntityDirty: boolean;
27
+ isReadOnly: boolean;
27
28
  constructor(inputData: EditEntityDialogData<EntityType>, dialogRef: MatDialogRef<NgxMatEntityEditDialogComponent<EntityType>>, injector: Injector, dialog: MatDialog);
28
29
  ngOnInit(): void;
29
- checkEntity(): void;
30
+ /**
31
+ * Checks if the entity has become invalid or dirty.
32
+ */
33
+ checkEntity(): Promise<void>;
30
34
  /**
31
35
  * Tries to save the changes and close the dialog afterwards.
32
36
  * Also handles the confirmation if required.
@@ -5,9 +5,10 @@ import * as i3 from "../../input/input.module";
5
5
  import * as i4 from "@angular/material/dialog";
6
6
  import * as i5 from "@angular/forms";
7
7
  import * as i6 from "@angular/material/button";
8
- import * as i7 from "../../confirm-dialog/confirm-dialog.module";
8
+ import * as i7 from "@angular/material/tabs";
9
+ import * as i8 from "../../confirm-dialog/confirm-dialog.module";
9
10
  export declare class NgxMatEntityEditDialogModule {
10
11
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxMatEntityEditDialogModule, never>;
11
- static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityEditDialogModule, [typeof i1.NgxMatEntityEditDialogComponent], [typeof i2.CommonModule, typeof i3.NgxMatEntityInputModule, typeof i4.MatDialogModule, typeof i5.FormsModule, typeof i6.MatButtonModule, typeof i7.NgxMatEntityConfirmDialogModule], [typeof i1.NgxMatEntityEditDialogComponent]>;
12
+ static ɵmod: i0.ɵɵNgModuleDeclaration<NgxMatEntityEditDialogModule, [typeof i1.NgxMatEntityEditDialogComponent], [typeof i2.CommonModule, typeof i3.NgxMatEntityInputModule, typeof i4.MatDialogModule, typeof i5.FormsModule, typeof i6.MatButtonModule, typeof i7.MatTabsModule, typeof i8.NgxMatEntityConfirmDialogModule], [typeof i1.NgxMatEntityEditDialogComponent]>;
12
13
  static ɵinj: i0.ɵɵInjectorDeclaration<NgxMatEntityEditDialogModule>;
13
14
  }
@@ -31,15 +31,16 @@ export declare class BaseDataInternal<EntityType extends BaseEntityType<EntityTy
31
31
  searchLabel: string;
32
32
  createButtonLabel: string;
33
33
  searchString: (entity: EntityType) => string;
34
- allowCreate: boolean;
35
- allowEdit: (entity: EntityType) => boolean;
34
+ allowCreate: () => boolean;
35
+ allowRead: (entity: EntityType) => boolean;
36
+ allowUpdate: (entity: EntityType) => boolean;
36
37
  allowDelete: (entity: EntityType) => boolean;
37
38
  multiSelectActions: MultiSelectAction<EntityType>[];
38
39
  multiSelectLabel: string;
39
40
  EntityClass?: EntityClassNewable<EntityType>;
40
41
  edit?: (entity: EntityType) => unknown;
41
42
  create?: (entity: EntityType) => unknown;
42
- constructor(title: string, displayColumns: DisplayColumn<EntityType>[], EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>, searchLabel: string, createButtonLabel: string, searchString: (entity: EntityType) => string, allowCreate: boolean, allowEdit: (entity: EntityType) => boolean, allowDelete: (entity: EntityType) => boolean, multiSelectActions: MultiSelectAction<EntityType>[], multiSelectLabel: string, EntityClass?: EntityClassNewable<EntityType>, edit?: (entity: EntityType) => unknown, create?: (entity: EntityType) => unknown);
43
+ constructor(title: string, displayColumns: DisplayColumn<EntityType>[], EntityServiceClass: new (httpClient: HttpClient) => EntityService<EntityType>, searchLabel: string, createButtonLabel: string, searchString: (entity: EntityType) => string, allowCreate: () => boolean, allowRead: (entity: EntityType) => boolean, allowUpdate: (entity: EntityType) => boolean, allowDelete: (entity: EntityType) => boolean, multiSelectActions: MultiSelectAction<EntityType>[], multiSelectLabel: string, EntityClass?: EntityClassNewable<EntityType>, edit?: (entity: EntityType) => unknown, create?: (entity: EntityType) => unknown);
43
44
  }
44
45
  /**
45
46
  * The Builder for the complete TableData. Sets default values and validates user input.
@@ -93,17 +93,25 @@ export interface BaseData<EntityType extends BaseEntityType<EntityType>> {
93
93
  /**
94
94
  * Defines whether or not the user can add new entities.
95
95
  *
96
- * @default true
96
+ * @default () => true
97
+ */
98
+ allowCreate?: () => boolean;
99
+ /**
100
+ * Defines whether or not the user can view the specific entity.
101
+ *
102
+ * @default () => true
97
103
  */
98
- allowCreate?: boolean;
104
+ allowRead?: (entity: EntityType) => boolean;
99
105
  /**
100
- * Defines whether or not the user can edit entities.
106
+ * Defines whether or not the user can edit the specific entity.
101
107
  *
102
108
  * @default () => true
103
109
  */
104
- allowEdit?: (entity: EntityType) => boolean;
110
+ allowUpdate?: (entity: EntityType) => boolean;
105
111
  /**
106
112
  * Whether or not the user can delete this specific entity.
113
+ *
114
+ * @default () => true
107
115
  */
108
116
  allowDelete?: (entity: EntityType) => boolean;
109
117
  /**
@@ -3,9 +3,9 @@ import { CheckboxBooleanDecoratorConfigInternal, DropdownBooleanDecoratorConfigI
3
3
  import { CustomDecoratorConfigInternal } from '../custom/custom-decorator-internal.data';
4
4
  import { DateRangeDateDecoratorConfigInternal, DateTimeDateDecoratorConfigInternal, DefaultDateDecoratorConfigInternal } from '../date/date-decorator-internal.data';
5
5
  import { DefaultFileDecoratorConfigInternal, ImageFileDecoratorConfigInternal } from '../file/file-decorator-internal.data';
6
- import { DefaultNumberDecoratorConfigInternal, DropdownNumberDecoratorConfigInternal } from '../number/number-decorator-internal.data';
6
+ import { DefaultNumberDecoratorConfigInternal, DropdownNumberDecoratorConfigInternal, SliderNumberDecoratorConfigInternal } from '../number/number-decorator-internal.data';
7
7
  import { DefaultObjectDecoratorConfigInternal } from '../object/object-decorator-internal.data';
8
- import { AutocompleteStringDecoratorConfigInternal, DefaultStringDecoratorConfigInternal, DropdownStringDecoratorConfigInternal, TextboxStringDecoratorConfigInternal } from '../string/string-decorator-internal.data';
8
+ import { AutocompleteStringDecoratorConfigInternal, DefaultStringDecoratorConfigInternal, DropdownStringDecoratorConfigInternal, PasswordStringDecoratorConfigInternal, TextboxStringDecoratorConfigInternal } from '../string/string-decorator-internal.data';
9
9
  /**
10
10
  * The enum Values for all the different DecoratorTypes.
11
11
  */
@@ -14,8 +14,10 @@ export declare enum DecoratorTypes {
14
14
  STRING_DROPDOWN = "stringDropdown",
15
15
  STRING_AUTOCOMPLETE = "stringAutocomplete",
16
16
  STRING_TEXTBOX = "stringTextbox",
17
+ STRING_PASSWORD = "stringPassword",
17
18
  NUMBER = "number",
18
19
  NUMBER_DROPDOWN = "numberDropdown",
20
+ NUMBER_SLIDER = "numberSlider",
19
21
  BOOLEAN_CHECKBOX = "boolean",
20
22
  BOOLEAN_TOGGLE = "booleanToggle",
21
23
  BOOLEAN_DROPDOWN = "booleanDropdown",
@@ -36,4 +38,4 @@ export declare enum DecoratorTypes {
36
38
  /**
37
39
  * Gives the metadata-config Type based on the DecoratorTypes enum.
38
40
  */
39
- export declare type DecoratorType<T, CustomMetadataType extends Record<string, unknown>> = T extends DecoratorTypes.STRING ? DefaultStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_TEXTBOX ? TextboxStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_DROPDOWN ? DropdownStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_AUTOCOMPLETE ? AutocompleteStringDecoratorConfigInternal : T extends DecoratorTypes.NUMBER ? DefaultNumberDecoratorConfigInternal : T extends DecoratorTypes.NUMBER_DROPDOWN ? DropdownNumberDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_CHECKBOX ? CheckboxBooleanDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_TOGGLE ? ToggleBooleanDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_DROPDOWN ? DropdownBooleanDecoratorConfigInternal : T extends DecoratorTypes.OBJECT ? DefaultObjectDecoratorConfigInternal<any> : T extends DecoratorTypes.ARRAY ? EntityArrayDecoratorConfigInternal<any> : T extends DecoratorTypes.ARRAY_DATE ? DateArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_DATE_TIME ? DateTimeArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_DATE_RANGE ? DateRangeArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_STRING_CHIPS ? StringChipsArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS ? AutocompleteStringChipsArrayDecoratorConfigInternal : T extends DecoratorTypes.DATE ? DefaultDateDecoratorConfigInternal : T extends DecoratorTypes.DATE_RANGE ? DateRangeDateDecoratorConfigInternal : T extends DecoratorTypes.DATE_TIME ? DateTimeDateDecoratorConfigInternal : T extends DecoratorTypes.FILE_DEFAULT ? DefaultFileDecoratorConfigInternal : T extends DecoratorTypes.FILE_IMAGE ? ImageFileDecoratorConfigInternal : T extends DecoratorTypes.CUSTOM ? CustomDecoratorConfigInternal<any, any, CustomMetadataType, any> : never;
41
+ export declare type DecoratorType<T, CustomMetadataType extends Record<string, unknown>> = T extends DecoratorTypes.STRING ? DefaultStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_TEXTBOX ? TextboxStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_DROPDOWN ? DropdownStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_AUTOCOMPLETE ? AutocompleteStringDecoratorConfigInternal : T extends DecoratorTypes.STRING_PASSWORD ? PasswordStringDecoratorConfigInternal : T extends DecoratorTypes.NUMBER ? DefaultNumberDecoratorConfigInternal : T extends DecoratorTypes.NUMBER_DROPDOWN ? DropdownNumberDecoratorConfigInternal : T extends DecoratorTypes.NUMBER_SLIDER ? SliderNumberDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_CHECKBOX ? CheckboxBooleanDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_TOGGLE ? ToggleBooleanDecoratorConfigInternal : T extends DecoratorTypes.BOOLEAN_DROPDOWN ? DropdownBooleanDecoratorConfigInternal : T extends DecoratorTypes.OBJECT ? DefaultObjectDecoratorConfigInternal<any> : T extends DecoratorTypes.ARRAY ? EntityArrayDecoratorConfigInternal<any> : T extends DecoratorTypes.ARRAY_DATE ? DateArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_DATE_TIME ? DateTimeArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_DATE_RANGE ? DateRangeArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_STRING_CHIPS ? StringChipsArrayDecoratorConfigInternal : T extends DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS ? AutocompleteStringChipsArrayDecoratorConfigInternal : T extends DecoratorTypes.DATE ? DefaultDateDecoratorConfigInternal : T extends DecoratorTypes.DATE_RANGE ? DateRangeDateDecoratorConfigInternal : T extends DecoratorTypes.DATE_TIME ? DateTimeDateDecoratorConfigInternal : T extends DecoratorTypes.FILE_DEFAULT ? DefaultFileDecoratorConfigInternal : T extends DecoratorTypes.FILE_IMAGE ? ImageFileDecoratorConfigInternal : T extends DecoratorTypes.CUSTOM ? CustomDecoratorConfigInternal<any, any, CustomMetadataType, any> : never;
@@ -5,6 +5,8 @@ import { Col, Position, PropertyDecoratorConfig } from './property-decorator.dat
5
5
  declare class PositionInternal implements Position {
6
6
  row: number;
7
7
  order: number;
8
+ tab: number;
9
+ tabName?: string;
8
10
  constructor(data?: Position);
9
11
  private validateInput;
10
12
  }
@@ -53,6 +53,21 @@ export declare abstract class PropertyDecoratorConfig {
53
53
  * The options for positioning a property when using default create/edit dialogs.
54
54
  */
55
55
  export interface Position {
56
+ /**
57
+ * Specifies a tab in which this property is displayed.
58
+ * If no property has the tab metadata specified no tabs are displayed.
59
+ * Ordering is ascending.
60
+ *
61
+ * @default -1 (sets this property in the first tab)
62
+ */
63
+ tab?: number;
64
+ /**
65
+ * Specifies the name of the tab. Can only be set by one property in each tab.
66
+ * Requires "tab" to be set.
67
+ *
68
+ * @default `Tab ${numberOfTheTab}`
69
+ */
70
+ tabName?: string;
56
71
  /**
57
72
  * Specifies the (bootstrap)-row in which this property is displayed.
58
73
  * Ordering is ascending.
@@ -16,6 +16,8 @@ export interface CustomDecoratorConfig<EntityType extends BaseEntityType<EntityT
16
16
  * Used in addition to default checks like required etc.
17
17
  * Needed for the edit and create dialogs.
18
18
  *
19
+ * TIP: If you need additional data for checking if the value is valid, you can define them as metadata directly on the value.
20
+ *
19
21
  * @default () => true
20
22
  */
21
23
  isValid?: (value: ValueType, omit: 'create' | 'update') => boolean;
@@ -23,6 +25,8 @@ export interface CustomDecoratorConfig<EntityType extends BaseEntityType<EntityT
23
25
  * The function that defines whether or not two of your custom values are equal.
24
26
  * Needed for the edit and create dialogs.
25
27
  *
28
+ * TIP: If you need additional data for checking if the value is valid, you can define them as metadata directly on the values.
29
+ *
26
30
  * @default (value: ValueType, valuePriorChanges: ValueType) => LodashUtilities.isEqual(value, valuePriorChanges)
27
31
  */
28
32
  isEqual?: (value: ValueType, valuePriorChanges: ValueType, metadata: CustomDecoratorConfig<EntityType, ValueType, MetadataType, ComponentType>) => boolean;
@@ -70,6 +70,7 @@ export declare class DefaultFileDecoratorConfigInternal extends PropertyDecorato
70
70
  maxSizeErrorDialog: ConfirmDialogData;
71
71
  maxSizeTotalErrorDialog: ConfirmDialogData;
72
72
  dragAndDrop: boolean;
73
+ downloadAllButtonLabel: string;
73
74
  constructor(data: DefaultFileDecoratorConfig);
74
75
  }
75
76
  /**
@@ -88,5 +89,6 @@ export declare class ImageFileDecoratorConfigInternal extends PropertyDecoratorC
88
89
  maxSizeErrorDialog: ConfirmDialogData;
89
90
  maxSizeTotalErrorDialog: ConfirmDialogData;
90
91
  dragAndDrop: boolean;
92
+ downloadAllButtonLabel: string;
91
93
  constructor(data: ImageFileDecoratorConfig);
92
94
  }
@@ -61,10 +61,18 @@ declare abstract class FileDecoratorConfig extends PropertyDecoratorConfig {
61
61
  /**
62
62
  * Defines whether or not a dropdown box is displayed.
63
63
  *
64
- * @default true // when multiple is set to true.
64
+ * @default
65
+ * true // when multiple is set to true.
65
66
  * false // when multiple is set to false.
66
67
  */
67
68
  dragAndDrop?: boolean;
69
+ /**
70
+ * The label of the button to download all files.
71
+ * Is only shown when the property contains multiple files.
72
+ *
73
+ * @default 'Download All'
74
+ */
75
+ downloadAllButtonLabel?: string;
68
76
  }
69
77
  /**
70
78
  * Definition for a default file.
@@ -1,6 +1,6 @@
1
1
  import { DropdownValue } from '../base/dropdown-value.interface';
2
2
  import { PropertyDecoratorConfigInternal } from '../base/property-decorator-internal.data';
3
- import { DefaultNumberDecoratorConfig, DropdownNumberDecoratorConfig } from './number-decorator.data';
3
+ import { DefaultNumberDecoratorConfig, DropdownNumberDecoratorConfig, SliderNumberDecoratorConfig } from './number-decorator.data';
4
4
  /**
5
5
  * The internal DefaultNumberDecoratorConfig. Sets default values.
6
6
  */
@@ -18,3 +18,22 @@ export declare class DropdownNumberDecoratorConfigInternal extends PropertyDecor
18
18
  dropdownValues: DropdownValue<number>[];
19
19
  constructor(data: DropdownNumberDecoratorConfig);
20
20
  }
21
+ /**
22
+ * The internal SliderNumberDecoratorConfig. Sets default values.
23
+ */
24
+ export declare class SliderNumberDecoratorConfigInternal extends PropertyDecoratorConfigInternal implements SliderNumberDecoratorConfig {
25
+ displayStyle: 'slider';
26
+ min?: number;
27
+ max?: number;
28
+ step?: number;
29
+ formatThumbLabelValue: (value: number) => string | number;
30
+ tickInterval?: number | 'auto';
31
+ constructor(data: SliderNumberDecoratorConfig);
32
+ }
33
+ /**
34
+ * The default function to format values for the number slider thumb label.
35
+ *
36
+ * @param value - The value of the slider.
37
+ * @returns Just the value without any formatting done.
38
+ */
39
+ export declare function defaultFormatThumbLabelValue(value: number): number;
@@ -7,7 +7,7 @@ declare abstract class NumberDecoratorConfig extends PropertyDecoratorConfig {
7
7
  /**
8
8
  * Whether to display the number in a single line or as a dropdown.
9
9
  */
10
- displayStyle: 'line' | 'dropdown';
10
+ displayStyle: 'line' | 'dropdown' | 'slider';
11
11
  }
12
12
  /**
13
13
  * The configuration options for a number property displayed in a default number input.
@@ -33,4 +33,30 @@ export interface DropdownNumberDecoratorConfig extends NumberDecoratorConfig {
33
33
  */
34
34
  dropdownValues: DropdownValue<number>[];
35
35
  }
36
+ /**
37
+ * The configuration options for a number property displayed as a slider input.
38
+ */
39
+ export interface SliderNumberDecoratorConfig extends NumberDecoratorConfig {
40
+ displayStyle: 'slider';
41
+ /**
42
+ * The minimum value of the number.
43
+ */
44
+ min?: number;
45
+ /**
46
+ * The maximum value of the number.
47
+ */
48
+ max?: number;
49
+ /**
50
+ * How big a single step is at which the thumb label will snap.
51
+ */
52
+ step?: number;
53
+ /**
54
+ * Function that transforms the value to display inside the thumb label.
55
+ */
56
+ formatThumbLabelValue?: (value: number) => string | number;
57
+ /**
58
+ * How often ticks should be displayed.
59
+ */
60
+ tickInterval?: 'auto' | number;
61
+ }
36
62
  export {};
@@ -1,8 +1,8 @@
1
- import { DefaultNumberDecoratorConfig, DropdownNumberDecoratorConfig } from './number-decorator.data';
1
+ import { DefaultNumberDecoratorConfig, DropdownNumberDecoratorConfig, SliderNumberDecoratorConfig } from './number-decorator.data';
2
2
  /**
3
3
  * Decorator for setting and getting number property metadata.
4
4
  *
5
5
  * @param metadata - The metadata of the number property.
6
6
  * @returns The method that defines the metadata.
7
7
  */
8
- export declare function number(metadata: DefaultNumberDecoratorConfig | DropdownNumberDecoratorConfig): (target: object, propertyKey: string) => void;
8
+ export declare function number(metadata: DefaultNumberDecoratorConfig | DropdownNumberDecoratorConfig | SliderNumberDecoratorConfig): (target: object, propertyKey: string) => void;
@@ -1,6 +1,6 @@
1
1
  import { DropdownValue } from '../base/dropdown-value.interface';
2
2
  import { PropertyDecoratorConfigInternal } from '../base/property-decorator-internal.data';
3
- import { AutocompleteStringDecoratorConfig, DefaultStringDecoratorConfig, DropdownStringDecoratorConfig, TextboxStringDecoratorConfig } from './string-decorator.data';
3
+ import { AutocompleteStringDecoratorConfig, DefaultStringDecoratorConfig, DropdownStringDecoratorConfig, PasswordStringDecoratorConfig, TextboxStringDecoratorConfig } from './string-decorator.data';
4
4
  /**
5
5
  * The internal DropdownStringDecoratorConfig. Sets default values.
6
6
  */
@@ -39,3 +39,16 @@ export declare class AutocompleteStringDecoratorConfigInternal extends PropertyD
39
39
  regex?: RegExp;
40
40
  constructor(data: AutocompleteStringDecoratorConfig);
41
41
  }
42
+ /**
43
+ * The internal PasswordStringDecoratorConfig. Sets default values.
44
+ */
45
+ export declare class PasswordStringDecoratorConfigInternal extends PropertyDecoratorConfigInternal implements PasswordStringDecoratorConfig {
46
+ displayStyle: 'password';
47
+ minLength?: number;
48
+ maxLength?: number;
49
+ regex?: RegExp;
50
+ needsConfirmation: boolean;
51
+ confirmationDisplayName: string;
52
+ passwordsDontMatchErrorMessage: string;
53
+ constructor(data: PasswordStringDecoratorConfig);
54
+ }
@@ -7,7 +7,7 @@ declare abstract class StringDecoratorConfig extends PropertyDecoratorConfig {
7
7
  /**
8
8
  * How to display the string.
9
9
  */
10
- displayStyle: 'line' | 'textbox' | 'autocomplete' | 'dropdown';
10
+ displayStyle: 'line' | 'textbox' | 'autocomplete' | 'dropdown' | 'password';
11
11
  }
12
12
  /**
13
13
  * The configuration options for a string property displayed as a dropdown.
@@ -74,4 +74,40 @@ export interface AutocompleteStringDecoratorConfig extends StringDecoratorConfig
74
74
  */
75
75
  regex?: RegExp;
76
76
  }
77
+ /**
78
+ * The configuration options for a string property displayed in a password input.
79
+ */
80
+ export interface PasswordStringDecoratorConfig extends StringDecoratorConfig {
81
+ displayStyle: 'password';
82
+ /**
83
+ * The minimum required length of the password.
84
+ */
85
+ minLength?: number;
86
+ /**
87
+ * The maximum required length of the password.
88
+ */
89
+ maxLength?: number;
90
+ /**
91
+ * A regex used for validation.
92
+ */
93
+ regex?: RegExp;
94
+ /**
95
+ * Whether or not the password needs to be retyped.
96
+ *
97
+ * @default true
98
+ */
99
+ needsConfirmation?: boolean;
100
+ /**
101
+ * The display name of the confirmation password input.
102
+ *
103
+ * @default 'Confirm Password'
104
+ */
105
+ confirmationDisplayName?: string;
106
+ /**
107
+ * The error message to display when the password and the confirm password don't match.
108
+ *
109
+ * @default 'Passwords need to match!'
110
+ */
111
+ passwordsDontMatchErrorMessage?: string;
112
+ }
77
113
  export {};
@@ -1,8 +1,8 @@
1
- import { AutocompleteStringDecoratorConfig, DefaultStringDecoratorConfig, DropdownStringDecoratorConfig, TextboxStringDecoratorConfig } from './string-decorator.data';
1
+ import { AutocompleteStringDecoratorConfig, DefaultStringDecoratorConfig, DropdownStringDecoratorConfig, PasswordStringDecoratorConfig, TextboxStringDecoratorConfig } from './string-decorator.data';
2
2
  /**
3
3
  * Decorator for setting and getting string Property metadata.
4
4
  *
5
5
  * @param metadata - The metadata of the string property.
6
6
  * @returns The method that defines the metadata.
7
7
  */
8
- export declare function string(metadata: DropdownStringDecoratorConfig | AutocompleteStringDecoratorConfig | DefaultStringDecoratorConfig | TextboxStringDecoratorConfig): (target: object, propertyKey: string) => void;
8
+ export declare function string(metadata: DropdownStringDecoratorConfig | AutocompleteStringDecoratorConfig | DefaultStringDecoratorConfig | TextboxStringDecoratorConfig | PasswordStringDecoratorConfig): (target: object, propertyKey: string) => void;
@@ -0,0 +1,18 @@
1
+ import JSZip from 'jszip';
2
+ // TODO: Find a way to use blobs with jest
3
+ /* istanbul ignore next */
4
+ /**
5
+ * Encapsulates JSZip functionality.
6
+ */
7
+ export class JSZipUtilities {
8
+ /**
9
+ * Generates a new JSZip object that is correctly typed.
10
+ *
11
+ * @returns A new JSZip object.
12
+ */
13
+ static new() {
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
15
+ return new JSZip();
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianN6aXAudXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY2Fwc3VsYXRpb24vanN6aXAudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUkxQiwwQ0FBMEM7QUFDMUMsMEJBQTBCO0FBQzFCOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixjQUFjO0lBQ2hDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsR0FBRztRQUNOLDZEQUE2RDtRQUM3RCxPQUFPLElBQUksS0FBSyxFQUFlLENBQUM7SUFDcEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBsaWNhdGUtaW1wb3J0c1xuaW1wb3J0ICogYXMgSlNaaXBUeXBlIGZyb20gJ2pzemlwJzsgLy8gPC0tIFRoaXMgaXMgbmVlZGVkIHRvIHByb3ZpZGUgdHlwZSBzYWZldHkuXG5cbi8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKlxuICogRW5jYXBzdWxhdGVzIEpTWmlwIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKU1ppcFV0aWxpdGllcyB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IEpTWmlwIG9iamVjdCB0aGF0IGlzIGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEpTWmlwIG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgbmV3KCk6IEpTWmlwVHlwZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGxcbiAgICAgICAgcmV0dXJuIG5ldyBKU1ppcCgpIGFzIEpTWmlwVHlwZTtcbiAgICB9XG59Il19
@@ -66,4 +66,4 @@ export class ReflectUtilities {
66
66
  Reflect.defineMetadata(metadataKey, metadataValue, target, propertyKey);
67
67
  }
68
68
  }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdC51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQ2xDOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFtQixXQUFtQixFQUFFLE1BQVMsRUFBRSxXQUFvQjtRQUNyRixPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFxQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQW1CLE1BQVM7UUFDdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZ0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsTUFBUyxFQUFFLFdBQW9CO1FBQ3hELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFtQixNQUFTLEVBQUUsV0FBb0IsRUFBRSxLQUFjO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFtQixNQUFTLEVBQUUsV0FBb0I7UUFDeEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQ2pCLFdBQW9CLEVBQ3BCLGFBQXNCLEVBQ3RCLE1BQVMsRUFDVCxXQUFtQjtRQUVuQixPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIGZ1bmN0aW9uYWxpdHkgb2YgUmVmbGVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlZmxlY3RVdGlsaXRpZXMge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgLSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0PihtZXRhZGF0YUtleTogc3RyaW5nLCB0YXJnZXQ6IFQsIHByb3BlcnR5S2V5OiBrZXlvZiBUKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGFuZCBzeW1ib2wga2V5cyBvZiB0aGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LiBUaGUgb3duIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG4gICAgICogYXJlIHRob3NlIHRoYXQgYXJlIGRlZmluZWQgZGlyZWN0bHkgb24gdGhhdCBvYmplY3QsIGFuZCBhcmUgbm90IGluaGVyaXRlZCBmcm9tIHRoZSBvYmplY3QncyBwcm90b3R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIG93biBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXlzIG9mIHRoZSBnaXZlbiBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIG93bktleXM8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBUKTogKGtleW9mIFQpW10ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCkgYXMgKGtleW9mIFQpW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydHkgb2YgdGFyZ2V0LCBlcXVpdmFsZW50IHRvIGB0YXJnZXRbcHJvcGVydHlLZXldYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkgb24gaXRzZWxmIG9yIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHByb3BlcnR5IG9mIHRoZSB0YXJnZXQgb2YgdGhlIGdpdmVuIGtleS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0PFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogVCwgcHJvcGVydHlLZXk6IGtleW9mIFQpOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9mIHRhcmdldCwgZXF1aXZhbGVudCB0byBgdGFyZ2V0W3Byb3BlcnR5S2V5XSA9IHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkgb24gaXRzZWxmIG9yIGluIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG5hbWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uXG4gICAgICogQHJldHVybnMgSWYgc2V0dGluZyB0aGUgdmFsdWUgd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICovXG4gICAgc3RhdGljIHNldDxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFQsIHByb3BlcnR5S2V5OiBrZXlvZiBULCB2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYHByb3BlcnR5S2V5IGluIHRhcmdldGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5IG9uIGl0c2VsZiBvciBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIE5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0YXJnZXQgaGFzIHRoZSBrZXkuXG4gICAgICovXG4gICAgc3RhdGljIGhhczxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFQsIHByb3BlcnR5S2V5OiBrZXlvZiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSAtIEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIC0gQSB2YWx1ZSB0aGF0IGNvbnRhaW5zIGF0dGFjaGVkIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgICAgIG1ldGFkYXRhS2V5OiB1bmtub3duLFxuICAgICAgICBtZXRhZGF0YVZhbHVlOiB1bmtub3duLFxuICAgICAgICB0YXJnZXQ6IFQsXG4gICAgICAgIHByb3BlcnR5S2V5OiBzdHJpbmdcbiAgICApOiB2b2lkIHtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfVxufSJdfQ==
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdC51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQ2xDOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFtQixXQUFtQixFQUFFLE1BQVMsRUFBRSxXQUFvQjtRQUNyRixPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFxQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQW1CLE1BQVM7UUFDdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZ0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsTUFBUyxFQUFFLFdBQW9CO1FBQ3hELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFtQixNQUFTLEVBQUUsV0FBb0IsRUFBRSxLQUFjO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFtQixNQUFTLEVBQUUsV0FBb0I7UUFDeEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQ2pCLFdBQW9CLEVBQ3BCLGFBQXNCLEVBQ3RCLE1BQVMsRUFDVCxXQUFvQjtRQUVwQixPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQXFCLENBQUMsQ0FBQztJQUN0RixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogRW5jYXBzdWxhdGVzIGFsbCBmdW5jdGlvbmFsaXR5IG9mIFJlZmxlY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0VXRpbGl0aWVzIHtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IC0gQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdD4obWV0YWRhdGFLZXk6IHN0cmluZywgdGFyZ2V0OiBULCBwcm9wZXJ0eUtleToga2V5b2YgVCk6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBhbmQgc3ltYm9sIGtleXMgb2YgdGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4gVGhlIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuICAgICAqIGFyZSB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkIGRpcmVjdGx5IG9uIHRoYXQgb2JqZWN0LCBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgb2JqZWN0J3MgcHJvdG90eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCAtIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBvd24gcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBvd25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+KHRhcmdldDogVCk6IChrZXlvZiBUKVtdIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpIGFzIChrZXlvZiBUKVtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG9mIHRhcmdldCwgZXF1aXZhbGVudCB0byBgdGFyZ2V0W3Byb3BlcnR5S2V5XWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5IG9uIGl0c2VsZiBvciBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBnaXZlbiBrZXkuXG4gICAgICovXG4gICAgc3RhdGljIGdldDxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFQsIHByb3BlcnR5S2V5OiBrZXlvZiBUKTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSBvZiB0YXJnZXQsIGVxdWl2YWxlbnQgdG8gYHRhcmdldFtwcm9wZXJ0eUtleV0gPSB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5IG9uIGl0c2VsZiBvciBpbiBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLlxuICAgICAqIEByZXR1cm5zIElmIHNldHRpbmcgdGhlIHZhbHVlIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqL1xuICAgIHN0YXRpYyBzZXQ8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBULCBwcm9wZXJ0eUtleToga2V5b2YgVCwgdmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBwcm9wZXJ0eUtleSBpbiB0YXJnZXRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCAtIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSBvbiBpdHNlbGYgb3IgaW4gaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gdGFyZ2V0IGhhcyB0aGUga2V5LlxuICAgICAqL1xuICAgIHN0YXRpYyBoYXM8VCBleHRlbmRzIG9iamVjdD4odGFyZ2V0OiBULCBwcm9wZXJ0eUtleToga2V5b2YgVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIGEgdW5pcXVlIG1ldGFkYXRhIGVudHJ5IG9uIHRoZSB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgLSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSAtIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICovXG4gICAgc3RhdGljIGRlZmluZU1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgICAgICBtZXRhZGF0YUtleTogdW5rbm93bixcbiAgICAgICAgbWV0YWRhdGFWYWx1ZTogdW5rbm93bixcbiAgICAgICAgdGFyZ2V0OiBULFxuICAgICAgICBwcm9wZXJ0eUtleToga2V5b2YgVFxuICAgICk6IHZvaWQge1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5IGFzIHN0cmluZyk7XG4gICAgfVxufSJdfQ==