ngx-sp-infra 0.3.79 → 1.3.80
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
|
|
2
2
|
import { FormUtils } from "../../utils/form-utils";
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/forms";
|
|
@@ -10,9 +10,7 @@ import * as i3 from "../svg-storage/svg-storage.component";
|
|
|
10
10
|
* para realizar pesquisas e seleções em uma lista de opções apresentada em um combobox.
|
|
11
11
|
*
|
|
12
12
|
* @component SearchComboboxComponent
|
|
13
|
-
* @selector search-combobox
|
|
14
|
-
* @standalone true
|
|
15
|
-
* @imports CommonModule, ProjectModule
|
|
13
|
+
* @selector lib-search-combobox
|
|
16
14
|
* @templateUrl ./search-combobox.component.html
|
|
17
15
|
* @styleUrl ./search-combobox.component.scss
|
|
18
16
|
*
|
|
@@ -24,47 +22,56 @@ import * as i3 from "../svg-storage/svg-storage.component";
|
|
|
24
22
|
* - Pesquisa e filtragem de itens na lista do combobox.
|
|
25
23
|
* - Seleção de itens com feedback visual.
|
|
26
24
|
* - Emissão de eventos personalizados para interações do usuário, como recarregar a lista ou selecionar um item.
|
|
25
|
+
* - Ajuste dinâmico da largura do dropdown para corresponder ao input principal.
|
|
26
|
+
* - Inicialização de um valor selecionado, se fornecido.
|
|
27
27
|
*
|
|
28
28
|
* ## Inputs:
|
|
29
|
-
* - `comboboxList
|
|
30
|
-
* - `labelText
|
|
31
|
-
* - `
|
|
32
|
-
* - `
|
|
33
|
-
* - `
|
|
34
|
-
* - `
|
|
35
|
-
* - `searchInputPlaceholder`: Texto de espaço reservado para o input de pesquisa.
|
|
29
|
+
* - `comboboxList` (RecordCombobox[]): Array de objetos representando os itens disponíveis para seleção.
|
|
30
|
+
* - `labelText` (string): Texto de etiqueta associado ao combobox.
|
|
31
|
+
* - `initializedValueID` (string | number): ID de um item inicialmente selecionado no combobox.
|
|
32
|
+
* - `colorTheme` ("primary" | "secondary" | "success" | "danger" | "warning" | "info" | "light" | "dark"): Tema de cores para o componente.
|
|
33
|
+
* - `mainInputPlaceholder` (string): Texto de espaço reservado para o input principal.
|
|
34
|
+
* - `searchInputPlaceholder` (string): Texto de espaço reservado para o input de pesquisa.
|
|
36
35
|
*
|
|
37
36
|
* ## Outputs:
|
|
38
|
-
* - `onReloadList
|
|
39
|
-
* - `onSelectItem
|
|
37
|
+
* - `onReloadList` (EventEmitter<string>): Evento emitido quando a lista precisa ser recarregada.
|
|
38
|
+
* - `onSelectItem` (EventEmitter<any>): Evento emitido quando um item é selecionado.
|
|
39
|
+
*
|
|
40
|
+
* ## Propriedades:
|
|
41
|
+
* - `selectedItem` (RecordCombobox): Getter e Setter para o item selecionado atualmente.
|
|
42
|
+
* - `FormUtils` (typeof FormUtils): Getter para utilitários de formulário.
|
|
43
|
+
* - `_searchInput` (string): Getter para o valor do input de pesquisa.
|
|
44
|
+
* - `filterForm` (FormGroup): Grupo de formulário para o filtro de pesquisa.
|
|
40
45
|
*
|
|
41
46
|
* ## Métodos Públicos:
|
|
42
47
|
* - `reloadList(search: string)`: Método para recarregar a lista de itens com base na pesquisa fornecida.
|
|
43
|
-
* - `setFilterValue(
|
|
44
|
-
*
|
|
45
|
-
* ## Propriedades:
|
|
46
|
-
* - `selectedItem`: Getter e Setter para o item selecionado atualmente.
|
|
47
|
-
* - `FormUtils`: Getter para utilitários de formulário.
|
|
48
|
-
* - `_searchInput`: Getter para o valor do input de pesquisa.
|
|
48
|
+
* - `setFilterValue(item?: RecordCombobox)`: Método para definir o valor do filtro com base no item selecionado.
|
|
49
49
|
*
|
|
50
50
|
* ## Eventos:
|
|
51
51
|
* - `ngOnInit()`: Inicializa o componente.
|
|
52
|
+
* - `ngAfterViewInit()`: Ajusta a largura do dropdown após a visualização do componente.
|
|
52
53
|
* - `ngOnChanges(changes: SimpleChanges)`: Responde a mudanças nas propriedades de entrada.
|
|
53
54
|
*
|
|
54
55
|
* ## Utilitários:
|
|
55
56
|
* - `createFilterForm()`: Cria o formulário de filtro para a pesquisa.
|
|
56
|
-
* - `
|
|
57
|
-
*
|
|
58
|
-
* @note Este componente é marcado como `standalone`, permitindo seu uso sem a necessidade de importá-lo em um módulo.
|
|
57
|
+
* - `initializeSelectedValue()`: Inicializa o valor selecionado no combobox, se fornecido.
|
|
58
|
+
* - `adjustDropdownWidth()`: Ajusta a largura do dropdown para corresponder à largura do input principal.
|
|
59
59
|
*/
|
|
60
60
|
export class SearchComboboxComponent {
|
|
61
61
|
constructor(_formBuilder) {
|
|
62
62
|
this._formBuilder = _formBuilder;
|
|
63
|
+
/** Tema de cores para o componente (baseado nas cores do Bootstrap). */
|
|
63
64
|
this.colorTheme = "primary";
|
|
64
|
-
|
|
65
|
+
/** Placeholder para o input principal. */
|
|
65
66
|
this.mainInputPlaceholder = "Selecione uma opção...";
|
|
67
|
+
/** Placeholder para o input de pesquisa. */
|
|
66
68
|
this.searchInputPlaceholder = "Pesquisa...";
|
|
69
|
+
/**
|
|
70
|
+
* Evento emitido quando a lista precisa ser recarregada.
|
|
71
|
+
* Leva uma string que é usada para pesquisa.
|
|
72
|
+
*/
|
|
67
73
|
this.onReloadList = new EventEmitter();
|
|
74
|
+
/** Evento emitido quando um item é selecionado. */
|
|
68
75
|
this.onSelectItem = new EventEmitter();
|
|
69
76
|
}
|
|
70
77
|
ngOnInit() {
|
|
@@ -73,6 +80,9 @@ export class SearchComboboxComponent {
|
|
|
73
80
|
this.initializeSelectedValue();
|
|
74
81
|
}
|
|
75
82
|
}
|
|
83
|
+
ngAfterViewInit() {
|
|
84
|
+
this.adjustDropdownWidth();
|
|
85
|
+
}
|
|
76
86
|
ngOnChanges(changes) {
|
|
77
87
|
if (changes["currentSelectedOption"] != undefined && changes["currentSelectedOption"].currentValue != undefined) {
|
|
78
88
|
this.initializeSelectedValue();
|
|
@@ -82,6 +92,7 @@ export class SearchComboboxComponent {
|
|
|
82
92
|
set selectedItem(value) {
|
|
83
93
|
this._selectedItem = value;
|
|
84
94
|
console.log("public set selectedItem");
|
|
95
|
+
console.log(this.initializedValueID);
|
|
85
96
|
if (!this.initializedValueID) {
|
|
86
97
|
this.onSelectItem.emit(value);
|
|
87
98
|
}
|
|
@@ -99,11 +110,21 @@ export class SearchComboboxComponent {
|
|
|
99
110
|
// #endregion FORM VALIDATORS
|
|
100
111
|
// #endregion ==========> FORM BUILDER <==========
|
|
101
112
|
// #region ==========> UTILITIES <==========
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Atualiza o valor do filtro com base no item selecionado.
|
|
115
|
+
* @param item Objeto de item selecionado.
|
|
116
|
+
*/
|
|
117
|
+
setFilterValue(item) {
|
|
118
|
+
if (item) {
|
|
119
|
+
this.filterForm.controls["_searchInput"].setValue(`${item.ID} - ${item.LABEL}`);
|
|
120
|
+
this.selectedText = item.LABEL;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.filterForm.controls["_searchInput"].setValue("");
|
|
124
|
+
delete this.selectedText;
|
|
125
|
+
}
|
|
106
126
|
}
|
|
127
|
+
/** Chamado caso um valor inicial seja fornecido para o combobox. */
|
|
107
128
|
initializeSelectedValue() {
|
|
108
129
|
let initializedValue = this.comboboxList.find(item => item.ID == this.initializedValueID);
|
|
109
130
|
if (this.comboboxList && initializedValue) {
|
|
@@ -111,15 +132,24 @@ export class SearchComboboxComponent {
|
|
|
111
132
|
this.selectedItem = { ID: initializedValue.ID, LABEL: initializedValue.LABEL, AdditionalStringProperty1: "", IS_SELECTED: true };
|
|
112
133
|
}
|
|
113
134
|
}
|
|
135
|
+
/** Ajusta a largura do dropdown para corresponder à largura do input principal. */
|
|
136
|
+
adjustDropdownWidth() {
|
|
137
|
+
const inputWidth = this._mainInput.nativeElement.offsetWidth;
|
|
138
|
+
this._dropdownMenu.nativeElement.style.width = `${inputWidth}px`;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Emite um evento para recarregar a lista de itens com base na pesquisa fornecida.
|
|
142
|
+
* @param search Texto de pesquisa para recarregar a lista.
|
|
143
|
+
*/
|
|
114
144
|
reloadList(search) {
|
|
115
145
|
this.onReloadList.emit(search);
|
|
116
146
|
}
|
|
117
147
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchComboboxComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
118
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SearchComboboxComponent, selector: "lib-search-combobox", inputs: { comboboxList: "comboboxList", labelText: "labelText", initializedValueID: "initializedValueID", colorTheme: "colorTheme",
|
|
148
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SearchComboboxComponent, selector: "lib-search-combobox", inputs: { comboboxList: "comboboxList", labelText: "labelText", initializedValueID: "initializedValueID", colorTheme: "colorTheme", mainInputPlaceholder: "mainInputPlaceholder", searchInputPlaceholder: "searchInputPlaceholder" }, outputs: { onReloadList: "onReloadList", onSelectItem: "onSelectItem" }, viewQueries: [{ propertyName: "_mainInput", first: true, predicate: ["mainInput"], descendants: true }, { propertyName: "_dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input #mainInput class=\"form-select text-start rounded-end\" type=\"text\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" [placeholder]=\"mainInputPlaceholder\" [(ngModel)]=\"selectedText\" data-bs-auto-close=\"outside\" aria-expanded=\"false\" readonly>\r\n <ul #dropdownMenu class=\"dropdown-menu p-2 glb-max-height-350px overflow-y-scroll\">\r\n <div class=\"input-group mb-2\">\r\n <input #searchInput type=\"text\" id=\"searchInput\" class=\"form-control glb-input-no-glow\" [placeholder]=\"searchInputPlaceholder\" (keyup.enter)=\"reloadList(searchInput.value)\">\r\n <button class=\"btn btn-{{colorTheme}}\" (click)=\"reloadList(searchInput.value)\"> <app-svg-storage svgName=\"lupa\" svgSize=\"medium-small\" /> Pesquisar </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"comboboxList; else loadingList\">\r\n <ng-container *ngIf=\"comboboxList.length > 0; else emptyItemList\">\r\n <li *ngIf=\"selectedItem && selectedItem.ID\" class=\"dropdown-item\" (click)=\"setFilterValue()\"> <span class=\"fw-bold\">Limpar op\u00E7\u00E3o selecionada</span> </li>\r\n <li class=\"dropdown-item\" *ngFor=\"let item of comboboxList\" (click)=\"setFilterValue(item)\">\r\n <span *ngIf=\"item.AdditionalStringProperty1 || item.AdditionalStringProperty1 != ''\" class=\"glb-fs-12 fw-bold d-inline-block w-125\">{{ item.AdditionalStringProperty1 }}</span> {{ item.LABEL }}\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #loadingList> <li class=\"dropdown-item text-center\"> <div class=\"spinner-border\" role=\"status\"><span class=\"visually-hidden\">Carregando dados...</span></div> </li> </ng-template>\r\n <ng-template #emptyItemList> <li class=\"dropdown-item fst-italic\">Nenhum registro encontrado com esta pesquisa...</li> </ng-template>\r\n </ul>\r\n\r\n <!-- Este elemento ng-content com o atributo [btnRight] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado direito do combobox de pesquisa.\r\n Ao usar o atributo [btnRight], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnRight]\"></ng-content>\r\n\r\n</div>\r\n", styles: [".glb-max-height-350px{max-height:350px!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgStorageComponent, selector: "app-svg-storage", inputs: ["svgName", "svgColor", "svgFill", "svgSize", "svgStrokeWidth"] }] }); }
|
|
119
149
|
}
|
|
120
150
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchComboboxComponent, decorators: [{
|
|
121
151
|
type: Component,
|
|
122
|
-
args: [{ selector: 'lib-search-combobox', template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input
|
|
152
|
+
args: [{ selector: 'lib-search-combobox', template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input #mainInput class=\"form-select text-start rounded-end\" type=\"text\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" [placeholder]=\"mainInputPlaceholder\" [(ngModel)]=\"selectedText\" data-bs-auto-close=\"outside\" aria-expanded=\"false\" readonly>\r\n <ul #dropdownMenu class=\"dropdown-menu p-2 glb-max-height-350px overflow-y-scroll\">\r\n <div class=\"input-group mb-2\">\r\n <input #searchInput type=\"text\" id=\"searchInput\" class=\"form-control glb-input-no-glow\" [placeholder]=\"searchInputPlaceholder\" (keyup.enter)=\"reloadList(searchInput.value)\">\r\n <button class=\"btn btn-{{colorTheme}}\" (click)=\"reloadList(searchInput.value)\"> <app-svg-storage svgName=\"lupa\" svgSize=\"medium-small\" /> Pesquisar </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"comboboxList; else loadingList\">\r\n <ng-container *ngIf=\"comboboxList.length > 0; else emptyItemList\">\r\n <li *ngIf=\"selectedItem && selectedItem.ID\" class=\"dropdown-item\" (click)=\"setFilterValue()\"> <span class=\"fw-bold\">Limpar op\u00E7\u00E3o selecionada</span> </li>\r\n <li class=\"dropdown-item\" *ngFor=\"let item of comboboxList\" (click)=\"setFilterValue(item)\">\r\n <span *ngIf=\"item.AdditionalStringProperty1 || item.AdditionalStringProperty1 != ''\" class=\"glb-fs-12 fw-bold d-inline-block w-125\">{{ item.AdditionalStringProperty1 }}</span> {{ item.LABEL }}\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #loadingList> <li class=\"dropdown-item text-center\"> <div class=\"spinner-border\" role=\"status\"><span class=\"visually-hidden\">Carregando dados...</span></div> </li> </ng-template>\r\n <ng-template #emptyItemList> <li class=\"dropdown-item fst-italic\">Nenhum registro encontrado com esta pesquisa...</li> </ng-template>\r\n </ul>\r\n\r\n <!-- Este elemento ng-content com o atributo [btnRight] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado direito do combobox de pesquisa.\r\n Ao usar o atributo [btnRight], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnRight]\"></ng-content>\r\n\r\n</div>\r\n", styles: [".glb-max-height-350px{max-height:350px!important}\n"] }]
|
|
123
153
|
}], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { comboboxList: [{
|
|
124
154
|
type: Input,
|
|
125
155
|
args: [{ required: true }]
|
|
@@ -130,10 +160,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
130
160
|
type: Input
|
|
131
161
|
}], colorTheme: [{
|
|
132
162
|
type: Input
|
|
133
|
-
}], inputGroupIconName: [{
|
|
134
|
-
type: Input
|
|
135
|
-
}], inputGroupIconTooltip: [{
|
|
136
|
-
type: Input
|
|
137
163
|
}], mainInputPlaceholder: [{
|
|
138
164
|
type: Input
|
|
139
165
|
}], searchInputPlaceholder: [{
|
|
@@ -142,5 +168,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
142
168
|
type: Output
|
|
143
169
|
}], onSelectItem: [{
|
|
144
170
|
type: Output
|
|
171
|
+
}], _mainInput: [{
|
|
172
|
+
type: ViewChild,
|
|
173
|
+
args: ['mainInput']
|
|
174
|
+
}], _dropdownMenu: [{
|
|
175
|
+
type: ViewChild,
|
|
176
|
+
args: ['dropdownMenu']
|
|
145
177
|
}] } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcC1pbmZyYS9zcmMvbGliL3dpZGdldHMvc2VhcmNoLWNvbWJvYm94L3NlYXJjaC1jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL3NlYXJjaC1jb21ib2JveC9zZWFyY2gtY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBR3pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFLbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLFlBQ1UsWUFBeUI7UUFBekIsaUJBQVksR0FBWixZQUFZLENBQWE7UUEyQm5CLGVBQVUsR0FBVyxTQUFTLENBQUM7UUFFL0IsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQ25DLHlCQUFvQixHQUFXLHdCQUF3QixDQUFDO1FBQ3hELDJCQUFzQixHQUFXLGFBQWEsQ0FBQztRQUU5QyxpQkFBWSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2hFLGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFqQ3hFLENBQUM7SUFFRyxRQUFRO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsV0FB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QWtCO3NCQUFqQyxLQUFLO2dCQUNVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1Usc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUVXLFlBQVk7c0JBQTVCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmltcG9ydCB7IEZvcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlscy9mb3JtLXV0aWxzXCI7XHJcblxyXG5pbXBvcnQgeyBSZWNvcmRDb21ib2JveCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29tYm9ib3gvcmVjb3JkLWNvbWJvYm94XCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIEBmaWxlIHNlYXJjaC1jb21ib2JveC5jb21wb25lbnQudHNcclxuICogQGRlc2NyaXB0aW9uIEVzdGUgYXJxdWl2byBjb250w6ltIGEgaW1wbGVtZW50YcOnw6NvIGRvIGNvbXBvbmVudGUgU2VhcmNoQ29tYm9ib3hDb21wb25lbnQsIHF1ZSDDqSB1bSBjb21wb25lbnRlIGRlIGludGVyZmFjZSBkbyB1c3XDoXJpb1xyXG4gKiBwYXJhIHJlYWxpemFyIHBlc3F1aXNhcyBlIHNlbGXDp8O1ZXMgZW0gdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGFwcmVzZW50YWRhIGVtIHVtIGNvbWJvYm94LlxyXG4gKiBcclxuICogQGNvbXBvbmVudCBTZWFyY2hDb21ib2JveENvbXBvbmVudFxyXG4gKiBAc2VsZWN0b3Igc2VhcmNoLWNvbWJvYm94XHJcbiAqIEBzdGFuZGFsb25lIHRydWVcclxuICogQGltcG9ydHMgQ29tbW9uTW9kdWxlLCBQcm9qZWN0TW9kdWxlXHJcbiAqIEB0ZW1wbGF0ZVVybCAuL3NlYXJjaC1jb21ib2JveC5jb21wb25lbnQuaHRtbFxyXG4gKiBAc3R5bGVVcmwgLi9zZWFyY2gtY29tYm9ib3guY29tcG9uZW50LnNjc3NcclxuICogXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiBPIGNvbXBvbmVudGUgU2VhcmNoQ29tYm9ib3hDb21wb25lbnQgw6kgcHJvamV0YWRvIHBhcmEgZm9ybmVjZXIgYW9zIHVzdcOhcmlvcyB1bWEgaW50ZXJmYWNlIHBhcmEgcGVzcXVpc2FyIGUgc2VsZWNpb25hciBpdGVucyBkZSB1bWEgbGlzdGEuXHJcbiAqIEVsZSBzdXBvcnRhIGEgZmlsdHJhZ2VtIGRlIGl0ZW5zIGNvbSBiYXNlIG5hIGVudHJhZGEgZG8gdXN1w6FyaW8sIHBlcm1pdGluZG8gdW1hIHNlbGXDp8OjbyBtYWlzIGbDoWNpbCBlbSBsaXN0YXMgZXh0ZW5zYXMuXHJcbiAqIFxyXG4gKiAjIyBGdW5jaW9uYWxpZGFkZXM6XHJcbiAqIC0gUGVzcXVpc2EgZSBmaWx0cmFnZW0gZGUgaXRlbnMgbmEgbGlzdGEgZG8gY29tYm9ib3guXHJcbiAqIC0gU2VsZcOnw6NvIGRlIGl0ZW5zIGNvbSBmZWVkYmFjayB2aXN1YWwuXHJcbiAqIC0gRW1pc3PDo28gZGUgZXZlbnRvcyBwZXJzb25hbGl6YWRvcyBwYXJhIGludGVyYcOnw7VlcyBkbyB1c3XDoXJpbywgY29tbyByZWNhcnJlZ2FyIGEgbGlzdGEgb3Ugc2VsZWNpb25hciB1bSBpdGVtLlxyXG4gKiBcclxuICogIyMgSW5wdXRzOlxyXG4gKiAtIGBjb21ib2JveExpc3RgOiBBcnJheSBkZSBvYmpldG9zIHJlcHJlc2VudGFuZG8gb3MgaXRlbnMgZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvLlxyXG4gKiAtIGBsYWJlbFRleHRgOiBUZXh0byBkZSBldGlxdWV0YSBhc3NvY2lhZG8gYW8gY29tYm9ib3guXHJcbiAqIC0gYGNvbG9yVGhlbWVgOiBUZW1hIGRlIGNvcmVzIHBhcmEgbyBjb21wb25lbnRlLlxyXG4gKiAtIGBpbnB1dEdyb3VwSWNvbk5hbWVgOiBOb21lIGRvIMOtY29uZSBhIHNlciBleGliaWRvIG5vIGdydXBvIGRlIGVudHJhZGEuXHJcbiAqIC0gYGlucHV0R3JvdXBJY29uVG9vbHRpcGA6IFRleHRvIGRlIGRpY2EgZGUgZmVycmFtZW50YSBwYXJhIG8gw61jb25lIGRvIGdydXBvIGRlIGVudHJhZGEuXHJcbiAqIC0gYG1haW5JbnB1dFBsYWNlaG9sZGVyYDogVGV4dG8gZGUgZXNwYcOnbyByZXNlcnZhZG8gcGFyYSBvIGlucHV0IHByaW5jaXBhbC5cclxuICogLSBgc2VhcmNoSW5wdXRQbGFjZWhvbGRlcmA6IFRleHRvIGRlIGVzcGHDp28gcmVzZXJ2YWRvIHBhcmEgbyBpbnB1dCBkZSBwZXNxdWlzYS5cclxuICogXHJcbiAqICMjIE91dHB1dHM6XHJcbiAqIC0gYG9uUmVsb2FkTGlzdGA6IEV2ZW50byBlbWl0aWRvIHF1YW5kbyBhIGxpc3RhIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhLlxyXG4gKiAtIGBvblNlbGVjdEl0ZW1gOiBFdmVudG8gZW1pdGlkbyBxdWFuZG8gdW0gaXRlbSDDqSBzZWxlY2lvbmFkby5cclxuICogXHJcbiAqICMjIE3DqXRvZG9zIFDDumJsaWNvczpcclxuICogLSBgcmVsb2FkTGlzdChzZWFyY2g6IHN0cmluZylgOiBNw6l0b2RvIHBhcmEgcmVjYXJyZWdhciBhIGxpc3RhIGRlIGl0ZW5zIGNvbSBiYXNlIG5hIHBlc3F1aXNhIGZvcm5lY2lkYS5cclxuICogLSBgc2V0RmlsdGVyVmFsdWUoaWQ6IHN0cmluZyB8IG51bWJlciwgbGFiZWw6IHN0cmluZylgOiBNw6l0b2RvIHBhcmEgZGVmaW5pciBvIHZhbG9yIGRvIGZpbHRyby5cclxuICogXHJcbiAqICMjIFByb3ByaWVkYWRlczpcclxuICogLSBgc2VsZWN0ZWRJdGVtYDogR2V0dGVyIGUgU2V0dGVyIHBhcmEgbyBpdGVtIHNlbGVjaW9uYWRvIGF0dWFsbWVudGUuXHJcbiAqIC0gYEZvcm1VdGlsc2A6IEdldHRlciBwYXJhIHV0aWxpdMOhcmlvcyBkZSBmb3JtdWzDoXJpby5cclxuICogLSBgX3NlYXJjaElucHV0YDogR2V0dGVyIHBhcmEgbyB2YWxvciBkbyBpbnB1dCBkZSBwZXNxdWlzYS5cclxuICogXHJcbiAqICMjIEV2ZW50b3M6XHJcbiAqIC0gYG5nT25Jbml0KClgOiBJbmljaWFsaXphIG8gY29tcG9uZW50ZS5cclxuICogLSBgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcylgOiBSZXNwb25kZSBhIG11ZGFuw6dhcyBuYXMgcHJvcHJpZWRhZGVzIGRlIGVudHJhZGEuXHJcbiAqIFxyXG4gKiAjIyBVdGlsaXTDoXJpb3M6XHJcbiAqIC0gYGNyZWF0ZUZpbHRlckZvcm0oKWA6IENyaWEgbyBmb3JtdWzDoXJpbyBkZSBmaWx0cm8gcGFyYSBhIHBlc3F1aXNhLlxyXG4gKiAtIGBtYXBDb21ib2JveExpc3QoKWA6IE1hcGVpYSBhIGxpc3RhIGRlIGNvbWJvYm94IHBhcmEgbyBmb3JtYXRvIG5lY2Vzc8OhcmlvLlxyXG4gKiBcclxuICogQG5vdGUgRXN0ZSBjb21wb25lbnRlIMOpIG1hcmNhZG8gY29tbyBgc3RhbmRhbG9uZWAsIHBlcm1pdGluZG8gc2V1IHVzbyBzZW0gYSBuZWNlc3NpZGFkZSBkZSBpbXBvcnTDoS1sbyBlbSB1bSBtw7NkdWxvLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc2VhcmNoLWNvbWJvYm94JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29tYm9ib3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9mb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlRmlsdGVyRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkVmFsdWVJRCkgeyB0aGlzLmluaXRpYWxpemVTZWxlY3RlZFZhbHVlKCkgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJjdXJyZW50U2VsZWN0ZWRPcHRpb25cIl0gIT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbXCJjdXJyZW50U2VsZWN0ZWRPcHRpb25cIl0uY3VycmVudFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVTZWxlY3RlZFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFBST1BFUlRJRVMgPD09PT09PT09PT1cclxuXHJcbiAgLy8gI3JlZ2lvbiBQUklWQVRFXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtOiBSZWNvcmRDb21ib2JveDtcclxuICAvLyAjZW5kcmVnaW9uIFBSSVZBVEVcclxuXHJcbiAgLy8gI3JlZ2lvbiBQVUJMSUNcclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwdWJsaWMgY29tYm9ib3hMaXN0OiBSZWNvcmRDb21ib2JveFtdO1xyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHB1YmxpYyBsYWJlbFRleHQ6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGluaXRpYWxpemVkVmFsdWVJRDogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIFxyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xvclRoZW1lOiBzdHJpbmcgPSBcInByaW1hcnlcIjtcclxuICBASW5wdXQoKSBwdWJsaWMgaW5wdXRHcm91cEljb25OYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGlucHV0R3JvdXBJY29uVG9vbHRpcDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoKSBwdWJsaWMgbWFpbklucHV0UGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiU2VsZWNpb25lIHVtYSBvcMOnw6NvLi4uXCI7XHJcbiAgQElucHV0KCkgcHVibGljIHNlYXJjaElucHV0UGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiUGVzcXVpc2EuLi5cIjtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblJlbG9hZExpc3Q6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblNlbGVjdEl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZFRleHQ6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RlZEl0ZW0oKTogUmVjb3JkQ29tYm9ib3ggeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtOyB9XHJcbiAgcHVibGljIHNldCBzZWxlY3RlZEl0ZW0odmFsdWU6IFJlY29yZENvbWJvYm94KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW0gPSB2YWx1ZTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInB1YmxpYyBzZXQgc2VsZWN0ZWRJdGVtXCIpO1xyXG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkVmFsdWVJRCkgeyB0aGlzLm9uU2VsZWN0SXRlbS5lbWl0KHZhbHVlKTsgfVxyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uIFBVQkxJQ1xyXG5cclxuICAvLyAjZW5kcmVnaW9uID09PT09PT09PT0+IFBST1BFUlRJRVMgPD09PT09PT09PT1cclxuXHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gRk9STSBCVUlMREVSIDw9PT09PT09PT09XHJcbiAgcHVibGljIGZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuICBwdWJsaWMgZ2V0IEZvcm1VdGlscygpOiB0eXBlb2YgRm9ybVV0aWxzIHsgcmV0dXJuIEZvcm1VdGlsczsgfVxyXG5cclxuICAvLyAjcmVnaW9uIEZPUk0gREFUQVxyXG4gIHB1YmxpYyBnZXQgX3NlYXJjaElucHV0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmZpbHRlckZvcm0uZ2V0KFwiX3NlYXJjaElucHV0XCIpPy52YWx1ZTsgfVxyXG4gIC8vICNlbmRyZWdpb24gRk9STSBEQVRBXHJcblxyXG4gIC8vICNyZWdpb24gRk9STSBWQUxJREFUT1JTXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5fZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBfc2VhcmNoSW5wdXQ6IFsgXCJcIiBdXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvbiBGT1JNIFZBTElEQVRPUlNcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBGT1JNIEJVSUxERVIgPD09PT09PT09PT1cclxuXHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gVVRJTElUSUVTIDw9PT09PT09PT09XHJcbiAgcHVibGljIHNldEZpbHRlclZhbHVlKGlkOiBzdHJpbmcgfCBudW1iZXIsIGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5jb250cm9sc1tcIl9zZWFyY2hJbnB1dFwiXS5zZXRWYWx1ZShgJHtpZCBhcyBzdHJpbmd9IC0gJHtsYWJlbH1gKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gbGFiZWw7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB7IElEOiBpZCwgTEFCRUw6IGxhYmVsLCBBZGRpdGlvbmFsU3RyaW5nUHJvcGVydHkxOiBcIlwiLCBJU19TRUxFQ1RFRDogdHJ1ZSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplU2VsZWN0ZWRWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGxldCBpbml0aWFsaXplZFZhbHVlID0gdGhpcy5jb21ib2JveExpc3QuZmluZChpdGVtID0+IGl0ZW0uSUQgPT0gdGhpcy5pbml0aWFsaXplZFZhbHVlSUQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbWJvYm94TGlzdCAmJiBpbml0aWFsaXplZFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gaW5pdGlhbGl6ZWRWYWx1ZS5MQUJFTDtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB7IElEOiBpbml0aWFsaXplZFZhbHVlLklELCBMQUJFTDogaW5pdGlhbGl6ZWRWYWx1ZS5MQUJFTCwgQWRkaXRpb25hbFN0cmluZ1Byb3BlcnR5MTogXCJcIiwgSVNfU0VMRUNURUQ6IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgcmVsb2FkTGlzdChzZWFyY2g6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vblJlbG9hZExpc3QuZW1pdChzZWFyY2gpO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uID09PT09PT09PT0+IFVUSUxJVElFUyA8PT09PT09PT09PVxyXG5cclxuXHJcbiAgLy8gI3JlZ2lvbiA9PT09PT09PT09PiBNT0RBTFMgPD09PT09PT09PT1cclxuICAvLyBbLi4uXVxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gTU9EQUxTIDw9PT09PT09PT09XHJcblxyXG59XHJcbiIsIjxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiIFtpbm5lckhUTUxdPVwibGFiZWxUZXh0XCI+PC9sYWJlbD5cclxuPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGRyb3Bkb3duIGZsZXgtZmlsbCBnbGItbWF4LWhlaWdodC0zNTBweFwiPlxyXG5cclxuICAgPCEtLSBFc3RlIGVsZW1lbnRvIG5nLWNvbnRlbnQgY29tIG8gYXRyaWJ1dG8gW2J0bkxlZnRdIHBlcm1pdGUgcXVlIG8gdXN1w6FyaW8gZmluYWwgZm9ybmXDp2EgY29udGXDumRvIHBlcnNvbmFsaXphZG8gcGFyYSBzZXIgZXhpYmlkbyBubyBsYWRvIGVzcXVlcmRvIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLlxyXG4gICBBbyB1c2FyIG8gYXRyaWJ1dG8gW2J0bkxlZnRdLCBvIHVzdcOhcmlvIHBvZGUgZmFjaWxtZW50ZSBhZGljaW9uYXIgYm90w7VlcyBvdSBvdXRyb3MgZWxlbWVudG9zIHBhcmEgbWVsaG9yYXIgYSBmdW5jaW9uYWxpZGFkZSBvdSBhcGFyw6puY2lhIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLiAtLT5cclxuICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J0bkxlZnRdXCI+PC9uZy1jb250ZW50PlxyXG5cclxuICAgPGlucHV0IGNsYXNzPVwiZm9ybS1zZWxlY3QgdGV4dC1zdGFydCByb3VuZGVkLWVuZFwiIHR5cGU9XCJ0ZXh0XCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIFtwbGFjZWhvbGRlcl09XCJtYWluSW5wdXRQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRUZXh0XCIgZGF0YS1icy1hdXRvLWNsb3NlPVwib3V0c2lkZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIHJlYWRvbmx5PlxyXG4gICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IHAtMiB3LTEwMCBnbGItbWF4LWhlaWdodC0zNTBweCBvdmVyZmxvdy15LXNjcm9sbFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItMlwiPlxyXG4gICAgICAgICA8aW5wdXQgI3NlYXJjaElucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZWFyY2hJbnB1dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGdsYi1pbnB1dC1uby1nbG93XCIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaElucHV0UGxhY2Vob2xkZXJcIiAoa2V5dXAuZW50ZXIpPVwicmVsb2FkTGlzdChzZWFyY2hJbnB1dC52YWx1ZSlcIj5cclxuICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4te3tjb2xvclRoZW1lfX1cIiAoY2xpY2spPVwicmVsb2FkTGlzdChzZWFyY2hJbnB1dC52YWx1ZSlcIj4gPGFwcC1zdmctc3RvcmFnZSBzdmdOYW1lPVwibHVwYVwiIHN2Z1NpemU9XCJtZWRpdW0tc21hbGxcIiAvPiBQZXNxdWlzYXIgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbWJvYm94TGlzdDsgZWxzZSBsb2FkaW5nTGlzdFwiPlxyXG4gICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tYm9ib3hMaXN0Lmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlJdGVtTGlzdFwiPlxyXG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLklEXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNldEZpbHRlclZhbHVlKCcnLCAnJylcIj4gPHNwYW4gY2xhc3M9XCJmdy1ib2xkXCI+TGltcGFyIG9ww6fDo28gc2VsZWNpb25hZGE8L3NwYW4+IDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21ib2JveExpc3RcIiAoY2xpY2spPVwic2V0RmlsdGVyVmFsdWUoaXRlbS5JRCwgaXRlbS5MQUJFTCk7IHNlbGVjdGVkSXRlbSA9IGl0ZW1cIj5cclxuICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLkFkZGl0aW9uYWxTdHJpbmdQcm9wZXJ0eTEgfHwgaXRlbS5BZGRpdGlvbmFsU3RyaW5nUHJvcGVydHkxICE9ICcnXCIgY2xhc3M9XCJnbGItZnMtMTIgZnctYm9sZCBkLWlubGluZS1ibG9jayB3LTEyNVwiPnt7IGl0ZW0uQWRkaXRpb25hbFN0cmluZ1Byb3BlcnR5MSB9fTwvc3Bhbj4ge3sgaXRlbS5MQUJFTCB9fVxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmdMaXN0PiA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHRleHQtY2VudGVyXCI+IDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj48c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkNhcnJlZ2FuZG8gZGFkb3MuLi48L3NwYW4+PC9kaXY+IDwvbGk+IDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlJdGVtTGlzdD4gPGxpIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmc3QtaXRhbGljXCI+TmVuaHVtIHJlZ2lzdHJvIGVuY29udHJhZG8gY29tIGVzdGEgcGVzcXVpc2EuLi48L2xpPiA8L25nLXRlbXBsYXRlPlxyXG4gICA8L3VsPlxyXG5cclxuICAgPCEtLSBFc3RlIGVsZW1lbnRvIG5nLWNvbnRlbnQgY29tIG8gYXRyaWJ1dG8gW2J0blJpZ2h0XSBwZXJtaXRlIHF1ZSBvIHVzdcOhcmlvIGZpbmFsIGZvcm5lw6dhIGNvbnRlw7pkbyBwZXJzb25hbGl6YWRvIHBhcmEgc2VyIGV4aWJpZG8gbm8gbGFkbyBkaXJlaXRvIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLlxyXG4gICBBbyB1c2FyIG8gYXRyaWJ1dG8gW2J0blJpZ2h0XSwgbyB1c3XDoXJpbyBwb2RlIGZhY2lsbWVudGUgYWRpY2lvbmFyIGJvdMO1ZXMgb3Ugb3V0cm9zIGVsZW1lbnRvcyBwYXJhIG1lbGhvcmFyIGEgZnVuY2lvbmFsaWRhZGUgb3UgYXBhcsOqbmNpYSBkbyBjb21ib2JveCBkZSBwZXNxdWlzYS4gLS0+XHJcbiAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltidG5SaWdodF1cIj48L25nLWNvbnRlbnQ+XHJcblxyXG48L2Rpdj5cclxuIl19
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcC1pbmZyYS9zcmMvbGliL3dpZGdldHMvc2VhcmNoLWNvbWJvYm94L3NlYXJjaC1jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL3NlYXJjaC1jb21ib2JveC9zZWFyY2gtY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0ksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7OztBQUtuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9ERztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFDVSxZQUF5QjtRQUF6QixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQW9DbkMsd0VBQXdFO1FBQ3hELGVBQVUsR0FBMkYsU0FBUyxDQUFDO1FBRS9ILDBDQUEwQztRQUMxQix5QkFBb0IsR0FBVyx3QkFBd0IsQ0FBQztRQUV4RSw0Q0FBNEM7UUFDNUIsMkJBQXNCLEdBQVcsYUFBYSxDQUFDO1FBRy9EOzs7V0FHRztRQUNjLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakYsbURBQW1EO1FBQ2xDLGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFwRHhFLENBQUM7SUFFRyxRQUFRO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FB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QzdELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxVQUFVLElBQUksQ0FBQztJQUNuRSxDQUFDO0lBR0Q7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLE1BQWM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQzsrR0F4SVUsdUJBQXVCO21HQUF2Qix1QkFBdUIsd2tCQ2xFcEMsbzRGQWdDQTs7NEZEa0NhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7Z0ZBa0NHLFlBQVk7c0JBQTdDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUdTLFNBQVM7c0JBQTFDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUdULGtCQUFrQjtzQkFBakMsS0FBSztnQkFHVSxVQUFVO3NCQUF6QixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFHVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBT1csWUFBWTtzQkFBNUIsTUFBTTtnQkFHVSxZQUFZO3NCQUE1QixNQUFNO2dCQUd5QixVQUFVO3NCQUF6QyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ2EsYUFBYTtzQkFBL0MsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5pbXBvcnQgeyBGb3JtVXRpbHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZm9ybS11dGlsc1wiO1xyXG5cclxuaW1wb3J0IHsgUmVjb3JkQ29tYm9ib3ggfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbWJvYm94L3JlY29yZC1jb21ib2JveFwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBAZmlsZSBzZWFyY2gtY29tYm9ib3guY29tcG9uZW50LnRzXHJcbiAqIEBkZXNjcmlwdGlvbiBFc3RlIGFycXVpdm8gY29udMOpbSBhIGltcGxlbWVudGHDp8OjbyBkbyBjb21wb25lbnRlIFNlYXJjaENvbWJvYm94Q29tcG9uZW50LCBxdWUgw6kgdW0gY29tcG9uZW50ZSBkZSBpbnRlcmZhY2UgZG8gdXN1w6FyaW9cclxuICogcGFyYSByZWFsaXphciBwZXNxdWlzYXMgZSBzZWxlw6fDtWVzIGVtIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBhcHJlc2VudGFkYSBlbSB1bSBjb21ib2JveC5cclxuICogXHJcbiAqIEBjb21wb25lbnQgU2VhcmNoQ29tYm9ib3hDb21wb25lbnRcclxuICogQHNlbGVjdG9yIGxpYi1zZWFyY2gtY29tYm9ib3hcclxuICogQHRlbXBsYXRlVXJsIC4vc2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5odG1sXHJcbiAqIEBzdHlsZVVybCAuL3NlYXJjaC1jb21ib2JveC5jb21wb25lbnQuc2Nzc1xyXG4gKiBcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIE8gY29tcG9uZW50ZSBTZWFyY2hDb21ib2JveENvbXBvbmVudCDDqSBwcm9qZXRhZG8gcGFyYSBmb3JuZWNlciBhb3MgdXN1w6FyaW9zIHVtYSBpbnRlcmZhY2UgcGFyYSBwZXNxdWlzYXIgZSBzZWxlY2lvbmFyIGl0ZW5zIGRlIHVtYSBsaXN0YS5cclxuICogRWxlIHN1cG9ydGEgYSBmaWx0cmFnZW0gZGUgaXRlbnMgY29tIGJhc2UgbmEgZW50cmFkYSBkbyB1c3XDoXJpbywgcGVybWl0aW5kbyB1bWEgc2VsZcOnw6NvIG1haXMgZsOhY2lsIGVtIGxpc3RhcyBleHRlbnNhcy5cclxuICogXHJcbiAqICMjIEZ1bmNpb25hbGlkYWRlczpcclxuICogLSBQZXNxdWlzYSBlIGZpbHRyYWdlbSBkZSBpdGVucyBuYSBsaXN0YSBkbyBjb21ib2JveC5cclxuICogLSBTZWxlw6fDo28gZGUgaXRlbnMgY29tIGZlZWRiYWNrIHZpc3VhbC5cclxuICogLSBFbWlzc8OjbyBkZSBldmVudG9zIHBlcnNvbmFsaXphZG9zIHBhcmEgaW50ZXJhw6fDtWVzIGRvIHVzdcOhcmlvLCBjb21vIHJlY2FycmVnYXIgYSBsaXN0YSBvdSBzZWxlY2lvbmFyIHVtIGl0ZW0uXHJcbiAqIC0gQWp1c3RlIGRpbsOibWljbyBkYSBsYXJndXJhIGRvIGRyb3Bkb3duIHBhcmEgY29ycmVzcG9uZGVyIGFvIGlucHV0IHByaW5jaXBhbC5cclxuICogLSBJbmljaWFsaXphw6fDo28gZGUgdW0gdmFsb3Igc2VsZWNpb25hZG8sIHNlIGZvcm5lY2lkby5cclxuICogXHJcbiAqICMjIElucHV0czpcclxuICogLSBgY29tYm9ib3hMaXN0YCAoUmVjb3JkQ29tYm9ib3hbXSk6IEFycmF5IGRlIG9iamV0b3MgcmVwcmVzZW50YW5kbyBvcyBpdGVucyBkaXNwb27DrXZlaXMgcGFyYSBzZWxlw6fDo28uXHJcbiAqIC0gYGxhYmVsVGV4dGAgKHN0cmluZyk6IFRleHRvIGRlIGV0aXF1ZXRhIGFzc29jaWFkbyBhbyBjb21ib2JveC5cclxuICogLSBgaW5pdGlhbGl6ZWRWYWx1ZUlEYCAoc3RyaW5nIHwgbnVtYmVyKTogSUQgZGUgdW0gaXRlbSBpbmljaWFsbWVudGUgc2VsZWNpb25hZG8gbm8gY29tYm9ib3guXHJcbiAqIC0gYGNvbG9yVGhlbWVgIChcInByaW1hcnlcIiB8IFwic2Vjb25kYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwiZGFuZ2VyXCIgfCBcIndhcm5pbmdcIiB8IFwiaW5mb1wiIHwgXCJsaWdodFwiIHwgXCJkYXJrXCIpOiBUZW1hIGRlIGNvcmVzIHBhcmEgbyBjb21wb25lbnRlLlxyXG4gKiAtIGBtYWluSW5wdXRQbGFjZWhvbGRlcmAgKHN0cmluZyk6IFRleHRvIGRlIGVzcGHDp28gcmVzZXJ2YWRvIHBhcmEgbyBpbnB1dCBwcmluY2lwYWwuXHJcbiAqIC0gYHNlYXJjaElucHV0UGxhY2Vob2xkZXJgIChzdHJpbmcpOiBUZXh0byBkZSBlc3Bhw6dvIHJlc2VydmFkbyBwYXJhIG8gaW5wdXQgZGUgcGVzcXVpc2EuXHJcbiAqIFxyXG4gKiAjIyBPdXRwdXRzOlxyXG4gKiAtIGBvblJlbG9hZExpc3RgIChFdmVudEVtaXR0ZXI8c3RyaW5nPik6IEV2ZW50byBlbWl0aWRvIHF1YW5kbyBhIGxpc3RhIHByZWNpc2Egc2VyIHJlY2FycmVnYWRhLlxyXG4gKiAtIGBvblNlbGVjdEl0ZW1gIChFdmVudEVtaXR0ZXI8YW55Pik6IEV2ZW50byBlbWl0aWRvIHF1YW5kbyB1bSBpdGVtIMOpIHNlbGVjaW9uYWRvLlxyXG4gKiBcclxuICogIyMgUHJvcHJpZWRhZGVzOlxyXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIChSZWNvcmRDb21ib2JveCk6IEdldHRlciBlIFNldHRlciBwYXJhIG8gaXRlbSBzZWxlY2lvbmFkbyBhdHVhbG1lbnRlLlxyXG4gKiAtIGBGb3JtVXRpbHNgICh0eXBlb2YgRm9ybVV0aWxzKTogR2V0dGVyIHBhcmEgdXRpbGl0w6FyaW9zIGRlIGZvcm11bMOhcmlvLlxyXG4gKiAtIGBfc2VhcmNoSW5wdXRgIChzdHJpbmcpOiBHZXR0ZXIgcGFyYSBvIHZhbG9yIGRvIGlucHV0IGRlIHBlc3F1aXNhLlxyXG4gKiAtIGBmaWx0ZXJGb3JtYCAoRm9ybUdyb3VwKTogR3J1cG8gZGUgZm9ybXVsw6FyaW8gcGFyYSBvIGZpbHRybyBkZSBwZXNxdWlzYS5cclxuICogXHJcbiAqICMjIE3DqXRvZG9zIFDDumJsaWNvczpcclxuICogLSBgcmVsb2FkTGlzdChzZWFyY2g6IHN0cmluZylgOiBNw6l0b2RvIHBhcmEgcmVjYXJyZWdhciBhIGxpc3RhIGRlIGl0ZW5zIGNvbSBiYXNlIG5hIHBlc3F1aXNhIGZvcm5lY2lkYS5cclxuICogLSBgc2V0RmlsdGVyVmFsdWUoaXRlbT86IFJlY29yZENvbWJvYm94KWA6IE3DqXRvZG8gcGFyYSBkZWZpbmlyIG8gdmFsb3IgZG8gZmlsdHJvIGNvbSBiYXNlIG5vIGl0ZW0gc2VsZWNpb25hZG8uXHJcbiAqIFxyXG4gKiAjIyBFdmVudG9zOlxyXG4gKiAtIGBuZ09uSW5pdCgpYDogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUuXHJcbiAqIC0gYG5nQWZ0ZXJWaWV3SW5pdCgpYDogQWp1c3RhIGEgbGFyZ3VyYSBkbyBkcm9wZG93biBhcMOzcyBhIHZpc3VhbGl6YcOnw6NvIGRvIGNvbXBvbmVudGUuXHJcbiAqIC0gYG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpYDogUmVzcG9uZGUgYSBtdWRhbsOnYXMgbmFzIHByb3ByaWVkYWRlcyBkZSBlbnRyYWRhLlxyXG4gKiBcclxuICogIyMgVXRpbGl0w6FyaW9zOlxyXG4gKiAtIGBjcmVhdGVGaWx0ZXJGb3JtKClgOiBDcmlhIG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvIHBhcmEgYSBwZXNxdWlzYS5cclxuICogLSBgaW5pdGlhbGl6ZVNlbGVjdGVkVmFsdWUoKWA6IEluaWNpYWxpemEgbyB2YWxvciBzZWxlY2lvbmFkbyBubyBjb21ib2JveCwgc2UgZm9ybmVjaWRvLlxyXG4gKiAtIGBhZGp1c3REcm9wZG93bldpZHRoKClgOiBBanVzdGEgYSBsYXJndXJhIGRvIGRyb3Bkb3duIHBhcmEgY29ycmVzcG9uZGVyIMOgIGxhcmd1cmEgZG8gaW5wdXQgcHJpbmNpcGFsLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc2VhcmNoLWNvbWJvYm94JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2VhcmNoLWNvbWJvYm94LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29tYm9ib3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9mb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlRmlsdGVyRm9ybSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkVmFsdWVJRCkgeyB0aGlzLmluaXRpYWxpemVTZWxlY3RlZFZhbHVlKCkgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRqdXN0RHJvcGRvd25XaWR0aCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbXCJjdXJyZW50U2VsZWN0ZWRPcHRpb25cIl0gIT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbXCJjdXJyZW50U2VsZWN0ZWRPcHRpb25cIl0uY3VycmVudFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVTZWxlY3RlZFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFBST1BFUlRJRVMgPD09PT09PT09PT1cclxuXHJcbiAgLy8gI3JlZ2lvbiBQUklWQVRFXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtOiBSZWNvcmRDb21ib2JveDtcclxuICAvLyAjZW5kcmVnaW9uIFBSSVZBVEVcclxuXHJcbiAgLy8gI3JlZ2lvbiBQVUJMSUNcclxuXHJcbiAgLyoqIExpc3RhIGRlIGl0ZW5zIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8OjbyBubyBjb21ib2JveC4gKi9cclxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBwdWJsaWMgY29tYm9ib3hMaXN0OiBSZWNvcmRDb21ib2JveFtdO1xyXG5cclxuICAvKiogVGV4dG8gZGUgbGFiZWwgYXNzb2NpYWRvIGFvIGNvbWJvYm94LiAqL1xyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHB1YmxpYyBsYWJlbFRleHQ6IHN0cmluZztcclxuXHJcbiAgLyoqIElEIGRlIHVtIGl0ZW0gaW5pY2lhbG1lbnRlIHNlbGVjaW9uYWRvIG5vIGNvbWJvYm94LiAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpbml0aWFsaXplZFZhbHVlSUQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBcclxuICAvKiogVGVtYSBkZSBjb3JlcyBwYXJhIG8gY29tcG9uZW50ZSAoYmFzZWFkbyBuYXMgY29yZXMgZG8gQm9vdHN0cmFwKS4gKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY29sb3JUaGVtZTogXCJwcmltYXJ5XCIgfCBcInNlY29uZGFyeVwiIHwgXCJzdWNjZXNzXCIgfCBcImRhbmdlclwiIHwgXCJ3YXJuaW5nXCIgfCBcImluZm9cIiB8IFwibGlnaHRcIiB8IFwiZGFya1wiID0gXCJwcmltYXJ5XCI7XHJcbiAgXHJcbiAgLyoqIFBsYWNlaG9sZGVyIHBhcmEgbyBpbnB1dCBwcmluY2lwYWwuICovXHJcbiAgQElucHV0KCkgcHVibGljIG1haW5JbnB1dFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlNlbGVjaW9uZSB1bWEgb3DDp8Ojby4uLlwiO1xyXG4gIFxyXG4gIC8qKiBQbGFjZWhvbGRlciBwYXJhIG8gaW5wdXQgZGUgcGVzcXVpc2EuICovXHJcbiAgQElucHV0KCkgcHVibGljIHNlYXJjaElucHV0UGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiUGVzcXVpc2EuLi5cIjtcclxuXHJcbiAgXHJcbiAgLyoqXHJcbiAgICogRXZlbnRvIGVtaXRpZG8gcXVhbmRvIGEgbGlzdGEgcHJlY2lzYSBzZXIgcmVjYXJyZWdhZGEuXHJcbiAgICogTGV2YSB1bWEgc3RyaW5nIHF1ZSDDqSB1c2FkYSBwYXJhIHBlc3F1aXNhLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25SZWxvYWRMaXN0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKiogRXZlbnRvIGVtaXRpZG8gcXVhbmRvIHVtIGl0ZW0gw6kgc2VsZWNpb25hZG8uICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblNlbGVjdEl0ZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cclxuICBAVmlld0NoaWxkKCdtYWluSW5wdXQnKSBwcml2YXRlIF9tYWluSW5wdXQhOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duTWVudScpIHByaXZhdGUgX2Ryb3Bkb3duTWVudSE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICBwdWJsaWMgc2VsZWN0ZWRUZXh0Pzogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBSZWNvcmRDb21ib2JveCB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW07IH1cclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkSXRlbSh2YWx1ZTogUmVjb3JkQ29tYm9ib3gpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbSA9IHZhbHVlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwicHVibGljIHNldCBzZWxlY3RlZEl0ZW1cIik7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmluaXRpYWxpemVkVmFsdWVJRCk7XHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWRWYWx1ZUlEKSB7IHRoaXMub25TZWxlY3RJdGVtLmVtaXQodmFsdWUpOyB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb24gUFVCTElDXHJcblxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gUFJPUEVSVElFUyA8PT09PT09PT09PVxyXG5cclxuXHJcbiAgLy8gI3JlZ2lvbiA9PT09PT09PT09PiBGT1JNIEJVSUxERVIgPD09PT09PT09PT1cclxuICBwdWJsaWMgZmlsdGVyRm9ybTogRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBnZXQgRm9ybVV0aWxzKCk6IHR5cGVvZiBGb3JtVXRpbHMgeyByZXR1cm4gRm9ybVV0aWxzOyB9XHJcblxyXG4gIC8vICNyZWdpb24gRk9STSBEQVRBXHJcbiAgcHVibGljIGdldCBfc2VhcmNoSW5wdXQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS5nZXQoXCJfc2VhcmNoSW5wdXRcIik/LnZhbHVlOyB9XHJcbiAgLy8gI2VuZHJlZ2lvbiBGT1JNIERBVEFcclxuXHJcbiAgLy8gI3JlZ2lvbiBGT1JNIFZBTElEQVRPUlNcclxuICBwcml2YXRlIGNyZWF0ZUZpbHRlckZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIF9zZWFyY2hJbnB1dDogWyBcIlwiIF1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uIEZPUk0gVkFMSURBVE9SU1xyXG5cclxuICAvLyAjZW5kcmVnaW9uID09PT09PT09PT0+IEZPUk0gQlVJTERFUiA8PT09PT09PT09PVxyXG5cclxuXHJcbiAgLy8gI3JlZ2lvbiA9PT09PT09PT09PiBVVElMSVRJRVMgPD09PT09PT09PT1cclxuXHJcbiAgLyoqXHJcbiAgICogQXR1YWxpemEgbyB2YWxvciBkbyBmaWx0cm8gY29tIGJhc2Ugbm8gaXRlbSBzZWxlY2lvbmFkby5cclxuICAgKiBAcGFyYW0gaXRlbSBPYmpldG8gZGUgaXRlbSBzZWxlY2lvbmFkby5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyVmFsdWUoaXRlbT86IFJlY29yZENvbWJvYm94KTogdm9pZCB7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICB0aGlzLmZpbHRlckZvcm0uY29udHJvbHNbXCJfc2VhcmNoSW5wdXRcIl0uc2V0VmFsdWUoYCR7aXRlbS5JRCBhcyBzdHJpbmd9IC0gJHtpdGVtLkxBQkVMfWApO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGl0ZW0uTEFCRUw7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJGb3JtLmNvbnRyb2xzW1wiX3NlYXJjaElucHV0XCJdLnNldFZhbHVlKFwiXCIpO1xyXG4gICAgICBkZWxldGUgdGhpcy5zZWxlY3RlZFRleHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2hhbWFkbyBjYXNvIHVtIHZhbG9yIGluaWNpYWwgc2VqYSBmb3JuZWNpZG8gcGFyYSBvIGNvbWJvYm94LiAqL1xyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNlbGVjdGVkVmFsdWUoKTogdm9pZCB7XHJcbiAgICBsZXQgaW5pdGlhbGl6ZWRWYWx1ZSA9IHRoaXMuY29tYm9ib3hMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLklEID09IHRoaXMuaW5pdGlhbGl6ZWRWYWx1ZUlEKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb21ib2JveExpc3QgJiYgaW5pdGlhbGl6ZWRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGluaXRpYWxpemVkVmFsdWUuTEFCRUw7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0geyBJRDogaW5pdGlhbGl6ZWRWYWx1ZS5JRCwgTEFCRUw6IGluaXRpYWxpemVkVmFsdWUuTEFCRUwsIEFkZGl0aW9uYWxTdHJpbmdQcm9wZXJ0eTE6IFwiXCIsIElTX1NFTEVDVEVEOiB0cnVlIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQWp1c3RhIGEgbGFyZ3VyYSBkbyBkcm9wZG93biBwYXJhIGNvcnJlc3BvbmRlciDDoCBsYXJndXJhIGRvIGlucHV0IHByaW5jaXBhbC4gKi9cclxuICBwcml2YXRlIGFkanVzdERyb3Bkb3duV2lkdGgoKSB7XHJcbiAgICBjb25zdCBpbnB1dFdpZHRoID0gdGhpcy5fbWFpbklucHV0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICB0aGlzLl9kcm9wZG93bk1lbnUubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke2lucHV0V2lkdGh9cHhgO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRlIHVtIGV2ZW50byBwYXJhIHJlY2FycmVnYXIgYSBsaXN0YSBkZSBpdGVucyBjb20gYmFzZSBuYSBwZXNxdWlzYSBmb3JuZWNpZGEuXHJcbiAgICogQHBhcmFtIHNlYXJjaCBUZXh0byBkZSBwZXNxdWlzYSBwYXJhIHJlY2FycmVnYXIgYSBsaXN0YS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVsb2FkTGlzdChzZWFyY2g6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5vblJlbG9hZExpc3QuZW1pdChzZWFyY2gpO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uID09PT09PT09PT0+IFVUSUxJVElFUyA8PT09PT09PT09PVxyXG5cclxuXHJcbiAgLy8gI3JlZ2lvbiA9PT09PT09PT09PiBNT0RBTFMgPD09PT09PT09PT1cclxuICAvLyBbLi4uXVxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gTU9EQUxTIDw9PT09PT09PT09XHJcblxyXG59XHJcbiIsIjxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiIFtpbm5lckhUTUxdPVwibGFiZWxUZXh0XCI+PC9sYWJlbD5cclxuPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGRyb3Bkb3duIGZsZXgtZmlsbCBnbGItbWF4LWhlaWdodC0zNTBweFwiPlxyXG5cclxuICAgPCEtLSBFc3RlIGVsZW1lbnRvIG5nLWNvbnRlbnQgY29tIG8gYXRyaWJ1dG8gW2J0bkxlZnRdIHBlcm1pdGUgcXVlIG8gdXN1w6FyaW8gZmluYWwgZm9ybmXDp2EgY29udGXDumRvIHBlcnNvbmFsaXphZG8gcGFyYSBzZXIgZXhpYmlkbyBubyBsYWRvIGVzcXVlcmRvIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLlxyXG4gICBBbyB1c2FyIG8gYXRyaWJ1dG8gW2J0bkxlZnRdLCBvIHVzdcOhcmlvIHBvZGUgZmFjaWxtZW50ZSBhZGljaW9uYXIgYm90w7VlcyBvdSBvdXRyb3MgZWxlbWVudG9zIHBhcmEgbWVsaG9yYXIgYSBmdW5jaW9uYWxpZGFkZSBvdSBhcGFyw6puY2lhIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLiAtLT5cclxuICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J0bkxlZnRdXCI+PC9uZy1jb250ZW50PlxyXG5cclxuICAgPGlucHV0ICAjbWFpbklucHV0ICBjbGFzcz1cImZvcm0tc2VsZWN0IHRleHQtc3RhcnQgcm91bmRlZC1lbmRcIiB0eXBlPVwidGV4dFwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBbcGxhY2Vob2xkZXJdPVwibWFpbklucHV0UGxhY2Vob2xkZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVGV4dFwiIGRhdGEtYnMtYXV0by1jbG9zZT1cIm91dHNpZGVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiByZWFkb25seT5cclxuICAgPHVsICAjZHJvcGRvd25NZW51ICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgcC0yIGdsYi1tYXgtaGVpZ2h0LTM1MHB4IG92ZXJmbG93LXktc2Nyb2xsXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0yXCI+XHJcbiAgICAgICAgIDxpbnB1dCAjc2VhcmNoSW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlYXJjaElucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZ2xiLWlucHV0LW5vLWdsb3dcIiBbcGxhY2Vob2xkZXJdPVwic2VhcmNoSW5wdXRQbGFjZWhvbGRlclwiIChrZXl1cC5lbnRlcik9XCJyZWxvYWRMaXN0KHNlYXJjaElucHV0LnZhbHVlKVwiPlxyXG4gICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi17e2NvbG9yVGhlbWV9fVwiIChjbGljayk9XCJyZWxvYWRMaXN0KHNlYXJjaElucHV0LnZhbHVlKVwiPiA8YXBwLXN2Zy1zdG9yYWdlIHN2Z05hbWU9XCJsdXBhXCIgc3ZnU2l6ZT1cIm1lZGl1bS1zbWFsbFwiIC8+IFBlc3F1aXNhciA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tYm9ib3hMaXN0OyBlbHNlIGxvYWRpbmdMaXN0XCI+XHJcbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21ib2JveExpc3QubGVuZ3RoID4gMDsgZWxzZSBlbXB0eUl0ZW1MaXN0XCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdJZj1cInNlbGVjdGVkSXRlbSAmJiBzZWxlY3RlZEl0ZW0uSURcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2V0RmlsdGVyVmFsdWUoKVwiPiA8c3BhbiBjbGFzcz1cImZ3LWJvbGRcIj5MaW1wYXIgb3DDp8OjbyBzZWxlY2lvbmFkYTwvc3Bhbj4gPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbWJvYm94TGlzdFwiIChjbGljayk9XCJzZXRGaWx0ZXJWYWx1ZShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uQWRkaXRpb25hbFN0cmluZ1Byb3BlcnR5MSB8fCBpdGVtLkFkZGl0aW9uYWxTdHJpbmdQcm9wZXJ0eTEgIT0gJydcIiBjbGFzcz1cImdsYi1mcy0xMiBmdy1ib2xkIGQtaW5saW5lLWJsb2NrIHctMTI1XCI+e3sgaXRlbS5BZGRpdGlvbmFsU3RyaW5nUHJvcGVydHkxIH19PC9zcGFuPiB7eyBpdGVtLkxBQkVMIH19XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGluZ0xpc3Q+IDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gdGV4dC1jZW50ZXJcIj4gPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPjxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+Q2FycmVnYW5kbyBkYWRvcy4uLjwvc3Bhbj48L2Rpdj4gPC9saT4gPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUl0ZW1MaXN0PiA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGZzdC1pdGFsaWNcIj5OZW5odW0gcmVnaXN0cm8gZW5jb250cmFkbyBjb20gZXN0YSBwZXNxdWlzYS4uLjwvbGk+IDwvbmctdGVtcGxhdGU+XHJcbiAgIDwvdWw+XHJcblxyXG4gICA8IS0tIEVzdGUgZWxlbWVudG8gbmctY29udGVudCBjb20gbyBhdHJpYnV0byBbYnRuUmlnaHRdIHBlcm1pdGUgcXVlIG8gdXN1w6FyaW8gZmluYWwgZm9ybmXDp2EgY29udGXDumRvIHBlcnNvbmFsaXphZG8gcGFyYSBzZXIgZXhpYmlkbyBubyBsYWRvIGRpcmVpdG8gZG8gY29tYm9ib3ggZGUgcGVzcXVpc2EuXHJcbiAgIEFvIHVzYXIgbyBhdHJpYnV0byBbYnRuUmlnaHRdLCBvIHVzdcOhcmlvIHBvZGUgZmFjaWxtZW50ZSBhZGljaW9uYXIgYm90w7VlcyBvdSBvdXRyb3MgZWxlbWVudG9zIHBhcmEgbWVsaG9yYXIgYSBmdW5jaW9uYWxpZGFkZSBvdSBhcGFyw6puY2lhIGRvIGNvbWJvYm94IGRlIHBlc3F1aXNhLiAtLT5cclxuICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J0blJpZ2h0XVwiPjwvbmctY29udGVudD5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1$1 from '@angular/common';
|
|
2
2
|
import { DOCUMENT, CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Component, Input, EventEmitter, Output, Pipe, forwardRef, ViewChildren, HostListener, Directive, Inject, NgModule, Injectable } from '@angular/core';
|
|
4
|
+
import { Component, Input, EventEmitter, Output, Pipe, forwardRef, ViewChildren, HostListener, Directive, Inject, ViewChild, NgModule, Injectable } from '@angular/core';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
6
6
|
import { NG_VALUE_ACCESSOR, UntypedFormGroup, UntypedFormArray, FormsModule, ReactiveFormsModule, NG_VALIDATORS } from '@angular/forms';
|
|
7
7
|
import { RouterModule } from '@angular/router';
|
|
@@ -1472,9 +1472,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
1472
1472
|
* para realizar pesquisas e seleções em uma lista de opções apresentada em um combobox.
|
|
1473
1473
|
*
|
|
1474
1474
|
* @component SearchComboboxComponent
|
|
1475
|
-
* @selector search-combobox
|
|
1476
|
-
* @standalone true
|
|
1477
|
-
* @imports CommonModule, ProjectModule
|
|
1475
|
+
* @selector lib-search-combobox
|
|
1478
1476
|
* @templateUrl ./search-combobox.component.html
|
|
1479
1477
|
* @styleUrl ./search-combobox.component.scss
|
|
1480
1478
|
*
|
|
@@ -1486,47 +1484,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
1486
1484
|
* - Pesquisa e filtragem de itens na lista do combobox.
|
|
1487
1485
|
* - Seleção de itens com feedback visual.
|
|
1488
1486
|
* - Emissão de eventos personalizados para interações do usuário, como recarregar a lista ou selecionar um item.
|
|
1487
|
+
* - Ajuste dinâmico da largura do dropdown para corresponder ao input principal.
|
|
1488
|
+
* - Inicialização de um valor selecionado, se fornecido.
|
|
1489
1489
|
*
|
|
1490
1490
|
* ## Inputs:
|
|
1491
|
-
* - `comboboxList
|
|
1492
|
-
* - `labelText
|
|
1493
|
-
* - `
|
|
1494
|
-
* - `
|
|
1495
|
-
* - `
|
|
1496
|
-
* - `
|
|
1497
|
-
* - `searchInputPlaceholder`: Texto de espaço reservado para o input de pesquisa.
|
|
1491
|
+
* - `comboboxList` (RecordCombobox[]): Array de objetos representando os itens disponíveis para seleção.
|
|
1492
|
+
* - `labelText` (string): Texto de etiqueta associado ao combobox.
|
|
1493
|
+
* - `initializedValueID` (string | number): ID de um item inicialmente selecionado no combobox.
|
|
1494
|
+
* - `colorTheme` ("primary" | "secondary" | "success" | "danger" | "warning" | "info" | "light" | "dark"): Tema de cores para o componente.
|
|
1495
|
+
* - `mainInputPlaceholder` (string): Texto de espaço reservado para o input principal.
|
|
1496
|
+
* - `searchInputPlaceholder` (string): Texto de espaço reservado para o input de pesquisa.
|
|
1498
1497
|
*
|
|
1499
1498
|
* ## Outputs:
|
|
1500
|
-
* - `onReloadList
|
|
1501
|
-
* - `onSelectItem
|
|
1499
|
+
* - `onReloadList` (EventEmitter<string>): Evento emitido quando a lista precisa ser recarregada.
|
|
1500
|
+
* - `onSelectItem` (EventEmitter<any>): Evento emitido quando um item é selecionado.
|
|
1501
|
+
*
|
|
1502
|
+
* ## Propriedades:
|
|
1503
|
+
* - `selectedItem` (RecordCombobox): Getter e Setter para o item selecionado atualmente.
|
|
1504
|
+
* - `FormUtils` (typeof FormUtils): Getter para utilitários de formulário.
|
|
1505
|
+
* - `_searchInput` (string): Getter para o valor do input de pesquisa.
|
|
1506
|
+
* - `filterForm` (FormGroup): Grupo de formulário para o filtro de pesquisa.
|
|
1502
1507
|
*
|
|
1503
1508
|
* ## Métodos Públicos:
|
|
1504
1509
|
* - `reloadList(search: string)`: Método para recarregar a lista de itens com base na pesquisa fornecida.
|
|
1505
|
-
* - `setFilterValue(
|
|
1506
|
-
*
|
|
1507
|
-
* ## Propriedades:
|
|
1508
|
-
* - `selectedItem`: Getter e Setter para o item selecionado atualmente.
|
|
1509
|
-
* - `FormUtils`: Getter para utilitários de formulário.
|
|
1510
|
-
* - `_searchInput`: Getter para o valor do input de pesquisa.
|
|
1510
|
+
* - `setFilterValue(item?: RecordCombobox)`: Método para definir o valor do filtro com base no item selecionado.
|
|
1511
1511
|
*
|
|
1512
1512
|
* ## Eventos:
|
|
1513
1513
|
* - `ngOnInit()`: Inicializa o componente.
|
|
1514
|
+
* - `ngAfterViewInit()`: Ajusta a largura do dropdown após a visualização do componente.
|
|
1514
1515
|
* - `ngOnChanges(changes: SimpleChanges)`: Responde a mudanças nas propriedades de entrada.
|
|
1515
1516
|
*
|
|
1516
1517
|
* ## Utilitários:
|
|
1517
1518
|
* - `createFilterForm()`: Cria o formulário de filtro para a pesquisa.
|
|
1518
|
-
* - `
|
|
1519
|
-
*
|
|
1520
|
-
* @note Este componente é marcado como `standalone`, permitindo seu uso sem a necessidade de importá-lo em um módulo.
|
|
1519
|
+
* - `initializeSelectedValue()`: Inicializa o valor selecionado no combobox, se fornecido.
|
|
1520
|
+
* - `adjustDropdownWidth()`: Ajusta a largura do dropdown para corresponder à largura do input principal.
|
|
1521
1521
|
*/
|
|
1522
1522
|
class SearchComboboxComponent {
|
|
1523
1523
|
constructor(_formBuilder) {
|
|
1524
1524
|
this._formBuilder = _formBuilder;
|
|
1525
|
+
/** Tema de cores para o componente (baseado nas cores do Bootstrap). */
|
|
1525
1526
|
this.colorTheme = "primary";
|
|
1526
|
-
|
|
1527
|
+
/** Placeholder para o input principal. */
|
|
1527
1528
|
this.mainInputPlaceholder = "Selecione uma opção...";
|
|
1529
|
+
/** Placeholder para o input de pesquisa. */
|
|
1528
1530
|
this.searchInputPlaceholder = "Pesquisa...";
|
|
1531
|
+
/**
|
|
1532
|
+
* Evento emitido quando a lista precisa ser recarregada.
|
|
1533
|
+
* Leva uma string que é usada para pesquisa.
|
|
1534
|
+
*/
|
|
1529
1535
|
this.onReloadList = new EventEmitter();
|
|
1536
|
+
/** Evento emitido quando um item é selecionado. */
|
|
1530
1537
|
this.onSelectItem = new EventEmitter();
|
|
1531
1538
|
}
|
|
1532
1539
|
ngOnInit() {
|
|
@@ -1535,6 +1542,9 @@ class SearchComboboxComponent {
|
|
|
1535
1542
|
this.initializeSelectedValue();
|
|
1536
1543
|
}
|
|
1537
1544
|
}
|
|
1545
|
+
ngAfterViewInit() {
|
|
1546
|
+
this.adjustDropdownWidth();
|
|
1547
|
+
}
|
|
1538
1548
|
ngOnChanges(changes) {
|
|
1539
1549
|
if (changes["currentSelectedOption"] != undefined && changes["currentSelectedOption"].currentValue != undefined) {
|
|
1540
1550
|
this.initializeSelectedValue();
|
|
@@ -1544,6 +1554,7 @@ class SearchComboboxComponent {
|
|
|
1544
1554
|
set selectedItem(value) {
|
|
1545
1555
|
this._selectedItem = value;
|
|
1546
1556
|
console.log("public set selectedItem");
|
|
1557
|
+
console.log(this.initializedValueID);
|
|
1547
1558
|
if (!this.initializedValueID) {
|
|
1548
1559
|
this.onSelectItem.emit(value);
|
|
1549
1560
|
}
|
|
@@ -1561,11 +1572,21 @@ class SearchComboboxComponent {
|
|
|
1561
1572
|
// #endregion FORM VALIDATORS
|
|
1562
1573
|
// #endregion ==========> FORM BUILDER <==========
|
|
1563
1574
|
// #region ==========> UTILITIES <==========
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1575
|
+
/**
|
|
1576
|
+
* Atualiza o valor do filtro com base no item selecionado.
|
|
1577
|
+
* @param item Objeto de item selecionado.
|
|
1578
|
+
*/
|
|
1579
|
+
setFilterValue(item) {
|
|
1580
|
+
if (item) {
|
|
1581
|
+
this.filterForm.controls["_searchInput"].setValue(`${item.ID} - ${item.LABEL}`);
|
|
1582
|
+
this.selectedText = item.LABEL;
|
|
1583
|
+
}
|
|
1584
|
+
else {
|
|
1585
|
+
this.filterForm.controls["_searchInput"].setValue("");
|
|
1586
|
+
delete this.selectedText;
|
|
1587
|
+
}
|
|
1568
1588
|
}
|
|
1589
|
+
/** Chamado caso um valor inicial seja fornecido para o combobox. */
|
|
1569
1590
|
initializeSelectedValue() {
|
|
1570
1591
|
let initializedValue = this.comboboxList.find(item => item.ID == this.initializedValueID);
|
|
1571
1592
|
if (this.comboboxList && initializedValue) {
|
|
@@ -1573,15 +1594,24 @@ class SearchComboboxComponent {
|
|
|
1573
1594
|
this.selectedItem = { ID: initializedValue.ID, LABEL: initializedValue.LABEL, AdditionalStringProperty1: "", IS_SELECTED: true };
|
|
1574
1595
|
}
|
|
1575
1596
|
}
|
|
1597
|
+
/** Ajusta a largura do dropdown para corresponder à largura do input principal. */
|
|
1598
|
+
adjustDropdownWidth() {
|
|
1599
|
+
const inputWidth = this._mainInput.nativeElement.offsetWidth;
|
|
1600
|
+
this._dropdownMenu.nativeElement.style.width = `${inputWidth}px`;
|
|
1601
|
+
}
|
|
1602
|
+
/**
|
|
1603
|
+
* Emite um evento para recarregar a lista de itens com base na pesquisa fornecida.
|
|
1604
|
+
* @param search Texto de pesquisa para recarregar a lista.
|
|
1605
|
+
*/
|
|
1576
1606
|
reloadList(search) {
|
|
1577
1607
|
this.onReloadList.emit(search);
|
|
1578
1608
|
}
|
|
1579
1609
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchComboboxComponent, deps: [{ token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1580
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SearchComboboxComponent, selector: "lib-search-combobox", inputs: { comboboxList: "comboboxList", labelText: "labelText", initializedValueID: "initializedValueID", colorTheme: "colorTheme",
|
|
1610
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SearchComboboxComponent, selector: "lib-search-combobox", inputs: { comboboxList: "comboboxList", labelText: "labelText", initializedValueID: "initializedValueID", colorTheme: "colorTheme", mainInputPlaceholder: "mainInputPlaceholder", searchInputPlaceholder: "searchInputPlaceholder" }, outputs: { onReloadList: "onReloadList", onSelectItem: "onSelectItem" }, viewQueries: [{ propertyName: "_mainInput", first: true, predicate: ["mainInput"], descendants: true }, { propertyName: "_dropdownMenu", first: true, predicate: ["dropdownMenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input #mainInput class=\"form-select text-start rounded-end\" type=\"text\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" [placeholder]=\"mainInputPlaceholder\" [(ngModel)]=\"selectedText\" data-bs-auto-close=\"outside\" aria-expanded=\"false\" readonly>\r\n <ul #dropdownMenu class=\"dropdown-menu p-2 glb-max-height-350px overflow-y-scroll\">\r\n <div class=\"input-group mb-2\">\r\n <input #searchInput type=\"text\" id=\"searchInput\" class=\"form-control glb-input-no-glow\" [placeholder]=\"searchInputPlaceholder\" (keyup.enter)=\"reloadList(searchInput.value)\">\r\n <button class=\"btn btn-{{colorTheme}}\" (click)=\"reloadList(searchInput.value)\"> <app-svg-storage svgName=\"lupa\" svgSize=\"medium-small\" /> Pesquisar </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"comboboxList; else loadingList\">\r\n <ng-container *ngIf=\"comboboxList.length > 0; else emptyItemList\">\r\n <li *ngIf=\"selectedItem && selectedItem.ID\" class=\"dropdown-item\" (click)=\"setFilterValue()\"> <span class=\"fw-bold\">Limpar op\u00E7\u00E3o selecionada</span> </li>\r\n <li class=\"dropdown-item\" *ngFor=\"let item of comboboxList\" (click)=\"setFilterValue(item)\">\r\n <span *ngIf=\"item.AdditionalStringProperty1 || item.AdditionalStringProperty1 != ''\" class=\"glb-fs-12 fw-bold d-inline-block w-125\">{{ item.AdditionalStringProperty1 }}</span> {{ item.LABEL }}\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #loadingList> <li class=\"dropdown-item text-center\"> <div class=\"spinner-border\" role=\"status\"><span class=\"visually-hidden\">Carregando dados...</span></div> </li> </ng-template>\r\n <ng-template #emptyItemList> <li class=\"dropdown-item fst-italic\">Nenhum registro encontrado com esta pesquisa...</li> </ng-template>\r\n </ul>\r\n\r\n <!-- Este elemento ng-content com o atributo [btnRight] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado direito do combobox de pesquisa.\r\n Ao usar o atributo [btnRight], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnRight]\"></ng-content>\r\n\r\n</div>\r\n", styles: [".glb-max-height-350px{max-height:350px!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SvgStorageComponent, selector: "app-svg-storage", inputs: ["svgName", "svgColor", "svgFill", "svgSize", "svgStrokeWidth"] }] }); }
|
|
1581
1611
|
}
|
|
1582
1612
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchComboboxComponent, decorators: [{
|
|
1583
1613
|
type: Component,
|
|
1584
|
-
args: [{ selector: 'lib-search-combobox', template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input
|
|
1614
|
+
args: [{ selector: 'lib-search-combobox', template: "<label class=\"form-label fw-bold\" [innerHTML]=\"labelText\"></label>\r\n<div class=\"input-group dropdown flex-fill glb-max-height-350px\">\r\n\r\n <!-- Este elemento ng-content com o atributo [btnLeft] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado esquerdo do combobox de pesquisa.\r\n Ao usar o atributo [btnLeft], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnLeft]\"></ng-content>\r\n\r\n <input #mainInput class=\"form-select text-start rounded-end\" type=\"text\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" [placeholder]=\"mainInputPlaceholder\" [(ngModel)]=\"selectedText\" data-bs-auto-close=\"outside\" aria-expanded=\"false\" readonly>\r\n <ul #dropdownMenu class=\"dropdown-menu p-2 glb-max-height-350px overflow-y-scroll\">\r\n <div class=\"input-group mb-2\">\r\n <input #searchInput type=\"text\" id=\"searchInput\" class=\"form-control glb-input-no-glow\" [placeholder]=\"searchInputPlaceholder\" (keyup.enter)=\"reloadList(searchInput.value)\">\r\n <button class=\"btn btn-{{colorTheme}}\" (click)=\"reloadList(searchInput.value)\"> <app-svg-storage svgName=\"lupa\" svgSize=\"medium-small\" /> Pesquisar </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"comboboxList; else loadingList\">\r\n <ng-container *ngIf=\"comboboxList.length > 0; else emptyItemList\">\r\n <li *ngIf=\"selectedItem && selectedItem.ID\" class=\"dropdown-item\" (click)=\"setFilterValue()\"> <span class=\"fw-bold\">Limpar op\u00E7\u00E3o selecionada</span> </li>\r\n <li class=\"dropdown-item\" *ngFor=\"let item of comboboxList\" (click)=\"setFilterValue(item)\">\r\n <span *ngIf=\"item.AdditionalStringProperty1 || item.AdditionalStringProperty1 != ''\" class=\"glb-fs-12 fw-bold d-inline-block w-125\">{{ item.AdditionalStringProperty1 }}</span> {{ item.LABEL }}\r\n </li>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #loadingList> <li class=\"dropdown-item text-center\"> <div class=\"spinner-border\" role=\"status\"><span class=\"visually-hidden\">Carregando dados...</span></div> </li> </ng-template>\r\n <ng-template #emptyItemList> <li class=\"dropdown-item fst-italic\">Nenhum registro encontrado com esta pesquisa...</li> </ng-template>\r\n </ul>\r\n\r\n <!-- Este elemento ng-content com o atributo [btnRight] permite que o usu\u00E1rio final forne\u00E7a conte\u00FAdo personalizado para ser exibido no lado direito do combobox de pesquisa.\r\n Ao usar o atributo [btnRight], o usu\u00E1rio pode facilmente adicionar bot\u00F5es ou outros elementos para melhorar a funcionalidade ou apar\u00EAncia do combobox de pesquisa. -->\r\n <ng-content select=\"[btnRight]\"></ng-content>\r\n\r\n</div>\r\n", styles: [".glb-max-height-350px{max-height:350px!important}\n"] }]
|
|
1585
1615
|
}], ctorParameters: () => [{ type: i2.FormBuilder }], propDecorators: { comboboxList: [{
|
|
1586
1616
|
type: Input,
|
|
1587
1617
|
args: [{ required: true }]
|
|
@@ -1592,10 +1622,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
1592
1622
|
type: Input
|
|
1593
1623
|
}], colorTheme: [{
|
|
1594
1624
|
type: Input
|
|
1595
|
-
}], inputGroupIconName: [{
|
|
1596
|
-
type: Input
|
|
1597
|
-
}], inputGroupIconTooltip: [{
|
|
1598
|
-
type: Input
|
|
1599
1625
|
}], mainInputPlaceholder: [{
|
|
1600
1626
|
type: Input
|
|
1601
1627
|
}], searchInputPlaceholder: [{
|
|
@@ -1604,6 +1630,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
1604
1630
|
type: Output
|
|
1605
1631
|
}], onSelectItem: [{
|
|
1606
1632
|
type: Output
|
|
1633
|
+
}], _mainInput: [{
|
|
1634
|
+
type: ViewChild,
|
|
1635
|
+
args: ['mainInput']
|
|
1636
|
+
}], _dropdownMenu: [{
|
|
1637
|
+
type: ViewChild,
|
|
1638
|
+
args: ['dropdownMenu']
|
|
1607
1639
|
}] } });
|
|
1608
1640
|
|
|
1609
1641
|
class InfraModule {
|