@decaf-ts/for-angular 0.0.12 → 0.0.14

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 (143) hide show
  1. package/{dist/lib/components → components}/component-renderer/component-renderer.component.d.ts +0 -1
  2. package/{dist/lib/components → components}/crud-field/crud-field.component.d.ts +0 -1
  3. package/{dist/lib/components → components}/crud-form/constants.d.ts +0 -1
  4. package/{dist/lib/components → components}/crud-form/crud-form.component.d.ts +0 -1
  5. package/{dist/lib/components → components}/crud-form/types.d.ts +0 -1
  6. package/{dist/lib/components → components}/empty-state/empty-state.component.d.ts +0 -1
  7. package/{dist/lib/components → components}/fieldset/fieldset.component.d.ts +0 -1
  8. package/{dist/lib/components → components}/filter/filter.component.d.ts +0 -1
  9. package/{dist/lib/components → components}/for-angular-components.module.d.ts +0 -1
  10. package/{dist/lib/components → components}/index.d.ts +0 -1
  11. package/{dist/lib/components → components}/layout/layout.component.d.ts +0 -1
  12. package/{dist/lib/components → components}/list/constants.d.ts +0 -1
  13. package/{dist/lib/components → components}/list/list.component.d.ts +0 -1
  14. package/{dist/lib/components → components}/list-item/list-item.component.d.ts +0 -1
  15. package/{dist/lib/components → components}/model-renderer/model-renderer.component.d.ts +0 -1
  16. package/{dist/lib/components → components}/pagination/constants.d.ts +0 -1
  17. package/{dist/lib/components → components}/pagination/pagination.component.d.ts +0 -1
  18. package/{dist/lib/components → components}/searchbar/searchbar.component.d.ts +0 -1
  19. package/{dist/lib/directives → directives}/collapsable.directive.d.ts +0 -1
  20. package/{dist/lib/directives → directives}/index.d.ts +0 -1
  21. package/{dist/lib/engine → engine}/DynamicModule.d.ts +0 -1
  22. package/{dist/lib/engine → engine}/NgxBaseComponent.d.ts +0 -1
  23. package/{dist/lib/engine → engine}/NgxCrudFormField.d.ts +0 -1
  24. package/{dist/lib/engine → engine}/NgxFormService.d.ts +0 -1
  25. package/{dist/lib/engine → engine}/NgxRenderingEngine.d.ts +0 -1
  26. package/{dist/lib/engine → engine}/NgxRenderingEngine2.d.ts +0 -1
  27. package/{dist/lib/engine → engine}/ValidatorFactory.d.ts +0 -1
  28. package/{dist/lib/engine → engine}/constants.d.ts +0 -1
  29. package/{dist/lib/engine → engine}/decorators.d.ts +0 -1
  30. package/{dist/lib/engine → engine}/index.d.ts +0 -1
  31. package/{dist/lib/engine → engine}/types.d.ts +0 -1
  32. package/esm2022/components/component-renderer/component-renderer.component.mjs +313 -0
  33. package/esm2022/components/crud-field/crud-field.component.mjs +301 -0
  34. package/esm2022/components/crud-form/crud-form.component.mjs +139 -0
  35. package/esm2022/components/empty-state/empty-state.component.mjs +348 -0
  36. package/esm2022/components/fieldset/fieldset.component.mjs +225 -0
  37. package/esm2022/components/filter/filter.component.mjs +689 -0
  38. package/esm2022/components/for-angular-components.module.mjs +71 -0
  39. package/esm2022/components/layout/layout.component.mjs +176 -0
  40. package/esm2022/components/list/list.component.mjs +1236 -0
  41. package/esm2022/components/list-item/list-item.component.mjs +408 -0
  42. package/esm2022/components/model-renderer/model-renderer.component.mjs +138 -0
  43. package/esm2022/components/pagination/pagination.component.mjs +323 -0
  44. package/esm2022/components/searchbar/searchbar.component.mjs +493 -0
  45. package/esm2022/directives/collapsable.directive.mjs +28 -0
  46. package/esm2022/engine/NgxBaseComponent.mjs +539 -0
  47. package/esm2022/for-angular.module.mjs +118 -0
  48. package/{dist/lib/fesm2022 → fesm2022}/decaf-ts-for-angular.mjs +621 -1805
  49. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  50. package/{dist/lib/for-angular.module.d.ts → for-angular.module.d.ts} +0 -1
  51. package/{dist/lib/helpers → helpers}/index.d.ts +0 -1
  52. package/{dist/lib/helpers → helpers}/utils.d.ts +0 -1
  53. package/{dist/lib/index.d.ts → index.d.ts} +0 -1
  54. package/{dist/lib/interfaces.d.ts → interfaces.d.ts} +0 -1
  55. package/package.json +19 -95
  56. package/{dist/lib/public-apis.d.ts → public-apis.d.ts} +0 -1
  57. package/LICENSE.md +0 -659
  58. package/dist/for-angular/cli/cli-module.d.ts +0 -22
  59. package/dist/for-angular/cli/cli-module.d.ts.map +0 -1
  60. package/dist/for-angular/cli/cli-module.js +0 -131
  61. package/dist/for-angular/cli/cli-module.js.map +0 -1
  62. package/dist/lib/README.md +0 -92
  63. package/dist/lib/components/component-renderer/component-renderer.component.d.ts.map +0 -1
  64. package/dist/lib/components/crud-field/crud-field.component.d.ts.map +0 -1
  65. package/dist/lib/components/crud-form/constants.d.ts.map +0 -1
  66. package/dist/lib/components/crud-form/crud-form.component.d.ts.map +0 -1
  67. package/dist/lib/components/crud-form/types.d.ts.map +0 -1
  68. package/dist/lib/components/empty-state/empty-state.component.d.ts.map +0 -1
  69. package/dist/lib/components/fieldset/fieldset.component.d.ts.map +0 -1
  70. package/dist/lib/components/filter/filter.component.d.ts.map +0 -1
  71. package/dist/lib/components/for-angular-components.module.d.ts.map +0 -1
  72. package/dist/lib/components/index.d.ts.map +0 -1
  73. package/dist/lib/components/layout/layout.component.d.ts.map +0 -1
  74. package/dist/lib/components/list/constants.d.ts.map +0 -1
  75. package/dist/lib/components/list/list.component.d.ts.map +0 -1
  76. package/dist/lib/components/list-item/list-item.component.d.ts.map +0 -1
  77. package/dist/lib/components/model-renderer/model-renderer.component.d.ts.map +0 -1
  78. package/dist/lib/components/pagination/constants.d.ts.map +0 -1
  79. package/dist/lib/components/pagination/pagination.component.d.ts.map +0 -1
  80. package/dist/lib/components/searchbar/searchbar.component.d.ts.map +0 -1
  81. package/dist/lib/decaf-ts-for-angular.d.ts.map +0 -1
  82. package/dist/lib/directives/collapsable.directive.d.ts.map +0 -1
  83. package/dist/lib/directives/index.d.ts.map +0 -1
  84. package/dist/lib/engine/DynamicModule.d.ts.map +0 -1
  85. package/dist/lib/engine/NgxBaseComponent.d.ts.map +0 -1
  86. package/dist/lib/engine/NgxCrudFormField.d.ts.map +0 -1
  87. package/dist/lib/engine/NgxFormService.d.ts.map +0 -1
  88. package/dist/lib/engine/NgxRenderingEngine.d.ts.map +0 -1
  89. package/dist/lib/engine/NgxRenderingEngine2.d.ts.map +0 -1
  90. package/dist/lib/engine/ValidatorFactory.d.ts.map +0 -1
  91. package/dist/lib/engine/constants.d.ts.map +0 -1
  92. package/dist/lib/engine/decorators.d.ts.map +0 -1
  93. package/dist/lib/engine/index.d.ts.map +0 -1
  94. package/dist/lib/engine/types.d.ts.map +0 -1
  95. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +0 -359
  96. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -456
  97. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -272
  98. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -410
  99. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -250
  100. package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -906
  101. package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -72
  102. package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -245
  103. package/dist/lib/esm2022/components/list/list.component.mjs +0 -1405
  104. package/dist/lib/esm2022/components/list-item/list-item.component.mjs +0 -612
  105. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -182
  106. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -364
  107. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -503
  108. package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
  109. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -546
  110. package/dist/lib/esm2022/for-angular.module.mjs +0 -119
  111. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
  112. package/dist/lib/for-angular.module.d.ts.map +0 -1
  113. package/dist/lib/helpers/index.d.ts.map +0 -1
  114. package/dist/lib/helpers/utils.d.ts.map +0 -1
  115. package/dist/lib/interfaces.d.ts.map +0 -1
  116. package/dist/lib/public-apis.d.ts.map +0 -1
  117. /package/{dist/lib/assets → assets}/i18n/en.json +0 -0
  118. /package/{dist/lib/assets → assets}/images/angular-logo.svg +0 -0
  119. /package/{dist/lib/assets → assets}/images/decaf-logo-black.svg +0 -0
  120. /package/{dist/lib/assets → assets}/images/decaf-logo-lw.svg +0 -0
  121. /package/{dist/lib/assets → assets}/images/decaf-logo-white.svg +0 -0
  122. /package/{dist/lib/assets → assets}/images/decaf-logo.svg +0 -0
  123. /package/{dist/lib/esm2022 → esm2022}/components/crud-form/constants.mjs +0 -0
  124. /package/{dist/lib/esm2022 → esm2022}/components/crud-form/types.mjs +0 -0
  125. /package/{dist/lib/esm2022 → esm2022}/components/index.mjs +0 -0
  126. /package/{dist/lib/esm2022 → esm2022}/components/list/constants.mjs +0 -0
  127. /package/{dist/lib/esm2022 → esm2022}/components/pagination/constants.mjs +0 -0
  128. /package/{dist/lib/esm2022 → esm2022}/decaf-ts-for-angular.mjs +0 -0
  129. /package/{dist/lib/esm2022 → esm2022}/directives/index.mjs +0 -0
  130. /package/{dist/lib/esm2022 → esm2022}/engine/DynamicModule.mjs +0 -0
  131. /package/{dist/lib/esm2022 → esm2022}/engine/NgxCrudFormField.mjs +0 -0
  132. /package/{dist/lib/esm2022 → esm2022}/engine/NgxFormService.mjs +0 -0
  133. /package/{dist/lib/esm2022 → esm2022}/engine/NgxRenderingEngine.mjs +0 -0
  134. /package/{dist/lib/esm2022 → esm2022}/engine/NgxRenderingEngine2.mjs +0 -0
  135. /package/{dist/lib/esm2022 → esm2022}/engine/ValidatorFactory.mjs +0 -0
  136. /package/{dist/lib/esm2022 → esm2022}/engine/constants.mjs +0 -0
  137. /package/{dist/lib/esm2022 → esm2022}/engine/decorators.mjs +0 -0
  138. /package/{dist/lib/esm2022 → esm2022}/engine/index.mjs +0 -0
  139. /package/{dist/lib/esm2022 → esm2022}/engine/types.mjs +0 -0
  140. /package/{dist/lib/esm2022 → esm2022}/helpers/index.mjs +0 -0
  141. /package/{dist/lib/esm2022 → esm2022}/helpers/utils.mjs +0 -0
  142. /package/{dist/lib/esm2022 → esm2022}/interfaces.mjs +0 -0
  143. /package/{dist/lib/esm2022 → esm2022}/public-apis.mjs +0 -0
