ngx-sp-infra 2.1.0 → 2.1.1
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.
|
@@ -21,20 +21,35 @@ export class TableComponent {
|
|
|
21
21
|
/** Lista de registros a serem exibidos na tabela.
|
|
22
22
|
* @required */
|
|
23
23
|
get recordsList() { return this._recordsList; }
|
|
24
|
-
set recordsList(value) {
|
|
25
|
-
this._recordsList = value;
|
|
26
|
-
console.log("Lista: ", this._recordsList);
|
|
27
|
-
}
|
|
24
|
+
set recordsList(value) { this._recordsList = value; }
|
|
28
25
|
/** Informa um ID para a paginação da tabela específica. Deve ser utilizada em caso de múltiplas tabelas na mesma tela. */
|
|
29
26
|
get paginationID() { return this._paginationID; }
|
|
30
27
|
set paginationID(value) {
|
|
31
28
|
this._paginationID = value || 'libTablePagination';
|
|
32
29
|
}
|
|
30
|
+
/** Página atual da tabela. */
|
|
31
|
+
get page() { return this._currentPage; }
|
|
32
|
+
set page(value) { this._currentPage = value; }
|
|
33
|
+
/** Número de itens a serem exibidos por página. */
|
|
34
|
+
get itemsPerPage() { return this._currentItemsPerPage; }
|
|
35
|
+
set itemsPerPage(value) { this._currentItemsPerPage = value; }
|
|
36
|
+
get firstItemOfPage() {
|
|
37
|
+
return (this.page - 1) * this.itemsPerPage + 1;
|
|
38
|
+
}
|
|
39
|
+
get lastItemOfPage() {
|
|
40
|
+
return Math.min(this.page * this.itemsPerPage, this.recordsList?.length ?? 0);
|
|
41
|
+
}
|
|
42
|
+
// Exemplo de string com a contagem:
|
|
43
|
+
get itemsDisplayText() {
|
|
44
|
+
return `Exibindo ${this.countOptions ? this.firstItemOfPage + "-" + this.lastItemOfPage + " de" : ""} ${this.recordsList?.length ?? 0} registros`;
|
|
45
|
+
}
|
|
33
46
|
// #endregion PUBLIC
|
|
34
47
|
// #endregion ==========> PROPRIEDADES <==========
|
|
35
48
|
// #region ==========> INICIALIZAÇÃO <==========
|
|
36
49
|
constructor(cdr) {
|
|
37
50
|
this.cdr = cdr;
|
|
51
|
+
this._currentPage = 1;
|
|
52
|
+
this._currentItemsPerPage = 0;
|
|
38
53
|
// #endregion PRIVATE
|
|
39
54
|
// #region PUBLIC
|
|
40
55
|
/** Determina se a tabela deve usar paginação.
|
|
@@ -51,10 +66,6 @@ export class TableComponent {
|
|
|
51
66
|
this.itemsPerPageChange = new EventEmitter();
|
|
52
67
|
/** Evento emitido quando a página é alterada. */
|
|
53
68
|
this.pageChange = new EventEmitter();
|
|
54
|
-
/** Contador de registros (pode ser usado para futuras implementações de lógica interna). */
|
|
55
|
-
this.counter = 0;
|
|
56
|
-
/** Página atual da tabela. */
|
|
57
|
-
this.page = 1;
|
|
58
69
|
//#region Ordering, Sorting ou apenas Ordenação
|
|
59
70
|
/** Método que faz a ordenação dos contratos na tela de listagem, em cada uma das células do cabeçalho da tabela, onde cada um
|
|
60
71
|
* dos elementos <th> representa uma coluna, de acordo com a lista de contratos que retorna do backend. */
|
|
@@ -150,11 +161,11 @@ export class TableComponent {
|
|
|
150
161
|
return path.reduce((value, property) => value ? value[property] : '', obj);
|
|
151
162
|
}
|
|
152
163
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
153
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableComponent, selector: "lib-table", inputs: { usePagination: "usePagination", recordsList: ["list", "recordsList"], countOptions: ["counts", "countOptions"], paginationPlacement: ["placement", "paginationPlacement"], headersList: ["headers", "headersList"], emptyListMessage: "emptyListMessage", showCounter: "showCounter", paginationID: "paginationID" }, outputs: { itemsPerPageChange: "itemsPerPageChange", pageChange: "pageChange" }, usesOnChanges: true, ngImport: i0, template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\">
|
|
164
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableComponent, selector: "lib-table", inputs: { usePagination: "usePagination", recordsList: ["list", "recordsList"], countOptions: ["counts", "countOptions"], paginationPlacement: ["placement", "paginationPlacement"], headersList: ["headers", "headersList"], emptyListMessage: "emptyListMessage", showCounter: "showCounter", paginationID: "paginationID" }, outputs: { itemsPerPageChange: "itemsPerPageChange", pageChange: "pageChange" }, usesOnChanges: true, ngImport: i0, template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\"> {{ itemsDisplayText }} </span>\r\n \r\n <!-- Container da tabela -->\r\n <div class=\"table-list overflow-hidden border-bottom-0 rounded-bottom rounded\">\r\n <table class=\"table table-hover border mb-0\">\r\n <thead>\r\n <tr>\r\n <!-- Itera sobre a lista de cabe\u00E7alhos para criar as colunas -->\r\n <th *ngFor=\"let header of headersList\" scope=\"col\"\r\n class=\"align-middle text-dark-grey {{ header.col > 0 ? 'col-'+header.col : 'col' }} {{ header.customClasses }}\">\r\n {{ header.name }}\r\n\r\n <app-ordering *ngIf=\"header.orderColumn\" [(sortDirection)]=\"sortDirection[header.orderColumn]\"\r\n (sortChange)=\"onSortChange({ direction: $event.direction, column: header.orderColumn })\"></app-ordering>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody class=\"bg-light fade-in-row\">\r\n @if (recordsList.length > 0) {\r\n <!-- Conte\u00FAdo das linhas da tabela -->\r\n <ng-content select=\"[innerRows]\"></ng-content>\r\n }\r\n @else {\r\n <!-- Mensagem de aus\u00EAncia de registros -->\r\n <tr>\r\n <td colspan=\"12\" class=\"align-middle\">\r\n <span class=\"fw-light fst-italic text-center\"> {{ emptyListMessage ? emptyListMessage : \"Consulta n\u00E3o retornou registros...\" }} </span>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- #region PAGINA\u00C7\u00C3O -->\r\n <div *ngIf=\"usePagination && recordsList.length > 0\" class=\"d-flex mt-2\"\r\n [ngClass]=\"{\r\n 'justify-content-start': paginationPlacement == 'start',\r\n 'justify-content-center': paginationPlacement == 'center',\r\n 'justify-content-end': paginationPlacement == 'end',\r\n 'justify-content-between': paginationPlacement == 'between'\r\n }\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2\" style=\"white-space: nowrap;\"> Itens por p\u00E1gina </label>\r\n <select class=\"form-select select-search\" (change)=\"onSelectChange($event)\">\r\n <option *ngFor=\"let count of countOptions; let i = index\" [value]=\"count\"\r\n [selected]=\"countOptions.length > 0 && i == 0\">{{ count }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Controle de pagina\u00E7\u00E3o -->\r\n <pagination-controls\r\n [id]=\"paginationID\"\r\n class=\"sp-pagination mt-3\"\r\n (pageChange)=\"page = $event; pageChange.emit($event)\"\r\n previousLabel=\"\u00AB \" nextLabel=\" \u00BB\"\r\n [maxSize]=\"5\">\r\n </pagination-controls>\r\n </div>\r\n <!-- #endregion PAGINA\u00C7\u00C3O -->\r\n </div>\r\n </div>\r\n} @else {\r\n <!-- Loader enquanto os registros s\u00E3o carregados -->\r\n <div class=\"w-100 text-center\">\r\n <div class=\"spinner-border\" role=\"status\"> <span class=\"visually-hidden\">Carregando informa\u00E7\u00F5es...</span> </div>\r\n </div>\r\n}\r\n", styles: [".sp-pagination ::ng-deep .ngx-pagination .current{background:#3767b2;border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination a:hover,.sp-pagination ::ng-deep .ngx-pagination button:hover{border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-previous a:before,.sp-pagination ::ng-deep .ngx-pagination .pagination-previous.disabled:before{content:\"\";display:inline-block;margin-right:.5rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-next a:after,.sp-pagination ::ng-deep .ngx-pagination .pagination-next.disabled:after{content:\"\";display:inline-block;margin-left:.5rem}.text-dark-grey{color:#63676b!important}table{border-color:#c4c4c4}table thead{height:50px;font-size:1rem;background-color:#f9fafb!important}table thead>tr{background-color:#f9fafb!important}table thead>tr>th{background-color:#f9fafb!important}table tbody{font-size:.875rem}table tbody>tr{height:50px}table tbody>tr:hover{background-color:#cce5ff}table.table>tbody{border-top:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i3.PaginationControlsComponent, selector: "pagination-controls", inputs: ["id", "maxSize", "directionLinks", "autoHide", "responsive", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel"], outputs: ["pageChange", "pageBoundsCorrection"] }, { kind: "component", type: i4.OrderingComponent, selector: "app-ordering", inputs: ["isColumnClicked", "sortDirection", "sortAttributes"], outputs: ["sortDirectionChange", "sortChange"] }] }); }
|
|
154
165
|
}
|
|
155
166
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, decorators: [{
|
|
156
167
|
type: Component,
|
|
157
|
-
args: [{ selector: 'lib-table', template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\">
|
|
168
|
+
args: [{ selector: 'lib-table', template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\"> {{ itemsDisplayText }} </span>\r\n \r\n <!-- Container da tabela -->\r\n <div class=\"table-list overflow-hidden border-bottom-0 rounded-bottom rounded\">\r\n <table class=\"table table-hover border mb-0\">\r\n <thead>\r\n <tr>\r\n <!-- Itera sobre a lista de cabe\u00E7alhos para criar as colunas -->\r\n <th *ngFor=\"let header of headersList\" scope=\"col\"\r\n class=\"align-middle text-dark-grey {{ header.col > 0 ? 'col-'+header.col : 'col' }} {{ header.customClasses }}\">\r\n {{ header.name }}\r\n\r\n <app-ordering *ngIf=\"header.orderColumn\" [(sortDirection)]=\"sortDirection[header.orderColumn]\"\r\n (sortChange)=\"onSortChange({ direction: $event.direction, column: header.orderColumn })\"></app-ordering>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody class=\"bg-light fade-in-row\">\r\n @if (recordsList.length > 0) {\r\n <!-- Conte\u00FAdo das linhas da tabela -->\r\n <ng-content select=\"[innerRows]\"></ng-content>\r\n }\r\n @else {\r\n <!-- Mensagem de aus\u00EAncia de registros -->\r\n <tr>\r\n <td colspan=\"12\" class=\"align-middle\">\r\n <span class=\"fw-light fst-italic text-center\"> {{ emptyListMessage ? emptyListMessage : \"Consulta n\u00E3o retornou registros...\" }} </span>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- #region PAGINA\u00C7\u00C3O -->\r\n <div *ngIf=\"usePagination && recordsList.length > 0\" class=\"d-flex mt-2\"\r\n [ngClass]=\"{\r\n 'justify-content-start': paginationPlacement == 'start',\r\n 'justify-content-center': paginationPlacement == 'center',\r\n 'justify-content-end': paginationPlacement == 'end',\r\n 'justify-content-between': paginationPlacement == 'between'\r\n }\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2\" style=\"white-space: nowrap;\"> Itens por p\u00E1gina </label>\r\n <select class=\"form-select select-search\" (change)=\"onSelectChange($event)\">\r\n <option *ngFor=\"let count of countOptions; let i = index\" [value]=\"count\"\r\n [selected]=\"countOptions.length > 0 && i == 0\">{{ count }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Controle de pagina\u00E7\u00E3o -->\r\n <pagination-controls\r\n [id]=\"paginationID\"\r\n class=\"sp-pagination mt-3\"\r\n (pageChange)=\"page = $event; pageChange.emit($event)\"\r\n previousLabel=\"\u00AB \" nextLabel=\" \u00BB\"\r\n [maxSize]=\"5\">\r\n </pagination-controls>\r\n </div>\r\n <!-- #endregion PAGINA\u00C7\u00C3O -->\r\n </div>\r\n </div>\r\n} @else {\r\n <!-- Loader enquanto os registros s\u00E3o carregados -->\r\n <div class=\"w-100 text-center\">\r\n <div class=\"spinner-border\" role=\"status\"> <span class=\"visually-hidden\">Carregando informa\u00E7\u00F5es...</span> </div>\r\n </div>\r\n}\r\n", styles: [".sp-pagination ::ng-deep .ngx-pagination .current{background:#3767b2;border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination a:hover,.sp-pagination ::ng-deep .ngx-pagination button:hover{border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-previous a:before,.sp-pagination ::ng-deep .ngx-pagination .pagination-previous.disabled:before{content:\"\";display:inline-block;margin-right:.5rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-next a:after,.sp-pagination ::ng-deep .ngx-pagination .pagination-next.disabled:after{content:\"\";display:inline-block;margin-left:.5rem}.text-dark-grey{color:#63676b!important}table{border-color:#c4c4c4}table thead{height:50px;font-size:1rem;background-color:#f9fafb!important}table thead>tr{background-color:#f9fafb!important}table thead>tr>th{background-color:#f9fafb!important}table tbody{font-size:.875rem}table tbody>tr{height:50px}table tbody>tr:hover{background-color:#cce5ff}table.table>tbody{border-top:none}\n"] }]
|
|
158
169
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { usePagination: [{
|
|
159
170
|
type: Input
|
|
160
171
|
}], recordsList: [{
|
|
@@ -182,4 +193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
182
193
|
}], pageChange: [{
|
|
183
194
|
type: Output
|
|
184
195
|
}] } });
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWluZnJhL3NyYy9saWIvd2lkZ2V0cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUUzSTs7Ozs7Ozs7Ozs7O0VBWUU7QUFNRixNQUFNLE9BQU8sY0FBYztJQWdCekI7bUJBQ2U7SUFDZixJQUNXLFdBQVcsS0FBd0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFXLFdBQVcsQ0FBQyxLQUF3QjtRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQWlDRCwwSEFBMEg7SUFDMUgsSUFDVyxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFXLFlBQVksQ0FBQyxLQUFhO1FBQ25DLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxJQUFJLG9CQUFvQixDQUFDO0lBQ3JELENBQUM7SUFrQkQsb0JBQW9CO0lBRXBCLGtEQUFrRDtJQUdsRCxnREFBZ0Q7SUFDaEQsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5RTFDLHFCQUFxQjtRQUVyQixpQkFBaUI7UUFFakI7MkJBQ21CO1FBQ0gsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFrQjlDOzRCQUNv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c0JBQWpELEtBQUs7dUJBQUMsa0JBQWtCO2dCQU1JLFdBQVc7c0JBQXZDLEtBQUs7dUJBQUMsYUFBYTtnQkFLVCxZQUFZO3NCQUR0QixLQUFLO2dCQVFXLGtCQUFrQjtzQkFBbEMsTUFBTTtnQkFHVSxVQUFVO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgZGUgVGFiZWxhIEN1c3RvbWl6w6F2ZWxcclxuICpcclxuICogTyBgVGFibGVDb21wb25lbnRgIMOpIHVtIGNvbXBvbmVudGUgQW5ndWxhciBwcm9qZXRhZG8gcGFyYSBleGliaXIgdW1hIHRhYmVsYSBjdXN0b21pesOhdmVsXHJcbiAqIGNvbSBzdXBvcnRlIGEgcGFnaW5hw6fDo28uIEVsZSBwZXJtaXRlIGEgY29uZmlndXJhw6fDo28gZGUgY2FiZcOnYWxob3MgZGUgY29sdW5hcywgcG9zaWNpb25hbWVudG9cclxuICogZGEgcGFnaW5hw6fDo28gZSBvcMOnw7VlcyBkZSBpdGVucyBwb3IgcMOhZ2luYS4gTyBjb21wb25lbnRlIMOpIGZsZXjDrXZlbCwgdXRpbGl6YW5kbyBjbGFzc2VzIEJvb3RzdHJhcFxyXG4gKiBwYXJhIGFqdXN0YXIgbyBsYXlvdXQgZGFzIGNvbHVuYXMgZSBlbWl0aW5kbyBldmVudG9zIHBhcmEgcXVlIG8gY29tcG9uZW50ZSBwYWkgcG9zc2EgcmVhZ2lyIGFcclxuICogbXVkYW7Dp2FzIG5hIHDDoWdpbmEgb3Ugbm8gbsO6bWVybyBkZSBpdGVucyBleGliaWRvcy5cclxuICpcclxuICogQHNlbGVjdG9yIGxpYi10YWJsZVxyXG4gKiBAdGVtcGxhdGVVcmwgLi90YWJsZS5jb21wb25lbnQuaHRtbFxyXG4gKiBAc3R5bGVVcmwgLi90YWJsZS5jb21wb25lbnQuc2Nzc1xyXG4qL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgLy8gI3JlZ2lvbiA9PT09PT09PT09PiBQUk9QUklFREFERVMgPD09PT09PT09PT1cclxuXHJcbiAgLy8gI3JlZ2lvbiBQUklWQVRFXHJcbiAgcHJpdmF0ZSBfcGFnaW5hdGlvbklEOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcmVjb3Jkc0xpc3Q6IGFueVtdIHwgdW5kZWZpbmVkO1xyXG4gIC8vICNlbmRyZWdpb24gUFJJVkFURVxyXG5cclxuICAvLyAjcmVnaW9uIFBVQkxJQ1xyXG5cclxuICAvKiogRGV0ZXJtaW5hIHNlIGEgdGFiZWxhIGRldmUgdXNhciBwYWdpbmHDp8Ojby5cclxuICAgKiBAZGVmYXVsdCB0cnVlICovXHJcbiAgQElucHV0KCkgcHVibGljIHVzZVBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBcclxuICAvKiogTGlzdGEgZGUgcmVnaXN0cm9zIGEgc2VyZW0gZXhpYmlkb3MgbmEgdGFiZWxhLlxyXG4gICAqIEByZXF1aXJlZCAqL1xyXG4gIEBJbnB1dCh7IGFsaWFzOiAnbGlzdCcsIHJlcXVpcmVkOiB0cnVlIH0pXHJcbiAgcHVibGljIGdldCByZWNvcmRzTGlzdCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9yZWNvcmRzTGlzdDsgfVxyXG4gIHB1YmxpYyBzZXQgcmVjb3Jkc0xpc3QodmFsdWU6IGFueVtdIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9yZWNvcmRzTGlzdCA9IHZhbHVlO1xyXG4gICAgY29uc29sZS5sb2coXCJMaXN0YTogXCIsIHRoaXMuX3JlY29yZHNMaXN0KTtcclxuICB9XHJcblxyXG5cclxuICAvKiogT3DDp8O1ZXMgZGUgY29udGFnZW0gZGUgaXRlbnMgcG9yIHDDoWdpbmEgZGlzcG9uw612ZWlzIHBhcmEgbyB1c3XDoXJpby5cclxuICAgKiBAcmVxdWlyZWQgKi9cclxuICBASW5wdXQoJ2NvdW50cycpIHB1YmxpYyBjb3VudE9wdGlvbnM6IG51bWJlcltdO1xyXG5cclxuXHJcbiAgLyoqIFBvc2ljaW9uYW1lbnRvIGRvcyBjb250cm9sZXMgZGUgcGFnaW5hw6fDo28uXHJcbiAgICogQGRlZmF1bHQgJ2VuZCcgKi9cclxuICBASW5wdXQoJ3BsYWNlbWVudCcpIHB1YmxpYyBwYWdpbmF0aW9uUGxhY2VtZW50OiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdiZXR3ZWVuJyA9ICdlbmQnO1xyXG5cclxuXHJcbiAgLyoqIExpc3RhIGRlIGNhYmXDp2FsaG9zIHBhcmEgYXMgY29sdW5hcyBkYSB0YWJlbGEsIGluY2x1aW5kbyBvIG5vbWUsIGEgbGFyZ3VyYSBkYSBjb2x1bmEgZSBjbGFzc2VzIGN1c3RvbWl6YWRhcy5cclxuICAgKiBAcmVxdWlyZWQgKi9cclxuICBASW5wdXQoeyBhbGlhczogJ2hlYWRlcnMnLCByZXF1aXJlZDogdHJ1ZSB9KSBwdWJsaWMgaGVhZGVyc0xpc3Q6IHtcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbDogbnVtYmVyLFxyXG4gICAgY3VzdG9tQ2xhc3Nlcz86IHN0cmluZyxcclxuICAgIG9yZGVyQ29sdW1uPzogc3RyaW5nXHJcbiAgfVtdO1xyXG5cclxuXHJcbiAgLyoqIE1lbnNhZ2VtIGN1c3RvbWl6YWRhIHBhcmEgbGlzdGEgdmF6aWEgKi9cclxuICBASW5wdXQoJ2VtcHR5TGlzdE1lc3NhZ2UnKSBwdWJsaWMgZW1wdHlMaXN0TWVzc2FnZT86IHN0cmluZztcclxuXHJcblxyXG4gIC8qKiBJbmZvcm1hIHNlIG8gY291bnRlciBkZSByZWdpc3Ryb3MgZGV2ZSBhcGFyZWNlciBvdSBuw6NvLlxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAqL1xyXG4gIEBJbnB1dCgnc2hvd0NvdW50ZXInKSBwdWJsaWMgc2hvd0NvdW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHJcbiAgLyoqIEluZm9ybWEgdW0gSUQgcGFyYSBhIHBhZ2luYcOnw6NvIGRhIHRhYmVsYSBlc3BlY8OtZmljYS4gRGV2ZSBzZXIgdXRpbGl6YWRhIGVtIGNhc28gZGUgbcO6bHRpcGxhcyB0YWJlbGFzIG5hIG1lc21hIHRlbGEuICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25JRCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbklEOyB9XHJcbiAgcHVibGljIHNldCBwYWdpbmF0aW9uSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGFnaW5hdGlvbklEID0gdmFsdWUgfHwgJ2xpYlRhYmxlUGFnaW5hdGlvbic7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIEV2ZW50byBlbWl0aWRvIHF1YW5kbyBvIG7Dum1lcm8gZGUgaXRlbnMgcG9yIHDDoWdpbmEgw6kgYWx0ZXJhZG8uICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBpdGVtc1BlclBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBFdmVudG8gZW1pdGlkbyBxdWFuZG8gYSBww6FnaW5hIMOpIGFsdGVyYWRhLiAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcblxyXG4gIC8qKiBDb250YWRvciBkZSByZWdpc3Ryb3MgKHBvZGUgc2VyIHVzYWRvIHBhcmEgZnV0dXJhcyBpbXBsZW1lbnRhw6fDtWVzIGRlIGzDs2dpY2EgaW50ZXJuYSkuICovXHJcbiAgcHVibGljIGNvdW50ZXI6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKiBQw6FnaW5hIGF0dWFsIGRhIHRhYmVsYS4gKi9cclxuXHRwdWJsaWMgcGFnZTogbnVtYmVyID0gMTtcclxuXHJcbiAgLyoqIE7Dum1lcm8gZGUgaXRlbnMgYSBzZXJlbSBleGliaWRvcyBwb3IgcMOhZ2luYS4gKi9cclxuXHRwdWJsaWMgaXRlbXNQZXJQYWdlOiBudW1iZXI7XHJcbiAgLy8gI2VuZHJlZ2lvbiBQVUJMSUNcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBQUk9QUklFREFERVMgPD09PT09PT09PT1cclxuXHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gSU5JQ0lBTElaQcOHw4NPIDw9PT09PT09PT09XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcbiAgLyoqIEluaWNpYWxpemEgbyBjb21wb25lbnRlIGUgZGVmaW5lIG8gbsO6bWVybyBpbmljaWFsIGRlIGl0ZW5zIHBvciBww6FnaW5hLiAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVjb3Jkc0xpc3QpIHsgdGhpcy5pdGVtc1BlclBhZ2UgPSB0aGlzLmNvdW50T3B0aW9ucyA/IHRoaXMuY291bnRPcHRpb25zWzBdIDogdGhpcy5yZWNvcmRzTGlzdC5sZW5ndGggfVxyXG4gICAgZWxzZSB7IHRoaXMuaXRlbXNQZXJQYWdlID0gdGhpcy5jb3VudE9wdGlvbnNbMF0gPz8gMTAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAgLy8gRm9yw6dhciB1bWEgbm92YSBkZXRlY8Onw6NvIGFww7NzIGEgcmVuZGVyaXphw6fDo29cclxuICB9XHJcblxyXG4gIC8qKiBNb25pdG9yYSBhcyBtdWRhbsOnYXMgbmFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZSByZWFsaXphIGFqdXN0ZXMsIGNvbW8gcmVzZXRhciBhIHBhZ2luYcOnw6NvIG91IHZhbGlkYXIgbyBsYXlvdXQgZGFzIGNvbHVuYXMuXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgT2JqZXRvIHF1ZSBjb250w6ltIGFzIG11ZGFuw6dhcyBuYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZS4gKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1sncmVjb3Jkc0xpc3QnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5yZXNldFBhZ2luYXRpb24odGhpcy5yZWNvcmRzTGlzdCA/PyBbXSk7XHJcblxyXG4gICAgICBsZXQgbWF4Q29sdW1ucyA9IHRoaXMuaGVhZGVyc0xpc3QucmVkdWNlKChuLCB7Y29sfSkgPT4gbiArIGNvbCwgMCk7XHJcbiAgICAgIGlmIChtYXhDb2x1bW5zID49IDEzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBzb21hIGRlIGxhcmd1cmEgKGNsYXNzZSBjb20gcHJlZml4byAnY29sLScpIGRlIHRvZGFzIGFzIGNvbHVuYXMgbsOjbyBwb2RlIHNlciBtYWlvciBxdWUgMTIuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gSU5JQ0lBTElaQcOHw4NPIDw9PT09PT09PT09XHJcblxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFVUSUxJVMOBUklPUyA8PT09PT09PT09PVxyXG5cclxuICAvKiogTW9kaWZpY2EgYSBxdWFudGlkYWRlIGRlIGl0ZW5zIGEgc2VyIG1vc3RyYWRhIG5hIGxpc3RhLlxyXG4gICAqIEBwYXJhbSBldmVudCBwYXLDom1ldHJvIGRlIGV2ZW50byBxdWUgaXLDoSBzZWxlY2lvbmFyIGEgbm92YSBxdWFudGlkYWRlLiAqL1xyXG4gIHB1YmxpYyBvblNlbGVjdENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSwgMTApO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlQ2hhbmdlLmVtaXQodGhpcy5pdGVtc1BlclBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2V0YSBhIHBhZ2luYcOnw6NvIGRhIGxpc3RhZ2VtIGNvbSBiYXNlIG5vIG7Dum1lcm8gYXR1YWwgZGUgcmVnaXN0cm9zLlxyXG4gICAqIEBwYXJhbSBsaXN0IExpc3RhIGRlIHJlZ2lzdHJvcyBwYXJhIHJlc2V0YXIgYSBwYWdpbmHDp8Ojby4gKi9cclxuICBwdWJsaWMgcmVzZXRQYWdpbmF0aW9uKGxpc3Q6IGFueVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XHJcbiAgICBpZiAobGlzdC5sZW5ndGggPD0gc3RhcnRJbmRleCkge1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHQvLyNyZWdpb24gT3JkZXJpbmcsIFNvcnRpbmcgb3UgYXBlbmFzIE9yZGVuYcOnw6NvXHJcblxyXG5cdC8qKiBNw6l0b2RvIHF1ZSBmYXogYSBvcmRlbmHDp8OjbyBkb3MgY29udHJhdG9zIG5hIHRlbGEgZGUgbGlzdGFnZW0sIGVtIGNhZGEgdW1hIGRhcyBjw6lsdWxhcyBkbyBjYWJlw6dhbGhvIGRhIHRhYmVsYSwgb25kZSBjYWRhIHVtICBcclxuXHQgKiAgZG9zIGVsZW1lbnRvcyA8dGg+IHJlcHJlc2VudGEgdW1hIGNvbHVuYSwgZGUgYWNvcmRvIGNvbSBhIGxpc3RhIGRlIGNvbnRyYXRvcyBxdWUgcmV0b3JuYSBkbyBiYWNrZW5kLiAqL1xyXG5cdC8vIE9iamV0byBwYXJhIGFybWF6ZW5hciBhIGRpcmXDp8OjbyBkZSBvcmRlbmHDp8OjbyBkZSBjYWRhIGNvbHVuYVxyXG5cdHB1YmxpYyBzb3J0RGlyZWN0aW9uOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblxyXG5cdC8vIENvbHVuYSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRhIHBhcmEgb3JkZW5hw6fDo29cclxuXHRwdWJsaWMgY3VycmVudFNvcnRDb2x1bW46IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvLyBGdW7Dp8OjbyBjaGFtYWRhIHF1YW5kbyBvY29ycmUgdW1hIG11ZGFuw6dhIG5hIG9yZGVuYcOnw6NvXHJcblx0b25Tb3J0Q2hhbmdlKGV2ZW50OiB7IGRpcmVjdGlvbjogc3RyaW5nLCBjb2x1bW46IHN0cmluZyB9KSB7XHJcblx0XHRjb25zdCB7IGRpcmVjdGlvbiwgY29sdW1uIH0gPSBldmVudDtcclxuXHJcblx0XHQvLyBWZXJpZmljYSBzZSBhIGNvbHVuYSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRhIMOpIGEgbWVzbWEgZGEgbm92YSBzZWxlw6fDo29cclxuXHRcdGlmICh0aGlzLmN1cnJlbnRTb3J0Q29sdW1uID09PSBjb2x1bW4pIHtcclxuXHRcdFx0Ly8gQWx0ZXJuYSBlbnRyZSAnYXNjJyBlICdkZXNjJyBwYXJhIGEgZGlyZcOnw6NvIGRlIG9yZGVuYcOnw6NvIGRhIGNvbHVuYVxyXG5cdFx0XHR0aGlzLnNvcnREaXJlY3Rpb25bY29sdW1uXSA9IHRoaXMuc29ydERpcmVjdGlvbltjb2x1bW5dID09PSAnYXNjJyA/ICdhc2MnIDogJ2Rlc2MnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRGVmaW5lIGEgbm92YSBjb2x1bmEgZSBhIGRpcmXDp8OjbyBkZSBvcmRlbmHDp8OjbyBjb21vICdhc2MnXHJcblx0XHRcdHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPSBjb2x1bW47XHJcblx0XHRcdHRoaXMuc29ydERpcmVjdGlvbiA9IHsgW2NvbHVtbl06ICdhc2MnIH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVhbGl6YSBhIG9yZGVuYcOnw6NvIGRvcyBkYWRvcyBkYSB0YWJlbGFcclxuXHRcdHRoaXMuc29ydERhdGEoKTtcclxuXHR9XHJcblxyXG5cdC8vIEZ1bsOnw6NvIGRlIG9yZGVuYcOnw6NvIGRvcyBkYWRvcyBkYSB0YWJlbGFcclxuXHRwcml2YXRlIHNvcnREYXRhKCkge1xyXG5cclxuXHRcdGlmICh0aGlzLnJlY29yZHNMaXN0KSB7XHJcblx0XHRcdGNvbnN0IGdydXBvc0xpc3QgPSB0aGlzLnJlY29yZHNMaXN0O1xyXG5cclxuXHRcdFx0Z3J1cG9zTGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gdGhpcy5jdXJyZW50U29ydENvbHVtbjtcclxuXHRcdFx0XHRjb25zdCBkaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb25bYXR0cmlidXRlXTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZVByb3BlcnRpZXMoYSwgYiwgYXR0cmlidXRlLCBkaXJlY3Rpb24pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gQ29tcGFyYSBvcyB2YWxvcmVzIGRhcyBwcm9wcmllZGFkZXMgZW50cmUgZG9pcyBvYmpldG9zXHJcblx0cHJpdmF0ZSBjb21wYXJlUHJvcGVydGllcyhhOiBhbnksIGI6IGFueSwgYXR0cmlidXRlOiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IHByb3BlcnR5QSA9IHRoaXMuZ2V0UHJvcGVydHkoYSwgYXR0cmlidXRlKS50b1VwcGVyQ2FzZSgpO1xyXG5cdFx0Y29uc3QgcHJvcGVydHlCID0gdGhpcy5nZXRQcm9wZXJ0eShiLCBhdHRyaWJ1dGUpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG5cdFx0aWYgKHByb3BlcnR5QSA8IHByb3BlcnR5Qikge1xyXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAocHJvcGVydHlBID4gcHJvcGVydHlCKSB7XHJcblx0XHRcdHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHJcblx0Ly8gT2J0w6ltIG8gdmFsb3IgZGUgdW1hIHByb3ByaWVkYWRlIGVzcGVjw61maWNhIGRlIHVtIG9iamV0b1xyXG5cdHByaXZhdGUgZ2V0UHJvcGVydHkob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcclxuXHRcdFxyXG5cdFx0aWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwYXRoLnJlZHVjZSgodmFsdWUsIHByb3BlcnR5KSA9PiB2YWx1ZSA/IHZhbHVlW3Byb3BlcnR5XSA6ICcnLCBvYmopO1xyXG5cdH1cclxuXHQvLyNlbmRyZWdpb24gT3JkZXJpbmcsIFNvcnRpbmcgb3UgYXBlbmFzIE9yZGVuYcOnw6NvXHJcblxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gVVRJTElUw4FSSU9TIDw9PT09PT09PT09XHJcblxyXG59XHJcbiIsIkBpZiAocmVjb3Jkc0xpc3QpIHtcclxuICAgPGRpdiBjbGFzcz1cInRhYmxlLWxpc3Qgdy0xMDAgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgPCEtLSBFeGliZSBvIG7Dum1lcm8gZGUgaXRlbnMgbW9zdHJhZG9zIGUgbyB0b3RhbCBkZSByZWdpc3Ryb3MgLS0+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50ZXJcIiBjbGFzcz1cIm1zLTFcIj4gRXhpYmluZG8ge3sgaXRlbXNQZXJQYWdlIDw9IHJlY29yZHNMaXN0Lmxlbmd0aCA/IGl0ZW1zUGVyUGFnZSA6IHJlY29yZHNMaXN0Lmxlbmd0aCB9fSBkZSB7eyByZWNvcmRzTGlzdC5sZW5ndGggfX0gcmVnaXN0cm9zIDwvc3Bhbj5cclxuICAgICAgXHJcbiAgICAgIDwhLS0gQ29udGFpbmVyIGRhIHRhYmVsYSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWxpc3Qgb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1ib3R0b20tMCByb3VuZGVkLWJvdHRvbSByb3VuZGVkXCI+XHJcbiAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIGJvcmRlciBtYi0wXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIEl0ZXJhIHNvYnJlIGEgbGlzdGEgZGUgY2FiZcOnYWxob3MgcGFyYSBjcmlhciBhcyBjb2x1bmFzIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGhlYWRlciBvZiBoZWFkZXJzTGlzdFwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGlnbi1taWRkbGUgdGV4dC1kYXJrLWdyZXkge3sgaGVhZGVyLmNvbCA+IDAgPyAnY29sLScraGVhZGVyLmNvbCA6ICdjb2wnIH19IHt7IGhlYWRlci5jdXN0b21DbGFzc2VzIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlci5uYW1lIH19XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICA8YXBwLW9yZGVyaW5nICpuZ0lmPVwiaGVhZGVyLm9yZGVyQ29sdW1uXCIgWyhzb3J0RGlyZWN0aW9uKV09XCJzb3J0RGlyZWN0aW9uW2hlYWRlci5vcmRlckNvbHVtbl1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoc29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoeyBkaXJlY3Rpb246ICRldmVudC5kaXJlY3Rpb24sIGNvbHVtbjogaGVhZGVyLm9yZGVyQ29sdW1uIH0pXCI+PC9hcHAtb3JkZXJpbmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcblxyXG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy1saWdodCBmYWRlLWluLXJvd1wiPlxyXG4gICAgICAgICAgICAgICBAaWYgKHJlY29yZHNMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgPCEtLSBDb250ZcO6ZG8gZGFzIGxpbmhhcyBkYSB0YWJlbGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpbm5lclJvd3NdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgPCEtLSBNZW5zYWdlbSBkZSBhdXPDqm5jaWEgZGUgcmVnaXN0cm9zIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiMTJcIiBjbGFzcz1cImFsaWduLW1pZGRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LWxpZ2h0IGZzdC1pdGFsaWMgdGV4dC1jZW50ZXJcIj4ge3sgZW1wdHlMaXN0TWVzc2FnZSA/IGVtcHR5TGlzdE1lc3NhZ2UgOiBcIkNvbnN1bHRhIG7Do28gcmV0b3Jub3UgcmVnaXN0cm9zLi4uXCIgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICAgICA8IS0tICNyZWdpb24gUEFHSU5Bw4fDg08gLS0+XHJcbiAgICAgICAgIDxkaXYgKm5nSWY9XCJ1c2VQYWdpbmF0aW9uICYmIHJlY29yZHNMaXN0Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImQtZmxleCBtdC0yXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAnanVzdGlmeS1jb250ZW50LXN0YXJ0JzogcGFnaW5hdGlvblBsYWNlbWVudCA9PSAnc3RhcnQnLFxyXG4gICAgICAgICAgICAgICAnanVzdGlmeS1jb250ZW50LWNlbnRlcic6IHBhZ2luYXRpb25QbGFjZW1lbnQgPT0gJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICdqdXN0aWZ5LWNvbnRlbnQtZW5kJzogcGFnaW5hdGlvblBsYWNlbWVudCA9PSAnZW5kJyxcclxuICAgICAgICAgICAgICAgJ2p1c3RpZnktY29udGVudC1iZXR3ZWVuJzogcGFnaW5hdGlvblBsYWNlbWVudCA9PSAnYmV0d2VlbidcclxuICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZS0yXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiPiBJdGVucyBwb3IgcMOhZ2luYSA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3Qgc2VsZWN0LXNlYXJjaFwiIChjaGFuZ2UpPVwib25TZWxlY3RDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudCBvZiBjb3VudE9wdGlvbnM7IGxldCBpID0gaW5kZXhcIiBbdmFsdWVdPVwiY291bnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY291bnRPcHRpb25zLmxlbmd0aCA+IDAgJiYgaSA9PSAwXCI+e3sgY291bnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBDb250cm9sZSBkZSBwYWdpbmHDp8OjbyAtLT5cclxuICAgICAgICAgICAgPHBhZ2luYXRpb24tY29udHJvbHNcclxuICAgICAgICAgICAgICAgW2lkXT1cInBhZ2luYXRpb25JRFwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwic3AtcGFnaW5hdGlvbiBtdC0zXCJcclxuICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwicGFnZSA9ICRldmVudDsgcGFnZUNoYW5nZS5lbWl0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICBwcmV2aW91c0xhYmVsPVwiwqsmbmJzcDsmbmJzcDsmbmJzcDtcIiBuZXh0TGFiZWw9XCImbmJzcDsmbmJzcDsmbmJzcDvCu1wiXHJcbiAgICAgICAgICAgICAgIFttYXhTaXplXT1cIjVcIj5cclxuICAgICAgICAgICAgPC9wYWdpbmF0aW9uLWNvbnRyb2xzPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIFBBR0lOQcOHw4NPIC0tPlxyXG4gICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG4gICA8IS0tIExvYWRlciBlbnF1YW50byBvcyByZWdpc3Ryb3Mgc8OjbyBjYXJyZWdhZG9zIC0tPlxyXG4gICA8ZGl2IGNsYXNzPVwidy0xMDAgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgcm9sZT1cInN0YXR1c1wiPiA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkNhcnJlZ2FuZG8gaW5mb3JtYcOnw7Vlcy4uLjwvc3Bhbj4gPC9kaXY+XHJcbiAgIDwvZGl2PlxyXG59XHJcbiJdfQ==
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWluZnJhL3NyYy9saWIvd2lkZ2V0cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtaW5mcmEvc3JjL2xpYi93aWRnZXRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUUzSTs7Ozs7Ozs7Ozs7O0VBWUU7QUFNRixNQUFNLE9BQU8sY0FBYztJQW1CekI7bUJBQ2U7SUFDZixJQUNXLFdBQVcsS0FBd0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFXLFdBQVcsQ0FBQyxLQUF3QixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQWlDL0UsMEhBQTBIO0lBQzFILElBQ1csWUFBWSxLQUFhLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBVyxZQUFZLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssSUFBSSxvQkFBb0IsQ0FBQztJQUNyRCxDQUFDO0lBU0QsOEJBQThCO0lBQy9CLElBQVcsSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBVyxJQUFJLENBQUMsS0FBYSxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU1RCxtREFBbUQ7SUFDbkQsSUFBVyxZQUFZLEtBQWEsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQVcsWUFB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QU8sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELDJEQUEyRDtJQUNuRCxXQUFXLENBQUMsR0FBUSxFQUFFLElBQXVCO1FBRXBELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUUsQ0FBQzsrR0FyTlcsY0FBYzttR0FBZCxjQUFjLHVkQ3BCM0Isb29IQXVFQTs7NEZEbkRhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsV0FBVztzRkFvQkwsYUFBYTtzQkFBNUIsS0FBSztnQkFNSyxXQUFXO3NCQURyQixLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQU9oQixZQUFZO3NCQUFuQyxLQUFLO3VCQUFDLFFBQVE7Z0JBS1ksbUJBQW1CO3NCQUE3QyxLQUFLO3VCQUFDLFdBQVc7Z0JBS2tDLFdBQVc7c0JBQTlELEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBU1QsZ0JBQWdCO3NCQUFqRCxLQUFLO3VCQUFDLGtCQUFrQjtnQkFNSSxXQUFXO3NCQUF2QyxLQUFLO3VCQUFDLGFBQWE7Z0JBS1QsWUFBWTtzQkFEdEIsS0FBSztnQkFRVyxrQkFBa0I7c0JBQWxDLE1BQU07Z0JBR1UsVUFBVTtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGRlIFRhYmVsYSBDdXN0b21pesOhdmVsXHJcbiAqXHJcbiAqIE8gYFRhYmxlQ29tcG9uZW50YCDDqSB1bSBjb21wb25lbnRlIEFuZ3VsYXIgcHJvamV0YWRvIHBhcmEgZXhpYmlyIHVtYSB0YWJlbGEgY3VzdG9taXrDoXZlbFxyXG4gKiBjb20gc3Vwb3J0ZSBhIHBhZ2luYcOnw6NvLiBFbGUgcGVybWl0ZSBhIGNvbmZpZ3VyYcOnw6NvIGRlIGNhYmXDp2FsaG9zIGRlIGNvbHVuYXMsIHBvc2ljaW9uYW1lbnRvXHJcbiAqIGRhIHBhZ2luYcOnw6NvIGUgb3DDp8O1ZXMgZGUgaXRlbnMgcG9yIHDDoWdpbmEuIE8gY29tcG9uZW50ZSDDqSBmbGV4w612ZWwsIHV0aWxpemFuZG8gY2xhc3NlcyBCb290c3RyYXBcclxuICogcGFyYSBhanVzdGFyIG8gbGF5b3V0IGRhcyBjb2x1bmFzIGUgZW1pdGluZG8gZXZlbnRvcyBwYXJhIHF1ZSBvIGNvbXBvbmVudGUgcGFpIHBvc3NhIHJlYWdpciBhXHJcbiAqIG11ZGFuw6dhcyBuYSBww6FnaW5hIG91IG5vIG7Dum1lcm8gZGUgaXRlbnMgZXhpYmlkb3MuXHJcbiAqXHJcbiAqIEBzZWxlY3RvciBsaWItdGFibGVcclxuICogQHRlbXBsYXRlVXJsIC4vdGFibGUuY29tcG9uZW50Lmh0bWxcclxuICogQHN0eWxlVXJsIC4vdGFibGUuY29tcG9uZW50LnNjc3NcclxuKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gUFJPUFJJRURBREVTIDw9PT09PT09PT09XHJcblxyXG4gIC8vICNyZWdpb24gUFJJVkFURVxyXG4gIHByaXZhdGUgX3BhZ2luYXRpb25JRDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3JlY29yZHNMaXN0OiBhbnlbXSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBfY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcbiAgcHJpdmF0ZSBfY3VycmVudEl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMDtcclxuICAvLyAjZW5kcmVnaW9uIFBSSVZBVEVcclxuXHJcbiAgLy8gI3JlZ2lvbiBQVUJMSUNcclxuXHJcbiAgLyoqIERldGVybWluYSBzZSBhIHRhYmVsYSBkZXZlIHVzYXIgcGFnaW5hw6fDo28uXHJcbiAgICogQGRlZmF1bHQgdHJ1ZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB1c2VQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgXHJcbiAgLyoqIExpc3RhIGRlIHJlZ2lzdHJvcyBhIHNlcmVtIGV4aWJpZG9zIG5hIHRhYmVsYS5cclxuICAgKiBAcmVxdWlyZWQgKi9cclxuICBASW5wdXQoeyBhbGlhczogJ2xpc3QnLCByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gIHB1YmxpYyBnZXQgcmVjb3Jkc0xpc3QoKTogYW55W10gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fcmVjb3Jkc0xpc3Q7IH1cclxuICBwdWJsaWMgc2V0IHJlY29yZHNMaXN0KHZhbHVlOiBhbnlbXSB8IHVuZGVmaW5lZCkgeyB0aGlzLl9yZWNvcmRzTGlzdCA9IHZhbHVlOyB9XHJcblxyXG5cclxuICAvKiogT3DDp8O1ZXMgZGUgY29udGFnZW0gZGUgaXRlbnMgcG9yIHDDoWdpbmEgZGlzcG9uw612ZWlzIHBhcmEgbyB1c3XDoXJpby5cclxuICAgKiBAcmVxdWlyZWQgKi9cclxuICBASW5wdXQoJ2NvdW50cycpIHB1YmxpYyBjb3VudE9wdGlvbnM6IG51bWJlcltdO1xyXG5cclxuXHJcbiAgLyoqIFBvc2ljaW9uYW1lbnRvIGRvcyBjb250cm9sZXMgZGUgcGFnaW5hw6fDo28uXHJcbiAgICogQGRlZmF1bHQgJ2VuZCcgKi9cclxuICBASW5wdXQoJ3BsYWNlbWVudCcpIHB1YmxpYyBwYWdpbmF0aW9uUGxhY2VtZW50OiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdiZXR3ZWVuJyA9ICdlbmQnO1xyXG5cclxuXHJcbiAgLyoqIExpc3RhIGRlIGNhYmXDp2FsaG9zIHBhcmEgYXMgY29sdW5hcyBkYSB0YWJlbGEsIGluY2x1aW5kbyBvIG5vbWUsIGEgbGFyZ3VyYSBkYSBjb2x1bmEgZSBjbGFzc2VzIGN1c3RvbWl6YWRhcy5cclxuICAgKiBAcmVxdWlyZWQgKi9cclxuICBASW5wdXQoeyBhbGlhczogJ2hlYWRlcnMnLCByZXF1aXJlZDogdHJ1ZSB9KSBwdWJsaWMgaGVhZGVyc0xpc3Q6IHtcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbDogbnVtYmVyLFxyXG4gICAgY3VzdG9tQ2xhc3Nlcz86IHN0cmluZyxcclxuICAgIG9yZGVyQ29sdW1uPzogc3RyaW5nXHJcbiAgfVtdO1xyXG5cclxuXHJcbiAgLyoqIE1lbnNhZ2VtIGN1c3RvbWl6YWRhIHBhcmEgbGlzdGEgdmF6aWEgKi9cclxuICBASW5wdXQoJ2VtcHR5TGlzdE1lc3NhZ2UnKSBwdWJsaWMgZW1wdHlMaXN0TWVzc2FnZT86IHN0cmluZztcclxuXHJcblxyXG4gIC8qKiBJbmZvcm1hIHNlIG8gY291bnRlciBkZSByZWdpc3Ryb3MgZGV2ZSBhcGFyZWNlciBvdSBuw6NvLlxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAqL1xyXG4gIEBJbnB1dCgnc2hvd0NvdW50ZXInKSBwdWJsaWMgc2hvd0NvdW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHJcbiAgLyoqIEluZm9ybWEgdW0gSUQgcGFyYSBhIHBhZ2luYcOnw6NvIGRhIHRhYmVsYSBlc3BlY8OtZmljYS4gRGV2ZSBzZXIgdXRpbGl6YWRhIGVtIGNhc28gZGUgbcO6bHRpcGxhcyB0YWJlbGFzIG5hIG1lc21hIHRlbGEuICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHBhZ2luYXRpb25JRCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbklEOyB9XHJcbiAgcHVibGljIHNldCBwYWdpbmF0aW9uSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGFnaW5hdGlvbklEID0gdmFsdWUgfHwgJ2xpYlRhYmxlUGFnaW5hdGlvbic7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqIEV2ZW50byBlbWl0aWRvIHF1YW5kbyBvIG7Dum1lcm8gZGUgaXRlbnMgcG9yIHDDoWdpbmEgw6kgYWx0ZXJhZG8uICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBpdGVtc1BlclBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBFdmVudG8gZW1pdGlkbyBxdWFuZG8gYSBww6FnaW5hIMOpIGFsdGVyYWRhLiAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgcGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgLyoqIFDDoWdpbmEgYXR1YWwgZGEgdGFiZWxhLiAqL1xyXG5cdHB1YmxpYyBnZXQgcGFnZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7IH1cclxuXHRwdWJsaWMgc2V0IHBhZ2UodmFsdWU6IG51bWJlcikgeyB0aGlzLl9jdXJyZW50UGFnZSA9IHZhbHVlOyB9XHJcblxyXG4gIC8qKiBOw7ptZXJvIGRlIGl0ZW5zIGEgc2VyZW0gZXhpYmlkb3MgcG9yIHDDoWdpbmEuICovXHJcbiAgcHVibGljIGdldCBpdGVtc1BlclBhZ2UoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2N1cnJlbnRJdGVtc1BlclBhZ2U7IH1cclxuXHRwdWJsaWMgc2V0IGl0ZW1zUGVyUGFnZSh2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX2N1cnJlbnRJdGVtc1BlclBhZ2UgPSB2YWx1ZTsgfVxyXG5cclxuXHJcbiAgcHVibGljIGdldCBmaXJzdEl0ZW1PZlBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLml0ZW1zUGVyUGFnZSArIDE7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbGFzdEl0ZW1PZlBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnBhZ2UgKiB0aGlzLml0ZW1zUGVyUGFnZSwgdGhpcy5yZWNvcmRzTGlzdD8ubGVuZ3RoID8/IDApO1xyXG4gIH1cclxuXHJcbiAgLy8gRXhlbXBsbyBkZSBzdHJpbmcgY29tIGEgY29udGFnZW06XHJcbiAgcHVibGljIGdldCBpdGVtc0Rpc3BsYXlUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYEV4aWJpbmRvICR7IHRoaXMuY291bnRPcHRpb25zID8gdGhpcy5maXJzdEl0ZW1PZlBhZ2UrXCItXCIrdGhpcy5sYXN0SXRlbU9mUGFnZSArIFwiIGRlXCIgOiBcIlwiIH0gJHt0aGlzLnJlY29yZHNMaXN0Py5sZW5ndGggPz8gMH0gcmVnaXN0cm9zYDtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvbiBQVUJMSUNcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBQUk9QUklFREFERVMgPD09PT09PT09PT1cclxuXHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gSU5JQ0lBTElaQcOHw4NPIDw9PT09PT09PT09XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcbiAgLyoqIEluaWNpYWxpemEgbyBjb21wb25lbnRlIGUgZGVmaW5lIG8gbsO6bWVybyBpbmljaWFsIGRlIGl0ZW5zIHBvciBww6FnaW5hLiAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVjb3Jkc0xpc3QpIHsgdGhpcy5pdGVtc1BlclBhZ2UgPSB0aGlzLmNvdW50T3B0aW9ucyA/IHRoaXMuY291bnRPcHRpb25zWzBdIDogdGhpcy5yZWNvcmRzTGlzdC5sZW5ndGggfVxyXG4gICAgZWxzZSB7IHRoaXMuaXRlbXNQZXJQYWdlID0gdGhpcy5jb3VudE9wdGlvbnNbMF0gPz8gMTAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAgLy8gRm9yw6dhciB1bWEgbm92YSBkZXRlY8Onw6NvIGFww7NzIGEgcmVuZGVyaXphw6fDo29cclxuICB9XHJcblxyXG4gIC8qKiBNb25pdG9yYSBhcyBtdWRhbsOnYXMgbmFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZSByZWFsaXphIGFqdXN0ZXMsIGNvbW8gcmVzZXRhciBhIHBhZ2luYcOnw6NvIG91IHZhbGlkYXIgbyBsYXlvdXQgZGFzIGNvbHVuYXMuXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgT2JqZXRvIHF1ZSBjb250w6ltIGFzIG11ZGFuw6dhcyBuYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZS4gKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1sncmVjb3Jkc0xpc3QnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5yZXNldFBhZ2luYXRpb24odGhpcy5yZWNvcmRzTGlzdCA/PyBbXSk7XHJcblxyXG4gICAgICBsZXQgbWF4Q29sdW1ucyA9IHRoaXMuaGVhZGVyc0xpc3QucmVkdWNlKChuLCB7Y29sfSkgPT4gbiArIGNvbCwgMCk7XHJcbiAgICAgIGlmIChtYXhDb2x1bW5zID49IDEzKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBzb21hIGRlIGxhcmd1cmEgKGNsYXNzZSBjb20gcHJlZml4byAnY29sLScpIGRlIHRvZGFzIGFzIGNvbHVuYXMgbsOjbyBwb2RlIHNlciBtYWlvciBxdWUgMTIuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gSU5JQ0lBTElaQcOHw4NPIDw9PT09PT09PT09XHJcblxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFVUSUxJVMOBUklPUyA8PT09PT09PT09PVxyXG5cclxuICAvKiogTW9kaWZpY2EgYSBxdWFudGlkYWRlIGRlIGl0ZW5zIGEgc2VyIG1vc3RyYWRhIG5hIGxpc3RhLlxyXG4gICAqIEBwYXJhbSBldmVudCBwYXLDom1ldHJvIGRlIGV2ZW50byBxdWUgaXLDoSBzZWxlY2lvbmFyIGEgbm92YSBxdWFudGlkYWRlLiAqL1xyXG4gIHB1YmxpYyBvblNlbGVjdENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSwgMTApO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlQ2hhbmdlLmVtaXQodGhpcy5pdGVtc1BlclBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2V0YSBhIHBhZ2luYcOnw6NvIGRhIGxpc3RhZ2VtIGNvbSBiYXNlIG5vIG7Dum1lcm8gYXR1YWwgZGUgcmVnaXN0cm9zLlxyXG4gICAqIEBwYXJhbSBsaXN0IExpc3RhIGRlIHJlZ2lzdHJvcyBwYXJhIHJlc2V0YXIgYSBwYWdpbmHDp8Ojby4gKi9cclxuICBwdWJsaWMgcmVzZXRQYWdpbmF0aW9uKGxpc3Q6IGFueVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XHJcbiAgICBpZiAobGlzdC5sZW5ndGggPD0gc3RhcnRJbmRleCkge1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHQvLyNyZWdpb24gT3JkZXJpbmcsIFNvcnRpbmcgb3UgYXBlbmFzIE9yZGVuYcOnw6NvXHJcblxyXG5cdC8qKiBNw6l0b2RvIHF1ZSBmYXogYSBvcmRlbmHDp8OjbyBkb3MgY29udHJhdG9zIG5hIHRlbGEgZGUgbGlzdGFnZW0sIGVtIGNhZGEgdW1hIGRhcyBjw6lsdWxhcyBkbyBjYWJlw6dhbGhvIGRhIHRhYmVsYSwgb25kZSBjYWRhIHVtICBcclxuXHQgKiAgZG9zIGVsZW1lbnRvcyA8dGg+IHJlcHJlc2VudGEgdW1hIGNvbHVuYSwgZGUgYWNvcmRvIGNvbSBhIGxpc3RhIGRlIGNvbnRyYXRvcyBxdWUgcmV0b3JuYSBkbyBiYWNrZW5kLiAqL1xyXG5cdC8vIE9iamV0byBwYXJhIGFybWF6ZW5hciBhIGRpcmXDp8OjbyBkZSBvcmRlbmHDp8OjbyBkZSBjYWRhIGNvbHVuYVxyXG5cdHB1YmxpYyBzb3J0RGlyZWN0aW9uOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblxyXG5cdC8vIENvbHVuYSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRhIHBhcmEgb3JkZW5hw6fDo29cclxuXHRwdWJsaWMgY3VycmVudFNvcnRDb2x1bW46IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvLyBGdW7Dp8OjbyBjaGFtYWRhIHF1YW5kbyBvY29ycmUgdW1hIG11ZGFuw6dhIG5hIG9yZGVuYcOnw6NvXHJcblx0b25Tb3J0Q2hhbmdlKGV2ZW50OiB7IGRpcmVjdGlvbjogc3RyaW5nLCBjb2x1bW46IHN0cmluZyB9KSB7XHJcblx0XHRjb25zdCB7IGRpcmVjdGlvbiwgY29sdW1uIH0gPSBldmVudDtcclxuXHJcblx0XHQvLyBWZXJpZmljYSBzZSBhIGNvbHVuYSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRhIMOpIGEgbWVzbWEgZGEgbm92YSBzZWxlw6fDo29cclxuXHRcdGlmICh0aGlzLmN1cnJlbnRTb3J0Q29sdW1uID09PSBjb2x1bW4pIHtcclxuXHRcdFx0Ly8gQWx0ZXJuYSBlbnRyZSAnYXNjJyBlICdkZXNjJyBwYXJhIGEgZGlyZcOnw6NvIGRlIG9yZGVuYcOnw6NvIGRhIGNvbHVuYVxyXG5cdFx0XHR0aGlzLnNvcnREaXJlY3Rpb25bY29sdW1uXSA9IHRoaXMuc29ydERpcmVjdGlvbltjb2x1bW5dID09PSAnYXNjJyA/ICdhc2MnIDogJ2Rlc2MnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRGVmaW5lIGEgbm92YSBjb2x1bmEgZSBhIGRpcmXDp8OjbyBkZSBvcmRlbmHDp8OjbyBjb21vICdhc2MnXHJcblx0XHRcdHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPSBjb2x1bW47XHJcblx0XHRcdHRoaXMuc29ydERpcmVjdGlvbiA9IHsgW2NvbHVtbl06ICdhc2MnIH07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVhbGl6YSBhIG9yZGVuYcOnw6NvIGRvcyBkYWRvcyBkYSB0YWJlbGFcclxuXHRcdHRoaXMuc29ydERhdGEoKTtcclxuXHR9XHJcblxyXG5cdC8vIEZ1bsOnw6NvIGRlIG9yZGVuYcOnw6NvIGRvcyBkYWRvcyBkYSB0YWJlbGFcclxuXHRwcml2YXRlIHNvcnREYXRhKCkge1xyXG5cclxuXHRcdGlmICh0aGlzLnJlY29yZHNMaXN0KSB7XHJcblx0XHRcdGNvbnN0IGdydXBvc0xpc3QgPSB0aGlzLnJlY29yZHNMaXN0O1xyXG5cclxuXHRcdFx0Z3J1cG9zTGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gdGhpcy5jdXJyZW50U29ydENvbHVtbjtcclxuXHRcdFx0XHRjb25zdCBkaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb25bYXR0cmlidXRlXTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZVByb3BlcnRpZXMoYSwgYiwgYXR0cmlidXRlLCBkaXJlY3Rpb24pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gQ29tcGFyYSBvcyB2YWxvcmVzIGRhcyBwcm9wcmllZGFkZXMgZW50cmUgZG9pcyBvYmpldG9zXHJcblx0cHJpdmF0ZSBjb21wYXJlUHJvcGVydGllcyhhOiBhbnksIGI6IGFueSwgYXR0cmlidXRlOiBzdHJpbmcsIGRpcmVjdGlvbjogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IHByb3BlcnR5QSA9IHRoaXMuZ2V0UHJvcGVydHkoYSwgYXR0cmlidXRlKS50b1VwcGVyQ2FzZSgpO1xyXG5cdFx0Y29uc3QgcHJvcGVydHlCID0gdGhpcy5nZXRQcm9wZXJ0eShiLCBhdHRyaWJ1dGUpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG5cdFx0aWYgKHByb3BlcnR5QSA8IHByb3BlcnR5Qikge1xyXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAocHJvcGVydHlBID4gcHJvcGVydHlCKSB7XHJcblx0XHRcdHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAwO1xyXG5cdH1cclxuXHJcblx0Ly8gT2J0w6ltIG8gdmFsb3IgZGUgdW1hIHByb3ByaWVkYWRlIGVzcGVjw61maWNhIGRlIHVtIG9iamV0b1xyXG5cdHByaXZhdGUgZ2V0UHJvcGVydHkob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcclxuXHRcdFxyXG5cdFx0aWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwYXRoLnJlZHVjZSgodmFsdWUsIHByb3BlcnR5KSA9PiB2YWx1ZSA/IHZhbHVlW3Byb3BlcnR5XSA6ICcnLCBvYmopO1xyXG5cdH1cclxuXHQvLyNlbmRyZWdpb24gT3JkZXJpbmcsIFNvcnRpbmcgb3UgYXBlbmFzIE9yZGVuYcOnw6NvXHJcblxyXG4gIC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gVVRJTElUw4FSSU9TIDw9PT09PT09PT09XHJcblxyXG59XHJcbiIsIkBpZiAocmVjb3Jkc0xpc3QpIHtcclxuICAgPGRpdiBjbGFzcz1cInRhYmxlLWxpc3Qgdy0xMDAgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgPCEtLSBFeGliZSBvIG7Dum1lcm8gZGUgaXRlbnMgbW9zdHJhZG9zIGUgbyB0b3RhbCBkZSByZWdpc3Ryb3MgLS0+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50ZXJcIiBjbGFzcz1cIm1zLTFcIj4ge3sgaXRlbXNEaXNwbGF5VGV4dCB9fSA8L3NwYW4+XHJcbiAgICAgIFxyXG4gICAgICA8IS0tIENvbnRhaW5lciBkYSB0YWJlbGEgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1saXN0IG92ZXJmbG93LWhpZGRlbiBib3JkZXItYm90dG9tLTAgcm91bmRlZC1ib3R0b20gcm91bmRlZFwiPlxyXG4gICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciBib3JkZXIgbWItMFwiPlxyXG4gICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBJdGVyYSBzb2JyZSBhIGxpc3RhIGRlIGNhYmXDp2FsaG9zIHBhcmEgY3JpYXIgYXMgY29sdW5hcyAtLT5cclxuICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgaGVhZGVyc0xpc3RcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxpZ24tbWlkZGxlIHRleHQtZGFyay1ncmV5IHt7IGhlYWRlci5jb2wgPiAwID8gJ2NvbC0nK2hlYWRlci5jb2wgOiAnY29sJyB9fSB7eyBoZWFkZXIuY3VzdG9tQ2xhc3NlcyB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXIubmFtZSB9fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgPGFwcC1vcmRlcmluZyAqbmdJZj1cImhlYWRlci5vcmRlckNvbHVtblwiIFsoc29ydERpcmVjdGlvbildPVwic29ydERpcmVjdGlvbltoZWFkZXIub3JkZXJDb2x1bW5dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKHsgZGlyZWN0aW9uOiAkZXZlbnQuZGlyZWN0aW9uLCBjb2x1bW46IGhlYWRlci5vcmRlckNvbHVtbiB9KVwiPjwvYXBwLW9yZGVyaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiYmctbGlnaHQgZmFkZS1pbi1yb3dcIj5cclxuICAgICAgICAgICAgICAgQGlmIChyZWNvcmRzTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gQ29udGXDumRvIGRhcyBsaW5oYXMgZGEgdGFiZWxhIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbaW5uZXJSb3dzXVwiPjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gTWVuc2FnZW0gZGUgYXVzw6puY2lhIGRlIHJlZ2lzdHJvcyAtLT5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEyXCIgY2xhc3M9XCJhbGlnbi1taWRkbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1saWdodCBmc3QtaXRhbGljIHRleHQtY2VudGVyXCI+IHt7IGVtcHR5TGlzdE1lc3NhZ2UgPyBlbXB0eUxpc3RNZXNzYWdlIDogXCJDb25zdWx0YSBuw6NvIHJldG9ybm91IHJlZ2lzdHJvcy4uLlwiIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgICAgPCEtLSAjcmVnaW9uIFBBR0lOQcOHw4NPIC0tPlxyXG4gICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlUGFnaW5hdGlvbiAmJiByZWNvcmRzTGlzdC5sZW5ndGggPiAwXCIgY2xhc3M9XCJkLWZsZXggbXQtMlwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgJ2p1c3RpZnktY29udGVudC1zdGFydCc6IHBhZ2luYXRpb25QbGFjZW1lbnQgPT0gJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgJ2p1c3RpZnktY29udGVudC1jZW50ZXInOiBwYWdpbmF0aW9uUGxhY2VtZW50ID09ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAnanVzdGlmeS1jb250ZW50LWVuZCc6IHBhZ2luYXRpb25QbGFjZW1lbnQgPT0gJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2Vlbic6IHBhZ2luYXRpb25QbGFjZW1lbnQgPT0gJ2JldHdlZW4nXHJcbiAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWUtMlwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIj4gSXRlbnMgcG9yIHDDoWdpbmEgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHNlbGVjdC1zZWFyY2hcIiAoY2hhbmdlKT1cIm9uU2VsZWN0Q2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY291bnQgb2YgY291bnRPcHRpb25zOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cImNvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImNvdW50T3B0aW9ucy5sZW5ndGggPiAwICYmIGkgPT0gMFwiPnt7IGNvdW50IH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ29udHJvbGUgZGUgcGFnaW5hw6fDo28gLS0+XHJcbiAgICAgICAgICAgIDxwYWdpbmF0aW9uLWNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJwYWdpbmF0aW9uSURcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cInNwLXBhZ2luYXRpb24gbXQtM1wiXHJcbiAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cInBhZ2UgPSAkZXZlbnQ7IHBhZ2VDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgcHJldmlvdXNMYWJlbD1cIsKrJm5ic3A7Jm5ic3A7Jm5ic3A7XCIgbmV4dExhYmVsPVwiJm5ic3A7Jm5ic3A7Jm5ic3A7wrtcIlxyXG4gICAgICAgICAgICAgICBbbWF4U2l6ZV09XCI1XCI+XHJcbiAgICAgICAgICAgIDwvcGFnaW5hdGlvbi1jb250cm9scz5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwhLS0gI2VuZHJlZ2lvbiBQQUdJTkHDh8ODTyAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgIDwvZGl2PlxyXG59IEBlbHNlIHtcclxuICAgPCEtLSBMb2FkZXIgZW5xdWFudG8gb3MgcmVnaXN0cm9zIHPDo28gY2FycmVnYWRvcyAtLT5cclxuICAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj4gPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5DYXJyZWdhbmRvIGluZm9ybWHDp8O1ZXMuLi48L3NwYW4+IDwvZGl2PlxyXG4gICA8L2Rpdj5cclxufVxyXG4iXX0=
|
|
@@ -3086,20 +3086,35 @@ class TableComponent {
|
|
|
3086
3086
|
/** Lista de registros a serem exibidos na tabela.
|
|
3087
3087
|
* @required */
|
|
3088
3088
|
get recordsList() { return this._recordsList; }
|
|
3089
|
-
set recordsList(value) {
|
|
3090
|
-
this._recordsList = value;
|
|
3091
|
-
console.log("Lista: ", this._recordsList);
|
|
3092
|
-
}
|
|
3089
|
+
set recordsList(value) { this._recordsList = value; }
|
|
3093
3090
|
/** Informa um ID para a paginação da tabela específica. Deve ser utilizada em caso de múltiplas tabelas na mesma tela. */
|
|
3094
3091
|
get paginationID() { return this._paginationID; }
|
|
3095
3092
|
set paginationID(value) {
|
|
3096
3093
|
this._paginationID = value || 'libTablePagination';
|
|
3097
3094
|
}
|
|
3095
|
+
/** Página atual da tabela. */
|
|
3096
|
+
get page() { return this._currentPage; }
|
|
3097
|
+
set page(value) { this._currentPage = value; }
|
|
3098
|
+
/** Número de itens a serem exibidos por página. */
|
|
3099
|
+
get itemsPerPage() { return this._currentItemsPerPage; }
|
|
3100
|
+
set itemsPerPage(value) { this._currentItemsPerPage = value; }
|
|
3101
|
+
get firstItemOfPage() {
|
|
3102
|
+
return (this.page - 1) * this.itemsPerPage + 1;
|
|
3103
|
+
}
|
|
3104
|
+
get lastItemOfPage() {
|
|
3105
|
+
return Math.min(this.page * this.itemsPerPage, this.recordsList?.length ?? 0);
|
|
3106
|
+
}
|
|
3107
|
+
// Exemplo de string com a contagem:
|
|
3108
|
+
get itemsDisplayText() {
|
|
3109
|
+
return `Exibindo ${this.countOptions ? this.firstItemOfPage + "-" + this.lastItemOfPage + " de" : ""} ${this.recordsList?.length ?? 0} registros`;
|
|
3110
|
+
}
|
|
3098
3111
|
// #endregion PUBLIC
|
|
3099
3112
|
// #endregion ==========> PROPRIEDADES <==========
|
|
3100
3113
|
// #region ==========> INICIALIZAÇÃO <==========
|
|
3101
3114
|
constructor(cdr) {
|
|
3102
3115
|
this.cdr = cdr;
|
|
3116
|
+
this._currentPage = 1;
|
|
3117
|
+
this._currentItemsPerPage = 0;
|
|
3103
3118
|
// #endregion PRIVATE
|
|
3104
3119
|
// #region PUBLIC
|
|
3105
3120
|
/** Determina se a tabela deve usar paginação.
|
|
@@ -3116,10 +3131,6 @@ class TableComponent {
|
|
|
3116
3131
|
this.itemsPerPageChange = new EventEmitter();
|
|
3117
3132
|
/** Evento emitido quando a página é alterada. */
|
|
3118
3133
|
this.pageChange = new EventEmitter();
|
|
3119
|
-
/** Contador de registros (pode ser usado para futuras implementações de lógica interna). */
|
|
3120
|
-
this.counter = 0;
|
|
3121
|
-
/** Página atual da tabela. */
|
|
3122
|
-
this.page = 1;
|
|
3123
3134
|
//#region Ordering, Sorting ou apenas Ordenação
|
|
3124
3135
|
/** Método que faz a ordenação dos contratos na tela de listagem, em cada uma das células do cabeçalho da tabela, onde cada um
|
|
3125
3136
|
* dos elementos <th> representa uma coluna, de acordo com a lista de contratos que retorna do backend. */
|
|
@@ -3215,11 +3226,11 @@ class TableComponent {
|
|
|
3215
3226
|
return path.reduce((value, property) => value ? value[property] : '', obj);
|
|
3216
3227
|
}
|
|
3217
3228
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3218
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableComponent, selector: "lib-table", inputs: { usePagination: "usePagination", recordsList: ["list", "recordsList"], countOptions: ["counts", "countOptions"], paginationPlacement: ["placement", "paginationPlacement"], headersList: ["headers", "headersList"], emptyListMessage: "emptyListMessage", showCounter: "showCounter", paginationID: "paginationID" }, outputs: { itemsPerPageChange: "itemsPerPageChange", pageChange: "pageChange" }, usesOnChanges: true, ngImport: i0, template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\">
|
|
3229
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableComponent, selector: "lib-table", inputs: { usePagination: "usePagination", recordsList: ["list", "recordsList"], countOptions: ["counts", "countOptions"], paginationPlacement: ["placement", "paginationPlacement"], headersList: ["headers", "headersList"], emptyListMessage: "emptyListMessage", showCounter: "showCounter", paginationID: "paginationID" }, outputs: { itemsPerPageChange: "itemsPerPageChange", pageChange: "pageChange" }, usesOnChanges: true, ngImport: i0, template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\"> {{ itemsDisplayText }} </span>\r\n \r\n <!-- Container da tabela -->\r\n <div class=\"table-list overflow-hidden border-bottom-0 rounded-bottom rounded\">\r\n <table class=\"table table-hover border mb-0\">\r\n <thead>\r\n <tr>\r\n <!-- Itera sobre a lista de cabe\u00E7alhos para criar as colunas -->\r\n <th *ngFor=\"let header of headersList\" scope=\"col\"\r\n class=\"align-middle text-dark-grey {{ header.col > 0 ? 'col-'+header.col : 'col' }} {{ header.customClasses }}\">\r\n {{ header.name }}\r\n\r\n <app-ordering *ngIf=\"header.orderColumn\" [(sortDirection)]=\"sortDirection[header.orderColumn]\"\r\n (sortChange)=\"onSortChange({ direction: $event.direction, column: header.orderColumn })\"></app-ordering>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody class=\"bg-light fade-in-row\">\r\n @if (recordsList.length > 0) {\r\n <!-- Conte\u00FAdo das linhas da tabela -->\r\n <ng-content select=\"[innerRows]\"></ng-content>\r\n }\r\n @else {\r\n <!-- Mensagem de aus\u00EAncia de registros -->\r\n <tr>\r\n <td colspan=\"12\" class=\"align-middle\">\r\n <span class=\"fw-light fst-italic text-center\"> {{ emptyListMessage ? emptyListMessage : \"Consulta n\u00E3o retornou registros...\" }} </span>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- #region PAGINA\u00C7\u00C3O -->\r\n <div *ngIf=\"usePagination && recordsList.length > 0\" class=\"d-flex mt-2\"\r\n [ngClass]=\"{\r\n 'justify-content-start': paginationPlacement == 'start',\r\n 'justify-content-center': paginationPlacement == 'center',\r\n 'justify-content-end': paginationPlacement == 'end',\r\n 'justify-content-between': paginationPlacement == 'between'\r\n }\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2\" style=\"white-space: nowrap;\"> Itens por p\u00E1gina </label>\r\n <select class=\"form-select select-search\" (change)=\"onSelectChange($event)\">\r\n <option *ngFor=\"let count of countOptions; let i = index\" [value]=\"count\"\r\n [selected]=\"countOptions.length > 0 && i == 0\">{{ count }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Controle de pagina\u00E7\u00E3o -->\r\n <pagination-controls\r\n [id]=\"paginationID\"\r\n class=\"sp-pagination mt-3\"\r\n (pageChange)=\"page = $event; pageChange.emit($event)\"\r\n previousLabel=\"\u00AB \" nextLabel=\" \u00BB\"\r\n [maxSize]=\"5\">\r\n </pagination-controls>\r\n </div>\r\n <!-- #endregion PAGINA\u00C7\u00C3O -->\r\n </div>\r\n </div>\r\n} @else {\r\n <!-- Loader enquanto os registros s\u00E3o carregados -->\r\n <div class=\"w-100 text-center\">\r\n <div class=\"spinner-border\" role=\"status\"> <span class=\"visually-hidden\">Carregando informa\u00E7\u00F5es...</span> </div>\r\n </div>\r\n}\r\n", styles: [".sp-pagination ::ng-deep .ngx-pagination .current{background:#3767b2;border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination a:hover,.sp-pagination ::ng-deep .ngx-pagination button:hover{border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-previous a:before,.sp-pagination ::ng-deep .ngx-pagination .pagination-previous.disabled:before{content:\"\";display:inline-block;margin-right:.5rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-next a:after,.sp-pagination ::ng-deep .ngx-pagination .pagination-next.disabled:after{content:\"\";display:inline-block;margin-left:.5rem}.text-dark-grey{color:#63676b!important}table{border-color:#c4c4c4}table thead{height:50px;font-size:1rem;background-color:#f9fafb!important}table thead>tr{background-color:#f9fafb!important}table thead>tr>th{background-color:#f9fafb!important}table tbody{font-size:.875rem}table tbody>tr{height:50px}table tbody>tr:hover{background-color:#cce5ff}table.table>tbody{border-top:none}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i3.PaginationControlsComponent, selector: "pagination-controls", inputs: ["id", "maxSize", "directionLinks", "autoHide", "responsive", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel"], outputs: ["pageChange", "pageBoundsCorrection"] }, { kind: "component", type: OrderingComponent, selector: "app-ordering", inputs: ["isColumnClicked", "sortDirection", "sortAttributes"], outputs: ["sortDirectionChange", "sortChange"] }] }); }
|
|
3219
3230
|
}
|
|
3220
3231
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, decorators: [{
|
|
3221
3232
|
type: Component,
|
|
3222
|
-
args: [{ selector: 'lib-table', template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\">
|
|
3233
|
+
args: [{ selector: 'lib-table', template: "@if (recordsList) {\r\n <div class=\"table-list w-100 position-relative\">\r\n <!-- Exibe o n\u00FAmero de itens mostrados e o total de registros -->\r\n <span *ngIf=\"showCounter\" class=\"ms-1\"> {{ itemsDisplayText }} </span>\r\n \r\n <!-- Container da tabela -->\r\n <div class=\"table-list overflow-hidden border-bottom-0 rounded-bottom rounded\">\r\n <table class=\"table table-hover border mb-0\">\r\n <thead>\r\n <tr>\r\n <!-- Itera sobre a lista de cabe\u00E7alhos para criar as colunas -->\r\n <th *ngFor=\"let header of headersList\" scope=\"col\"\r\n class=\"align-middle text-dark-grey {{ header.col > 0 ? 'col-'+header.col : 'col' }} {{ header.customClasses }}\">\r\n {{ header.name }}\r\n\r\n <app-ordering *ngIf=\"header.orderColumn\" [(sortDirection)]=\"sortDirection[header.orderColumn]\"\r\n (sortChange)=\"onSortChange({ direction: $event.direction, column: header.orderColumn })\"></app-ordering>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody class=\"bg-light fade-in-row\">\r\n @if (recordsList.length > 0) {\r\n <!-- Conte\u00FAdo das linhas da tabela -->\r\n <ng-content select=\"[innerRows]\"></ng-content>\r\n }\r\n @else {\r\n <!-- Mensagem de aus\u00EAncia de registros -->\r\n <tr>\r\n <td colspan=\"12\" class=\"align-middle\">\r\n <span class=\"fw-light fst-italic text-center\"> {{ emptyListMessage ? emptyListMessage : \"Consulta n\u00E3o retornou registros...\" }} </span>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- #region PAGINA\u00C7\u00C3O -->\r\n <div *ngIf=\"usePagination && recordsList.length > 0\" class=\"d-flex mt-2\"\r\n [ngClass]=\"{\r\n 'justify-content-start': paginationPlacement == 'start',\r\n 'justify-content-center': paginationPlacement == 'center',\r\n 'justify-content-end': paginationPlacement == 'end',\r\n 'justify-content-between': paginationPlacement == 'between'\r\n }\">\r\n <div class=\"d-flex align-items-center\">\r\n <label class=\"me-2\" style=\"white-space: nowrap;\"> Itens por p\u00E1gina </label>\r\n <select class=\"form-select select-search\" (change)=\"onSelectChange($event)\">\r\n <option *ngFor=\"let count of countOptions; let i = index\" [value]=\"count\"\r\n [selected]=\"countOptions.length > 0 && i == 0\">{{ count }}</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Controle de pagina\u00E7\u00E3o -->\r\n <pagination-controls\r\n [id]=\"paginationID\"\r\n class=\"sp-pagination mt-3\"\r\n (pageChange)=\"page = $event; pageChange.emit($event)\"\r\n previousLabel=\"\u00AB \" nextLabel=\" \u00BB\"\r\n [maxSize]=\"5\">\r\n </pagination-controls>\r\n </div>\r\n <!-- #endregion PAGINA\u00C7\u00C3O -->\r\n </div>\r\n </div>\r\n} @else {\r\n <!-- Loader enquanto os registros s\u00E3o carregados -->\r\n <div class=\"w-100 text-center\">\r\n <div class=\"spinner-border\" role=\"status\"> <span class=\"visually-hidden\">Carregando informa\u00E7\u00F5es...</span> </div>\r\n </div>\r\n}\r\n", styles: [".sp-pagination ::ng-deep .ngx-pagination .current{background:#3767b2;border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination a:hover,.sp-pagination ::ng-deep .ngx-pagination button:hover{border-radius:.375rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-previous a:before,.sp-pagination ::ng-deep .ngx-pagination .pagination-previous.disabled:before{content:\"\";display:inline-block;margin-right:.5rem}.sp-pagination ::ng-deep .ngx-pagination .pagination-next a:after,.sp-pagination ::ng-deep .ngx-pagination .pagination-next.disabled:after{content:\"\";display:inline-block;margin-left:.5rem}.text-dark-grey{color:#63676b!important}table{border-color:#c4c4c4}table thead{height:50px;font-size:1rem;background-color:#f9fafb!important}table thead>tr{background-color:#f9fafb!important}table thead>tr>th{background-color:#f9fafb!important}table tbody{font-size:.875rem}table tbody>tr{height:50px}table tbody>tr:hover{background-color:#cce5ff}table.table>tbody{border-top:none}\n"] }]
|
|
3223
3234
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { usePagination: [{
|
|
3224
3235
|
type: Input
|
|
3225
3236
|
}], recordsList: [{
|