@firestitch/filter 18.2.11 → 18.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/app/components/filter/filter.component.d.ts +40 -64
  2. package/app/components/filter-chip/filter-chip.component.d.ts +16 -3
  3. package/app/components/filter-chips/filter-chips.component.d.ts +14 -2
  4. package/app/components/filter-drawer/filter-drawer.component.d.ts +2 -5
  5. package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +8 -8
  6. package/app/components/filters-item/base-item/base-item.component.d.ts +3 -9
  7. package/app/components/filters-item/checkbox/checkbox.component.d.ts +6 -5
  8. package/app/components/filters-item/chips/chips.component.d.ts +6 -5
  9. package/app/components/filters-item/date/date.component.d.ts +4 -4
  10. package/app/components/filters-item/date-range/date-range.component.d.ts +7 -6
  11. package/app/components/filters-item/filter-item.component.d.ts +2 -2
  12. package/app/components/filters-item/range/range.component.d.ts +6 -7
  13. package/app/components/filters-item/select/select.component.d.ts +17 -20
  14. package/app/components/filters-item/text/text.component.d.ts +6 -7
  15. package/app/components/filters-item/week/week.component.d.ts +5 -5
  16. package/app/components/keyword-input/keyword-input.component.d.ts +29 -0
  17. package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +2 -3
  18. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +1 -1
  19. package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +1 -2
  20. package/app/fs-filter.module.d.ts +20 -24
  21. package/app/helpers/create-filter-item.d.ts +2 -1
  22. package/app/interfaces/items/date.interface.d.ts +1 -1
  23. package/app/models/filter-config.d.ts +2 -2
  24. package/app/models/items/autocomplete-chips-item.d.ts +11 -8
  25. package/app/models/items/autocomplete-item.d.ts +7 -5
  26. package/app/models/items/{autocomplete/base-autocomplete-item.d.ts → base-autocomplete-item.d.ts} +4 -5
  27. package/app/models/items/base-date-item.d.ts +13 -0
  28. package/app/models/items/base-date-range-item.d.ts +17 -0
  29. package/app/models/items/base-item.d.ts +26 -40
  30. package/app/models/items/checkbox-item.d.ts +10 -9
  31. package/app/models/items/chips-item.d.ts +12 -9
  32. package/app/models/items/date-item.d.ts +7 -3
  33. package/app/models/items/date-range-item.d.ts +1 -1
  34. package/app/models/items/date-time-item.d.ts +6 -3
  35. package/app/models/items/date-time-range-item.d.ts +1 -1
  36. package/app/models/items/index.d.ts +0 -4
  37. package/app/models/items/range-item.d.ts +19 -8
  38. package/app/models/items/select-item.d.ts +29 -6
  39. package/app/models/items/text-item.d.ts +7 -6
  40. package/app/models/items/week-item.d.ts +7 -7
  41. package/app/services/filter-controller.service.d.ts +47 -0
  42. package/app/services/focus-controller.service.d.ts +4 -4
  43. package/app/services/index.d.ts +4 -2
  44. package/app/services/keyword-controller.service.d.ts +20 -0
  45. package/app/services/persistance-controller.service.d.ts +10 -4
  46. package/app/services/query-param-controller.service.d.ts +10 -12
  47. package/app/services/root-filter-overlay.service.d.ts +6 -0
  48. package/app/services/saved-filter-controller.service.d.ts +4 -4
  49. package/app/services/sort-controller.service.d.ts +21 -0
  50. package/esm2022/app/components/filter/filter.component.mjs +150 -294
  51. package/esm2022/app/components/filter-chip/filter-chip.component.mjs +24 -32
  52. package/esm2022/app/components/filter-chip-content/filter-chip-content.component.mjs +2 -2
  53. package/esm2022/app/components/filter-chips/filter-chips.component.mjs +22 -8
  54. package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +7 -14
  55. package/esm2022/app/components/filters-item/autocomplete/autocomplete.component.mjs +6 -6
  56. package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +26 -22
  57. package/esm2022/app/components/filters-item/base-item/base-item.component.mjs +2 -30
  58. package/esm2022/app/components/filters-item/checkbox/checkbox.component.mjs +22 -15
  59. package/esm2022/app/components/filters-item/chips/chips.component.mjs +22 -15
  60. package/esm2022/app/components/filters-item/date/date.component.mjs +24 -20
  61. package/esm2022/app/components/filters-item/date-range/date-range.component.mjs +29 -24
  62. package/esm2022/app/components/filters-item/filter-item.component.mjs +5 -5
  63. package/esm2022/app/components/filters-item/range/range.component.mjs +31 -35
  64. package/esm2022/app/components/filters-item/select/select.component.mjs +57 -45
  65. package/esm2022/app/components/filters-item/text/text.component.mjs +24 -24
  66. package/esm2022/app/components/filters-item/week/week.component.mjs +22 -16
  67. package/esm2022/app/components/keyword-input/keyword-input.component.mjs +104 -0
  68. package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +4 -6
  69. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +6 -6
  70. package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +5 -6
  71. package/esm2022/app/fs-filter.module.mjs +1 -16
  72. package/esm2022/app/helpers/parse-item-value-from-stored.mjs +17 -16
  73. package/esm2022/app/interfaces/items/date.interface.mjs +1 -1
  74. package/esm2022/app/models/action.model.mjs +2 -2
  75. package/esm2022/app/models/filter-config.mjs +2 -3
  76. package/esm2022/app/models/items/autocomplete-chips-item.mjs +32 -27
  77. package/esm2022/app/models/items/autocomplete-item.mjs +13 -15
  78. package/esm2022/app/models/items/base-autocomplete-item.mjs +16 -0
  79. package/esm2022/app/models/items/base-date-item.mjs +28 -0
  80. package/esm2022/app/models/items/base-date-range-item.mjs +101 -0
  81. package/esm2022/app/models/items/base-item.mjs +58 -138
  82. package/esm2022/app/models/items/checkbox-item.mjs +35 -26
  83. package/esm2022/app/models/items/chips-item.mjs +50 -59
  84. package/esm2022/app/models/items/date-item.mjs +21 -8
  85. package/esm2022/app/models/items/date-range-item.mjs +2 -2
  86. package/esm2022/app/models/items/date-time-item.mjs +4 -7
  87. package/esm2022/app/models/items/date-time-range-item.mjs +2 -2
  88. package/esm2022/app/models/items/index.mjs +1 -5
  89. package/esm2022/app/models/items/range-item.mjs +48 -44
  90. package/esm2022/app/models/items/select-item.mjs +104 -9
  91. package/esm2022/app/models/items/text-item.mjs +17 -15
  92. package/esm2022/app/models/items/week-item.mjs +22 -38
  93. package/esm2022/app/pipes/remove-isolate-value.pipe.mjs +1 -1
  94. package/esm2022/app/services/filter-controller.service.mjs +209 -0
  95. package/esm2022/app/services/filter-overlay.service.mjs +3 -3
  96. package/esm2022/app/services/focus-controller.service.mjs +3 -3
  97. package/esm2022/app/services/index.mjs +5 -3
  98. package/esm2022/app/services/keyword-controller.service.mjs +49 -0
  99. package/esm2022/app/services/persistance-controller.service.mjs +24 -6
  100. package/esm2022/app/services/query-param-controller.service.mjs +44 -34
  101. package/esm2022/app/services/root-filter-overlay.service.mjs +14 -0
  102. package/esm2022/app/services/saved-filter-controller.service.mjs +20 -18
  103. package/esm2022/app/services/sort-controller.service.mjs +60 -0
  104. package/esm2022/public_api.mjs +1 -2
  105. package/fesm2022/firestitch-filter.mjs +2593 -3243
  106. package/fesm2022/firestitch-filter.mjs.map +1 -1
  107. package/package.json +1 -1
  108. package/public_api.d.ts +0 -1
  109. package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +0 -6
  110. package/app/components/filters-item/select/groups/groups.component.d.ts +0 -13
  111. package/app/components/filters-item/select/multiple/multiple.component.d.ts +0 -16
  112. package/app/components/filters-item/select/simple/simple.component.d.ts +0 -15
  113. package/app/helpers/build-query-params.d.ts +0 -4
  114. package/app/helpers/compare.d.ts +0 -2
  115. package/app/helpers/find-value.d.ts +0 -1
  116. package/app/models/items/autocomplete/index.d.ts +0 -1
  117. package/app/models/items/date/base-date-item.d.ts +0 -17
  118. package/app/models/items/date/index.d.ts +0 -1
  119. package/app/models/items/date-range/base-date-range-item.d.ts +0 -17
  120. package/app/models/items/date-range/index.d.ts +0 -1
  121. package/app/models/items/select/base-select-item.d.ts +0 -16
  122. package/app/models/items/select/index.d.ts +0 -3
  123. package/app/models/items/select/multiple-select-item.d.ts +0 -14
  124. package/app/models/items/select/simple-select-item.d.ts +0 -14
  125. package/app/providers/filter-meta.d.ts +0 -5
  126. package/app/services/item-store.service.d.ts +0 -63
  127. package/app/services/param-controller.service.d.ts +0 -30
  128. package/esm2022/app/components/filters-item/select/backdrop/backdrop.component.mjs +0 -12
  129. package/esm2022/app/components/filters-item/select/groups/groups.component.mjs +0 -47
  130. package/esm2022/app/components/filters-item/select/multiple/multiple.component.mjs +0 -76
  131. package/esm2022/app/components/filters-item/select/simple/simple.component.mjs +0 -56
  132. package/esm2022/app/helpers/build-query-params.mjs +0 -38
  133. package/esm2022/app/helpers/compare.mjs +0 -38
  134. package/esm2022/app/helpers/find-value.mjs +0 -13
  135. package/esm2022/app/models/items/autocomplete/base-autocomplete-item.mjs +0 -19
  136. package/esm2022/app/models/items/autocomplete/index.mjs +0 -2
  137. package/esm2022/app/models/items/date/base-date-item.mjs +0 -55
  138. package/esm2022/app/models/items/date/index.mjs +0 -2
  139. package/esm2022/app/models/items/date-range/base-date-range-item.mjs +0 -124
  140. package/esm2022/app/models/items/date-range/index.mjs +0 -2
  141. package/esm2022/app/models/items/select/base-select-item.mjs +0 -38
  142. package/esm2022/app/models/items/select/index.mjs +0 -4
  143. package/esm2022/app/models/items/select/multiple-select-item.mjs +0 -92
  144. package/esm2022/app/models/items/select/simple-select-item.mjs +0 -66
  145. package/esm2022/app/providers/filter-meta.mjs +0 -10
  146. package/esm2022/app/services/item-store.service.mjs +0 -333
  147. package/esm2022/app/services/param-controller.service.mjs +0 -151