@@ -274,4 +274,3 @@ export declare class ComponentRendererComponent implements OnInit, OnDestroy {
274
274
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentRendererComponent, never>;
275
275
  static ɵcmp: i0.ɵɵComponentDeclaration<ComponentRendererComponent, "ngx-decaf-component-renderer", never, { "tag": { "alias": "tag"; "required": true; }; "globals": { "alias": "globals"; "required": false; }; "model": { "alias": "model"; "required": false; }; "parent": { "alias": "parent"; "required": false; }; }, { "listenEvent": "listenEvent"; }, never, never, true, never>;
276
276
  }
277
- //# sourceMappingURL=component-renderer.component.d.ts.map
@@ -443,4 +443,3 @@ export declare class CrudFieldComponent extends NgxCrudFormField implements OnIn
443
443
  static ɵfac: i0.ɵɵFactoryDeclaration<CrudFieldComponent, never>;
444
444
  static ɵcmp: i0.ɵɵComponentDeclaration<CrudFieldComponent, "ngx-decaf-crud-field", never, { "operation": { "alias": "operation"; "required": true; }; "name": { "alias": "name"; "required": true; }; "path": { "alias": "path"; "required": true; }; "childOf": { "alias": "childOf"; "required": false; }; "type": { "alias": "type"; "required": true; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "label": { "alias": "label"; "required": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "format": { "alias": "format"; "required": false; }; "hidden": { "alias": "hidden"; "required": false; }; "max": { "alias": "max"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "min": { "alias": "min"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "required": { "alias": "required"; "required": false; }; "step": { "alias": "step"; "required": false; }; "equals": { "alias": "equals"; "required": false; }; "different": { "alias": "different"; "required": false; }; "lessThan": { "alias": "lessThan"; "required": false; }; "lessThanOrEqual": { "alias": "lessThanOrEqual"; "required": false; }; "greaterThan": { "alias": "greaterThan"; "required": false; }; "greaterThanOrEqual": { "alias": "greaterThanOrEqual"; "required": false; }; "cols": { "alias": "cols"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "alignment": { "alias": "alignment"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "justify": { "alias": "justify"; "required": false; }; "cancelText": { "alias": "cancelText"; "required": false; }; "interface": { "alias": "interface"; "required": false; }; "options": { "alias": "options"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "spellcheck": { "alias": "spellcheck"; "required": false; }; "inputmode": { "alias": "inputmode"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "fill": { "alias": "fill"; "required": false; }; "labelPlacement": { "alias": "labelPlacement"; "required": false; }; "updateOn": { "alias": "updateOn"; "required": false; }; "formGroup": { "alias": "formGroup"; "required": false; }; "formControl": { "alias": "formControl"; "required": false; }; "translatable": { "alias": "translatable"; "required": false; }; "uid": { "alias": "uid"; "required": false; }; }, {}, never, never, true, never>;
445
445
  }
446
- //# sourceMappingURL=crud-field.component.d.ts.map
@@ -3,4 +3,3 @@ export declare const CssClasses: {
3
3
  BUTTONS_CONTAINER: string;
4
4
  };
5
5
  export declare const DefaultFormReactiveOptions: CrudFormOptions;
6
- //# sourceMappingURL=constants.d.ts.map
@@ -100,4 +100,3 @@ export declare class CrudFormComponent implements OnInit, FormElement, OnDestroy
100
100
  static ɵfac: i0.ɵɵFactoryDeclaration<CrudFormComponent, never>;
101
101
  static ɵcmp: i0.ɵɵComponentDeclaration<CrudFormComponent, "ngx-decaf-crud-form", never, { "model": { "alias": "model"; "required": false; }; "updateOn": { "alias": "updateOn"; "required": false; }; "target": { "alias": "target"; "required": false; }; "method": { "alias": "method"; "required": false; }; "options": { "alias": "options"; "required": false; }; "action": { "alias": "action"; "required": false; }; "operation": { "alias": "operation"; "required": true; }; "handlers": { "alias": "handlers"; "required": false; }; "formGroup": { "alias": "formGroup"; "required": false; }; "childOf": { "alias": "childOf"; "required": false; }; "rendererId": { "alias": "rendererId"; "required": false; }; "uid": { "alias": "uid"; "required": false; }; }, { "submitEvent": "submitEvent"; }, never, ["*"], true, never>;
102
102
  }
103
- //# sourceMappingURL=crud-form.component.d.ts.map
@@ -15,4 +15,3 @@ export interface CrudFormOptions {
15
15
  };
16
16
  };
17
17
  }
18
- //# sourceMappingURL=types.d.ts.map
@@ -299,4 +299,3 @@ export declare class EmptyStateComponent extends NgxBaseComponent implements OnI
299
299
  static ɵfac: i0.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
300
300
  static ɵcmp: i0.ɵɵComponentDeclaration<EmptyStateComponent, "ngx-decaf-empty-state", never, { "title": { "alias": "title"; "required": false; }; "titleColor": { "alias": "titleColor"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "subtitleColor": { "alias": "subtitleColor"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconSize": { "alias": "iconSize"; "required": false; }; "iconColor": { "alias": "iconColor"; "required": false; }; "buttonLink": { "alias": "buttonLink"; "required": false; }; "buttonText": { "alias": "buttonText"; "required": false; }; "buttonFill": { "alias": "buttonFill"; "required": false; }; "buttonColor": { "alias": "buttonColor"; "required": false; }; "buttonSize": { "alias": "buttonSize"; "required": false; }; "searchValue": { "alias": "searchValue"; "required": false; }; }, {}, never, never, true, never>;
301
301
  }
302
- //# sourceMappingURL=empty-state.component.d.ts.map
@@ -197,4 +197,3 @@ export declare class FieldsetComponent implements AfterViewInit {
197
197
  static ɵfac: i0.ɵɵFactoryDeclaration<FieldsetComponent, never>;
198
198
  static ɵcmp: i0.ɵɵComponentDeclaration<FieldsetComponent, "ngx-decaf-fieldset", never, { "name": { "alias": "name"; "required": false; }; "operation": { "alias": "operation"; "required": false; }; "target": { "alias": "target"; "required": false; }; }, {}, never, ["*"], true, never>;
199
199
  }
200
- //# sourceMappingURL=fieldset.component.d.ts.map
@@ -503,4 +503,3 @@ export declare class FilterComponent extends NgxBaseComponent implements OnInit,
503
503
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterComponent, never>;
504
504
  static ɵcmp: i0.ɵɵComponentDeclaration<FilterComponent, "ngx-decaf-filter", never, { "indexes": { "alias": "indexes"; "required": false; }; "conditions": { "alias": "conditions"; "required": false; }; "sortBy": { "alias": "sortBy"; "required": false; }; "disableSort": { "alias": "disableSort"; "required": false; }; }, { "filterEvent": "filterEvent"; "searchEvent": "searchEvent"; }, never, never, true, never>;
505
505
  }
506
- //# sourceMappingURL=filter.component.d.ts.map
@@ -18,4 +18,3 @@ export declare class ForAngularComponentsModule {
18
18
  static ɵmod: i0.ɵɵNgModuleDeclaration<ForAngularComponentsModule, never, [typeof i1.ModelRendererComponent, typeof i2.ComponentRendererComponent, typeof i3.CrudFieldComponent, typeof i4.CrudFormComponent, typeof i5.EmptyStateComponent, typeof i6.ListComponent, typeof i7.ListItemComponent, typeof i8.SearchbarComponent, typeof i9.PaginationComponent, typeof i4.CrudFormComponent, typeof i10.FieldsetComponent, typeof i11.LayoutComponent, typeof i12.FilterComponent, typeof i13.CollapsableDirective], [typeof i1.ModelRendererComponent, typeof i2.ComponentRendererComponent, typeof i3.CrudFieldComponent, typeof i4.CrudFormComponent, typeof i5.EmptyStateComponent, typeof i6.ListComponent, typeof i7.ListItemComponent, typeof i8.SearchbarComponent, typeof i9.PaginationComponent, typeof i4.CrudFormComponent, typeof i10.FieldsetComponent, typeof i11.LayoutComponent, typeof i12.FilterComponent, typeof i13.CollapsableDirective, typeof i14.ForAngularModule]>;
19
19
  static ɵinj: i0.ɵɵInjectorDeclaration<ForAngularComponentsModule>;
20
20
  }
21
- //# sourceMappingURL=for-angular-components.module.d.ts.map
@@ -14,4 +14,3 @@ export * from './crud-form/constants';
14
14
  export * from './list/constants';
15
15
  export * from './pagination/constants';
16
16
  export * from './for-angular-components.module';
17
- //# sourceMappingURL=index.d.ts.map
@@ -131,4 +131,3 @@ export declare class LayoutComponent extends NgxBaseComponent implements OnInit
131
131
  static ɵfac: i0.ɵɵFactoryDeclaration<LayoutComponent, never>;
132
132
  static ɵcmp: i0.ɵɵComponentDeclaration<LayoutComponent, "ngx-decaf-layout", never, { "cols": { "alias": "cols"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "breakpoint": { "alias": "breakpoint"; "required": false; }; "children": { "alias": "children"; "required": false; }; }, {}, never, never, true, never>;
133
133
  }
134
- //# sourceMappingURL=layout.component.d.ts.map
@@ -27,4 +27,3 @@ export type DecafRepositoryAdapter = Adapter<Map<string, Map<string | number, an
27
27
  UUIID?: string;
28
28
  }>>;
29
29
  export type DecafRepository<M extends Model> = Repository<M, RawQuery<any>, DecafRepositoryAdapter, RepositoryFlags, Context<RepositoryFlags>>;
30
- //# sourceMappingURL=constants.d.ts.map
@@ -847,4 +847,3 @@ export declare class ListComponent extends NgxBaseComponent implements OnInit, O
847
847
  static ɵfac: i0.ɵɵFactoryDeclaration<ListComponent, never>;
848
848
  static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "ngx-decaf-list", never, { "type": { "alias": "type"; "required": false; }; "translatable": { "alias": "translatable"; "required": false; }; "showSearchbar": { "alias": "showSearchbar"; "required": false; }; "data": { "alias": "data"; "required": false; }; "source": { "alias": "source"; "required": false; }; "start": { "alias": "start"; "required": false; }; "limit": { "alias": "limit"; "required": false; }; "loadMoreData": { "alias": "loadMoreData"; "required": false; }; "lines": { "alias": "lines"; "required": false; }; "inset": { "alias": "inset"; "required": false; }; "scrollThreshold": { "alias": "scrollThreshold"; "required": false; }; "scrollPosition": { "alias": "scrollPosition"; "required": false; }; "loadingText": { "alias": "loadingText"; "required": false; }; "showRefresher": { "alias": "showRefresher"; "required": false; }; "loadingSpinner": { "alias": "loadingSpinner"; "required": false; }; "enableFilter": { "alias": "enableFilter"; "required": false; }; "sortDirection": { "alias": "sortDirection"; "required": false; }; "sortBy": { "alias": "sortBy"; "required": false; }; "disableSort": { "alias": "disableSort"; "required": false; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; }; "empty": { "alias": "empty"; "required": false; }; }, { "refreshEvent": "refreshEvent"; "clickEvent": "clickEvent"; }, never, ["*"], true, never>;
849
849
  }
850
- //# sourceMappingURL=list.component.d.ts.map
@@ -388,4 +388,3 @@ export declare class ListItemComponent extends NgxBaseComponent implements OnIni
388
388
  static ɵfac: i0.ɵɵFactoryDeclaration<ListItemComponent, never>;
389
389
  static ɵcmp: i0.ɵɵComponentDeclaration<ListItemComponent, "ngx-decaf-list-item", never, { "lines": { "alias": "lines"; "required": false; }; "item": { "alias": "item"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "iconSlot": { "alias": "iconSlot"; "required": false; }; "button": { "alias": "button"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "info": { "alias": "info"; "required": false; }; "subinfo": { "alias": "subinfo"; "required": false; }; }, { "clickEvent": "clickEvent"; }, never, ["[slot='end']"], true, never>;
390
390
  }
391
- //# sourceMappingURL=list-item.component.d.ts.map
@@ -94,4 +94,3 @@ export declare class ModelRendererComponent<M extends Model> implements OnChange
94
94
  static ɵfac: i0.ɵɵFactoryDeclaration<ModelRendererComponent<any>, never>;
95
95
  static ɵcmp: i0.ɵɵComponentDeclaration<ModelRendererComponent<any>, "ngx-decaf-model-renderer", never, { "model": { "alias": "model"; "required": true; }; "globals": { "alias": "globals"; "required": false; }; "rendererId": { "alias": "rendererId"; "required": false; }; }, { "listenEvent": "listenEvent"; }, never, never, true, never>;
96
96
  }
97
- //# sourceMappingURL=model-renderer.component.d.ts.map
@@ -5,4 +5,3 @@ export type PaginationCustomEvent = BaseCustomEvent & {
5
5
  direction: 'next' | 'previous';
6
6
  };
7
7
  };
8
- //# sourceMappingURL=constants.d.ts.map
@@ -262,4 +262,3 @@ export declare class PaginationComponent extends NgxBaseComponent implements OnI
262
262
  static ɵfac: i0.ɵɵFactoryDeclaration<PaginationComponent, never>;
263
263
  static ɵcmp: i0.ɵɵComponentDeclaration<PaginationComponent, "ngx-decaf-pagination", never, { "totalPages": { "alias": "totalPages"; "required": true; }; "current": { "alias": "current"; "required": false; }; }, { "clickEvent": "clickEvent"; }, never, never, true, never>;
264
264
  }
265
- //# sourceMappingURL=pagination.component.d.ts.map
@@ -405,4 +405,3 @@ export declare class SearchbarComponent extends NgxBaseComponent implements OnIn
405
405
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchbarComponent, never>;
406
406
  static ɵcmp: i0.ɵɵComponentDeclaration<SearchbarComponent, "ngx-decaf-searchbar", never, { "autocomplete": { "alias": "autocomplete"; "required": false; }; "autocorrect": { "alias": "autocorrect"; "required": false; }; "animated": { "alias": "animated"; "required": false; }; "buttonCancelText": { "alias": "buttonCancelText"; "required": false; }; "clearIcon": { "alias": "clearIcon"; "required": false; }; "color": { "alias": "color"; "required": false; }; "debounce": { "alias": "debounce"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "enterkeyhint": { "alias": "enterkeyhint"; "required": false; }; "inputmode": { "alias": "inputmode"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "searchIcon": { "alias": "searchIcon"; "required": false; }; "showCancelButton": { "alias": "showCancelButton"; "required": false; }; "showClearButton": { "alias": "showClearButton"; "required": false; }; "spellcheck": { "alias": "spellcheck"; "required": false; }; "type": { "alias": "type"; "required": false; }; "value": { "alias": "value"; "required": false; }; "queryKeys": { "alias": "queryKeys"; "required": false; }; "isVisible": { "alias": "isVisible"; "required": false; }; "wrapper": { "alias": "wrapper"; "required": false; }; "wrapperColor": { "alias": "wrapperColor"; "required": false; }; "emitEventToWindow": { "alias": "emitEventToWindow"; "required": false; }; }, { "searchEvent": "searchEvent"; }, never, never, true, never>;
407
407
  }
408
- //# sourceMappingURL=searchbar.component.d.ts.map
@@ -6,4 +6,3 @@ export declare class CollapsableDirective implements OnInit {
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<CollapsableDirective, never>;
7
7
  static ɵdir: i0.ɵɵDirectiveDeclaration<CollapsableDirective, "[decafCollapsable]", never, {}, {}, never, never, true, never>;
8
8
  }
9
- //# sourceMappingURL=collapsable.directive.d.ts.map
@@ -1,2 +1 @@
1
1
  export * from './collapsable.directive';
2
- //# sourceMappingURL=index.d.ts.map
@@ -15,4 +15,3 @@
15
15
  */
16
16
  export declare abstract class DynamicModule {
17
17
  }
18
- //# sourceMappingURL=DynamicModule.d.ts.map
@@ -539,4 +539,3 @@ export declare abstract class NgxBaseComponent implements OnChanges {
539
539
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxBaseComponent, never>;
540
540
  static ɵcmp: i0.ɵɵComponentDeclaration<NgxBaseComponent, "ng-component", never, { "rendererId": { "alias": "rendererId"; "required": false; }; "model": { "alias": "model"; "required": false; }; "props": { "alias": "props"; "required": false; }; "item": { "alias": "item"; "required": false; }; "pk": { "alias": "pk"; "required": false; }; "route": { "alias": "route"; "required": false; }; "operations": { "alias": "operations"; "required": false; }; "uid": { "alias": "uid"; "required": false; }; "mapper": { "alias": "mapper"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "translatable": { "alias": "translatable"; "required": false; }; "className": { "alias": "className"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "renderChild": { "alias": "renderChild"; "required": false; }; }, { "listenEvent": "listenEvent"; }, never, never, true, never>;
541
541
  }
542
- //# sourceMappingURL=NgxBaseComponent.d.ts.map
@@ -116,4 +116,3 @@ export declare abstract class NgxCrudFormField implements ControlValueAccessor,
116
116
  */
117
117
  getErrors(parent: HTMLElement): string | void;
118
118
  }
119
- //# sourceMappingURL=NgxCrudFormField.d.ts.map
@@ -165,4 +165,3 @@ export declare class NgxFormService {
165
165
  */
166
166
  static reset(formGroup: FormGroup): void;
167
167
  }
168
- //# sourceMappingURL=NgxFormService.d.ts.map
@@ -125,4 +125,3 @@ export declare class NgxRenderingEngine extends RenderingEngine<AngularFieldDefi
125
125
  */
126
126
  static key(key: string): string;
127
127
  }
128
- //# sourceMappingURL=NgxRenderingEngine.d.ts.map
@@ -248,4 +248,3 @@ export declare class NgxRenderingEngine2 extends RenderingEngine<AngularFieldDef
248
248
  */
249
249
  static setInputs(component: ComponentRef<unknown>, inputs: KeyValue, metadata: ComponentMirror<unknown>): void;
250
250
  }
251
- //# sourceMappingURL=NgxRenderingEngine2.d.ts.map
@@ -13,4 +13,3 @@ export declare class ValidatorFactory {
13
13
  */
14
14
  static createProxy(control: AbstractControl): PathProxy<unknown>;
15
15
  }
16
- //# sourceMappingURL=ValidatorFactory.d.ts.map
@@ -149,4 +149,3 @@ export declare enum BaseComponentProps {
149
149
  MAPPER = "mapper",
150
150
  INITIALIZED = "initialized"
151
151
  }
152
- //# sourceMappingURL=constants.d.ts.map
@@ -23,4 +23,3 @@
23
23
  * @category Decorators
24
24
  */
25
25
  export declare function Dynamic(): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
26
- //# sourceMappingURL=decorators.d.ts.map
@@ -14,4 +14,3 @@ export * from './NgxRenderingEngine';
14
14
  export * from './NgxRenderingEngine2';
15
15
  export * from './types';
16
16
  export * from './NgxBaseComponent';
17
- //# sourceMappingURL=index.d.ts.map
@@ -379,4 +379,3 @@ export interface IFilterQuery {
379
379
  query: IFilterQueryItem[] | undefined;
380
380
  sort: ISortObject;
381
381
  }
382
- //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,313 @@
1
+ import { Component, EnvironmentInjector, EventEmitter, inject, Input, Output, reflectComponentType, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
2
+ import { NgxRenderingEngine2 } from '../../engine/NgxRenderingEngine2';
3
+ import { ForAngularModule, getLogger } from '../../for-angular.module';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * @description Dynamic component renderer for Decaf Angular applications.
8
+ * @summary This component provides a flexible way to dynamically render Angular components
9
+ * at runtime based on a tag name. It handles the creation, property binding, and event
10
+ * subscription for dynamically loaded components. This is particularly useful for
11
+ * building configurable UIs where components need to be determined at runtime.
12
+ *
13
+ * @component {ComponentRendererComponent}
14
+ * @example
15
+ * <ngx-decaf-component-renderer
16
+ * [tag]="tag"
17
+ * [globals]="globals"
18
+ * (listenEvent)="listenEvent($event)">
19
+ * </ngx-decaf-component-renderer>
20
+ *
21
+ * @mermaid
22
+ * classDiagram
23
+ * class ComponentRendererComponent {
24
+ * +ViewContainerRef vcr
25
+ * +string tag
26
+ * +Record~string, unknown~ globals
27
+ * +EnvironmentInjector injector
28
+ * +ComponentRef~unknown~ component
29
+ * +EventEmitter~RendererCustomEvent~ listenEvent
30
+ * +ngOnInit()
31
+ * +ngOnDestroy()
32
+ * +ngOnChanges(changes)
33
+ * -createComponent(tag, globals)
34
+ * -subscribeEvents()
35
+ * -unsubscribeEvents()
36
+ * }
37
+ * ComponentRendererComponent --|> OnInit
38
+ * ComponentRendererComponent --|> OnChanges
39
+ * ComponentRendererComponent --|> OnDestroy
40
+ *
41
+ * @implements {OnInit}
42
+ * @implements {OnChanges}
43
+ * @implements {OnDestroy}
44
+ */
45
+ export class ComponentRendererComponent {
46
+ /**
47
+ * @description Creates an instance of ComponentRendererComponent.
48
+ * @summary Initializes a new ComponentRendererComponent. This component doesn't require
49
+ * any dependencies to be injected in its constructor as it uses the inject function to
50
+ * obtain the EnvironmentInjector.
51
+ *
52
+ * @memberOf ComponentRendererComponent
53
+ */
54
+ constructor() {
55
+ /**
56
+ * @description Global properties to pass to the rendered component.
57
+ * @summary This input property allows passing a set of properties to the dynamically
58
+ * rendered component. These properties will be mapped to the component's inputs if they
59
+ * match. Properties that don't match any input on the target component will be filtered out
60
+ * with a warning.
61
+ *
62
+ * @type {Record<string, unknown>}
63
+ * @default {}
64
+ * @memberOf ComponentRendererComponent
65
+ */
66
+ this.globals = {};
67
+ /**
68
+ * @description Injector used for dependency injection in the dynamic component.
69
+ * @summary This injector is used when creating the dynamic component to provide it with
70
+ * access to the application's dependency injection system. It ensures that the dynamically
71
+ * created component can access the same services and dependencies as statically created
72
+ * components.
73
+ *
74
+ * @type {EnvironmentInjector}
75
+ * @memberOf ComponentRendererComponent
76
+ */
77
+ this.injector = inject(EnvironmentInjector);
78
+ /**
79
+ * @description Event emitter for events from the rendered component.
80
+ * @summary This output property emits events that originate from the dynamically rendered
81
+ * component. It allows the parent component to listen for and respond to events from the
82
+ * dynamic component, creating a communication channel between the parent and the dynamically
83
+ * rendered child.
84
+ *
85
+ * @type {EventEmitter<RendererCustomEvent>}
86
+ * @memberOf ComponentRendererComponent
87
+ */
88
+ this.listenEvent = new EventEmitter();
89
+ this.parent = undefined;
90
+ this.logger = getLogger(this);
91
+ }
92
+ /**
93
+ * @description Initializes the component after Angular first displays the data-bound properties.
94
+ * @summary Sets up the component by creating the dynamic component specified by the tag input.
95
+ * This method is called once when the component is initialized and triggers the dynamic
96
+ * component creation process with the provided tag name and global properties.
97
+ *
98
+ * @mermaid
99
+ * sequenceDiagram
100
+ * participant A as Angular Lifecycle
101
+ * participant C as ComponentRendererComponent
102
+ * participant R as NgxRenderingEngine2
103
+ *
104
+ * A->>C: ngOnInit()
105
+ * C->>C: createComponent(tag, globals)
106
+ * C->>R: components(tag)
107
+ * R-->>C: Return component constructor
108
+ * C->>C: Process component inputs
109
+ * C->>C: Create component instance
110
+ * C->>C: subscribeEvents()
111
+ *
112
+ * @return {void}
113
+ * @memberOf ComponentRendererComponent
114
+ */
115
+ ngOnInit() {
116
+ if (!this.parent) {
117
+ this.createComponent(this.tag, this.globals);
118
+ }
119
+ else {
120
+ this.createParentComponent();
121
+ }
122
+ }
123
+ /**
124
+ * @description Cleans up resources when the component is destroyed.
125
+ * @summary Performs cleanup operations when the component is being destroyed by Angular.
126
+ * This includes unsubscribing from all event emitters of the dynamic component and
127
+ * destroying the rendering engine instance to prevent memory leaks.
128
+ *
129
+ * @mermaid
130
+ * sequenceDiagram
131
+ * participant A as Angular Lifecycle
132
+ * participant C as ComponentRendererComponent
133
+ * participant R as NgxRenderingEngine2
134
+ *
135
+ * A->>C: ngOnDestroy()
136
+ * alt component exists
137
+ * C->>C: unsubscribeEvents()
138
+ * C->>R: destroy()
139
+ * end
140
+ *
141
+ * @return {Promise<void>} A promise that resolves when cleanup is complete
142
+ * @memberOf ComponentRendererComponent
143
+ */
144
+ async ngOnDestroy() {
145
+ if (this.component) {
146
+ this.unsubscribeEvents();
147
+ NgxRenderingEngine2.destroy();
148
+ }
149
+ }
150
+ /**
151
+ * @description Creates and renders a dynamic component.
152
+ * @summary This method handles the creation of a dynamic component based on the provided tag.
153
+ * It retrieves the component constructor from the rendering engine, processes its inputs,
154
+ * filters out unmapped properties, creates the component instance, and sets up event subscriptions.
155
+ *
156
+ * @param {string} tag - The tag name of the component to create
157
+ * @param {KeyValue} globals - Global properties to pass to the component
158
+ * @return {void}
159
+ *
160
+ * @mermaid
161
+ * sequenceDiagram
162
+ * participant C as ComponentRendererComponent
163
+ * participant R as NgxRenderingEngine2
164
+ * participant V as ViewContainerRef
165
+ *
166
+ * C->>R: components(tag)
167
+ * R-->>C: Return component constructor
168
+ * C->>C: reflectComponentType(component)
169
+ * C->>C: Process input properties
170
+ * C->>C: Filter unmapped properties
171
+ * C->>V: clear()
172
+ * C->>R: createComponent(component, props, metadata, vcr, injector, [])
173
+ * R-->>C: Return component reference
174
+ * C->>C: subscribeEvents()
175
+ *
176
+ * @private
177
+ * @memberOf ComponentRendererComponent
178
+ */
179
+ createComponent(tag, globals = {}) {
180
+ const component = NgxRenderingEngine2.components(tag)
181
+ ?.constructor;
182
+ const metadata = reflectComponentType(component);
183
+ const componentInputs = metadata.inputs;
184
+ const props = globals?.['item'] || globals?.['props'] || {};
185
+ if (props?.['tag'])
186
+ delete props['tag'];
187
+ const inputKeys = Object.keys(props);
188
+ const unmappedKeys = [];
189
+ for (const input of inputKeys) {
190
+ if (!inputKeys.length)
191
+ break;
192
+ const prop = componentInputs.find((item) => item.propName === input);
193
+ if (!prop) {
194
+ delete props[input];
195
+ unmappedKeys.push(input);
196
+ }
197
+ }
198
+ this.vcr.clear();
199
+ this.component = NgxRenderingEngine2.createComponent(component, props, metadata, this.vcr, this.injector, []);
200
+ this.subscribeEvents();
201
+ }
202
+ createParentComponent() {
203
+ const { component, inputs } = this.parent;
204
+ const metadata = reflectComponentType(component);
205
+ const template = this.vcr.createEmbeddedView(this.inner, this.injector).rootNodes;
206
+ this.component = NgxRenderingEngine2.createComponent(component, inputs, metadata, this.vcr, this.injector, template);
207
+ this.subscribeEvents();
208
+ }
209
+ /**
210
+ * @description Subscribes to events emitted by the dynamic component.
211
+ * @summary This method sets up subscriptions to all EventEmitter properties of the
212
+ * dynamically created component. When an event is emitted by the dynamic component,
213
+ * it is captured and re-emitted through the listenEvent output property with additional
214
+ * metadata about the event source.
215
+ *
216
+ * @mermaid
217
+ * sequenceDiagram
218
+ * participant C as ComponentRendererComponent
219
+ * participant D as Dynamic Component
220
+ * participant P as Parent Component
221
+ *
222
+ * C->>C: subscribeEvents()
223
+ * C->>D: Get instance properties
224
+ * loop For each property
225
+ * C->>C: Check if property is EventEmitter
226
+ * alt is EventEmitter
227
+ * C->>D: Subscribe to event
228
+ * D-->>C: Event emitted
229
+ * C->>P: Re-emit event with metadata
230
+ * end
231
+ * end
232
+ *
233
+ * @private
234
+ * @return {void}
235
+ * @memberOf ComponentRendererComponent
236
+ */
237
+ subscribeEvents() {
238
+ if (this.component) {
239
+ const instance = this.component?.instance;
240
+ const componentKeys = Object.keys(instance);
241
+ for (const key of componentKeys) {
242
+ const value = instance[key];
243
+ if (value instanceof EventEmitter)
244
+ instance[key].subscribe((event) => {
245
+ this.listenEvent.emit({
246
+ name: key,
247
+ ...event,
248
+ });
249
+ });
250
+ }
251
+ }
252
+ }
253
+ /**
254
+ * @description Unsubscribes from all events of the dynamic component.
255
+ * @summary This method cleans up event subscriptions when the component is being destroyed.
256
+ * It iterates through all properties of the dynamic component instance and unsubscribes
257
+ * from any EventEmitter properties to prevent memory leaks and unexpected behavior after
258
+ * the component is destroyed.
259
+ *
260
+ * @mermaid
261
+ * sequenceDiagram
262
+ * participant C as ComponentRendererComponent
263
+ * participant D as Dynamic Component
264
+ *
265
+ * C->>C: unsubscribeEvents()
266
+ * C->>D: Get instance properties
267
+ * loop For each property
268
+ * C->>C: Check if property is EventEmitter
269
+ * alt is EventEmitter
270
+ * C->>D: Unsubscribe from event
271
+ * end
272
+ * end
273
+ *
274
+ * @private
275
+ * @return {void}
276
+ * @memberOf ComponentRendererComponent
277
+ */
278
+ unsubscribeEvents() {
279
+ if (this.component) {
280
+ const instance = this.component?.instance;
281
+ const componentKeys = Object.keys(instance);
282
+ for (const key of componentKeys) {
283
+ const value = instance[key];
284
+ if (value instanceof EventEmitter)
285
+ instance[key].unsubscribe();
286
+ }
287
+ }
288
+ }
289
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
290
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ComponentRendererComponent, isStandalone: true, selector: "ngx-decaf-component-renderer", inputs: { tag: "tag", globals: "globals", model: "model", parent: "parent" }, outputs: { listenEvent: "listenEvent" }, viewQueries: [{ propertyName: "vcr", first: true, predicate: ["componentViewContainer"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<ng-template #componentViewContainer></ng-template>\n\n<ng-template #inner>\n @if(parent?.children?.length) {\n @for(child of parent.children; track child) {\n @if(!child.children?.length) {\n <ng-container\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n } @else {\n <ngx-decaf-component-renderer [parent]=\"child\"> </ngx-decaf-component-renderer>\n }\n }\n }\n</ng-template>\n\n\n", styles: [""], dependencies: [{ kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }, { kind: "ngmodule", type: ForAngularModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] }); }
291
+ }
292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ComponentRendererComponent, decorators: [{
293
+ type: Component,
294
+ args: [{ selector: 'ngx-decaf-component-renderer', imports: [ForAngularModule], standalone: true, template: "<ng-template #componentViewContainer></ng-template>\n\n<ng-template #inner>\n @if(parent?.children?.length) {\n @for(child of parent.children; track child) {\n @if(!child.children?.length) {\n <ng-container\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n } @else {\n <ngx-decaf-component-renderer [parent]=\"child\"> </ngx-decaf-component-renderer>\n }\n }\n }\n</ng-template>\n\n\n" }]
295
+ }], ctorParameters: () => [], propDecorators: { vcr: [{
296
+ type: ViewChild,
297
+ args: ['componentViewContainer', { static: true, read: ViewContainerRef }]
298
+ }], tag: [{
299
+ type: Input,
300
+ args: [{ required: true }]
301
+ }], globals: [{
302
+ type: Input
303
+ }], listenEvent: [{
304
+ type: Output
305
+ }], model: [{
306
+ type: Input
307
+ }], parent: [{
308
+ type: Input
309
+ }], inner: [{
310
+ type: ViewChild,
311
+ args: ['inner', { read: TemplateRef, static: true }]
312
+ }] } });
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixNQUFNLEVBRU4sS0FBSyxFQUdMLE1BQU0sRUFDTixvQkFBb0IsRUFDcEIsV0FBVyxFQUVYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFJdkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBUUgsTUFBTSxPQUFPLDBCQUEwQjtJQTRHckM7Ozs7Ozs7T0FPRztJQUNIO1FBeEZBOzs7Ozs7Ozs7O1dBVUc7UUFFSCxZQUFPLEdBQTRCLEVBQUUsQ0FBQztRQUV0Qzs7Ozs7Ozs7O1dBU0c7UUFDSCxhQUFRLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBYTVEOzs7Ozs7Ozs7V0FTRztRQUVILGdCQUFXLEdBQ1QsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUF5QjFDLFdBQU0sR0FBeUIsU0FBUyxDQUFDO1FBZXZDLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNC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VSwwQkFBMEI7bUdBQTFCLDBCQUEwQix5U0FXc0IsZ0JBQWdCLHVHQThGL0MsV0FBVywyQ0MvS3pDLCttQkFzQkEsMEREZ0RhLDBCQUEwQixpSkFIM0IsZ0JBQWdCOzs0RkFHZiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0UsOEJBQThCLFdBRy9CLENBQUMsZ0JBQWdCLENBQUMsY0FDZixJQUFJO3dEQWNoQixHQUFHO3NCQURGLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFlN0UsR0FBRztzQkFERixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFlekIsT0FBTztzQkFETixLQUFLO2dCQXFDTixXQUFXO3NCQURWLE1BQU07Z0JBd0JQLEtBQUs7c0JBREosS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBS04sS0FBSztzQkFESixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50TWlycm9yLFxuICBDb21wb25lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIHJlZmxlY3RDb21wb25lbnRUeXBlLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neFJlbmRlcmluZ0VuZ2luZTIgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4UmVuZGVyaW5nRW5naW5lMic7XG5pbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQsIEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUsIGdldExvZ2dlciB9IGZyb20gJy4uLy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZGVjYWYtdHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIER5bmFtaWMgY29tcG9uZW50IHJlbmRlcmVyIGZvciBEZWNhZiBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGR5bmFtaWNhbGx5IHJlbmRlciBBbmd1bGFyIGNvbXBvbmVudHNcbiAqIGF0IHJ1bnRpbWUgYmFzZWQgb24gYSB0YWcgbmFtZS4gSXQgaGFuZGxlcyB0aGUgY3JlYXRpb24sIHByb3BlcnR5IGJpbmRpbmcsIGFuZCBldmVudFxuICogc3Vic2NyaXB0aW9uIGZvciBkeW5hbWljYWxseSBsb2FkZWQgY29tcG9uZW50cy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvclxuICogYnVpbGRpbmcgY29uZmlndXJhYmxlIFVJcyB3aGVyZSBjb21wb25lbnRzIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLlxuICpcbiAqIEBjb21wb25lbnQge0NvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50fVxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyXG4gKiAgIFt0YWddPVwidGFnXCJcbiAqICAgW2dsb2JhbHNdPVwiZ2xvYmFsc1wiXG4gKiAgIChsaXN0ZW5FdmVudCk9XCJsaXN0ZW5FdmVudCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gKlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB7XG4gKiAgICAgK1ZpZXdDb250YWluZXJSZWYgdmNyXG4gKiAgICAgK3N0cmluZyB0YWdcbiAqICAgICArUmVjb3JkfnN0cmluZywgdW5rbm93bn4gZ2xvYmFsc1xuICogICAgICtFbnZpcm9ubWVudEluamVjdG9yIGluamVjdG9yXG4gKiAgICAgK0NvbXBvbmVudFJlZn51bmtub3dufiBjb21wb25lbnRcbiAqICAgICArRXZlbnRFbWl0dGVyflJlbmRlcmVyQ3VzdG9tRXZlbnR+IGxpc3RlbkV2ZW50XG4gKiAgICAgK25nT25Jbml0KClcbiAqICAgICArbmdPbkRlc3Ryb3koKVxuICogICAgICtuZ09uQ2hhbmdlcyhjaGFuZ2VzKVxuICogICAgIC1jcmVhdGVDb21wb25lbnQodGFnLCBnbG9iYWxzKVxuICogICAgIC1zdWJzY3JpYmVFdmVudHMoKVxuICogICAgIC11bnN1YnNjcmliZUV2ZW50cygpXG4gKiAgIH1cbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkluaXRcbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkNoYW5nZXNcbiAqICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgLS18PiBPbkRlc3Ryb3lcbiAqXG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICogQGltcGxlbWVudHMge09uQ2hhbmdlc31cbiAqIEBpbXBsZW1lbnRzIHtPbkRlc3Ryb3l9XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtGb3JBbmd1bGFyTW9kdWxlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgd2hlcmUgdGhlIGR5bmFtaWMgY29tcG9uZW50IHdpbGwgYmUgcmVuZGVyZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgVmlld0NvbnRhaW5lclJlZiBwcm92aWRlcyB0aGUgY29udGFpbmVyIHdoZXJlIHRoZSBkeW5hbWljYWxseSBjcmVhdGVkXG4gICAqIGNvbXBvbmVudCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIERPTS4gSXQncyBtYXJrZWQgYXMgc3RhdGljIHRvIGVuc3VyZSBpdCdzIGF2YWlsYWJsZVxuICAgKiBkdXJpbmcgdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7Vmlld0NvbnRhaW5lclJlZn1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRWaWV3Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgdmNyITogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0YWcgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGR5bmFtaWNhbGx5IHJlbmRlcmVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIGlucHV0IHByb3BlcnR5IHNwZWNpZmllcyB3aGljaCBjb21wb25lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGJ5IHByb3ZpZGluZ1xuICAgKiBpdHMgcmVnaXN0ZXJlZCB0YWcgbmFtZS4gVGhlIHRhZyBtdXN0IGNvcnJlc3BvbmQgdG8gYSBjb21wb25lbnQgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5neFJlbmRlcmluZ0VuZ2luZTIuIFRoaXMgaXMgYSByZXF1aXJlZCBpbnB1dCBhcyBpdCBkZXRlcm1pbmVzIHdoaWNoIGNvbXBvbmVudFxuICAgKiB0byBjcmVhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHRhZyE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBpbnB1dCBwcm9wZXJ0eSBhbGxvd3MgcGFzc2luZyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIHRoZSBkeW5hbWljYWxseVxuICAgKiByZW5kZXJlZCBjb21wb25lbnQuIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIGNvbXBvbmVudCdzIGlucHV0cyBpZiB0aGV5XG4gICAqIG1hdGNoLiBQcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55IGlucHV0IG9uIHRoZSB0YXJnZXQgY29tcG9uZW50IHdpbGwgYmUgZmlsdGVyZWQgb3V0XG4gICAqIHdpdGggYSB3YXJuaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59XG4gICAqIEBkZWZhdWx0IHt9XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2xvYmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluamVjdG9yIHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBpbmplY3RvciBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGR5bmFtaWMgY29tcG9uZW50IHRvIHByb3ZpZGUgaXQgd2l0aFxuICAgKiBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGR5bmFtaWNhbGx5XG4gICAqIGNyZWF0ZWQgY29tcG9uZW50IGNhbiBhY2Nlc3MgdGhlIHNhbWUgc2VydmljZXMgYW5kIGRlcGVuZGVuY2llcyBhcyBzdGF0aWNhbGx5IGNyZWF0ZWRcbiAgICogY29tcG9uZW50cy5cbiAgICpcbiAgICogQHR5cGUge0Vudmlyb25tZW50SW5qZWN0b3J9XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIHByb3BlcnR5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBDb21wb25lbnRSZWYgb2YgdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWRcbiAgICogY29tcG9uZW50LiBJdCdzIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgY29tcG9uZW50IGluc3RhbmNlLCBzdWJzY3JpYmUgdG8gaXRzIGV2ZW50cyxcbiAgICogYW5kIHByb3Blcmx5IGRlc3Ryb3kgaXQgd2hlbiB0aGUgcmVuZGVyZXIgaXMgZGVzdHJveWVkLlxuICAgKlxuICAgKiBAdHlwZSB7Q29tcG9uZW50UmVmPHVua25vd24+fVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIGNvbXBvbmVudCE6IENvbXBvbmVudFJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlZCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgb3V0cHV0IHByb3BlcnR5IGVtaXRzIGV2ZW50cyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZSBkeW5hbWljYWxseSByZW5kZXJlZFxuICAgKiBjb21wb25lbnQuIEl0IGFsbG93cyB0aGUgcGFyZW50IGNvbXBvbmVudCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIGV2ZW50cyBmcm9tIHRoZVxuICAgKiBkeW5hbWljIGNvbXBvbmVudCwgY3JlYXRpbmcgYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCB0aGUgZHluYW1pY2FsbHlcbiAgICogcmVuZGVyZWQgY2hpbGQuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50OiBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBwcm9wZXJ0eSBob2xkcyBhIExvZ2dlciBpbnN0YW5jZSBzcGVjaWZpYyB0byB0aGlzIGNvbXBvbmVudC5cbiAgICogSXQncyB1c2VkIHRvIGxvZyBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMgcmVsYXRlZCB0byB0aGUgY29tcG9uZW50J3NcbiAgICogb3BlcmF0aW9ucywgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHRoZSBkeW5hbWljXG4gICAqIGNvbXBvbmVudCByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZWwhOiAgTW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcGFyZW50OiB1bmRlZmluZWQgfCBLZXlWYWx1ZSA9IHVuZGVmaW5lZDtcblxuXG4gIEBWaWV3Q2hpbGQoJ2lubmVyJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIGlubmVyPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudC4gVGhpcyBjb21wb25lbnQgZG9lc24ndCByZXF1aXJlXG4gICAqIGFueSBkZXBlbmRlbmNpZXMgdG8gYmUgaW5qZWN0ZWQgaW4gaXRzIGNvbnN0cnVjdG9yIGFzIGl0IHVzZXMgdGhlIGluamVjdCBmdW5jdGlvbiB0b1xuICAgKiBvYnRhaW4gdGhlIEVudmlyb25tZW50SW5qZWN0b3IuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBnZXRMb2dnZXIodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgY3JlYXRpbmcgdGhlIGR5bmFtaWMgY29tcG9uZW50IHNwZWNpZmllZCBieSB0aGUgdGFnIGlucHV0LlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQgYW5kIHRyaWdnZXJzIHRoZSBkeW5hbWljXG4gICAqIGNvbXBvbmVudCBjcmVhdGlvbiBwcm9jZXNzIHdpdGggdGhlIHByb3ZpZGVkIHRhZyBuYW1lIGFuZCBnbG9iYWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAgICpcbiAgICogICBBLT4+QzogbmdPbkluaXQoKVxuICAgKiAgIEMtPj5DOiBjcmVhdGVDb21wb25lbnQodGFnLCBnbG9iYWxzKVxuICAgKiAgIEMtPj5SOiBjb21wb25lbnRzKHRhZylcbiAgICogICBSLS0+PkM6IFJldHVybiBjb21wb25lbnQgY29uc3RydWN0b3JcbiAgICogICBDLT4+QzogUHJvY2VzcyBjb21wb25lbnQgaW5wdXRzXG4gICAqICAgQy0+PkM6IENyZWF0ZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICogICBDLT4+Qzogc3Vic2NyaWJlRXZlbnRzKClcbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnRhZywgdGhpcy5nbG9iYWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVQYXJlbnRDb21wb25lbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyBkZXN0cm95ZWQgYnkgQW5ndWxhci5cbiAgICogVGhpcyBpbmNsdWRlcyB1bnN1YnNjcmliaW5nIGZyb20gYWxsIGV2ZW50IGVtaXR0ZXJzIG9mIHRoZSBkeW5hbWljIGNvbXBvbmVudCBhbmRcbiAgICogZGVzdHJveWluZyB0aGUgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAgICpcbiAgICogICBBLT4+QzogbmdPbkRlc3Ryb3koKVxuICAgKiAgIGFsdCBjb21wb25lbnQgZXhpc3RzXG4gICAqICAgICBDLT4+QzogdW5zdWJzY3JpYmVFdmVudHMoKVxuICAgKiAgICAgQy0+PlI6IGRlc3Ryb3koKVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNsZWFudXAgaXMgY29tcGxldGVcbiAgICogQG1lbWJlck9mIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uRGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIE5neFJlbmRlcmluZ0VuZ2luZTIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbmQgcmVuZGVycyBhIGR5bmFtaWMgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBhIGR5bmFtaWMgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0YWcuXG4gICAqIEl0IHJldHJpZXZlcyB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlbmRlcmluZyBlbmdpbmUsIHByb2Nlc3NlcyBpdHMgaW5wdXRzLFxuICAgKiBmaWx0ZXJzIG91dCB1bm1hcHBlZCBwcm9wZXJ0aWVzLCBjcmVhdGVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UsIGFuZCBzZXRzIHVwIGV2ZW50IHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHtLZXlWYWx1ZX0gZ2xvYmFscyAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBOZ3hSZW5kZXJpbmdFbmdpbmUyXG4gICAqICAgcGFydGljaXBhbnQgViBhcyBWaWV3Q29udGFpbmVyUmVmXG4gICAqXG4gICAqICAgQy0+PlI6IGNvbXBvbmVudHModGFnKVxuICAgKiAgIFItLT4+QzogUmV0dXJuIGNvbXBvbmVudCBjb25zdHJ1Y3RvclxuICAgKiAgIEMtPj5DOiByZWZsZWN0Q29tcG9uZW50VHlwZShjb21wb25lbnQpXG4gICAqICAgQy0+PkM6IFByb2Nlc3MgaW5wdXQgcHJvcGVydGllc1xuICAgKiAgIEMtPj5DOiBGaWx0ZXIgdW5tYXBwZWQgcHJvcGVydGllc1xuICAgKiAgIEMtPj5WOiBjbGVhcigpXG4gICAqICAgQy0+PlI6IGNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHByb3BzLCBtZXRhZGF0YSwgdmNyLCBpbmplY3RvciwgW10pXG4gICAqICAgUi0tPj5DOiBSZXR1cm4gY29tcG9uZW50IHJlZmVyZW5jZVxuICAgKiAgIEMtPj5DOiBzdWJzY3JpYmVFdmVudHMoKVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50KHRhZzogc3RyaW5nLCBnbG9iYWxzOiBLZXlWYWx1ZSA9IHt9KTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gTmd4UmVuZGVyaW5nRW5naW5lMi5jb21wb25lbnRzKHRhZylcbiAgICAgID8uY29uc3RydWN0b3IgYXMgVHlwZTx1bmtub3duPjtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHJlZmxlY3RDb21wb25lbnRUeXBlKGNvbXBvbmVudCk7XG4gICAgY29uc3QgY29tcG9uZW50SW5wdXRzID0gKG1ldGFkYXRhIGFzIENvbXBvbmVudE1pcnJvcjx1bmtub3duPikuaW5wdXRzO1xuICAgIGNvbnN0IHByb3BzID0gZ2xvYmFscz8uWydpdGVtJ10gfHwgZ2xvYmFscz8uWydwcm9wcyddIHx8IHt9O1xuICAgIGlmKHByb3BzPy5bJ3RhZyddKVxuICAgICAgZGVsZXRlIHByb3BzWyd0YWcnXTtcbiAgICBjb25zdCBpbnB1dEtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgY29uc3QgdW5tYXBwZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dEtleXMpIHtcbiAgICAgIGlmICghaW5wdXRLZXlzLmxlbmd0aCkgYnJlYWs7XG4gICAgICBjb25zdCBwcm9wID0gY29tcG9uZW50SW5wdXRzLmZpbmQoXG4gICAgICAgIChpdGVtOiB7IHByb3BOYW1lOiBzdHJpbmcgfSkgPT4gaXRlbS5wcm9wTmFtZSA9PT0gaW5wdXQsXG4gICAgICApO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIGRlbGV0ZSBwcm9wc1tpbnB1dF07XG4gICAgICAgIHVubWFwcGVkS2V5cy5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52Y3IuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IE5neFJlbmRlcmluZ0VuZ2luZTIuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgY29tcG9uZW50LFxuICAgICAgcHJvcHMsXG4gICAgICBtZXRhZGF0YSBhcyBDb21wb25lbnRNaXJyb3I8dW5rbm93bj4sXG4gICAgICB0aGlzLnZjcixcbiAgICAgIHRoaXMuaW5qZWN0b3IgYXMgSW5qZWN0b3IsXG4gICAgICBbXSxcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gIH1cblxuICBjcmVhdGVQYXJlbnRDb21wb25lbnQoKSB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIGlucHV0cyB9ID0gdGhpcy5wYXJlbnQgYXMgS2V5VmFsdWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSByZWZsZWN0Q29tcG9uZW50VHlwZShjb21wb25lbnQpIGFzIENvbXBvbmVudE1pcnJvcjx1bmtub3duPjtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudmNyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmlubmVyIGFzIFRlbXBsYXRlUmVmPHVua25vd24+LCB0aGlzLmluamVjdG9yKS5yb290Tm9kZXM7XG4gICAgdGhpcy5jb21wb25lbnQgPSBOZ3hSZW5kZXJpbmdFbmdpbmUyLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGlucHV0cyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgdGhpcy52Y3IsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgdGVtcGxhdGUsXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmliZUV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJzY3JpYmVzIHRvIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2V0cyB1cCBzdWJzY3JpcHRpb25zIHRvIGFsbCBFdmVudEVtaXR0ZXIgcHJvcGVydGllcyBvZiB0aGVcbiAgICogZHluYW1pY2FsbHkgY3JlYXRlZCBjb21wb25lbnQuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgZHluYW1pYyBjb21wb25lbnQsXG4gICAqIGl0IGlzIGNhcHR1cmVkIGFuZCByZS1lbWl0dGVkIHRocm91Z2ggdGhlIGxpc3RlbkV2ZW50IG91dHB1dCBwcm9wZXJ0eSB3aXRoIGFkZGl0aW9uYWxcbiAgICogbWV0YWRhdGEgYWJvdXQgdGhlIGV2ZW50IHNvdXJjZS5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRHluYW1pYyBDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhcmVudCBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+Qzogc3Vic2NyaWJlRXZlbnRzKClcbiAgICogICBDLT4+RDogR2V0IGluc3RhbmNlIHByb3BlcnRpZXNcbiAgICogICBsb29wIEZvciBlYWNoIHByb3BlcnR5XG4gICAqICAgICBDLT4+QzogQ2hlY2sgaWYgcHJvcGVydHkgaXMgRXZlbnRFbWl0dGVyXG4gICAqICAgICBhbHQgaXMgRXZlbnRFbWl0dGVyXG4gICAqICAgICAgIEMtPj5EOiBTdWJzY3JpYmUgdG8gZXZlbnRcbiAgICogICAgICAgRC0tPj5DOiBFdmVudCBlbWl0dGVkXG4gICAqICAgICAgIEMtPj5QOiBSZS1lbWl0IGV2ZW50IHdpdGggbWV0YWRhdGFcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgc3Vic2NyaWJlRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudD8uaW5zdGFuY2UgYXMgS2V5VmFsdWU7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgY29tcG9uZW50S2V5cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKFxuICAgICAgICAgICAgKGV2ZW50OiBQYXJ0aWFsPEJhc2VDdXN0b21FdmVudD4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5FdmVudC5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICAgIH0gYXMgUmVuZGVyZXJDdXN0b21FdmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnN1YnNjcmliZXMgZnJvbSBhbGwgZXZlbnRzIG9mIHRoZSBkeW5hbWljIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgY2xlYW5zIHVwIGV2ZW50IHN1YnNjcmlwdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICogSXQgaXRlcmF0ZXMgdGhyb3VnaCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZHluYW1pYyBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHVuc3Vic2NyaWJlc1xuICAgKiBmcm9tIGFueSBFdmVudEVtaXR0ZXIgcHJvcGVydGllcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBhbmQgdW5leHBlY3RlZCBiZWhhdmlvciBhZnRlclxuICAgKiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRHluYW1pYyBDb21wb25lbnRcbiAgICpcbiAgICogICBDLT4+QzogdW5zdWJzY3JpYmVFdmVudHMoKVxuICAgKiAgIEMtPj5EOiBHZXQgaW5zdGFuY2UgcHJvcGVydGllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgIEMtPj5DOiBDaGVjayBpZiBwcm9wZXJ0eSBpcyBFdmVudEVtaXR0ZXJcbiAgICogICAgIGFsdCBpcyBFdmVudEVtaXR0ZXJcbiAgICogICAgICAgQy0+PkQ6IFVuc3Vic2NyaWJlIGZyb20gZXZlbnRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50Py5pbnN0YW5jZSBhcyBLZXlWYWx1ZTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyhpbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaW5zdGFuY2Vba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSBpbnN0YW5jZVtrZXldLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2NvbXBvbmVudFZpZXdDb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbm5lcj5cbiAgQGlmKHBhcmVudD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgIEBmb3IoY2hpbGQgb2YgcGFyZW50LmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICBAaWYoIWNoaWxkLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nQ29tcG9uZW50T3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICBpbmplY3RvcjogY2hpbGQuaW5qZWN0b3I7XG4gICAgICAgICAgICAgICAgICBpbnB1dHM6IGNoaWxkLmlucHV0cztcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyIFtwYXJlbnRdPVwiY2hpbGRcIj4gPC9uZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyPlxuICAgICAgICB9XG4gICAgIH1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuXG4iXX0=