ng-firebase-table-kxp 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{fesm2020 → fesm2022}/ng-firebase-table-kxp.mjs +2762 -2744
- package/fesm2022/ng-firebase-table-kxp.mjs.map +1 -0
- package/index.d.ts +665 -5
- package/package.json +3 -11
- package/esm2020/lib/components/table/table.component.mjs +0 -710
- package/esm2020/lib/components/table-tabs/table-tabs.component.mjs +0 -73
- package/esm2020/lib/components/table-tooltip/table-tooltip.component.mjs +0 -34
- package/esm2020/lib/ng-firebase-table-kxp.component.mjs +0 -11
- package/esm2020/lib/ng-firebase-table-kxp.module.mjs +0 -98
- package/esm2020/lib/ng-firebase-table-kxp.service.mjs +0 -14
- package/esm2020/lib/services/filter.service.mjs +0 -416
- package/esm2020/lib/services/pagination.service.mjs +0 -115
- package/esm2020/lib/services/table.service.mjs +0 -1140
- package/esm2020/lib/services/tooltip.service.mjs +0 -141
- package/esm2020/lib/types/Table.mjs +0 -9
- package/esm2020/lib/utils/table.utils.mjs +0 -75
- package/esm2020/ng-firebase-table-kxp.mjs +0 -5
- package/esm2020/public-api.mjs +0 -22
- package/fesm2015/ng-firebase-table-kxp.mjs +0 -2869
- package/fesm2015/ng-firebase-table-kxp.mjs.map +0 -1
- package/fesm2020/ng-firebase-table-kxp.mjs.map +0 -1
- package/lib/components/table/table.component.d.ts +0 -132
- package/lib/components/table/table.component.d.ts.map +0 -1
- package/lib/components/table-tabs/table-tabs.component.d.ts +0 -34
- package/lib/components/table-tabs/table-tabs.component.d.ts.map +0 -1
- package/lib/components/table-tooltip/table-tooltip.component.d.ts +0 -18
- package/lib/components/table-tooltip/table-tooltip.component.d.ts.map +0 -1
- package/lib/ng-firebase-table-kxp.component.d.ts +0 -5
- package/lib/ng-firebase-table-kxp.component.d.ts.map +0 -1
- package/lib/ng-firebase-table-kxp.module.d.ts +0 -23
- package/lib/ng-firebase-table-kxp.module.d.ts.map +0 -1
- package/lib/ng-firebase-table-kxp.service.d.ts +0 -6
- package/lib/ng-firebase-table-kxp.service.d.ts.map +0 -1
- package/lib/services/filter.service.d.ts +0 -88
- package/lib/services/filter.service.d.ts.map +0 -1
- package/lib/services/pagination.service.d.ts +0 -34
- package/lib/services/pagination.service.d.ts.map +0 -1
- package/lib/services/table.service.d.ts +0 -80
- package/lib/services/table.service.d.ts.map +0 -1
- package/lib/services/tooltip.service.d.ts +0 -73
- package/lib/services/tooltip.service.d.ts.map +0 -1
- package/lib/types/Table.d.ts +0 -162
- package/lib/types/Table.d.ts.map +0 -1
- package/lib/utils/table.utils.d.ts +0 -25
- package/lib/utils/table.utils.d.ts.map +0 -1
- package/ng-firebase-table-kxp.d.ts.map +0 -1
- package/public-api.d.ts +0 -12
- package/public-api.d.ts.map +0 -1
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./table.service";
|
|
5
|
-
export class FilterService {
|
|
6
|
-
constructor(tableService) {
|
|
7
|
-
this.tableService = tableService;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Cria um novo FormGroup para um filtro
|
|
11
|
-
*/
|
|
12
|
-
createFilterGroup() {
|
|
13
|
-
const dateValidator = this.tableService.dateFormatValidator();
|
|
14
|
-
return new FormGroup({
|
|
15
|
-
selectFilter: new FormControl(''),
|
|
16
|
-
typeFilter: new FormControl(''),
|
|
17
|
-
selectItem: new FormControl(''),
|
|
18
|
-
initialDate: new FormControl('', [dateValidator]),
|
|
19
|
-
finalDate: new FormControl('', [dateValidator]),
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Adiciona um novo filtro ao FormArray
|
|
24
|
-
*/
|
|
25
|
-
addFilter(filtersForm, isPaginated, filterData) {
|
|
26
|
-
if (isPaginated &&
|
|
27
|
-
this.hasActiveDateFilter(filtersForm) &&
|
|
28
|
-
filterData?.selectFilter?.arrange === 'filterByDate') {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const newFilterGroup = this.createFilterGroup();
|
|
32
|
-
if (filterData) {
|
|
33
|
-
if (filterData.selectFilter) {
|
|
34
|
-
newFilterGroup.get('selectFilter')?.setValue(filterData.selectFilter);
|
|
35
|
-
}
|
|
36
|
-
if (filterData.typeFilter) {
|
|
37
|
-
newFilterGroup.get('typeFilter')?.setValue(filterData.typeFilter);
|
|
38
|
-
}
|
|
39
|
-
if (filterData.selectItem) {
|
|
40
|
-
newFilterGroup.get('selectItem')?.setValue(filterData.selectItem);
|
|
41
|
-
}
|
|
42
|
-
if (filterData.initialDate) {
|
|
43
|
-
newFilterGroup.get('initialDate')?.setValue(filterData.initialDate);
|
|
44
|
-
}
|
|
45
|
-
if (filterData.finalDate) {
|
|
46
|
-
newFilterGroup.get('finalDate')?.setValue(filterData.finalDate);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
filtersForm.push(newFilterGroup);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Verifica se há um filtro de data ativo
|
|
53
|
-
*/
|
|
54
|
-
hasActiveDateFilter(filtersForm) {
|
|
55
|
-
return filtersForm.controls.some((control) => {
|
|
56
|
-
const group = control;
|
|
57
|
-
const selectedFilter = group.get('selectFilter')?.value;
|
|
58
|
-
return selectedFilter?.arrange === 'filterByDate';
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Retorna as opções de filtro disponíveis
|
|
63
|
-
*/
|
|
64
|
-
getAvailableFilterOptions(dropdownItems, isPaginated, filtersForm) {
|
|
65
|
-
if (isPaginated && this.hasActiveDateFilter(filtersForm)) {
|
|
66
|
-
return dropdownItems.filter((item) => item.arrange !== 'filterByDate');
|
|
67
|
-
}
|
|
68
|
-
return dropdownItems;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Remove um filtro do FormArray
|
|
72
|
-
*/
|
|
73
|
-
removeFilter(filtersForm, index) {
|
|
74
|
-
filtersForm.removeAt(index);
|
|
75
|
-
if (filtersForm.length === 0) {
|
|
76
|
-
this.addFilter(filtersForm, false);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Remove todos os filtros do FormArray
|
|
81
|
-
*/
|
|
82
|
-
removeAllFilters(filtersForm) {
|
|
83
|
-
filtersForm.clear();
|
|
84
|
-
this.addFilter(filtersForm, false);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Aplica máscara de data (DD/MM/AAAA)
|
|
88
|
-
*/
|
|
89
|
-
applyDateMask(event, controlName, filterGroup) {
|
|
90
|
-
const input = event.target;
|
|
91
|
-
let value = input.value.replace(/\D/g, '');
|
|
92
|
-
if (value.length > 8) {
|
|
93
|
-
value = value.slice(0, 8);
|
|
94
|
-
}
|
|
95
|
-
if (value.length <= 2) {
|
|
96
|
-
// mantém como está
|
|
97
|
-
}
|
|
98
|
-
else if (value.length <= 4) {
|
|
99
|
-
value = value.slice(0, 2) + '/' + value.slice(2);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
value =
|
|
103
|
-
value.slice(0, 2) + '/' + value.slice(2, 4) + '/' + value.slice(4, 8);
|
|
104
|
-
}
|
|
105
|
-
filterGroup.get(controlName)?.setValue(value, { emitEvent: false });
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Aplica filtros client-side aos itens
|
|
109
|
-
*/
|
|
110
|
-
applyClientSideFilters(items, filtersForm, sortBy) {
|
|
111
|
-
let filteredItems = [...items];
|
|
112
|
-
const dateFiltersByProperty = {};
|
|
113
|
-
const otherFilters = [];
|
|
114
|
-
filtersForm.controls.forEach((control) => {
|
|
115
|
-
const group = control;
|
|
116
|
-
const selectedFilter = group.get('selectFilter')?.value;
|
|
117
|
-
if (!selectedFilter)
|
|
118
|
-
return;
|
|
119
|
-
const arrange = selectedFilter.arrange;
|
|
120
|
-
if (arrange === 'filterByDate') {
|
|
121
|
-
const initial = group.get('initialDate')?.value;
|
|
122
|
-
const final = group.get('finalDate')?.value;
|
|
123
|
-
if (initial && final && initial.trim() && final.trim()) {
|
|
124
|
-
try {
|
|
125
|
-
const datePattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
|
|
126
|
-
if (!datePattern.test(initial) || !datePattern.test(final)) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const [dayI, monthI, yearI] = initial.split('/');
|
|
130
|
-
const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
|
|
131
|
-
const [dayF, monthF, yearF] = final.split('/');
|
|
132
|
-
const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
|
|
133
|
-
finalDate.setHours(23, 59, 59);
|
|
134
|
-
if (isNaN(initialDate.getTime()) || isNaN(finalDate.getTime())) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const dateField = selectedFilter.property || sortBy.field;
|
|
138
|
-
if (!dateFiltersByProperty[dateField]) {
|
|
139
|
-
dateFiltersByProperty[dateField] = [];
|
|
140
|
-
}
|
|
141
|
-
dateFiltersByProperty[dateField].push({
|
|
142
|
-
initial: initialDate,
|
|
143
|
-
final: finalDate,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
console.warn('Erro ao processar datas do filtro:', error);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
otherFilters.push({ group, selectedFilter, arrange });
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
// Aplicar filtros de data
|
|
156
|
-
Object.keys(dateFiltersByProperty).forEach((dateField) => {
|
|
157
|
-
const intervals = dateFiltersByProperty[dateField];
|
|
158
|
-
filteredItems = filteredItems.filter((item) => {
|
|
159
|
-
try {
|
|
160
|
-
const fieldValue = item[dateField];
|
|
161
|
-
if (!fieldValue) {
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
let itemDate;
|
|
165
|
-
if (typeof fieldValue.toDate === 'function') {
|
|
166
|
-
itemDate = fieldValue.toDate();
|
|
167
|
-
}
|
|
168
|
-
else if (fieldValue instanceof Date) {
|
|
169
|
-
itemDate = fieldValue;
|
|
170
|
-
}
|
|
171
|
-
else if (typeof fieldValue === 'string') {
|
|
172
|
-
itemDate = new Date(fieldValue);
|
|
173
|
-
if (isNaN(itemDate.getTime())) {
|
|
174
|
-
return false;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else if (typeof fieldValue === 'number') {
|
|
178
|
-
itemDate = new Date(fieldValue);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
return intervals.some((interval) => itemDate >= interval.initial && itemDate <= interval.final);
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
console.warn('Erro ao processar filtro de data para o item:', item.id, error);
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
// Aplicar outros filtros
|
|
192
|
-
otherFilters.forEach(({ group, selectedFilter, arrange }) => {
|
|
193
|
-
if (arrange === 'filter') {
|
|
194
|
-
const filterValue = group.get('typeFilter')?.value;
|
|
195
|
-
if (filterValue && filterValue.trim()) {
|
|
196
|
-
const property = selectedFilter.property;
|
|
197
|
-
filteredItems = filteredItems.filter((item) => {
|
|
198
|
-
const value = String(item[property] || '')
|
|
199
|
-
.trim()
|
|
200
|
-
.toLocaleLowerCase();
|
|
201
|
-
return value.includes(filterValue.trim().toLocaleLowerCase());
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
else if (selectedFilter.hasOwnProperty('items') &&
|
|
206
|
-
arrange === 'equals') {
|
|
207
|
-
const selectedItems = group.get('selectItem')?.value;
|
|
208
|
-
if (Array.isArray(selectedItems) && selectedItems.length > 0) {
|
|
209
|
-
filteredItems = filteredItems.filter((item) => {
|
|
210
|
-
return selectedItems.some((selectedItem) => {
|
|
211
|
-
const itemValue = item[selectedItem.property];
|
|
212
|
-
return itemValue === selectedItem.value;
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
return filteredItems;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Constrói o objeto Arrange a partir dos filtros ativos
|
|
222
|
-
*/
|
|
223
|
-
buildArrangeFromFilters(filtersForm, sortBy) {
|
|
224
|
-
const activeFilters = filtersForm.controls
|
|
225
|
-
.flatMap((control) => {
|
|
226
|
-
const group = control;
|
|
227
|
-
const selectedFilter = group.get('selectFilter')?.value;
|
|
228
|
-
if (!selectedFilter)
|
|
229
|
-
return [];
|
|
230
|
-
const arrange = selectedFilter.arrange;
|
|
231
|
-
if (arrange === 'filter') {
|
|
232
|
-
const filterValue = group.get('typeFilter')?.value;
|
|
233
|
-
if (!filterValue)
|
|
234
|
-
return [];
|
|
235
|
-
return {
|
|
236
|
-
arrange,
|
|
237
|
-
filter: {
|
|
238
|
-
property: selectedFilter.property,
|
|
239
|
-
filtering: filterValue,
|
|
240
|
-
},
|
|
241
|
-
dateFilter: undefined,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
if (arrange === 'filterByDate') {
|
|
245
|
-
const initial = group.get('initialDate')?.value;
|
|
246
|
-
const final = group.get('finalDate')?.value;
|
|
247
|
-
if (initial && final) {
|
|
248
|
-
try {
|
|
249
|
-
const [dayI, monthI, yearI] = initial.split('/');
|
|
250
|
-
const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
|
|
251
|
-
const [dayF, monthF, yearF] = final.split('/');
|
|
252
|
-
const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
|
|
253
|
-
finalDate.setHours(23, 59, 59);
|
|
254
|
-
return {
|
|
255
|
-
arrange,
|
|
256
|
-
filter: undefined,
|
|
257
|
-
dateFilter: {
|
|
258
|
-
initial: initialDate,
|
|
259
|
-
final: finalDate,
|
|
260
|
-
},
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
return [];
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
return [];
|
|
268
|
-
}
|
|
269
|
-
if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {
|
|
270
|
-
const selectedItems = group.get('selectItem')?.value;
|
|
271
|
-
if (Array.isArray(selectedItems) && selectedItems.length > 0) {
|
|
272
|
-
return selectedItems.map((item) => ({
|
|
273
|
-
arrange,
|
|
274
|
-
filter: {
|
|
275
|
-
property: item.property,
|
|
276
|
-
filtering: item.value,
|
|
277
|
-
},
|
|
278
|
-
dateFilter: undefined,
|
|
279
|
-
}));
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return [];
|
|
283
|
-
})
|
|
284
|
-
.filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));
|
|
285
|
-
return {
|
|
286
|
-
filters: activeFilters,
|
|
287
|
-
sortBy: sortBy,
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Extrai filtros ativos para paginação
|
|
292
|
-
*/
|
|
293
|
-
extractActiveFilters(filtersForm) {
|
|
294
|
-
return filtersForm.controls
|
|
295
|
-
.flatMap((control) => {
|
|
296
|
-
const group = control;
|
|
297
|
-
const selectedFilter = group.get('selectFilter')?.value;
|
|
298
|
-
if (!selectedFilter)
|
|
299
|
-
return [];
|
|
300
|
-
const arrange = selectedFilter.arrange;
|
|
301
|
-
if (arrange === 'filter') {
|
|
302
|
-
const filterValue = group.get('typeFilter')?.value;
|
|
303
|
-
if (!filterValue)
|
|
304
|
-
return [];
|
|
305
|
-
return {
|
|
306
|
-
arrange,
|
|
307
|
-
filter: {
|
|
308
|
-
property: selectedFilter.property,
|
|
309
|
-
filtering: filterValue,
|
|
310
|
-
},
|
|
311
|
-
dateFilter: undefined,
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
if (arrange === 'filterByDate') {
|
|
315
|
-
const initial = group.get('initialDate')?.value;
|
|
316
|
-
const final = group.get('finalDate')?.value;
|
|
317
|
-
if (initial && final) {
|
|
318
|
-
const [dayI, monthI, yearI] = initial.split('/');
|
|
319
|
-
const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);
|
|
320
|
-
const [dayF, monthF, yearF] = final.split('/');
|
|
321
|
-
const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);
|
|
322
|
-
finalDate.setHours(23, 59, 59);
|
|
323
|
-
return {
|
|
324
|
-
arrange,
|
|
325
|
-
filter: undefined,
|
|
326
|
-
dateFilter: {
|
|
327
|
-
initial: initialDate,
|
|
328
|
-
final: finalDate,
|
|
329
|
-
},
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
return [];
|
|
333
|
-
}
|
|
334
|
-
if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {
|
|
335
|
-
const selectedItems = group.get('selectItem')?.value;
|
|
336
|
-
if (Array.isArray(selectedItems) && selectedItems.length > 0) {
|
|
337
|
-
return selectedItems.map((item) => ({
|
|
338
|
-
arrange,
|
|
339
|
-
filter: {
|
|
340
|
-
property: item.property,
|
|
341
|
-
filtering: item.value,
|
|
342
|
-
},
|
|
343
|
-
dateFilter: undefined,
|
|
344
|
-
}));
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return [];
|
|
348
|
-
})
|
|
349
|
-
.filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* Inicializa os dropdownItems baseado nas colunas
|
|
353
|
-
*/
|
|
354
|
-
initializeDropdownItems(displayedColumns) {
|
|
355
|
-
const dropdownItems = [];
|
|
356
|
-
const sortableDropdownItems = [];
|
|
357
|
-
let hasFilterableColumn = false;
|
|
358
|
-
let hasSortableColumn = false;
|
|
359
|
-
displayedColumns.forEach((col) => {
|
|
360
|
-
if (col.isFilterable) {
|
|
361
|
-
hasFilterableColumn = true;
|
|
362
|
-
dropdownItems.push({
|
|
363
|
-
...col,
|
|
364
|
-
arrange: 'filter',
|
|
365
|
-
title: col.title,
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
if (col.isSortable) {
|
|
369
|
-
hasSortableColumn = true;
|
|
370
|
-
sortableDropdownItems.push({
|
|
371
|
-
...col,
|
|
372
|
-
arrange: 'ascending',
|
|
373
|
-
title: col.title + ': crescente',
|
|
374
|
-
});
|
|
375
|
-
sortableDropdownItems.push({
|
|
376
|
-
...col,
|
|
377
|
-
arrange: 'descending',
|
|
378
|
-
title: col.title + ': decrescente',
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
if (col.isFilterableByDate) {
|
|
382
|
-
dropdownItems.push({
|
|
383
|
-
...col,
|
|
384
|
-
arrange: 'filterByDate',
|
|
385
|
-
title: col.title + ': filtro por data',
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
return {
|
|
390
|
-
dropdownItems,
|
|
391
|
-
sortableDropdownItems,
|
|
392
|
-
hasFilterableColumn,
|
|
393
|
-
hasSortableColumn,
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Adiciona opções de filtro customizadas
|
|
398
|
-
*/
|
|
399
|
-
addFilterableOptions(dropdownItems, filterableOptions) {
|
|
400
|
-
if (filterableOptions &&
|
|
401
|
-
Array.isArray(filterableOptions) &&
|
|
402
|
-
filterableOptions.length > 0) {
|
|
403
|
-
filterableOptions.forEach((option) => dropdownItems.push({ ...option, arrange: 'equals' }));
|
|
404
|
-
}
|
|
405
|
-
return dropdownItems;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
FilterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, deps: [{ token: i1.TableService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
409
|
-
FilterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, providedIn: 'root' });
|
|
410
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterService, decorators: [{
|
|
411
|
-
type: Injectable,
|
|
412
|
-
args: [{
|
|
413
|
-
providedIn: 'root',
|
|
414
|
-
}]
|
|
415
|
-
}], ctorParameters: function () { return [{ type: i1.TableService }]; } });
|
|
416
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9zZXJ2aWNlcy9maWx0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQTBCbkUsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFBb0IsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFBRyxDQUFDO0lBRWxEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTlELE9BQU8sSUFBSSxTQUFTLENBQUM7WUFDbkIsWUFBWSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLFVBQVUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pELFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQ1AsV0FBc0IsRUFDdEIsV0FBb0IsRUFDcEIsVUFBeUI7UUFFekIsSUFDRSxXQUFXO1lBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztZQUNyQyxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sS0FBSyxjQUFjLEVBQ3BEO1lBQ0EsT0FBTztTQUNSO1FBRUQs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QUssRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLGVBQWU7aUJBQ25DLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxHQUFHLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzFCLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLEdBQUcsR0FBRztvQkFDTixPQUFPLEVBQUUsY0FBYztvQkFDdkIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CO2lCQUN2QyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLGFBQWE7WUFDYixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLGlCQUFpQjtTQUNsQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CLENBQUMsYUFBb0IsRUFBRSxpQkFBd0I7UUFDakUsSUFDRSxpQkFBaUI7WUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUNoQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM1QjtZQUNBLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ25DLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDckQsQ0FBQztTQUNIO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQzs7MkdBdmRVLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXJyYW5nZSwgQ29sdW1uLCBUQUJMRV9ERUZBVUxUUyB9IGZyb20gJy4uL3R5cGVzL1RhYmxlJztcclxuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi90YWJsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3JkZXJCeURpcmVjdGlvbiB9IGZyb20gJ2ZpcmViYXNlL2ZpcmVzdG9yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmZpZyB7XHJcbiAgc2VsZWN0RmlsdGVyOiBhbnk7XHJcbiAgdHlwZUZpbHRlcj86IHN0cmluZztcclxuICBzZWxlY3RJdGVtPzogYW55W107XHJcbiAgaW5pdGlhbERhdGU/OiBzdHJpbmc7XHJcbiAgZmluYWxEYXRlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWx0ZXJzQnlQcm9wZXJ0eSB7XHJcbiAgW3Byb3BlcnR5OiBzdHJpbmddOiBBcnJheTx7IGluaXRpYWw6IERhdGU7IGZpbmFsOiBEYXRlIH0+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NlZEZpbHRlciB7XHJcbiAgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBzZWxlY3RlZEZpbHRlcjogYW55O1xyXG4gIGFycmFuZ2U6IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlclNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyaWEgdW0gbm92byBGb3JtR3JvdXAgcGFyYSB1bSBmaWx0cm9cclxuICAgKi9cclxuICBjcmVhdGVGaWx0ZXJHcm91cCgpOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgIHNlbGVjdEZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgdHlwZUZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgc2VsZWN0SXRlbTogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgaW5pdGlhbERhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW2RhdGVWYWxpZGF0b3JdKSxcclxuICAgICAgZmluYWxEYXRlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtkYXRlVmFsaWRhdG9yXSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkaWNpb25hIHVtIG5vdm8gZmlsdHJvIGFvIEZvcm1BcnJheVxyXG4gICAqL1xyXG4gIGFkZEZpbHRlcihcclxuICAgIGZpbHRlcnNGb3JtOiBGb3JtQXJyYXksXHJcbiAgICBpc1BhZ2luYXRlZDogYm9vbGVhbixcclxuICAgIGZpbHRlckRhdGE/OiBGaWx0ZXJDb25maWdcclxuICApOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgaXNQYWdpbmF0ZWQgJiZcclxuICAgICAgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKGZpbHRlcnNGb3JtKSAmJlxyXG4gICAgICBmaWx0ZXJEYXRhPy5zZWxlY3RGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0ZpbHRlckdyb3VwID0gdGhpcy5jcmVhdGVGaWx0ZXJHcm91cCgpO1xyXG5cclxuICAgIGlmIChmaWx0ZXJEYXRhKSB7XHJcbiAgICAgIGlmIChmaWx0ZXJEYXRhLnNlbGVjdEZpbHRlcikge1xyXG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmlsdGVyRGF0YS50eXBlRmlsdGVyKSB7XHJcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEudHlwZUZpbHRlcik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbHRlckRhdGEuc2VsZWN0SXRlbSkge1xyXG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKSB7XHJcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZmlsdGVyRGF0YS5maW5hbERhdGUpIHtcclxuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmZpbmFsRGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJzRm9ybS5wdXNoKG5ld0ZpbHRlckdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZlcmlmaWNhIHNlIGjDoSB1bSBmaWx0cm8gZGUgZGF0YSBhdGl2b1xyXG4gICAqL1xyXG4gIGhhc0FjdGl2ZURhdGVGaWx0ZXIoZmlsdGVyc0Zvcm06IEZvcm1BcnJheSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZpbHRlcnNGb3JtLmNvbnRyb2xzLnNvbWUoKGNvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkRmlsdGVyPy5hcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0b3JuYSBhcyBvcMOnw7VlcyBkZSBmaWx0cm8gZGlzcG9uw612ZWlzXHJcbiAgICovXHJcbiAgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucyhcclxuICAgIGRyb3Bkb3duSXRlbXM6IGFueVtdLFxyXG4gICAgaXNQYWdpbmF0ZWQ6IGJvb2xlYW4sXHJcbiAgICBmaWx0ZXJzRm9ybTogRm9ybUFycmF5XHJcbiAgKTogYW55W10ge1xyXG4gICAgaWYgKGlzUGFnaW5hdGVkICYmIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcihmaWx0ZXJzRm9ybSkpIHtcclxuICAgICAgcmV0dXJuIGRyb3Bkb3duSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmFycmFuZ2UgIT09ICdmaWx0ZXJCeURhdGUnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkcm9wZG93bkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHVtIGZpbHRybyBkbyBGb3JtQXJyYXlcclxuICAgKi9cclxuICByZW1vdmVGaWx0ZXIoZmlsdGVyc0Zvcm06IEZvcm1BcnJheSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgZmlsdGVyc0Zvcm0ucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgaWYgKGZpbHRlcnNGb3JtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmFkZEZpbHRlcihmaWx0ZXJzRm9ybSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRvZG9zIG9zIGZpbHRyb3MgZG8gRm9ybUFycmF5XHJcbiAgICovXHJcbiAgcmVtb3ZlQWxsRmlsdGVycyhmaWx0ZXJzRm9ybTogRm9ybUFycmF5KTogdm9pZCB7XHJcbiAgICBmaWx0ZXJzRm9ybS5jbGVhcigpO1xyXG4gICAgdGhpcy5hZGRGaWx0ZXIoZmlsdGVyc0Zvcm0sIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwbGljYSBtw6FzY2FyYSBkZSBkYXRhIChERC9NTS9BQUFBKVxyXG4gICAqL1xyXG4gIGFwcGx5RGF0ZU1hc2soXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgY29udHJvbE5hbWU6ICdpbml0aWFsRGF0ZScgfCAnZmluYWxEYXRlJyxcclxuICAgIGZpbHRlckdyb3VwOiBGb3JtR3JvdXBcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuXHJcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gOCkge1xyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gMikge1xyXG4gICAgICAvLyBtYW50w6ltIGNvbW8gZXN0w6FcclxuICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoIDw9IDQpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSArICcvJyArIHZhbHVlLnNsaWNlKDIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUgPVxyXG4gICAgICAgIHZhbHVlLnNsaWNlKDAsIDIpICsgJy8nICsgdmFsdWUuc2xpY2UoMiwgNCkgKyAnLycgKyB2YWx1ZS5zbGljZSg0LCA4KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJHcm91cC5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBsaWNhIGZpbHRyb3MgY2xpZW50LXNpZGUgYW9zIGl0ZW5zXHJcbiAgICovXHJcbiAgYXBwbHlDbGllbnRTaWRlRmlsdGVyczxUID0gYW55PihcclxuICAgIGl0ZW1zOiBUW10sXHJcbiAgICBmaWx0ZXJzRm9ybTogRm9ybUFycmF5LFxyXG4gICAgc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmc7IG9yZGVyOiBPcmRlckJ5RGlyZWN0aW9uIH1cclxuICApOiBUW10ge1xyXG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSBbLi4uaXRlbXNdO1xyXG5cclxuICAgIGNvbnN0IGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eTogRGF0ZUZpbHRlcnNCeVByb3BlcnR5ID0ge307XHJcbiAgICBjb25zdCBvdGhlckZpbHRlcnM6IFByb2Nlc3NlZEZpbHRlcltdID0gW107XHJcblxyXG4gICAgZmlsdGVyc0Zvcm0uY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcclxuXHJcbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsICYmIGluaXRpYWwudHJpbSgpICYmIGZpbmFsLnRyaW0oKSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZVBhdHRlcm4gPSAvXihcXGR7MSwyfSlcXC8oXFxkezEsMn0pXFwvKFxcZHs0fSkkLztcclxuICAgICAgICAgICAgaWYgKCFkYXRlUGF0dGVybi50ZXN0KGluaXRpYWwpIHx8ICFkYXRlUGF0dGVybi50ZXN0KGZpbmFsKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xyXG4gICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcclxuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzTmFOKGluaXRpYWxEYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4oZmluYWxEYXRlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVGaWVsZCA9IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5IHx8IHNvcnRCeS5maWVsZDtcclxuXHJcbiAgICAgICAgICAgIGlmICghZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0pIHtcclxuICAgICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXS5wdXNoKHtcclxuICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJybyBhbyBwcm9jZXNzYXIgZGF0YXMgZG8gZmlsdHJvOicsIGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgb3RoZXJGaWx0ZXJzLnB1c2goeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwbGljYXIgZmlsdHJvcyBkZSBkYXRhXHJcbiAgICBPYmplY3Qua2V5cyhkYXRlRmlsdGVyc0J5UHJvcGVydHkpLmZvckVhY2goKGRhdGVGaWVsZCkgPT4ge1xyXG4gICAgICBjb25zdCBpbnRlcnZhbHMgPSBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXTtcclxuXHJcbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBpdGVtW2RhdGVGaWVsZF07XHJcblxyXG4gICAgICAgICAgaWYgKCFmaWVsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgaXRlbURhdGU6IERhdGU7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUudG9EYXRlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gZmllbGRWYWx1ZS50b0RhdGUoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKGl0ZW1EYXRlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gbmV3IERhdGUoZmllbGRWYWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGludGVydmFscy5zb21lKFxyXG4gICAgICAgICAgICAoaW50ZXJ2YWwpID0+XHJcbiAgICAgICAgICAgICAgaXRlbURhdGUgPj0gaW50ZXJ2YWwuaW5pdGlhbCAmJiBpdGVtRGF0ZSA8PSBpbnRlcnZhbC5maW5hbFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAnRXJybyBhbyBwcm9jZXNzYXIgZmlsdHJvIGRlIGRhdGEgcGFyYSBvIGl0ZW06JyxcclxuICAgICAgICAgICAgaXRlbS5pZCxcclxuICAgICAgICAgICAgZXJyb3JcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEFwbGljYXIgb3V0cm9zIGZpbHRyb3NcclxuICAgIG90aGVyRmlsdGVycy5mb3JFYWNoKCh7IGdyb3VwLCBzZWxlY3RlZEZpbHRlciwgYXJyYW5nZSB9KSA9PiB7XHJcbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiBmaWx0ZXJWYWx1ZS50cmltKCkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHk7XHJcbiAgICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtW3Byb3BlcnR5XSB8fCAnJylcclxuICAgICAgICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiZcclxuICAgICAgICBhcnJhbmdlID09PSAnZXF1YWxzJ1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMuc29tZSgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtW3NlbGVjdGVkSXRlbS5wcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZSA9PT0gc2VsZWN0ZWRJdGVtLnZhbHVlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkSXRlbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHLDs2kgbyBvYmpldG8gQXJyYW5nZSBhIHBhcnRpciBkb3MgZmlsdHJvcyBhdGl2b3NcclxuICAgKi9cclxuICBidWlsZEFycmFuZ2VGcm9tRmlsdGVycyhcclxuICAgIGZpbHRlcnNGb3JtOiBGb3JtQXJyYXksXHJcbiAgICBzb3J0Qnk6IHsgZmllbGQ6IHN0cmluZzsgb3JkZXI6IE9yZGVyQnlEaXJlY3Rpb24gfVxyXG4gICk6IEFycmFuZ2Uge1xyXG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IGZpbHRlcnNGb3JtLmNvbnRyb2xzXHJcbiAgICAgIC5mbGF0TWFwKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xyXG4gICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybiBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XHJcblxyXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XHJcbiAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlKSByZXR1cm4gW107XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhcnJhbmdlLFxyXG4gICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICBwcm9wZXJ0eTogc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHksXHJcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xyXG4gICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xyXG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcclxuICAgICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xyXG4gICAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZGF0ZUZpbHRlcjoge1xyXG4gICAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmaWx0ZXJzOiBhY3RpdmVGaWx0ZXJzLFxyXG4gICAgICBzb3J0Qnk6IHNvcnRCeSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWkgZmlsdHJvcyBhdGl2b3MgcGFyYSBwYWdpbmHDp8Ojb1xyXG4gICAqL1xyXG4gIGV4dHJhY3RBY3RpdmVGaWx0ZXJzKGZpbHRlcnNGb3JtOiBGb3JtQXJyYXkpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gZmlsdGVyc0Zvcm0uY29udHJvbHNcclxuICAgICAgLmZsYXRNYXAoKGNvbnRyb2wpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcclxuXHJcbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcclxuICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUpIHJldHVybiBbXTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGFycmFuZ2UsXHJcbiAgICAgICAgICAgIGZpbHRlcjoge1xyXG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcclxuICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlclZhbHVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XHJcbiAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XHJcbiAgICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCkge1xyXG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhJfS8ke2RheUl9LyR7eWVhckl9YCk7XHJcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xyXG4gICAgICAgICAgICBmaW5hbERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB7XHJcbiAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcclxuICAgICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcclxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgICAgICAgICAgYXJyYW5nZSxcclxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcclxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaWNpYWxpemEgb3MgZHJvcGRvd25JdGVtcyBiYXNlYWRvIG5hcyBjb2x1bmFzXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZURyb3Bkb3duSXRlbXMoZGlzcGxheWVkQ29sdW1uczogQ29sdW1uW10pOiB7XHJcbiAgICBkcm9wZG93bkl0ZW1zOiBhbnlbXTtcclxuICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtczogYW55W107XHJcbiAgICBoYXNGaWx0ZXJhYmxlQ29sdW1uOiBib29sZWFuO1xyXG4gICAgaGFzU29ydGFibGVDb2x1bW46IGJvb2xlYW47XHJcbiAgfSB7XHJcbiAgICBjb25zdCBkcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3Qgc29ydGFibGVEcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IGhhc0ZpbHRlcmFibGVDb2x1bW4gPSBmYWxzZTtcclxuICAgIGxldCBoYXNTb3J0YWJsZUNvbHVtbiA9IGZhbHNlO1xyXG5cclxuICAgIGRpc3BsYXllZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XHJcbiAgICAgICAgaGFzRmlsdGVyYWJsZUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHtcclxuICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXInLFxyXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcclxuICAgICAgICBoYXNTb3J0YWJsZUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgLi4uY29sLFxyXG4gICAgICAgICAgYXJyYW5nZTogJ2FzY2VuZGluZycsXHJcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogY3Jlc2NlbnRlJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBzb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICBhcnJhbmdlOiAnZGVzY2VuZGluZycsXHJcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHtcclxuICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXJCeURhdGUnLFxyXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRyb3Bkb3duSXRlbXMsXHJcbiAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcyxcclxuICAgICAgaGFzRmlsdGVyYWJsZUNvbHVtbixcclxuICAgICAgaGFzU29ydGFibGVDb2x1bW4sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRpY2lvbmEgb3DDp8O1ZXMgZGUgZmlsdHJvIGN1c3RvbWl6YWRhc1xyXG4gICAqL1xyXG4gIGFkZEZpbHRlcmFibGVPcHRpb25zKGRyb3Bkb3duSXRlbXM6IGFueVtdLCBmaWx0ZXJhYmxlT3B0aW9uczogYW55W10pOiBhbnlbXSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGZpbHRlcmFibGVPcHRpb25zICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkoZmlsdGVyYWJsZU9wdGlvbnMpICYmXHJcbiAgICAgIGZpbHRlcmFibGVPcHRpb25zLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBmaWx0ZXJhYmxlT3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+XHJcbiAgICAgICAgZHJvcGRvd25JdGVtcy5wdXNoKHsgLi4ub3B0aW9uLCBhcnJhbmdlOiAnZXF1YWxzJyB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRyb3Bkb3duSXRlbXM7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class PaginationService {
|
|
4
|
-
calculateNavigation(event, currentState) {
|
|
5
|
-
const previousPageIndex = event.previousPageIndex ?? 0;
|
|
6
|
-
const pageIndex = event.pageIndex;
|
|
7
|
-
const eventPageSize = event.pageSize;
|
|
8
|
-
const totalItems = currentState.totalItems;
|
|
9
|
-
const currentComponentPageSize = currentState.pageSize;
|
|
10
|
-
let navigationDirection = 'reload';
|
|
11
|
-
let resetDocs = false;
|
|
12
|
-
let originalPageSize = null;
|
|
13
|
-
let shouldNavigate = true;
|
|
14
|
-
let newClientPageIndex = pageIndex;
|
|
15
|
-
let newPageNumber = currentState.currentPageNumber;
|
|
16
|
-
const lastPageIndex = Math.max(0, Math.ceil(totalItems / eventPageSize) - 1);
|
|
17
|
-
// Atualizar número da página
|
|
18
|
-
if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {
|
|
19
|
-
newPageNumber++;
|
|
20
|
-
}
|
|
21
|
-
else if (previousPageIndex !== undefined &&
|
|
22
|
-
pageIndex < previousPageIndex) {
|
|
23
|
-
newPageNumber = Math.max(1, newPageNumber - 1);
|
|
24
|
-
}
|
|
25
|
-
// Mudança de tamanho de página
|
|
26
|
-
if (eventPageSize !== currentComponentPageSize) {
|
|
27
|
-
navigationDirection = 'forward';
|
|
28
|
-
resetDocs = true;
|
|
29
|
-
newClientPageIndex = 0;
|
|
30
|
-
}
|
|
31
|
-
// Indo para primeira página
|
|
32
|
-
else if (pageIndex === 0 &&
|
|
33
|
-
previousPageIndex !== undefined &&
|
|
34
|
-
pageIndex < previousPageIndex) {
|
|
35
|
-
navigationDirection = 'forward';
|
|
36
|
-
newPageNumber = 1;
|
|
37
|
-
newClientPageIndex = 0;
|
|
38
|
-
resetDocs = true;
|
|
39
|
-
}
|
|
40
|
-
// Indo para última página (salto)
|
|
41
|
-
else if (pageIndex === lastPageIndex &&
|
|
42
|
-
previousPageIndex !== undefined &&
|
|
43
|
-
pageIndex > previousPageIndex &&
|
|
44
|
-
pageIndex - previousPageIndex > 1) {
|
|
45
|
-
navigationDirection = 'backward';
|
|
46
|
-
resetDocs = true;
|
|
47
|
-
const itemsExpectedInLastPage = totalItems - lastPageIndex * eventPageSize;
|
|
48
|
-
if (itemsExpectedInLastPage > 0 &&
|
|
49
|
-
itemsExpectedInLastPage < eventPageSize) {
|
|
50
|
-
originalPageSize = currentComponentPageSize;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// Próxima página
|
|
54
|
-
else if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {
|
|
55
|
-
navigationDirection = 'forward';
|
|
56
|
-
resetDocs = false;
|
|
57
|
-
}
|
|
58
|
-
// Página anterior
|
|
59
|
-
else if (previousPageIndex !== undefined && pageIndex < previousPageIndex) {
|
|
60
|
-
navigationDirection = 'backward';
|
|
61
|
-
resetDocs = false;
|
|
62
|
-
}
|
|
63
|
-
// Mesma página (reload)
|
|
64
|
-
else if (previousPageIndex !== undefined &&
|
|
65
|
-
pageIndex === previousPageIndex) {
|
|
66
|
-
navigationDirection = 'reload';
|
|
67
|
-
resetDocs = false;
|
|
68
|
-
}
|
|
69
|
-
// Caso inicial (primeira carga)
|
|
70
|
-
else if (previousPageIndex === undefined && pageIndex === 0) {
|
|
71
|
-
shouldNavigate = false;
|
|
72
|
-
}
|
|
73
|
-
// Caso não tratado
|
|
74
|
-
else {
|
|
75
|
-
console.warn('Condição de navegação não tratada:', event);
|
|
76
|
-
shouldNavigate = false;
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
direction: navigationDirection,
|
|
80
|
-
resetDocs,
|
|
81
|
-
originalPageSize,
|
|
82
|
-
shouldNavigate,
|
|
83
|
-
newClientPageIndex,
|
|
84
|
-
newPageNumber,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Calcula o número de itens esperados na última página
|
|
89
|
-
*/
|
|
90
|
-
calculateLastPageItemCount(totalItems, pageSize) {
|
|
91
|
-
const lastPageIndex = Math.max(0, Math.ceil(totalItems / pageSize) - 1);
|
|
92
|
-
return totalItems - lastPageIndex * pageSize;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Calcula o índice da última página
|
|
96
|
-
*/
|
|
97
|
-
calculateLastPageIndex(totalItems, pageSize) {
|
|
98
|
-
return Math.max(0, Math.ceil(totalItems / pageSize) - 1);
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Verifica se deve mostrar o botão de próxima página
|
|
102
|
-
*/
|
|
103
|
-
shouldShowNextButton(hasNextPage, isPaginated) {
|
|
104
|
-
return hasNextPage || !isPaginated;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
PaginationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
108
|
-
PaginationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, providedIn: 'root' });
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PaginationService, decorators: [{
|
|
110
|
-
type: Injectable,
|
|
111
|
-
args: [{
|
|
112
|
-
providedIn: 'root',
|
|
113
|
-
}]
|
|
114
|
-
}] });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBdUIzQyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLG1CQUFtQixDQUNqQixLQUFnQixFQUNoQixZQUE2QjtRQUU3QixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDM0MsTUFBTSx3QkFBd0IsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBRXZELElBQUksbUJBQW1CLEdBQXNDLFFBQVEsQ0FBQztRQUN0RSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUM7UUFFbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDNUIsQ0FBQyxFQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FDMUMsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixJQUFJLGlCQUFpQixLQUFLLFNBQVMsSUFBSSxTQUFTLEdBQUcsaUJBQWlCLEVBQUU7WUFDcEUsYUFB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Q0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLFdBQW9CLEVBQUUsV0FBb0I7UUFDN0QsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQzs7K0dBaElVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblN0YXRlIHtcclxuICBjdXJyZW50UGFnZU51bWJlcjogbnVtYmVyO1xyXG4gIGN1cnJlbnRDbGllbnRQYWdlSW5kZXg6IG51bWJlcjtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcclxuICBoYXNOZXh0UGFnZTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0aW9uUmVzdWx0IHtcclxuICBkaXJlY3Rpb246ICdmb3J3YXJkJyB8ICdiYWNrd2FyZCcgfCAncmVsb2FkJztcclxuICByZXNldERvY3M6IGJvb2xlYW47XHJcbiAgb3JpZ2luYWxQYWdlU2l6ZTogbnVtYmVyIHwgbnVsbDtcclxuICBzaG91bGROYXZpZ2F0ZTogYm9vbGVhbjtcclxuICBuZXdDbGllbnRQYWdlSW5kZXg6IG51bWJlcjtcclxuICBuZXdQYWdlTnVtYmVyOiBudW1iZXI7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uU2VydmljZSB7XHJcbiAgY2FsY3VsYXRlTmF2aWdhdGlvbihcclxuICAgIGV2ZW50OiBQYWdlRXZlbnQsXHJcbiAgICBjdXJyZW50U3RhdGU6IFBhZ2luYXRpb25TdGF0ZVxyXG4gICk6IE5hdmlnYXRpb25SZXN1bHQge1xyXG4gICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSBldmVudC5wcmV2aW91c1BhZ2VJbmRleCA/PyAwO1xyXG4gICAgY29uc3QgcGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgY29uc3QgZXZlbnRQYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgY29uc3QgdG90YWxJdGVtcyA9IGN1cnJlbnRTdGF0ZS50b3RhbEl0ZW1zO1xyXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudFBhZ2VTaXplID0gY3VycmVudFN0YXRlLnBhZ2VTaXplO1xyXG5cclxuICAgIGxldCBuYXZpZ2F0aW9uRGlyZWN0aW9uOiAnZm9yd2FyZCcgfCAnYmFja3dhcmQnIHwgJ3JlbG9hZCcgPSAncmVsb2FkJztcclxuICAgIGxldCByZXNldERvY3MgPSBmYWxzZTtcclxuICAgIGxldCBvcmlnaW5hbFBhZ2VTaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzaG91bGROYXZpZ2F0ZSA9IHRydWU7XHJcbiAgICBsZXQgbmV3Q2xpZW50UGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgbGV0IG5ld1BhZ2VOdW1iZXIgPSBjdXJyZW50U3RhdGUuY3VycmVudFBhZ2VOdW1iZXI7XHJcblxyXG4gICAgY29uc3QgbGFzdFBhZ2VJbmRleCA9IE1hdGgubWF4KFxyXG4gICAgICAwLFxyXG4gICAgICBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGV2ZW50UGFnZVNpemUpIC0gMVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBdHVhbGl6YXIgbsO6bWVybyBkYSBww6FnaW5hXHJcbiAgICBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xyXG4gICAgICBuZXdQYWdlTnVtYmVyKys7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XHJcbiAgICApIHtcclxuICAgICAgbmV3UGFnZU51bWJlciA9IE1hdGgubWF4KDEsIG5ld1BhZ2VOdW1iZXIgLSAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWRhbsOnYSBkZSB0YW1hbmhvIGRlIHDDoWdpbmFcclxuICAgIGlmIChldmVudFBhZ2VTaXplICE9PSBjdXJyZW50Q29tcG9uZW50UGFnZVNpemUpIHtcclxuICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcclxuICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcclxuICAgICAgbmV3Q2xpZW50UGFnZUluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIC8vIEluZG8gcGFyYSBwcmltZWlyYSBww6FnaW5hXHJcbiAgICBlbHNlIGlmIChcclxuICAgICAgcGFnZUluZGV4ID09PSAwICYmXHJcbiAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcclxuICAgICkge1xyXG4gICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xyXG4gICAgICBuZXdQYWdlTnVtYmVyID0gMTtcclxuICAgICAgbmV3Q2xpZW50UGFnZUluZGV4ID0gMDtcclxuICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIEluZG8gcGFyYSDDumx0aW1hIHDDoWdpbmEgKHNhbHRvKVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHBhZ2VJbmRleCA9PT0gbGFzdFBhZ2VJbmRleCAmJlxyXG4gICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4ICYmXHJcbiAgICAgIHBhZ2VJbmRleCAtIHByZXZpb3VzUGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xyXG4gICAgICByZXNldERvY3MgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPVxyXG4gICAgICAgIHRvdGFsSXRlbXMgLSBsYXN0UGFnZUluZGV4ICogZXZlbnRQYWdlU2l6ZTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA+IDAgJiZcclxuICAgICAgICBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZSA8IGV2ZW50UGFnZVNpemVcclxuICAgICAgKSB7XHJcbiAgICAgICAgb3JpZ2luYWxQYWdlU2l6ZSA9IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gUHLDs3hpbWEgcMOhZ2luYVxyXG4gICAgZWxzZSBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xyXG4gICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xyXG4gICAgICByZXNldERvY3MgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIFDDoWdpbmEgYW50ZXJpb3JcclxuICAgIGVsc2UgaWYgKHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXgpIHtcclxuICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdiYWNrd2FyZCc7XHJcbiAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gTWVzbWEgcMOhZ2luYSAocmVsb2FkKVxyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgcGFnZUluZGV4ID09PSBwcmV2aW91c1BhZ2VJbmRleFxyXG4gICAgKSB7XHJcbiAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAncmVsb2FkJztcclxuICAgICAgcmVzZXREb2NzID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDYXNvIGluaWNpYWwgKHByaW1laXJhIGNhcmdhKVxyXG4gICAgZWxzZSBpZiAocHJldmlvdXNQYWdlSW5kZXggPT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPT09IDApIHtcclxuICAgICAgc2hvdWxkTmF2aWdhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIENhc28gbsOjbyB0cmF0YWRvXHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdDb25kacOnw6NvIGRlIG5hdmVnYcOnw6NvIG7Do28gdHJhdGFkYTonLCBldmVudCk7XHJcbiAgICAgIHNob3VsZE5hdmlnYXRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGlyZWN0aW9uOiBuYXZpZ2F0aW9uRGlyZWN0aW9uLFxyXG4gICAgICByZXNldERvY3MsXHJcbiAgICAgIG9yaWdpbmFsUGFnZVNpemUsXHJcbiAgICAgIHNob3VsZE5hdmlnYXRlLFxyXG4gICAgICBuZXdDbGllbnRQYWdlSW5kZXgsXHJcbiAgICAgIG5ld1BhZ2VOdW1iZXIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYSBvIG7Dum1lcm8gZGUgaXRlbnMgZXNwZXJhZG9zIG5hIMO6bHRpbWEgcMOhZ2luYVxyXG4gICAqL1xyXG4gIGNhbGN1bGF0ZUxhc3RQYWdlSXRlbUNvdW50KHRvdGFsSXRlbXM6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBsYXN0UGFnZUluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBwYWdlU2l6ZSkgLSAxKTtcclxuICAgIHJldHVybiB0b3RhbEl0ZW1zIC0gbGFzdFBhZ2VJbmRleCAqIHBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYSBvIMOtbmRpY2UgZGEgw7psdGltYSBww6FnaW5hXHJcbiAgICovXHJcbiAgY2FsY3VsYXRlTGFzdFBhZ2VJbmRleCh0b3RhbEl0ZW1zOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguY2VpbCh0b3RhbEl0ZW1zIC8gcGFnZVNpemUpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBkZXZlIG1vc3RyYXIgbyBib3TDo28gZGUgcHLDs3hpbWEgcMOhZ2luYVxyXG4gICAqL1xyXG4gIHNob3VsZFNob3dOZXh0QnV0dG9uKGhhc05leHRQYWdlOiBib29sZWFuLCBpc1BhZ2luYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGhhc05leHRQYWdlIHx8ICFpc1BhZ2luYXRlZDtcclxuICB9XHJcbn1cclxuIl19
|