@@ -1,333 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
3
- import { debounceTime, finalize, takeUntil } from 'rxjs/operators';
4
- import { pickBy } from 'lodash-es';
5
- import { ItemType } from '../enums/item-type.enum';
6
- import { buildQueryParams } from '../helpers/build-query-params';
7
- import { createFilterItem } from '../helpers/create-filter-item';
8
- import { SortByField, SortDirectionField } from '../models/filter-config';
9
- import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
10
- import { RangeItem } from '../models/items/range-item';
11
- import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
12
- import { SimpleSelectItem } from '../models/items/select/simple-select-item';
13
- import * as i0 from "@angular/core";
14
- export class ItemStore {
15
- sortByItem = null;
16
- sortDirectionItem = null;
17
- keywordItem = null;
18
- filter;
19
- _ready$ = new BehaviorSubject(false);
20
- _visibleItems$ = new BehaviorSubject([]);
21
- _items = new Map();
22
- _itemsValuesLoaded = false;
23
- _hasKeyword = false;
24
- _config;
25
- _itemsChange$ = new Subject();
26
- _destroy$ = new Subject();
27
- get items() {
28
- return Array.from(this._items.values());
29
- }
30
- get itemNames() {
31
- return this.items.map((item) => item.name);
32
- }
33
- get hasKeyword() {
34
- return this._hasKeyword;
35
- }
36
- get itemsChange$() {
37
- return this._itemsChange$.pipe(debounceTime(30));
38
- }
39
- get ready$() {
40
- return this._ready$.asObservable();
41
- }
42
- ngOnDestroy() {
43
- this.destroyItems();
44
- this._destroy$.next(null);
45
- this._destroy$.complete();
46
- }
47
- setConfig(config) {
48
- this._config = config;
49
- this.initItems(config.items);
50
- }
51
- getItemByName(name) {
52
- return this._items.get(name);
53
- }
54
- initItems(items) {
55
- this._itemsValuesLoaded = false;
56
- if (Array.isArray(items)) {
57
- this._createItems(items);
58
- this._setKeywordItem();
59
- }
60
- }
61
- queryParams() {
62
- return buildQueryParams(this.valuesAsQuery(), this.items);
63
- }
64
- filtersClear() {
65
- this.items.forEach((item) => {
66
- if (item instanceof RangeItem) {
67
- item.clearRange(null, item.defaultValue);
68
- }
69
- else if (item instanceof BaseDateRangeItem) {
70
- item.clearDateRange(null, item.defaultValue);
71
- }
72
- else {
73
- item.clear(item.defaultValue);
74
- }
75
- });
76
- if (this.sortByItem) {
77
- if (this._config.sort) {
78
- this.sortByItem.model = this._config.sort.value;
79
- }
80
- else {
81
- this.sortByItem.clear(this.sortByItem.defaultValue);
82
- }
83
- }
84
- if (this.sortDirectionItem) {
85
- if (this._config.sort) {
86
- this.sortDirectionItem.model = this._config.sort.direction;
87
- }
88
- else {
89
- this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
90
- }
91
- }
92
- this.keywordItem?.clear();
93
- }
94
- loadAsyncValues() {
95
- this.items
96
- .filter((item) => item.hasPendingValues)
97
- .forEach((item) => item.loadAsyncValues());
98
- }
99
- loadAsyncDefaults() {
100
- // default values can be asynchronous, and we must load them if there is no persisted value instead
101
- const defaultValuesToBeLoaded = this.items
102
- .filter((item) => {
103
- return item.defaultValueFn
104
- && (item.persistedValue === null || item.persistedValue === undefined);
105
- });
106
- // special hack for isolate multiple select
107
- // values for this type of select must be preloaded
108
- // Read more in class MultipleSelectItem._init()
109
- const valuesToBeLoaded = this.items
110
- .filter((item) => {
111
- return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
112
- });
113
- if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
114
- forkJoin([
115
- ...defaultValuesToBeLoaded
116
- .map((item) => item.loadDefaultValue()),
117
- ...valuesToBeLoaded
118
- .map((item) => {
119
- item.loadAsyncValues();
120
- return item.loading$
121
- .pipe();
122
- }),
123
- ])
124
- .pipe(finalize(() => {
125
- this._ready$.next(true);
126
- }), takeUntil(this._destroy$))
127
- .subscribe();
128
- }
129
- else {
130
- this._ready$.next(true);
131
- }
132
- }
133
- getSort() {
134
- let sortBy = this.getSortByValue();
135
- sortBy = sortBy === '__all' ? null : sortBy;
136
- let sortDirection = this.getSortDirectionValue();
137
- sortDirection = sortDirection === '__all' ? null : sortDirection;
138
- return {
139
- value: sortBy,
140
- direction: sortDirection,
141
- };
142
- }
143
- getSortByValue() {
144
- return this.sortByItem ? this.sortByItem.model : null;
145
- }
146
- getSortDirectionValue() {
147
- return this.sortDirectionItem ? this.sortDirectionItem.model : null;
148
- }
149
- updateSort(sort) {
150
- if (sort.sortBy) {
151
- this.sortByItem.model = sort.sortBy;
152
- }
153
- if (sort.sortDirection) {
154
- this.sortDirectionItem.model = sort.sortDirection;
155
- }
156
- }
157
- values(onlyPresented = false) {
158
- return this.items
159
- .reduce((acc, item) => {
160
- const value = item.value;
161
- if (!onlyPresented || value !== null) {
162
- acc[item.name] = value;
163
- }
164
- return acc;
165
- }, {});
166
- }
167
- models() {
168
- return this.items
169
- .reduce((acc, item) => {
170
- acc[item.name] = item.model;
171
- return acc;
172
- }, {});
173
- }
174
- valuesAsQuery({ onlyPresented = true, items = null, persisted = false, } = {}) {
175
- const params = {};
176
- (items || this.items)
177
- .forEach((filterItem) => {
178
- const values = persisted
179
- ? filterItem.persistanceObject
180
- : filterItem.queryObject;
181
- Object.assign(params, values);
182
- });
183
- if (onlyPresented) {
184
- return pickBy(params, (val) => {
185
- return val !== undefined;
186
- });
187
- }
188
- return params;
189
- }
190
- init(p) {
191
- this.items
192
- .forEach((item) => {
193
- item.initValues(p[item.name]);
194
- });
195
- this._initSortingItems(p);
196
- this.loadAsyncDefaults();
197
- this._subscribeToItemsChanges();
198
- }
199
- updateItemsWithValues(values) {
200
- this.items
201
- .forEach((item) => {
202
- if (values[item.name]) {
203
- item.model = values[item.name];
204
- }
205
- else {
206
- if (item instanceof RangeItem) {
207
- item.clearRange(null, item.defaultValue);
208
- }
209
- else if (item instanceof BaseDateRangeItem) {
210
- item.clearDateRange(null, item.defaultValue);
211
- }
212
- else {
213
- item.clear();
214
- }
215
- }
216
- });
217
- if (this.sortByItem) {
218
- this.sortByItem.clear();
219
- }
220
- if (this.sortDirectionItem) {
221
- this.sortDirectionItem.clear();
222
- }
223
- }
224
- updateSortingItemsValues(items) {
225
- if (!this.sortByItem) {
226
- return;
227
- }
228
- this.sortByItem.values = items;
229
- }
230
- destroyItems() {
231
- this.items
232
- .forEach((item) => item.destroy());
233
- this.sortByItem?.destroy();
234
- this.sortDirectionItem?.destroy();
235
- this._items.clear();
236
- this.sortByItem = null;
237
- this.sortDirectionItem = null;
238
- }
239
- /**
240
- * Some items might need to load async values before they will be shown
241
- */
242
- prepareItems() {
243
- if (!this._itemsValuesLoaded) {
244
- this._itemsValuesLoaded = true;
245
- this.loadAsyncValues();
246
- }
247
- }
248
- _createItems(items) {
249
- this._items = new Map(items
250
- .filter((item) => !item.disable)
251
- .filter((item) => {
252
- if (this._items.has(item.name)) {
253
- throw Error('Filter init error. Items name must be unique.');
254
- }
255
- return true;
256
- })
257
- .map((item) => {
258
- const filterItem = createFilterItem(item, {}, this.filter);
259
- if (filterItem.type === ItemType.Keyword) {
260
- this._hasKeyword = true;
261
- }
262
- this._items.set(item.name, filterItem);
263
- return [item.name, filterItem];
264
- }));
265
- this._createSortingItems();
266
- }
267
- _subscribeToItemsChanges() {
268
- this.items
269
- .forEach((item) => {
270
- item.valueChange$
271
- .pipe(takeUntil(item.destroy$))
272
- .subscribe(() => {
273
- this._itemsChange$.next(item);
274
- });
275
- });
276
- if (this._config.sortValues?.length) {
277
- this.sortByItem.valueChange$
278
- .pipe(takeUntil(this.sortByItem.destroy$))
279
- .subscribe(() => {
280
- this._itemsChange$.next(this.sortByItem);
281
- });
282
- this.sortDirectionItem.valueChange$
283
- .pipe(takeUntil(this.sortDirectionItem.destroy$))
284
- .subscribe(() => {
285
- this._itemsChange$.next(this.sortDirectionItem);
286
- });
287
- }
288
- }
289
- _initSortingItems(p) {
290
- if (this.sortByItem && this.sortDirectionItem) {
291
- this.sortByItem.initValues(p[this.sortByItem.name]);
292
- this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
293
- }
294
- }
295
- _createSortingItems() {
296
- if (this._config.sortValues?.length > 0) {
297
- const sortByItem = {
298
- name: SortByField,
299
- type: ItemType.Select,
300
- label: 'Sort by',
301
- values: this._config.sortValues,
302
- };
303
- if (this._config.sort && this._config.sort.value) {
304
- sortByItem.default = this._config.sort.value;
305
- }
306
- this.sortByItem = new SimpleSelectItem(sortByItem, null, this.filter);
307
- const sortDirectionItem = {
308
- name: SortDirectionField,
309
- type: ItemType.Select,
310
- label: 'Sort direction',
311
- values: [
312
- { name: 'Ascending', value: 'asc' },
313
- { name: 'Descending', value: 'desc' },
314
- ],
315
- };
316
- if (this._config.sort && this._config.sort.direction) {
317
- sortDirectionItem.default = this._config.sort.direction;
318
- }
319
- this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null, this.filter);
320
- }
321
- }
322
- _setKeywordItem() {
323
- this.keywordItem = this
324
- .items
325
- .find((item) => item.isTypeKeyword);
326
- }
327
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ItemStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
328
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ItemStore });
329
- }
330
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ItemStore, decorators: [{
331
- type: Injectable
332
- }] });
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9zZXJ2aWNlcy9pdGVtLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUduQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFTakUsT0FBTyxFQUFrQixXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBVzdFLE1BQU0sT0FBTyxTQUFTO0lBRWIsVUFBVSxHQUFnQyxJQUFJLENBQUM7SUFDL0MsaUJBQWlCLEdBQWdDLElBQUksQ0FBQztJQUN0RCxXQUFXLEdBQWEsSUFBSSxDQUFDO0lBQzdCLE1BQU0sQ0FBa0I7SUFFdkIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLGNBQWMsR0FB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LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwaWNrQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi9lbnVtcy9pdGVtLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBidWlsZFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vaGVscGVycy9idWlsZC1xdWVyeS1wYXJhbXMnO1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVySXRlbSB9IGZyb20gJy4uL2hlbHBlcnMvY3JlYXRlLWZpbHRlci1pdGVtJztcbmltcG9ydCB7XG4gIEZpbHRlclNvcnQsXG4gIElGaWx0ZXJDb25maWdJdGVtLFxuICBTb3J0SXRlbSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRlcm5hbC1wYXJhbXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IElTb3J0aW5nQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2ZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2l0ZW1zL3NlbGVjdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcsIFNvcnRCeUZpZWxkLCBTb3J0RGlyZWN0aW9uRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBCYXNlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9iYXNlLWl0ZW0nO1xuaW1wb3J0IHsgQmFzZURhdGVSYW5nZUl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvZGF0ZS1yYW5nZS9iYXNlLWRhdGUtcmFuZ2UtaXRlbSc7XG5pbXBvcnQgeyBSYW5nZUl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvcmFuZ2UtaXRlbSc7XG5pbXBvcnQgeyBNdWx0aXBsZVNlbGVjdEl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC1pdGVtJztcbmltcG9ydCB7IFNpbXBsZVNlbGVjdEl0ZW0gfSBmcm9tICcuLi9tb2RlbHMvaXRlbXMvc2VsZWN0L3NpbXBsZS1zZWxlY3QtaXRlbSc7XG5pbXBvcnQgeyBUZXh0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy90ZXh0LWl0ZW0nO1xuXG5cbmludGVyZmFjZSBJVmFsdWVBc1F1ZXJ5IHtcbiAgb25seVByZXNlbnRlZD86IGJvb2xlYW47XG4gIGl0ZW1zPzogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W107XG4gIHBlcnNpc3RlZD86IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJdGVtU3RvcmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzb3J0QnlJdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4gPSBudWxsO1xuICBwdWJsaWMgc29ydERpcmVjdGlvbkl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiA9IG51bGw7XG4gIHB1YmxpYyBrZXl3b3JkSXRlbTogVGV4dEl0ZW0gPSBudWxsO1xuICBwdWJsaWMgZmlsdGVyOiBGaWx0ZXJDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfcmVhZHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX3Zpc2libGVJdGVtcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdPihbXSk7XG4gIHByaXZhdGUgX2l0ZW1zID0gbmV3IE1hcDxzdHJpbmcsIEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPj4oKTtcbiAgcHJpdmF0ZSBfaXRlbXNWYWx1ZXNMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFzS2V5d29yZCA9IGZhbHNlO1xuICBwcml2YXRlIF9jb25maWc6IEZzRmlsdGVyQ29uZmlnO1xuICBwcml2YXRlIF9pdGVtc0NoYW5nZSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCBpdGVtcygpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faXRlbXMudmFsdWVzKCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzS2V5d29yZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzS2V5d29yZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXRlbXNDaGFuZ2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc0NoYW5nZSQucGlwZShkZWJvdW5jZVRpbWUoMzApKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVhZHkkKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkeSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95SXRlbXMoKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaW5pdEl0ZW1zKGNvbmZpZy5pdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcy5nZXQobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUl0ZW1zKGl0ZW1zKTtcbiAgICAgIHRoaXMuX3NldEtleXdvcmRJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHF1ZXJ5UGFyYW1zKCk6IEtleVZhbHVlIHtcbiAgICByZXR1cm4gYnVpbGRRdWVyeVBhcmFtcyh0aGlzLnZhbHVlc0FzUXVlcnkoKSwgdGhpcy5pdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VEYXRlUmFuZ2VJdGVtKSB7XG4gICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jbGVhcihpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIodGhpcy5zb3J0QnlJdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcih0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSXRlbT8uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkQXN5bmNWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZEFzeW5jVmFsdWVzKCkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRBc3luY0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIC8vIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBhc3luY2hyb25vdXMsIGFuZCB3ZSBtdXN0IGxvYWQgdGhlbSBpZiB0aGVyZSBpcyBubyBwZXJzaXN0ZWQgdmFsdWUgaW5zdGVhZFxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5kZWZhdWx0VmFsdWVGblxuICAgICAgICAgICYmIChpdGVtLnBlcnNpc3RlZFZhbHVlID09PSBudWxsIHx8IGl0ZW0ucGVyc2lzdGVkVmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICB9KTtcblxuICAgIC8vIHNwZWNpYWwgaGFjayBmb3IgaXNvbGF0ZSBtdWx0aXBsZSBzZWxlY3RcbiAgICAvLyB2YWx1ZXMgZm9yIHRoaXMgdHlwZSBvZiBzZWxlY3QgbXVzdCBiZSBwcmVsb2FkZWRcbiAgICAvLyBSZWFkIG1vcmUgaW4gY2xhc3MgTXVsdGlwbGVTZWxlY3RJdGVtLl9pbml0KClcbiAgICBjb25zdCB2YWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gaW5zdGFuY2VvZiBNdWx0aXBsZVNlbGVjdEl0ZW0pICYmIGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcyAmJiBpdGVtLmlzb2xhdGU7XG4gICAgICB9KTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzVG9CZUxvYWRlZC5sZW5ndGggPiAwIHx8IHZhbHVlc1RvQmVMb2FkZWQubGVuZ3RoID4gMCkge1xuICAgICAgZm9ya0pvaW4oXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5kZWZhdWx0VmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5sb2FkRGVmYXVsdFZhbHVlKCkpLFxuXG4gICAgICAgICAgLi4udmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpdGVtLmxvYWRBc3luY1ZhbHVlcygpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmxvYWRpbmckXG4gICAgICAgICAgICAgICAgLnBpcGUoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeSQubmV4dCh0cnVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZHkkLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnQoKTogRmlsdGVyU29ydCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldFNvcnRCeVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnRCeUl0ZW0gPyB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb25WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA/IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogSVNvcnRpbmdDaGFuZ2VFdmVudCkge1xuICAgIGlmIChzb3J0LnNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gc29ydC5zb3J0Qnk7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQuc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHNvcnQuc29ydERpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzKG9ubHlQcmVzZW50ZWQgPSBmYWxzZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZTtcblxuICAgICAgICBpZiAoIW9ubHlQcmVzZW50ZWQgfHwgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb2RlbHMoKTogS2V5VmFsdWUge1xuICAgIHJldHVybiB0aGlzLml0ZW1zXG4gICAgICAucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgYWNjW2l0ZW0ubmFtZV0gPSBpdGVtLm1vZGVsO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzQXNRdWVyeSh7XG4gICAgb25seVByZXNlbnRlZCA9IHRydWUsXG4gICAgaXRlbXMgPSBudWxsLFxuICAgIHBlcnNpc3RlZCA9IGZhbHNlLFxuICB9OiBJVmFsdWVBc1F1ZXJ5ID0ge30pOiBLZXlWYWx1ZSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAoaXRlbXMgfHwgdGhpcy5pdGVtcylcbiAgICAgIC5mb3JFYWNoKChmaWx0ZXJJdGVtOiBCYXNlSXRlbTxhbnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHBlcnNpc3RlZFxuICAgICAgICAgID8gZmlsdGVySXRlbS5wZXJzaXN0YW5jZU9iamVjdFxuICAgICAgICAgIDogZmlsdGVySXRlbS5xdWVyeU9iamVjdDtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywgdmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKG9ubHlQcmVzZW50ZWQpIHtcbiAgICAgIHJldHVybiBwaWNrQnkocGFyYW1zLCAodmFsKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwdWJsaWMgaW5pdChwOiBLZXlWYWx1ZSkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcyhwW2l0ZW0ubmFtZV0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9pbml0U29ydGluZ0l0ZW1zKHApO1xuICAgIHRoaXMubG9hZEFzeW5jRGVmYXVsdHMoKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zV2l0aFZhbHVlcyh2YWx1ZXM6IEtleVZhbHVlKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlc1tpdGVtLm5hbWVdKSB7XG4gICAgICAgICAgaXRlbS5tb2RlbCA9IHZhbHVlc1tpdGVtLm5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUmFuZ2VJdGVtKSB7XG4gICAgICAgICAgICBpdGVtLmNsZWFyUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VEYXRlUmFuZ2VJdGVtKSB7XG4gICAgICAgICAgICBpdGVtLmNsZWFyRGF0ZVJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5jbGVhcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydGluZ0l0ZW1zVmFsdWVzKGl0ZW1zOiBTb3J0SXRlbVtdKSB7XG4gICAgaWYgKCF0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnRCeUl0ZW0udmFsdWVzID0gaXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveUl0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLmRlc3Ryb3koKSk7XG4gICAgdGhpcy5zb3J0QnlJdGVtPy5kZXN0cm95KCk7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbT8uZGVzdHJveSgpO1xuXG4gICAgdGhpcy5faXRlbXMuY2xlYXIoKTtcbiAgICB0aGlzLnNvcnRCeUl0ZW0gPSBudWxsO1xuICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgaXRlbXMgbWlnaHQgbmVlZCB0byBsb2FkIGFzeW5jIHZhbHVlcyBiZWZvcmUgdGhleSB3aWxsIGJlIHNob3duXG4gICAqL1xuICBwdWJsaWMgcHJlcGFyZUl0ZW1zKCkge1xuICAgIGlmICghdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQpIHtcbiAgICAgIHRoaXMuX2l0ZW1zVmFsdWVzTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5sb2FkQXN5bmNWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVJdGVtcyhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gbmV3IE1hcChcbiAgICAgIGl0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGUpXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5faXRlbXMuaGFzKGl0ZW0ubmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdGaWx0ZXIgaW5pdCBlcnJvci4gSXRlbXMgbmFtZSBtdXN0IGJlIHVuaXF1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckl0ZW0gPSBjcmVhdGVGaWx0ZXJJdGVtKGl0ZW0sIHsgfSwgdGhpcy5maWx0ZXIpO1xuXG4gICAgICAgICAgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuS2V5d29yZCkge1xuICAgICAgICAgICAgdGhpcy5faGFzS2V5d29yZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5faXRlbXMuc2V0KGl0ZW0ubmFtZSwgZmlsdGVySXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gW2l0ZW0ubmFtZSwgZmlsdGVySXRlbV07XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLl9jcmVhdGVTb3J0aW5nSXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvSXRlbXNDaGFuZ2VzKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwoaXRlbS5kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQoaXRlbSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcuc29ydFZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnNvcnRCeUl0ZW0uZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2l0ZW1zQ2hhbmdlJC5uZXh0KHRoaXMuc29ydEJ5SXRlbSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLnZhbHVlQ2hhbmdlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTb3J0aW5nSXRlbXMocDogS2V5VmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtICYmIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5pbml0VmFsdWVzKHBbdGhpcy5zb3J0QnlJdGVtLm5hbWVdKTtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0uaW5pdFZhbHVlcyhwW3RoaXMuc29ydERpcmVjdGlvbkl0ZW0ubmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVNvcnRpbmdJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLnNvcnRWYWx1ZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRCeUl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNvcnRCeUZpZWxkLFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBieScsXG4gICAgICAgIHZhbHVlczogdGhpcy5fY29uZmlnLnNvcnRWYWx1ZXMsXG4gICAgICB9IGFzIElGaWx0ZXJDb25maWdTZWxlY3RJdGVtO1xuXG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC52YWx1ZSkge1xuICAgICAgICBzb3J0QnlJdGVtLmRlZmF1bHQgPSB0aGlzLl9jb25maWcuc29ydC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0QnlJdGVtID0gbmV3IFNpbXBsZVNlbGVjdEl0ZW0oXG4gICAgICAgIHNvcnRCeUl0ZW0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuZmlsdGVyLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc29ydERpcmVjdGlvbkl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNvcnREaXJlY3Rpb25GaWVsZCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgZGlyZWN0aW9uJyxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQXNjZW5kaW5nJywgdmFsdWU6ICdhc2MnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRGVzY2VuZGluZycsIHZhbHVlOiAnZGVzYycgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gYXMgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW07XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCAmJiB0aGlzLl9jb25maWcuc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW0uZGVmYXVsdCA9IHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA9IG5ldyBTaW1wbGVTZWxlY3RJdGVtKFxuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5maWx0ZXIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldEtleXdvcmRJdGVtKCkge1xuICAgIHRoaXMua2V5d29yZEl0ZW0gPSB0aGlzXG4gICAgICAuaXRlbXNcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLmlzVHlwZUtleXdvcmQpIGFzIFRleHRJdGVtO1xuICB9XG59XG4iXX0=
@@ -1,151 +0,0 @@
1
- import { inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject, of, Subject } from 'rxjs';
3
- import { filter, switchMap, take, takeUntil, tap } from 'rxjs/operators';
4
- import { buildQueryParams } from '../helpers/build-query-params';
5
- import { PersistanceController, QueryParamController, SavedFilterController, } from '.';
6
- import { ItemStore } from './item-store.service';
7
- import * as i0 from "@angular/core";
8
- export class ParamController {
9
- _pending$ = new BehaviorSubject(false);
10
- _config;
11
- _destroy$ = new Subject();
12
- _itemStore = inject(ItemStore);
13
- _persistanceController = inject(PersistanceController);
14
- _queryParams = inject(QueryParamController);
15
- _savedFilterController = inject(SavedFilterController);
16
- get params() {
17
- let result = {};
18
- if (this._persistanceController.queryEnabled) {
19
- result = {
20
- ...result,
21
- ...this._persistanceController.getQuery(),
22
- };
23
- }
24
- if (this._savedFilterController.enabled && this._savedFilterController.activeFilter) {
25
- const query = Object.keys(result)
26
- .filter((key) => !this._itemStore.itemNames.includes(key))
27
- .reduce((acc, key) => {
28
- return {
29
- ...acc,
30
- [key]: result[key],
31
- };
32
- }, {});
33
- result = {
34
- ...query,
35
- ...this._savedFilterController.activeFilterData,
36
- };
37
- }
38
- else if (this._queryParams.enabled) {
39
- result = {
40
- ...result,
41
- ...this._queryParams.params,
42
- };
43
- }
44
- return result;
45
- }
46
- get pending() {
47
- return this._pending$.getValue();
48
- }
49
- get pending$() {
50
- return this._pending$.asObservable();
51
- }
52
- ngOnDestroy() {
53
- this._destroy$.next(null);
54
- this._destroy$.complete();
55
- }
56
- setConfig(config) {
57
- this._config = config;
58
- this._initQueryParams();
59
- this._initSavedFilters();
60
- this.initItems();
61
- }
62
- reloadFiltersWithValues(params) {
63
- this._itemStore.updateItemsWithValues(params);
64
- this._saveQueryParams();
65
- this._savePersistedParams();
66
- }
67
- initItems() {
68
- of(null)
69
- .pipe(tap(() => this._pending$.next(true)), switchMap(() => this._savedFilterController.load()), takeUntil(this._destroy$))
70
- .subscribe(() => {
71
- this._initItemsValues();
72
- this._pending$.next(false);
73
- this._listenItemsChange();
74
- this._listenSavedFilterChange();
75
- });
76
- }
77
- _initItemsValues() {
78
- this._itemStore.init(this.params);
79
- this._saveQueryParams();
80
- this._savePersistedParams();
81
- }
82
- fetchQueryParams() {
83
- this._initQueryParams();
84
- this._itemStore.updateItemsWithValues(this.params);
85
- }
86
- _initQueryParams() {
87
- this._queryParams.init(this._config.queryParam);
88
- }
89
- _initSavedFilters() {
90
- this._savedFilterController.init(this._config.savedFilters);
91
- }
92
- _listenSavedFilterChange() {
93
- this._savedFilterController.activeFilter$
94
- .pipe(takeUntil(this._destroy$))
95
- .subscribe((savedFilter) => {
96
- if (savedFilter) {
97
- this.reloadFiltersWithValues(savedFilter.filters);
98
- }
99
- else {
100
- this._itemStore.filtersClear();
101
- }
102
- });
103
- }
104
- _listenItemsChange() {
105
- this._itemStore.ready$
106
- .pipe(filter((v) => v), take(1), takeUntil(this._destroy$))
107
- .subscribe(() => {
108
- this._saveQueryParams();
109
- this._savePersistedParams();
110
- });
111
- this._itemStore
112
- .itemsChange$
113
- .pipe(takeUntil(this._destroy$))
114
- .subscribe(() => {
115
- this._saveQueryParams();
116
- this._savePersistedParams();
117
- });
118
- }
119
- _saveQueryParams() {
120
- const params = buildQueryParams(this._itemStore
121
- .valuesAsQuery({
122
- onlyPresented: false,
123
- items: this._itemStore.items,
124
- persisted: true,
125
- }), this._itemStore.items);
126
- this._itemStore.items
127
- .filter((item) => item.queryParamsDisabled || !item.isQueryParamVisible)
128
- .forEach((item) => {
129
- params[item.name] = undefined;
130
- });
131
- this._queryParams.writeStateToQueryParams(params);
132
- }
133
- _savePersistedParams() {
134
- if (this._persistanceController.queryEnabled) {
135
- const targetItems = this._itemStore.items
136
- .filter((item) => !item.persistanceDisabled)
137
- .filter((item) => item.value !== undefined)
138
- .reduce((acc, item) => {
139
- acc[item.name] = item.model;
140
- return acc;
141
- }, {});
142
- this._persistanceController.setQuery(targetItems);
143
- }
144
- }
145
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ParamController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
146
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ParamController });
147
- }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ParamController, decorators: [{
149
- type: Injectable
150
- }] });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW0tY29udHJvbGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9zZXJ2aWNlcy9wYXJhbS1jb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJakUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sR0FBRyxDQUFDO0FBQ1gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUlqRCxNQUFNLE9BQU8sZUFBZTtJQUVsQixTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsT0FBTyxDQUFpQjtJQUN4QixTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNoQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELFlBQVksR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM1QyxzQkFBc0IsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUUvRCxJQUFXLE1BQU07UUFDZixJQUFJLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFMUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxFQUFFLENBQUM7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QUksQ0FBQyxVQUFVLENBQUMsS0FBSztpQkFDdEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztpQkFDM0MsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztpQkFDMUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBRTVCLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQzt3R0FoTFUsZUFBZTs0R0FBZixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBidWlsZFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vaGVscGVycy9idWlsZC1xdWVyeS1wYXJhbXMnO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2ZpbHRlci1jb25maWcnO1xuXG5pbXBvcnQge1xuICBQZXJzaXN0YW5jZUNvbnRyb2xsZXIsXG4gIFF1ZXJ5UGFyYW1Db250cm9sbGVyLFxuICBTYXZlZEZpbHRlckNvbnRyb2xsZXIsXG59IGZyb20gJy4nO1xuaW1wb3J0IHsgSXRlbVN0b3JlIH0gZnJvbSAnLi9pdGVtLXN0b3JlLnNlcnZpY2UnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQYXJhbUNvbnRyb2xsZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX3BlbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaXRlbVN0b3JlID0gaW5qZWN0KEl0ZW1TdG9yZSk7XG4gIHByaXZhdGUgX3BlcnNpc3RhbmNlQ29udHJvbGxlciA9IGluamVjdChQZXJzaXN0YW5jZUNvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9xdWVyeVBhcmFtcyA9IGluamVjdChRdWVyeVBhcmFtQ29udHJvbGxlcik7XG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyQ29udHJvbGxlciA9IGluamVjdChTYXZlZEZpbHRlckNvbnRyb2xsZXIpO1xuXG4gIHB1YmxpYyBnZXQgcGFyYW1zKCk6IEtleVZhbHVlIHtcbiAgICBsZXQgcmVzdWx0OiBLZXlWYWx1ZSA9IHt9O1xuXG4gICAgaWYgKHRoaXMuX3BlcnNpc3RhbmNlQ29udHJvbGxlci5xdWVyeUVuYWJsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgLi4ucmVzdWx0LCBcbiAgICAgICAgLi4udGhpcy5fcGVyc2lzdGFuY2VDb250cm9sbGVyLmdldFF1ZXJ5KCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zYXZlZEZpbHRlckNvbnRyb2xsZXIuZW5hYmxlZCAmJiB0aGlzLl9zYXZlZEZpbHRlckNvbnRyb2xsZXIuYWN0aXZlRmlsdGVyKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5rZXlzKHJlc3VsdClcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiAhdGhpcy5faXRlbVN0b3JlLml0ZW1OYW1lcy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICBba2V5XTogcmVzdWx0W2tleV0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIC4uLnF1ZXJ5LCBcbiAgICAgICAgLi4udGhpcy5fc2F2ZWRGaWx0ZXJDb250cm9sbGVyLmFjdGl2ZUZpbHRlckRhdGEsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcXVlcnlQYXJhbXMuZW5hYmxlZCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAuLi5yZXN1bHQsIFxuICAgICAgICAuLi50aGlzLl9xdWVyeVBhcmFtcy5wYXJhbXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmckLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgIHRoaXMuX2luaXRRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX2luaXRTYXZlZEZpbHRlcnMoKTtcbiAgICB0aGlzLmluaXRJdGVtcygpO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZEZpbHRlcnNXaXRoVmFsdWVzKHBhcmFtczogS2V5VmFsdWUpIHtcbiAgICB0aGlzLl9pdGVtU3RvcmUudXBkYXRlSXRlbXNXaXRoVmFsdWVzKHBhcmFtcyk7XG5cbiAgICB0aGlzLl9zYXZlUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLl9zYXZlUGVyc2lzdGVkUGFyYW1zKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKCk6IHZvaWQge1xuICAgIG9mKG51bGwpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3BlbmRpbmckLm5leHQodHJ1ZSkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fc2F2ZWRGaWx0ZXJDb250cm9sbGVyLmxvYWQoKSApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2luaXRJdGVtc1ZhbHVlcygpO1xuICAgICAgICB0aGlzLl9wZW5kaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuSXRlbXNDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuU2F2ZWRGaWx0ZXJDaGFuZ2UoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF9pbml0SXRlbXNWYWx1ZXMoKSB7XG4gICAgdGhpcy5faXRlbVN0b3JlLmluaXQodGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaFF1ZXJ5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRRdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuX2l0ZW1TdG9yZS51cGRhdGVJdGVtc1dpdGhWYWx1ZXModGhpcy5wYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFF1ZXJ5UGFyYW1zKCkge1xuICAgIHRoaXMuX3F1ZXJ5UGFyYW1zLmluaXQodGhpcy5fY29uZmlnLnF1ZXJ5UGFyYW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFNhdmVkRmlsdGVycygpIHtcbiAgICB0aGlzLl9zYXZlZEZpbHRlckNvbnRyb2xsZXIuaW5pdCh0aGlzLl9jb25maWcuc2F2ZWRGaWx0ZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlblNhdmVkRmlsdGVyQ2hhbmdlKCkge1xuICAgIHRoaXMuX3NhdmVkRmlsdGVyQ29udHJvbGxlci5hY3RpdmVGaWx0ZXIkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHNhdmVkRmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChzYXZlZEZpbHRlcikge1xuICAgICAgICAgIHRoaXMucmVsb2FkRmlsdGVyc1dpdGhWYWx1ZXMoc2F2ZWRGaWx0ZXIuZmlsdGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faXRlbVN0b3JlLmZpbHRlcnNDbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3Rlbkl0ZW1zQ2hhbmdlKCkge1xuICAgIHRoaXMuX2l0ZW1TdG9yZS5yZWFkeSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHYpID0+IHYpLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVRdWVyeVBhcmFtcygpO1xuICAgICAgICB0aGlzLl9zYXZlUGVyc2lzdGVkUGFyYW1zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2l0ZW1TdG9yZVxuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVF1ZXJ5UGFyYW1zKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IGJ1aWxkUXVlcnlQYXJhbXMoXG4gICAgICB0aGlzLl9pdGVtU3RvcmVcbiAgICAgICAgLnZhbHVlc0FzUXVlcnkoe1xuICAgICAgICAgIG9ubHlQcmVzZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgIGl0ZW1zOiB0aGlzLl9pdGVtU3RvcmUuaXRlbXMsXG4gICAgICAgICAgcGVyc2lzdGVkOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIHRoaXMuX2l0ZW1TdG9yZS5pdGVtcyxcbiAgICApO1xuICAgXG4gICAgdGhpcy5faXRlbVN0b3JlLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnF1ZXJ5UGFyYW1zRGlzYWJsZWQgfHwgIWl0ZW0uaXNRdWVyeVBhcmFtVmlzaWJsZSlcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHBhcmFtc1tpdGVtLm5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9xdWVyeVBhcmFtcy53cml0ZVN0YXRlVG9RdWVyeVBhcmFtcyhwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVBlcnNpc3RlZFBhcmFtcygpIHtcbiAgICBpZih0aGlzLl9wZXJzaXN0YW5jZUNvbnRyb2xsZXIucXVlcnlFbmFibGVkKSB7XG4gICAgICBjb25zdCB0YXJnZXRJdGVtcyA9IHRoaXMuX2l0ZW1TdG9yZS5pdGVtc1xuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5wZXJzaXN0YW5jZURpc2FibGVkKVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICAgIGFjY1tpdGVtLm5hbWVdID0gaXRlbS5tb2RlbDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgdGhpcy5fcGVyc2lzdGFuY2VDb250cm9sbGVyLnNldFF1ZXJ5KHRhcmdldEl0ZW1zKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==