@valtimo/dossier-management 10.8.0 → 11.0.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 (56) hide show
  1. package/esm2022/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +75 -0
  2. package/{esm2020 → esm2022}/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/dossier-management-detail-container/dossier-management-detail-container.component.mjs +5 -5
  4. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +100 -0
  5. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +458 -0
  6. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +416 -0
  7. package/esm2022/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +84 -0
  8. package/esm2022/lib/dossier-management-list/dossier-management-list.component.mjs +75 -0
  9. package/esm2022/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +59 -0
  10. package/{esm2020 → esm2022}/lib/dossier-management-routing.module.mjs +5 -5
  11. package/{esm2020 → esm2022}/lib/dossier-management-upload/dossier-management-upload.component.mjs +5 -5
  12. package/esm2022/lib/dossier-management.module.mjs +167 -0
  13. package/{esm2020 → esm2022}/lib/tab.service.mjs +4 -4
  14. package/{fesm2020 → fesm2022}/valtimo-dossier-management.mjs +158 -247
  15. package/fesm2022/valtimo-dossier-management.mjs.map +1 -0
  16. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts +1 -1
  17. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts.map +1 -1
  18. package/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.d.ts +1 -1
  19. package/lib/dossier-management-detail-container/dossier-management-detail-container.component.d.ts +1 -1
  20. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts +1 -3
  21. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts.map +1 -1
  22. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts +9 -10
  23. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts.map +1 -1
  24. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts +2 -2
  25. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts.map +1 -1
  26. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts +2 -2
  27. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts.map +1 -1
  28. package/lib/dossier-management-list/dossier-management-list.component.d.ts +1 -2
  29. package/lib/dossier-management-list/dossier-management-list.component.d.ts.map +1 -1
  30. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts +1 -1
  31. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts.map +1 -1
  32. package/lib/dossier-management-upload/dossier-management-upload.component.d.ts +1 -1
  33. package/lib/dossier-management.module.d.ts +14 -16
  34. package/lib/dossier-management.module.d.ts.map +1 -1
  35. package/lib/models/list-column.model.d.ts +1 -1
  36. package/lib/models/list-column.model.d.ts.map +1 -1
  37. package/package.json +8 -14
  38. package/esm2020/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +0 -73
  39. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +0 -104
  40. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +0 -456
  41. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +0 -417
  42. package/esm2020/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +0 -84
  43. package/esm2020/lib/dossier-management-list/dossier-management-list.component.mjs +0 -76
  44. package/esm2020/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +0 -57
  45. package/esm2020/lib/dossier-management-roles/dossier-management-roles.component.mjs +0 -97
  46. package/esm2020/lib/dossier-management.module.mjs +0 -171
  47. package/fesm2015/valtimo-dossier-management.mjs +0 -1846
  48. package/fesm2015/valtimo-dossier-management.mjs.map +0 -1
  49. package/fesm2020/valtimo-dossier-management.mjs.map +0 -1
  50. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts +0 -33
  51. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts.map +0 -1
  52. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  53. /package/{esm2020 → esm2022}/lib/models/list-column.model.mjs +0 -0
  54. /package/{esm2020 → esm2022}/lib/tab.enum.mjs +0 -0
  55. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  56. /package/{esm2020 → esm2022}/valtimo-dossier-management.mjs +0 -0
