@libs-ui/components-list 0.2.36

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 (33) hide show
  1. package/README.md +3 -0
  2. package/defines/list.define.d.ts +6 -0
  3. package/esm2022/defines/list.define.mjs +66 -0
  4. package/esm2022/highlight-key-search/highlight-key-search.directive.mjs +82 -0
  5. package/esm2022/index.mjs +3 -0
  6. package/esm2022/interfaces/config-item.interface.mjs +2 -0
  7. package/esm2022/interfaces/data-emit.interface.mjs +3 -0
  8. package/esm2022/interfaces/function-control-event.interface.mjs +2 -0
  9. package/esm2022/interfaces/index.mjs +6 -0
  10. package/esm2022/interfaces/tab.interface.mjs +2 -0
  11. package/esm2022/interfaces/templates-type.type.mjs +2 -0
  12. package/esm2022/libs-ui-components-list.mjs +5 -0
  13. package/esm2022/list.component.mjs +329 -0
  14. package/esm2022/pipes/call-function-in-template.pipe.mjs +28 -0
  15. package/esm2022/pipes/check-selected-by-key.pipe.mjs +21 -0
  16. package/esm2022/templates/templates.component.abstract.mjs +336 -0
  17. package/esm2022/templates/text/text.component.mjs +233 -0
  18. package/fesm2022/libs-ui-components-list.mjs +1077 -0
  19. package/fesm2022/libs-ui-components-list.mjs.map +1 -0
  20. package/highlight-key-search/highlight-key-search.directive.d.ts +13 -0
  21. package/index.d.ts +2 -0
  22. package/interfaces/config-item.interface.d.ts +225 -0
  23. package/interfaces/data-emit.interface.d.ts +10 -0
  24. package/interfaces/function-control-event.interface.d.ts +9 -0
  25. package/interfaces/index.d.ts +5 -0
  26. package/interfaces/tab.interface.d.ts +4 -0
  27. package/interfaces/templates-type.type.d.ts +1 -0
  28. package/list.component.d.ts +93 -0
  29. package/package.json +25 -0
  30. package/pipes/call-function-in-template.pipe.d.ts +8 -0
  31. package/pipes/check-selected-by-key.pipe.d.ts +7 -0
  32. package/templates/templates.component.abstract.d.ts +93 -0
  33. package/templates/text/text.component.d.ts +24 -0
