@decaf-ts/for-angular 0.0.23 → 0.0.25

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 (36) hide show
  1. package/components/component-renderer/component-renderer.component.d.ts +3 -2
  2. package/components/crud-field/crud-field.component.d.ts +4 -2
  3. package/components/fieldset/fieldset.component.d.ts +10 -1
  4. package/components/for-angular-components.module.d.ts +3 -2
  5. package/components/index.d.ts +1 -0
  6. package/components/layout/layout.component.d.ts +1 -24
  7. package/components/model-renderer/model-renderer.component.d.ts +6 -1
  8. package/components/stepped-form/stepped-form.component.d.ts +255 -0
  9. package/engine/NgxBaseComponent.d.ts +2 -2
  10. package/engine/NgxCrudFormField.d.ts +1 -0
  11. package/engine/NgxFormService.d.ts +381 -48
  12. package/engine/NgxRenderingEngine.d.ts +4 -2
  13. package/engine/interfaces.d.ts +1 -1
  14. package/engine/types.d.ts +4 -3
  15. package/esm2022/components/component-renderer/component-renderer.component.mjs +10 -4
  16. package/esm2022/components/crud-field/crud-field.component.mjs +14 -3
  17. package/esm2022/components/crud-form/crud-form.component.mjs +3 -3
  18. package/esm2022/components/empty-state/empty-state.component.mjs +2 -2
  19. package/esm2022/components/fieldset/fieldset.component.mjs +5 -3
  20. package/esm2022/components/for-angular-components.module.mjs +12 -7
  21. package/esm2022/components/index.mjs +2 -1
  22. package/esm2022/components/layout/layout.component.mjs +4 -29
  23. package/esm2022/components/list/list.component.mjs +3 -3
  24. package/esm2022/components/model-renderer/model-renderer.component.mjs +10 -3
  25. package/esm2022/components/stepped-form/stepped-form.component.mjs +306 -0
  26. package/esm2022/engine/NgxBaseComponent.mjs +10 -4
  27. package/esm2022/engine/NgxCrudFormField.mjs +19 -17
  28. package/esm2022/engine/NgxFormService.mjs +438 -57
  29. package/esm2022/engine/NgxRenderingEngine.mjs +21 -10
  30. package/esm2022/engine/ValidatorFactory.mjs +4 -4
  31. package/esm2022/engine/interfaces.mjs +1 -1
  32. package/esm2022/engine/types.mjs +1 -1
  33. package/esm2022/i18n/data/en.json +5 -0
  34. package/fesm2022/decaf-ts-for-angular.mjs +837 -137
  35. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  36. package/package.json +1 -1
@@ -38,6 +38,11 @@ export class ModelRendererComponent {
38
38
  * @description Global variables to be passed to the rendered component
39
39
  */
40
40
  this.globals = {};
41
+ /**
42
+ * @description Set if render content projection is allowed
43
+ * @default true
44
+ */
45
+ this.projectable = true;
41
46
  /**
42
47
  * @description Event emitter for custom events from the rendered component
43
48
  */
@@ -55,7 +60,7 @@ export class ModelRendererComponent {
55
60
  typeof model === 'string'
56
61
  ? Model.build({}, model)
57
62
  : model;
58
- this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner);
63
+ this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner, this.projectable);
59
64
  if (this.output?.inputs)
60
65
  this.rendererId = sf(AngularEngineKeys.RENDERED_ID, this.output.inputs['rendererId']);
61
66
  this.instance = this.output?.instance;
@@ -113,7 +118,7 @@ export class ModelRendererComponent {
113
118
  }
114
119
  }
115
120
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
116
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "rendererId" } }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <!-- Keep to avoid id conflicts -->\n <div [id]=\"rendererId\"></div>\n\n <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelRendererComponent, isStandalone: true, selector: "ngx-decaf-model-renderer", inputs: { model: "model", globals: "globals", projectable: "projectable", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, host: { properties: { "attr.id": "rendererId" } }, viewQueries: [{ propertyName: "inner", first: true, predicate: ["inner"], descendants: true, read: TemplateRef, static: true }, { propertyName: "vcr", first: true, predicate: ["componentOuter"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: " <!-- Keep to avoid id conflicts -->\n <div [id]=\"rendererId\"></div>\n\n <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "children", "model", "parent"], outputs: ["listenEvent"] }] }); }
117
122
  }
