structra-ui 0.1.18 → 0.1.20

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 (150) hide show
  1. package/README.md +3 -4
  2. package/fesm2022/structra-ui.mjs +326 -326
  3. package/fesm2022/structra-ui.mjs.map +1 -1
  4. package/package.json +16 -25
  5. package/esm2022/app/_utils/date-pt-br.utils.mjs +0 -82
  6. package/esm2022/app/_utils/decimal-br.utils.mjs +0 -154
  7. package/esm2022/app/_utils/estados-br.data.mjs +0 -37
  8. package/esm2022/app/_utils/integer-br.utils.mjs +0 -48
  9. package/esm2022/app/_utils/integer-value.utils.mjs +0 -19
  10. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +0 -97
  11. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +0 -2
  12. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +0 -29
  13. package/esm2022/app/app-shell/app-shell.component.mjs +0 -105
  14. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +0 -18
  15. package/esm2022/app/app-shell/index.mjs +0 -19
  16. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +0 -23
  17. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +0 -36
  18. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +0 -84
  19. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +0 -9
  20. package/esm2022/app/app-shell/topbar/topbar.component.mjs +0 -14
  21. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +0 -52
  22. package/esm2022/app/buttons/base-button/base-button.component.mjs +0 -97
  23. package/esm2022/app/buttons/index.mjs +0 -2
  24. package/esm2022/app/data-display/_models/card-item-view.model.mjs +0 -2
  25. package/esm2022/app/data-display/_models/data-display.models.mjs +0 -2
  26. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +0 -2
  27. package/esm2022/app/data-display/_models/index.mjs +0 -2
  28. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +0 -124
  29. package/esm2022/app/data-display/card-list/card-list.component.mjs +0 -208
  30. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +0 -25
  31. package/esm2022/app/data-display/data-card/data-card.component.mjs +0 -40
  32. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +0 -41
  33. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +0 -253
  34. package/esm2022/app/data-display/data-list/data-list.component.mjs +0 -40
  35. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +0 -12
  36. package/esm2022/app/data-display/details-field/details-field.component.mjs +0 -21
  37. package/esm2022/app/data-display/details-view/details-view.component.mjs +0 -44
  38. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +0 -19
  39. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +0 -30
  40. package/esm2022/app/data-display/index.mjs +0 -19
  41. package/esm2022/app/data-display/list-item/list-item.component.mjs +0 -59
  42. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +0 -59
  43. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +0 -41
  44. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +0 -31
  45. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +0 -22
  46. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +0 -8
  47. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +0 -22
  48. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +0 -6
  49. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +0 -200
  50. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +0 -15
  51. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +0 -2
  52. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -36
  53. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +0 -47
  54. package/esm2022/app/dialogs/index.mjs +0 -12
  55. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +0 -2
  56. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +0 -19
  57. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +0 -38
  58. package/esm2022/app/dialogs/toast/toast-host.component.mjs +0 -65
  59. package/esm2022/app/dialogs/toast/toast.models.mjs +0 -2
  60. package/esm2022/app/dialogs/toast/toast.service.mjs +0 -76
  61. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +0 -158
  62. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +0 -36
  63. package/esm2022/app/fields/checkbox-fields/index.mjs +0 -4
  64. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +0 -35
  65. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +0 -117
  66. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +0 -152
  67. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +0 -149
  68. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +0 -32
  69. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +0 -2
  70. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +0 -2
  71. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +0 -2
  72. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +0 -2
  73. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +0 -2
  74. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +0 -520
  75. package/esm2022/app/fields/dropdown-fields/index.mjs +0 -7
  76. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +0 -379
  77. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +0 -359
  78. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +0 -151
  79. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +0 -224
  80. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +0 -135
  81. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +0 -127
  82. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +0 -2
  83. package/esm2022/app/fields/input-fields/_models/index.mjs +0 -2
  84. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +0 -61
  85. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +0 -40
  86. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +0 -48
  87. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +0 -61
  88. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +0 -147
  89. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +0 -166
  90. package/esm2022/app/fields/input-fields/index.mjs +0 -22
  91. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +0 -52
  92. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +0 -143
  93. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +0 -130
  94. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +0 -66
  95. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +0 -90
  96. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +0 -125
  97. package/esm2022/app/form-layout/_models/form-layout.model.mjs +0 -48
  98. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +0 -2
  99. package/esm2022/app/form-layout/_models/index.mjs +0 -2
  100. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +0 -2
  101. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +0 -55
  102. package/esm2022/app/form-layout/form-col/form-col.component.mjs +0 -76
  103. package/esm2022/app/form-layout/form-group/form-group.component.mjs +0 -358
  104. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +0 -65
  105. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +0 -54
  106. package/esm2022/app/form-layout/form-row/form-row.component.mjs +0 -49
  107. package/esm2022/app/form-layout/form-section/form-section.component.mjs +0 -43
  108. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +0 -67
  109. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +0 -126
  110. package/esm2022/app/form-layout/index.mjs +0 -14
  111. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +0 -56
  112. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +0 -343
  113. package/esm2022/app/loading/skeleton-loading/index.mjs +0 -7
  114. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +0 -43
  115. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +0 -23
  116. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +0 -34
  117. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +0 -38
  118. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +0 -37
  119. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +0 -45
  120. package/esm2022/app/menus/_models/drawer-side.model.mjs +0 -8
  121. package/esm2022/app/menus/_models/drawer-size.model.mjs +0 -8
  122. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +0 -12
  123. package/esm2022/app/menus/_models/menu-item.model.mjs +0 -6
  124. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +0 -41
  125. package/esm2022/app/menus/_utils/menu-rows.util.mjs +0 -39
  126. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +0 -23
  127. package/esm2022/app/menus/action-menu/action-menu.component.mjs +0 -48
  128. package/esm2022/app/menus/context-menu/context-menu.component.mjs +0 -112
  129. package/esm2022/app/menus/drawer/drawer.component.mjs +0 -142
  130. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +0 -99
  131. package/esm2022/app/menus/index.mjs +0 -11
  132. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +0 -14
  133. package/esm2022/app/menus/menu-group/menu-group.component.mjs +0 -32
  134. package/esm2022/app/menus/menu-list/menu-list.component.mjs +0 -399
  135. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +0 -11
  136. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +0 -84
  137. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +0 -121
  138. package/esm2022/app/overlay/index.mjs +0 -21
  139. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +0 -17
  140. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +0 -17
  141. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +0 -15
  142. package/esm2022/app/overlay/popover/popover.component.mjs +0 -93
  143. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +0 -20
  144. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +0 -118
  145. package/esm2022/app/theme/app-theme.service.mjs +0 -49
  146. package/esm2022/app/theme/index.mjs +0 -2
  147. package/esm2022/structra-public-api.mjs +0 -18
  148. package/esm2022/structra-ui.mjs +0 -5
  149. package/esm2022/structra-version.mjs +0 -3
  150. package/index.d.ts +0 -5