@@ -0,0 +1,336 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @angular-eslint/use-lifecycle-interface */
3
+ import { Directive, inject, input, model, output, signal, viewChild } from "@angular/core";
4
+ import { LibsUiHttpRequestService } from "@libs-ui/services-http-request";
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { interval, Subject } from 'rxjs';
7
+ import { skipWhile, take, takeUntil } from 'rxjs/operators';
8
+ import { getFieldKeyByType } from "../defines/list.define";
9
+ import * as i0 from "@angular/core";
10
+ export class LibsUiComponentsListTemplatesComponentAbstract {
11
+ /* PROPERTY */
12
+ loading = signal(true);
13
+ heightViewPort = signal(0);
14
+ store = signal([]);
15
+ items = signal([]);
16
+ loadedLastItem = signal(false);
17
+ hasScroll = signal(false);
18
+ fieldKeyDefault = signal('id');
19
+ fieldKey = signal('id');
20
+ timeAutoScrollItemSelected = signal(0);
21
+ pagingStore = signal(undefined);
22
+ heightItem = signal(0);
23
+ timeIntervalIntervalSetHeightViewPort = signal(0);
24
+ timeIntervalCheckScroll = signal(250);
25
+ onDestroy = new Subject();
26
+ intervalSetHeightViewPortSubscription;
27
+ intervalCheckScrollSubscription;
28
+ /* INPUT */
29
+ functionCustomAddDataToStore = input();
30
+ functionGetItemAutoAddList = input();
31
+ paddingLeftItem = input(undefined);
32
+ maxItemShow = input(0);
33
+ searchConfig = input();
34
+ config = input();
35
+ keySearch = model('');
36
+ dropdownTabKeyActive = input();
37
+ isSearchOnline = input(false);
38
+ onSearch = input();
39
+ onRefresh = input();
40
+ onSetHiddenItemByKey = input();
41
+ onRemoveItems = input();
42
+ onSetDataStore = input();
43
+ onUpdateMultiKeySelectedGroup = input();
44
+ onItemChangeUnSelect = input();
45
+ clickExactly = input();
46
+ keySelected = model(); // sử dụng cho type radio,text.
47
+ multiKeySelected = model(); // sử dụng cho type cho phép chọn nhiều.
48
+ keysDisableItem = input();
49
+ keysHiddenItem = model();
50
+ disable = input();
51
+ disableLabel = input();
52
+ zIndex = input();
53
+ loadingIconSize = input();
54
+ resetKeyWhenSelectAllKeyDropdown = input();
55
+ ignoreClassDisableDefaultWhenUseKeysDisableItem = input(); // bỏ chế độ disable item trên html để disable từng phần trong rows
56
+ templateRefSearchNoData = input(undefined);
57
+ /* OUTPUT */
58
+ outSortSingleSelect = output();
59
+ outSelectKey = output(); // sử dụng cho type radio,text.
60
+ outSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
61
+ outUnSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
62
+ outFieldKey = output();
63
+ outChangeView = output();
64
+ outLoading = output();
65
+ outChangStageFlagMousePopover = output();
66
+ outLoadItemsComplete = output();
67
+ /* VIEW CHILD */
68
+ itemRef = viewChild('itemRef');
69
+ /* INJECT */
70
+ translateService = inject(TranslateService);
71
+ httpRequestService = inject(LibsUiHttpRequestService);
72
+ constructor() {
73
+ this.outLoading.emit(this.loading());
74
+ }
75
+ ngOnInit() {
76
+ this.onSearch()?.pipe(takeUntil(this.onDestroy)).subscribe((keySearch) => {
77
+ this.keySearch.set(keySearch);
78
+ // if (this.elementScroll) {
79
+ // this.elementScroll.scrollTop = 0;
80
+ // }
81
+ this.processSearch();
82
+ });
83
+ this.onRefresh()?.pipe(skipWhile(() => this.loading()), takeUntil(this.onDestroy)).subscribe(() => {
84
+ if (this.dropdownTabKeyActive()) {
85
+ this.items.set([]);
86
+ this.store.set([]);
87
+ }
88
+ this.callApiByService(true);
89
+ });
90
+ this.onItemChangeUnSelect()?.pipe(takeUntil(this.onDestroy)).subscribe((item) => {
91
+ if (!item) {
92
+ return;
93
+ }
94
+ this.processKeyChangeUnSelect(item);
95
+ });
96
+ this.onSetDataStore()?.pipe(takeUntil(this.onDestroy)).subscribe((data) => {
97
+ console.log('vaoday', data);
98
+ this.setDataStore(data);
99
+ });
100
+ this.onSetHiddenItemByKey()?.pipe(takeUntil(this.onDestroy)).subscribe(this.setHiddenItemByKey.bind(this));
101
+ this.outFieldKey.emit(getFieldKeyByType(this.config(), this.fieldKeyDefault()));
102
+ this.onRemoveItems()?.pipe(takeUntil(this.onDestroy)).subscribe(this.removeItems.bind(this));
103
+ }
104
+ setDataStore(data) {
105
+ if (!data || !data.length) {
106
+ return;
107
+ }
108
+ if (this.config()?.type === 'checkbox') {
109
+ data.forEach(item => (item.isAddNew = true));
110
+ }
111
+ this.functionCustomAddDataToStore()?.(data, this.store());
112
+ if (!this.functionCustomAddDataToStore()) {
113
+ this.store.update(items => {
114
+ return [...data, ...items];
115
+ });
116
+ }
117
+ this.processData();
118
+ }
119
+ getFieldKey() {
120
+ let fieldKey;
121
+ switch (this.config()?.type) {
122
+ case 'group':
123
+ fieldKey = this.config()?.configTemplateGroup?.fieldKey;
124
+ break;
125
+ case 'tag':
126
+ fieldKey = this.config()?.configTemplateTag?.fieldKey;
127
+ break;
128
+ case 'text':
129
+ fieldKey = this.config()?.configTemplateText?.fieldKey;
130
+ break;
131
+ case 'checkbox':
132
+ fieldKey = this.config()?.configTemplateCheckbox?.fieldKey;
133
+ break;
134
+ case 'radio':
135
+ fieldKey = this.config()?.configTemplateRadio?.fieldKey;
136
+ break;
137
+ }
138
+ return fieldKey || 'id';
139
+ }
140
+ removeItems(keys) {
141
+ const fieldKey = this.getFieldKey();
142
+ [this.store(), this.items()].forEach(element => {
143
+ if (this.config()?.type === 'group') {
144
+ element.forEach(item => {
145
+ this.removeItem(item[this.config()?.configTemplateGroup?.fieldGetItems || 'items'], keys, fieldKey);
146
+ });
147
+ return;
148
+ }
149
+ this.removeItem(element, keys, fieldKey);
150
+ });
151
+ this.processData();
152
+ }
153
+ removeItem(data, keys, fieldKey) {
154
+ if (!data || !data.length) {
155
+ return;
156
+ }
157
+ keys.forEach(key => {
158
+ const index = data.findIndex(item => item[fieldKey] === key);
159
+ if (index > -1) {
160
+ data.splice(index, 1);
161
+ }
162
+ });
163
+ }
164
+ setHeightViewPort(callBackCalculatorHeightSuccess) {
165
+ console.log('setHeightViewPort');
166
+ const lengthItems = this.getLengthItem();
167
+ if (!lengthItems) {
168
+ this.outChangeView.emit([...this.items()]);
169
+ if (this.heightItem()) {
170
+ this.heightViewPort.set(this.heightItem());
171
+ }
172
+ callBackCalculatorHeightSuccess?.();
173
+ return;
174
+ }
175
+ console.log('this.maxItemShow()', this.maxItemShow(), lengthItems);
176
+ const heightViewPort = this.getHeightGroupHasLine() + (lengthItems < this.maxItemShow() ? lengthItems * this.heightItem() : this.maxItemShow() * this.heightItem()) + (this.config()?.configTemplateGroup?.configCheckboxCheckAll ? 27 : 0) + (this.config()?.configTemplateGroup?.configButtonSelectAndUndSelectItem ? 27 : 0);
177
+ if (!this.maxItemShow()) {
178
+ this.heightViewPort.set(0);
179
+ }
180
+ if (this.heightItem() > 13) {
181
+ if (heightViewPort && heightViewPort !== this.heightViewPort()) {
182
+ this.heightViewPort.set(heightViewPort);
183
+ }
184
+ this.outChangeView.emit([...this.items()]);
185
+ callBackCalculatorHeightSuccess?.();
186
+ return;
187
+ }
188
+ this.intervalSetHeightViewPortSubscription?.unsubscribe();
189
+ this.intervalSetHeightViewPortSubscription = interval(this.timeIntervalIntervalSetHeightViewPort()).pipe(takeUntil(this.onDestroy)).subscribe(() => {
190
+ if (!this.itemRef() || !this.itemRef()?.nativeElement) {
191
+ return;
192
+ }
193
+ this.heightItem.set(this.itemRef()?.nativeElement.getBoundingClientRect().height);
194
+ if (this.heightItem() < 13) {
195
+ return;
196
+ }
197
+ this.intervalSetHeightViewPortSubscription?.unsubscribe();
198
+ this.setHeightViewPort(callBackCalculatorHeightSuccess);
199
+ });
200
+ }
201
+ setHiddenItemByKey(keys) {
202
+ this.keysHiddenItem.set(keys);
203
+ if (this.store() && this.store().length) {
204
+ this.processData(false);
205
+ }
206
+ }
207
+ checkViewPortScroll(callBack) {
208
+ const pre = this.hasScroll();
209
+ this.intervalCheckScrollSubscription?.unsubscribe();
210
+ this.intervalCheckScrollSubscription = interval(this.timeIntervalCheckScroll()).pipe(take(5)).subscribe(() => {
211
+ this.hasScroll.set(false);
212
+ if (this.items() && !this.items().length && pre && !this.hasScroll()) {
213
+ callBack?.(pre, this.hasScroll());
214
+ this.intervalCheckScrollSubscription?.unsubscribe();
215
+ }
216
+ // if (!this.elementScroll) {
217
+ // return;
218
+ // }
219
+ // if (this.elementScroll.offsetHeight < this.elementScroll.scrollHeight) {
220
+ // this.hasScroll.set(true);
221
+ // }
222
+ callBack?.(pre, this.hasScroll());
223
+ this.intervalCheckScrollSubscription?.unsubscribe();
224
+ });
225
+ }
226
+ async callApiByService(firstCall = true) {
227
+ const config = this.config();
228
+ if (!config) {
229
+ return;
230
+ }
231
+ try {
232
+ const { httpRequestData, ignoreShowDataWhenNotSearch } = config;
233
+ if (!httpRequestData || (ignoreShowDataWhenNotSearch && !this.keySearch())) {
234
+ this.loading.set(false);
235
+ this.outLoading.emit(this.loading());
236
+ this.loadedLastItem.set(true);
237
+ if (ignoreShowDataWhenNotSearch && !this.keySearch()) {
238
+ this.items.set([]);
239
+ this.store.set([]);
240
+ this.processData(true);
241
+ }
242
+ return;
243
+ }
244
+ this.loading.set(true);
245
+ this.outLoading.emit(this.loading());
246
+ const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;
247
+ if (firstCall) {
248
+ const loadedLastItem = this.httpRequestService.updateArguments(argumentsValue, { ...this.fakeResponseApi(), dropdownTabKeyActive: this.dropdownTabKeyActive() }, this.pagingStore() || {}, this.keySearch(), this.isSearchOnline(), this.loadedLastItem(), guideAutoUpdateArgumentsValue);
249
+ this.loadedLastItem.set(loadedLastItem);
250
+ }
251
+ const result = await this.httpRequestService.callApi(httpRequestData);
252
+ this.pagingStore.set(result.paging);
253
+ if (!this.pagingStore) {
254
+ this.loadedLastItem.set(true);
255
+ }
256
+ const loadedLastItem = this.httpRequestService.updateArguments(argumentsValue, { ...result, dropdownTabKeyActive: this.dropdownTabKeyActive() }, this.pagingStore() || {}, this.keySearch(), this.isSearchOnline(), this.loadedLastItem(), guideAutoUpdateArgumentsValue);
257
+ this.loadedLastItem.set(loadedLastItem);
258
+ if (firstCall) {
259
+ this.store.set(result.data || []);
260
+ if (this.functionGetItemAutoAddList()) {
261
+ this.store.update(items => [...(this.functionGetItemAutoAddList()?.() || []), ...items]);
262
+ }
263
+ this.processData(true);
264
+ return;
265
+ }
266
+ this.store.update(items => [...items, ...result.data]);
267
+ this.processData(false);
268
+ }
269
+ catch (error) {
270
+ this.loading.set(false);
271
+ this.outLoading.emit(this.loading());
272
+ console.log(error);
273
+ }
274
+ }
275
+ fakeResponseApi() {
276
+ this.loadedLastItem.set(false);
277
+ this.pagingStore.set({});
278
+ return this.httpRequestService.fakeResponsePagingApi();
279
+ }
280
+ buildValueByConfig(item, configTemplate) {
281
+ const ref = item.ref || {};
282
+ const label = ref.label || ref.title || ref.value || ref.name || ' ';
283
+ if (typeof label === 'string') {
284
+ item.fieldLabel = this.translateService.instant(ref.label || ref.title || ref.value || ref.name || ' ');
285
+ }
286
+ if (configTemplate?.getValue) {
287
+ const value = configTemplate.getValue(ref);
288
+ item.fieldLabel = value ? this.translateService.instant(`${value}`) : '';
289
+ }
290
+ if (configTemplate?.getPopover) {
291
+ item.PopoverLabel = configTemplate?.getPopover(item);
292
+ }
293
+ if (!configTemplate?.rows) {
294
+ return item.fieldLabel;
295
+ }
296
+ let textSearch = item.fieldLabel || '';
297
+ configTemplate.rows.forEach((row, indexRow) => {
298
+ const fieldNameRow = `fieldLabelRow${indexRow}`;
299
+ item[fieldNameRow] = row.getValue && row.getValue(ref);
300
+ item[`fieldRowStylesDynamicCols${indexRow}`] = row.getRowStylesDynamicCols && row.getRowStylesDynamicCols(ref);
301
+ item[`fieldRowAvatarConfig${indexRow}`] = row.getAvatarConfig && row.getAvatarConfig(ref);
302
+ if (row.cols && row.cols.length) {
303
+ row.cols.forEach((col, indexCol) => {
304
+ const fieldNameCol = `fieldLabelCol${indexRow}${indexCol}`;
305
+ item[fieldNameCol] = col.getValue && col.getValue(ref, indexCol);
306
+ item[`fieldColPopover${indexRow}${indexCol}`] = col.getPopover && col.getPopover(ref, indexCol);
307
+ item[`fieldBadge${indexRow}${indexCol}`] = col.getConfigBadge && col.getConfigBadge(ref, indexCol);
308
+ item[`fieldColStylesDynamic${indexRow}${indexCol}`] = col.getStylesDynamicCol;
309
+ item[`fieldColButton${indexRow}${indexCol}`] = col.getButton && col.getButton(ref, indexCol);
310
+ item[`fieldColSwitch${indexRow}${indexCol}`] = col.getLabelSwitch && col.getLabelSwitch(ref, indexCol);
311
+ item[`fieldColAvatarConfig${indexRow}${indexCol}`] = col.getAvatarConfig && col.getAvatarConfig(ref);
312
+ textSearch = ` ${textSearch} ${item[fieldNameCol] || ''} `;
313
+ });
314
+ }
315
+ textSearch = ` ${textSearch} ${item[fieldNameRow] || ''} `;
316
+ });
317
+ return textSearch || ' ';
318
+ }
319
+ handlerChangStageFlagMouse(flag) {
320
+ this.outChangStageFlagMousePopover.emit(flag);
321
+ }
322
+ getHeightGroupHasLine() {
323
+ return 0;
324
+ }
325
+ ngOnDestroy() {
326
+ clearTimeout(this.timeAutoScrollItemSelected());
327
+ this.onDestroy.next();
328
+ this.onDestroy.complete();
329
+ }
330
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListTemplatesComponentAbstract, deps: [], target: i0.ɵɵFactoryTarget.Directive });
331
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.13", type: LibsUiComponentsListTemplatesComponentAbstract, inputs: { functionCustomAddDataToStore: { classPropertyName: "functionCustomAddDataToStore", publicName: "functionCustomAddDataToStore", isSignal: true, isRequired: false, transformFunction: null }, functionGetItemAutoAddList: { classPropertyName: "functionGetItemAutoAddList", publicName: "functionGetItemAutoAddList", isSignal: true, isRequired: false, transformFunction: null }, paddingLeftItem: { classPropertyName: "paddingLeftItem", publicName: "paddingLeftItem", isSignal: true, isRequired: false, transformFunction: null }, maxItemShow: { classPropertyName: "maxItemShow", publicName: "maxItemShow", isSignal: true, isRequired: false, transformFunction: null }, searchConfig: { classPropertyName: "searchConfig", publicName: "searchConfig", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, keySearch: { classPropertyName: "keySearch", publicName: "keySearch", isSignal: true, isRequired: false, transformFunction: null }, dropdownTabKeyActive: { classPropertyName: "dropdownTabKeyActive", publicName: "dropdownTabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, onSearch: { classPropertyName: "onSearch", publicName: "onSearch", isSignal: true, isRequired: false, transformFunction: null }, onRefresh: { classPropertyName: "onRefresh", publicName: "onRefresh", isSignal: true, isRequired: false, transformFunction: null }, onSetHiddenItemByKey: { classPropertyName: "onSetHiddenItemByKey", publicName: "onSetHiddenItemByKey", isSignal: true, isRequired: false, transformFunction: null }, onRemoveItems: { classPropertyName: "onRemoveItems", publicName: "onRemoveItems", isSignal: true, isRequired: false, transformFunction: null }, onSetDataStore: { classPropertyName: "onSetDataStore", publicName: "onSetDataStore", isSignal: true, isRequired: false, transformFunction: null }, onUpdateMultiKeySelectedGroup: { classPropertyName: "onUpdateMultiKeySelectedGroup", publicName: "onUpdateMultiKeySelectedGroup", isSignal: true, isRequired: false, transformFunction: null }, onItemChangeUnSelect: { classPropertyName: "onItemChangeUnSelect", publicName: "onItemChangeUnSelect", isSignal: true, isRequired: false, transformFunction: null }, clickExactly: { classPropertyName: "clickExactly", publicName: "clickExactly", isSignal: true, isRequired: false, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: false, transformFunction: null }, multiKeySelected: { classPropertyName: "multiKeySelected", publicName: "multiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, keysDisableItem: { classPropertyName: "keysDisableItem", publicName: "keysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, keysHiddenItem: { classPropertyName: "keysHiddenItem", publicName: "keysHiddenItem", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, loadingIconSize: { classPropertyName: "loadingIconSize", publicName: "loadingIconSize", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKeyDropdown: { classPropertyName: "resetKeyWhenSelectAllKeyDropdown", publicName: "resetKeyWhenSelectAllKeyDropdown", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "ignoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, templateRefSearchNoData: { classPropertyName: "templateRefSearchNoData", publicName: "templateRefSearchNoData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySearch: "keySearchChange", keySelected: "keySelectedChange", multiKeySelected: "multiKeySelectedChange", keysHiddenItem: "keysHiddenItemChange", outSortSingleSelect: "outSortSingleSelect", outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outUnSelectMultiKey: "outUnSelectMultiKey", outFieldKey: "outFieldKey", outChangeView: "outChangeView", outLoading: "outLoading", outChangStageFlagMousePopover: "outChangStageFlagMousePopover", outLoadItemsComplete: "outLoadItemsComplete" }, viewQueries: [{ propertyName: "itemRef", first: true, predicate: ["itemRef"], descendants: true, isSignal: true }], ngImport: i0 });
332
+ }
333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsListTemplatesComponentAbstract, decorators: [{
334
+ type: Directive
335
+ }], ctorParameters: () => [] });
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmNvbXBvbmVudC5hYnN0cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9saXN0L3NyYy90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudC5hYnN0cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsNERBQTREO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLL0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUszRCxNQUFNLE9BQWdCLDhDQUE4QztJQUNsRSxjQUFjO0lBQ0osT0FBTyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNoQyxjQUFjLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssR0FBRyxNQUFNLENBQWEsRUFBRSxDQUFDLENBQUM7SUFDL0IsS0FBSyxHQUFHLE1BQU0sQ0FBYSxFQUFFLENBQUMsQ0FBQztJQUMvQixjQUFjLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDbkMsZUFBZSxHQUFHLE1BQU0sQ0FBUyxJQUFJLENBQUMsQ0FBQztJQUN2QyxR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QU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUdELFdBQVc7UUFDVCxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0E5WG1CLDhDQUE4Qzs0RkFBOUMsOENBQThDOzs0RkFBOUMsOENBQThDO2tCQURuRSxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3VzZS1saWZlY3ljbGUtaW50ZXJmYWNlICovXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IElTb3J0IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zb3J0XCI7XG5pbXBvcnQgeyBJSW5wdXRTZWFyY2hDb25maWcgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoXCI7XG5pbXBvcnQgeyBJRmxhZ01vdXNlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3ZlclwiO1xuaW1wb3J0IHsgSVBhZ2luZywgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSBcIkBsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdFwiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2tpcFdoaWxlLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRGaWVsZEtleUJ5VHlwZSB9IGZyb20gXCIuLi9kZWZpbmVzL2xpc3QuZGVmaW5lXCI7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0S2V5LCBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgSUxpc3RWaWV3Q29uZmlnSXRlbSwgSUxpc3RWaWV3Q29uZmlnSXRlbUNoZWNrYm94LCBJTGlzdFZpZXdDb25maWdJdGVtUmFkaW8sIElMaXN0Vmlld0NvbmZpZ0l0ZW1UZXh0IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvY29uZmlnLWl0ZW0uaW50ZXJmYWNlXCI7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNMaXN0VGVtcGxhdGVzQ29tcG9uZW50QWJzdHJhY3QgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIGhlaWdodFZpZXdQb3J0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBzdG9yZSA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBpdGVtcyA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBsb2FkZWRMYXN0SXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBoYXNTY3JvbGwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgZmllbGRLZXlEZWZhdWx0ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByb3RlY3RlZCBmaWVsZEtleSA9IHNpZ25hbDxzdHJpbmc+KCdpZCcpO1xuICBwcm90ZWN0ZWQgdGltZUF1dG9TY3JvbGxJdGVtU2VsZWN0ZWQgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgcHJvdGVjdGVkIHBhZ2luZ1N0b3JlID0gc2lnbmFsPElQYWdpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBoZWlnaHRJdGVtID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCB0aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCB0aW1lSW50ZXJ2YWxDaGVja1Njcm9sbCA9IHNpZ25hbDxudW1iZXI+KDI1MCk7XG5cbiAgcHJvdGVjdGVkIG9uRGVzdHJveTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb3RlY3RlZCBpbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0U3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgaW50ZXJ2YWxDaGVja1Njcm9sbFN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcblxuICAvKiBJTlBVVCAqL1xuICByZWFkb25seSBmdW5jdGlvbkN1c3RvbUFkZERhdGFUb1N0b3JlID0gaW5wdXQ8KGRhdGE6IGFueSwgc3RvcmU6IGFueSkgPT4gdm9pZD4oKTtcbiAgcmVhZG9ubHkgZnVuY3Rpb25HZXRJdGVtQXV0b0FkZExpc3QgPSBpbnB1dDwoKCkgPT4gQXJyYXk8YW55PikgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHBhZGRpbmdMZWZ0SXRlbSA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TaG93ID0gaW5wdXQ8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgc2VhcmNoQ29uZmlnID0gaW5wdXQ8SUlucHV0U2VhcmNoQ29uZmlnPigpO1xuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxJTGlzdFZpZXdDb25maWdJdGVtPigpO1xuICByZWFkb25seSBrZXlTZWFyY2ggPSBtb2RlbDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZHJvcGRvd25UYWJLZXlBY3RpdmUgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGlzU2VhcmNoT25saW5lID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHJlYWRvbmx5IG9uU2VhcmNoID0gaW5wdXQ8U3ViamVjdDxzdHJpbmc+PigpO1xuICByZWFkb25seSBvblJlZnJlc2ggPSBpbnB1dDxTdWJqZWN0PHZvaWQ+PigpO1xuICByZWFkb25seSBvblNldEhpZGRlbkl0ZW1CeUtleSA9IGlucHV0PFN1YmplY3Q8QXJyYXk8dW5rbm93bj4+PigpO1xuICByZWFkb25seSBvblJlbW92ZUl0ZW1zID0gaW5wdXQ8U3ViamVjdDxBcnJheTx1bmtub3duPj4+KCk7XG4gIHJlYWRvbmx5IG9uU2V0RGF0YVN0b3JlID0gaW5wdXQ8U3ViamVjdDxBcnJheTxhbnk+Pj4oKTtcbiAgcmVhZG9ubHkgb25VcGRhdGVNdWx0aUtleVNlbGVjdGVkR3JvdXAgPSBpbnB1dDxTdWJqZWN0PHZvaWQ+PigpO1xuICByZWFkb25seSBvbkl0ZW1DaGFuZ2VVblNlbGVjdCA9IGlucHV0PFN1YmplY3Q8YW55Pj4oKTtcbiAgcmVhZG9ubHkgY2xpY2tFeGFjdGx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWQgPSBtb2RlbDx1bmtub3duPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSByYWRpbyx0ZXh0LlxuICByZWFkb25seSBtdWx0aUtleVNlbGVjdGVkID0gbW9kZWw8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkga2V5c0Rpc2FibGVJdGVtID0gaW5wdXQ8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGtleXNIaWRkZW5JdGVtID0gbW9kZWw8QXJyYXk8dW5rbm93bj4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBkaXNhYmxlTGFiZWwgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxvYWRpbmdJY29uU2l6ZSA9IGlucHV0PCdsYXJnZScgfCAnbWVkaXVtJyB8ICdzbWFsbCcgfCAnc21hbGxlcicgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IHJlc2V0S2V5V2hlblNlbGVjdEFsbEtleURyb3Bkb3duID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkPigpOyAvLyBi4buPIGNo4bq/IMSR4buZIGRpc2FibGUgaXRlbSB0csOqbiBodG1sIMSR4buDIGRpc2FibGUgdOG7q25nIHBo4bqnbiB0cm9uZyByb3dzXG4gIHJlYWRvbmx5IHRlbXBsYXRlUmVmU2VhcmNoTm9EYXRhID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXRTb3J0U2luZ2xlU2VsZWN0ID0gb3V0cHV0PElTb3J0PigpO1xuICByZWFkb25seSBvdXRTZWxlY3RLZXkgPSBvdXRwdXQ8SUxpc3REYXRhRW1pdEtleSB8IHVuZGVmaW5lZD4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgcmFkaW8sdGV4dC5cbiAgcmVhZG9ubHkgb3V0U2VsZWN0TXVsdGlLZXkgPSBvdXRwdXQ8SUxpc3REYXRhRW1pdE11bHRpS2V5PigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaG8gcGjDqXAgY2jhu41uIG5oaeG7gXUuXG4gIHJlYWRvbmx5IG91dFVuU2VsZWN0TXVsdGlLZXkgPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0RmllbGRLZXkgPSBvdXRwdXQ8dW5rbm93bj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmlldyA9IG91dHB1dDxBcnJheTxhbnk+PigpO1xuICByZWFkb25seSBvdXRMb2FkaW5nID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dExvYWRJdGVtc0NvbXBsZXRlID0gb3V0cHV0PHsgaXRlbXM6IEFycmF5PGFueT4sIHBhZ2luZz86IElQYWdpbmcgfT4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBpdGVtUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdpdGVtUmVmJyk7XG5cbiAgLyogSU5KRUNUICovXG4gIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaCgpPy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoa2V5U2VhcmNoOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMua2V5U2VhcmNoLnNldChrZXlTZWFyY2gpO1xuICAgICAgLy8gaWYgKHRoaXMuZWxlbWVudFNjcm9sbCkge1xuICAgICAgLy8gICB0aGlzLmVsZW1lbnRTY3JvbGwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMucHJvY2Vzc1NlYXJjaCgpO1xuICAgIH0pO1xuICAgIHRoaXMub25SZWZyZXNoKCk/LnBpcGUoc2tpcFdoaWxlKCgpID0+IHRoaXMubG9hZGluZygpKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB0aGlzLnN0b3JlLnNldChbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5vbkl0ZW1DaGFuZ2VVblNlbGVjdCgpPy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5wcm9jZXNzS2V5Q2hhbmdlVW5TZWxlY3QoaXRlbSk7XG4gICAgfSk7XG4gICAgdGhpcy5vblNldERhdGFTdG9yZSgpPy5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3Zhb2RheScsIGRhdGEpO1xuXG4gICAgICB0aGlzLnNldERhdGFTdG9yZShkYXRhKVxuICAgIH0pO1xuICAgIHRoaXMub25TZXRIaWRkZW5JdGVtQnlLZXkoKT8ucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUodGhpcy5zZXRIaWRkZW5JdGVtQnlLZXkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5vdXRGaWVsZEtleS5lbWl0KGdldEZpZWxkS2V5QnlUeXBlKHRoaXMuY29uZmlnKCksIHRoaXMuZmllbGRLZXlEZWZhdWx0KCkpKTtcbiAgICB0aGlzLm9uUmVtb3ZlSXRlbXMoKT8ucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUodGhpcy5yZW1vdmVJdGVtcy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXREYXRhU3RvcmUoZGF0YTogQXJyYXk8YW55Pikge1xuICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKCk/LnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWRkTmV3ID0gdHJ1ZSkpO1xuICAgIH1cbiAgICB0aGlzLmZ1bmN0aW9uQ3VzdG9tQWRkRGF0YVRvU3RvcmUoKT8uKGRhdGEsIHRoaXMuc3RvcmUoKSk7XG5cbiAgICBpZiAoIXRoaXMuZnVuY3Rpb25DdXN0b21BZGREYXRhVG9TdG9yZSgpKSB7XG4gICAgICB0aGlzLnN0b3JlLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIHJldHVybiBbLi4uZGF0YSwgLi4uaXRlbXNdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucHJvY2Vzc0RhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmllbGRLZXkoKSB7XG4gICAgbGV0IGZpZWxkS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKHRoaXMuY29uZmlnKCk/LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgZmllbGRLZXkgPSB0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy5maWVsZEtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgIGZpZWxkS2V5ID0gdGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVUYWc/LmZpZWxkS2V5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGZpZWxkS2V5ID0gdGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVUZXh0Py5maWVsZEtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgZmllbGRLZXkgPSB0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py5maWVsZEtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgZmllbGRLZXkgPSB0aGlzLmNvbmZpZygpPy5jb25maWdUZW1wbGF0ZVJhZGlvPy5maWVsZEtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkS2V5IHx8ICdpZCc7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUl0ZW1zKGtleXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgY29uc3QgZmllbGRLZXkgPSB0aGlzLmdldEZpZWxkS2V5KCk7XG5cbiAgICBbdGhpcy5zdG9yZSgpLCB0aGlzLml0ZW1zKCldLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAodGhpcy5jb25maWcoKT8udHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBlbGVtZW50LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW1bdGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uZmllbGRHZXRJdGVtcyB8fCAnaXRlbXMnXSwga2V5cywgZmllbGRLZXkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZUl0ZW0oZWxlbWVudCwga2V5cywgZmllbGRLZXkpO1xuICAgIH0pO1xuICAgIHRoaXMucHJvY2Vzc0RhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSXRlbShkYXRhOiBBcnJheTxhbnk+LCBrZXlzOiBBcnJheTx1bmtub3duPiwgZmllbGRLZXk6IHN0cmluZykge1xuICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGRhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbVtmaWVsZEtleV0gPT09IGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRIZWlnaHRWaWV3UG9ydChjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPzogKCkgPT4gdm9pZCkge1xuICAgIGNvbnNvbGUubG9nKCdzZXRIZWlnaHRWaWV3UG9ydCcpO1xuXG4gICAgY29uc3QgbGVuZ3RoSXRlbXMgPSB0aGlzLmdldExlbmd0aEl0ZW0oKTtcblxuICAgIGlmICghbGVuZ3RoSXRlbXMpIHtcbiAgICAgIHRoaXMub3V0Q2hhbmdlVmlldy5lbWl0KFsuLi50aGlzLml0ZW1zKCldKTtcbiAgICAgIGlmICh0aGlzLmhlaWdodEl0ZW0oKSkge1xuICAgICAgICB0aGlzLmhlaWdodFZpZXdQb3J0LnNldCh0aGlzLmhlaWdodEl0ZW0oKSk7XG4gICAgICB9XG4gICAgICBjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPy4oKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLm1heEl0ZW1TaG93KCknLCB0aGlzLm1heEl0ZW1TaG93KCksIGxlbmd0aEl0ZW1zKTtcblxuICAgIGNvbnN0IGhlaWdodFZpZXdQb3J0ID0gdGhpcy5nZXRIZWlnaHRHcm91cEhhc0xpbmUoKSArIChsZW5ndGhJdGVtcyA8IHRoaXMubWF4SXRlbVNob3coKSA/IGxlbmd0aEl0ZW1zICogdGhpcy5oZWlnaHRJdGVtKCkgOiB0aGlzLm1heEl0ZW1TaG93KCkgKiB0aGlzLmhlaWdodEl0ZW0oKSkgKyAodGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uY29uZmlnQ2hlY2tib3hDaGVja0FsbCA/IDI3IDogMCkgKyAodGhpcy5jb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uY29uZmlnQnV0dG9uU2VsZWN0QW5kVW5kU2VsZWN0SXRlbSA/IDI3IDogMCk7XG5cbiAgICBpZiAoIXRoaXMubWF4SXRlbVNob3coKSkge1xuICAgICAgdGhpcy5oZWlnaHRWaWV3UG9ydC5zZXQoMCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhlaWdodEl0ZW0oKSA+IDEzKSB7XG4gICAgICBpZiAoaGVpZ2h0Vmlld1BvcnQgJiYgaGVpZ2h0Vmlld1BvcnQgIT09IHRoaXMuaGVpZ2h0Vmlld1BvcnQoKSkge1xuICAgICAgICB0aGlzLmhlaWdodFZpZXdQb3J0LnNldChoZWlnaHRWaWV3UG9ydCk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dENoYW5nZVZpZXcuZW1pdChbLi4udGhpcy5pdGVtcygpXSk7XG4gICAgICBjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzPy4oKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludGVydmFsU2V0SGVpZ2h0Vmlld1BvcnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0U3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwodGhpcy50aW1lSW50ZXJ2YWxJbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0KCkpLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pdGVtUmVmKCkgfHwgIXRoaXMuaXRlbVJlZigpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGVpZ2h0SXRlbS5zZXQodGhpcy5pdGVtUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcblxuICAgICAgaWYgKHRoaXMuaGVpZ2h0SXRlbSgpIDwgMTMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnRlcnZhbFNldEhlaWdodFZpZXdQb3J0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zZXRIZWlnaHRWaWV3UG9ydChjYWxsQmFja0NhbGN1bGF0b3JIZWlnaHRTdWNjZXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRIaWRkZW5JdGVtQnlLZXkoa2V5czogQXJyYXk8dW5rbm93bj4pIHtcbiAgICB0aGlzLmtleXNIaWRkZW5JdGVtLnNldChrZXlzKTtcbiAgICBpZiAodGhpcy5zdG9yZSgpICYmIHRoaXMuc3RvcmUoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJvY2Vzc0RhdGEoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1ZpZXdQb3J0U2Nyb2xsKGNhbGxCYWNrPzogKHByZTogYm9vbGVhbiwgY3VycmVudDogYm9vbGVhbikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHByZSA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICB0aGlzLmludGVydmFsQ2hlY2tTY3JvbGxTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5pbnRlcnZhbENoZWNrU2Nyb2xsU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwodGhpcy50aW1lSW50ZXJ2YWxDaGVja1Njcm9sbCgpKS5waXBlKHRha2UoNSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuaXRlbXMoKSAmJiAhdGhpcy5pdGVtcygpLmxlbmd0aCAmJiBwcmUgJiYgIXRoaXMuaGFzU2Nyb2xsKCkpIHtcbiAgICAgICAgY2FsbEJhY2s/LihwcmUsIHRoaXMuaGFzU2Nyb2xsKCkpO1xuICAgICAgICB0aGlzLmludGVydmFsQ2hlY2tTY3JvbGxTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICAvLyBpZiAoIXRoaXMuZWxlbWVudFNjcm9sbCkge1xuICAgICAgLy8gICByZXR1cm47XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIGlmICh0aGlzLmVsZW1lbnRTY3JvbGwub2Zmc2V0SGVpZ2h0IDwgdGhpcy5lbGVtZW50U2Nyb2xsLnNjcm9sbEhlaWdodCkge1xuICAgICAgLy8gICB0aGlzLmhhc1Njcm9sbC5zZXQodHJ1ZSk7XG4gICAgICAvLyB9XG4gICAgICBjYWxsQmFjaz8uKHByZSwgdGhpcy5oYXNTY3JvbGwoKSk7XG4gICAgICB0aGlzLmludGVydmFsQ2hlY2tTY3JvbGxTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FsbEFwaUJ5U2VydmljZShmaXJzdENhbGwgPSB0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcoKTtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGh0dHBSZXF1ZXN0RGF0YSwgaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoIH0gPSBjb25maWc7XG5cbiAgICAgIGlmICghaHR0cFJlcXVlc3REYXRhIHx8IChpZ25vcmVTaG93RGF0YVdoZW5Ob3RTZWFyY2ggJiYgIXRoaXMua2V5U2VhcmNoKCkpKSB7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRydWUpO1xuICAgICAgICBpZiAoaWdub3JlU2hvd0RhdGFXaGVuTm90U2VhcmNoICYmICF0aGlzLmtleVNlYXJjaCgpKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICAgIHRoaXMuc3RvcmUuc2V0KFtdKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBodHRwUmVxdWVzdERhdGE7XG5cbiAgICAgIGlmIChmaXJzdENhbGwpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkTGFzdEl0ZW0gPSB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5mYWtlUmVzcG9uc2VBcGkoKSwgZHJvcGRvd25UYWJLZXlBY3RpdmU6IHRoaXMuZHJvcGRvd25UYWJLZXlBY3RpdmUoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCkgfHwge30sIHRoaXMua2V5U2VhcmNoKCksIHRoaXMuaXNTZWFyY2hPbmxpbmUoKSwgdGhpcy5sb2FkZWRMYXN0SXRlbSgpLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGxvYWRlZExhc3RJdGVtKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkoaHR0cFJlcXVlc3REYXRhKTtcblxuICAgICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQocmVzdWx0LnBhZ2luZyk7XG4gICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRMYXN0SXRlbS5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkZWRMYXN0SXRlbSA9IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIGRyb3Bkb3duVGFiS2V5QWN0aXZlOiB0aGlzLmRyb3Bkb3duVGFiS2V5QWN0aXZlKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpIHx8IHt9LCB0aGlzLmtleVNlYXJjaCgpLCB0aGlzLmlzU2VhcmNoT25saW5lKCksIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuXG4gICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChsb2FkZWRMYXN0SXRlbSk7XG5cbiAgICAgIGlmIChmaXJzdENhbGwpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5zZXQocmVzdWx0LmRhdGEgfHwgW10pO1xuICAgICAgICBpZiAodGhpcy5mdW5jdGlvbkdldEl0ZW1BdXRvQWRkTGlzdCgpKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS51cGRhdGUoaXRlbXMgPT4gWy4uLih0aGlzLmZ1bmN0aW9uR2V0SXRlbUF1dG9BZGRMaXN0KCk/LigpIHx8IFtdKSwgLi4uaXRlbXNdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKHRydWUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcmUudXBkYXRlKGl0ZW1zID0+IFsuLi5pdGVtcywgLi4ucmVzdWx0LmRhdGFdKTtcbiAgICAgIHRoaXMucHJvY2Vzc0RhdGEoZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmFrZVJlc3BvbnNlQXBpKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldCh7fSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRWYWx1ZUJ5Q29uZmlnKGl0ZW06IGFueSwgY29uZmlnVGVtcGxhdGU/OiBJTGlzdFZpZXdDb25maWdJdGVtVGV4dCB8IElMaXN0Vmlld0NvbmZpZ0l0ZW1SYWRpbyB8IElMaXN0Vmlld0NvbmZpZ0l0ZW1DaGVja2JveCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVmID0gaXRlbS5yZWYgfHwge307XG4gICAgY29uc3QgbGFiZWw6IHVua25vd24gPSByZWYubGFiZWwgfHwgcmVmLnRpdGxlIHx8IHJlZi52YWx1ZSB8fCByZWYubmFtZSB8fCAnICc7XG5cbiAgICBpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJykge1xuICAgICAgaXRlbS5maWVsZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocmVmLmxhYmVsIHx8IHJlZi50aXRsZSB8fCByZWYudmFsdWUgfHwgcmVmLm5hbWUgfHwgJyAnKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnVGVtcGxhdGU/LmdldFZhbHVlKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1RlbXBsYXRlLmdldFZhbHVlKHJlZik7XG5cbiAgICAgIGl0ZW0uZmllbGRMYWJlbCA9IHZhbHVlID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYCR7dmFsdWV9YCkgOiAnJztcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1RlbXBsYXRlPy5nZXRQb3BvdmVyKSB7XG4gICAgICBpdGVtLlBvcG92ZXJMYWJlbCA9IGNvbmZpZ1RlbXBsYXRlPy5nZXRQb3BvdmVyKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnVGVtcGxhdGU/LnJvd3MpIHtcbiAgICAgIHJldHVybiBpdGVtLmZpZWxkTGFiZWw7XG4gICAgfVxuICAgIGxldCB0ZXh0U2VhcmNoID0gaXRlbS5maWVsZExhYmVsIHx8ICcnO1xuXG4gICAgY29uZmlnVGVtcGxhdGUucm93cy5mb3JFYWNoKChyb3csIGluZGV4Um93KSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWVSb3cgPSBgZmllbGRMYWJlbFJvdyR7aW5kZXhSb3d9YDtcblxuICAgICAgaXRlbVtmaWVsZE5hbWVSb3ddID0gcm93LmdldFZhbHVlICYmIHJvdy5nZXRWYWx1ZShyZWYpO1xuICAgICAgaXRlbVtgZmllbGRSb3dTdHlsZXNEeW5hbWljQ29scyR7aW5kZXhSb3d9YF0gPSByb3cuZ2V0Um93U3R5bGVzRHluYW1pY0NvbHMgJiYgcm93LmdldFJvd1N0eWxlc0R5bmFtaWNDb2xzKHJlZik7XG4gICAgICBpdGVtW2BmaWVsZFJvd0F2YXRhckNvbmZpZyR7aW5kZXhSb3d9YF0gPSByb3cuZ2V0QXZhdGFyQ29uZmlnICYmIHJvdy5nZXRBdmF0YXJDb25maWcocmVmKTtcbiAgICAgIGlmIChyb3cuY29scyAmJiByb3cuY29scy5sZW5ndGgpIHtcbiAgICAgICAgcm93LmNvbHMuZm9yRWFjaCgoY29sLCBpbmRleENvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZUNvbCA9IGBmaWVsZExhYmVsQ29sJHtpbmRleFJvd30ke2luZGV4Q29sfWA7XG5cbiAgICAgICAgICBpdGVtW2ZpZWxkTmFtZUNvbF0gPSBjb2wuZ2V0VmFsdWUgJiYgY29sLmdldFZhbHVlKHJlZiwgaW5kZXhDb2wpO1xuICAgICAgICAgIGl0ZW1bYGZpZWxkQ29sUG9wb3ZlciR7aW5kZXhSb3d9JHtpbmRleENvbH1gXSA9IGNvbC5nZXRQb3BvdmVyICYmIGNvbC5nZXRQb3BvdmVyKHJlZiwgaW5kZXhDb2wpO1xuICAgICAgICAgIGl0ZW1bYGZpZWxkQmFkZ2Uke2luZGV4Um93fSR7aW5kZXhDb2x9YF0gPSBjb2wuZ2V0Q29uZmlnQmFkZ2UgJiYgY29sLmdldENvbmZpZ0JhZGdlKHJlZiwgaW5kZXhDb2wpO1xuICAgICAgICAgIGl0ZW1bYGZpZWxkQ29sU3R5bGVzRHluYW1pYyR7aW5kZXhSb3d9JHtpbmRleENvbH1gXSA9IGNvbC5nZXRTdHlsZXNEeW5hbWljQ29sO1xuICAgICAgICAgIGl0ZW1bYGZpZWxkQ29sQnV0dG9uJHtpbmRleFJvd30ke2luZGV4Q29sfWBdID0gY29sLmdldEJ1dHRvbiAmJiBjb2wuZ2V0QnV0dG9uKHJlZiwgaW5kZXhDb2wpO1xuICAgICAgICAgIGl0ZW1bYGZpZWxkQ29sU3dpdGNoJHtpbmRleFJvd30ke2luZGV4Q29sfWBdID0gY29sLmdldExhYmVsU3dpdGNoICYmIGNvbC5nZXRMYWJlbFN3aXRjaChyZWYsIGluZGV4Q29sKTtcbiAgICAgICAgICBpdGVtW2BmaWVsZENvbEF2YXRhckNvbmZpZyR7aW5kZXhSb3d9JHtpbmRleENvbH1gXSA9IGNvbC5nZXRBdmF0YXJDb25maWcgJiYgY29sLmdldEF2YXRhckNvbmZpZyhyZWYpO1xuXG4gICAgICAgICAgdGV4dFNlYXJjaCA9IGAgJHt0ZXh0U2VhcmNofSAke2l0ZW1bZmllbGROYW1lQ29sXSB8fCAnJ30gYDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0ZXh0U2VhcmNoID0gYCAke3RleHRTZWFyY2h9ICR7aXRlbVtmaWVsZE5hbWVSb3ddIHx8ICcnfSBgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRleHRTZWFyY2ggfHwgJyAnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyLmVtaXQoZmxhZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJvY2Vzc0RhdGEoaXNSZXBsYWNlPzogYm9vbGVhbik6IGFueTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByb2Nlc3NTZWFyY2goKTogYW55O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0TGVuZ3RoSXRlbSgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBnZXRIZWlnaHRHcm91cEhhc0xpbmUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJvY2Vzc0tleUNoYW5nZVVuU2VsZWN0KGl0ZW06IGFueSk6IHZvaWQ7XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZUF1dG9TY3JvbGxJdGVtU2VsZWN0ZWQoKSk7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=