@@ -0,0 +1,416 @@
1
+ /*
2
+ * Copyright 2015-2023 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Component, EventEmitter, Output, ViewChild, } from '@angular/core';
17
+ import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, Subscription, switchMap, take, tap, } from 'rxjs';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@valtimo/document";
20
+ import * as i2 from "@angular/router";
21
+ import * as i3 from "@ngx-translate/core";
22
+ import * as i4 from "@angular/platform-browser";
23
+ import * as i5 from "@angular/common";
24
+ import * as i6 from "@valtimo/components";
25
+ export class DossierManagementSearchFieldsComponent {
26
+ constructor(documentService, route, translateService, sanitizer) {
27
+ this.documentService = documentService;
28
+ this.route = route;
29
+ this.translateService = translateService;
30
+ this.sanitizer = sanitizer;
31
+ this.searchField = new EventEmitter();
32
+ this.downloadName$ = new BehaviorSubject('');
33
+ this.downloadUrl$ = new BehaviorSubject(undefined);
34
+ this.disableInput$ = new BehaviorSubject(false);
35
+ this.selectedSearchField$ = new BehaviorSubject(null);
36
+ this.formData$ = new BehaviorSubject(null);
37
+ this.valid$ = new BehaviorSubject(false);
38
+ this.subscriptions = new Subscription();
39
+ this.COLUMNS = [
40
+ {
41
+ viewType: 'string',
42
+ sortable: false,
43
+ propertyName: 'title',
44
+ translationKey: 'title',
45
+ },
46
+ {
47
+ viewType: 'string',
48
+ sortable: false,
49
+ propertyName: 'key',
50
+ translationKey: 'key',
51
+ },
52
+ {
53
+ viewType: 'string',
54
+ sortable: false,
55
+ propertyName: 'path',
56
+ translationKey: 'path',
57
+ },
58
+ {
59
+ viewType: 'string',
60
+ sortable: false,
61
+ propertyName: 'dataType',
62
+ translationKey: 'dataType',
63
+ },
64
+ {
65
+ viewType: 'string',
66
+ sortable: false,
67
+ propertyName: 'fieldType',
68
+ translationKey: 'fieldType',
69
+ },
70
+ ];
71
+ this.dropdownColumns$ = new BehaviorSubject([
72
+ {
73
+ labelTranslationKey: 'searchFieldsOverview.id',
74
+ dataKey: 'key',
75
+ },
76
+ {
77
+ labelTranslationKey: 'searchFieldsOverview.text',
78
+ dataKey: 'value',
79
+ },
80
+ ]);
81
+ this.DATA_TYPES = [
82
+ 'text',
83
+ 'number',
84
+ 'date',
85
+ 'datetime',
86
+ 'boolean',
87
+ ];
88
+ this.dataTypeItems$ = this.translateService.stream('key').pipe(map(() => this.DATA_TYPES.map(dataType => ({
89
+ id: dataType,
90
+ text: this.translateService.instant(`searchFields.${dataType}`),
91
+ }))));
92
+ this.dataTypeIsBoolean$ = new BehaviorSubject(false);
93
+ this.dataTypeIsText$ = new BehaviorSubject(false);
94
+ this.ALL_FIELD_TYPES = [
95
+ 'single',
96
+ 'range',
97
+ 'single-select-dropdown',
98
+ 'multi-select-dropdown',
99
+ ];
100
+ this.NON_TEXT_FIELD_TYPES = ['single', 'range'];
101
+ this.BOOLEAN_FIELD_TYPES = ['single'];
102
+ this.fieldTypeItems$ = combineLatest([
103
+ this.dataTypeIsBoolean$,
104
+ this.dataTypeIsText$,
105
+ this.translateService.stream('key'),
106
+ ]).pipe(map(([dataTypeIsBoolean, dataTypeIsText]) => {
107
+ if (dataTypeIsBoolean) {
108
+ return this.BOOLEAN_FIELD_TYPES.map(fieldType => ({
109
+ id: fieldType,
110
+ text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
111
+ }));
112
+ }
113
+ else if (!dataTypeIsText) {
114
+ return this.NON_TEXT_FIELD_TYPES.map(fieldType => ({
115
+ id: fieldType,
116
+ text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
117
+ }));
118
+ }
119
+ return this.ALL_FIELD_TYPES.map(fieldType => ({
120
+ id: fieldType,
121
+ text: this.translateService.instant(`searchFieldsOverview.${fieldType}`),
122
+ }));
123
+ }));
124
+ this.MATCH_TYPES = ['exact', 'like'];
125
+ this.matchTypeItems$ = this.translateService
126
+ .stream('key')
127
+ .pipe(map(() => this.MATCH_TYPES.map(matchType => ({
128
+ id: matchType,
129
+ text: this.translateService.instant(`searchFieldsOverview.${matchType}`),
130
+ }))));
131
+ this.fields$ = this.translateService.stream('key').pipe(map(() => this.COLUMNS.map(column => ({
132
+ key: column.propertyName,
133
+ label: this.translateService.instant(`searchFieldsOverview.${column.translationKey}`),
134
+ sortable: column.sortable,
135
+ ...(column.viewType && { viewType: column.viewType }),
136
+ ...(column.enum && { enum: column.enum }),
137
+ }))));
138
+ this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
139
+ this.loadingSearchFields = true;
140
+ this.showSearchFieldsForm = false;
141
+ this.refreshSearchFields$ = new BehaviorSubject(null);
142
+ this.searchFields$ = combineLatest([
143
+ this.documentDefinitionName$,
144
+ this.refreshSearchFields$,
145
+ ]).pipe(switchMap(([documentDefinitionName]) => this.documentService.getDocumentSearchFields(documentDefinitionName)), tap(searchFields => {
146
+ this.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
147
+ if (searchFields && Array.isArray(searchFields) && searchFields.length > 0) {
148
+ this.setDownload(documentDefinitionName, searchFields);
149
+ }
150
+ });
151
+ }), tap(searchFields => {
152
+ this.cachedSearchFields = searchFields;
153
+ this.loadingSearchFields = false;
154
+ }));
155
+ this.translatedSearchFields$ = combineLatest([
156
+ this.searchFields$,
157
+ this.translateService.stream('key'),
158
+ ]).pipe(map(([searchFields]) => searchFields.map(searchField => ({
159
+ ...searchField,
160
+ title: searchField.title ? searchField.title : '',
161
+ dataType: this.translateService.instant(`searchFields.${searchField.dataType}`),
162
+ matchType: this.translateService.instant(`searchFieldsOverview.${searchField.matchType}`),
163
+ fieldType: this.translateService.instant(`searchFieldsOverview.${searchField.fieldType}`),
164
+ }))));
165
+ this.fieldTypeIsDropdown$ = new BehaviorSubject(false);
166
+ this.dropdownDataProviderNames$ = combineLatest([
167
+ this.documentService.getDropdownDataProviders(),
168
+ this.translateService.stream('key'),
169
+ ]).pipe(map(([providers]) => providers.map(provider => ({
170
+ id: provider,
171
+ text: this.translateService.instant(`searchFieldsOverview.${provider}`),
172
+ }))));
173
+ this.modifiedDropdownValues$ = new BehaviorSubject([]);
174
+ this.initialDropdownValues$ = combineLatest([
175
+ this.documentDefinitionName$,
176
+ this.formData$,
177
+ ]).pipe(distinctUntilChanged(([prevDocumentDefinitionName, prevFormData], [currDocumentDefinitionName, currFormData]) => prevDocumentDefinitionName === currDocumentDefinitionName &&
178
+ prevFormData?.dropdownDataProvider === currFormData?.dropdownDataProvider &&
179
+ prevFormData?.key === currFormData?.key), switchMap(([documentDefinitionName, formData]) => {
180
+ if (!formData || !formData.dropdownDataProvider) {
181
+ return of([]);
182
+ }
183
+ return this.documentService
184
+ .getDropdownData(formData.dropdownDataProvider, documentDefinitionName, formData.key)
185
+ .pipe(map(dropdownData => {
186
+ if (dropdownData) {
187
+ return Object.keys(dropdownData).map(dropdownFieldKey => ({
188
+ key: dropdownFieldKey,
189
+ value: dropdownData[dropdownFieldKey],
190
+ }));
191
+ }
192
+ return [];
193
+ }));
194
+ }));
195
+ this.showMatchTypes$ = combineLatest([
196
+ this.dataTypeIsText$,
197
+ this.fieldTypeIsDropdown$,
198
+ ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown]) => dataTypeIsText && !fieldTypeIsDropdown));
199
+ this.showReadonlyDropdownTable$ = combineLatest([
200
+ this.dataTypeIsText$,
201
+ this.fieldTypeIsDropdown$,
202
+ this.formData$,
203
+ ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown, formData]) => dataTypeIsText &&
204
+ fieldTypeIsDropdown &&
205
+ formData?.dropdownDataProvider &&
206
+ !this.dropdownDataProviderSupportsUpdates(formData?.dropdownDataProvider)));
207
+ this.showInputDropdownTable$ = combineLatest([
208
+ this.dataTypeIsText$,
209
+ this.fieldTypeIsDropdown$,
210
+ this.formData$,
211
+ ]).pipe(map(([dataTypeIsText, fieldTypeIsDropdown, formData]) => dataTypeIsText &&
212
+ fieldTypeIsDropdown &&
213
+ formData?.dropdownDataProvider &&
214
+ this.dropdownDataProviderSupportsUpdates(formData?.dropdownDataProvider)));
215
+ }
216
+ ngOnInit() {
217
+ this.openSelectedSearchFieldSubscription();
218
+ }
219
+ ngAfterViewInit() {
220
+ this.openModalShowingSubscription();
221
+ }
222
+ ngOnDestroy() {
223
+ this.subscriptions.unsubscribe();
224
+ }
225
+ searchFieldClicked(searchField, searchFieldActionTypeIsAdd) {
226
+ this.disableInput$.pipe(take(1)).subscribe(inputDisabled => {
227
+ if (!inputDisabled) {
228
+ this.searchFieldActionTypeIsAdd = searchFieldActionTypeIsAdd;
229
+ const searchFieldToSelect = this.cachedSearchFields.find(field => field.key === searchField.key);
230
+ this.selectedSearchField$.next(searchFieldToSelect);
231
+ }
232
+ });
233
+ }
234
+ formValueChange(data) {
235
+ setTimeout(() => {
236
+ this.nextIfChanged(this.dataTypeIsText$, data.dataType === 'text');
237
+ this.nextIfChanged(this.dataTypeIsBoolean$, data.dataType === 'boolean');
238
+ this.nextIfChanged(this.fieldTypeIsDropdown$, this.isFieldTypeDropdown(data.fieldType));
239
+ this.nextIfChanged(this.formData$, data);
240
+ this.nextIfChanged(this.valid$, this.isValid(data));
241
+ }, 0);
242
+ }
243
+ dropdownDatalistChange(data) {
244
+ this.modifiedDropdownValues$.next(data);
245
+ }
246
+ moveRow(searchFieldRowIndex, moveUp, clickEvent, documentDefinitionName) {
247
+ const searchFields = [...this.cachedSearchFields];
248
+ const searchFieldRow = searchFields[searchFieldRowIndex];
249
+ clickEvent.stopPropagation();
250
+ const searchFieldIndex = searchFields.findIndex(field => field.key === searchFieldRow.key);
251
+ const foundSearchField = { ...searchFields[searchFieldIndex] };
252
+ const filteredSearchFields = searchFields.filter(field => field.key !== searchFieldRow.key);
253
+ const multipleSearchFields = searchFields.length > 1;
254
+ if (multipleSearchFields && moveUp && searchFieldIndex > 0) {
255
+ const searchFieldBeforeKey = `${searchFields[searchFieldIndex - 1].key}`;
256
+ const searchFieldBeforeIndex = filteredSearchFields.findIndex(field => field.key === searchFieldBeforeKey);
257
+ filteredSearchFields.splice(searchFieldBeforeIndex, 0, foundSearchField);
258
+ this.updateSearchFields(documentDefinitionName, filteredSearchFields);
259
+ }
260
+ else if (multipleSearchFields && !moveUp && searchFieldIndex < searchFields.length) {
261
+ const searchFieldAfterKey = `${searchFields[searchFieldIndex + 1].key}`;
262
+ const searchFieldAfterIndex = filteredSearchFields.findIndex(field => field.key === searchFieldAfterKey);
263
+ filteredSearchFields.splice(searchFieldAfterIndex + 1, 0, foundSearchField);
264
+ this.updateSearchFields(documentDefinitionName, filteredSearchFields);
265
+ }
266
+ }
267
+ deleteSelectedSearchField(documentDefinitionName, selectedSearchField) {
268
+ this.disableInput();
269
+ if (this.dropdownDataProviderSupportsUpdates(selectedSearchField?.dropdownDataProvider)) {
270
+ this.documentService
271
+ .deleteDropdownData(selectedSearchField.dropdownDataProvider, documentDefinitionName, selectedSearchField.key)
272
+ .subscribe();
273
+ }
274
+ this.documentService
275
+ .deleteDocumentSearch(documentDefinitionName, selectedSearchField.key)
276
+ .subscribe(() => {
277
+ this.enableInput();
278
+ this.hideModal();
279
+ this.refreshSearchFields();
280
+ }, () => {
281
+ this.enableInput();
282
+ });
283
+ }
284
+ saveSearchField(documentDefinitionName) {
285
+ this.disableInput();
286
+ this.formData$.pipe(take(1)).subscribe(formData => {
287
+ const mappedFormData = {
288
+ ...formData,
289
+ matchType: !this.isFieldTypeDropdown(formData.fieldType) && formData.dataType === 'text'
290
+ ? formData.matchType
291
+ : 'exact',
292
+ fieldType: formData.dataType !== 'boolean' ? formData.fieldType : 'single',
293
+ };
294
+ const prevFormData = this.selectedSearchField$.value;
295
+ if (this.dropdownDataProviderSupportsUpdates(prevFormData?.dropdownDataProvider) &&
296
+ prevFormData.dropdownDataProvider !== mappedFormData?.dropdownDataProvider) {
297
+ this.documentService
298
+ .deleteDropdownData(prevFormData.dropdownDataProvider, documentDefinitionName, prevFormData.key)
299
+ .subscribe();
300
+ }
301
+ if (this.dropdownDataProviderSupportsUpdates(mappedFormData.dropdownDataProvider)) {
302
+ this.modifiedDropdownValues$.pipe(take(1)).subscribe(dropdownValues => {
303
+ const request = dropdownValues.reduce((acc, keyValue) => ({ ...acc, [keyValue.key]: keyValue.value }), {});
304
+ this.documentService
305
+ .postDropdownData(mappedFormData.dropdownDataProvider, documentDefinitionName, mappedFormData.key, request)
306
+ .subscribe();
307
+ });
308
+ }
309
+ if (this.searchFieldActionTypeIsAdd) {
310
+ this.documentService.postDocumentSearch(documentDefinitionName, mappedFormData).subscribe(() => {
311
+ this.enableInput();
312
+ this.hideModal();
313
+ this.refreshSearchFields();
314
+ }, () => {
315
+ this.enableInput();
316
+ });
317
+ }
318
+ else {
319
+ const newFields = [...this.cachedSearchFields];
320
+ const indexToReplace = newFields.findIndex(field => field.key === mappedFormData.key);
321
+ const filteredFields = newFields.filter(field => field.key !== mappedFormData.key);
322
+ filteredFields.splice(indexToReplace, 0, mappedFormData);
323
+ this.updateSearchFields(documentDefinitionName, filteredFields);
324
+ }
325
+ });
326
+ }
327
+ updateSearchFields(documentDefinitionName, newSearchFields) {
328
+ this.disableInput();
329
+ this.documentService.putDocumentSearch(documentDefinitionName, newSearchFields).subscribe(() => {
330
+ this.enableInput();
331
+ this.hideModal();
332
+ this.refreshSearchFields();
333
+ }, () => {
334
+ this.enableInput();
335
+ });
336
+ }
337
+ nextIfChanged(behaviourSubject$, value) {
338
+ if (JSON.stringify(behaviourSubject$.value) !== JSON.stringify(value)) {
339
+ behaviourSubject$.next(value);
340
+ }
341
+ }
342
+ isValid(data) {
343
+ const validMatchType = data.dataType === 'text' && !this.isFieldTypeDropdown(data.fieldType) ? data.matchType : true;
344
+ const validDropdownDataProvider = this.isFieldTypeDropdown(data.fieldType)
345
+ ? data.dropdownDataProvider
346
+ : true;
347
+ const containsAllValues = !!(data.key &&
348
+ data.dataType &&
349
+ validMatchType &&
350
+ validDropdownDataProvider &&
351
+ data.path);
352
+ const keyIsUnique = !this.searchFieldActionTypeIsAdd ||
353
+ this.cachedSearchFields.findIndex(field => field.key === data.key) === -1;
354
+ return containsAllValues && keyIsUnique;
355
+ }
356
+ isFieldTypeDropdown(fieldType) {
357
+ return fieldType === 'single-select-dropdown' || fieldType === 'multi-select-dropdown';
358
+ }
359
+ dropdownDataProviderSupportsUpdates(dropdownDataProvider) {
360
+ return dropdownDataProvider === 'dropdownDatabaseDataProvider';
361
+ }
362
+ openSelectedSearchFieldSubscription() {
363
+ this.subscriptions.add(this.selectedSearchField$.subscribe(() => {
364
+ this.showModal();
365
+ }));
366
+ }
367
+ openModalShowingSubscription() {
368
+ this.subscriptions.add(this.modal.modalShowing$.subscribe(modalShowing => {
369
+ if (modalShowing) {
370
+ setTimeout(() => {
371
+ this.showSearchFieldsForm = true;
372
+ }, 0);
373
+ }
374
+ else {
375
+ setTimeout(() => {
376
+ this.showSearchFieldsForm = false;
377
+ }, 150);
378
+ }
379
+ }));
380
+ }
381
+ setDownload(documentDefinitionName, searchFields) {
382
+ this.downloadName$.next(`${documentDefinitionName}.json`);
383
+ this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
384
+ encodeURIComponent(JSON.stringify({ searchFields }, null, 2))));
385
+ }
386
+ disableInput() {
387
+ this.disableInput$.next(true);
388
+ }
389
+ enableInput() {
390
+ this.disableInput$.next(false);
391
+ }
392
+ showModal() {
393
+ this.modal?.show();
394
+ }
395
+ hideModal() {
396
+ this.modal?.hide();
397
+ }
398
+ refreshSearchFields() {
399
+ this.refreshSearchFields$.next(null);
400
+ }
401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierManagementSearchFieldsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
402
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DossierManagementSearchFieldsComponent, selector: "valtimo-dossier-management-search-fields", outputs: { searchField: "searchField" }, viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }, { propertyName: "modal", first: true, predicate: ["searchFieldModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n searchFields: translatedSearchFields$ | async,\n fields: fields$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"modal; context: {obs: obs}\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"btn-group mt-m3px mb-3 pr-2 float-right\">\n <a\n class=\"btn btn-secondary btn-space\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [ngClass]=\"{\n disabled:\n !obs.downloadUrl || !obs.downloadName || obs.searchFields.length <= 0 || obs.disableInput\n }\"\n >\n <i class=\"icon mdi mdi-download mr-1\"></i>\n {{ 'searchFields.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"searchFieldClicked($event, true)\"\n class=\"btn btn-primary btn-space\"\n [ngClass]=\"{disabled: loadingSearchFields || obs.disableInput}\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'searchFieldsOverview.addRow' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n (rowClicked)=\"searchFieldClicked($event, false)\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{\n 'disabled disabled-move-row-button': index === length - 1 || obs.disableInput\n }\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #modal let-obs=\"obs\">\n <valtimo-modal\n #searchFieldModal\n elementId=\"searchFieldModal\"\n [title]=\"\n searchFieldActionTypeIsAdd\n ? ('searchFieldsOverview.addRow' | translate)\n : ('searchFieldsOverview.edit' | translate)\n \"\n [showFooter]=\"true\"\n >\n <div body class=\"mt-2\">\n <v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"showSearchFieldsForm && {searchField: selectedSearchField$ | async} as searchObs\"\n >\n <v-input\n name=\"title\"\n [title]=\"'searchFieldsOverview.title' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.title\"\n [disabled]=\"obs.disableInput\"\n [required]=\"false\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input>\n <v-input\n name=\"key\"\n [title]=\"'searchFieldsOverview.key' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.key\"\n [disabled]=\"obs.disableInput || !searchFieldActionTypeIsAdd\"\n [required]=\"true\"\n [widthPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input>\n <v-input\n name=\"path\"\n [title]=\"'searchFieldsOverview.path' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.path\"\n [disabled]=\"obs.disableInput\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input>\n <v-select\n *ngIf=\"dataTypeItems$ | async as dataTypeItems\"\n [items]=\"dataTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"dataType\"\n [defaultSelectionId]=\"searchObs.searchField?.dataType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"(showMatchTypes$ | async) && (matchTypeItems$ | async) as matchTypeItems\"\n [items]=\"matchTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"matchType\"\n [defaultSelectionId]=\"searchObs.searchField?.matchType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"fieldTypeItems$ | async as fieldTypeItems\"\n [items]=\"fieldTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"fieldType\"\n [defaultSelectionId]=\"searchObs.searchField?.fieldType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"\n (fieldTypeIsDropdown$ | async) &&\n (dropdownDataProviderNames$ | async) as dropdownDataProviderNames\n \"\n [items]=\"dropdownDataProviderNames\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"false\"\n name=\"dropdownDataProvider\"\n [defaultSelectionId]=\"searchObs.searchField?.dropdownDataProvider\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n ></v-select>\n <valtimo-carbon-multi-input\n *ngIf=\"\n (showInputDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n name=\"dropdownValues\"\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n type=\"keyValue\"\n [disabled]=\"obs.disableInput\"\n [defaultValues]=\"initialDropdownValues\"\n [margin]=\"true\"\n [required]=\"false\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n (valueChange)=\"dropdownDatalistChange($event)\"\n >\n </valtimo-carbon-multi-input>\n <v-table\n *ngIf=\"\n (showReadonlyDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n [items]=\"initialDropdownValues\"\n [columns]=\"dropdownColumns$ | async\"\n [showEditButtons]=\"false\"\n [itemsTranslationKey]=\"'searchFieldsOverview'\"\n [showPagination]=\"false\"\n [mobileBreakpointPx]=\"200\"\n ></v-table>\n </v-form>\n </div>\n <div footer>\n <div class=\"col-12 p-0\">\n <ng-container *ngTemplateOutlet=\"buttonsFooterModal; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n </valtimo-modal>\n</ng-template>\n\n<ng-template #buttonsFooterModal let-obs=\"obs\">\n <div class=\"buttons-container\" *ngIf=\"{searchField: selectedSearchField$ | async} as searchObs\">\n <div class=\"right-buttons\">\n <button\n class=\"btn btn-space btn-secondary\"\n *ngIf=\"!searchFieldActionTypeIsAdd\"\n [disabled]=\"obs.disableInput\"\n (click)=\"deleteSelectedSearchField(obs.documentDefinitionName, searchObs.searchField)\"\n >\n {{ 'searchFieldsOverview.delete' | translate }}\n </button>\n <button\n (click)=\"saveSearchField(obs.documentDefinitionName)\"\n type=\"button\"\n class=\"btn btn-primary btn-space mr-0\"\n [disabled]=\"obs.disableInput || !obs.valid\"\n >\n {{ 'searchFieldsOverview.submit' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */valtimo-list::ng-deep table{border-top:1px solid rgba(0,0,0,.125)}.modal-header::ng-deep{background-color:#f3f4f7}::ng-deep .disabled-move-row-button{cursor:default!important;filter:grayscale(1);opacity:.5}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}::ng-deep .tab-container{min-height:unset!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i6.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i6.SelectComponent, selector: "v-select", inputs: ["items", "defaultSelection", "defaultSelectionId", "defaultSelectionIds", "disabled", "multiple", "margin", "widthInPx", "notFoundText", "clearAllText", "clearText", "name", "title", "titleTranslationKey", "clearSelectionSubject$", "tooltip", "required", "loading", "loadingText", "placeholder", "smallMargin", "carbonTheme"], outputs: ["selectedChange"] }, { kind: "component", type: i6.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "component", type: i6.InputComponent, selector: "v-input", inputs: ["name", "type", "title", "titleTranslationKey", "defaultValue", "widthPx", "fullWidth", "margin", "smallMargin", "disabled", "step", "min", "maxLength", "tooltip", "required", "hideNumberSpinBox", "smallLabel", "rows", "clear$", "carbonTheme", "placeholder"], outputs: ["valueChange"] }, { kind: "component", type: i6.FormComponent, selector: "v-form", inputs: ["className"], outputs: ["valueChange"] }, { kind: "component", type: i6.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i6.TableComponent, selector: "v-table", inputs: ["items", "columns", "loading", "showEditButtons", "showPagination", "editButtonTranslationKey", "itemsTranslationKey", "noResultsTranslationKey", "mobileBreakpointPx", "amountOfLoadingRows", "collectionSize", "page", "size"], outputs: ["editButtonClicked", "paginationSizeSet", "paginationPageSet"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
403
+ }
404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DossierManagementSearchFieldsComponent, decorators: [{
405
+ type: Component,
406
+ args: [{ selector: 'valtimo-dossier-management-search-fields', template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n searchFields: translatedSearchFields$ | async,\n fields: fields$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n <ng-container *ngTemplateOutlet=\"modal; context: {obs: obs}\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <div class=\"btn-group mt-m3px mb-3 pr-2 float-right\">\n <a\n class=\"btn btn-secondary btn-space\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [ngClass]=\"{\n disabled:\n !obs.downloadUrl || !obs.downloadName || obs.searchFields.length <= 0 || obs.disableInput\n }\"\n >\n <i class=\"icon mdi mdi-download mr-1\"></i>\n {{ 'searchFields.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"searchFieldClicked($event, true)\"\n class=\"btn btn-primary btn-space\"\n [ngClass]=\"{disabled: loadingSearchFields || obs.disableInput}\"\n >\n <i class=\"icon mdi mdi-plus mr-1\"></i>\n {{ 'searchFieldsOverview.addRow' | translate }}\n </button>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.searchFields\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n (rowClicked)=\"searchFieldClicked($event, false)\"\n *ngIf=\"obs.searchFields; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{\n 'disabled disabled-move-row-button': index === length - 1 || obs.disableInput\n }\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #modal let-obs=\"obs\">\n <valtimo-modal\n #searchFieldModal\n elementId=\"searchFieldModal\"\n [title]=\"\n searchFieldActionTypeIsAdd\n ? ('searchFieldsOverview.addRow' | translate)\n : ('searchFieldsOverview.edit' | translate)\n \"\n [showFooter]=\"true\"\n >\n <div body class=\"mt-2\">\n <v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"showSearchFieldsForm && {searchField: selectedSearchField$ | async} as searchObs\"\n >\n <v-input\n name=\"title\"\n [title]=\"'searchFieldsOverview.title' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.title\"\n [disabled]=\"obs.disableInput\"\n [required]=\"false\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input>\n <v-input\n name=\"key\"\n [title]=\"'searchFieldsOverview.key' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.key\"\n [disabled]=\"obs.disableInput || !searchFieldActionTypeIsAdd\"\n [required]=\"true\"\n [widthPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input>\n <v-input\n name=\"path\"\n [title]=\"'searchFieldsOverview.path' | translate\"\n [margin]=\"true\"\n [defaultValue]=\"searchObs.searchField?.path\"\n [disabled]=\"obs.disableInput\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input>\n <v-select\n *ngIf=\"dataTypeItems$ | async as dataTypeItems\"\n [items]=\"dataTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"dataType\"\n [defaultSelectionId]=\"searchObs.searchField?.dataType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"(showMatchTypes$ | async) && (matchTypeItems$ | async) as matchTypeItems\"\n [items]=\"matchTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"matchType\"\n [defaultSelectionId]=\"searchObs.searchField?.matchType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"fieldTypeItems$ | async as fieldTypeItems\"\n [items]=\"fieldTypeItems\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"true\"\n name=\"fieldType\"\n [defaultSelectionId]=\"searchObs.searchField?.fieldType\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n ></v-select>\n <v-select\n *ngIf=\"\n (fieldTypeIsDropdown$ | async) &&\n (dropdownDataProviderNames$ | async) as dropdownDataProviderNames\n \"\n [items]=\"dropdownDataProviderNames\"\n [placeholder]=\"'searchFieldsOverview.searchFieldPlaceholder' | translate\"\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [disabled]=\"obs.disableInput\"\n [margin]=\"true\"\n [required]=\"false\"\n name=\"dropdownDataProvider\"\n [defaultSelectionId]=\"searchObs.searchField?.dropdownDataProvider\"\n [widthInPx]=\"200\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n ></v-select>\n <valtimo-carbon-multi-input\n *ngIf=\"\n (showInputDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n name=\"dropdownValues\"\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n type=\"keyValue\"\n [disabled]=\"obs.disableInput\"\n [defaultValues]=\"initialDropdownValues\"\n [margin]=\"true\"\n [required]=\"false\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n (valueChange)=\"dropdownDatalistChange($event)\"\n >\n </valtimo-carbon-multi-input>\n <v-table\n *ngIf=\"\n (showReadonlyDropdownTable$ | async) &&\n (initialDropdownValues$ | async) as initialDropdownValues\n \"\n [items]=\"initialDropdownValues\"\n [columns]=\"dropdownColumns$ | async\"\n [showEditButtons]=\"false\"\n [itemsTranslationKey]=\"'searchFieldsOverview'\"\n [showPagination]=\"false\"\n [mobileBreakpointPx]=\"200\"\n ></v-table>\n </v-form>\n </div>\n <div footer>\n <div class=\"col-12 p-0\">\n <ng-container *ngTemplateOutlet=\"buttonsFooterModal; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n </valtimo-modal>\n</ng-template>\n\n<ng-template #buttonsFooterModal let-obs=\"obs\">\n <div class=\"buttons-container\" *ngIf=\"{searchField: selectedSearchField$ | async} as searchObs\">\n <div class=\"right-buttons\">\n <button\n class=\"btn btn-space btn-secondary\"\n *ngIf=\"!searchFieldActionTypeIsAdd\"\n [disabled]=\"obs.disableInput\"\n (click)=\"deleteSelectedSearchField(obs.documentDefinitionName, searchObs.searchField)\"\n >\n {{ 'searchFieldsOverview.delete' | translate }}\n </button>\n <button\n (click)=\"saveSearchField(obs.documentDefinitionName)\"\n type=\"button\"\n class=\"btn btn-primary btn-space mr-0\"\n [disabled]=\"obs.disableInput || !obs.valid\"\n >\n {{ 'searchFieldsOverview.submit' | translate }}\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */valtimo-list::ng-deep table{border-top:1px solid rgba(0,0,0,.125)}.modal-header::ng-deep{background-color:#f3f4f7}::ng-deep .disabled-move-row-button{cursor:default!important;filter:grayscale(1);opacity:.5}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}::ng-deep .tab-container{min-height:unset!important}\n"] }]
407
+ }], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
408
+ type: ViewChild,
409
+ args: ['moveRowButtons']
410
+ }], modal: [{
411
+ type: ViewChild,
412
+ args: ['searchFieldModal']
413
+ }], searchField: [{
414
+ type: Output
415
+ }] } });
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyLW1hbmFnZW1lbnQvc3JjL2xpYi9kb3NzaWVyLW1hbmFnZW1lbnQtZGV0YWlsLWNvbnRhaW5lci90YWJzL2Rvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzL2Rvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvZG9zc2llci1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9kb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy9kb3NzaWVyLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUdaLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFlBQVksRUFDWixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7QUFtQmQsTUFBTSxPQUFPLHNDQUFzQztJQXNRakQsWUFDbUIsZUFBZ0MsRUFDaEMsS0FBcUIsRUFDckIsZ0JBQWtDLEVBQ2xDLFNBQXVCO1FBSHZCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtC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LFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNJLEtBQUs7c0JBQW5DLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUVuQixXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YnNjcmlwdGlvbixcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7TGlzdEZpZWxkLCBNb2RhbENvbXBvbmVudH0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGVmaW5pdGlvbkNvbHVtbixcbiAgU2VhcmNoRmllbGQsXG4gIFNlYXJjaEZpZWxkRGF0YVR5cGUsXG4gIFNlYXJjaEZpZWxkRmllbGRUeXBlLFxuICBTZWFyY2hGaWVsZE1hdGNoVHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29uZmlnJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlVXJsfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7TXVsdGlJbnB1dE91dHB1dCwgTXVsdGlJbnB1dFZhbHVlcywgU2VsZWN0SXRlbSwgVGFibGVDb2x1bW59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWRvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9zc2llci1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9zc2llck1hbmFnZW1lbnRTZWFyY2hGaWVsZHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ21vdmVSb3dCdXR0b25zJykgcHVibGljIG1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaEZpZWxkTW9kYWwnKSBtb2RhbDogTW9kYWxDb21wb25lbnQ7XG5cbiAgQE91dHB1dCgpIHNlYXJjaEZpZWxkOiBFdmVudEVtaXR0ZXI8U2VhcmNoRmllbGQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHJlYWRvbmx5IGRvd25sb2FkTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBkb3dubG9hZFVybCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVVcmw+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRpc2FibGVJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRTZWFyY2hGaWVsZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlYXJjaEZpZWxkIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGZvcm1EYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VhcmNoRmllbGQ+KG51bGwpO1xuICByZWFkb25seSB2YWxpZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5TOiBBcnJheTxEZWZpbml0aW9uQ29sdW1uPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICd0aXRsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3RpdGxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2tleScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2tleScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdwYXRoJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAncGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkYXRhVHlwZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2RhdGFUeXBlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2ZpZWxkVHlwZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2ZpZWxkVHlwZScsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBkcm9wZG93bkNvbHVtbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxUYWJsZUNvbHVtbj4+KFtcbiAgICB7XG4gICAgICBsYWJlbFRyYW5zbGF0aW9uS2V5OiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuaWQnLFxuICAgICAgZGF0YUtleTogJ2tleScsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbFRyYW5zbGF0aW9uS2V5OiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcudGV4dCcsXG4gICAgICBkYXRhS2V5OiAndmFsdWUnLFxuICAgIH0sXG4gIF0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9UWVBFUzogQXJyYXk8U2VhcmNoRmllbGREYXRhVHlwZT4gPSBbXG4gICAgJ3RleHQnLFxuICAgICdudW1iZXInLFxuICAgICdkYXRlJyxcbiAgICAnZGF0ZXRpbWUnLFxuICAgICdib29sZWFuJyxcbiAgXTtcbiAgcmVhZG9ubHkgZGF0YVR5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT5cbiAgICAgIHRoaXMuREFUQV9UWVBFUy5tYXAoZGF0YVR5cGUgPT4gKHtcbiAgICAgICAgaWQ6IGRhdGFUeXBlLFxuICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzLiR7ZGF0YVR5cGV9YCksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0YVR5cGVJc0Jvb2xlYW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVR5cGVJc1RleHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgQUxMX0ZJRUxEX1RZUEVTOiBBcnJheTxTZWFyY2hGaWVsZEZpZWxkVHlwZT4gPSBbXG4gICAgJ3NpbmdsZScsXG4gICAgJ3JhbmdlJyxcbiAgICAnc2luZ2xlLXNlbGVjdC1kcm9wZG93bicsXG4gICAgJ211bHRpLXNlbGVjdC1kcm9wZG93bicsXG4gIF07XG4gIHByaXZhdGUgcmVhZG9ubHkgTk9OX1RFWFRfRklFTERfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkRmllbGRUeXBlPiA9IFsnc2luZ2xlJywgJ3JhbmdlJ107XG4gIHByaXZhdGUgcmVhZG9ubHkgQk9PTEVBTl9GSUVMRF9UWVBFUzogQXJyYXk8U2VhcmNoRmllbGRGaWVsZFR5cGU+ID0gWydzaW5nbGUnXTtcbiAgcmVhZG9ubHkgZmllbGRUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PFNlbGVjdEl0ZW0+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZGF0YVR5cGVJc0Jvb2xlYW4kLFxuICAgIHRoaXMuZGF0YVR5cGVJc1RleHQkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGFUeXBlSXNCb29sZWFuLCBkYXRhVHlwZUlzVGV4dF0pID0+IHtcbiAgICAgIGlmIChkYXRhVHlwZUlzQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdGhpcy5CT09MRUFOX0ZJRUxEX1RZUEVTLm1hcChmaWVsZFR5cGUgPT4gKHtcbiAgICAgICAgICBpZDogZmllbGRUeXBlLFxuICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke2ZpZWxkVHlwZX1gKSxcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIGlmICghZGF0YVR5cGVJc1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuTk9OX1RFWFRfRklFTERfVFlQRVMubWFwKGZpZWxkVHlwZSA9PiAoe1xuICAgICAgICAgIGlkOiBmaWVsZFR5cGUsXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7ZmllbGRUeXBlfWApLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLkFMTF9GSUVMRF9UWVBFUy5tYXAoZmllbGRUeXBlID0+ICh7XG4gICAgICAgIGlkOiBmaWVsZFR5cGUsXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke2ZpZWxkVHlwZX1gKSxcbiAgICAgIH0pKTtcbiAgICB9KVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFUQ0hfVFlQRVM6IEFycmF5PFNlYXJjaEZpZWxkTWF0Y2hUeXBlPiA9IFsnZXhhY3QnLCAnbGlrZSddO1xuICByZWFkb25seSBtYXRjaFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIG1hcCgoKSA9PlxuICAgICAgICB0aGlzLk1BVENIX1RZUEVTLm1hcChtYXRjaFR5cGUgPT4gKHtcbiAgICAgICAgICBpZDogbWF0Y2hUeXBlLFxuICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke21hdGNoVHlwZX1gKSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICByZWFkb25seSBmaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RGaWVsZD4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT5cbiAgICAgIHRoaXMuQ09MVU1OUy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAgIGtleTogY29sdW1uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke2NvbHVtbi50cmFuc2xhdGlvbktleX1gKSxcbiAgICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZSxcbiAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICAuLi4oY29sdW1uLmVudW0gJiYge2VudW06IGNvbHVtbi5lbnVtfSksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgbWFwKHBhcmFtcyA9PiBwYXJhbXMubmFtZSB8fCAnJyksXG4gICAgZmlsdGVyKGRvY0RlZk5hbWUgPT4gISFkb2NEZWZOYW1lKVxuICApO1xuXG4gIHByaXZhdGUgY2FjaGVkU2VhcmNoRmllbGRzITogQXJyYXk8U2VhcmNoRmllbGQ+O1xuICBzZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZDogYm9vbGVhbjtcbiAgbG9hZGluZ1NlYXJjaEZpZWxkcyA9IHRydWU7XG4gIHNob3dTZWFyY2hGaWVsZHNGb3JtID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoU2VhcmNoRmllbGRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWFyY2hGaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PFNlYXJjaEZpZWxkPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLFxuICAgIHRoaXMucmVmcmVzaFNlYXJjaEZpZWxkcyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbZG9jdW1lbnREZWZpbml0aW9uTmFtZV0pID0+XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREb2N1bWVudFNlYXJjaEZpZWxkcyhkb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICksXG4gICAgdGFwKHNlYXJjaEZpZWxkcyA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4ge1xuICAgICAgICBpZiAoc2VhcmNoRmllbGRzICYmIEFycmF5LmlzQXJyYXkoc2VhcmNoRmllbGRzKSAmJiBzZWFyY2hGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgc2VhcmNoRmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdGFwKHNlYXJjaEZpZWxkcyA9PiB7XG4gICAgICB0aGlzLmNhY2hlZFNlYXJjaEZpZWxkcyA9IHNlYXJjaEZpZWxkcztcbiAgICAgIHRoaXMubG9hZGluZ1NlYXJjaEZpZWxkcyA9IGZhbHNlO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgdHJhbnNsYXRlZFNlYXJjaEZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VhcmNoRmllbGQ+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuc2VhcmNoRmllbGRzJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWFyY2hGaWVsZHNdKSA9PlxuICAgICAgc2VhcmNoRmllbGRzLm1hcChzZWFyY2hGaWVsZCA9PiAoe1xuICAgICAgICAuLi5zZWFyY2hGaWVsZCxcbiAgICAgICAgdGl0bGU6IHNlYXJjaEZpZWxkLnRpdGxlID8gc2VhcmNoRmllbGQudGl0bGUgOiAnJyxcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBzZWFyY2hGaWVsZHMuJHtzZWFyY2hGaWVsZC5kYXRhVHlwZX1gKSxcbiAgICAgICAgbWF0Y2hUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHtzZWFyY2hGaWVsZC5tYXRjaFR5cGV9YCksXG4gICAgICAgIGZpZWxkVHlwZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHNlYXJjaEZpZWxkc092ZXJ2aWV3LiR7c2VhcmNoRmllbGQuZmllbGRUeXBlfWApLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IGZpZWxkVHlwZUlzRHJvcGRvd24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgZHJvcGRvd25EYXRhUHJvdmlkZXJOYW1lcyQ6IE9ic2VydmFibGU8QXJyYXk8U2VsZWN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RHJvcGRvd25EYXRhUHJvdmlkZXJzKCksXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbcHJvdmlkZXJzXSkgPT5cbiAgICAgIHByb3ZpZGVycy5tYXAocHJvdmlkZXIgPT4gKHtcbiAgICAgICAgaWQ6IHByb3ZpZGVyLFxuICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHtwcm92aWRlcn1gKSxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZGlmaWVkRHJvcGRvd25WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPihbXSk7XG5cbiAgcmVhZG9ubHkgaW5pdGlhbERyb3Bkb3duVmFsdWVzJDogT2JzZXJ2YWJsZTxNdWx0aUlucHV0VmFsdWVzPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQsXG4gICAgdGhpcy5mb3JtRGF0YSQsXG4gIF0pLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAoW3ByZXZEb2N1bWVudERlZmluaXRpb25OYW1lLCBwcmV2Rm9ybURhdGFdLCBbY3VyckRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGN1cnJGb3JtRGF0YV0pID0+XG4gICAgICAgIHByZXZEb2N1bWVudERlZmluaXRpb25OYW1lID09PSBjdXJyRG9jdW1lbnREZWZpbml0aW9uTmFtZSAmJlxuICAgICAgICBwcmV2Rm9ybURhdGE/LmRyb3Bkb3duRGF0YVByb3ZpZGVyID09PSBjdXJyRm9ybURhdGE/LmRyb3Bkb3duRGF0YVByb3ZpZGVyICYmXG4gICAgICAgIHByZXZGb3JtRGF0YT8ua2V5ID09PSBjdXJyRm9ybURhdGE/LmtleVxuICAgICksXG4gICAgc3dpdGNoTWFwKChbZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgZm9ybURhdGFdKSA9PiB7XG4gICAgICBpZiAoIWZvcm1EYXRhIHx8ICFmb3JtRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcikge1xuICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgLmdldERyb3Bkb3duRGF0YShmb3JtRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlciwgZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgZm9ybURhdGEua2V5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoZHJvcGRvd25EYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkRhdGEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGRyb3Bkb3duRGF0YSkubWFwKGRyb3Bkb3duRmllbGRLZXkgPT4gKHtcbiAgICAgICAgICAgICAgICBrZXk6IGRyb3Bkb3duRmllbGRLZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRyb3Bkb3duRGF0YVtkcm9wZG93bkZpZWxkS2V5XSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dNYXRjaFR5cGVzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZGF0YVR5cGVJc1RleHQkLFxuICAgIHRoaXMuZmllbGRUeXBlSXNEcm9wZG93biQsXG4gIF0pLnBpcGUobWFwKChbZGF0YVR5cGVJc1RleHQsIGZpZWxkVHlwZUlzRHJvcGRvd25dKSA9PiBkYXRhVHlwZUlzVGV4dCAmJiAhZmllbGRUeXBlSXNEcm9wZG93bikpO1xuXG4gIHJlYWRvbmx5IHNob3dSZWFkb25seURyb3Bkb3duVGFibGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kYXRhVHlwZUlzVGV4dCQsXG4gICAgdGhpcy5maWVsZFR5cGVJc0Ryb3Bkb3duJCxcbiAgICB0aGlzLmZvcm1EYXRhJCxcbiAgXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW2RhdGFUeXBlSXNUZXh0LCBmaWVsZFR5cGVJc0Ryb3Bkb3duLCBmb3JtRGF0YV0pID0+XG4gICAgICAgIGRhdGFUeXBlSXNUZXh0ICYmXG4gICAgICAgIGZpZWxkVHlwZUlzRHJvcGRvd24gJiZcbiAgICAgICAgZm9ybURhdGE/LmRyb3Bkb3duRGF0YVByb3ZpZGVyICYmXG4gICAgICAgICF0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyU3VwcG9ydHNVcGRhdGVzKGZvcm1EYXRhPy5kcm9wZG93bkRhdGFQcm92aWRlcilcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0lucHV0RHJvcGRvd25UYWJsZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGFUeXBlSXNUZXh0JCxcbiAgICB0aGlzLmZpZWxkVHlwZUlzRHJvcGRvd24kLFxuICAgIHRoaXMuZm9ybURhdGEkLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbZGF0YVR5cGVJc1RleHQsIGZpZWxkVHlwZUlzRHJvcGRvd24sIGZvcm1EYXRhXSkgPT5cbiAgICAgICAgZGF0YVR5cGVJc1RleHQgJiZcbiAgICAgICAgZmllbGRUeXBlSXNEcm9wZG93biAmJlxuICAgICAgICBmb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXIgJiZcbiAgICAgICAgdGhpcy5kcm9wZG93bkRhdGFQcm92aWRlclN1cHBvcnRzVXBkYXRlcyhmb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXIpXG4gICAgKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3BlblNlbGVjdGVkU2VhcmNoRmllbGRTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5Nb2RhbFNob3dpbmdTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2VhcmNoRmllbGRDbGlja2VkKHNlYXJjaEZpZWxkOiBTZWFyY2hGaWVsZCwgc2VhcmNoRmllbGRBY3Rpb25UeXBlSXNBZGQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoaW5wdXREaXNhYmxlZCA9PiB7XG4gICAgICBpZiAoIWlucHV0RGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZCA9IHNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkO1xuICAgICAgICBjb25zdCBzZWFyY2hGaWVsZFRvU2VsZWN0ID0gdGhpcy5jYWNoZWRTZWFyY2hGaWVsZHMuZmluZChcbiAgICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IHNlYXJjaEZpZWxkLmtleVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VhcmNoRmllbGQkLm5leHQoc2VhcmNoRmllbGRUb1NlbGVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb3JtVmFsdWVDaGFuZ2UoZGF0YTogU2VhcmNoRmllbGQpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubmV4dElmQ2hhbmdlZCh0aGlzLmRhdGFUeXBlSXNUZXh0JCwgZGF0YS5kYXRhVHlwZSA9PT0gJ3RleHQnKTtcbiAgICAgIHRoaXMubmV4dElmQ2hhbmdlZCh0aGlzLmRhdGFUeXBlSXNCb29sZWFuJCwgZGF0YS5kYXRhVHlwZSA9PT0gJ2Jvb2xlYW4nKTtcbiAgICAgIHRoaXMubmV4dElmQ2hhbmdlZCh0aGlzLmZpZWxkVHlwZUlzRHJvcGRvd24kLCB0aGlzLmlzRmllbGRUeXBlRHJvcGRvd24oZGF0YS5maWVsZFR5cGUpKTtcbiAgICAgIHRoaXMubmV4dElmQ2hhbmdlZCh0aGlzLmZvcm1EYXRhJCwgZGF0YSk7XG4gICAgICB0aGlzLm5leHRJZkNoYW5nZWQodGhpcy52YWxpZCQsIHRoaXMuaXNWYWxpZChkYXRhKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBkcm9wZG93bkRhdGFsaXN0Q2hhbmdlKGRhdGE6IE11bHRpSW5wdXRPdXRwdXQpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGlmaWVkRHJvcGRvd25WYWx1ZXMkLm5leHQoZGF0YSBhcyBNdWx0aUlucHV0VmFsdWVzKTtcbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgc2VhcmNoRmllbGRSb3dJbmRleDogbnVtYmVyLFxuICAgIG1vdmVVcDogYm9vbGVhbixcbiAgICBjbGlja0V2ZW50OiBNb3VzZUV2ZW50LFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2hGaWVsZHMgPSBbLi4udGhpcy5jYWNoZWRTZWFyY2hGaWVsZHNdO1xuICAgIGNvbnN0IHNlYXJjaEZpZWxkUm93ID0gc2VhcmNoRmllbGRzW3NlYXJjaEZpZWxkUm93SW5kZXhdO1xuXG4gICAgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHNlYXJjaEZpZWxkSW5kZXggPSBzZWFyY2hGaWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmtleSA9PT0gc2VhcmNoRmllbGRSb3cua2V5KTtcbiAgICBjb25zdCBmb3VuZFNlYXJjaEZpZWxkID0gey4uLnNlYXJjaEZpZWxkc1tzZWFyY2hGaWVsZEluZGV4XX07XG4gICAgY29uc3QgZmlsdGVyZWRTZWFyY2hGaWVsZHMgPSBzZWFyY2hGaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmtleSAhPT0gc2VhcmNoRmllbGRSb3cua2V5KTtcbiAgICBjb25zdCBtdWx0aXBsZVNlYXJjaEZpZWxkcyA9IHNlYXJjaEZpZWxkcy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKG11bHRpcGxlU2VhcmNoRmllbGRzICYmIG1vdmVVcCAmJiBzZWFyY2hGaWVsZEluZGV4ID4gMCkge1xuICAgICAgY29uc3Qgc2VhcmNoRmllbGRCZWZvcmVLZXkgPSBgJHtzZWFyY2hGaWVsZHNbc2VhcmNoRmllbGRJbmRleCAtIDFdLmtleX1gO1xuICAgICAgY29uc3Qgc2VhcmNoRmllbGRCZWZvcmVJbmRleCA9IGZpbHRlcmVkU2VhcmNoRmllbGRzLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBzZWFyY2hGaWVsZEJlZm9yZUtleVxuICAgICAgKTtcbiAgICAgIGZpbHRlcmVkU2VhcmNoRmllbGRzLnNwbGljZShzZWFyY2hGaWVsZEJlZm9yZUluZGV4LCAwLCBmb3VuZFNlYXJjaEZpZWxkKTtcbiAgICAgIHRoaXMudXBkYXRlU2VhcmNoRmllbGRzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGZpbHRlcmVkU2VhcmNoRmllbGRzKTtcbiAgICB9IGVsc2UgaWYgKG11bHRpcGxlU2VhcmNoRmllbGRzICYmICFtb3ZlVXAgJiYgc2VhcmNoRmllbGRJbmRleCA8IHNlYXJjaEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNlYXJjaEZpZWxkQWZ0ZXJLZXkgPSBgJHtzZWFyY2hGaWVsZHNbc2VhcmNoRmllbGRJbmRleCArIDFdLmtleX1gO1xuICAgICAgY29uc3Qgc2VhcmNoRmllbGRBZnRlckluZGV4ID0gZmlsdGVyZWRTZWFyY2hGaWVsZHMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IHNlYXJjaEZpZWxkQWZ0ZXJLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZFNlYXJjaEZpZWxkcy5zcGxpY2Uoc2VhcmNoRmllbGRBZnRlckluZGV4ICsgMSwgMCwgZm91bmRTZWFyY2hGaWVsZCk7XG4gICAgICB0aGlzLnVwZGF0ZVNlYXJjaEZpZWxkcyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZFNlYXJjaEZpZWxkcyk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlU2VsZWN0ZWRTZWFyY2hGaWVsZChcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgc2VsZWN0ZWRTZWFyY2hGaWVsZDogU2VhcmNoRmllbGRcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQoKTtcblxuICAgIGlmICh0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyU3VwcG9ydHNVcGRhdGVzKHNlbGVjdGVkU2VhcmNoRmllbGQ/LmRyb3Bkb3duRGF0YVByb3ZpZGVyKSkge1xuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgLmRlbGV0ZURyb3Bkb3duRGF0YShcbiAgICAgICAgICBzZWxlY3RlZFNlYXJjaEZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgc2VsZWN0ZWRTZWFyY2hGaWVsZC5rZXlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5kZWxldGVEb2N1bWVudFNlYXJjaChkb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWxlY3RlZFNlYXJjaEZpZWxkLmtleSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgdGhpcy5oaWRlTW9kYWwoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2hGaWVsZHMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHNhdmVTZWFyY2hGaWVsZChkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5mb3JtRGF0YSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm9ybURhdGEgPT4ge1xuICAgICAgY29uc3QgbWFwcGVkRm9ybURhdGE6IFNlYXJjaEZpZWxkID0ge1xuICAgICAgICAuLi5mb3JtRGF0YSxcbiAgICAgICAgbWF0Y2hUeXBlOlxuICAgICAgICAgICF0aGlzLmlzRmllbGRUeXBlRHJvcGRvd24oZm9ybURhdGEuZmllbGRUeXBlKSAmJiBmb3JtRGF0YS5kYXRhVHlwZSA9PT0gJ3RleHQnXG4gICAgICAgICAgICA/IGZvcm1EYXRhLm1hdGNoVHlwZVxuICAgICAgICAgICAgOiAnZXhhY3QnLFxuICAgICAgICBmaWVsZFR5cGU6IGZvcm1EYXRhLmRhdGFUeXBlICE9PSAnYm9vbGVhbicgPyBmb3JtRGF0YS5maWVsZFR5cGUgOiAnc2luZ2xlJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHByZXZGb3JtRGF0YSA9IHRoaXMuc2VsZWN0ZWRTZWFyY2hGaWVsZCQudmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJTdXBwb3J0c1VwZGF0ZXMocHJldkZvcm1EYXRhPy5kcm9wZG93bkRhdGFQcm92aWRlcikgJiZcbiAgICAgICAgcHJldkZvcm1EYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyICE9PSBtYXBwZWRGb3JtRGF0YT8uZHJvcGRvd25EYXRhUHJvdmlkZXJcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAgIC5kZWxldGVEcm9wZG93bkRhdGEoXG4gICAgICAgICAgICBwcmV2Rm9ybURhdGEuZHJvcGRvd25EYXRhUHJvdmlkZXIsXG4gICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgcHJldkZvcm1EYXRhLmtleVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcm9wZG93bkRhdGFQcm92aWRlclN1cHBvcnRzVXBkYXRlcyhtYXBwZWRGb3JtRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcikpIHtcbiAgICAgICAgdGhpcy5tb2RpZmllZERyb3Bkb3duVmFsdWVzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkcm9wZG93blZhbHVlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGRyb3Bkb3duVmFsdWVzLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGtleVZhbHVlKSA9PiAoey4uLmFjYywgW2tleVZhbHVlLmtleV06IGtleVZhbHVlLnZhbHVlfSksXG4gICAgICAgICAgICB7fVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgICAgIC5wb3N0RHJvcGRvd25EYXRhKFxuICAgICAgICAgICAgICBtYXBwZWRGb3JtRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSxcbiAgICAgICAgICAgICAgbWFwcGVkRm9ybURhdGEua2V5LFxuICAgICAgICAgICAgICByZXF1ZXN0XG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5wb3N0RG9jdW1lbnRTZWFyY2goZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgbWFwcGVkRm9ybURhdGEpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgICB0aGlzLmhpZGVNb2RhbCgpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoRmllbGRzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3RmllbGRzID0gWy4uLnRoaXMuY2FjaGVkU2VhcmNoRmllbGRzXTtcbiAgICAgICAgY29uc3QgaW5kZXhUb1JlcGxhY2UgPSBuZXdGaWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmtleSA9PT0gbWFwcGVkRm9ybURhdGEua2V5KTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRGaWVsZHMgPSBuZXdGaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmtleSAhPT0gbWFwcGVkRm9ybURhdGEua2V5KTtcblxuICAgICAgICBmaWx0ZXJlZEZpZWxkcy5zcGxpY2UoaW5kZXhUb1JlcGxhY2UsIDAsIG1hcHBlZEZvcm1EYXRhKTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hGaWVsZHMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgZmlsdGVyZWRGaWVsZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlU2VhcmNoRmllbGRzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZywgbmV3U2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2UucHV0RG9jdW1lbnRTZWFyY2goZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgbmV3U2VhcmNoRmllbGRzKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgdGhpcy5oaWRlTW9kYWwoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoRmllbGRzKCk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dElmQ2hhbmdlZChiZWhhdmlvdXJTdWJqZWN0JDogQmVoYXZpb3JTdWJqZWN0PGFueT4sIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYmVoYXZpb3VyU3ViamVjdCQudmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHtcbiAgICAgIGJlaGF2aW91clN1YmplY3QkLm5leHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZChkYXRhOiBTZWFyY2hGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbGlkTWF0Y2hUeXBlID1cbiAgICAgIGRhdGEuZGF0YVR5cGUgPT09ICd0ZXh0JyAmJiAhdGhpcy5pc0ZpZWxkVHlwZURyb3Bkb3duKGRhdGEuZmllbGRUeXBlKSA/IGRhdGEubWF0Y2hUeXBlIDogdHJ1ZTtcbiAgICBjb25zdCB2YWxpZERyb3Bkb3duRGF0YVByb3ZpZGVyID0gdGhpcy5pc0ZpZWxkVHlwZURyb3Bkb3duKGRhdGEuZmllbGRUeXBlKVxuICAgICAgPyBkYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyXG4gICAgICA6IHRydWU7XG4gICAgY29uc3QgY29udGFpbnNBbGxWYWx1ZXMgPSAhIShcbiAgICAgIGRhdGEua2V5ICYmXG4gICAgICBkYXRhLmRhdGFUeXBlICYmXG4gICAgICB2YWxpZE1hdGNoVHlwZSAmJlxuICAgICAgdmFsaWREcm9wZG93bkRhdGFQcm92aWRlciAmJlxuICAgICAgZGF0YS5wYXRoXG4gICAgKTtcbiAgICBjb25zdCBrZXlJc1VuaXF1ZSA9XG4gICAgICAhdGhpcy5zZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZCB8fFxuICAgICAgdGhpcy5jYWNoZWRTZWFyY2hGaWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmtleSA9PT0gZGF0YS5rZXkpID09PSAtMTtcblxuICAgIHJldHVybiBjb250YWluc0FsbFZhbHVlcyAmJiBrZXlJc1VuaXF1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaWVsZFR5cGVEcm9wZG93bihmaWVsZFR5cGU/OiBTZWFyY2hGaWVsZEZpZWxkVHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWVsZFR5cGUgPT09ICdzaW5nbGUtc2VsZWN0LWRyb3Bkb3duJyB8fCBmaWVsZFR5cGUgPT09ICdtdWx0aS1zZWxlY3QtZHJvcGRvd24nO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wZG93bkRhdGFQcm92aWRlclN1cHBvcnRzVXBkYXRlcyhkcm9wZG93bkRhdGFQcm92aWRlcj86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkcm9wZG93bkRhdGFQcm92aWRlciA9PT0gJ2Ryb3Bkb3duRGF0YWJhc2VEYXRhUHJvdmlkZXInO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU2VsZWN0ZWRTZWFyY2hGaWVsZFN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zZWxlY3RlZFNlYXJjaEZpZWxkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dNb2RhbCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTW9kYWxTaG93aW5nU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm1vZGFsLm1vZGFsU2hvd2luZyQuc3Vic2NyaWJlKG1vZGFsU2hvd2luZyA9PiB7XG4gICAgICAgIGlmIChtb2RhbFNob3dpbmcpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaEZpZWxkc0Zvcm0gPSB0cnVlO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoRmllbGRzRm9ybSA9IGZhbHNlO1xuICAgICAgICAgIH0sIDE1MCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RG93bmxvYWQoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLCBzZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPik6IHZvaWQge1xuICAgIHRoaXMuZG93bmxvYWROYW1lJC5uZXh0KGAke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9Lmpzb25gKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsJC5uZXh0KFxuICAgICAgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChcbiAgICAgICAgJ2RhdGE6dGV4dC9qc29uO2NoYXJzZXQ9VVRGLTgsJyArXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHtzZWFyY2hGaWVsZHN9LCBudWxsLCAyKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubW9kYWw/LnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMubW9kYWw/LmhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFNlYXJjaEZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hTZWFyY2hGaWVsZHMkLm5leHQobnVsbCk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIntcbiAgICBzZWFyY2hGaWVsZHM6IHRyYW5zbGF0ZWRTZWFyY2hGaWVsZHMkIHwgYXN5bmMsXG4gICAgZmllbGRzOiBmaWVsZHMkIHwgYXN5bmMsXG4gICAgZG93bmxvYWRVcmw6IGRvd25sb2FkVXJsJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkTmFtZTogZG93bmxvYWROYW1lJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmMsXG4gICAgdmFsaWQ6IHZhbGlkJCB8IGFzeW5jLFxuICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jXG4gIH0gYXMgb2JzXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3Q7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsOyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNidXR0b25zIGxldC1vYnM9XCJvYnNcIj5cbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtdC1tM3B4IG1iLTMgcHItMiBmbG9hdC1yaWdodFwiPlxuICAgIDxhXG4gICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zcGFjZVwiXG4gICAgICBbaHJlZl09XCJvYnMuZG93bmxvYWRVcmxcIlxuICAgICAgW2Rvd25sb2FkXT1cIm9icy5kb3dubG9hZE5hbWVcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAhb2JzLmRvd25sb2FkVXJsIHx8ICFvYnMuZG93bmxvYWROYW1lIHx8IG9icy5zZWFyY2hGaWVsZHMubGVuZ3RoIDw9IDAgfHwgb2JzLmRpc2FibGVJbnB1dFxuICAgICAgfVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJpY29uIG1kaSBtZGktZG93bmxvYWQgbXItMVwiPjwvaT5cbiAgICAgIHt7ICdzZWFyY2hGaWVsZHMuZG93bmxvYWRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYT5cbiAgICA8YnV0dG9uXG4gICAgICAoY2xpY2spPVwic2VhcmNoRmllbGRDbGlja2VkKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNwYWNlXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDogbG9hZGluZ1NlYXJjaEZpZWxkcyB8fCBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJpY29uIG1kaSBtZGktcGx1cyBtci0xXCI+PC9pPlxuICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmFkZFJvdycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3QgbGV0LW9icz1cIm9ic1wiPlxuICA8dmFsdGltby1saXN0XG4gICAgW2l0ZW1zXT1cIm9icy5zZWFyY2hGaWVsZHNcIlxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAocm93Q2xpY2tlZCk9XCJzZWFyY2hGaWVsZENsaWNrZWQoJGV2ZW50LCBmYWxzZSlcIlxuICAgICpuZ0lmPVwib2JzLnNlYXJjaEZpZWxkczsgZWxzZSBsb2FkaW5nXCJcbiAgICBbbGFzdENvbHVtblRlbXBsYXRlXT1cIm1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWZcIlxuICA+XG4gIDwvdmFsdGltby1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb3ZlUm93QnV0dG9ucyBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1sZW5ndGg9XCJsZW5ndGhcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibW92ZS1yb3ctYnV0dG9uc1wiXG4gICAgKm5nSWY9XCJ7XG4gICAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCQgfCBhc3luYyxcbiAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmNcbiAgICB9IGFzIG9ic1wiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtZGkgbWRpLWFycm93LXVwLWJvbGQgYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMVwiXG4gICAgICAoY2xpY2spPVwibW92ZVJvdyhpbmRleCwgdHJ1ZSwgJGV2ZW50LCBvYnMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCBkaXNhYmxlZC1tb3ZlLXJvdy1idXR0b24nOiBpbmRleCA9PT0gMCB8fCBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPjwvaT5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtZGkgbWRpLWFycm93LWRvd24tYm9sZCBidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCJcbiAgICAgIChjbGljayk9XCJtb3ZlUm93KGluZGV4LCBmYWxzZSwgJGV2ZW50LCBvYnMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IGxlbmd0aCAtIDEgfHwgb2JzLmRpc2FibGVJbnB1dFxuICAgICAgfVwiXG4gICAgPjwvaT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsIGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tbW9kYWxcbiAgICAjc2VhcmNoRmllbGRNb2RhbFxuICAgIGVsZW1lbnRJZD1cInNlYXJjaEZpZWxkTW9kYWxcIlxuICAgIFt0aXRsZV09XCJcbiAgICAgIHNlYXJjaEZpZWxkQWN0aW9uVHlwZUlzQWRkXG4gICAgICAgID8gKCdzZWFyY2hGaWVsZHNPdmVydmlldy5hZGRSb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICA6ICgnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZWRpdCcgfCB0cmFuc2xhdGUpXG4gICAgXCJcbiAgICBbc2hvd0Zvb3Rlcl09XCJ0cnVlXCJcbiAgPlxuICAgIDxkaXYgYm9keSBjbGFzcz1cIm10LTJcIj5cbiAgICAgIDx2LWZvcm1cbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm1WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKm5nSWY9XCJzaG93U2VhcmNoRmllbGRzRm9ybSAmJiB7c2VhcmNoRmllbGQ6IHNlbGVjdGVkU2VhcmNoRmllbGQkIHwgYXN5bmN9IGFzIHNlYXJjaE9ic1wiXG4gICAgICA+XG4gICAgICAgIDx2LWlucHV0XG4gICAgICAgICAgbmFtZT1cInRpdGxlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnRpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW21hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICBbZGVmYXVsdFZhbHVlXT1cInNlYXJjaE9icy5zZWFyY2hGaWVsZD8udGl0bGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwiZmFsc2VcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICA8L3YtaW5wdXQ+XG4gICAgICAgIDx2LWlucHV0XG4gICAgICAgICAgbmFtZT1cImtleVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5rZXknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbbWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwic2VhcmNoT2JzLnNlYXJjaEZpZWxkPy5rZXlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0IHx8ICFzZWFyY2hGaWVsZEFjdGlvblR5cGVJc0FkZFwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgIFt3aWR0aFB4XT1cIjIwMFwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0PlxuICAgICAgICA8di1pbnB1dFxuICAgICAgICAgIG5hbWU9XCJwYXRoXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbbWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwic2VhcmNoT2JzLnNlYXJjaEZpZWxkPy5wYXRoXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMucGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dD5cbiAgICAgICAgPHYtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCJkYXRhVHlwZUl0ZW1zJCB8IGFzeW5jIGFzIGRhdGFUeXBlSXRlbXNcIlxuICAgICAgICAgIFtpdGVtc109XCJkYXRhVHlwZUl0ZW1zXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnNlYXJjaEZpZWxkUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRhdGFUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgIG5hbWU9XCJkYXRhVHlwZVwiXG4gICAgICAgICAgW2RlZmF1bHRTZWxlY3Rpb25JZF09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/LmRhdGFUeXBlXCJcbiAgICAgICAgICBbd2lkdGhJblB4XT1cIjIwMFwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvdi1zZWxlY3Q+XG4gICAgICAgIDx2LXNlbGVjdFxuICAgICAgICAgICpuZ0lmPVwiKHNob3dNYXRjaFR5cGVzJCB8IGFzeW5jKSAmJiAobWF0Y2hUeXBlSXRlbXMkIHwgYXN5bmMpIGFzIG1hdGNoVHlwZUl0ZW1zXCJcbiAgICAgICAgICBbaXRlbXNdPVwibWF0Y2hUeXBlSXRlbXNcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2VhcmNoRmllbGRQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcubWF0Y2hUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgIG5hbWU9XCJtYXRjaFR5cGVcIlxuICAgICAgICAgIFtkZWZhdWx0U2VsZWN0aW9uSWRdPVwic2VhcmNoT2JzLnNlYXJjaEZpZWxkPy5tYXRjaFR5cGVcIlxuICAgICAgICAgIFt3aWR0aEluUHhdPVwiMjAwXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5tYXRjaFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvdi1zZWxlY3Q+XG4gICAgICAgIDx2LXNlbGVjdFxuICAgICAgICAgICpuZ0lmPVwiZmllbGRUeXBlSXRlbXMkIHwgYXN5bmMgYXMgZmllbGRUeXBlSXRlbXNcIlxuICAgICAgICAgIFtpdGVtc109XCJmaWVsZFR5cGVJdGVtc1wiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5zZWFyY2hGaWVsZFBsYWNlaG9sZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5maWVsZFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgW21hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgbmFtZT1cImZpZWxkVHlwZVwiXG4gICAgICAgICAgW2RlZmF1bHRTZWxlY3Rpb25JZF09XCJzZWFyY2hPYnMuc2VhcmNoRmllbGQ/LmZpZWxkVHlwZVwiXG4gICAgICAgICAgW3dpZHRoSW5QeF09XCIyMDBcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmZpZWxkVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+PC92LXNlbGVjdD5cbiAgICAgICAgPHYtc2VsZWN0XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIChmaWVsZFR5cGVJc0Ryb3Bkb3duJCB8IGFzeW5jKSAmJlxuICAgICAgICAgICAgKGRyb3Bkb3duRGF0YVByb3ZpZGVyTmFtZXMkIHwgYXN5bmMpIGFzIGRyb3Bkb3duRGF0YVByb3ZpZGVyTmFtZXNcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpdGVtc109XCJkcm9wZG93bkRhdGFQcm92aWRlck5hbWVzXCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnNlYXJjaEZpZWxkUGxhY2Vob2xkZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cImZhbHNlXCJcbiAgICAgICAgICBuYW1lPVwiZHJvcGRvd25EYXRhUHJvdmlkZXJcIlxuICAgICAgICAgIFtkZWZhdWx0U2VsZWN0aW9uSWRdPVwic2VhcmNoT2JzLnNlYXJjaEZpZWxkPy5kcm9wZG93bkRhdGFQcm92aWRlclwiXG4gICAgICAgICAgW3dpZHRoSW5QeF09XCIyMDBcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID48L3Ytc2VsZWN0PlxuICAgICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHNob3dJbnB1dERyb3Bkb3duVGFibGUkIHwgYXN5bmMpICYmXG4gICAgICAgICAgICAoaW5pdGlhbERyb3Bkb3duVmFsdWVzJCB8IGFzeW5jKSBhcyBpbml0aWFsRHJvcGRvd25WYWx1ZXNcbiAgICAgICAgICBcIlxuICAgICAgICAgIG5hbWU9XCJkcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICB0eXBlPVwia2V5VmFsdWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICBbZGVmYXVsdFZhbHVlc109XCJpbml0aWFsRHJvcGRvd25WYWx1ZXNcIlxuICAgICAgICAgIFttYXJnaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cImZhbHNlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZHJvcGRvd25EYXRhbGlzdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3ZhbHRpbW8tY2FyYm9uLW11bHRpLWlucHV0PlxuICAgICAgICA8di10YWJsZVxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAoc2hvd1JlYWRvbmx5RHJvcGRvd25UYWJsZSQgfCBhc3luYykgJiZcbiAgICAgICAgICAgIChpbml0aWFsRHJvcGRvd25WYWx1ZXMkIHwgYXN5bmMpIGFzIGluaXRpYWxEcm9wZG93blZhbHVlc1xuICAgICAgICAgIFwiXG4gICAgICAgICAgW2l0ZW1zXT1cImluaXRpYWxEcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgW2NvbHVtbnNdPVwiZHJvcGRvd25Db2x1bW5zJCB8IGFzeW5jXCJcbiAgICAgICAgICBbc2hvd0VkaXRCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICBbaXRlbXNUcmFuc2xhdGlvbktleV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcnXCJcbiAgICAgICAgICBbc2hvd1BhZ2luYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFttb2JpbGVCcmVha3BvaW50UHhdPVwiMjAwXCJcbiAgICAgICAgPjwvdi10YWJsZT5cbiAgICAgIDwvdi1mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBwLTBcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnNGb290ZXJNb2RhbDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvdmFsdGltby1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uc0Zvb3Rlck1vZGFsIGxldC1vYnM9XCJvYnNcIj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCIgKm5nSWY9XCJ7c2VhcmNoRmllbGQ6IHNlbGVjdGVkU2VhcmNoRmllbGQkIHwgYXN5bmN9IGFzIHNlYXJjaE9ic1wiPlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1idXR0b25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zcGFjZSBidG4tc2Vjb25kYXJ5XCJcbiAgICAgICAgKm5nSWY9XCIhc2VhcmNoRmllbGRBY3Rpb25UeXBlSXNBZGRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3RlZFNlYXJjaEZpZWxkKG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lLCBzZWFyY2hPYnMuc2VhcmNoRmllbGQpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAoY2xpY2spPVwic2F2ZVNlYXJjaEZpZWxkKG9icy5kb2N1bWVudERlZmluaXRpb25OYW1lKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc3BhY2UgbXItMFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJvYnMuZGlzYWJsZUlucHV0IHx8ICFvYnMudmFsaWRcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc3VibWl0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgIDx2YWx0aW1vLXNwaW5uZXI+PC92YWx0aW1vLXNwaW5uZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==