118
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelRendererComponent, decorators: [{
119
124
  type: Component,
@@ -123,6 +128,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
123
128
  args: [{ required: true }]
124
129
  }], globals: [{
125
130
  type: Input
131
+ }], projectable: [{
132
+ type: Input
126
133
  }], inner: [{
127
134
  type: ViewChild,
128
135
  args: ['inner', { read: TemplateRef, static: true }]
@@ -134,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
134
141
  }], listenEvent: [{
135
142
  type: Output
136
143
  }] } });
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FFbkIsTUFBTSxjQUFjLENBQUM7QUFHdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBRWhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBUm5DO1FBa0JFOztXQUVHO1FBRUgsWUFBTyxHQUE0QixFQUFFLENBQUM7UUF5QnRDOztXQUVHO1FBRUgsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQU85QyxhQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBbUYzQixTQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2hDO0lBbEZDLG1CQUFtQjtJQUVuQjs7O09BR0c7SUFDSyxPQUFPLENBQUMsS0FBaUI7UUFDL0IsS0FBSztZQUNILE9BQU8sS0FBSyxL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bUdBQXRCLHNCQUFzQixxVUFtQkwsV0FBVyw4R0FpQlksZ0JBQWdCLGdFQ3BHckUsNHFCQXVCQSwwRERtQ2EsaUJBQWlCLG9QQUFFLDBCQUEwQjs7NEZBTTdDLHNCQUFzQjtrQkFSbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUMvQywwQkFBMEIsUUFHOUIsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDOzhCQVVqQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU96QixPQUFPO3NCQUROLEtBQUs7Z0JBT04sS0FBSztzQkFESixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZdkQsVUFBVTtzQkFEVCxLQUFLO2dCQU9OLEdBQUc7c0JBREYsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQU9yRSxXQUFXO3NCQURWLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kZWwsIHNmIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJEeW5hbWljT3V0cHV0LFxuICBBbmd1bGFyRW5naW5lS2V5cyxcbiAgQmFzZUNvbXBvbmVudFByb3BzLFxuICBCYXNlQ3VzdG9tRXZlbnQsXG4gIE5neFJlbmRlcmluZ0VuZ2luZSxcbiAgUmVuZGVyZWRNb2RlbCxcbn0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGZvciByZW5kZXJpbmcgZHluYW1pYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkeW5hbWljYWxseSByZW5kZXJpbmcgbW9kZWxzLFxuICogaGFuZGxpbmcgbW9kZWwgY2hhbmdlcywgYW5kIG1hbmFnaW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMgZm9yIHRoZSByZW5kZXJlZCBjb21wb25lbnRzLlxuICogSXQgdXNlcyB0aGUgTmd4UmVuZGVyaW5nRW5naW5lIHRvIHJlbmRlciB0aGUgbW9kZWxzIGFuZCBzdXBwb3J0cyBib3RoIHN0cmluZyBhbmQgTW9kZWwgaW5wdXRzLlxuICogQGNsYXNzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0luamVjdG9yfSBpbmplY3RvciAtIEFuZ3VsYXIgSW5qZWN0b3IgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1tb2RlbC1yZW5kZXJlclxuICogICBbbW9kZWxdPVwibXlNb2RlbFwiXG4gKiAgIFtnbG9iYWxzXT1cImdsb2JhbFZhcmlhYmxlc1wiXG4gKiAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1tb2RlbC1yZW5kZXJlcj5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsUmVuZGVyZXJcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+Pk1vZGVsUmVuZGVyZXI6IElucHV0IG1vZGVsXG4gKiAgIE1vZGVsUmVuZGVyZXItPj5Nb2RlbDogUGFyc2UgaWYgc3RyaW5nXG4gKiAgIE1vZGVsLS0+Pk1vZGVsUmVuZGVyZXI6IFBhcnNlZCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZW5kZXIgbW9kZWxcbiAqICAgUmVuZGVyaW5nRW5naW5lLS0+Pk1vZGVsUmVuZGVyZXI6IFJlbmRlcmVkIG91dHB1dFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWxSZW5kZXJlcjogU3Vic2NyaWJlIHRvIGV2ZW50c1xuICogICBNb2RlbFJlbmRlcmVyLS0+PkFwcDogRW1pdCBldmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFsgTmdDb21wb25lbnRPdXRsZXQsIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XSxcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICdyZW5kZXJlcklkJ30sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsUmVuZGVyZXJDb21wb25lbnQ8TSBleHRlbmRzIE1vZGVsPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBSZW5kZXJlZE1vZGVsIHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIElucHV0IG1vZGVsIHRvIGJlIHJlbmRlcmVkXG4gICAqIEBzdW1tYXJ5IENhbiBiZSBhIE1vZGVsIGluc3RhbmNlIG9yIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtb2RlbFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbW9kZWwhOiBNIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2xvYmFsIHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2xvYmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgaW5uZXIgY29udGVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5uZXInLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgaW5uZXI/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBvZiB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICovXG4gIG91dHB1dD86IEFuZ3VsYXJEeW5hbWljT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZpZXcgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVuZGVyaW5nXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRPdXRlcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHZjciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gZXZlbnRzIGZyb20gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2Ugb2YgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YW5jZSE6IEtleVZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvLyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaChtb2RlbDogc3RyaW5nIHwgTSkge1xuICAgIG1vZGVsID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIG1vZGVsKSBhcyBNKVxuICAgICAgICA6IG1vZGVsO1xuICAgIHRoaXMub3V0cHV0ID0gKG1vZGVsIGFzIHVua25vd24gYXMgUmVuZGVyYWJsZSkucmVuZGVyPEFuZ3VsYXJEeW5hbWljT3V0cHV0PihcbiAgICAgIHRoaXMuZ2xvYmFscyB8fCB7fSxcbiAgICAgIHRoaXMudmNyLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuaW5uZXIsXG4gICAgKTtcbiAgICBpZiAodGhpcy5vdXRwdXQ/LmlucHV0cylcbiAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHNmKFxuICAgICAgICBBbmd1bGFyRW5naW5lS2V5cy5SRU5ERVJFRF9JRCxcbiAgICAgICAgKHRoaXMub3V0cHV0LmlucHV0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3JlbmRlcmVySWQnXSBhcyBzdHJpbmcsXG4gICAgICApO1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLm91dHB1dD8uaW5zdGFuY2U7XG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBkaXJlY3RpdmUgY2hhbmdlXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZXNcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgdGhpcy5yZWZyZXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgbmdPbkRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIGF3YWl0IE5neFJlbmRlcmluZ0VuZ2luZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcz8ub3V0cHV0Py5jb21wb25lbnQ7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgKHRoaXMuaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKChldmVudDogUGFydGlhbDxCYXNlQ3VzdG9tRXZlbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudC5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgfSBhcyBSZW5kZXJlckN1c3RvbUV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuc3Vic2NyaWJlcyBmcm9tIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICB0aGlzLmluc3RhbmNlW2tleV0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSlNPTiA9IEpTT047XG59XG4iLCIgIDwhLS0gS2VlcCB0byBhdm9pZCBpZCBjb25mbGljdHMgLS0+XG4gIDxkaXYgW2lkXT1cInJlbmRlcmVySWRcIj48L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE91dGVyPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjaW5uZXI+XG4gICAgPGRpdiAgW2lkXT1cInJlbmRlcmVySWQgfHwgbnVsbFwiPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygb3V0cHV0Py5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgQGlmKGNoaWxkPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXIgW3BhcmVudF09XCJjaGlsZFwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICNjaGlsZENvbXBvbmVudHNcbiAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgIGluamVjdG9yOiBjaGlsZC5pbmplY3RvcjtcbiAgICAgICAgICAgICAgaW5wdXRzOiBjaGlsZC5pbnB1dHM7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FFbkIsTUFBTSxjQUFjLENBQUM7QUFHdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7O0FBRWhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFTSCxNQUFNLE9BQU8sc0JBQXNCO0lBUm5DO1FBa0JFOztXQUVHO1FBRUgsWUFBTyxHQUE0QixFQUFFLENBQUM7UUFFdEM7OztXQUdHO1FBRUgsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUF5QjVCOztXQUVHO1FBRUgsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQU85QyxhQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBb0YzQixTQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2hDO0lBbkZDLG1CQUFtQjtJQUVuQjs7O09BR0c7SUFDSyxPQUFP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V0FBVyxFQUFFLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQTNJVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixpV0EwQkwsV0FBVyw4R0FpQlksZ0JBQWdCLGdFQzNHckUsNHFCQXVCQSwwRERtQ2EsaUJBQWlCLG9QQUFFLDBCQUEwQjs7NEZBTTdDLHNCQUFzQjtrQkFSbEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQyxZQUMvQywwQkFBMEIsUUFHOUIsRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFDOzhCQVVqQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU96QixPQUFPO3NCQUROLEtBQUs7Z0JBUU4sV0FBVztzQkFEVixLQUFLO2dCQU9OLEtBQUs7c0JBREosU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWXZELFVBQVU7c0JBRFQsS0FBSztnQkFPTixHQUFHO3NCQURGLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPckUsV0FBVztzQkFEVixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGVsLCBzZiB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBOZ0NvbXBvbmVudE91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBbmd1bGFyRHluYW1pY091dHB1dCxcbiAgQW5ndWxhckVuZ2luZUtleXMsXG4gIEJhc2VDb21wb25lbnRQcm9wcyxcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBOZ3hSZW5kZXJpbmdFbmdpbmUsXG4gIFJlbmRlcmVkTW9kZWwsXG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBLZXlWYWx1ZSwgUmVuZGVyZXJDdXN0b21FdmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQgeyBSZW5kZXJhYmxlIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGR5bmFtaWMgbW9kZWxzXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgZHluYW1pY2FsbHkgcmVuZGVyaW5nIG1vZGVscyxcbiAqIGhhbmRsaW5nIG1vZGVsIGNoYW5nZXMsIGFuZCBtYW5hZ2luZyBldmVudCBzdWJzY3JpcHRpb25zIGZvciB0aGUgcmVuZGVyZWQgY29tcG9uZW50cy5cbiAqIEl0IHVzZXMgdGhlIE5neFJlbmRlcmluZ0VuZ2luZSB0byByZW5kZXIgdGhlIG1vZGVscyBhbmQgc3VwcG9ydHMgYm90aCBzdHJpbmcgYW5kIE1vZGVsIGlucHV0cy5cbiAqIEBjbGFzc1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtJbmplY3Rvcn0gaW5qZWN0b3IgLSBBbmd1bGFyIEluamVjdG9yIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXJcbiAqICAgW21vZGVsXT1cIm15TW9kZWxcIlxuICogICBbZ2xvYmFsc109XCJnbG9iYWxWYXJpYWJsZXNcIlxuICogICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtbW9kZWwtcmVuZGVyZXI+XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBNb2RlbFJlbmRlcmVyXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBBcHAtPj5Nb2RlbFJlbmRlcmVyOiBJbnB1dCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWw6IFBhcnNlIGlmIHN0cmluZ1xuICogICBNb2RlbC0tPj5Nb2RlbFJlbmRlcmVyOiBQYXJzZWQgbW9kZWxcbiAqICAgTW9kZWxSZW5kZXJlci0+PlJlbmRlcmluZ0VuZ2luZTogUmVuZGVyIG1vZGVsXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0tPj5Nb2RlbFJlbmRlcmVyOiBSZW5kZXJlZCBvdXRwdXRcbiAqICAgTW9kZWxSZW5kZXJlci0+Pk1vZGVsUmVuZGVyZXI6IFN1YnNjcmliZSB0byBldmVudHNcbiAqICAgTW9kZWxSZW5kZXJlci0tPj5BcHA6IEVtaXQgZXZlbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbIE5nQ29tcG9uZW50T3V0bGV0LCBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLW1vZGVsLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC5zY3NzJyxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAncmVuZGVyZXJJZCd9LFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50PE0gZXh0ZW5kcyBNb2RlbD5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnB1dCBtb2RlbCB0byBiZSByZW5kZXJlZFxuICAgKiBAc3VtbWFyeSBDYW4gYmUgYSBNb2RlbCBpbnN0YW5jZSBvciBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9kZWxcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG1vZGVsITogTSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdsb2JhbCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdsb2JhbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgaWYgcmVuZGVyIGNvbnRlbnQgcHJvamVjdGlvbiBpcyBhbGxvd2VkXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHByb2plY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgaW5uZXIgY29udGVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5uZXInLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgaW5uZXI/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBvZiB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICovXG4gIG91dHB1dD86IEFuZ3VsYXJEeW5hbWljT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZpZXcgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVuZGVyaW5nXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRPdXRlcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHZjciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gZXZlbnRzIGZyb20gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2Ugb2YgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YW5jZSE6IEtleVZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvLyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgdGhlIHJlbmRlcmVkIG1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWRcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaChtb2RlbDogc3RyaW5nIHwgTSkge1xuICAgIG1vZGVsID1cbiAgICAgIHR5cGVvZiBtb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIG1vZGVsKSBhcyBNKVxuICAgICAgICA6IG1vZGVsO1xuICAgIHRoaXMub3V0cHV0ID0gKG1vZGVsIGFzIHVua25vd24gYXMgUmVuZGVyYWJsZSkucmVuZGVyPEFuZ3VsYXJEeW5hbWljT3V0cHV0PihcbiAgICAgIHRoaXMuZ2xvYmFscyB8fCB7fSxcbiAgICAgIHRoaXMudmNyLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgIHRoaXMuaW5uZXIsXG4gICAgICB0aGlzLnByb2plY3RhYmxlXG4gICAgKTtcbiAgICBpZiAodGhpcy5vdXRwdXQ/LmlucHV0cylcbiAgICAgIHRoaXMucmVuZGVyZXJJZCA9IHNmKFxuICAgICAgICBBbmd1bGFyRW5naW5lS2V5cy5SRU5ERVJFRF9JRCxcbiAgICAgICAgKHRoaXMub3V0cHV0LmlucHV0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3JlbmRlcmVySWQnXSBhcyBzdHJpbmcsXG4gICAgICApO1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLm91dHB1dD8uaW5zdGFuY2U7XG4gICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBkaXJlY3RpdmUgY2hhbmdlXG4gICAqIEBwYXJhbSB7U2ltcGxlQ2hhbmdlc30gY2hhbmdlcyAtIE9iamVjdCBjb250YWluaW5nIGNoYW5nZXNcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gY2hhbmdlc1tCYXNlQ29tcG9uZW50UHJvcHMuTU9ERUxdO1xuICAgICAgdGhpcy5yZWZyZXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgbmdPbkRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVFdmVudHMoKTtcbiAgICAgIGF3YWl0IE5neFJlbmRlcmluZ0VuZ2luZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcz8ub3V0cHV0Py5jb21wb25lbnQ7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBjb21wb25lbnRLZXlzID0gT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21wb25lbnRLZXlzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnN0YW5jZVtrZXldO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpXG4gICAgICAgICAgKHRoaXMuaW5zdGFuY2UgYXMgS2V5VmFsdWUpW2tleV0uc3Vic2NyaWJlKChldmVudDogUGFydGlhbDxCYXNlQ3VzdG9tRXZlbnQ+KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbkV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudC5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgfSBhcyBSZW5kZXJlckN1c3RvbUV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuc3Vic2NyaWJlcyBmcm9tIGV2ZW50cyBlbWl0dGVkIGJ5IHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbXBvbmVudEtleXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluc3RhbmNlW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcilcbiAgICAgICAgICB0aGlzLmluc3RhbmNlW2tleV0udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSlNPTiA9IEpTT047XG59XG4iLCIgIDwhLS0gS2VlcCB0byBhdm9pZCBpZCBjb25mbGljdHMgLS0+XG4gIDxkaXYgW2lkXT1cInJlbmRlcmVySWRcIj48L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE91dGVyPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjaW5uZXI+XG4gICAgPGRpdiAgW2lkXT1cInJlbmRlcmVySWQgfHwgbnVsbFwiPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygb3V0cHV0Py5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgQGlmKGNoaWxkPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXIgW3BhcmVudF09XCJjaGlsZFwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICNjaGlsZENvbXBvbmVudHNcbiAgICAgICAgICAgICpuZ0NvbXBvbmVudE91dGxldD1cIlxuICAgICAgICAgICAgICBjaGlsZC5jb21wb25lbnQ7XG4gICAgICAgICAgICAgIGluamVjdG9yOiBjaGlsZC5pbmplY3RvcjtcbiAgICAgICAgICAgICAgaW5wdXRzOiBjaGlsZC5pbnB1dHM7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6Y2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
@@ -0,0 +1,306 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { IonButton, IonIcon, IonSkeletonText, IonText } from '@ionic/angular/standalone';
5
+ import { arrowForwardOutline, arrowBackOutline } from 'ionicons/icons';
6
+ import { addIcons } from 'ionicons';
7
+ import { OperationKeys } from '@decaf-ts/db-decorators';
8
+ import { Dynamic, EventConstants, NgxFormService } from '../../engine';
9
+ import { ComponentRendererComponent } from '../component-renderer/component-renderer.component';
10
+ import { ModelRendererComponent } from '../model-renderer/model-renderer.component';
11
+ import { timer } from 'rxjs';
12
+ import { getLocaleContext } from '../../i18n/Loader';
13
+ import { TranslatePipe } from '@ngx-translate/core';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/forms";
16
+ let SteppedFormComponent = class SteppedFormComponent {
17
+ /**
18
+ * @description Creates an instance of SteppedFormComponent.
19
+ * @summary Initializes a new SteppedFormComponent instance and registers the required
20
+ * Ionic icons for navigation buttons (forward and back arrows).
21
+ *
22
+ * @memberOf SteppedFormComponent
23
+ */
24
+ constructor() {
25
+ /**
26
+ * @description Number of pages in the stepped form.
27
+ * @summary Represents the total number of steps/pages in the multi-step form.
28
+ * This value is automatically calculated based on the page properties of the children
29
+ * or can be explicitly set. Each page represents a logical group of form fields.
30
+ *
31
+ * @type {number}
32
+ * @default 1
33
+ * @memberOf SteppedFormComponent
34
+ */
35
+ this.pages = 1;
36
+ /**
37
+ * @description The CRUD operation type for this form.
38
+ * @summary Defines the type of operation being performed (CREATE, READ, UPDATE, DELETE).
39
+ * This affects form behavior, validation rules, and field accessibility. For example,
40
+ * READ operations might disable form fields, while CREATE operations enable all fields.
41
+ *
42
+ * @type {CrudOperations}
43
+ * @default OperationKeys.CREATE
44
+ * @memberOf SteppedFormComponent
45
+ */
46
+ this.operation = OperationKeys.CREATE;
47
+ /**
48
+ * @description The initial page to display when the form loads.
49
+ * @summary Specifies which page of the multi-step form should be shown first.
50
+ * This allows starting the form at any step, useful for scenarios like editing
51
+ * existing data where you might want to jump to a specific section.
52
+ *
53
+ * @type {number}
54
+ * @default 1
55
+ * @memberOf SteppedFormComponent
56
+ */
57
+ this.startPage = 1;
58
+ /**
59
+ * @description Array of UI model metadata for the currently active page.
60
+ * @summary Contains only the UI model metadata for fields that should be displayed
61
+ * on the currently active page. This is a filtered subset of the children array,
62
+ * updated whenever the user navigates between pages.
63
+ *
64
+ * @type {UIModelMetadata[] | undefined}
65
+ * @memberOf SteppedFormComponent
66
+ */
67
+ this.activeChildren = undefined;
68
+ /**
69
+ * @description FormGroup for the currently active page.
70
+ * @summary The FormGroup instance that manages form controls and validation
71
+ * for the current page only. This is extracted from the main formGroup
72
+ * when using FormArray structure.
73
+ *
74
+ * @type {FormGroup | undefined}
75
+ * @memberOf SteppedFormComponent
76
+ */
77
+ this.activeFormGroup = undefined;
78
+ /**
79
+ * @description The currently active page number.
80
+ * @summary Tracks which page of the multi-step form is currently being displayed.
81
+ * This property is updated as users navigate through the form steps using
82
+ * the next/back buttons or programmatic navigation.
83
+ *
84
+ * @type {number}
85
+ * @memberOf SteppedFormComponent
86
+ */
87
+ this.activePage = 1;
88
+ /**
89
+ * @description Array representing the structure of pages.
90
+ * @summary Contains metadata about each page, including page numbers and indices.
91
+ * This array is built during initialization to organize the form fields into
92
+ * logical pages and provide navigation structure.
93
+ *
94
+ * @type {UIModelMetadata[]}
95
+ * @memberOf SteppedFormComponent
96
+ */
97
+ this.pagesArray = [];
98
+ /**
99
+ * @description Event emitter for form submission.
100
+ * @summary Emits events when the form is submitted, typically on the last page
101
+ * when all validation passes. The emitted event contains the form data and
102
+ * event type information for parent components to handle.
103
+ *
104
+ * @type {EventEmitter<BaseCustomEvent>}
105
+ * @memberOf SteppedFormComponent
106
+ */
107
+ this.submitEvent = new EventEmitter();
108
+ addIcons({ arrowForwardOutline, arrowBackOutline });
109
+ }
110
+ /**
111
+ * @description Initializes the component after Angular first displays the data-bound properties.
112
+ * @summary Sets up the stepped form by organizing children into pages, calculating the total
113
+ * number of pages, and initializing the active page. This method processes the UI model metadata
114
+ * to create a logical page structure and ensures proper page assignments for all form fields.
115
+ *
116
+ * @mermaid
117
+ * sequenceDiagram
118
+ * participant A as Angular Lifecycle
119
+ * participant S as SteppedFormComponent
120
+ * participant F as Form Service
121
+ *
122
+ * A->>S: ngOnInit()
123
+ * S->>S: Set activePage = startPage
124
+ * S->>S: Process children into pagesArray
125
+ * S->>S: Calculate total pages
126
+ * S->>S: Assign page props to children
127
+ * S->>S: getCurrentFormGroup(activePage)
128
+ * S->>F: Extract FormGroup for active page
129
+ * F-->>S: Return activeFormGroup
130
+ *
131
+ * @memberOf SteppedFormComponent
132
+ */
133
+ ngOnInit() {
134
+ if (!this.locale)
135
+ this.locale = getLocaleContext("SteppedFormComponent");
136
+ this.activePage = this.startPage;
137
+ this.pagesArray = this.children.reduce((acc, curr, index) => {
138
+ const page = curr.props?.['page'] || index + 1;
139
+ if (!acc[page])
140
+ acc[page] = [];
141
+ acc[page].push({ index: page });
142
+ return acc;
143
+ }, []).filter(Boolean);
144
+ this.pages = this.pagesArray.length;
145
+ this.children = [...this.children.map((c) => {
146
+ if (!c.props)
147
+ c.props = {};
148
+ const page = c.props['page'] || 1;
149
+ // prevent page overflow
150
+ c.props['page'] = page > this.pages ? this.pages : page;
151
+ return c;
152
+ })];
153
+ this.getCurrentFormGroup(this.activePage);
154
+ }
155
+ /**
156
+ * @description Cleanup method called when the component is destroyed.
157
+ * @summary Unsubscribes from any active timer subscriptions to prevent memory leaks.
158
+ * This is part of Angular's component lifecycle and ensures proper resource cleanup.
159
+ *
160
+ * @memberOf SteppedFormComponent
161
+ */
162
+ ngOnDestroy() {
163
+ if (this.timerSubscription)
164
+ this.timerSubscription.unsubscribe();
165
+ }
166
+ /**
167
+ * @description Handles navigation to the next page or form submission.
168
+ * @summary Validates the current page's form fields and either navigates to the next page
169
+ * or submits the entire form if on the last page. Form validation must pass before
170
+ * proceeding. On successful submission, emits a submit event with form data.
171
+ *
172
+ * @param {boolean} lastPage - Whether this is the last page of the form
173
+ * @return {void}
174
+ *
175
+ * @mermaid
176
+ * sequenceDiagram
177
+ * participant U as User
178
+ * participant S as SteppedFormComponent
179
+ * participant F as Form Service
180
+ * participant P as Parent Component
181
+ *
182
+ * U->>S: Click Next/Submit
183
+ * S->>F: validateFields(activeFormGroup)
184
+ * F-->>S: Return validation result
185
+ * alt Not last page and valid
186
+ * S->>S: activePage++
187
+ * S->>S: getCurrentFormGroup(activePage)
188
+ * else Last page and valid
189
+ * S->>F: getFormData(formGroup)
190
+ * F-->>S: Return form data
191
+ * S->>P: submitEvent.emit({data, name: SUBMIT})
192
+ * end
193
+ *
194
+ * @memberOf SteppedFormComponent
195
+ */
196
+ handleNext(lastPage = false) {
197
+ const isValid = NgxFormService.validateFields(this.activeFormGroup);
198
+ if (!lastPage) {
199
+ if (isValid) {
200
+ this.activePage = this.activePage + 1;
201
+ this.getCurrentFormGroup(this.activePage);
202
+ }
203
+ }
204
+ else {
205
+ if (isValid) {
206
+ const data = Object.assign({}, ...Object.values(NgxFormService.getFormData(this.formGroup)));
207
+ this.submitEvent.emit({
208
+ data,
209
+ name: EventConstants.SUBMIT,
210
+ });
211
+ }
212
+ }
213
+ }
214
+ /**
215
+ * @description Handles navigation to the previous page.
216
+ * @summary Moves the user back to the previous page in the stepped form.
217
+ * This method decrements the active page number and updates the form
218
+ * group and children to display the previous page's content.
219
+ *
220
+ * @return {void}
221
+ *
222
+ * @mermaid
223
+ * sequenceDiagram
224
+ * participant U as User
225
+ * participant S as SteppedFormComponent
226
+ *
227
+ * U->>S: Click Back
228
+ * S->>S: activePage--
229
+ * S->>S: getCurrentFormGroup(activePage)
230
+ * Note over S: Update active form and children
231
+ *
232
+ * @memberOf SteppedFormComponent
233
+ */
234
+ handleBack() {
235
+ this.activePage = this.activePage - 1;
236
+ this.getCurrentFormGroup(this.activePage);
237
+ }
238
+ /**
239
+ * @description Updates the active form group and children for the specified page.
240
+ * @summary Extracts the FormGroup for the given page from the FormArray and filters
241
+ * the children to show only fields belonging to that page. Uses a timer to ensure
242
+ * proper Angular change detection when updating the activeChildren.
243
+ *
244
+ * @param {number} page - The page number to activate
245
+ * @return {void}
246
+ *
247
+ * @private
248
+ * @mermaid
249
+ * sequenceDiagram
250
+ * participant S as SteppedFormComponent
251
+ * participant F as FormArray
252
+ * participant T as Timer
253
+ *
254
+ * S->>F: Extract FormGroup at index (page - 1)
255
+ * F-->>S: Return page FormGroup
256
+ * S->>S: Set activeChildren = undefined
257
+ * S->>T: timer(10).subscribe()
258
+ * T-->>S: Filter children for active page
259
+ * S->>S: Set activeChildren
260
+ *
261
+ * @memberOf SteppedFormComponent
262
+ */
263
+ getCurrentFormGroup(page) {
264
+ this.activeFormGroup = this.formGroup.at(page - 1);
265
+ this.activeChildren = undefined;
266
+ this.timerSubscription = timer(10).subscribe(() => {
267
+ this.activeChildren = this.children.filter(c => c.props?.['page'] === page);
268
+ console.log(this.activeChildren);
269
+ });
270
+ }
271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SteppedFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
272
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SteppedFormComponent, isStandalone: true, selector: "ngx-decaf-stepped-form", inputs: { locale: "locale", pages: "pages", operation: "operation", startPage: "startPage", children: "children", formGroup: "formGroup" }, outputs: { submitEvent: "submitEvent" }, ngImport: i0, template: "<form class=\"dcf-steped-form\" novalidate>\n <div class=\"dcf-page-steps\">\n <div>\n @for(page of pagesArray; track $index;) {\n <div [class.dcf-active]=\"activePage === $index + 1\" [class.dcf-passed]=\"($index + 1) < activePage\">{{ $index + 1 }}</div>\n }\n </div>\n </div>\n @if(formGroup) {\n @for(child of activeChildren; track $index) {\n <ngx-decaf-component-renderer\n [tag]=\"child?.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [children]=\"child?.children || []\"\n [globals]=\"{props: child.props}\"\n />\n }\n } @else {\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n <br />\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n }\n\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div class=\"dcf-width-1-2@s\">\n <ion-button fill=\"clear\" (click)=\"handleBack()\" [disabled]=\"activePage <= 1\">\n <ion-icon aria-hidden=\"true\" name=\"arrow-back-outline\"></ion-icon>\n {{locale + '.previous' | translate}}\n </ion-button>\n </div>\n\n <div class=\"dcf-width-1-2@s\">\n <ion-button [fill]=\"activePage === pages ? 'solid' : 'outline'\" (click)=\"handleNext(activePage === pages ? true : false)\">\n @if(activePage === pages) {\n {{locale + '.submit' | translate}}\n } @else {\n {{locale + '.next' | translate}}\n <ion-icon aria-hidden=\"true\" name=\"arrow-forward-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n </div>\n</form>\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 639px){.dcf-buttons-container.dcf-flex div:nth-child(2){display:flex;justify-content:flex-end}}@media (max-width: 638px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}.dcf-steped-form{padding:2rem 1rem}.dcf-page-steps{display:flex;justify-content:center;margin-bottom:2rem}.dcf-page-steps>div{justify-content:center;min-width:200px;max-width:200px;column-gap:.25em;display:flex}.dcf-page-steps>div>div{width:30px;text-align:center;border-bottom:solid var(--dcf-color-gray-3);box-sizing:border-box;border-width:3px;font-size:0px;font-weight:600}.dcf-page-steps>div>div.dcf-active{border-width:5px;font-size:1rem;color:var(--ion-color-gray-7);border-color:var(--ion-color-primary);line-height:1rem}.dcf-page-steps>div>div.dcf-passed{border-width:4px;font-size:.5rem;line-height:1.2rem;border-color:var(--dcf-color-gray-5);color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "children", "model", "parent"], outputs: ["listenEvent"] }] }); }
273
+ };
274
+ SteppedFormComponent = __decorate([
275
+ Dynamic(),
276
+ __metadata("design:paramtypes", [])
277
+ ], SteppedFormComponent);
278
+ export { SteppedFormComponent };
279
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SteppedFormComponent, decorators: [{
280
+ type: Component,
281
+ args: [{ selector: 'ngx-decaf-stepped-form', imports: [
282
+ TranslatePipe,
283
+ ReactiveFormsModule,
284
+ IonSkeletonText,
285
+ IonText,
286
+ IonButton,
287
+ IonIcon,
288
+ ModelRendererComponent,
289
+ ComponentRendererComponent
290
+ ], standalone: true, template: "<form class=\"dcf-steped-form\" novalidate>\n <div class=\"dcf-page-steps\">\n <div>\n @for(page of pagesArray; track $index;) {\n <div [class.dcf-active]=\"activePage === $index + 1\" [class.dcf-passed]=\"($index + 1) < activePage\">{{ $index + 1 }}</div>\n }\n </div>\n </div>\n @if(formGroup) {\n @for(child of activeChildren; track $index) {\n <ngx-decaf-component-renderer\n [tag]=\"child?.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [children]=\"child?.children || []\"\n [globals]=\"{props: child.props}\"\n />\n }\n } @else {\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n <br />\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n }\n\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div class=\"dcf-width-1-2@s\">\n <ion-button fill=\"clear\" (click)=\"handleBack()\" [disabled]=\"activePage <= 1\">\n <ion-icon aria-hidden=\"true\" name=\"arrow-back-outline\"></ion-icon>\n {{locale + '.previous' | translate}}\n </ion-button>\n </div>\n\n <div class=\"dcf-width-1-2@s\">\n <ion-button [fill]=\"activePage === pages ? 'solid' : 'outline'\" (click)=\"handleNext(activePage === pages ? true : false)\">\n @if(activePage === pages) {\n {{locale + '.submit' | translate}}\n } @else {\n {{locale + '.next' | translate}}\n <ion-icon aria-hidden=\"true\" name=\"arrow-forward-outline\"></ion-icon>\n }\n </ion-button>\n </div>\n </div>\n</form>\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 639px){.dcf-buttons-container.dcf-flex div:nth-child(2){display:flex;justify-content:flex-end}}@media (max-width: 638px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}.dcf-steped-form{padding:2rem 1rem}.dcf-page-steps{display:flex;justify-content:center;margin-bottom:2rem}.dcf-page-steps>div{justify-content:center;min-width:200px;max-width:200px;column-gap:.25em;display:flex}.dcf-page-steps>div>div{width:30px;text-align:center;border-bottom:solid var(--dcf-color-gray-3);box-sizing:border-box;border-width:3px;font-size:0px;font-weight:600}.dcf-page-steps>div>div.dcf-active{border-width:5px;font-size:1rem;color:var(--ion-color-gray-7);border-color:var(--ion-color-primary);line-height:1rem}.dcf-page-steps>div>div.dcf-passed{border-width:4px;font-size:.5rem;line-height:1.2rem;border-color:var(--dcf-color-gray-5);color:var(--ion-color-primary)}\n"] }]
291
+ }], ctorParameters: () => [], propDecorators: { locale: [{
292
+ type: Input
293
+ }], pages: [{
294
+ type: Input
295
+ }], operation: [{
296
+ type: Input
297
+ }], startPage: [{
298
+ type: Input
299
+ }], children: [{
300
+ type: Input
301
+ }], formGroup: [{
302
+ type: Input
303
+ }], submitEvent: [{
304
+ type: Output
305
+ }] } });
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zdGVwcGVkLWZvcm0vc3RlcHBlZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9zdGVwcGVkLWZvcm0vc3RlcHBlZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFlBQVksRUFBRyxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQXdCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFcEMsT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQW1CLE9BQU8sRUFBRSxjQUFjLEVBQVksY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBb0I3QyxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9C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SUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM1RSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBclVVLG9CQUFvQjttR0FBcEIsb0JBQW9CLHVRQ2hDakMsazBEQTZDQSxpaUNEeEJJLGFBQWEsaURBQ2IsbUJBQW1CLG9TQUNuQixlQUFlLG9GQUNmLE9BQU8sZ0ZBQ1AsU0FBUyxvUEFDVCxPQUFPLDJKQUVQLDBCQUEwQjs7QUFJakIsb0JBQW9CO0lBakJoQyxPQUFPLEVBQUU7O0dBaUJHLG9CQUFvQixDQXVVaEM7OzRGQXZVWSxvQkFBb0I7a0JBaEJoQyxTQUFTOytCQUNFLHdCQUF3QixXQUd6Qjt3QkFDUCxhQUFhO3dCQUNiLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixPQUFPO3dCQUNQLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxzQkFBc0I7d0JBQ3RCLDBCQUEwQjtxQkFDM0IsY0FDVyxJQUFJO3dEQWdCaEIsTUFBTTtzQkFETCxLQUFLO2dCQWVOLEtBQUs7c0JBREosS0FBSztnQkFjTixTQUFTO3NCQURSLEtBQUs7Z0JBY04sU0FBUztzQkFEUixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFhTixTQUFTO3NCQURSLEtBQUs7Z0JBcUVOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25Ta2VsZXRvblRleHQsIElvblRleHQgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFycm93Rm9yd2FyZE91dGxpbmUsIGFycm93QmFja091dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IFVJTW9kZWxNZXRhZGF0YX0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQsIER5bmFtaWMsIEV2ZW50Q29uc3RhbnRzLCBLZXlWYWx1ZSwgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb2RlbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWwtcmVuZGVyZXIvbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldExvY2FsZUNvbnRleHQgfSBmcm9tICcuLi8uLi9pMThuL0xvYWRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cblxuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLXN0ZXBwZWQtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwcGVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGVwcGVkLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBJb25Ta2VsZXRvblRleHQsXG4gICAgSW9uVGV4dCxcbiAgICBJb25CdXR0b24sXG4gICAgSW9uSWNvbixcbiAgICBNb2RlbFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50XG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBwZWRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbG9jYWxlIHRvIGJlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBsb2NhbGUgaWRlbnRpZmllciB0byB1c2Ugd2hlbiB0cmFuc2xhdGluZyBjb21wb25lbnQgdGV4dC5cbiAgICogVGhpcyBjYW4gYmUgc2V0IGV4cGxpY2l0bHkgdmlhIGlucHV0IHByb3BlcnR5IHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGRlcml2ZWRcbiAgICogbG9jYWxlIGZyb20gdGhlIGNvbXBvbmVudCBuYW1lLiBUaGUgbG9jYWxlIGlzIHR5cGljYWxseSBhIGxhbmd1YWdlIGNvZGUgKGUuZy4sICdlbicsICdmcicpXG4gICAqIG9yIGEgbGFuZ3VhZ2UtcmVnaW9uIGNvZGUgKGUuZy4sICdlbi1VUycsICdmci1DQScpIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCB0cmFuc2xhdGlvblxuICAgKiBzZXQgdG8gdXNlIGZvciB0aGUgY29tcG9uZW50J3MgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvY2FsZSE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzdGVwcGVkIGZvcm0uXG4gICAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgdGhlIHRvdGFsIG51bWJlciBvZiBzdGVwcy9wYWdlcyBpbiB0aGUgbXVsdGktc3RlcCBmb3JtLlxuICAgKiBUaGlzIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgcGFnZSBwcm9wZXJ0aWVzIG9mIHRoZSBjaGlsZHJlblxuICAgKiBvciBjYW4gYmUgZXhwbGljaXRseSBzZXQuIEVhY2ggcGFnZSByZXByZXNlbnRzIGEgbG9naWNhbCBncm91cCBvZiBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBhZ2VzOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIENSVUQgb3BlcmF0aW9uIHR5cGUgZm9yIHRoaXMgZm9ybS5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAgICogVGhpcyBhZmZlY3RzIGZvcm0gYmVoYXZpb3IsIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBmaWVsZCBhY2Nlc3NpYmlsaXR5LiBGb3IgZXhhbXBsZSxcbiAgICogUkVBRCBvcGVyYXRpb25zIG1pZ2h0IGRpc2FibGUgZm9ybSBmaWVsZHMsIHdoaWxlIENSRUFURSBvcGVyYXRpb25zIGVuYWJsZSBhbGwgZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBkZWZhdWx0IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3BlcmF0aW9uOiBDcnVkT3BlcmF0aW9ucyA9IE9wZXJhdGlvbktleXMuQ1JFQVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgcGFnZSB0byBkaXNwbGF5IHdoZW4gdGhlIGZvcm0gbG9hZHMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBwYWdlIG9mIHRoZSBtdWx0aS1zdGVwIGZvcm0gc2hvdWxkIGJlIHNob3duIGZpcnN0LlxuICAgKiBUaGlzIGFsbG93cyBzdGFydGluZyB0aGUgZm9ybSBhdCBhbnkgc3RlcCwgdXNlZnVsIGZvciBzY2VuYXJpb3MgbGlrZSBlZGl0aW5nXG4gICAqIGV4aXN0aW5nIGRhdGEgd2hlcmUgeW91IG1pZ2h0IHdhbnQgdG8ganVtcCB0byBhIHNwZWNpZmljIHNlY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdGFydFBhZ2U6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBVSSBtb2RlbCBtZXRhZGF0YSBmb3IgYWxsIGZvcm0gZmllbGRzLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB0aGUgY29tcGxldGUgY29sbGVjdGlvbiBvZiBVSSBtb2RlbCBtZXRhZGF0YSB0aGF0IGRlZmluZXNcbiAgICogdGhlIHN0cnVjdHVyZSwgdmFsaWRhdGlvbiwgYW5kIHByZXNlbnRhdGlvbiBvZiBmb3JtIGZpZWxkcyBhY3Jvc3MgYWxsIHBhZ2VzLlxuICAgKiBFYWNoIG1ldGFkYXRhIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBmaWVsZCB0eXBlLCB2YWxpZGF0aW9uIHJ1bGVzLFxuICAgKiBwYWdlIGFzc2lnbm1lbnQsIGFuZCBkaXNwbGF5IHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEB0eXBlIHtVSU1vZGVsTWV0YWRhdGFbXX1cbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGlsZHJlbiE6IFVJTW9kZWxNZXRhZGF0YVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciByZWFjdGl2ZSBGb3JtR3JvdXAgb3IgRm9ybUFycmF5IGZvciBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gICAqIEBzdW1tYXJ5IFRoZSBmb3JtIGluc3RhbmNlIHRoYXQgbWFuYWdlcyBhbGwgZm9ybSBjb250cm9scywgdmFsaWRhdGlvbiwgYW5kIGZvcm0gc3RhdGUuXG4gICAqIFdoZW4gdXNpbmcgRm9ybUFycmF5LCBlYWNoIGFycmF5IGVsZW1lbnQgcmVwcmVzZW50cyBhIHBhZ2UncyBGb3JtR3JvdXAuIFdoZW4gdXNpbmdcbiAgICogRm9ybUdyb3VwLCBpdCBjb250YWlucyBhbGwgZm9ybSBjb250cm9scyBmb3IgdGhlIGVudGlyZSBzdGVwcGVkIGZvcm0uXG4gICAqXG4gICAqIEB0eXBlIHtGb3JtR3JvdXAgfCBGb3JtQXJyYXkgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwIHwgRm9ybUFycmF5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgVUkgbW9kZWwgbWV0YWRhdGEgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIG9ubHkgdGhlIFVJIG1vZGVsIG1ldGFkYXRhIGZvciBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAqIG9uIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UuIFRoaXMgaXMgYSBmaWx0ZXJlZCBzdWJzZXQgb2YgdGhlIGNoaWxkcmVuIGFycmF5LFxuICAgKiB1cGRhdGVkIHdoZW5ldmVyIHRoZSB1c2VyIG5hdmlnYXRlcyBiZXR3ZWVuIHBhZ2VzLlxuICAgKlxuICAgKiBAdHlwZSB7VUlNb2RlbE1ldGFkYXRhW10gfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgYWN0aXZlQ2hpbGRyZW46IFVJTW9kZWxNZXRhZGF0YVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRm9ybUdyb3VwIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYWdlLlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgbWFuYWdlcyBmb3JtIGNvbnRyb2xzIGFuZCB2YWxpZGF0aW9uXG4gICAqIGZvciB0aGUgY3VycmVudCBwYWdlIG9ubHkuIFRoaXMgaXMgZXh0cmFjdGVkIGZyb20gdGhlIG1haW4gZm9ybUdyb3VwXG4gICAqIHdoZW4gdXNpbmcgRm9ybUFycmF5IHN0cnVjdHVyZS5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1Hcm91cCB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBhY3RpdmVGb3JtR3JvdXA6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UgbnVtYmVyLlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hpY2ggcGFnZSBvZiB0aGUgbXVsdGktc3RlcCBmb3JtIGlzIGN1cnJlbnRseSBiZWluZyBkaXNwbGF5ZWQuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXBkYXRlZCBhcyB1c2VycyBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmb3JtIHN0ZXBzIHVzaW5nXG4gICAqIHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBvciBwcm9ncmFtbWF0aWMgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBhY3RpdmVQYWdlOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgcGFnZXMuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIG1ldGFkYXRhIGFib3V0IGVhY2ggcGFnZSwgaW5jbHVkaW5nIHBhZ2UgbnVtYmVycyBhbmQgaW5kaWNlcy5cbiAgICogVGhpcyBhcnJheSBpcyBidWlsdCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdG8gb3JnYW5pemUgdGhlIGZvcm0gZmllbGRzIGludG9cbiAgICogbG9naWNhbCBwYWdlcyBhbmQgcHJvdmlkZSBuYXZpZ2F0aW9uIHN0cnVjdHVyZS5cbiAgICpcbiAgICogQHR5cGUge1VJTW9kZWxNZXRhZGF0YVtdfVxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHBhZ2VzQXJyYXk6IFVJTW9kZWxNZXRhZGF0YVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdWJzY3JpcHRpb24gZm9yIHRpbWVyLWJhc2VkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IE1hbmFnZXMgdGhlIHRpbWVyIHN1YnNjcmlwdGlvbiB1c2VkIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9uc1xuICAgKiBsaWtlIHVwZGF0aW5nIGFjdGl2ZSBjaGlsZHJlbiBhZnRlciBwYWdlIHRyYW5zaXRpb25zLiBUaGlzIHN1YnNjcmlwdGlvblxuICAgKiBpcyBjbGVhbmVkIHVwIGluIG5nT25EZXN0cm95IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3Vic2NyaXB0aW9ufVxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgdGltZXJTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24uXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGV2ZW50cyB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgdHlwaWNhbGx5IG9uIHRoZSBsYXN0IHBhZ2VcbiAgICogd2hlbiBhbGwgdmFsaWRhdGlvbiBwYXNzZXMuIFRoZSBlbWl0dGVkIGV2ZW50IGNvbnRhaW5zIHRoZSBmb3JtIGRhdGEgYW5kXG4gICAqIGV2ZW50IHR5cGUgaW5mb3JtYXRpb24gZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZS5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBzdWJtaXRFdmVudDogRXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RlcHBlZEZvcm1Db21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IFN0ZXBwZWRGb3JtQ29tcG9uZW50IGluc3RhbmNlIGFuZCByZWdpc3RlcnMgdGhlIHJlcXVpcmVkXG4gICAqIElvbmljIGljb25zIGZvciBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGZvcndhcmQgYW5kIGJhY2sgYXJyb3dzKS5cbiAgICpcbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7YXJyb3dGb3J3YXJkT3V0bGluZSwgYXJyb3dCYWNrT3V0bGluZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGFmdGVyIEFuZ3VsYXIgZmlyc3QgZGlzcGxheXMgdGhlIGRhdGEtYm91bmQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgc3RlcHBlZCBmb3JtIGJ5IG9yZ2FuaXppbmcgY2hpbGRyZW4gaW50byBwYWdlcywgY2FsY3VsYXRpbmcgdGhlIHRvdGFsXG4gICAqIG51bWJlciBvZiBwYWdlcywgYW5kIGluaXRpYWxpemluZyB0aGUgYWN0aXZlIHBhZ2UuIFRoaXMgbWV0aG9kIHByb2Nlc3NlcyB0aGUgVUkgbW9kZWwgbWV0YWRhdGFcbiAgICogdG8gY3JlYXRlIGEgbG9naWNhbCBwYWdlIHN0cnVjdHVyZSBhbmQgZW5zdXJlcyBwcm9wZXIgcGFnZSBhc3NpZ25tZW50cyBmb3IgYWxsIGZvcm0gZmllbGRzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEYgYXMgRm9ybSBTZXJ2aWNlXG4gICAqXG4gICAqICAgQS0+PlM6IG5nT25Jbml0KClcbiAgICogICBTLT4+UzogU2V0IGFjdGl2ZVBhZ2UgPSBzdGFydFBhZ2VcbiAgICogICBTLT4+UzogUHJvY2VzcyBjaGlsZHJlbiBpbnRvIHBhZ2VzQXJyYXlcbiAgICogICBTLT4+UzogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgUy0+PlM6IEFzc2lnbiBwYWdlIHByb3BzIHRvIGNoaWxkcmVuXG4gICAqICAgUy0+PlM6IGdldEN1cnJlbnRGb3JtR3JvdXAoYWN0aXZlUGFnZSlcbiAgICogICBTLT4+RjogRXh0cmFjdCBGb3JtR3JvdXAgZm9yIGFjdGl2ZSBwYWdlXG4gICAqICAgRi0tPj5TOiBSZXR1cm4gYWN0aXZlRm9ybUdyb3VwXG4gICAqXG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCAge1xuICAgIGlmKCF0aGlzLmxvY2FsZSlcbiAgICAgIHRoaXMubG9jYWxlID0gZ2V0TG9jYWxlQ29udGV4dChcIlN0ZXBwZWRGb3JtQ29tcG9uZW50XCIpXG4gICAgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy5zdGFydFBhZ2U7XG5cbiAgICB0aGlzLnBhZ2VzQXJyYXkgPSAodGhpcy5jaGlsZHJlbi5yZWR1Y2UoKGFjYywgY3VyciwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBjdXJyLnByb3BzPy5bJ3BhZ2UnXSB8fCBpbmRleCArIDE7XG4gICAgICBpZighYWNjW3BhZ2VdKVxuICAgICAgICBhY2NbcGFnZV0gPSBbXTtcbiAgICAgIGFjY1twYWdlXS5wdXNoKHtpbmRleDogcGFnZX0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBLZXlWYWx1ZSkgYXMgW10pLmZpbHRlcihCb29sZWFuKTtcblxuICAgIHRoaXMucGFnZXMgPSB0aGlzLnBhZ2VzQXJyYXkubGVuZ3RoO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4uIHRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiB7XG4gICAgICBpZighYy5wcm9wcylcbiAgICAgICAgYy5wcm9wcyA9IHt9O1xuICAgICAgY29uc3QgcGFnZSA9IGMucHJvcHNbJ3BhZ2UnXSB8fCAxO1xuICAgICAgLy8gcHJldmVudCBwYWdlIG92ZXJmbG93XG4gICAgICBjLnByb3BzWydwYWdlJ10gPSBwYWdlID4gdGhpcy5wYWdlcyA/IHRoaXMucGFnZXMgOiBwYWdlO1xuICAgICAgcmV0dXJuIGM7XG4gICAgfSldO1xuICAgIHRoaXMuZ2V0Q3VycmVudEZvcm1Hcm91cCh0aGlzLmFjdGl2ZVBhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhbnVwIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmVzIGZyb20gYW55IGFjdGl2ZSB0aW1lciBzdWJzY3JpcHRpb25zIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlxuICAgKiBUaGlzIGlzIHBhcnQgb2YgQW5ndWxhcidzIGNvbXBvbmVudCBsaWZlY3ljbGUgYW5kIGVuc3VyZXMgcHJvcGVyIHJlc291cmNlIGNsZWFudXAuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYodGhpcy50aW1lclN1YnNjcmlwdGlvbilcbiAgICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBuYXZpZ2F0aW9uIHRvIHRoZSBuZXh0IHBhZ2Ugb3IgZm9ybSBzdWJtaXNzaW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgcGFnZSdzIGZvcm0gZmllbGRzIGFuZCBlaXRoZXIgbmF2aWdhdGVzIHRvIHRoZSBuZXh0IHBhZ2VcbiAgICogb3Igc3VibWl0cyB0aGUgZW50aXJlIGZvcm0gaWYgb24gdGhlIGxhc3QgcGFnZS4gRm9ybSB2YWxpZGF0aW9uIG11c3QgcGFzcyBiZWZvcmVcbiAgICogcHJvY2VlZGluZy4gT24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uLCBlbWl0cyBhIHN1Ym1pdCBldmVudCB3aXRoIGZvcm0gZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBsYXN0UGFnZSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgbGFzdCBwYWdlIG9mIHRoZSBmb3JtXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZvcm0gU2VydmljZVxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFyZW50IENvbXBvbmVudFxuICAgKlxuICAgKiAgIFUtPj5TOiBDbGljayBOZXh0L1N1Ym1pdFxuICAgKiAgIFMtPj5GOiB2YWxpZGF0ZUZpZWxkcyhhY3RpdmVGb3JtR3JvdXApXG4gICAqICAgRi0tPj5TOiBSZXR1cm4gdmFsaWRhdGlvbiByZXN1bHRcbiAgICogICBhbHQgTm90IGxhc3QgcGFnZSBhbmQgdmFsaWRcbiAgICogICAgIFMtPj5TOiBhY3RpdmVQYWdlKytcbiAgICogICAgIFMtPj5TOiBnZXRDdXJyZW50Rm9ybUdyb3VwKGFjdGl2ZVBhZ2UpXG4gICAqICAgZWxzZSBMYXN0IHBhZ2UgYW5kIHZhbGlkXG4gICAqICAgICBTLT4+RjogZ2V0Rm9ybURhdGEoZm9ybUdyb3VwKVxuICAgKiAgICAgRi0tPj5TOiBSZXR1cm4gZm9ybSBkYXRhXG4gICAqICAgICBTLT4+UDogc3VibWl0RXZlbnQuZW1pdCh7ZGF0YSwgbmFtZTogU1VCTUlUfSlcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVOZXh0KGxhc3RQYWdlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBpc1ZhbGlkID0gTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHModGhpcy5hY3RpdmVGb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICBpZiAoIWxhc3RQYWdlKSB7XG4gICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2UgKyAxO1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRGb3JtR3JvdXAodGhpcy5hY3RpdmVQYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgY29uc3QgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIC4uLk9iamVjdC52YWx1ZXMoTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKSkpO1xuICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbmFtZTogRXZlbnRDb25zdGFudHMuU1VCTUlULFxuICAgICAgfSk7XG4gICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgbmF2aWdhdGlvbiB0byB0aGUgcHJldmlvdXMgcGFnZS5cbiAgICogQHN1bW1hcnkgTW92ZXMgdGhlIHVzZXIgYmFjayB0byB0aGUgcHJldmlvdXMgcGFnZSBpbiB0aGUgc3RlcHBlZCBmb3JtLlxuICAgKiBUaGlzIG1ldGhvZCBkZWNyZW1lbnRzIHRoZSBhY3RpdmUgcGFnZSBudW1iZXIgYW5kIHVwZGF0ZXMgdGhlIGZvcm1cbiAgICogZ3JvdXAgYW5kIGNoaWxkcmVuIHRvIGRpc3BsYXkgdGhlIHByZXZpb3VzIHBhZ2UncyBjb250ZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIFN0ZXBwZWRGb3JtQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlM6IENsaWNrIEJhY2tcbiAgICogICBTLT4+UzogYWN0aXZlUGFnZS0tXG4gICAqICAgUy0+PlM6IGdldEN1cnJlbnRGb3JtR3JvdXAoYWN0aXZlUGFnZSlcbiAgICogICBOb3RlIG92ZXIgUzogVXBkYXRlIGFjdGl2ZSBmb3JtIGFuZCBjaGlsZHJlblxuICAgKlxuICAgKiBAbWVtYmVyT2YgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGhhbmRsZUJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy5hY3RpdmVQYWdlIC0gMTtcbiAgICB0aGlzLmdldEN1cnJlbnRGb3JtR3JvdXAodGhpcy5hY3RpdmVQYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyB0aGUgYWN0aXZlIGZvcm0gZ3JvdXAgYW5kIGNoaWxkcmVuIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIHRoZSBGb3JtR3JvdXAgZm9yIHRoZSBnaXZlbiBwYWdlIGZyb20gdGhlIEZvcm1BcnJheSBhbmQgZmlsdGVyc1xuICAgKiB0aGUgY2hpbGRyZW4gdG8gc2hvdyBvbmx5IGZpZWxkcyBiZWxvbmdpbmcgdG8gdGhhdCBwYWdlLiBVc2VzIGEgdGltZXIgdG8gZW5zdXJlXG4gICAqIHByb3BlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gd2hlbiB1cGRhdGluZyB0aGUgYWN0aXZlQ2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIGFjdGl2YXRlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU3RlcHBlZEZvcm1Db21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIEZvcm1BcnJheVxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVGltZXJcbiAgICpcbiAgICogICBTLT4+RjogRXh0cmFjdCBGb3JtR3JvdXAgYXQgaW5kZXggKHBhZ2UgLSAxKVxuICAgKiAgIEYtLT4+UzogUmV0dXJuIHBhZ2UgRm9ybUdyb3VwXG4gICAqICAgUy0+PlM6IFNldCBhY3RpdmVDaGlsZHJlbiA9IHVuZGVmaW5lZFxuICAgKiAgIFMtPj5UOiB0aW1lcigxMCkuc3Vic2NyaWJlKClcbiAgICogICBULS0+PlM6IEZpbHRlciBjaGlsZHJlbiBmb3IgYWN0aXZlIHBhZ2VcbiAgICogICBTLT4+UzogU2V0IGFjdGl2ZUNoaWxkcmVuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBTdGVwcGVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDdXJyZW50Rm9ybUdyb3VwKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRm9ybUdyb3VwID0gKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1BcnJheSkuYXQocGFnZSAtIDEpIGFzIEZvcm1Hcm91cDtcbiAgICB0aGlzLmFjdGl2ZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGltZXJTdWJzY3JpcHRpb24gPSB0aW1lcigxMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuYWN0aXZlQ2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLmZpbHRlcihjID0+IGMucHJvcHM/LlsncGFnZSddID09PSBwYWdlKTtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlQ2hpbGRyZW4pO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmb3JtIGNsYXNzPVwiZGNmLXN0ZXBlZC1mb3JtXCIgbm92YWxpZGF0ZT5cbiAgPGRpdiBjbGFzcz1cImRjZi1wYWdlLXN0ZXBzXCI+XG4gICAgPGRpdj5cbiAgICAgICAgQGZvcihwYWdlIG9mIHBhZ2VzQXJyYXk7IHRyYWNrICRpbmRleDspIHtcbiAgICAgICAgPGRpdiBbY2xhc3MuZGNmLWFjdGl2ZV09XCJhY3RpdmVQYWdlID09PSAkaW5kZXggKyAxXCIgW2NsYXNzLmRjZi1wYXNzZWRdPVwiKCRpbmRleCArIDEpIDwgYWN0aXZlUGFnZVwiPnt7ICRpbmRleCArIDEgfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIEBpZihmb3JtR3JvdXApIHtcbiAgICBAZm9yKGNoaWxkIG9mIGFjdGl2ZUNoaWxkcmVuOyAgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlclxuICAgICAgICBbdGFnXT1cImNoaWxkPy50YWdcIlxuICAgICAgICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgIFtjaGlsZHJlbl09XCJjaGlsZD8uY2hpbGRyZW4gfHwgW11cIlxuICAgICAgICBbZ2xvYmFsc109XCJ7cHJvcHM6IGNoaWxkLnByb3BzfVwiXG4gICAgICAvPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8aW9uLXRleHQgY2xhc3M9XCJkYXRlXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPjxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+PC9pb24tdGV4dD5cbiAgICA8YnIgLz5cbiAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgIDxpb24tdGV4dCBjbGFzcz1cImRhdGVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+PGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD48L2lvbi10ZXh0PlxuICB9XG5cbiAgPGRpdiBjbGFzcz1cImRjZi1idXR0b25zLWNvbnRhaW5lciBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0XCI+XG4gICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC0xLTJAc1wiPlxuICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgKGNsaWNrKT1cImhhbmRsZUJhY2soKVwiIFtkaXNhYmxlZF09XCJhY3RpdmVQYWdlIDw9IDFcIj5cbiAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG5hbWU9XCJhcnJvdy1iYWNrLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICAgIHt7bG9jYWxlICsgJy5wcmV2aW91cycgfCB0cmFuc2xhdGV9fVxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC0xLTJAc1wiPlxuICAgICAgPGlvbi1idXR0b24gW2ZpbGxdPVwiYWN0aXZlUGFnZSA9PT0gcGFnZXMgPyAnc29saWQnIDogJ291dGxpbmUnXCIgIChjbGljayk9XCJoYW5kbGVOZXh0KGFjdGl2ZVBhZ2UgPT09IHBhZ2VzID8gdHJ1ZSA6IGZhbHNlKVwiPlxuICAgICAgICBAaWYoYWN0aXZlUGFnZSA9PT0gcGFnZXMpIHtcbiAgICAgICAgICB7e2xvY2FsZSArICcuc3VibWl0JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIHt7bG9jYWxlICsgJy5uZXh0JyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG5hbWU9XCJhcnJvdy1mb3J3YXJkLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgICB9XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19