structra-ui 0.1.18 → 0.1.19
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.
- package/fesm2022/structra-ui.mjs +326 -326
- package/fesm2022/structra-ui.mjs.map +1 -1
- package/package.json +16 -25
- package/esm2022/app/_utils/date-pt-br.utils.mjs +0 -82
- package/esm2022/app/_utils/decimal-br.utils.mjs +0 -154
- package/esm2022/app/_utils/estados-br.data.mjs +0 -37
- package/esm2022/app/_utils/integer-br.utils.mjs +0 -48
- package/esm2022/app/_utils/integer-value.utils.mjs +0 -19
- package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +0 -97
- package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +0 -2
- package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +0 -29
- package/esm2022/app/app-shell/app-shell.component.mjs +0 -105
- package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +0 -18
- package/esm2022/app/app-shell/index.mjs +0 -19
- package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +0 -23
- package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +0 -36
- package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +0 -84
- package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +0 -9
- package/esm2022/app/app-shell/topbar/topbar.component.mjs +0 -14
- package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +0 -52
- package/esm2022/app/buttons/base-button/base-button.component.mjs +0 -97
- package/esm2022/app/buttons/index.mjs +0 -2
- package/esm2022/app/data-display/_models/card-item-view.model.mjs +0 -2
- package/esm2022/app/data-display/_models/data-display.models.mjs +0 -2
- package/esm2022/app/data-display/_models/data-grid-column.model.mjs +0 -2
- package/esm2022/app/data-display/_models/index.mjs +0 -2
- package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +0 -124
- package/esm2022/app/data-display/card-list/card-list.component.mjs +0 -208
- package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +0 -25
- package/esm2022/app/data-display/data-card/data-card.component.mjs +0 -40
- package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +0 -41
- package/esm2022/app/data-display/data-grid/data-grid.component.mjs +0 -253
- package/esm2022/app/data-display/data-list/data-list.component.mjs +0 -40
- package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +0 -12
- package/esm2022/app/data-display/details-field/details-field.component.mjs +0 -21
- package/esm2022/app/data-display/details-view/details-view.component.mjs +0 -44
- package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +0 -19
- package/esm2022/app/data-display/empty-state/empty-state.component.mjs +0 -30
- package/esm2022/app/data-display/index.mjs +0 -19
- package/esm2022/app/data-display/list-item/list-item.component.mjs +0 -59
- package/esm2022/app/data-display/stat-card/stat-card.component.mjs +0 -59
- package/esm2022/app/data-display/status-badge/status-badge.component.mjs +0 -41
- package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +0 -31
- package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +0 -22
- package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +0 -8
- package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +0 -22
- package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +0 -6
- package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +0 -200
- package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +0 -15
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +0 -2
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -36
- package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +0 -47
- package/esm2022/app/dialogs/index.mjs +0 -12
- package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +0 -2
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +0 -19
- package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +0 -38
- package/esm2022/app/dialogs/toast/toast-host.component.mjs +0 -65
- package/esm2022/app/dialogs/toast/toast.models.mjs +0 -2
- package/esm2022/app/dialogs/toast/toast.service.mjs +0 -76
- package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +0 -158
- package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +0 -36
- package/esm2022/app/fields/checkbox-fields/index.mjs +0 -4
- package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +0 -35
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +0 -117
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +0 -152
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +0 -149
- package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +0 -32
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +0 -2
- package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +0 -2
- package/esm2022/app/fields/dropdown-fields/_models/index.mjs +0 -2
- package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +0 -2
- package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +0 -2
- package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +0 -520
- package/esm2022/app/fields/dropdown-fields/index.mjs +0 -7
- package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +0 -379
- package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +0 -359
- package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +0 -151
- package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +0 -224
- package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +0 -135
- package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +0 -127
- package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +0 -2
- package/esm2022/app/fields/input-fields/_models/index.mjs +0 -2
- package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +0 -61
- package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +0 -40
- package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +0 -48
- package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +0 -61
- package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +0 -147
- package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +0 -166
- package/esm2022/app/fields/input-fields/index.mjs +0 -22
- package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +0 -52
- package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +0 -143
- package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +0 -130
- package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +0 -66
- package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +0 -90
- package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +0 -125
- package/esm2022/app/form-layout/_models/form-layout.model.mjs +0 -48
- package/esm2022/app/form-layout/_models/form-tabs.model.mjs +0 -2
- package/esm2022/app/form-layout/_models/index.mjs +0 -2
- package/esm2022/app/form-layout/_models/validation-summary.model.mjs +0 -2
- package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +0 -55
- package/esm2022/app/form-layout/form-col/form-col.component.mjs +0 -76
- package/esm2022/app/form-layout/form-group/form-group.component.mjs +0 -358
- package/esm2022/app/form-layout/form-group/form-path.utils.mjs +0 -65
- package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +0 -54
- package/esm2022/app/form-layout/form-row/form-row.component.mjs +0 -49
- package/esm2022/app/form-layout/form-section/form-section.component.mjs +0 -43
- package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +0 -67
- package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +0 -126
- package/esm2022/app/form-layout/index.mjs +0 -14
- package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +0 -56
- package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +0 -343
- package/esm2022/app/loading/skeleton-loading/index.mjs +0 -7
- package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +0 -43
- package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +0 -23
- package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +0 -34
- package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +0 -38
- package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +0 -37
- package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +0 -45
- package/esm2022/app/menus/_models/drawer-side.model.mjs +0 -8
- package/esm2022/app/menus/_models/drawer-size.model.mjs +0 -8
- package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +0 -12
- package/esm2022/app/menus/_models/menu-item.model.mjs +0 -6
- package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +0 -41
- package/esm2022/app/menus/_utils/menu-rows.util.mjs +0 -39
- package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +0 -23
- package/esm2022/app/menus/action-menu/action-menu.component.mjs +0 -48
- package/esm2022/app/menus/context-menu/context-menu.component.mjs +0 -112
- package/esm2022/app/menus/drawer/drawer.component.mjs +0 -142
- package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +0 -99
- package/esm2022/app/menus/index.mjs +0 -11
- package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +0 -14
- package/esm2022/app/menus/menu-group/menu-group.component.mjs +0 -32
- package/esm2022/app/menus/menu-list/menu-list.component.mjs +0 -399
- package/esm2022/app/overlay/_models/overlay-placement.model.mjs +0 -11
- package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +0 -84
- package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +0 -121
- package/esm2022/app/overlay/index.mjs +0 -21
- package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +0 -17
- package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +0 -17
- package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +0 -15
- package/esm2022/app/overlay/popover/popover.component.mjs +0 -93
- package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +0 -20
- package/esm2022/app/overlay/tooltip/tooltip.component.mjs +0 -118
- package/esm2022/app/theme/app-theme.service.mjs +0 -49
- package/esm2022/app/theme/index.mjs +0 -2
- package/esm2022/structra-public-api.mjs +0 -18
- package/esm2022/structra-ui.mjs +0 -5
- package/esm2022/structra-version.mjs +0 -3
- 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 < `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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L2Zvcm0tZ3JvdXAvZm9ybS1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2Zvcm0tbGF5b3V0L2Zvcm0tZ3JvdXAvZm9ybS1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVWLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4sZ0JBQWdCLEVBQ2hCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFbkYsOEZBQThGO0FBQzlGLE1BQU0sNEJBQTRCLEdBQUcsbUJBQW1CLENBQUM7QUFTekQsTUFBTSxPQUFPLGtCQUFrQjtJQVAvQjtRQVFtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxZQUFPLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUM7UUFDMUMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUdyRSxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRWdCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzNEOzs7O1dBSUc7UUFDcUMsYUFBUSxHQUFHLElBQUksQ0FBQztRQUN4RDs7OztXQUlHO1FBQ3FDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ25ELFlBQU8sR0FBcUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQzlEOzs7OztXQUtHO1FBQ3FDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUNsRTs7OztXQUlHO1FBQ3FDLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUN0RTs7OztXQUlHO1FBQ3FDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdEOzs7O1dBSUc7UUFDTSxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUU1Qjs7OztXQUlHO1FBQ3FDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRTdDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUM5QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNsQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV2RCxxRUFBcUU7UUFDN0Qsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLG1GQUFtRjtRQUMzRSwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDdkM7Ozs7V0FJRztRQUNLLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUVyQyx5SEFBeUg7UUFDakgsMEJBQXFCLEdBQW1CLElBQUksQ0FBQztLQStQdEQ7SUE3UEMsUUFBUTtRQUNOLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSywwQkFBMEI7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDeEMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxFQUFTLEVBQVEsRUFBRTtZQUMxQyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsSUFDRSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUNqQixJQUFJLENBQUMsUUFBUTtnQkFDYixDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNkLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUN2QixDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0QsNkZBQTZGO1lBQzdGLDhGQUE4RjtZQUM5RixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDRCQUE0QixFQUFFLGVBQWUsQ0FBQyxDQUN4RSxDQUFDO0lBQ0osQ0FBQztJQUVELG1GQUFtRjtJQUNuRixJQUFJLGtCQUFrQjtRQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3ZDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQzVCLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkIsT0FBTyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssNEJBQTRCO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsdUNBQXVDLENBQ3JDLFFBQVEsRUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDMUIsSUFBSSxDQUFDLEdBQUcsRUFDUixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDekMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELFFBQVEsQ0FBQyxhQUFhO2FBQ25CLElBQUksQ0FDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUM1QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3BDO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFDRSxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDMUIsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUN4QixPQUFPLENBQUMsY0FBYyxDQUFDLEVBQ3ZCLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0IsTUFBTSxZQUFZLEdBQ2hCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDO1lBQ3BELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFlBQVksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxrRkFBa0Y7SUFDMUUsd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQ0ksU0FBUztRQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxLQUFLLENBQUMsSUFBSSxDQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUMxRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxTQUFTO1lBQ2QsSUFBSSxDQUFDLFdBQVc7WUFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdELENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlLENBQUMsRUFBaUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsRUFBUztRQUNyQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsZUFBZSxDQUFDLEVBQVM7UUFDdkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLFlBQVksQ0FDbEIsSUFBYSxFQUNiLE9BQWtDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ2xCLHFCQUFxQixDQUFDLEdBQUcsRUFBRTtnQkFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztnQkFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO29CQUN4QyxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLE1BQU0sRUFBRSxTQUFTO2lCQUNsQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLENBQUM7K0dBN1VVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGtKQVNULGdCQUFnQixzQ0FNaEIsZ0JBQWdCLHlDQU1oQixnQkFBZ0Isc0NBQ2hCLGdCQUFnQiw2QkFDaEIsZ0JBQWdCLHlDQUNoQixnQkFBZ0IsK0NBQ2hCLGdCQUFnQiw0Q0FDaEIsZ0JBQWdCLCtDQUNoQixnQkFBZ0IscUZBUWhCLGdCQUFnQiw2RUFNaEIsZ0JBQWdCLGtEQU1oQixnQkFBZ0IsMkZBY2hCLGdCQUFnQixnTUNoR3RDLDhzR0FxRkE7OzRGRGxEYSxrQkFBa0I7a0JBUDlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxtQkFHQyx1QkFBdUIsQ0FBQyxNQUFNOzhCQVFwQixNQUFNO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsU0FBUztzQkFBakIsS0FBSztnQkFFa0MsV0FBVztzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFNRSxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxLQUFLO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsV0FBVztzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxVQUFVO3NCQUFqRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFdBQVc7c0JBQWxELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLE9BQU87c0JBQWYsS0FBSztnQkFPa0MsaUJBQWlCO3NCQUF4RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLHFCQUFxQjtzQkFBNUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFNRSxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU83QixhQUFhO3NCQUFyQixLQUFLO2dCQU9rQyxlQUFlO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUVuQixlQUFlO3NCQUFqQyxNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFtSUgsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBEZXN0cm95UmVmLFxyXG4gIERvQ2hlY2ssXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG4gIGluamVjdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cFZhcmlhbnQgfSBmcm9tICcuLi9fbW9kZWxzL2Zvcm0tbGF5b3V0Lm1vZGVsJztcclxuaW1wb3J0IHsgc3Vic2NyaWJlTWFya0ZvckNoZWNrT25JbnZhbGlkVWlSZWZyZXNoIH0gZnJvbSAnLi9mb3JtLXJvb3QtaW52YWxpZC11aS1yZWZyZXNoLnV0aWwnO1xyXG5pbXBvcnQgeyByZXNvbHZlQ29udHJvbEF0UGF0aCwgc3VidHJlZUhhc1Zpc2libGVJbnZhbGlkIH0gZnJvbSAnLi9mb3JtLXBhdGgudXRpbHMnO1xyXG5cclxuLyoqIFBhciBjb20gYGFwcC12YWxpZGF0aW9uLXN1bW1hcnlgIC8gZm9jbyBlbSBjYW1wbyAoZXhwYW5kaXIgYW5jZXN0cmFpcyBhbnRlcyBkbyBzY3JvbGwpLiAqL1xyXG5jb25zdCBVSV9SRVFVRVNUX0VYUEFORF9GT1JNX0dST1VQID0gJ3VpLXJlcXVlc3QtZXhwYW5kJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZvcm0tZ3JvdXAnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9mb3JtLWdyb3VwLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBEb0NoZWNrIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9ybURpciA9IGluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcblxyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHRpdHVsbyE6IHN0cmluZztcclxuICBASW5wdXQoKSBzdWJ0aXR1bG8gPSAnJztcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbGxhcHNpYmxlID0gdHJ1ZTtcclxuICAvKipcclxuICAgKiBRdWFuZG8gYHRydWVgIChwYWRyw6NvKSwgbyBjYWJlw6dhbGhvIGFsdGVybmEgYWJlcnRvL2ZlY2hhZG8gKHJlc3BlaXRhIHtAbGluayBjb2xsYXBzZWR9KS5cclxuICAgKiBRdWFuZG8gYGZhbHNlYCwgbyBncnVwbyBwZXJtYW5lY2UgKipzZW1wcmUgZXhwYW5kaWRvKiogKG7Do28gcmVjb2xoZSksIGEgc2V0YSBmaWNhIHPDsyBpbmRpY2F0aXZhICoqZW0gY2luemEqKlxyXG4gICAqIGUgbyBjYWJlw6dhbGhvIGRlaXhhIGRlIHNlciBjbGljw6F2ZWwg4oCUIMO6dGlsIHBhcmEgc2XDp8O1ZXMgb2JyaWdhdMOzcmlhcyBzZW1wcmUgdmlzw612ZWlzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmb2xkYWJsZSA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogQ29tIGBjb2xsYXBzaWJsZWA6IGB0cnVlYCA9IGdydXBvICoqZmVjaGFkbyoqIChzw7MgY2FiZcOnYWxobyB2aXPDrXZlbCksIGBmYWxzZWAgPSAqKmFiZXJ0byoqLlxyXG4gICAqIE8gcGFpIHBvZGUgZml4YXIgbyBlc3RhZG8gaW5pY2lhbCBlIG1hbnRlciBjb20gYChjb2xsYXBzZWRDaGFuZ2UpYCBvdSBgW2NvbGxhcHNlZF1gIGxpZ2FkbyBhIHVtYSB2YXJpw6F2ZWwuXHJcbiAgICogU2Uge0BsaW5rIGZvbGRhYmxlfSBmb3IgYGZhbHNlYCwgbyBlc3RhZG8gZWZlY3Rpdm8gw6kgc2VtcHJlICoqYWJlcnRvKiogKGlnbm9yYS1zZSBgY29sbGFwc2VkYCBwYXJhIG8gY29ycG8pLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb2xsYXBzZWQgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGVuc2UgPSBmYWxzZTtcclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2FuTW92ZVVwID0gZmFsc2U7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNhbk1vdmVEb3duID0gZmFsc2U7XHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dIZWFkZXIgPSB0cnVlO1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93RGl2aWRlciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEZvcm1Hcm91cFZhcmlhbnQgPSBGb3JtR3JvdXBWYXJpYW50LkRlZmF1bHQ7XHJcbiAgLyoqXHJcbiAgICogQ29tIGBjb2xsYXBzaWJsZWAgZSBgY29sbGFwc2VkYDogc2UgYHRydWVgLCBvIGNvcnBvICoqbsOjbyoqIMOpIGNyaWFkbyBubyBET00gZW5xdWFudG8gb1xyXG4gICAqIGdydXBvIGVzdMOhIGZlY2hhZG8gKGFww7NzIGEgcHJpbWVpcmEgZXhwYW5zw6NvIHBvZGUgdm9sdGFyIGEgZmVjaGFyIGUgdm9sdGFyIGEgZGVzbW9udGFyKS5cclxuICAgKiDDmnRpbCBwYXJhIGJsb2NvcyBwZXNhZG9zIGluaWNpYWxtZW50ZSBmZWNoYWRvczsgbyBgRm9ybUdyb3VwYCByZWFjdGl2byBubyBhc2NlbmRlbnRlXHJcbiAgICogY29uc2VydmEgdmFsb3JlcyDigJQgb3MgYEZvcm1Db250cm9sTmFtZWAgcmVsaWdhbSBhbyByZWFicmlyLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkZXN0cm95T25Db2xsYXBzZSA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG8gY29ycG8gbsOjbyBmb3LDp2EgYGZsZXgtZGlyZWN0aW9uOiBjb2x1bW5gIG5vcyBmaWxob3MgcHJvamV0YWRvcyAoZXguOiBjb250ZcO6ZG9cclxuICAgKiBwcsOzcHJpbyBjb20gZ3JhZGUgb3UgYGZsZXhgIGVtIGxpbmhhKS4gTyBwYWRyw6NvIGBmYWxzZWAgbWFudMOpbSBvIGVzcGHDp2FtZW50byB2ZXJ0aWNhbCBlbnRyZVxyXG4gICAqIHbDoXJpYXMgYGFwcC1mb3JtLXJvd2AgLyB3cmFwcGVyIGNvbSBgZm9ybUdyb3VwTmFtZWAuXHJcbiAgICovXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNraXBCb2R5Q2hpbGRTdGFja2luZyA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG1vc3RyYSBvIMOtY29uZSBkZSBhdmlzbyBubyBjYWJlw6dhbGhvLiBPIHBhaSBkZXZlIHJlZmxldGlyIGludsOhbGlkbyAqKmUqKiBjcml0w6lyaW9cclxuICAgKiBkZSBVWCAoZXguIGBkaXJ0eWAgb3UgZm9ybXVsw6FyaW8gasOhIHN1Ym1ldGlkbyksIG7Do28gc8OzIGB0b3VjaGVkYCDigJQgVGFiL2ZvY28gbsOjbyBkZXZlIGFjZW5kZXIgc296aW5oby5cclxuICAgKiBJZ25vcmFkbyBxdWFuZG8ge0BsaW5rIGZvcm1Hcm91cFBhdGh9IGVzdMOhIGRlZmluaWRvICh1c2Etc2Ugc8OzIG8gY8OhbGN1bG8gYXV0b23DoXRpY28pLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBncm91cEludmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FtaW5obyBubyBgRm9ybUdyb3VwYCByYWl6IGRvIGA8Zm9ybSBbZm9ybUdyb3VwXT5gIChleC46IGBpZGVudGlmaWNhY2FvYCwgYGVuZGVyZWNvLm1vcmFkYWApLlxyXG4gICAqIFF1YW5kbyBwcmVlbmNoaWRvLCBvIMOtY29uZSBkZSBhdmlzbyDDqSBjYWxjdWxhZG8gYXV0b21hdGljYW1lbnRlIGEgcGFydGlyIGRvIGVzdGFkbyByZWF0aXZvLFxyXG4gICAqIHNlbSBwcmVjaXNhciBkZSBgW2dyb3VwSW52YWxpZF1gIG1hbnVhbC5cclxuICAgKi9cclxuICBASW5wdXQoKSBmb3JtR3JvdXBQYXRoID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1YW5kbyBgdHJ1ZWAsIG8gY3JpdMOpcmlvIOKAnGrDoSBob3V2ZSB0ZW50YXRpdmEgZGUgZW52aW/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=
|