@firestitch/filter 18.0.46 → 18.2.0

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 (146) hide show
  1. package/app/components/action-button/action-button.component.d.ts +1 -1
  2. package/app/components/action-kebab-actions/action-kebab-actions.component.d.ts +1 -1
  3. package/app/components/actions/actions.component.d.ts +1 -1
  4. package/app/components/filter/filter.component.d.ts +17 -25
  5. package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
  6. package/app/components/filter-chip-content/filter-chip-content.component.d.ts +1 -1
  7. package/app/components/filter-chips/filter-chips.component.d.ts +1 -1
  8. package/app/components/filter-drawer/filter-drawer.component.d.ts +18 -12
  9. package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +5 -1
  10. package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +1 -1
  11. package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +1 -1
  12. package/app/components/filters-item/base-item/base-item.component.d.ts +1 -1
  13. package/app/components/filters-item/checkbox/checkbox.component.d.ts +1 -1
  14. package/app/components/filters-item/chips/chips.component.d.ts +2 -3
  15. package/app/components/filters-item/date/date.component.d.ts +1 -1
  16. package/app/components/filters-item/date-range/date-range.component.d.ts +1 -1
  17. package/app/components/filters-item/filter-item.component.d.ts +1 -1
  18. package/app/components/filters-item/range/range.component.d.ts +1 -1
  19. package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +1 -1
  20. package/app/components/filters-item/select/groups/groups.component.d.ts +1 -1
  21. package/app/components/filters-item/select/multiple/multiple.component.d.ts +1 -1
  22. package/app/components/filters-item/select/select.component.d.ts +1 -1
  23. package/app/components/filters-item/select/simple/simple.component.d.ts +1 -1
  24. package/app/components/filters-item/text/text.component.d.ts +1 -1
  25. package/app/components/filters-item/week/week.component.d.ts +1 -1
  26. package/app/components/saved-filter/index.d.ts +1 -2
  27. package/app/components/saved-filter/saved-filter-autocomplete-chips/index.d.ts +1 -0
  28. package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +32 -0
  29. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.d.ts +1 -0
  30. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +13 -0
  31. package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +17 -10
  32. package/app/consts/filter-icon.d.ts +1 -0
  33. package/app/consts/index.d.ts +2 -0
  34. package/app/directives/focus-to-item/focus-to-item.directive.d.ts +1 -1
  35. package/app/directives/status-bar/status-bar.directive.d.ts +1 -1
  36. package/app/fs-filter.module.d.ts +30 -62
  37. package/app/helpers/build-query-params.d.ts +2 -1
  38. package/app/helpers/create-filter-item.d.ts +1 -1
  39. package/app/injectors/filter-drawer-overlay.d.ts +2 -1
  40. package/app/interfaces/external-params.interface.d.ts +2 -2
  41. package/app/interfaces/saved-filters.interface.d.ts +11 -6
  42. package/app/models/items/autocomplete/index.d.ts +1 -0
  43. package/app/models/items/autocomplete-chips-item.d.ts +1 -1
  44. package/app/models/items/base-item.d.ts +1 -1
  45. package/app/models/items/chips-item.d.ts +1 -1
  46. package/app/models/items/date/base-date-item.d.ts +1 -1
  47. package/app/models/items/date/index.d.ts +1 -0
  48. package/app/models/items/date-range/base-date-range-item.d.ts +1 -1
  49. package/app/models/items/date-range/index.d.ts +1 -0
  50. package/app/models/items/index.d.ts +17 -0
  51. package/app/models/items/select/index.d.ts +3 -0
  52. package/app/models/items/select/multiple-select-item.d.ts +3 -3
  53. package/app/models/items/select/simple-select-item.d.ts +2 -2
  54. package/app/models/items/week-item.d.ts +1 -1
  55. package/app/pipes/remove-isolate-value.pipe.d.ts +1 -1
  56. package/app/services/filter-overlay.service.d.ts +7 -11
  57. package/app/services/index.d.ts +7 -0
  58. package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -7
  59. package/app/services/param-controller.service.d.ts +30 -0
  60. package/app/services/{external-params/query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +4 -4
  61. package/app/services/query-param-controller.service.d.ts +21 -0
  62. package/app/services/{external-params/saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +17 -15
  63. package/esm2022/app/components/action-button/action-button.component.mjs +22 -7
  64. package/esm2022/app/components/action-kebab-actions/action-kebab-actions.component.mjs +13 -7
  65. package/esm2022/app/components/actions/actions.component.mjs +35 -15
  66. package/esm2022/app/components/filter/filter.component.mjs +111 -119
  67. package/esm2022/app/components/filter-chip/filter-chip.component.mjs +30 -18
  68. package/esm2022/app/components/filter-chip-content/filter-chip-content.component.mjs +3 -3
  69. package/esm2022/app/components/filter-chips/filter-chips.component.mjs +5 -5
  70. package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +70 -36
  71. package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +27 -7
  72. package/esm2022/app/components/filters-item/autocomplete/autocomplete.component.mjs +14 -6
  73. package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +14 -6
  74. package/esm2022/app/components/filters-item/base-item/base-item.component.mjs +3 -2
  75. package/esm2022/app/components/filters-item/checkbox/checkbox.component.mjs +15 -7
  76. package/esm2022/app/components/filters-item/chips/chips.component.mjs +19 -14
  77. package/esm2022/app/components/filters-item/date/date.component.mjs +19 -8
  78. package/esm2022/app/components/filters-item/date-range/date-range.component.mjs +19 -8
  79. package/esm2022/app/components/filters-item/filter-item.component.mjs +24 -14
  80. package/esm2022/app/components/filters-item/range/range.component.mjs +19 -9
  81. package/esm2022/app/components/filters-item/select/backdrop/backdrop.component.mjs +3 -3
  82. package/esm2022/app/components/filters-item/select/groups/groups.component.mjs +21 -10
  83. package/esm2022/app/components/filters-item/select/multiple/multiple.component.mjs +25 -12
  84. package/esm2022/app/components/filters-item/select/select.component.mjs +17 -9
  85. package/esm2022/app/components/filters-item/select/simple/simple.component.mjs +24 -12
  86. package/esm2022/app/components/filters-item/text/text.component.mjs +17 -9
  87. package/esm2022/app/components/filters-item/week/week.component.mjs +19 -8
  88. package/esm2022/app/components/saved-filter/index.mjs +2 -3
  89. package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/index.mjs +2 -0
  90. package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +120 -0
  91. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.mjs +2 -0
  92. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +28 -0
  93. package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +46 -31
  94. package/esm2022/app/consts/filter-icon.mjs +2 -0
  95. package/esm2022/app/consts/index.mjs +3 -0
  96. package/esm2022/app/directives/focus-to-item/focus-to-item.directive.mjs +3 -2
  97. package/esm2022/app/directives/status-bar/status-bar.directive.mjs +3 -2
  98. package/esm2022/app/fs-filter.module.mjs +31 -141
  99. package/esm2022/app/helpers/build-query-params.mjs +8 -3
  100. package/esm2022/app/helpers/compare.mjs +2 -2
  101. package/esm2022/app/injectors/filter-drawer-overlay.mjs +1 -1
  102. package/esm2022/app/interfaces/external-params.interface.mjs +1 -1
  103. package/esm2022/app/interfaces/saved-filters.interface.mjs +1 -1
  104. package/esm2022/app/models/items/autocomplete/index.mjs +2 -0
  105. package/esm2022/app/models/items/autocomplete-chips-item.mjs +4 -4
  106. package/esm2022/app/models/items/base-item.mjs +4 -4
  107. package/esm2022/app/models/items/chips-item.mjs +5 -5
  108. package/esm2022/app/models/items/date/base-date-item.mjs +9 -9
  109. package/esm2022/app/models/items/date/index.mjs +2 -0
  110. package/esm2022/app/models/items/date-range/base-date-range-item.mjs +12 -12
  111. package/esm2022/app/models/items/date-range/index.mjs +2 -0
  112. package/esm2022/app/models/items/index.mjs +18 -0
  113. package/esm2022/app/models/items/select/index.mjs +4 -0
  114. package/esm2022/app/models/items/select/multiple-select-item.mjs +17 -17
  115. package/esm2022/app/models/items/select/simple-select-item.mjs +10 -10
  116. package/esm2022/app/models/items/week-item.mjs +11 -9
  117. package/esm2022/app/pipes/remove-isolate-value.pipe.mjs +3 -2
  118. package/esm2022/app/services/filter-overlay.service.mjs +10 -21
  119. package/esm2022/app/services/index.mjs +8 -0
  120. package/esm2022/app/services/item-store.service.mjs +356 -0
  121. package/esm2022/app/services/param-controller.service.mjs +149 -0
  122. package/esm2022/app/services/persistance-controller.service.mjs +65 -0
  123. package/esm2022/app/services/query-param-controller.service.mjs +65 -0
  124. package/esm2022/app/services/saved-filter-controller.service.mjs +169 -0
  125. package/esm2022/public_api.mjs +2 -4
  126. package/fesm2022/firestitch-filter.mjs +1962 -1810
  127. package/fesm2022/firestitch-filter.mjs.map +1 -1
  128. package/package.json +1 -1
  129. package/public_api.d.ts +1 -3
  130. package/app/components/saved-filter/saved-filter-edit/index.d.ts +0 -1
  131. package/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +0 -18
  132. package/app/components/saved-filter/saved-filters-menu/index.d.ts +0 -1
  133. package/app/components/saved-filter/saved-filters-menu/saved-filters-menu.component.d.ts +0 -24
  134. package/app/services/external-params/index.d.ts +0 -3
  135. package/app/services/external-params/query-params-controller.service.d.ts +0 -21
  136. package/app/services/external-params-controller.service.d.ts +0 -38
  137. package/esm2022/app/components/saved-filter/saved-filter-edit/index.mjs +0 -2
  138. package/esm2022/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +0 -55
  139. package/esm2022/app/components/saved-filter/saved-filters-menu/index.mjs +0 -2
  140. package/esm2022/app/components/saved-filter/saved-filters-menu/saved-filters-menu.component.mjs +0 -61
  141. package/esm2022/app/services/external-params/index.mjs +0 -4
  142. package/esm2022/app/services/external-params/query-params-controller.service.mjs +0 -65
  143. package/esm2022/app/services/external-params/query-persistance-controller.service.mjs +0 -65
  144. package/esm2022/app/services/external-params/saved-filters-controller.service.mjs +0 -165
  145. package/esm2022/app/services/external-params-controller.service.mjs +0 -183
  146. package/esm2022/app/services/items-store.service.mjs +0 -345
@@ -1,345 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, forkJoin, Subject } from 'rxjs';
3
- import { debounceTime, filter, finalize, takeUntil } from 'rxjs/operators';
4
- import { pickBy } from 'lodash-es';
5
- import { ItemType } from '../enums/item-type.enum';
6
- import { createFilterItem } from '../helpers/create-filter-item';
7
- import { SortByField, SortDirectionField } from '../models/filter-config';
8
- import { BaseDateRangeItem } from '../models/items/date-range/base-date-range-item';
9
- import { RangeItem } from '../models/items/range-item';
10
- import { MultipleSelectItem } from '../models/items/select/multiple-select-item';
11
- import { SimpleSelectItem } from '../models/items/select/simple-select-item';
12
- import * as i0 from "@angular/core";
13
- export class FsFilterItemsStore {
14
- sortByItem = null;
15
- sortDirectionItem = null;
16
- keywordItem = null;
17
- filter;
18
- _ready$ = new BehaviorSubject(false);
19
- _visibleItems$ = new BehaviorSubject([]);
20
- _items = new Map();
21
- _itemsValuesLoaded = false;
22
- _hasKeyword = false;
23
- _config;
24
- _itemsChange$ = new Subject();
25
- _destroy$ = new Subject();
26
- constructor() {
27
- this._lazyInit();
28
- }
29
- get items() {
30
- return Array.from(this._items.values());
31
- }
32
- get itemNames() {
33
- return this.items.map((item) => item.name);
34
- }
35
- get visibleItems() {
36
- return this._visibleItems$.getValue();
37
- }
38
- set visibleItems(items) {
39
- this._visibleItems$.next(items);
40
- }
41
- get visibleItems$() {
42
- return this._visibleItems$.asObservable();
43
- }
44
- get hasKeyword() {
45
- return this._hasKeyword;
46
- }
47
- get itemsChange$() {
48
- return this._itemsChange$.pipe(debounceTime(30));
49
- }
50
- get ready$() {
51
- return this._ready$.asObservable();
52
- }
53
- ngOnDestroy() {
54
- this.destroyItems();
55
- this._destroy$.next(null);
56
- this._destroy$.complete();
57
- }
58
- setConfig(config) {
59
- this._config = config;
60
- this.initItems(config.items);
61
- }
62
- getItemByName(name) {
63
- return this._items.get(name);
64
- }
65
- initItems(items) {
66
- this._itemsValuesLoaded = false;
67
- if (Array.isArray(items)) {
68
- this._createItems(items);
69
- }
70
- }
71
- filtersClear() {
72
- this.items.forEach((item) => {
73
- if (item instanceof RangeItem) {
74
- item.clearRange(null, item.defaultValue);
75
- }
76
- else if (item instanceof BaseDateRangeItem) {
77
- item.clearDateRange(null, item.defaultValue);
78
- }
79
- else {
80
- item.clear(item.defaultValue);
81
- }
82
- });
83
- if (this.sortByItem) {
84
- if (this._config.sort) {
85
- this.sortByItem.model = this._config.sort.value;
86
- }
87
- else {
88
- this.sortByItem.clear(this.sortByItem.defaultValue);
89
- }
90
- }
91
- if (this.sortDirectionItem) {
92
- if (this._config.sort) {
93
- this.sortDirectionItem.model = this._config.sort.direction;
94
- }
95
- else {
96
- this.sortDirectionItem.clear(this.sortDirectionItem.defaultValue);
97
- }
98
- }
99
- this.keywordItem?.clear();
100
- }
101
- loadAsyncValues() {
102
- this.items
103
- .filter((item) => item.hasPendingValues)
104
- .forEach((item) => item.loadAsyncValues());
105
- }
106
- loadAsyncDefaults() {
107
- // default values can be asynchronous, and we must load them if there is no persisted value instead
108
- const defaultValuesToBeLoaded = this.items
109
- .filter((item) => {
110
- return item.defaultValueFn
111
- && (item.persistedValue === null || item.persistedValue === undefined);
112
- });
113
- // special hack for isolate multiple select
114
- // values for this type of select must be preloaded
115
- // Read more in class MultipleSelectItem._init()
116
- const valuesToBeLoaded = this.items
117
- .filter((item) => {
118
- return (item instanceof MultipleSelectItem) && item.hasPendingValues && item.isolate;
119
- });
120
- if (defaultValuesToBeLoaded.length > 0 || valuesToBeLoaded.length > 0) {
121
- forkJoin([
122
- ...defaultValuesToBeLoaded
123
- .map((item) => item.loadDefaultValue()),
124
- ...valuesToBeLoaded
125
- .map((item) => {
126
- item.loadAsyncValues();
127
- return item.loading$
128
- .pipe();
129
- }),
130
- ])
131
- .pipe(finalize(() => {
132
- this._ready$.next(true);
133
- }), takeUntil(this._destroy$))
134
- .subscribe();
135
- }
136
- else {
137
- this._ready$.next(true);
138
- }
139
- }
140
- getSort() {
141
- let sortBy = this.getSortByValue();
142
- sortBy = sortBy === '__all' ? null : sortBy;
143
- let sortDirection = this.getSortDirectionValue();
144
- sortDirection = sortDirection === '__all' ? null : sortDirection;
145
- return {
146
- value: sortBy,
147
- direction: sortDirection,
148
- };
149
- }
150
- getSortByValue() {
151
- return this.sortByItem ? this.sortByItem.model : null;
152
- }
153
- getSortDirectionValue() {
154
- return this.sortDirectionItem ? this.sortDirectionItem.model : null;
155
- }
156
- updateSort(sort) {
157
- if (sort.sortBy) {
158
- this.sortByItem.model = sort.sortBy;
159
- }
160
- if (sort.sortDirection) {
161
- this.sortDirectionItem.model = sort.sortDirection;
162
- }
163
- }
164
- values(onlyPresented = false) {
165
- return this.items
166
- .reduce((acc, item) => {
167
- const value = item.value;
168
- if (!onlyPresented || value !== null) {
169
- acc[item.name] = value;
170
- }
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
- updateItemsVisiblity() {
249
- this.visibleItems = this.items
250
- .filter((item) => !item.isTypeKeyword && !item.hide);
251
- }
252
- _createItems(items) {
253
- this._items = new Map(items
254
- .filter((item) => !item.disable)
255
- .filter((item) => {
256
- if (this._items.has(item.name)) {
257
- throw Error('Filter init error. Items name must be unique.');
258
- }
259
- return true;
260
- })
261
- .map((item) => {
262
- const filterItem = createFilterItem(item, {}, this.filter);
263
- if (filterItem.type === ItemType.Keyword) {
264
- this._hasKeyword = true;
265
- }
266
- this._items.set(item.name, filterItem);
267
- return [item.name, filterItem];
268
- }));
269
- this._createSortingItems();
270
- }
271
- _subscribeToItemsChanges() {
272
- this.items
273
- .forEach((item) => {
274
- item.valueChange$
275
- .pipe(takeUntil(item.destroy$))
276
- .subscribe(() => {
277
- this._itemsChange$.next(item);
278
- });
279
- });
280
- if (this._config.sortValues?.length) {
281
- this.sortByItem.valueChange$
282
- .pipe(takeUntil(this.sortByItem.destroy$))
283
- .subscribe(() => {
284
- this._itemsChange$.next(this.sortByItem);
285
- });
286
- this.sortDirectionItem.valueChange$
287
- .pipe(takeUntil(this.sortDirectionItem.destroy$))
288
- .subscribe(() => {
289
- this._itemsChange$.next(this.sortDirectionItem);
290
- });
291
- }
292
- }
293
- _lazyInit() {
294
- this.ready$
295
- .pipe(filter((state) => state), takeUntil(this._destroy$))
296
- .subscribe(() => {
297
- this.updateItemsVisiblity();
298
- this._setKeywordItem();
299
- });
300
- }
301
- _initSortingItems(p) {
302
- if (this.sortByItem && this.sortDirectionItem) {
303
- this.sortByItem.initValues(p[this.sortByItem.name]);
304
- this.sortDirectionItem.initValues(p[this.sortDirectionItem.name]);
305
- }
306
- }
307
- _createSortingItems() {
308
- if (this._config.sortValues?.length > 0) {
309
- const sortByItem = {
310
- name: SortByField,
311
- type: ItemType.Select,
312
- label: 'Sort by',
313
- values: this._config.sortValues,
314
- };
315
- if (this._config.sort && this._config.sort.value) {
316
- sortByItem.default = this._config.sort.value;
317
- }
318
- this.sortByItem = new SimpleSelectItem(sortByItem, null, this.filter);
319
- const sortDirectionItem = {
320
- name: SortDirectionField,
321
- type: ItemType.Select,
322
- label: 'Sort direction',
323
- values: [
324
- { name: 'Ascending', value: 'asc' },
325
- { name: 'Descending', value: 'desc' },
326
- ],
327
- };
328
- if (this._config.sort && this._config.sort.direction) {
329
- sortDirectionItem.default = this._config.sort.direction;
330
- }
331
- this.sortDirectionItem = new SimpleSelectItem(sortDirectionItem, null, this.filter);
332
- }
333
- }
334
- _setKeywordItem() {
335
- this.keywordItem = this
336
- .items
337
- .find((item) => item.isTypeKeyword);
338
- }
339
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
340
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore });
341
- }
342
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterItemsStore, decorators: [{
343
- type: Injectable
344
- }], ctorParameters: () => [] });
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXRELE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUduQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFTakUsT0FBTyxFQUFrQixXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBVzdFLE1BQU0sT0FBTyxrQkFBa0I7SUFFdEIsVUFBVSxHQUFnQyxJQUFJLENBQUM7SUFDL0MsaUJBQWlCLEdBQWdDLElBQUksQ0FBQztJQUN0RCxXQUFXLEdBQWEsSUFBSSxDQUFDO0lBQzdCLE1BQU0sQ0FBa0I7SUFFdkIsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLGNBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBZ0MsRUFBRSxDQUFDLENB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RCxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksZ0JBQWdCLENBQzNDLGlCQUFpQixFQUNqQixJQUFJLEVBQ0osSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSTthQUNwQixLQUFLO2FBQ0wsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFhLENBQUM7SUFDcEQsQ0FBQzt3R0FuYVUsa0JBQWtCOzRHQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IHBpY2tCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB0eXBlIHsgRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL2VudW1zL2l0ZW0tdHlwZS5lbnVtJztcbmltcG9ydCB7IGNyZWF0ZUZpbHRlckl0ZW0gfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZS1maWx0ZXItaXRlbSc7XG5pbXBvcnQge1xuICBGaWx0ZXJTb3J0LFxuICBJRmlsdGVyQ29uZmlnSXRlbSxcbiAgU29ydEl0ZW0sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dGVybmFsLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdDaGFuZ2VFdmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbXMvc2VsZWN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZywgU29ydEJ5RmllbGQsIFNvcnREaXJlY3Rpb25GaWVsZCB9IGZyb20gJy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IEJhc2VJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL2Jhc2UtaXRlbSc7XG5pbXBvcnQgeyBCYXNlRGF0ZVJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9kYXRlLXJhbmdlL2Jhc2UtZGF0ZS1yYW5nZS1pdGVtJztcbmltcG9ydCB7IFJhbmdlSXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9yYW5nZS1pdGVtJztcbmltcG9ydCB7IE11bHRpcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3QvbXVsdGlwbGUtc2VsZWN0LWl0ZW0nO1xuaW1wb3J0IHsgU2ltcGxlU2VsZWN0SXRlbSB9IGZyb20gJy4uL21vZGVscy9pdGVtcy9zZWxlY3Qvc2ltcGxlLXNlbGVjdC1pdGVtJztcbmltcG9ydCB7IFRleHRJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2l0ZW1zL3RleHQtaXRlbSc7XG5cblxuaW50ZXJmYWNlIElWYWx1ZUFzUXVlcnkge1xuICBvbmx5UHJlc2VudGVkPzogYm9vbGVhbjtcbiAgaXRlbXM/OiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT5bXTtcbiAgcGVyc2lzdGVkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZzRmlsdGVySXRlbXNTdG9yZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIHNvcnRCeUl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPiA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+ID0gbnVsbDtcbiAgcHVibGljIGtleXdvcmRJdGVtOiBUZXh0SXRlbSA9IG51bGw7XG4gIHB1YmxpYyBmaWx0ZXI6IEZpbHRlckNvbXBvbmVudDtcblxuICBwcml2YXRlIF9yZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfdmlzaWJsZUl0ZW1zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10+KFtdKTtcbiAgcHJpdmF0ZSBfaXRlbXMgPSBuZXcgTWFwPHN0cmluZywgQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+PigpO1xuXG4gIHByaXZhdGUgX2l0ZW1zVmFsdWVzTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc0tleXdvcmQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBGc0ZpbHRlckNvbmZpZztcblxuICBwcml2YXRlIF9pdGVtc0NoYW5nZSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICkge1xuICAgIHRoaXMuX2xhenlJbml0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9pdGVtcy52YWx1ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlSXRlbXMoKTogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10ge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlSXRlbXMkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZpc2libGVJdGVtcyhpdGVtczogQmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10pIHtcbiAgICB0aGlzLl92aXNpYmxlSXRlbXMkLm5leHQoaXRlbXMpO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXNpYmxlSXRlbXMkKCk6IE9ic2VydmFibGU8QmFzZUl0ZW08SUZpbHRlckNvbmZpZ0l0ZW0+W10+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUl0ZW1zJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzS2V5d29yZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzS2V5d29yZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXRlbXNDaGFuZ2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtc0NoYW5nZSQucGlwZShkZWJvdW5jZVRpbWUoMzApKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVhZHkkKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkeSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95SXRlbXMoKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaW5pdEl0ZW1zKGNvbmZpZy5pdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcy5nZXQobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5faXRlbXNWYWx1ZXNMb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUl0ZW1zKGl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEJhc2VEYXRlUmFuZ2VJdGVtKSB7XG4gICAgICAgIGl0ZW0uY2xlYXJEYXRlUmFuZ2UobnVsbCwgaXRlbS5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jbGVhcihpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIodGhpcy5zb3J0QnlJdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcih0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkSXRlbT8uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkQXN5bmNWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZEFzeW5jVmFsdWVzKCkpO1xuICB9XG5cbiAgcHVibGljIGxvYWRBc3luY0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIC8vIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBhc3luY2hyb25vdXMsIGFuZCB3ZSBtdXN0IGxvYWQgdGhlbSBpZiB0aGVyZSBpcyBubyBwZXJzaXN0ZWQgdmFsdWUgaW5zdGVhZFxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5kZWZhdWx0VmFsdWVGblxuICAgICAgICAgICYmIChpdGVtLnBlcnNpc3RlZFZhbHVlID09PSBudWxsIHx8IGl0ZW0ucGVyc2lzdGVkVmFsdWUgPT09IHVuZGVmaW5lZCk7XG4gICAgICB9KTtcblxuICAgIC8vIHNwZWNpYWwgaGFjayBmb3IgaXNvbGF0ZSBtdWx0aXBsZSBzZWxlY3RcbiAgICAvLyB2YWx1ZXMgZm9yIHRoaXMgdHlwZSBvZiBzZWxlY3QgbXVzdCBiZSBwcmVsb2FkZWRcbiAgICAvLyBSZWFkIG1vcmUgaW4gY2xhc3MgTXVsdGlwbGVTZWxlY3RJdGVtLl9pbml0KClcbiAgICBjb25zdCB2YWx1ZXNUb0JlTG9hZGVkID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0gaW5zdGFuY2VvZiBNdWx0aXBsZVNlbGVjdEl0ZW0pICYmIGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcyAmJiBpdGVtLmlzb2xhdGU7XG4gICAgICB9KTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzVG9CZUxvYWRlZC5sZW5ndGggPiAwIHx8IHZhbHVlc1RvQmVMb2FkZWQubGVuZ3RoID4gMCkge1xuICAgICAgZm9ya0pvaW4oXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5kZWZhdWx0VmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5sb2FkRGVmYXVsdFZhbHVlKCkpLFxuXG4gICAgICAgICAgLi4udmFsdWVzVG9CZUxvYWRlZFxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICBpdGVtLmxvYWRBc3luY1ZhbHVlcygpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmxvYWRpbmckXG4gICAgICAgICAgICAgICAgLnBpcGUoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeSQubmV4dCh0cnVlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZHkkLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFNvcnQoKTogRmlsdGVyU29ydCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldFNvcnRCeVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnRCeUl0ZW0gPyB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFNvcnREaXJlY3Rpb25WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSA/IHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogSVNvcnRpbmdDaGFuZ2VFdmVudCkge1xuICAgIGlmIChzb3J0LnNvcnRCeSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gc29ydC5zb3J0Qnk7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQuc29ydERpcmVjdGlvbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA9IHNvcnQuc29ydERpcmVjdGlvbjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzKG9ubHlQcmVzZW50ZWQgPSBmYWxzZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZTtcblxuICAgICAgICBpZiAoIW9ubHlQcmVzZW50ZWQgfHwgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBhY2NbaXRlbS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZXNBc1F1ZXJ5KHtcbiAgICBvbmx5UHJlc2VudGVkID0gdHJ1ZSxcbiAgICBpdGVtcyA9IG51bGwsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gIH06IElWYWx1ZUFzUXVlcnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgIChpdGVtcyB8fCB0aGlzLml0ZW1zKVxuICAgICAgLmZvckVhY2goKGZpbHRlckl0ZW06IEJhc2VJdGVtPGFueT4pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcGVyc2lzdGVkXG4gICAgICAgICAgPyBmaWx0ZXJJdGVtLnBlcnNpc3RhbmNlT2JqZWN0XG4gICAgICAgICAgOiBmaWx0ZXJJdGVtLnF1ZXJ5T2JqZWN0O1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB2YWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICBpZiAob25seVByZXNlbnRlZCkge1xuICAgICAgcmV0dXJuIHBpY2tCeShwYXJhbXMsICh2YWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHB1YmxpYyBpbml0KHA6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcyhwW2l0ZW0ubmFtZV0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9pbml0U29ydGluZ0l0ZW1zKHApO1xuICAgIHRoaXMubG9hZEFzeW5jRGVmYXVsdHMoKTtcbiAgICB0aGlzLl9zdWJzY3JpYmVUb0l0ZW1zQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zV2l0aFZhbHVlcyh2YWx1ZXM6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZXNbaXRlbS5uYW1lXSkge1xuICAgICAgICAgIGl0ZW0ubW9kZWwgPSB2YWx1ZXNbaXRlbS5uYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhclJhbmdlKG51bGwsIGl0ZW0uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBCYXNlRGF0ZVJhbmdlSXRlbSkge1xuICAgICAgICAgICAgaXRlbS5jbGVhckRhdGVSYW5nZShudWxsLCBpdGVtLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uY2xlYXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnRpbmdJdGVtc1ZhbHVlcyhpdGVtczogU29ydEl0ZW1bXSkge1xuICAgIGlmICghdGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zb3J0QnlJdGVtLnZhbHVlcyA9IGl0ZW1zO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lJdGVtcygpIHtcbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS5kZXN0cm95KCkpO1xuICAgIHRoaXMuc29ydEJ5SXRlbT8uZGVzdHJveSgpO1xuICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0/LmRlc3Ryb3koKTtcblxuICAgIHRoaXMuX2l0ZW1zLmNsZWFyKCk7XG4gICAgdGhpcy5zb3J0QnlJdGVtID0gbnVsbDtcbiAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGl0ZW1zIG1pZ2h0IG5lZWQgdG8gbG9hZCBhc3luYyB2YWx1ZXMgYmVmb3JlIHRoZXkgd2lsbCBiZSBzaG93blxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJdGVtcygpIHtcbiAgICBpZiAoIXRoaXMuX2l0ZW1zVmFsdWVzTG9hZGVkKSB7XG4gICAgICB0aGlzLl9pdGVtc1ZhbHVlc0xvYWRlZCA9IHRydWU7XG5cbiAgICAgIHRoaXMubG9hZEFzeW5jVmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUl0ZW1zVmlzaWJsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNUeXBlS2V5d29yZCAmJiAhaXRlbS5oaWRlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUl0ZW1zKGl0ZW1zOiBJRmlsdGVyQ29uZmlnSXRlbVtdKSB7XG4gICAgdGhpcy5faXRlbXMgPSBuZXcgTWFwKFxuICAgICAgaXRlbXNcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uZGlzYWJsZSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9pdGVtcy5oYXMoaXRlbS5uYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0ZpbHRlciBpbml0IGVycm9yLiBJdGVtcyBuYW1lIG11c3QgYmUgdW5pcXVlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVySXRlbSA9IGNyZWF0ZUZpbHRlckl0ZW0oaXRlbSwgeyB9LCB0aGlzLmZpbHRlcik7XG5cbiAgICAgICAgICBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5LZXl3b3JkKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNLZXl3b3JkID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9pdGVtcy5zZXQoaXRlbS5uYW1lLCBmaWx0ZXJJdGVtKTtcblxuICAgICAgICAgIHJldHVybiBbaXRlbS5uYW1lLCBmaWx0ZXJJdGVtXTtcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuX2NyZWF0ZVNvcnRpbmdJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlVG9JdGVtc0NoYW5nZXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaXRlbS52YWx1ZUNoYW5nZSRcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbChpdGVtLmRlc3Ryb3kkKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtc0NoYW5nZSQubmV4dChpdGVtKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0VmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS52YWx1ZUNoYW5nZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuc29ydEJ5SXRlbS5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXRlbXNDaGFuZ2UkLm5leHQodGhpcy5zb3J0QnlJdGVtKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0udmFsdWVDaGFuZ2UkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pdGVtc0NoYW5nZSQubmV4dCh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGF6eUluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkeSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtc1Zpc2libGl0eSgpO1xuICAgICAgICB0aGlzLl9zZXRLZXl3b3JkSXRlbSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0U29ydGluZ0l0ZW1zKHA6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0gJiYgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgdGhpcy5zb3J0QnlJdGVtLmluaXRWYWx1ZXMocFt0aGlzLnNvcnRCeUl0ZW0ubmFtZV0pO1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5pbml0VmFsdWVzKHBbdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5uYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlU29ydGluZ0l0ZW1zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb25maWcuc29ydFZhbHVlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydEJ5SXRlbSA9IHtcbiAgICAgICAgbmFtZTogU29ydEJ5RmllbGQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IGJ5JyxcbiAgICAgICAgdmFsdWVzOiB0aGlzLl9jb25maWcuc29ydFZhbHVlcyxcbiAgICAgIH0gYXMgSUZpbHRlckNvbmZpZ1NlbGVjdEl0ZW07XG5cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0ICYmIHRoaXMuX2NvbmZpZy5zb3J0LnZhbHVlKSB7XG4gICAgICAgIHNvcnRCeUl0ZW0uZGVmYXVsdCA9IHRoaXMuX2NvbmZpZy5zb3J0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnRCeUl0ZW0gPSBuZXcgU2ltcGxlU2VsZWN0SXRlbShcbiAgICAgICAgc29ydEJ5SXRlbSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5maWx0ZXIsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzb3J0RGlyZWN0aW9uSXRlbSA9IHtcbiAgICAgICAgbmFtZTogU29ydERpcmVjdGlvbkZpZWxkLFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBkaXJlY3Rpb24nLFxuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7IG5hbWU6ICdBc2NlbmRpbmcnLCB2YWx1ZTogJ2FzYycgfSxcbiAgICAgICAgICB7IG5hbWU6ICdEZXNjZW5kaW5nJywgdmFsdWU6ICdkZXNjJyB9LFxuICAgICAgICBdLFxuICAgICAgfSBhcyBJRmlsdGVyQ29uZmlnU2VsZWN0SXRlbTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5zb3J0ICYmIHRoaXMuX2NvbmZpZy5zb3J0LmRpcmVjdGlvbikge1xuICAgICAgICBzb3J0RGlyZWN0aW9uSXRlbS5kZWZhdWx0ID0gdGhpcy5fY29uZmlnLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbmV3IFNpbXBsZVNlbGVjdEl0ZW0oXG4gICAgICAgIHNvcnREaXJlY3Rpb25JdGVtLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmZpbHRlcixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0S2V5d29yZEl0ZW0oKSB7XG4gICAgdGhpcy5rZXl3b3JkSXRlbSA9IHRoaXNcbiAgICAgIC5pdGVtc1xuICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaXNUeXBlS2V5d29yZCkgYXMgVGV4dEl0ZW07XG4gIH1cbn1cbiJdfQ==