@@ -1,55 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, Input, booleanAttribute, } from '@angular/core';
2
- import { FormActionsAlign } from '../_models/form-layout.model';
3
- import { LayoutStackComponent } from '../layout-stack/layout-stack.component';
4
- import * as i0 from "@angular/core";
5
- /** Barra de ações de formulário (Salvar, Cancelar, Adicionar, …). Projeção de conteúdo. */
6
- export class FormActionsComponent {
7
- constructor() {
8
- this.align = FormActionsAlign.End;
9
- this.stackOnMobile = true;
10
- /**
11
- * Por omissão `true`: os botões repartem a largura da faixa (um botão ≈ 100%; vários repartem por igual).
12
- * Use `false` para faixa compacta (largura intrínseca, ex.: várias ações alinhadas à direita).
13
- */
14
- this.fill = true;
15
- this.divider = false;
16
- }
17
- /** `FormActionsAlign` e `LayoutStackAlign` partilham os mesmos valores; delegação ao `app-layout-stack`. */
18
- get layoutAlign() {
19
- return this.align;
20
- }
21
- get hostClass() {
22
- const parts = ['form-actions', `form-actions--align-${this.align}`];
23
- if (this.stackOnMobile) {
24
- parts.push('form-actions--stack-mobile');
25
- }
26
- if (this.divider) {
27
- parts.push('form-actions--divider');
28
- }
29
- if (this.fill) {
30
- parts.push('form-actions--fill');
31
- }
32
- return parts.join(' ');
33
- }
34
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: FormActionsComponent, isStandalone: true, selector: "app-form-actions", inputs: { align: "align", stackOnMobile: ["stackOnMobile", "stackOnMobile", booleanAttribute], fill: ["fill", "fill", booleanAttribute], divider: ["divider", "divider", booleanAttribute] }, host: { properties: { "class": "this.hostClass" } }, ngImport: i0, template: "<app-layout-stack\n class=\"form-actions__stack\"\n [align]=\"layoutAlign\"\n [stackOnMobile]=\"stackOnMobile\"\n [stackFill]=\"fill\"\n [stackDivider]=\"false\"\n>\n <ng-content />\n</app-layout-stack>\n", styles: [":host{display:block;width:100%;min-width:0;box-sizing:border-box}.form-actions__stack{display:block;width:100%;min-width:0;box-sizing:border-box}:host(.form-actions--divider){margin-top:.25rem;padding-top:1rem;border-top:1px solid var(--ui-form-actions-divider-color, #e8eaed)}\n"], dependencies: [{ kind: "component", type: LayoutStackComponent, selector: "app-layout-stack", inputs: ["align", "stackOnMobile", "stackDivider", "stackFill"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
- }
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormActionsComponent, decorators: [{
38
- type: Component,
39
- args: [{ selector: 'app-form-actions', standalone: true, imports: [LayoutStackComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-layout-stack\n class=\"form-actions__stack\"\n [align]=\"layoutAlign\"\n [stackOnMobile]=\"stackOnMobile\"\n [stackFill]=\"fill\"\n [stackDivider]=\"false\"\n>\n <ng-content />\n</app-layout-stack>\n", styles: [":host{display:block;width:100%;min-width:0;box-sizing:border-box}.form-actions__stack{display:block;width:100%;min-width:0;box-sizing:border-box}:host(.form-actions--divider){margin-top:.25rem;padding-top:1rem;border-top:1px solid var(--ui-form-actions-divider-color, #e8eaed)}\n"] }]
40
- }], propDecorators: { align: [{
41
- type: Input
42
- }], stackOnMobile: [{
43
- type: Input,
44
- args: [{ transform: booleanAttribute }]
45
- }], fill: [{
46
- type: Input,
47
- args: [{ transform: booleanAttribute }]
48
- }], divider: [{
49
- type: Input,
50
- args: [{ transform: booleanAttribute }]
51
- }], hostClass: [{
52
- type: HostBinding,
53
- args: ['class']
54
- }] } });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZm9ybS1sYXlvdXQvZm9ybS1hY3Rpb25zL2Zvcm0tYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L2Zvcm0tYWN0aW9ucy9mb3JtLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFvQixNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOztBQUU5RSwyRkFBMkY7QUFTM0YsTUFBTSxPQUFPLG9CQUFvQjtJQVJqQztRQVNXLFVBQUssR0FBcUIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO1FBQ2hCLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzdEOzs7V0FHRztRQUNxQyxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osWUFBTyxHQUFHLEtBQUssQ0FBQztLQXFCekQ7SUFuQkMsNEdBQTRHO0lBQzVHLElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQW9DLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQ0ksU0FBUztRQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsY0FBYyxFQUFFLHVCQUF1QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDOytHQTVCVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixnSUFFWCxnQkFBZ0IsMEJBS2hCLGdCQUFnQixtQ0FDaEIsZ0JBQWdCLGtGQzNCdEMsb05BU0EsaVZES1ksb0JBQW9COzs0RkFLbkIsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2tDLGFBQWE7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS0UsSUFBSTtzQkFBM0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxPQUFPO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQVFsQyxTQUFTO3NCQURaLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWN0aW9uc0FsaWduLCBMYXlvdXRTdGFja0FsaWduIH0gZnJvbSAnLi4vX21vZGVscy9mb3JtLWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBMYXlvdXRTdGFja0NvbXBvbmVudCB9IGZyb20gJy4uL2xheW91dC1zdGFjay9sYXlvdXQtc3RhY2suY29tcG9uZW50JztcblxuLyoqIEJhcnJhIGRlIGHDp8O1ZXMgZGUgZm9ybXVsw6FyaW8gKFNhbHZhciwgQ2FuY2VsYXIsIEFkaWNpb25hciwg4oCmKS4gUHJvamXDp8OjbyBkZSBjb250ZcO6ZG8uICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybS1hY3Rpb25zJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0xheW91dFN0YWNrQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9mb3JtLWFjdGlvbnMuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUFjdGlvbnNDb21wb25lbnQge1xuICBASW5wdXQoKSBhbGlnbjogRm9ybUFjdGlvbnNBbGlnbiA9IEZvcm1BY3Rpb25zQWxpZ24uRW5kO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc3RhY2tPbk1vYmlsZSA9IHRydWU7XG4gIC8qKlxuICAgKiBQb3Igb21pc3PDo28gYHRydWVgOiBvcyBib3TDtWVzIHJlcGFydGVtIGEgbGFyZ3VyYSBkYSBmYWl4YSAodW0gYm90w6NvIOKJiCAxMDAlOyB2w6FyaW9zIHJlcGFydGVtIHBvciBpZ3VhbCkuXG4gICAqIFVzZSBgZmFsc2VgIHBhcmEgZmFpeGEgY29tcGFjdGEgKGxhcmd1cmEgaW50csOtbnNlY2EsIGV4LjogdsOhcmlhcyBhw6fDtWVzIGFsaW5oYWRhcyDDoCBkaXJlaXRhKS5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmaWxsID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpdmlkZXIgPSBmYWxzZTtcblxuICAvKiogYEZvcm1BY3Rpb25zQWxpZ25gIGUgYExheW91dFN0YWNrQWxpZ25gIHBhcnRpbGhhbSBvcyBtZXNtb3MgdmFsb3JlczsgZGVsZWdhw6fDo28gYW8gYGFwcC1sYXlvdXQtc3RhY2tgLiAqL1xuICBnZXQgbGF5b3V0QWxpZ24oKTogTGF5b3V0U3RhY2tBbGlnbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxpZ24gYXMgdW5rbm93biBhcyBMYXlvdXRTdGFja0FsaWduO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IFsnZm9ybS1hY3Rpb25zJywgYGZvcm0tYWN0aW9ucy0tYWxpZ24tJHt0aGlzLmFsaWdufWBdO1xuICAgIGlmICh0aGlzLnN0YWNrT25Nb2JpbGUpIHtcbiAgICAgIHBhcnRzLnB1c2goJ2Zvcm0tYWN0aW9ucy0tc3RhY2stbW9iaWxlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpdmlkZXIpIHtcbiAgICAgIHBhcnRzLnB1c2goJ2Zvcm0tYWN0aW9ucy0tZGl2aWRlcicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maWxsKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdmb3JtLWFjdGlvbnMtLWZpbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcbiAgfVxufVxuIiwiPGFwcC1sYXlvdXQtc3RhY2tcbiAgY2xhc3M9XCJmb3JtLWFjdGlvbnNfX3N0YWNrXCJcbiAgW2FsaWduXT1cImxheW91dEFsaWduXCJcbiAgW3N0YWNrT25Nb2JpbGVdPVwic3RhY2tPbk1vYmlsZVwiXG4gIFtzdGFja0ZpbGxdPVwiZmlsbFwiXG4gIFtzdGFja0RpdmlkZXJdPVwiZmFsc2VcIlxuPlxuICA8bmctY29udGVudCAvPlxuPC9hcHAtbGF5b3V0LXN0YWNrPlxuIl19
@@ -1,76 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, Input, booleanAttribute, numberAttribute, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Coluna no sistema de 12 trilhos da {@link FormRowComponent}.
5
- * Em viewports menores que `sm`, usa `xs` (por defeito largura total).
6
- */
7
- export class FormColComponent {
8
- constructor() {
9
- /** Colunas ocupadas em &lt; `sm` (por defeito 12 = linha inteira). */
10
- this.xs = 12;
11
- /** Quando `true`, a coluna pode crescer para ocupar espaço livre na linha (flex futuro / composição). */
12
- this.grow = false;
13
- }
14
- get hostClass() {
15
- return ['form-col', this.grow ? 'form-col--grow' : ''].filter(Boolean).join(' ');
16
- }
17
- get hostVars() {
18
- const sm = this.normalizeOptionalSpan(this.sm, this.xs);
19
- const md = this.normalizeOptionalSpan(this.md, sm);
20
- const lg = this.normalizeOptionalSpan(this.lg, md);
21
- const xl = this.normalizeOptionalSpan(this.xl, lg);
22
- const parts = [
23
- `--form-col-xs:${this.clampSpan(this.xs)}`,
24
- `--form-col-sm:${this.clampSpan(sm)}`,
25
- `--form-col-md:${this.clampSpan(md)}`,
26
- `--form-col-lg:${this.clampSpan(lg)}`,
27
- `--form-col-xl:${this.clampSpan(xl)}`,
28
- ];
29
- if (this.order != null && !Number.isNaN(this.order)) {
30
- parts.push(`order:${this.order}`);
31
- }
32
- return parts.join(';');
33
- }
34
- clampSpan(n) {
35
- if (!Number.isFinite(n) || n < 1) {
36
- return 12;
37
- }
38
- return Math.min(12, Math.max(1, Math.round(n)));
39
- }
40
- normalizeOptionalSpan(value, fallback) {
41
- if (value == null || !Number.isFinite(value)) {
42
- return fallback;
43
- }
44
- return this.clampSpan(value);
45
- }
46
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormColComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.12", type: FormColComponent, isStandalone: true, selector: "app-form-col", inputs: { xs: ["xs", "xs", numberAttribute], sm: "sm", md: "md", lg: "lg", xl: "xl", order: ["order", "order", numberAttribute], grow: ["grow", "grow", booleanAttribute] }, host: { properties: { "class": "this.hostClass", "attr.style": "this.hostVars" } }, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block;min-width:0;box-sizing:border-box;grid-column:span var(--form-col-xs, 12)}:host.form-col--grow{min-width:0}@media (min-width: 40rem){:host{grid-column:span var(--form-col-sm, var(--form-col-xs, 12))}}@media (min-width: 48rem){:host{grid-column:span var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12)))}}@media (min-width: 64rem){:host{grid-column:span var(--form-col-lg, var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12))))}}@media (min-width: 80rem){:host{grid-column:span var(--form-col-xl, var(--form-col-lg, var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12)))))}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
48
- }
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormColComponent, decorators: [{
50
- type: Component,
51
- args: [{ selector: 'app-form-col', standalone: true, template: '<ng-content />', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;min-width:0;box-sizing:border-box;grid-column:span var(--form-col-xs, 12)}:host.form-col--grow{min-width:0}@media (min-width: 40rem){:host{grid-column:span var(--form-col-sm, var(--form-col-xs, 12))}}@media (min-width: 48rem){:host{grid-column:span var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12)))}}@media (min-width: 64rem){:host{grid-column:span var(--form-col-lg, var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12))))}}@media (min-width: 80rem){:host{grid-column:span var(--form-col-xl, var(--form-col-lg, var(--form-col-md, var(--form-col-sm, var(--form-col-xs, 12)))))}}\n"] }]
52
- }], propDecorators: { xs: [{
53
- type: Input,
54
- args: [{ transform: numberAttribute }]
55
- }], sm: [{
56
- type: Input
57
- }], md: [{
58
- type: Input
59
- }], lg: [{
60
- type: Input
61
- }], xl: [{
62
- type: Input
63
- }], order: [{
64
- type: Input,
65
- args: [{ transform: numberAttribute }]
66
- }], grow: [{
67
- type: Input,
68
- args: [{ transform: booleanAttribute }]
69
- }], hostClass: [{
70
- type: HostBinding,
71
- args: ['class']
72
- }], hostVars: [{
73
- type: HostBinding,
74
- args: ['attr.style']
75
- }] } });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9mb3JtLWxheW91dC9mb3JtLWNvbC9mb3JtLWNvbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssRUFDTCxnQkFBZ0IsRUFDaEIsZUFBZSxHQUNoQixNQUFNLGVBQWUsQ0FBQzs7QUFFdkI7OztHQUdHO0FBUUgsTUFBTSxPQUFPLGdCQUFnQjtJQVA3QjtRQVFFLHNFQUFzRTtRQUMvQixPQUFFLEdBQUcsRUFBRSxDQUFDO1FBUy9DLHlHQUF5RztRQUNqRSxTQUFJLEdBQUcsS0FBSyxDQUFDO0tBMEN0RDtJQXhDQyxJQUNJLFNBQVM7UUFDWCxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxJQUNJLFFBQVE7UUFDVixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUc7WUFDWixpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDMUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDckMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDckMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDckMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7U0FDdEMsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBUztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8scUJBQXFCLENBQzNCLEtBQXlCLEVBQ3pCLFFBQWdCO1FBRWhCLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7K0dBckRVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLDJFQUVQLGVBQWUscUVBT2YsZUFBZSwwQkFHZixnQkFBZ0IsaUhBaEIxQixnQkFBZ0I7OzRGQUlmLGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxZQUNOLGdCQUFnQixtQkFFVCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUlSLEVBQUU7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUU1QixFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBRWlDLEtBQUs7c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUdHLElBQUk7c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR2xDLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxPQUFPO2dCQU1oQixRQUFRO3NCQURYLFdBQVc7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgbnVtYmVyQXR0cmlidXRlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIENvbHVuYSBubyBzaXN0ZW1hIGRlIDEyIHRyaWxob3MgZGEge0BsaW5rIEZvcm1Sb3dDb21wb25lbnR9LlxyXG4gKiBFbSB2aWV3cG9ydHMgbWVub3JlcyBxdWUgYHNtYCwgdXNhIGB4c2AgKHBvciBkZWZlaXRvIGxhcmd1cmEgdG90YWwpLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybS1jb2wnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudCAvPicsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0tY29sLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1Db2xDb21wb25lbnQge1xyXG4gIC8qKiBDb2x1bmFzIG9jdXBhZGFzIGVtICZsdDsgYHNtYCAocG9yIGRlZmVpdG8gMTIgPSBsaW5oYSBpbnRlaXJhKS4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSB4cyA9IDEyO1xyXG5cclxuICBASW5wdXQoKSBzbT86IG51bWJlcjtcclxuICBASW5wdXQoKSBtZD86IG51bWJlcjtcclxuICBASW5wdXQoKSBsZz86IG51bWJlcjtcclxuICBASW5wdXQoKSB4bD86IG51bWJlcjtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgb3JkZXI/OiBudW1iZXI7XHJcblxyXG4gIC8qKiBRdWFuZG8gYHRydWVgLCBhIGNvbHVuYSBwb2RlIGNyZXNjZXIgcGFyYSBvY3VwYXIgZXNwYcOnbyBsaXZyZSBuYSBsaW5oYSAoZmxleCBmdXR1cm8gLyBjb21wb3Npw6fDo28pLiAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBncm93ID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBbJ2Zvcm0tY29sJywgdGhpcy5ncm93ID8gJ2Zvcm0tY29sLS1ncm93JyA6ICcnXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnN0eWxlJylcclxuICBnZXQgaG9zdFZhcnMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNtID0gdGhpcy5ub3JtYWxpemVPcHRpb25hbFNwYW4odGhpcy5zbSwgdGhpcy54cyk7XHJcbiAgICBjb25zdCBtZCA9IHRoaXMubm9ybWFsaXplT3B0aW9uYWxTcGFuKHRoaXMubWQsIHNtKTtcclxuICAgIGNvbnN0IGxnID0gdGhpcy5ub3JtYWxpemVPcHRpb25hbFNwYW4odGhpcy5sZywgbWQpO1xyXG4gICAgY29uc3QgeGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbmFsU3Bhbih0aGlzLnhsLCBsZyk7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFtcclxuICAgICAgYC0tZm9ybS1jb2wteHM6JHt0aGlzLmNsYW1wU3Bhbih0aGlzLnhzKX1gLFxyXG4gICAgICBgLS1mb3JtLWNvbC1zbToke3RoaXMuY2xhbXBTcGFuKHNtKX1gLFxyXG4gICAgICBgLS1mb3JtLWNvbC1tZDoke3RoaXMuY2xhbXBTcGFuKG1kKX1gLFxyXG4gICAgICBgLS1mb3JtLWNvbC1sZzoke3RoaXMuY2xhbXBTcGFuKGxnKX1gLFxyXG4gICAgICBgLS1mb3JtLWNvbC14bDoke3RoaXMuY2xhbXBTcGFuKHhsKX1gLFxyXG4gICAgXTtcclxuICAgIGlmICh0aGlzLm9yZGVyICE9IG51bGwgJiYgIU51bWJlci5pc05hTih0aGlzLm9yZGVyKSkge1xyXG4gICAgICBwYXJ0cy5wdXNoKGBvcmRlcjoke3RoaXMub3JkZXJ9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGFtcFNwYW4objogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG4pIHx8IG4gPCAxKSB7XHJcbiAgICAgIHJldHVybiAxMjtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLm1pbigxMiwgTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChuKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVPcHRpb25hbFNwYW4oXHJcbiAgICB2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgZmFsbGJhY2s6IG51bWJlcixcclxuICApOiBudW1iZXIge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY2xhbXBTcGFuKHZhbHVlKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,358 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, HostBinding, Input, Output, booleanAttribute, inject, } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { FormGroupDirective } from '@angular/forms';
4
- import { fromEvent } from 'rxjs';
5
- import { filter } from 'rxjs/operators';
6
- import { FormGroupVariant } from '../_models/form-layout.model';
7
- import { subscribeMarkForCheckOnInvalidUiRefresh } from './form-root-invalid-ui-refresh.util';
8
- import { resolveControlAtPath, subtreeHasVisibleInvalid } from './form-path.utils';
9
- import * as i0 from "@angular/core";
10
- /** Par com `app-validation-summary` / foco em campo (expandir ancestrais antes do scroll). */
11
- const UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';
12
- export class FormGroupComponent {
13
- constructor() {
14
- this.cdr = inject(ChangeDetectorRef);
15
- this.destroyRef = inject(DestroyRef);
16
- this.hostRef = inject((ElementRef));
17
- this.rootFormDir = inject(FormGroupDirective, { optional: true });
18
- this.subtitulo = '';
19
- this.collapsible = true;
20
- /**
21
- * Quando `true` (padrão), o cabeçalho alterna aberto/fechado (respeita {@link collapsed}).
22
- * Quando `false`, o grupo permanece **sempre expandido** (não recolhe), a seta fica só indicativa **em cinza**
23
- * e o cabeçalho deixa de ser clicável — útil para seções obrigatórias sempre visíveis.
24
- */
25
- this.foldable = true;
26
- /**
27
- * Com `collapsible`: `true` = grupo **fechado** (só cabeçalho visível), `false` = **aberto**.
28
- * O pai pode fixar o estado inicial e manter com `(collapsedChange)` ou `[collapsed]` ligado a uma variável.
29
- * Se {@link foldable} for `false`, o estado efectivo é sempre **aberto** (ignora-se `collapsed` para o corpo).
30
- */
31
- this.collapsed = false;
32
- this.disabled = false;
33
- this.dense = false;
34
- this.canMoveUp = false;
35
- this.canMoveDown = false;
36
- this.showHeader = true;
37
- this.showDivider = false;
38
- this.variant = FormGroupVariant.Default;
39
- /**
40
- * Com `collapsible` e `collapsed`: se `true`, o corpo **não** é criado no DOM enquanto o
41
- * grupo está fechado (após a primeira expansão pode voltar a fechar e voltar a desmontar).
42
- * Útil para blocos pesados inicialmente fechados; o `FormGroup` reactivo no ascendente
43
- * conserva valores — os `FormControlName` religam ao reabrir.
44
- */
45
- this.destroyOnCollapse = false;
46
- /**
47
- * Quando `true`, o corpo não força `flex-direction: column` nos filhos projetados (ex.: conteúdo
48
- * próprio com grade ou `flex` em linha). O padrão `false` mantém o espaçamento vertical entre
49
- * várias `app-form-row` / wrapper com `formGroupName`.
50
- */
51
- this.skipBodyChildStacking = false;
52
- /**
53
- * Quando `true`, mostra o ícone de aviso no cabeçalho. O pai deve refletir inválido **e** critério
54
- * de UX (ex. `dirty` ou formulário já submetido), não só `touched` — Tab/foco não deve acender sozinho.
55
- * Ignorado quando {@link formGroupPath} está definido (usa-se só o cálculo automático).
56
- */
57
- this.groupInvalid = false;
58
- /**
59
- * Caminho no `FormGroup` raiz do `<form [formGroup]>` (ex.: `identificacao`, `endereco.morada`).
60
- * Quando preenchido, o ícone de aviso é calculado automaticamente a partir do estado reativo,
61
- * sem precisar de `[groupInvalid]` manual.
62
- */
63
- this.formGroupPath = '';
64
- /**
65
- * Quando `true`, o critério “já houve tentativa de envio” para o ícone automático (`formGroupPath`)
66
- * inclui este sinal (ex.: alinhar a `app-form-tabs` `[warning]` com `markAllAsTouched()` sem `submitted`
67
- * no `FormGroupDirective`, ou validação disparada por `(click)` em vez de `submit`).
68
- */
69
- this.uxSubmittedPass = false;
70
- this.collapsedChange = new EventEmitter();
71
- this.moveUp = new EventEmitter();
72
- this.moveDown = new EventEmitter();
73
- /** Estado interno espelha o input (OnPush + alterações externas). */
74
- this.collapsedInternal = false;
75
- /** Evita `scrollIntoView` duplo no mesmo ciclo (clique + `[collapsed]` do pai). */
76
- this.scrollIntoViewCoalesce = false;
77
- /**
78
- * `FormGroupDirective.submitted` nem sempre fica `true` no ciclo do ícone com `[formGroup]` reactivo;
79
- * o `submit` nativo do `<form>` garante aviso nos filhos após «Salvar» + `markAllAsTouched()`.
80
- * Repõe-se quando o `FormGroup` raiz volta a `VALID`.
81
- */
82
- this.formSubmitPassActive = false;
83
- /** Rastreia `rootFormDir.submitted` para repor {@link formSubmitPassActive} após `resetForm` com raiz ainda inválida. */
84
- this.prevRootFormSubmitted = null;
85
- }
86
- ngOnInit() {
87
- this.applyCollapsedFromInputs();
88
- this.setupFormPathInvalidTracking();
89
- this.setupExpandRequestListener();
90
- }
91
- /**
92
- * Permite expandir o grupo a partir do exterior (ex.: resumo de validação antes de focar um campo).
93
- * `CustomEvent` no host: `ui-request-expand` (sem bubbles).
94
- */
95
- setupExpandRequestListener() {
96
- const host = this.hostRef.nativeElement;
97
- const onExpandRequest = (ev) => {
98
- ev.stopPropagation();
99
- if (!this.collapsible ||
100
- this.disabled ||
101
- !this.foldable ||
102
- !this.collapsedInternal) {
103
- return;
104
- }
105
- // Síncrono: o resumo adia `navigateToFieldId` com `setTimeout`, fora do CD. Expandir já aqui
106
- // garante que o scroll/foco seguinte vê o grupo aberto (evita precisar de um segundo clique).
107
- this.setCollapsed(false, { skipScroll: true });
108
- };
109
- host.addEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest);
110
- this.destroyRef.onDestroy(() => host.removeEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest));
111
- }
112
- /** Ícone de aviso: automático com `formGroupPath`, senão `groupInvalid` manual. */
113
- get invalidFlagVisible() {
114
- const raw = this.formGroupPath?.trim();
115
- if (raw && this.rootFormDir?.control) {
116
- const target = resolveControlAtPath(this.rootFormDir.control, raw);
117
- if (!target?.invalid) {
118
- return false;
119
- }
120
- const formSubmitted = !!this.rootFormDir.submitted ||
121
- this.formSubmitPassActive ||
122
- this.uxSubmittedPass;
123
- return subtreeHasVisibleInvalid(target, formSubmitted);
124
- }
125
- return this.groupInvalid;
126
- }
127
- /**
128
- * `markAllAsTouched()` / `submitted` não passam sempre por `valueChanges`; com OnPush o getter
129
- * do ícone precisa do `submit` do `<form>` ancestral (após um tick) para atualizar.
130
- */
131
- setupFormPathInvalidTracking() {
132
- const raw = this.formGroupPath?.trim();
133
- const rootCtrl = this.rootFormDir?.control;
134
- if (!raw || !rootCtrl) {
135
- return;
136
- }
137
- subscribeMarkForCheckOnInvalidUiRefresh(rootCtrl, this.hostRef.nativeElement, this.cdr, this.destroyRef);
138
- const formEl = this.hostRef.nativeElement.closest('form');
139
- if (formEl) {
140
- fromEvent(formEl, 'submit', { capture: true })
141
- .pipe(takeUntilDestroyed(this.destroyRef))
142
- .subscribe(() => {
143
- this.formSubmitPassActive = true;
144
- this.cdr.markForCheck();
145
- });
146
- }
147
- rootCtrl.statusChanges
148
- .pipe(filter(() => rootCtrl.valid), takeUntilDestroyed(this.destroyRef))
149
- .subscribe(() => {
150
- this.formSubmitPassActive = false;
151
- this.cdr.markForCheck();
152
- });
153
- }
154
- ngOnChanges(changes) {
155
- if (changes['uxSubmittedPass'] ||
156
- changes['formGroupPath'] ||
157
- changes['groupInvalid']) {
158
- this.cdr.markForCheck();
159
- }
160
- if (changes['collapsed'] || changes['foldable']) {
161
- const c = changes['collapsed'];
162
- const wasCollapsed = !!c && !c.firstChange && c.previousValue === true;
163
- this.applyCollapsedFromInputs();
164
- const nowExpanded = !this.collapsedInternal;
165
- if (this.collapsible && this.foldable && wasCollapsed && nowExpanded) {
166
- this.scheduleScrollIntoView();
167
- }
168
- this.cdr.markForCheck();
169
- }
170
- }
171
- /** Estado interno de colapso: com `foldable === false` força sempre expandido. */
172
- applyCollapsedFromInputs() {
173
- this.collapsedInternal = this.foldable ? this.collapsed : false;
174
- }
175
- get hostClass() {
176
- const parts = ['form-group', `form-group--${this.variant}`];
177
- if (this.dense) {
178
- parts.push('form-group--dense');
179
- }
180
- if (this.disabled) {
181
- parts.push('form-group--disabled');
182
- }
183
- if (this.showDivider) {
184
- parts.push('form-group--divider');
185
- }
186
- if (this.collapsible) {
187
- parts.push('form-group--collapsible');
188
- if (!this.foldable) {
189
- parts.push('form-group--fold-locked');
190
- }
191
- parts.push(this.collapsedInternal ? 'form-group--collapsed' : 'form-group--expanded');
192
- }
193
- return parts.join(' ');
194
- }
195
- get showHeaderBar() {
196
- if (!this.showHeader) {
197
- return false;
198
- }
199
- return (this.titulo.trim().length > 0 ||
200
- this.subtitulo.trim().length > 0 ||
201
- this.collapsible ||
202
- this.canMoveUp ||
203
- this.canMoveDown ||
204
- this.invalidFlagVisible);
205
- }
206
- get isCollapsed() {
207
- return this.collapsedInternal;
208
- }
209
- get renderBodyInDom() {
210
- if (this.destroyOnCollapse) {
211
- return !this.collapsedInternal;
212
- }
213
- return true;
214
- }
215
- get bodyVisuallyHidden() {
216
- return !this.destroyOnCollapse && this.collapsedInternal;
217
- }
218
- get headerIsInteractive() {
219
- return this.collapsible && !this.disabled && this.foldable;
220
- }
221
- onHeaderClick() {
222
- if (!this.headerIsInteractive) {
223
- return;
224
- }
225
- this.setCollapsed(!this.collapsedInternal);
226
- }
227
- onHeaderKeydown(ev) {
228
- if (!this.headerIsInteractive) {
229
- return;
230
- }
231
- if (ev.key === 'Enter' || ev.key === ' ') {
232
- ev.preventDefault();
233
- this.setCollapsed(!this.collapsedInternal);
234
- }
235
- }
236
- onMoveUpClick(ev) {
237
- ev.stopPropagation();
238
- if (this.disabled || !this.canMoveUp) {
239
- return;
240
- }
241
- this.moveUp.emit();
242
- }
243
- onMoveDownClick(ev) {
244
- ev.stopPropagation();
245
- if (this.disabled || !this.canMoveDown) {
246
- return;
247
- }
248
- this.moveDown.emit();
249
- }
250
- setCollapsed(next, options) {
251
- if (!this.foldable && next) {
252
- return;
253
- }
254
- const wasCollapsed = this.collapsedInternal;
255
- this.collapsedInternal = next;
256
- this.collapsedChange.emit(next);
257
- this.cdr.markForCheck();
258
- const skipScroll = options?.skipScroll === true;
259
- if (this.collapsible && this.foldable && wasCollapsed && !next && !skipScroll) {
260
- this.scheduleScrollIntoView();
261
- }
262
- }
263
- /**
264
- * Após expandir, desloca a vista até ao grupo com scroll nativo suave, só o necessário
265
- * (`block: 'nearest'`). Executa após pintar o corpo expandido.
266
- */
267
- scheduleScrollIntoView() {
268
- if (this.scrollIntoViewCoalesce) {
269
- return;
270
- }
271
- this.scrollIntoViewCoalesce = true;
272
- queueMicrotask(() => {
273
- requestAnimationFrame(() => {
274
- this.scrollIntoViewCoalesce = false;
275
- this.hostRef.nativeElement.scrollIntoView({
276
- behavior: 'smooth',
277
- block: 'nearest',
278
- inline: 'nearest',
279
- });
280
- });
281
- });
282
- }
283
- ngDoCheck() {
284
- if (!this.formGroupPath?.trim()) {
285
- return;
286
- }
287
- const submitted = !!this.rootFormDir?.submitted;
288
- if (this.prevRootFormSubmitted === true && submitted === false) {
289
- this.formSubmitPassActive = false;
290
- this.cdr.markForCheck();
291
- }
292
- this.prevRootFormSubmitted = submitted;
293
- }
294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
295
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FormGroupComponent, isStandalone: true, selector: "app-form-group", inputs: { titulo: "titulo", subtitulo: "subtitulo", collapsible: ["collapsible", "collapsible", booleanAttribute], foldable: ["foldable", "foldable", booleanAttribute], collapsed: ["collapsed", "collapsed", booleanAttribute], disabled: ["disabled", "disabled", booleanAttribute], dense: ["dense", "dense", booleanAttribute], canMoveUp: ["canMoveUp", "canMoveUp", booleanAttribute], canMoveDown: ["canMoveDown", "canMoveDown", booleanAttribute], showHeader: ["showHeader", "showHeader", booleanAttribute], showDivider: ["showDivider", "showDivider", booleanAttribute], variant: "variant", destroyOnCollapse: ["destroyOnCollapse", "destroyOnCollapse", booleanAttribute], skipBodyChildStacking: ["skipBodyChildStacking", "skipBodyChildStacking", booleanAttribute], groupInvalid: ["groupInvalid", "groupInvalid", booleanAttribute], formGroupPath: "formGroupPath", uxSubmittedPass: ["uxSubmittedPass", "uxSubmittedPass", booleanAttribute] }, outputs: { collapsedChange: "collapsedChange", moveUp: "moveUp", moveDown: "moveDown" }, host: { properties: { "class": "this.hostClass" } }, usesOnChanges: true, ngImport: i0, template: "@if (showHeaderBar) {\r\n <div\r\n class=\"form-group__header\"\r\n [class.form-group__header--interactive]=\"headerIsInteractive\"\r\n [attr.role]=\"headerIsInteractive ? 'button' : null\"\r\n [attr.tabindex]=\"headerIsInteractive ? 0 : null\"\r\n [attr.aria-expanded]=\"headerIsInteractive ? !isCollapsed : null\"\r\n [attr.aria-disabled]=\"disabled ? true : null\"\r\n (click)=\"onHeaderClick()\"\r\n (keydown)=\"onHeaderKeydown($event)\"\r\n >\r\n <div class=\"form-group__header-main\">\r\n @if (collapsible && !disabled) {\r\n <span\r\n class=\"form-group__chevron\"\r\n [class.form-group__chevron--locked]=\"!foldable\"\r\n aria-hidden=\"true\"\r\n >\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-chevron-right]=\"foldable && isCollapsed\"\r\n [class.fa-chevron-down]=\"!foldable || !isCollapsed\"\r\n ></i>\r\n </span>\r\n }\r\n <div class=\"form-group__titles\">\r\n @if (titulo.trim()) {\r\n <h3 class=\"form-group__title\">{{ titulo }}</h3>\r\n }\r\n @if (subtitulo.trim()) {\r\n <p class=\"form-group__subtitle\">{{ subtitulo }}</p>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"form-group__header-trailing\">\r\n <span\r\n class=\"form-group__invalid-flag\"\r\n [class.form-group__invalid-flag--visible]=\"invalidFlagVisible\"\r\n [attr.role]=\"invalidFlagVisible ? 'img' : null\"\r\n [attr.aria-label]=\"invalidFlagVisible ? 'Existem erros de valida\u00E7\u00E3o neste grupo' : null\"\r\n [attr.aria-hidden]=\"invalidFlagVisible ? null : 'true'\"\r\n [attr.title]=\"invalidFlagVisible ? 'Existem erros de valida\u00E7\u00E3o neste grupo' : null\"\r\n >\r\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\r\n </span>\r\n @if (canMoveUp || canMoveDown) {\r\n <div class=\"form-group__reorder\" (click)=\"$event.stopPropagation()\">\r\n @if (canMoveUp) {\r\n <button\r\n type=\"button\"\r\n class=\"form-group__reorder-btn\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Mover grupo para cima\"\r\n (click)=\"onMoveUpClick($event)\"\r\n >\r\n <i class=\"fa-solid fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if (canMoveDown) {\r\n <button\r\n type=\"button\"\r\n class=\"form-group__reorder-btn\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Mover grupo para baixo\"\r\n (click)=\"onMoveDownClick($event)\"\r\n >\r\n <i class=\"fa-solid fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (renderBodyInDom) {\r\n <div class=\"form-group__body\" [class.form-group__body--collapsed-hidden]=\"bodyVisuallyHidden\">\r\n <div\r\n class=\"form-group__body-stack\"\r\n [class.form-group__body-stack--neutral]=\"skipBodyChildStacking\"\r\n >\r\n <ng-content />\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box;scroll-margin-top:.75rem;scroll-margin-bottom:.5rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle){border:1px solid var(--app-color-border, #e8eaed);border-radius:12px;background:var(--app-color-surface, #fff);padding:0;overflow:hidden;transition:border-color .28s ease,box-shadow .28s ease}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--collapsed{border-color:var(--app-color-border, #e4e6ea);box-shadow:none}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded{border-color:var(--app-color-border-strong, #d4dce8);box-shadow:0 1px 2px var(--app-color-border-subtle, rgba(22, 40, 72, .05)),0 4px 18px var(--app-color-elevated-shadow, rgba(43, 127, 217, .07))}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle) .form-group__header{margin:0;padding:.65rem 1rem .75rem;border-radius:0}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--collapsed .form-group__header{padding-bottom:.7rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__header{margin-bottom:0;padding-bottom:.65rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__body{padding:.9rem 1rem}:host.form-group--dense.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__header{margin-bottom:0;padding-bottom:.5rem}:host.form-group--dense.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__body{padding:.7rem .85rem}.form-group__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin:0 0 1rem;padding:.35rem 0;border-radius:8px;outline:none}.form-group__header--interactive{cursor:pointer;user-select:none;-webkit-user-select:none}.form-group__header--interactive:hover:not([aria-disabled=true]){background:var(--app-color-group-header-hover, rgba(43, 127, 217, .06))}.form-group__header--interactive:focus-visible{box-shadow:0 0 0 2px var(--app-color-focus-ring, rgba(43, 127, 217, .25))}.form-group__header-main{display:flex;align-items:flex-start;gap:.5rem;min-width:0;flex:1}.form-group__chevron{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-top:.1rem;flex-shrink:0;color:var(--ui-field-float-prefix-color, #5a7fa3);font-size:.75rem}.form-group__chevron--locked{color:var(--ui-form-group-chevron-locked, #9aa3ad)}.form-group__titles{min-width:0;flex:1}.form-group__title{margin:0 0 .2rem;font-size:1.05rem;font-weight:600;line-height:1.35;color:var(--ui-field-label-color, #1a1a1a)}.form-group__subtitle{margin:0;font-size:.85rem;line-height:1.4;color:var(--app-color-text-muted, #525252)}.form-group__header-trailing{display:flex;flex-shrink:0;align-items:flex-start;gap:.35rem}.form-group__invalid-flag{display:flex;flex-shrink:0;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-top:.1rem;font-size:1.05rem;line-height:1;color:var(--app-color-error, #c62828);cursor:inherit;opacity:0;visibility:hidden;pointer-events:none;transform:scale(.92);transition:opacity .22s ease,visibility .22s ease,transform .22s ease}.form-group__invalid-flag--visible{opacity:1;visibility:visible;pointer-events:auto;transform:scale(1)}.form-group__reorder{display:flex;flex-shrink:0;gap:.25rem;align-items:center}.form-group__reorder-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color, #5a7fa3);cursor:pointer;transition:background .15s ease,color .15s ease}.form-group__reorder-btn:hover:not(:disabled){background:var(--app-color-hover-bg-strong, rgba(90, 127, 163, .12));color:var(--ui-field-float-label-top-color, #4a6d8c)}.form-group__reorder-btn:disabled{cursor:not-allowed;opacity:.45}.form-group__body{display:flex;flex-direction:column;gap:.75rem;min-width:0;transition:opacity .18s ease}.form-group__body-stack{display:flex;flex-direction:column;gap:inherit;min-width:0;width:100%}.form-group__body-stack--neutral{display:block;gap:unset}:host ::ng-deep .form-group__body-stack:not(.form-group__body-stack--neutral)>*{display:flex;flex-direction:column;gap:inherit;min-width:0}.form-group__body--collapsed-hidden{display:none}:host.form-group--dense .form-group__header{margin-bottom:.65rem;padding-block:.2rem}:host.form-group--dense .form-group__title{font-size:1rem}:host.form-group--dense .form-group__body{gap:.5rem}:host.form-group--disabled{opacity:.72;pointer-events:none}:host.form-group--disabled .form-group__reorder{pointer-events:none}:host.form-group--outlined{padding:1rem 1rem 1.25rem;border:1px solid var(--ui-field-float-border, #b6cce5);border-radius:var(--ui-field-float-border-radius, 14px);background:var(--ui-field-float-bg, #f3f7fb)}:host.form-group--subtle{padding:.75rem .85rem 1rem;border-radius:10px;background:var(--app-color-background, #fafafa)}:host.form-group--divider:not(.form-group--outlined):not(.form-group--subtle):not(.form-group--collapsible) .form-group__header{border-bottom:1px solid var(--app-color-border, #e5e5e5);padding-bottom:.65rem;margin-bottom:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
296
- }
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormGroupComponent, decorators: [{
298
- type: Component,
299
- args: [{ selector: 'app-form-group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showHeaderBar) {\r\n <div\r\n class=\"form-group__header\"\r\n [class.form-group__header--interactive]=\"headerIsInteractive\"\r\n [attr.role]=\"headerIsInteractive ? 'button' : null\"\r\n [attr.tabindex]=\"headerIsInteractive ? 0 : null\"\r\n [attr.aria-expanded]=\"headerIsInteractive ? !isCollapsed : null\"\r\n [attr.aria-disabled]=\"disabled ? true : null\"\r\n (click)=\"onHeaderClick()\"\r\n (keydown)=\"onHeaderKeydown($event)\"\r\n >\r\n <div class=\"form-group__header-main\">\r\n @if (collapsible && !disabled) {\r\n <span\r\n class=\"form-group__chevron\"\r\n [class.form-group__chevron--locked]=\"!foldable\"\r\n aria-hidden=\"true\"\r\n >\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-chevron-right]=\"foldable && isCollapsed\"\r\n [class.fa-chevron-down]=\"!foldable || !isCollapsed\"\r\n ></i>\r\n </span>\r\n }\r\n <div class=\"form-group__titles\">\r\n @if (titulo.trim()) {\r\n <h3 class=\"form-group__title\">{{ titulo }}</h3>\r\n }\r\n @if (subtitulo.trim()) {\r\n <p class=\"form-group__subtitle\">{{ subtitulo }}</p>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"form-group__header-trailing\">\r\n <span\r\n class=\"form-group__invalid-flag\"\r\n [class.form-group__invalid-flag--visible]=\"invalidFlagVisible\"\r\n [attr.role]=\"invalidFlagVisible ? 'img' : null\"\r\n [attr.aria-label]=\"invalidFlagVisible ? 'Existem erros de valida\u00E7\u00E3o neste grupo' : null\"\r\n [attr.aria-hidden]=\"invalidFlagVisible ? null : 'true'\"\r\n [attr.title]=\"invalidFlagVisible ? 'Existem erros de valida\u00E7\u00E3o neste grupo' : null\"\r\n >\r\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>\r\n </span>\r\n @if (canMoveUp || canMoveDown) {\r\n <div class=\"form-group__reorder\" (click)=\"$event.stopPropagation()\">\r\n @if (canMoveUp) {\r\n <button\r\n type=\"button\"\r\n class=\"form-group__reorder-btn\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Mover grupo para cima\"\r\n (click)=\"onMoveUpClick($event)\"\r\n >\r\n <i class=\"fa-solid fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n @if (canMoveDown) {\r\n <button\r\n type=\"button\"\r\n class=\"form-group__reorder-btn\"\r\n [disabled]=\"disabled\"\r\n aria-label=\"Mover grupo para baixo\"\r\n (click)=\"onMoveDownClick($event)\"\r\n >\r\n <i class=\"fa-solid fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n\r\n@if (renderBodyInDom) {\r\n <div class=\"form-group__body\" [class.form-group__body--collapsed-hidden]=\"bodyVisuallyHidden\">\r\n <div\r\n class=\"form-group__body-stack\"\r\n [class.form-group__body-stack--neutral]=\"skipBodyChildStacking\"\r\n >\r\n <ng-content />\r\n </div>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;min-width:0;box-sizing:border-box;scroll-margin-top:.75rem;scroll-margin-bottom:.5rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle){border:1px solid var(--app-color-border, #e8eaed);border-radius:12px;background:var(--app-color-surface, #fff);padding:0;overflow:hidden;transition:border-color .28s ease,box-shadow .28s ease}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--collapsed{border-color:var(--app-color-border, #e4e6ea);box-shadow:none}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded{border-color:var(--app-color-border-strong, #d4dce8);box-shadow:0 1px 2px var(--app-color-border-subtle, rgba(22, 40, 72, .05)),0 4px 18px var(--app-color-elevated-shadow, rgba(43, 127, 217, .07))}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle) .form-group__header{margin:0;padding:.65rem 1rem .75rem;border-radius:0}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--collapsed .form-group__header{padding-bottom:.7rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__header{margin-bottom:0;padding-bottom:.65rem}:host.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__body{padding:.9rem 1rem}:host.form-group--dense.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__header{margin-bottom:0;padding-bottom:.5rem}:host.form-group--dense.form-group--collapsible:not(.form-group--outlined):not(.form-group--subtle).form-group--expanded .form-group__body{padding:.7rem .85rem}.form-group__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin:0 0 1rem;padding:.35rem 0;border-radius:8px;outline:none}.form-group__header--interactive{cursor:pointer;user-select:none;-webkit-user-select:none}.form-group__header--interactive:hover:not([aria-disabled=true]){background:var(--app-color-group-header-hover, rgba(43, 127, 217, .06))}.form-group__header--interactive:focus-visible{box-shadow:0 0 0 2px var(--app-color-focus-ring, rgba(43, 127, 217, .25))}.form-group__header-main{display:flex;align-items:flex-start;gap:.5rem;min-width:0;flex:1}.form-group__chevron{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-top:.1rem;flex-shrink:0;color:var(--ui-field-float-prefix-color, #5a7fa3);font-size:.75rem}.form-group__chevron--locked{color:var(--ui-form-group-chevron-locked, #9aa3ad)}.form-group__titles{min-width:0;flex:1}.form-group__title{margin:0 0 .2rem;font-size:1.05rem;font-weight:600;line-height:1.35;color:var(--ui-field-label-color, #1a1a1a)}.form-group__subtitle{margin:0;font-size:.85rem;line-height:1.4;color:var(--app-color-text-muted, #525252)}.form-group__header-trailing{display:flex;flex-shrink:0;align-items:flex-start;gap:.35rem}.form-group__invalid-flag{display:flex;flex-shrink:0;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;margin-top:.1rem;font-size:1.05rem;line-height:1;color:var(--app-color-error, #c62828);cursor:inherit;opacity:0;visibility:hidden;pointer-events:none;transform:scale(.92);transition:opacity .22s ease,visibility .22s ease,transform .22s ease}.form-group__invalid-flag--visible{opacity:1;visibility:visible;pointer-events:auto;transform:scale(1)}.form-group__reorder{display:flex;flex-shrink:0;gap:.25rem;align-items:center}.form-group__reorder-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color, #5a7fa3);cursor:pointer;transition:background .15s ease,color .15s ease}.form-group__reorder-btn:hover:not(:disabled){background:var(--app-color-hover-bg-strong, rgba(90, 127, 163, .12));color:var(--ui-field-float-label-top-color, #4a6d8c)}.form-group__reorder-btn:disabled{cursor:not-allowed;opacity:.45}.form-group__body{display:flex;flex-direction:column;gap:.75rem;min-width:0;transition:opacity .18s ease}.form-group__body-stack{display:flex;flex-direction:column;gap:inherit;min-width:0;width:100%}.form-group__body-stack--neutral{display:block;gap:unset}:host ::ng-deep .form-group__body-stack:not(.form-group__body-stack--neutral)>*{display:flex;flex-direction:column;gap:inherit;min-width:0}.form-group__body--collapsed-hidden{display:none}:host.form-group--dense .form-group__header{margin-bottom:.65rem;padding-block:.2rem}:host.form-group--dense .form-group__title{font-size:1rem}:host.form-group--dense .form-group__body{gap:.5rem}:host.form-group--disabled{opacity:.72;pointer-events:none}:host.form-group--disabled .form-group__reorder{pointer-events:none}:host.form-group--outlined{padding:1rem 1rem 1.25rem;border:1px solid var(--ui-field-float-border, #b6cce5);border-radius:var(--ui-field-float-border-radius, 14px);background:var(--ui-field-float-bg, #f3f7fb)}:host.form-group--subtle{padding:.75rem .85rem 1rem;border-radius:10px;background:var(--app-color-background, #fafafa)}:host.form-group--divider:not(.form-group--outlined):not(.form-group--subtle):not(.form-group--collapsible) .form-group__header{border-bottom:1px solid var(--app-color-border, #e5e5e5);padding-bottom:.65rem;margin-bottom:1rem}\n"] }]
300
- }], propDecorators: { titulo: [{
301
- type: Input,
302
- args: [{ required: true }]
303
- }], subtitulo: [{
304
- type: Input
305
- }], collapsible: [{
306
- type: Input,
307
- args: [{ transform: booleanAttribute }]
308
- }], foldable: [{
309
- type: Input,
310
- args: [{ transform: booleanAttribute }]
311
- }], collapsed: [{
312
- type: Input,
313
- args: [{ transform: booleanAttribute }]
314
- }], disabled: [{
315
- type: Input,
316
- args: [{ transform: booleanAttribute }]
317
- }], dense: [{
318
- type: Input,
319
- args: [{ transform: booleanAttribute }]
320
- }], canMoveUp: [{
321
- type: Input,
322
- args: [{ transform: booleanAttribute }]
323
- }], canMoveDown: [{
324
- type: Input,
325
- args: [{ transform: booleanAttribute }]
326
- }], showHeader: [{
327
- type: Input,
328
- args: [{ transform: booleanAttribute }]
329
- }], showDivider: [{
330
- type: Input,
331
- args: [{ transform: booleanAttribute }]
332
- }], variant: [{
333
- type: Input
334
- }], destroyOnCollapse: [{
335
- type: Input,
336
- args: [{ transform: booleanAttribute }]
337
- }], skipBodyChildStacking: [{
338
- type: Input,
339
- args: [{ transform: booleanAttribute }]
340
- }], groupInvalid: [{
341
- type: Input,
342
- args: [{ transform: booleanAttribute }]
343
- }], formGroupPath: [{
344
- type: Input
345
- }], uxSubmittedPass: [{
346
- type: Input,
347
- args: [{ transform: booleanAttribute }]
348
- }], collapsedChange: [{
349
- type: Output
350
- }], moveUp: [{
351
- type: Output
352
- }], moveDown: [{
353
- type: Output
354
- }], hostClass: [{
355
- type: HostBinding,
356
- args: ['class']
357
- }] } });
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L2Zvcm0tZ3JvdXAvZm9ybS1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L2Zvcm0tZ3JvdXAvZm9ybS1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVWLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4sZ0JBQWdCLEVBQ2hCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFbkYsOEZBQThGO0FBQzlGLE1BQU0sNEJBQTRCLEdBQUcsbUJBQW1CLENBQUM7QUFTekQsTUFBTSxPQUFPLGtCQUFrQjtJQVAvQjtRQVFtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxZQUFPLEdBQUcsTUFB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a0MsaUJBQWlCO3NCQUF4RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLHFCQUFxQjtzQkFBNUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFNRSxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU83QixhQUFhO3NCQUFyQixLQUFLO2dCQU9rQyxlQUFlO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUVuQixlQUFlO3NCQUFqQyxNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFtSUgsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBEZXN0cm95UmVmLFxyXG4gIERvQ2hlY2ssXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG4gIGluamVjdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cFZhcmlhbnQgfSBmcm9tICcuLi9fbW9kZWxzL2Zvcm0tbGF5b3V0Lm1vZGVsJztcclxuaW1wb3J0IHsgc3Vic2NyaWJlTWFya0ZvckNoZWNrT25JbnZhbGlkVWlSZWZyZXNoIH0gZnJvbSAnLi9mb3JtLXJvb3QtaW52YWxpZC11aS1yZWZyZXNoLnV0aWwnO1xyXG5pbXBvcnQgeyByZXNvbHZlQ29udHJvbEF0UGF0aCwgc3VidHJlZUhhc1Zpc2libGVJbnZhbGlkIH0gZnJvbSAnLi9mb3JtLXBhdGgudXRpbHMnO1xyXG5cclxuLyoqIFBhciBjb20gYGFwcC12YWxpZGF0aW9uLXN1bW1hcnlgIC8gZm9jbyBlbSBjYW1wbyAoZXhwYW5kaXIgYW5jZXN0cmFpcyBhbnRlcyBkbyBzY3JvbGwpLiAqL1xyXG5jb25zdCBVSV9SRVFVRVNUX0VYUEFORF9GT1JNX0dST1VQID0gJ3VpLXJlcXVlc3QtZXhwYW5kJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZvcm0tZ3JvdXAnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9mb3JtLWdyb3VwLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBEb0NoZWNrIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9ybURpciA9IGluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHRpdHVsbyE6IHN0cmluZztcclxuICBASW5wdXQoKSBzdWJ0aXR1bG8gPSAnJztcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbGxhcHNpYmxlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBRdWFuZG8gYHRydWVgIChwYWRyw6NvKSwgbyBjYWJlw6dhbGhvIGFsdGVybmEgYWJlcnRvL2ZlY2hhZG8gKHJlc3BlaXRhIHtAbGluayBjb2xsYXBzZWR9KS5cclxuICAgKiBRdWFuZG8gYGZhbHNlYCwgbyBncnVwbyBwZXJtYW5lY2UgKipzZW1wcmUgZXhwYW5kaWRvKiogKG7Do28gcmVjb2xoZSksIGEgc2V0YSBmaWNhIHPDsyBpbmRpY2F0aXZhICoqZW0gY2luemEqKlxyXG4gICAqIGUgbyBjYWJlw6dhbGhvIGRlaXhhIGRlIHNlciBjbGljw6F2ZWwg4oCUIMO6dGlsIHBhcmEgc2XDp8O1ZXMgb2JyaWdhdMOzcmlhcyBzZW1wcmUgdmlzw612ZWlzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmb2xkYWJsZSA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogQ29tIGBjb2xsYXBzaWJsZWA6IGB0cnVlYCA9IGdydXBvICoqZmVjaGFkbyoqIChzw7MgY2FiZcOnYWxobyB2aXPDrXZlbCksIGBmYWxzZWAgPSAqKmFiZXJ0byoqLlxyXG4gICAqIE8gcGFpIHBvZGUgZml4YXIgbyBlc3RhZG8gaW5pY2lhbCBlIG1hbnRlciBjb20gYChjb2xsYXBzZWRDaGFuZ2UpYCBvdSBgW2NvbGxhcHNlZF1gIGxpZ2FkbyBhIHVtYSB2YXJpw6F2ZWwuXHJcbiAgICogU2Uge0BsaW5rIGZvbGRhYmxlfSBmb3IgYGZhbHNlYCwgbyBlc3RhZG8gZWZlY3Rpdm8gw6kgc2VtcHJlICoqYWJlcnRvKiogKGlnbm9yYS1zZSBgY29sbGFwc2VkYCBwYXJhIG8gY29ycG8pLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb2xsYXBzZWQgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGVuc2UgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2FuTW92ZVVwID0gZmFsc2U7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhbk1vdmVEb3duID0gZmFsc2U7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dIZWFkZXIgPSB0cnVlO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93RGl2aWRlciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEZvcm1Hcm91cFZhcmlhbnQgPSBGb3JtR3JvdXBWYXJpYW50LkRlZmF1bHQ7XHJcbiAgLyoqXHJcbiAgICogQ29tIGBjb2xsYXBzaWJsZWAgZSBgY29sbGFwc2VkYDogc2UgYHRydWVgLCBvIGNvcnBvICoqbsOjbyoqIMOpIGNyaWFkbyBubyBET00gZW5xdWFudG8gb1xyXG4gICAqIGdydXBvIGVzdMOhIGZlY2hhZG8gKGFww7NzIGEgcHJpbWVpcmEgZXhwYW5zw6NvIHBvZGUgdm9sdGFyIGEgZmVjaGFyIGUgdm9sdGFyIGEgZGVzbW9udGFyKS5cclxuICAgKiDDmnRpbCBwYXJhIGJsb2NvcyBwZXNhZG9zIGluaWNpYWxtZW50ZSBmZWNoYWRvczsgbyBgRm9ybUdyb3VwYCByZWFjdGl2byBubyBhc2NlbmRlbnRlXHJcbiAgICogY29uc2VydmEgdmFsb3JlcyDigJQgb3MgYEZvcm1Db250cm9sTmFtZWAgcmVsaWdhbSBhbyByZWFicmlyLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZXN0cm95T25Db2xsYXBzZSA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG8gY29ycG8gbsOjbyBmb3LDp2EgYGZsZXgtZGlyZWN0aW9uOiBjb2x1bW5gIG5vcyBmaWxob3MgcHJvamV0YWRvcyAoZXguOiBjb250ZcO6ZG9cclxuICAgKiBwcsOzcHJpbyBjb20gZ3JhZGUgb3UgYGZsZXhgIGVtIGxpbmhhKS4gTyBwYWRyw6NvIGBmYWxzZWAgbWFudMOpbSBvIGVzcGHDp2FtZW50byB2ZXJ0aWNhbCBlbnRyZVxyXG4gICAqIHbDoXJpYXMgYGFwcC1mb3JtLXJvd2AgLyB3cmFwcGVyIGNvbSBgZm9ybUdyb3VwTmFtZWAuXHJcbiAgICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNraXBCb2R5Q2hpbGRTdGFja2luZyA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG1vc3RyYSBvIMOtY29uZSBkZSBhdmlzbyBubyBjYWJlw6dhbGhvLiBPIHBhaSBkZXZlIHJlZmxldGlyIGludsOhbGlkbyAqKmUqKiBjcml0w6lyaW9cclxuICAgKiBkZSBVWCAoZXguIGBkaXJ0eWAgb3UgZm9ybXVsw6FyaW8gasOhIHN1Ym1ldGlkbyksIG7Do28gc8OzIGB0b3VjaGVkYCDigJQgVGFiL2ZvY28gbsOjbyBkZXZlIGFjZW5kZXIgc296aW5oby5cclxuICAgKiBJZ25vcmFkbyBxdWFuZG8ge0BsaW5rIGZvcm1Hcm91cFBhdGh9IGVzdMOhIGRlZmluaWRvICh1c2Etc2Ugc8OzIG8gY8OhbGN1bG8gYXV0b23DoXRpY28pLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBncm91cEludmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FtaW5obyBubyBgRm9ybUdyb3VwYCByYWl6IGRvIGA8Zm9ybSBbZm9ybUdyb3VwXT5gIChleC46IGBpZGVudGlmaWNhY2FvYCwgYGVuZGVyZWNvLm1vcmFkYWApLlxyXG4gICAqIFF1YW5kbyBwcmVlbmNoaWRvLCBvIMOtY29uZSBkZSBhdmlzbyDDqSBjYWxjdWxhZG8gYXV0b21hdGljYW1lbnRlIGEgcGFydGlyIGRvIGVzdGFkbyByZWF0aXZvLFxyXG4gICAqIHNlbSBwcmVjaXNhciBkZSBgW2dyb3VwSW52YWxpZF1gIG1hbnVhbC5cclxuICAgKi9cclxuICBASW5wdXQoKSBmb3JtR3JvdXBQYXRoID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG8gY3JpdMOpcmlvIOKAnGrDoSBob3V2ZSB0ZW50YXRpdmEgZGUgZW52aW/igJ0gcGFyYSBvIMOtY29uZSBhdXRvbcOhdGljbyAoYGZvcm1Hcm91cFBhdGhgKVxyXG4gICAqIGluY2x1aSBlc3RlIHNpbmFsIChleC46IGFsaW5oYXIgYSBgYXBwLWZvcm0tdGFic2AgYFt3YXJuaW5nXWAgY29tIGBtYXJrQWxsQXNUb3VjaGVkKClgIHNlbSBgc3VibWl0dGVkYFxyXG4gICAqIG5vIGBGb3JtR3JvdXBEaXJlY3RpdmVgLCBvdSB2YWxpZGHDp8OjbyBkaXNwYXJhZGEgcG9yIGAoY2xpY2spYCBlbSB2ZXogZGUgYHN1Ym1pdGApLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB1eFN1Ym1pdHRlZFBhc3MgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbW92ZVVwID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBtb3ZlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqIEVzdGFkbyBpbnRlcm5vIGVzcGVsaGEgbyBpbnB1dCAoT25QdXNoICsgYWx0ZXJhw6fDtWVzIGV4dGVybmFzKS4gKi9cclxuICBwcml2YXRlIGNvbGxhcHNlZEludGVybmFsID0gZmFsc2U7XHJcbiAgLyoqIEV2aXRhIGBzY3JvbGxJbnRvVmlld2AgZHVwbG8gbm8gbWVzbW8gY2ljbG8gKGNsaXF1ZSArIGBbY29sbGFwc2VkXWAgZG8gcGFpKS4gKi9cclxuICBwcml2YXRlIHNjcm9sbEludG9WaWV3Q29hbGVzY2UgPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBgRm9ybUdyb3VwRGlyZWN0aXZlLnN1Ym1pdHRlZGAgbmVtIHNlbXByZSBmaWNhIGB0cnVlYCBubyBjaWNsbyBkbyDDrWNvbmUgY29tIGBbZm9ybUdyb3VwXWAgcmVhY3Rpdm87XHJcbiAgICogbyBgc3VibWl0YCBuYXRpdm8gZG8gYDxmb3JtPmAgZ2FyYW50ZSBhdmlzbyBub3MgZmlsaG9zIGFww7NzIMKrU2FsdmFywrsgKyBgbWFya0FsbEFzVG91Y2hlZCgpYC5cclxuICAgKiBSZXDDtWUtc2UgcXVhbmRvIG8gYEZvcm1Hcm91cGAgcmFpeiB2b2x0YSBhIGBWQUxJRGAuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtU3VibWl0UGFzc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAvKiogUmFzdHJlaWEgYHJvb3RGb3JtRGlyLnN1Ym1pdHRlZGAgcGFyYSByZXBvciB7QGxpbmsgZm9ybVN1Ym1pdFBhc3NBY3RpdmV9IGFww7NzIGByZXNldEZvcm1gIGNvbSByYWl6IGFpbmRhIGludsOhbGlkYS4gKi9cclxuICBwcml2YXRlIHByZXZSb290Rm9ybVN1Ym1pdHRlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwbHlDb2xsYXBzZWRGcm9tSW5wdXRzKCk7XHJcbiAgICB0aGlzLnNldHVwRm9ybVBhdGhJbnZhbGlkVHJhY2tpbmcoKTtcclxuICAgIHRoaXMuc2V0dXBFeHBhbmRSZXF1ZXN0TGlzdGVuZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgZXhwYW5kaXIgbyBncnVwbyBhIHBhcnRpciBkbyBleHRlcmlvciAoZXguOiByZXN1bW8gZGUgdmFsaWRhw6fDo28gYW50ZXMgZGUgZm9jYXIgdW0gY2FtcG8pLlxyXG4gICAqIGBDdXN0b21FdmVudGAgbm8gaG9zdDogYHVpLXJlcXVlc3QtZXhwYW5kYCAoc2VtIGJ1YmJsZXMpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBFeHBhbmRSZXF1ZXN0TGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBvbkV4cGFuZFJlcXVlc3QgPSAoZXY6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuY29sbGFwc2libGUgfHxcclxuICAgICAgICB0aGlzLmRpc2FibGVkIHx8XHJcbiAgICAgICAgIXRoaXMuZm9sZGFibGUgfHxcclxuICAgICAgICAhdGhpcy5jb2xsYXBzZWRJbnRlcm5hbFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgLy8gU8OtbmNyb25vOiBvIHJlc3VtbyBhZGlhIGBuYXZpZ2F0ZVRvRmllbGRJZGAgY29tIGBzZXRUaW1lb3V0YCwgZm9yYSBkbyBDRC4gRXhwYW5kaXIgasOhIGFxdWlcclxuICAgICAgLy8gZ2FyYW50ZSBxdWUgbyBzY3JvbGwvZm9jbyBzZWd1aW50ZSB2w6ogbyBncnVwbyBhYmVydG8gKGV2aXRhIHByZWNpc2FyIGRlIHVtIHNlZ3VuZG8gY2xpcXVlKS5cclxuICAgICAgdGhpcy5zZXRDb2xsYXBzZWQoZmFsc2UsIHsgc2tpcFNjcm9sbDogdHJ1ZSB9KTtcclxuICAgIH07XHJcbiAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoVUlfUkVRVUVTVF9FWFBBTkRfRk9STV9HUk9VUCwgb25FeHBhbmRSZXF1ZXN0KTtcclxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT5cclxuICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKFVJX1JFUVVFU1RfRVhQQU5EX0ZPUk1fR1JPVVAsIG9uRXhwYW5kUmVxdWVzdCksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIMONY29uZSBkZSBhdmlzbzogYXV0b23DoXRpY28gY29tIGBmb3JtR3JvdXBQYXRoYCwgc2Vuw6NvIGBncm91cEludmFsaWRgIG1hbnVhbC4gKi9cclxuICBnZXQgaW52YWxpZEZsYWdWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcmF3ID0gdGhpcy5mb3JtR3JvdXBQYXRoPy50cmltKCk7XHJcbiAgICBpZiAocmF3ICYmIHRoaXMucm9vdEZvcm1EaXI/LmNvbnRyb2wpIHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUNvbnRyb2xBdFBhdGgodGhpcy5yb290Rm9ybURpci5jb250cm9sLCByYXcpO1xyXG4gICAgICBpZiAoIXRhcmdldD8uaW52YWxpZCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBmb3JtU3VibWl0dGVkID1cclxuICAgICAgICAhIXRoaXMucm9vdEZvcm1EaXIuc3VibWl0dGVkIHx8XHJcbiAgICAgICAgdGhpcy5mb3JtU3VibWl0UGFzc0FjdGl2ZSB8fFxyXG4gICAgICAgIHRoaXMudXhTdWJtaXR0ZWRQYXNzO1xyXG4gICAgICByZXR1cm4gc3VidHJlZUhhc1Zpc2libGVJbnZhbGlkKHRhcmdldCwgZm9ybVN1Ym1pdHRlZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cEludmFsaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBgbWFya0FsbEFzVG91Y2hlZCgpYCAvIGBzdWJtaXR0ZWRgIG7Do28gcGFzc2FtIHNlbXByZSBwb3IgYHZhbHVlQ2hhbmdlc2A7IGNvbSBPblB1c2ggbyBnZXR0ZXJcclxuICAgKiBkbyDDrWNvbmUgcHJlY2lzYSBkbyBgc3VibWl0YCBkbyBgPGZvcm0+YCBhbmNlc3RyYWwgKGFww7NzIHVtIHRpY2spIHBhcmEgYXR1YWxpemFyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBGb3JtUGF0aEludmFsaWRUcmFja2luZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJhdyA9IHRoaXMuZm9ybUdyb3VwUGF0aD8udHJpbSgpO1xyXG4gICAgY29uc3Qgcm9vdEN0cmwgPSB0aGlzLnJvb3RGb3JtRGlyPy5jb250cm9sO1xyXG4gICAgaWYgKCFyYXcgfHwgIXJvb3RDdHJsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdWJzY3JpYmVNYXJrRm9yQ2hlY2tPbkludmFsaWRVaVJlZnJlc2goXHJcbiAgICAgIHJvb3RDdHJsLFxyXG4gICAgICB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCxcclxuICAgICAgdGhpcy5jZHIsXHJcbiAgICAgIHRoaXMuZGVzdHJveVJlZixcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgZm9ybUVsID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnZm9ybScpO1xyXG4gICAgaWYgKGZvcm1FbCkge1xyXG4gICAgICBmcm9tRXZlbnQoZm9ybUVsLCAnc3VibWl0JywgeyBjYXB0dXJlOiB0cnVlIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRQYXNzQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJvb3RDdHJsLnN0YXR1c0NoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmlsdGVyKCgpID0+IHJvb3RDdHJsLnZhbGlkKSxcclxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm1TdWJtaXRQYXNzQWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICBjaGFuZ2VzWyd1eFN1Ym1pdHRlZFBhc3MnXSB8fFxyXG4gICAgICBjaGFuZ2VzWydmb3JtR3JvdXBQYXRoJ10gfHxcclxuICAgICAgY2hhbmdlc1snZ3JvdXBJbnZhbGlkJ11cclxuICAgICkge1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydjb2xsYXBzZWQnXSB8fCBjaGFuZ2VzWydmb2xkYWJsZSddKSB7XHJcbiAgICAgIGNvbnN0IGMgPSBjaGFuZ2VzWydjb2xsYXBzZWQnXTtcclxuICAgICAgY29uc3Qgd2FzQ29sbGFwc2VkID1cclxuICAgICAgICAhIWMgJiYgIWMuZmlyc3RDaGFuZ2UgJiYgYy5wcmV2aW91c1ZhbHVlID09PSB0cnVlO1xyXG4gICAgICB0aGlzLmFwcGx5Q29sbGFwc2VkRnJvbUlucHV0cygpO1xyXG4gICAgICBjb25zdCBub3dFeHBhbmRlZCA9ICF0aGlzLmNvbGxhcHNlZEludGVybmFsO1xyXG4gICAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSAmJiB0aGlzLmZvbGRhYmxlICYmIHdhc0NvbGxhcHNlZCAmJiBub3dFeHBhbmRlZCkge1xyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVTY3JvbGxJbnRvVmlldygpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEVzdGFkbyBpbnRlcm5vIGRlIGNvbGFwc286IGNvbSBgZm9sZGFibGUgPT09IGZhbHNlYCBmb3LDp2Egc2VtcHJlIGV4cGFuZGlkby4gKi9cclxuICBwcml2YXRlIGFwcGx5Q29sbGFwc2VkRnJvbUlucHV0cygpOiB2b2lkIHtcclxuICAgIHRoaXMuY29sbGFwc2VkSW50ZXJuYWwgPSB0aGlzLmZvbGRhYmxlID8gdGhpcy5jb2xsYXBzZWQgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnRzID0gWydmb3JtLWdyb3VwJywgYGZvcm0tZ3JvdXAtLSR7dGhpcy52YXJpYW50fWBdO1xyXG4gICAgaWYgKHRoaXMuZGVuc2UpIHtcclxuICAgICAgcGFydHMucHVzaCgnZm9ybS1ncm91cC0tZGVuc2UnKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHBhcnRzLnB1c2goJ2Zvcm0tZ3JvdXAtLWRpc2FibGVkJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zaG93RGl2aWRlcikge1xyXG4gICAgICBwYXJ0cy5wdXNoKCdmb3JtLWdyb3VwLS1kaXZpZGVyJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSkge1xyXG4gICAgICBwYXJ0cy5wdXNoKCdmb3JtLWdyb3VwLS1jb2xsYXBzaWJsZScpO1xyXG4gICAgICBpZiAoIXRoaXMuZm9sZGFibGUpIHtcclxuICAgICAgICBwYXJ0cy5wdXNoKCdmb3JtLWdyb3VwLS1mb2xkLWxvY2tlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcnRzLnB1c2goXHJcbiAgICAgICAgdGhpcy5jb2xsYXBzZWRJbnRlcm5hbCA/ICdmb3JtLWdyb3VwLS1jb2xsYXBzZWQnIDogJ2Zvcm0tZ3JvdXAtLWV4cGFuZGVkJyxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0hlYWRlckJhcigpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93SGVhZGVyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudGl0dWxvLnRyaW0oKS5sZW5ndGggPiAwIHx8XHJcbiAgICAgIHRoaXMuc3VidGl0dWxvLnRyaW0oKS5sZW5ndGggPiAwIHx8XHJcbiAgICAgIHRoaXMuY29sbGFwc2libGUgfHxcclxuICAgICAgdGhpcy5jYW5Nb3ZlVXAgfHxcclxuICAgICAgdGhpcy5jYW5Nb3ZlRG93biB8fFxyXG4gICAgICB0aGlzLmludmFsaWRGbGFnVmlzaWJsZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0NvbGxhcHNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbGxhcHNlZEludGVybmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlbmRlckJvZHlJbkRvbSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRlc3Ryb3lPbkNvbGxhcHNlKSB7XHJcbiAgICAgIHJldHVybiAhdGhpcy5jb2xsYXBzZWRJbnRlcm5hbDtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJvZHlWaXN1YWxseUhpZGRlbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5kZXN0cm95T25Db2xsYXBzZSAmJiB0aGlzLmNvbGxhcHNlZEludGVybmFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlYWRlcklzSW50ZXJhY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZSAmJiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmZvbGRhYmxlO1xyXG4gIH1cclxuXHJcbiAgb25IZWFkZXJDbGljaygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oZWFkZXJJc0ludGVyYWN0aXZlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Q29sbGFwc2VkKCF0aGlzLmNvbGxhcHNlZEludGVybmFsKTtcclxuICB9XHJcblxyXG4gIG9uSGVhZGVyS2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhlYWRlcklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2LmtleSA9PT0gJ0VudGVyJyB8fCBldi5rZXkgPT09ICcgJykge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLnNldENvbGxhcHNlZCghdGhpcy5jb2xsYXBzZWRJbnRlcm5hbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1vdmVVcENsaWNrKGV2OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5jYW5Nb3ZlVXApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3ZlVXAuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3ZlRG93bkNsaWNrKGV2OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5jYW5Nb3ZlRG93bikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vdmVEb3duLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q29sbGFwc2VkKFxyXG4gICAgbmV4dDogYm9vbGVhbixcclxuICAgIG9wdGlvbnM/OiB7IHNraXBTY3JvbGw/OiBib29sZWFuIH0sXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9sZGFibGUgJiYgbmV4dCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB3YXNDb2xsYXBzZWQgPSB0aGlzLmNvbGxhcHNlZEludGVybmFsO1xyXG4gICAgdGhpcy5jb2xsYXBzZWRJbnRlcm5hbCA9IG5leHQ7XHJcbiAgICB0aGlzLmNvbGxhcHNlZENoYW5nZS5lbWl0KG5leHQpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICBjb25zdCBza2lwU2Nyb2xsID0gb3B0aW9ucz8uc2tpcFNjcm9sbCA9PT0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlICYmIHRoaXMuZm9sZGFibGUgJiYgd2FzQ29sbGFwc2VkICYmICFuZXh0ICYmICFza2lwU2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVTY3JvbGxJbnRvVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXDDs3MgZXhwYW5kaXIsIGRlc2xvY2EgYSB2aXN0YSBhdMOpIGFvIGdydXBvIGNvbSBzY3JvbGwgbmF0aXZvIHN1YXZlLCBzw7MgbyBuZWNlc3PDoXJpb1xyXG4gICAqIChgYmxvY2s6ICduZWFyZXN0J2ApLiBFeGVjdXRhIGFww7NzIHBpbnRhciBvIGNvcnBvIGV4cGFuZGlkby5cclxuICAgKi9cclxuICBwcml2YXRlIHNjaGVkdWxlU2Nyb2xsSW50b1ZpZXcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxJbnRvVmlld0NvYWxlc2NlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2Nyb2xsSW50b1ZpZXdDb2FsZXNjZSA9IHRydWU7XHJcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XHJcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlld0NvYWxlc2NlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcclxuICAgICAgICAgIGlubGluZTogJ25lYXJlc3QnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cFBhdGg/LnRyaW0oKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdWJtaXR0ZWQgPSAhIXRoaXMucm9vdEZvcm1EaXI/LnN1Ym1pdHRlZDtcclxuICAgIGlmICh0aGlzLnByZXZSb290Rm9ybVN1Ym1pdHRlZCA9PT0gdHJ1ZSAmJiBzdWJtaXR0ZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuZm9ybVN1Ym1pdFBhc3NBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZSb290Rm9ybVN1Ym1pdHRlZCA9IHN1Ym1pdHRlZDtcclxuICB9XHJcbn1cclxuIiwiQGlmIChzaG93SGVhZGVyQmFyKSB7XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwX19oZWFkZXJcIlxyXG4gICAgW2NsYXNzLmZvcm0tZ3JvdXBfX2hlYWRlci0taW50ZXJhY3RpdmVdPVwiaGVhZGVySXNJbnRlcmFjdGl2ZVwiXHJcbiAgICBbYXR0ci5yb2xlXT1cImhlYWRlcklzSW50ZXJhY3RpdmUgPyAnYnV0dG9uJyA6IG51bGxcIlxyXG4gICAgW2F0dHIudGFiaW5kZXhdPVwiaGVhZGVySXNJbnRlcmFjdGl2ZSA/IDAgOiBudWxsXCJcclxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaGVhZGVySXNJbnRlcmFjdGl2ZSA/ICFpc0NvbGxhcHNlZCA6IG51bGxcIlxyXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcclxuICAgIChjbGljayk9XCJvbkhlYWRlckNsaWNrKClcIlxyXG4gICAgKGtleWRvd24pPVwib25IZWFkZXJLZXlkb3duKCRldmVudClcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwX19oZWFkZXItbWFpblwiPlxyXG4gICAgICBAaWYgKGNvbGxhcHNpYmxlICYmICFkaXNhYmxlZCkge1xyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXBfX2NoZXZyb25cIlxyXG4gICAgICAgICAgW2NsYXNzLmZvcm0tZ3JvdXBfX2NoZXZyb24tLWxvY2tlZF09XCIhZm9sZGFibGVcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBjbGFzcz1cImZhLXNvbGlkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmZhLWNoZXZyb24tcmlnaHRdPVwiZm9sZGFibGUgJiYgaXNDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZmEtY2hldnJvbi1kb3duXT1cIiFmb2xkYWJsZSB8fCAhaXNDb2xsYXBzZWRcIlxyXG4gICAgICAgICAgPjwvaT5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIH1cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBfX3RpdGxlc1wiPlxyXG4gICAgICAgIEBpZiAodGl0dWxvLnRyaW0oKSkge1xyXG4gICAgICAgICAgPGgzIGNsYXNzPVwiZm9ybS1ncm91cF9fdGl0bGVcIj57eyB0aXR1bG8gfX08L2gzPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKHN1YnRpdHVsby50cmltKCkpIHtcclxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9ybS1ncm91cF9fc3VidGl0bGVcIj57eyBzdWJ0aXR1bG8gfX08L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBfX2hlYWRlci10cmFpbGluZ1wiPlxyXG4gICAgICA8c3BhblxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cF9faW52YWxpZC1mbGFnXCJcclxuICAgICAgICBbY2xhc3MuZm9ybS1ncm91cF9faW52YWxpZC1mbGFnLS12aXNpYmxlXT1cImludmFsaWRGbGFnVmlzaWJsZVwiXHJcbiAgICAgICAgW2F0dHIucm9sZV09XCJpbnZhbGlkRmxhZ1Zpc2libGUgPyAnaW1nJyA6IG51bGxcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaW52YWxpZEZsYWdWaXNpYmxlID8gJ0V4aXN0ZW0gZXJyb3MgZGUgdmFsaWRhw6fDo28gbmVzdGUgZ3J1cG8nIDogbnVsbFwiXHJcbiAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaW52YWxpZEZsYWdWaXNpYmxlID8gbnVsbCA6ICd0cnVlJ1wiXHJcbiAgICAgICAgW2F0dHIudGl0bGVdPVwiaW52YWxpZEZsYWdWaXNpYmxlID8gJ0V4aXN0ZW0gZXJyb3MgZGUgdmFsaWRhw6fDo28gbmVzdGUgZ3J1cG8nIDogbnVsbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXRyaWFuZ2xlLWV4Y2xhbWF0aW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIEBpZiAoY2FuTW92ZVVwIHx8IGNhbk1vdmVEb3duKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBfX3Jlb3JkZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICBAaWYgKGNhbk1vdmVVcCkge1xyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwX19yZW9yZGVyLWJ0blwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZXIgZ3J1cG8gcGFyYSBjaW1hXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb3ZlVXBDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmIChjYW5Nb3ZlRG93bikge1xyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwX19yZW9yZGVyLWJ0blwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZXIgZ3J1cG8gcGFyYSBiYWl4b1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTW92ZURvd25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG59XHJcblxyXG5AaWYgKHJlbmRlckJvZHlJbkRvbSkge1xyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwX19ib2R5XCIgW2NsYXNzLmZvcm0tZ3JvdXBfX2JvZHktLWNvbGxhcHNlZC1oaWRkZW5dPVwiYm9keVZpc3VhbGx5SGlkZGVuXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiZm9ybS1ncm91cF9fYm9keS1zdGFja1wiXHJcbiAgICAgIFtjbGFzcy5mb3JtLWdyb3VwX19ib2R5LXN0YWNrLS1uZXV0cmFsXT1cInNraXBCb2R5Q2hpbGRTdGFja2luZ1wiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250ZW50IC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxufVxyXG4iXX0=