@valtimo/object-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 (36) hide show
  1. package/{esm2020 → esm2022}/lib/components/object-management-detail-container/object-management-detail-container.component.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/components/object-management-detail-container/tabs/object-management-detail/object-management-detail.component.mjs +4 -4
  3. package/esm2022/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.mjs +446 -0
  4. package/esm2022/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.mjs +341 -0
  5. package/{esm2020 → esm2022}/lib/components/object-management-list/object-management-list.component.mjs +4 -4
  6. package/esm2022/lib/components/object-management-modal/object-management-modal.component.mjs +146 -0
  7. package/esm2022/lib/components/object-management-upload-modal/object-management-upload-modal.component.mjs +184 -0
  8. package/{esm2020 → esm2022}/lib/object-management-routing.module.mjs +5 -5
  9. package/esm2022/lib/object-management.module.mjs +141 -0
  10. package/{esm2020 → esm2022}/lib/services/object-management-state.service.mjs +4 -4
  11. package/{esm2020 → esm2022}/lib/services/object-management.service.mjs +4 -4
  12. package/{esm2020 → esm2022}/lib/services/tab.service.mjs +4 -4
  13. package/{fesm2020 → fesm2022}/valtimo-object-management.mjs +110 -109
  14. package/fesm2022/valtimo-object-management.mjs.map +1 -0
  15. package/lib/components/object-management-detail-container/object-management-detail-container.component.d.ts +1 -1
  16. package/lib/components/object-management-detail-container/tabs/object-management-detail/object-management-detail.component.d.ts +1 -1
  17. package/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.d.ts +2 -3
  18. package/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.d.ts +1 -1
  19. package/lib/components/object-management-list/object-management-list.component.d.ts +1 -1
  20. package/lib/components/object-management-modal/object-management-modal.component.d.ts +3 -3
  21. package/lib/components/object-management-upload-modal/object-management-upload-modal.component.d.ts +3 -3
  22. package/lib/models/object-management.model.d.ts +1 -1
  23. package/lib/object-management.module.d.ts +3 -4
  24. package/package.json +8 -14
  25. package/esm2020/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.mjs +0 -447
  26. package/esm2020/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.mjs +0 -342
  27. package/esm2020/lib/components/object-management-modal/object-management-modal.component.mjs +0 -146
  28. package/esm2020/lib/components/object-management-upload-modal/object-management-upload-modal.component.mjs +0 -185
  29. package/esm2020/lib/object-management.module.mjs +0 -142
  30. package/fesm2015/valtimo-object-management.mjs +0 -1590
  31. package/fesm2015/valtimo-object-management.mjs.map +0 -1
  32. package/fesm2020/valtimo-object-management.mjs.map +0 -1
  33. /package/{esm2020 → esm2022}/lib/models/object-management.model.mjs +0 -0
  34. /package/{esm2020 → esm2022}/lib/services/tab.enum.mjs +0 -0
  35. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  36. /package/{esm2020 → esm2022}/valtimo-object-management.mjs +0 -0
@@ -1,447 +0,0 @@
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, ViewChild } from '@angular/core';
17
- import { BehaviorSubject, combineLatest, delay, filter, map, of, startWith, Subject, switchMap, tap, } from 'rxjs';
18
- import { catchError, take } from 'rxjs/operators';
19
- import { FormControl, FormGroup, Validators } from '@angular/forms';
20
- import * as i0 from "@angular/core";
21
- import * as i1 from "../../../../services/object-management.service";
22
- import * as i2 from "@angular/router";
23
- import * as i3 from "@ngx-translate/core";
24
- import * as i4 from "@valtimo/config";
25
- import * as i5 from "@angular/platform-browser";
26
- import * as i6 from "@angular/common";
27
- import * as i7 from "@valtimo/components";
28
- import * as i8 from "carbon-components-angular";
29
- import * as i9 from "@valtimo/user-interface";
30
- import * as i10 from "@angular/forms";
31
- export class ObjectManagementListColumnsComponent {
32
- constructor(objectManagementService, route, translateService, configService, sanitizer) {
33
- this.objectManagementService = objectManagementService;
34
- this.route = route;
35
- this.translateService = translateService;
36
- this.configService = configService;
37
- this.sanitizer = sanitizer;
38
- this.downloadName$ = new BehaviorSubject('');
39
- this.downloadUrl$ = new BehaviorSubject(undefined);
40
- this.loading$ = new BehaviorSubject(true);
41
- this.currentModalType$ = new BehaviorSubject('create');
42
- this.showModal$ = new BehaviorSubject(false);
43
- this.modalShowing$ = this.showModal$.pipe(delay(250));
44
- this.disableInput$ = new BehaviorSubject(false);
45
- this.showDeleteModal$ = new Subject();
46
- this.deleteRowIndex$ = new BehaviorSubject(0);
47
- this.defaultEnumValues$ = new BehaviorSubject(undefined);
48
- this.INVALID_KEY = 'invalid';
49
- this.formGroup = new FormGroup({
50
- title: new FormControl(''),
51
- key: new FormControl('', Validators.required),
52
- path: new FormControl('', Validators.required),
53
- dateFormat: new FormControl(''),
54
- displayType: new FormControl({
55
- key: this.INVALID_KEY,
56
- }),
57
- sortable: new FormControl(false),
58
- defaultSort: new FormControl({
59
- key: this.INVALID_KEY,
60
- }),
61
- enum: new FormControl([]),
62
- });
63
- this.DISPLAY_TYPES = [
64
- 'string',
65
- 'date',
66
- 'boolean',
67
- 'enum',
68
- 'arrayCount',
69
- 'underscoresToSpaces',
70
- ];
71
- this.COLUMNS = [
72
- {
73
- viewType: 'string',
74
- sortable: false,
75
- propertyName: 'title',
76
- translationKey: 'title',
77
- },
78
- {
79
- viewType: 'string',
80
- sortable: false,
81
- propertyName: 'key',
82
- translationKey: 'key',
83
- },
84
- {
85
- viewType: 'string',
86
- sortable: false,
87
- propertyName: 'path',
88
- translationKey: 'path',
89
- },
90
- {
91
- viewType: 'string',
92
- sortable: false,
93
- propertyName: 'displayType',
94
- translationKey: 'displayType',
95
- },
96
- {
97
- viewType: 'string',
98
- sortable: false,
99
- propertyName: 'displayTypeParameters',
100
- translationKey: 'displayTypeParameters',
101
- },
102
- {
103
- viewType: 'string',
104
- sortable: false,
105
- propertyName: 'sortable',
106
- translationKey: 'sortable',
107
- },
108
- {
109
- viewType: 'string',
110
- sortable: false,
111
- propertyName: 'defaultSort',
112
- translationKey: 'defaultSort',
113
- },
114
- ];
115
- this.cachedObjectManagementListColumns = [];
116
- this.refreshObjectManagementListColumns$ = new BehaviorSubject(null);
117
- this.objectManagementFields$ = this.translateService
118
- .stream('key')
119
- .pipe(map(() => this.COLUMNS.map(column => ({
120
- key: column.propertyName,
121
- label: this.translateService.instant(`listColumn.${column.translationKey}`),
122
- sortable: column.sortable,
123
- ...(column.viewType && { viewType: column.viewType }),
124
- ...(column.enum && { enum: column.enum }),
125
- }))));
126
- this.objectId$ = this.route.params.pipe(map(params => params.id || ''), filter(objectId => !!objectId));
127
- this.objectManagementListColumns$ = combineLatest([
128
- this.objectId$,
129
- this.refreshObjectManagementListColumns$,
130
- ]).pipe(switchMap(([objectId]) => this.objectManagementService.getSearchList(objectId)), tap(objectManagementListColumns => {
131
- this.objectId$.pipe(take(1)).subscribe(objectId => {
132
- if (objectManagementListColumns &&
133
- Array.isArray(objectManagementListColumns) &&
134
- objectManagementListColumns.length > 0) {
135
- this.setDownload(objectId, objectManagementListColumns);
136
- }
137
- });
138
- }), tap(objectManagementListColumns => {
139
- this.cachedObjectManagementListColumns = objectManagementListColumns;
140
- this.loading$.next(false);
141
- this.enableInput();
142
- }));
143
- this.translatedObjectManagementListColumns$ = combineLatest([this.objectManagementListColumns$, this.translateService.stream('key')]).pipe(map(([columns]) => columns.map(column => ({
144
- ...column,
145
- title: column.title || '-',
146
- sortable: column.sortable
147
- ? this.translateService.instant('listColumn.sortableYes')
148
- : this.translateService.instant('listColumn.sortableNo'),
149
- defaultSort: (column.defaultSort === 'ASC' &&
150
- this.translateService.instant('listColumn.sortableAsc')) ||
151
- (column.defaultSort === 'DESC' &&
152
- this.translateService.instant('listColumn.sortableDesc')) ||
153
- '-',
154
- displayType: this.translateService.instant(`listColumnDisplayType.${column?.displayType?.type}`),
155
- displayTypeParameters: this.getDisplayTypeParametersView(column.displayType.displayTypeParameters),
156
- }))));
157
- this.disableDefaultSort$ = combineLatest([
158
- this.currentModalType$,
159
- this.formGroup.valueChanges,
160
- ]).pipe(map(([currentModalType]) => currentModalType === 'create' &&
161
- this.cachedObjectManagementListColumns.find(column => !!column.defaultSort)), startWith(false));
162
- this.showDateFormat$ = this.formGroup.valueChanges.pipe(map(formValues => formValues.displayType?.key === this.DISPLAY_TYPES[1]), tap(showDateFormat => {
163
- if (showDateFormat === false && !!this.formGroup.value.dateFormat) {
164
- this.formGroup.patchValue({ dateFormat: '' });
165
- }
166
- }), startWith(false));
167
- this.showEnum$ = this.formGroup.valueChanges.pipe(map(formValues => !!(formValues.displayType?.key === this.DISPLAY_TYPES[3] ||
168
- formValues.displayType?.key === this.DISPLAY_TYPES[2])), tap(showEnum => {
169
- const enumValue = this.formGroup.value.enum;
170
- if (showEnum === false && Array.isArray(enumValue) && enumValue.length > 0) {
171
- this.formGroup.patchValue({ enum: [] });
172
- }
173
- }), startWith(false));
174
- this.isYesNo$ = this.formGroup.valueChanges.pipe(map(formValues => formValues.displayType?.key === this.DISPLAY_TYPES[2]));
175
- this.selectedViewTypeItemIndex$ = new BehaviorSubject(0);
176
- this.viewTypeItems$ = combineLatest([
177
- this.selectedViewTypeItemIndex$,
178
- this.translateService.stream('key'),
179
- ]).pipe(map(([selectedViewTypeItemIndex]) => [
180
- {
181
- content: this.translateService.instant(`listColumnDisplayType.select`),
182
- key: this.INVALID_KEY,
183
- },
184
- ...this.DISPLAY_TYPES.map(type => ({
185
- content: this.translateService.instant(`listColumnDisplayType.${type}`),
186
- key: type,
187
- })),
188
- ].map((item, index) => ({
189
- ...item,
190
- selected: index === selectedViewTypeItemIndex,
191
- }))));
192
- this.selectedSortItemIndex$ = new BehaviorSubject(0);
193
- this.sortItems$ = combineLatest([
194
- this.selectedSortItemIndex$,
195
- this.translateService.stream('key'),
196
- ]).pipe(map(([selectedSortItemIndex]) => [
197
- {
198
- content: this.translateService.instant(`listColumn.selectDefaultSort`),
199
- key: this.INVALID_KEY,
200
- },
201
- {
202
- content: this.translateService.instant(`listColumn.sortableAsc`),
203
- key: 'ASC',
204
- },
205
- {
206
- content: this.translateService.instant(`listColumn.sortableDesc`),
207
- key: 'DESC',
208
- },
209
- ].map((item, index) => ({
210
- ...item,
211
- selected: index === selectedSortItemIndex,
212
- }))));
213
- this.validKey$ = combineLatest([this.formGroup.valueChanges, this.currentModalType$]).pipe(map(([formValues, currentModalType]) => {
214
- const existingKeys = this.cachedObjectManagementListColumns.map(column => column.key);
215
- return currentModalType === 'create' ? !existingKeys.includes(formValues.key) : true;
216
- }), startWith(false));
217
- this.valid$ = combineLatest([this.formGroup.valueChanges, this.validKey$]).pipe(map(([formValues, validKey]) => !!(formValues.displayType?.key !== this.INVALID_KEY &&
218
- formValues.path &&
219
- validKey &&
220
- (formValues.displayType.key === 'enum' ? formValues.enum?.length > 0 : true))), startWith(false));
221
- }
222
- openModal(modalType) {
223
- this.showModal$.next(true);
224
- this.currentModalType$.next(modalType);
225
- if (modalType === 'create') {
226
- this.formGroup.controls['key'].enable();
227
- this.resetFormGroup();
228
- }
229
- else if (modalType === 'edit') {
230
- this.formGroup.controls['key'].disable();
231
- }
232
- }
233
- closeModal() {
234
- this.showModal$.next(false);
235
- }
236
- deleteRow(searchListColumnRowIndex, clickEvent) {
237
- clickEvent.stopPropagation();
238
- this.showDeleteModal$.next(true);
239
- this.deleteRowIndex$.next(searchListColumnRowIndex);
240
- }
241
- deleteRowConfirmation(searchListColumnRowIndex) {
242
- const columnKey = this.getColumnKey(searchListColumnRowIndex);
243
- if (columnKey) {
244
- this.disableInput();
245
- this.objectId$
246
- .pipe(take(1), switchMap(objectId => this.objectManagementService.deleteSearchList(objectId, columnKey)), tap(() => this.refreshObjectManagementListColumns()), catchError(() => {
247
- this.enableInput();
248
- return of(null);
249
- }))
250
- .subscribe();
251
- }
252
- }
253
- getColumnKey(searchListColumnRowIndex) {
254
- return this.cachedObjectManagementListColumns[searchListColumnRowIndex]?.key;
255
- }
256
- moveRow(searchListColumnRowIndex, moveUp, clickEvent, objectId) {
257
- const objectManagementListColumns = [...this.cachedObjectManagementListColumns];
258
- const searchListColumnRow = objectManagementListColumns[searchListColumnRowIndex];
259
- clickEvent.stopPropagation();
260
- const searchListColumnIndex = objectManagementListColumns.findIndex(field => field.key === searchListColumnRow.key);
261
- const foundSearchListColumn = { ...objectManagementListColumns[searchListColumnIndex] };
262
- const filteredSearchListColumns = objectManagementListColumns.filter(field => field.key !== searchListColumnRow.key);
263
- const multipleSearchListColumns = objectManagementListColumns.length > 1;
264
- if (multipleSearchListColumns && moveUp && searchListColumnIndex > 0) {
265
- const searchListColumnBeforeKey = `${objectManagementListColumns[searchListColumnIndex - 1].key}`;
266
- const searchListColumnBeforeIndex = filteredSearchListColumns.findIndex(field => field.key === searchListColumnBeforeKey);
267
- filteredSearchListColumns.splice(searchListColumnBeforeIndex, 0, foundSearchListColumn);
268
- this.updateObjectManagementListColumn(objectId, filteredSearchListColumns);
269
- }
270
- else if (multipleSearchListColumns &&
271
- !moveUp &&
272
- searchListColumnIndex < objectManagementListColumns.length) {
273
- const caseListColumnAfterKey = `${objectManagementListColumns[searchListColumnIndex + 1].key}`;
274
- const caseListColumnAfterIndex = filteredSearchListColumns.findIndex(field => field.key === caseListColumnAfterKey);
275
- filteredSearchListColumns.splice(caseListColumnAfterIndex + 1, 0, foundSearchListColumn);
276
- this.updateObjectManagementListColumn(objectId, filteredSearchListColumns);
277
- }
278
- }
279
- saveCasListColumns() {
280
- this.disableInput();
281
- this.currentModalType$.pipe(take(1)).subscribe(currentModalType => {
282
- if (currentModalType === 'create') {
283
- this.addColumn();
284
- }
285
- else {
286
- this.updateColumn();
287
- }
288
- });
289
- }
290
- enumValueChange(value) {
291
- this.formGroup.patchValue({ enum: value });
292
- }
293
- columnRowClicked(row) {
294
- this.resetFormGroup();
295
- combineLatest([this.viewTypeItems$, this.sortItems$])
296
- .pipe(take(1))
297
- .subscribe(([viewTypeItems, sortItems]) => {
298
- const column = this.cachedObjectManagementListColumns.find(cachedColumn => cachedColumn.key === row.key);
299
- const viewTypeItem = viewTypeItems.find(item => item.key === column.displayType.type);
300
- const viewTypeItemIndex = viewTypeItems.findIndex(item => item.key === column.displayType.type);
301
- const sortItem = sortItems.find(item => item.key === column.defaultSort);
302
- const sortItemIndex = sortItems.findIndex(item => item.key === column.defaultSort);
303
- const enumValues = column?.displayType?.displayTypeParameters?.enum;
304
- const mappedEnumValues = [];
305
- const columnDateFormat = column?.displayType?.displayTypeParameters?.dateFormat;
306
- this.selectedViewTypeItemIndex$.next(viewTypeItemIndex);
307
- if (sortItem) {
308
- this.selectedSortItemIndex$.next(sortItemIndex);
309
- }
310
- if (enumValues) {
311
- Object.keys(enumValues).forEach(key => {
312
- mappedEnumValues.push({ key, value: enumValues[key] });
313
- });
314
- this.defaultEnumValues$.next(mappedEnumValues);
315
- }
316
- else {
317
- this.defaultEnumValues$.next([{ key: '', value: '' }]);
318
- }
319
- this.formGroup.patchValue({
320
- key: column.key,
321
- title: column.title,
322
- path: column.path,
323
- sortable: column.sortable,
324
- // @ts-ignore
325
- displayType: { ...viewTypeItem },
326
- // @ts-ignore
327
- defaultSort: sortItem ? { ...sortItem } : { ...sortItems[0] },
328
- ...(columnDateFormat && {
329
- dateFormat: columnDateFormat,
330
- }),
331
- });
332
- this.openModal('edit');
333
- });
334
- }
335
- updateObjectManagementListColumn(objectId, listColumn) {
336
- this.disableInput();
337
- this.objectManagementService
338
- .putSearchListColumns(objectId, listColumn)
339
- .pipe(tap(() => {
340
- this.refreshObjectManagementListColumns();
341
- localStorage.setItem(`list-search-${objectId}`, null);
342
- }), catchError(() => {
343
- this.enableInput();
344
- return of(null);
345
- }))
346
- .subscribe();
347
- }
348
- addColumn() {
349
- const formValue = this.formGroup.value;
350
- this.objectId$
351
- .pipe(take(1), switchMap(objectId => this.objectManagementService.postSearchList(objectId, this.mapFormValuesToColumn(formValue))), tap(() => {
352
- this.closeModal();
353
- this.refreshObjectManagementListColumns();
354
- }), catchError(() => {
355
- this.enableInput();
356
- return of(null);
357
- }))
358
- .subscribe();
359
- }
360
- getDisplayTypeParametersView(displayTypeParameters) {
361
- if (displayTypeParameters?.dateFormat) {
362
- return displayTypeParameters.dateFormat;
363
- }
364
- else if (displayTypeParameters?.enum) {
365
- return Object.keys(displayTypeParameters.enum).reduce((acc, curr) => {
366
- const keyValuePairString = `${curr}: ${displayTypeParameters.enum[curr]}`;
367
- if (!acc) {
368
- return `${keyValuePairString}`;
369
- }
370
- return `${acc}, ${keyValuePairString}`;
371
- }, '');
372
- }
373
- return '-';
374
- }
375
- updateColumn() {
376
- this.objectId$
377
- .pipe(take(1), switchMap(objectId => this.objectManagementService.putSearchList(objectId, this.formGroup.value.key, this.mapFormValuesToColumn(this.formGroup.value))), tap(() => {
378
- this.closeModal();
379
- this.refreshObjectManagementListColumns();
380
- }), catchError(() => {
381
- this.enableInput();
382
- return of(null);
383
- }))
384
- .subscribe();
385
- }
386
- setDownload(objectId, ObjectManagementListColumns) {
387
- this.downloadName$.next(`${objectId}.json`);
388
- this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
389
- encodeURIComponent(JSON.stringify(ObjectManagementListColumns, null, 2))));
390
- }
391
- disableInput() {
392
- this.disableInput$.next(true);
393
- this.formGroup.disable();
394
- }
395
- enableInput() {
396
- this.disableInput$.next(false);
397
- this.formGroup.enable();
398
- }
399
- refreshObjectManagementListColumns() {
400
- this.refreshObjectManagementListColumns$.next(null);
401
- }
402
- resetFormGroup() {
403
- this.formGroup.reset();
404
- combineLatest([this.sortItems$, this.viewTypeItems$])
405
- .pipe(take(1))
406
- .subscribe(([sortItems, viewTypeItems]) => {
407
- this.defaultEnumValues$.next([{ key: '', value: '' }]);
408
- this.selectedViewTypeItemIndex$.next(0);
409
- // @ts-ignore
410
- this.formGroup.patchValue({ displayType: viewTypeItems[0] });
411
- this.selectedSortItemIndex$.next(0);
412
- // @ts-ignore
413
- this.formGroup.patchValue({ defaultSort: sortItems[0] });
414
- });
415
- }
416
- mapFormValuesToColumn(formValue) {
417
- return {
418
- key: formValue.key,
419
- sortable: formValue.sortable,
420
- ...(formValue.defaultSort?.key !== this.INVALID_KEY && {
421
- defaultSort: formValue.defaultSort?.key,
422
- }),
423
- title: formValue.title || '',
424
- path: formValue.path,
425
- displayType: {
426
- type: formValue.displayType?.key,
427
- displayTypeParameters: {
428
- ...(formValue.dateFormat && { dateFormat: formValue.dateFormat }),
429
- ...(Array.isArray(formValue.enum) &&
430
- formValue.enum.length > 0 && {
431
- enum: formValue.enum.reduce((acc, curr) => ({ ...acc, [curr.key]: curr.value }), {}),
432
- }),
433
- },
434
- },
435
- };
436
- }
437
- }
438
- ObjectManagementListColumnsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ObjectManagementListColumnsComponent, deps: [{ token: i1.ObjectManagementService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
439
- ObjectManagementListColumnsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ObjectManagementListColumnsComponent, selector: "valtimo-object-management-list-columns", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], 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<ng-container\n *ngIf=\"{\n listColumn: translatedObjectManagementListColumns$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.listColumn?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.listColumn?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'listColumn.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\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 objectId: objectId$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\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.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.listColumn\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.listColumn; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.objectsApiPathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.enumTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></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 */::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i8.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i8.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i9.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i7.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: i8.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i8.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i8.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i8.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i8.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i8.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i8.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i8.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i8.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i8.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "directive", type: i8.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i8.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
440
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ObjectManagementListColumnsComponent, decorators: [{
441
- type: Component,
442
- args: [{ selector: 'valtimo-object-management-list-columns', 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<ng-container\n *ngIf=\"{\n listColumn: translatedObjectManagementListColumns$ | async,\n fields: objectManagementFields$ | async,\n objectId: objectId$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async,\n loading: loading$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.loading; else loading\">\n <ng-container *ngIf=\"obs.listColumn?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.listColumn?.length < 1 ||\n obs.disableInput ||\n obs.loading\n \"\n >\n {{ 'listColumn.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\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 objectId: objectId$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.objectId)\"\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.objectId)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.listColumn\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.listColumn; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.objectsApiPathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.enumTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><cds-loading></cds-loading></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 */::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\n"] }]
443
- }], ctorParameters: function () { return [{ type: i1.ObjectManagementService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
444
- type: ViewChild,
445
- args: ['moveRowButtons']
446
- }] } });
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LWNvbHVtbnMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LWNvbHVtbnMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBZSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUlkLE9BQU8sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQWtCbEUsTUFBTSxPQUFPLG9DQUFvQztJQXlRL0MsWUFDbUIsdUJBQWdELEVBQ2hELEtBQXFC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QUFJLENBQUM7d0JBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSTt3QkFDM0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztxQkFDbkYsQ0FBQztpQkFDTDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7O2lJQWxrQlUsb0NBQW9DO3FIQUFwQyxvQ0FBb0MsMk1DcERqRCxzMVZBaVRBOzJGRDdQYSxvQ0FBb0M7a0JBTGhELFNBQVM7K0JBQ0Usd0NBQXdDO2lPQUtkLHlCQUF5QjtzQkFBNUQsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge0NvbXBvbmVudCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlLCBEZWZpbml0aW9uQ29sdW1ufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TGlzdEl0ZW19IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZHJvcGRvd24vbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge011bHRpSW5wdXRWYWx1ZXN9IGZyb20gJ0B2YWx0aW1vL3VzZXItaW50ZXJmYWNlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMaXN0Q29sdW1uTW9kYWx9IGZyb20gJ0B2YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudCc7XG5pbXBvcnQge09iamVjdE1hbmFnZW1lbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9vYmplY3QtbWFuYWdlbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIERpc3BsYXlUeXBlUGFyYW1ldGVycyxcbiAgU2VhcmNoTGlzdENvbHVtbixcbiAgU2VhcmNoTGlzdENvbHVtblZpZXcsXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9vYmplY3QtbWFuYWdlbWVudC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29iamVjdC1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29iamVjdC1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdtb3ZlUm93QnV0dG9ucycpIHB1YmxpYyBtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICByZWFkb25seSBkb3dubG9hZE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlVXJsPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0Q29sdW1uTW9kYWw+KCdjcmVhdGUnKTtcbiAgcmVhZG9ubHkgc2hvd01vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBtb2RhbFNob3dpbmckID0gdGhpcy5zaG93TW9kYWwkLnBpcGUoZGVsYXkoMjUwKSk7XG4gIHJlYWRvbmx5IGRpc2FibGVJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0RlbGV0ZU1vZGFsJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRlbGV0ZVJvd0luZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgZGVmYXVsdEVudW1WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IElOVkFMSURfS0VZID0gJ2ludmFsaWQnO1xuICByZWFkb25seSBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBrZXk6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgcGF0aDogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkYXRlRm9ybWF0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRpc3BsYXlUeXBlOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIHNvcnRhYmxlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxuICAgIGRlZmF1bHRTb3J0OiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIGVudW06IG5ldyBGb3JtQ29udHJvbChbXSksXG4gIH0pO1xuICByZWFkb25seSBESVNQTEFZX1RZUEVTOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgICdzdHJpbmcnLFxuICAgICdkYXRlJyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2VudW0nLFxuICAgICdhcnJheUNvdW50JyxcbiAgICAndW5kZXJzY29yZXNUb1NwYWNlcycsXG4gIF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5TOiBBcnJheTxEZWZpbml0aW9uQ29sdW1uPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICd0aXRsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3RpdGxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2tleScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2tleScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdwYXRoJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAncGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5VHlwZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdzb3J0YWJsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3NvcnRhYmxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2RlZmF1bHRTb3J0JyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGVmYXVsdFNvcnQnLFxuICAgIH0sXG4gIF07XG4gIHByaXZhdGUgY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zOiBBcnJheTxTZWFyY2hMaXN0Q29sdW1uPiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsPihudWxsKTtcblxuICByZWFkb25seSBvYmplY3RNYW5hZ2VtZW50RmllbGRzJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0RmllbGQ+PiA9IHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgIC5zdHJlYW0oJ2tleScpXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKCkgPT5cbiAgICAgICAgdGhpcy5DT0xVTU5TLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgICBrZXk6IGNvbHVtbi5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICAgIC4uLihjb2x1bW4uZW51bSAmJiB7ZW51bTogY29sdW1uLmVudW19KSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICByZWFkb25seSBvYmplY3RJZCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgbWFwKHBhcmFtcyA9PiBwYXJhbXMuaWQgfHwgJycpLFxuICAgIGZpbHRlcihvYmplY3RJZCA9PiAhIW9iamVjdElkKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMub2JqZWN0SWQkLFxuICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbb2JqZWN0SWRdKSA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmdldFNlYXJjaExpc3Qob2JqZWN0SWQpKSxcbiAgICB0YXAob2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMub2JqZWN0SWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKG9iamVjdElkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkob2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zKSAmJlxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQob2JqZWN0SWQsIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHRhcChvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPT4ge1xuICAgICAgdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPSBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnM7XG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgdHJhbnNsYXRlZE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQ6IE9ic2VydmFibGU8QXJyYXk8U2VhcmNoTGlzdENvbHVtblZpZXc+PiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5vYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMkLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKV0pLnBpcGUoXG4gICAgICBtYXAoKFtjb2x1bW5zXSkgPT5cbiAgICAgICAgY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUgfHwgJy0nLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGVcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVZZXMnKVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZU5vJyksXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6XG4gICAgICAgICAgICAoY29sdW1uLmRlZmF1bHRTb3J0ID09PSAnQVNDJyAmJlxuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZUFzYycpKSB8fFxuICAgICAgICAgICAgKGNvbHVtbi5kZWZhdWx0U29ydCA9PT0gJ0RFU0MnICYmXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaXN0Q29sdW1uLnNvcnRhYmxlRGVzYycpKSB8fFxuICAgICAgICAgICAgJy0nLFxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgIGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuJHtjb2x1bW4/LmRpc3BsYXlUeXBlPy50eXBlfWBcbiAgICAgICAgICApLFxuICAgICAgICAgIGRpc3BsYXlUeXBlUGFyYW1ldGVyczogdGhpcy5nZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KFxuICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlUeXBlLmRpc3BsYXlUeXBlUGFyYW1ldGVyc1xuICAgICAgICAgICksXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZURlZmF1bHRTb3J0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQsXG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbY3VycmVudE1vZGFsVHlwZV0pID0+XG4gICAgICAgIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnICYmXG4gICAgICAgIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmZpbmQoY29sdW1uID0+ICEhY29sdW1uLmRlZmF1bHRTb3J0KVxuICAgICksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dEYXRlRm9ybWF0JCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgIG1hcChmb3JtVmFsdWVzID0+IGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzFdKSxcbiAgICB0YXAoc2hvd0RhdGVGb3JtYXQgPT4ge1xuICAgICAgaWYgKHNob3dEYXRlRm9ybWF0ID09PSBmYWxzZSAmJiAhIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGVGb3JtYXQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZGF0ZUZvcm1hdDogJyd9KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0VudW0kID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZm9ybVZhbHVlcyA9PlxuICAgICAgICAhIShcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1szXSB8fFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzJdXG4gICAgICAgIClcbiAgICApLFxuICAgIHRhcChzaG93RW51bSA9PiB7XG4gICAgICBjb25zdCBlbnVtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5lbnVtO1xuICAgICAgaWYgKHNob3dFbnVtID09PSBmYWxzZSAmJiBBcnJheS5pc0FycmF5KGVudW1WYWx1ZSkgJiYgZW51bVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZW51bTogW119KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNZZXNObyQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoZm9ybVZhbHVlcyA9PiBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1syXSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICByZWFkb25seSB2aWV3VHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuc2VsZWN0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLkRJU1BMQVlfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbkRpc3BsYXlUeXBlLiR7dHlwZX1gKSxcbiAgICAgICAgICBrZXk6IHR5cGUsXG4gICAgICAgIH0pKSxcbiAgICAgIF0ubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgc2VsZWN0ZWQ6IGluZGV4ID09PSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4LFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkU29ydEl0ZW1JbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgc29ydEl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFNvcnRJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkU29ydEl0ZW1JbmRleF0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zZWxlY3REZWZhdWx0U29ydGApLFxuICAgICAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlQXNjYCksXG4gICAgICAgICAga2V5OiAnQVNDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlRGVzY2ApLFxuICAgICAgICAgIGtleTogJ0RFU0MnLFxuICAgICAgICB9LFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkU29ydEl0ZW1JbmRleCxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSB2YWxpZEtleSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMuY3VycmVudE1vZGFsVHlwZSRdKS5waXBlKFxuICAgIG1hcCgoW2Zvcm1WYWx1ZXMsIGN1cnJlbnRNb2RhbFR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ0tleXMgPSB0aGlzLmNhY2hlZE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnID8gIWV4aXN0aW5nS2V5cy5pbmNsdWRlcyhmb3JtVmFsdWVzLmtleSkgOiB0cnVlO1xuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSB2YWxpZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMudmFsaWRLZXkkXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW2Zvcm1WYWx1ZXMsIHZhbGlkS2V5XSkgPT5cbiAgICAgICAgISEoXG4gICAgICAgICAgZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ICE9PSB0aGlzLklOVkFMSURfS0VZICYmXG4gICAgICAgICAgZm9ybVZhbHVlcy5wYXRoICYmXG4gICAgICAgICAgdmFsaWRLZXkgJiZcbiAgICAgICAgICAoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZS5rZXkgPT09ICdlbnVtJyA/IGZvcm1WYWx1ZXMuZW51bT8ubGVuZ3RoID4gMCA6IHRydWUpXG4gICAgICAgIClcbiAgICApLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlOiBPYmplY3RNYW5hZ2VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IExpc3RDb2x1bW5Nb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyLCBjbGlja0V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVsZXRlUm93SW5kZXgkLm5leHQoc2VhcmNoTGlzdENvbHVtblJvd0luZGV4KTtcbiAgfVxuXG4gIGRlbGV0ZVJvd0NvbmZpcm1hdGlvbihzZWFyY2hMaXN0Q29sdW1uUm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbktleSA9IHRoaXMuZ2V0Q29sdW1uS2V5KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleCk7XG5cbiAgICBpZiAoY29sdW1uS2V5KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgICB0aGlzLm9iamVjdElkJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIHN3aXRjaE1hcChvYmplY3RJZCA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmRlbGV0ZVNlYXJjaExpc3Qob2JqZWN0SWQsIGNvbHVtbktleSkpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMoKSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uS2V5KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zW3NlYXJjaExpc3RDb2x1bW5Sb3dJbmRleF0/LmtleTtcbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgc2VhcmNoTGlzdENvbHVtblJvd0luZGV4OiBudW1iZXIsXG4gICAgbW92ZVVwOiBib29sZWFuLFxuICAgIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgb2JqZWN0SWQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPSBbLi4udGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNdO1xuICAgIGNvbnN0IHNlYXJjaExpc3RDb2x1bW5Sb3cgPSBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNbc2VhcmNoTGlzdENvbHVtblJvd0luZGV4XTtcblxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qgc2VhcmNoTGlzdENvbHVtbkluZGV4ID0gb2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmZpbmRJbmRleChcbiAgICAgIGZpZWxkID0+IGZpZWxkLmtleSA9PT0gc2VhcmNoTGlzdENvbHVtblJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IGZvdW5kU2VhcmNoTGlzdENvbHVtbiA9IHsuLi5vYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNbc2VhcmNoTGlzdENvbHVtbkluZGV4XX07XG4gICAgY29uc3QgZmlsdGVyZWRTZWFyY2hMaXN0Q29sdW1ucyA9IG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucy5maWx0ZXIoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgIT09IHNlYXJjaExpc3RDb2x1bW5Sb3cua2V5XG4gICAgKTtcbiAgICBjb25zdCBtdWx0aXBsZVNlYXJjaExpc3RDb2x1bW5zID0gb2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmxlbmd0aCA+IDE7XG5cbiAgICBpZiAobXVsdGlwbGVTZWFyY2hMaXN0Q29sdW1ucyAmJiBtb3ZlVXAgJiYgc2VhcmNoTGlzdENvbHVtbkluZGV4ID4gMCkge1xuICAgICAgY29uc3Qgc2VhcmNoTGlzdENvbHVtbkJlZm9yZUtleSA9IGAke1xuICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNbc2VhcmNoTGlzdENvbHVtbkluZGV4IC0gMV0ua2V5XG4gICAgICB9YDtcbiAgICAgIGNvbnN0IHNlYXJjaExpc3RDb2x1bW5CZWZvcmVJbmRleCA9IGZpbHRlcmVkU2VhcmNoTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IHNlYXJjaExpc3RDb2x1bW5CZWZvcmVLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZFNlYXJjaExpc3RDb2x1bW5zLnNwbGljZShzZWFyY2hMaXN0Q29sdW1uQmVmb3JlSW5kZXgsIDAsIGZvdW5kU2VhcmNoTGlzdENvbHVtbik7XG4gICAgICB0aGlzLnVwZGF0ZU9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1uKG9iamVjdElkLCBmaWx0ZXJlZFNlYXJjaExpc3RDb2x1bW5zKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbXVsdGlwbGVTZWFyY2hMaXN0Q29sdW1ucyAmJlxuICAgICAgIW1vdmVVcCAmJlxuICAgICAgc2VhcmNoTGlzdENvbHVtbkluZGV4IDwgb2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5BZnRlcktleSA9IGAke1xuICAgICAgICBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNbc2VhcmNoTGlzdENvbHVtbkluZGV4ICsgMV0ua2V5XG4gICAgICB9YDtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCA9IGZpbHRlcmVkU2VhcmNoTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZFNlYXJjaExpc3RDb2x1bW5zLnNwbGljZShjYXNlTGlzdENvbHVtbkFmdGVySW5kZXggKyAxLCAwLCBmb3VuZFNlYXJjaExpc3RDb2x1bW4pO1xuICAgICAgdGhpcy51cGRhdGVPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbihvYmplY3RJZCwgZmlsdGVyZWRTZWFyY2hMaXN0Q29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNhc0xpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW51bVZhbHVlQ2hhbmdlKHZhbHVlOiBBcnJheTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiB2YWx1ZX0pO1xuICB9XG5cbiAgY29sdW1uUm93Q2xpY2tlZChyb3c6IHtrZXk6IHN0cmluZ30pOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZpZXdUeXBlSXRlbXMkLCB0aGlzLnNvcnRJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt2aWV3VHlwZUl0ZW1zLCBzb3J0SXRlbXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgY2FjaGVkQ29sdW1uID0+IGNhY2hlZENvbHVtbi5rZXkgPT09IHJvdy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtID0gdmlld1R5cGVJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kaXNwbGF5VHlwZS50eXBlKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtSW5kZXggPSB2aWV3VHlwZUl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICBpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3J0SXRlbSA9IHNvcnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRJdGVtSW5kZXggPSBzb3J0SXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW07XG4gICAgICAgIGNvbnN0IG1hcHBlZEVudW1WYWx1ZXM6IE11bHRpSW5wdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0ZUZvcm1hdCA9IGNvbHVtbj8uZGlzcGxheVR5cGU/LmRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLm5leHQodmlld1R5cGVJdGVtSW5kZXgpO1xuXG4gICAgICAgIGlmIChzb3J0SXRlbSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KHNvcnRJdGVtSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudW1WYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnVtVmFsdWVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtYXBwZWRFbnVtVmFsdWVzLnB1c2goe2tleSwgdmFsdWU6IGVudW1WYWx1ZXNba2V5XX0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQobWFwcGVkRW51bVZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB7Li4udmlld1R5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHNvcnRJdGVtID8gey4uLnNvcnRJdGVtfSA6IHsuLi5zb3J0SXRlbXNbMF19LFxuICAgICAgICAgIC4uLihjb2x1bW5EYXRlRm9ybWF0ICYmIHtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IGNvbHVtbkRhdGVGb3JtYXQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW4oXG4gICAgb2JqZWN0SWQ6IHN0cmluZyxcbiAgICBsaXN0Q29sdW1uOiBBcnJheTxTZWFyY2hMaXN0Q29sdW1uPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuICAgIHRoaXMub2JqZWN0TWFuYWdlbWVudFNlcnZpY2VcbiAgICAgIC5wdXRTZWFyY2hMaXN0Q29sdW1ucyhvYmplY3RJZCwgbGlzdENvbHVtbilcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucygpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBsaXN0LXNlYXJjaC0ke29iamVjdElkfWAsIG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29sdW1uKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlO1xuXG4gICAgdGhpcy5vYmplY3RJZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAob2JqZWN0SWQgPT5cbiAgICAgICAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLnBvc3RTZWFyY2hMaXN0KFxuICAgICAgICAgICAgb2JqZWN0SWQsXG4gICAgICAgICAgICB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucygpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlzcGxheVR5cGVQYXJhbWV0ZXJzVmlldyhkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IERpc3BsYXlUeXBlUGFyYW1ldGVycyk6IHN0cmluZyB7XG4gICAgaWYgKGRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlUeXBlUGFyYW1ldGVycy5kYXRlRm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5lbnVtKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW0pLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleVZhbHVlUGFpclN0cmluZyA9IGAke2N1cnJ9OiAke2Rpc3BsYXlUeXBlUGFyYW1ldGVycy5lbnVtW2N1cnJdfWA7XG4gICAgICAgIGlmICghYWNjKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2tleVZhbHVlUGFpclN0cmluZ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2FjY30sICR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICB9LCAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uKCk6IHZvaWQge1xuICAgIHRoaXMub2JqZWN0SWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKG9iamVjdElkID0+XG4gICAgICAgICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZS5wdXRTZWFyY2hMaXN0KFxuICAgICAgICAgICAgb2JqZWN0SWQsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZS5rZXksXG4gICAgICAgICAgICB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbih0aGlzLmZvcm1Hcm91cC52YWx1ZSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb3dubG9hZChcbiAgICBvYmplY3RJZDogc3RyaW5nLFxuICAgIE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1uczogQXJyYXk8U2VhcmNoTGlzdENvbHVtbj5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kb3dubG9hZE5hbWUkLm5leHQoYCR7b2JqZWN0SWR9Lmpzb25gKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsJC5uZXh0KFxuICAgICAgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChcbiAgICAgICAgJ2RhdGE6dGV4dC9qc29uO2NoYXJzZXQ9VVRGLTgsJyArXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucywgbnVsbCwgMikpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNvcnRJdGVtcyQsIHRoaXMudmlld1R5cGVJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtzb3J0SXRlbXMsIHZpZXdUeXBlSXRlbXNdKSA9PiB7XG4gICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQoW3trZXk6ICcnLCB2YWx1ZTogJyd9XSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkaXNwbGF5VHlwZTogdmlld1R5cGVJdGVtc1swXX0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU29ydEl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkZWZhdWx0U29ydDogc29ydEl0ZW1zWzBdfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZTogYW55KTogU2VhcmNoTGlzdENvbHVtbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogZm9ybVZhbHVlLmtleSxcbiAgICAgIHNvcnRhYmxlOiBmb3JtVmFsdWUuc29ydGFibGUsXG4gICAgICAuLi4oZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXkgIT09IHRoaXMuSU5WQUxJRF9LRVkgJiYge1xuICAgICAgICBkZWZhdWx0U29ydDogZm9ybVZhbHVlLmRlZmF1bHRTb3J0Py5rZXksXG4gICAgICB9KSxcbiAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUgfHwgJycsXG4gICAgICBwYXRoOiBmb3JtVmFsdWUucGF0aCxcbiAgICAgIGRpc3BsYXlUeXBlOiB7XG4gICAgICAgIHR5cGU6IGZvcm1WYWx1ZS5kaXNwbGF5VHlwZT8ua2V5LFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAuLi4oZm9ybVZhbHVlLmRhdGVGb3JtYXQgJiYge2RhdGVGb3JtYXQ6IGZvcm1WYWx1ZS5kYXRlRm9ybWF0fSksXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLmVudW0pICYmXG4gICAgICAgICAgICBmb3JtVmFsdWUuZW51bS5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgZW51bTogZm9ybVZhbHVlLmVudW0ucmVkdWNlKChhY2MsIGN1cnIpID0+ICh7Li4uYWNjLCBbY3Vyci5rZXldOiBjdXJyLnZhbHVlfSksIHt9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIGxpc3RDb2x1bW46IHRyYW5zbGF0ZWRPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMkIHwgYXN5bmMsXG4gICAgZmllbGRzOiBvYmplY3RNYW5hZ2VtZW50RmllbGRzJCB8IGFzeW5jLFxuICAgIG9iamVjdElkOiBvYmplY3RJZCQgfCBhc3luYyxcbiAgICBkb3dubG9hZFVybDogZG93bmxvYWRVcmwkIHwgYXN5bmMsXG4gICAgZG93bmxvYWROYW1lOiBkb3dubG9hZE5hbWUkIHwgYXN5bmMsXG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luY1xuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgcHItMCBwbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgbXQtbTNweCBtYi0zIG1yLTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb2JzLmxvYWRpbmc7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9icy5saXN0Q29sdW1uPy5sZW5ndGggPiAwOyBlbHNlIG5vQ29uZmlnV2FybmluZ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNyZWF0ZUVkaXRNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWxldGVNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbnMgbGV0LW9icz1cIm9ic1wiPlxuICA8YVxuICAgIGNkc0xpbmtcbiAgICBjbGFzcz1cImNlbnRlci1saW5rXCJcbiAgICBbaHJlZl09XCJvYnMuZG93bmxvYWRVcmxcIlxuICAgIFtkb3dubG9hZF09XCJvYnMuZG93bmxvYWROYW1lXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAhb2JzLmRvd25sb2FkVXJsIHx8XG4gICAgICAhb2JzLmRvd25sb2FkTmFtZSB8fFxuICAgICAgb2JzLmxpc3RDb2x1bW4/Lmxlbmd0aCA8IDEgfHxcbiAgICAgIG9icy5kaXNhYmxlSW5wdXQgfHxcbiAgICAgIG9icy5sb2FkaW5nXG4gICAgXCJcbiAgPlxuICAgIHt7ICdsaXN0Q29sdW1uLmRvd25sb2FkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9hPlxuICA8YnV0dG9uXG4gICAgKGNsaWNrKT1cIm9wZW5Nb2RhbCgnY3JlYXRlJylcIlxuICAgIGNkc0J1dHRvbj1cInByaW1hcnlcIlxuICAgIHNpemU9XCJtZFwiXG4gICAgW2Rpc2FibGVkXT1cIm9icy5sb2FkaW5nXCJcbiAgICBjbGFzcz1cIm1sLTNcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uYWRkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb3ZlUm93QnV0dG9ucyBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1sZW5ndGg9XCJsZW5ndGhcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibW92ZS1yb3ctYnV0dG9uc1wiXG4gICAgKm5nSWY9XCJ7XG4gICAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCQgfCBhc3luYyxcbiAgICAgIG9iamVjdElkOiBvYmplY3RJZCQgfCBhc3luY1xuICAgIH0gYXMgb2JzXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktZGVsZXRlIGJ0biBidG4tb3V0bGluZS1kYW5nZXIgbXItMVwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlUm93KGluZGV4LCAkZXZlbnQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy11cC1ib2xkIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIHRydWUsICRldmVudCwgb2JzLm9iamVjdElkKVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IGluZGV4ID09PSAwIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktYXJyb3ctZG93bi1ib2xkIGJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIGZhbHNlLCAkZXZlbnQsIG9icy5vYmplY3RJZClcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCBkaXNhYmxlZC1tb3ZlLXJvdy1idXR0b24nOiBpbmRleCA9PT0gbGVuZ3RoIC0gMSB8fCBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPjwvaT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3QgbGV0LW9icz1cIm9ic1wiPlxuICA8dmFsdGltby1saXN0XG4gICAgW2l0ZW1zXT1cIm9icy5saXN0Q29sdW1uXCJcbiAgICBbZmllbGRzXT1cIm9icy5maWVsZHNcIlxuICAgIFt2aWV3TW9kZV09XCJmYWxzZVwiXG4gICAgW2hlYWRlcl09XCJmYWxzZVwiXG4gICAgKm5nSWY9XCJvYnMubGlzdENvbHVtbjsgZWxzZSBsb2FkaW5nXCJcbiAgICBbbGFzdENvbHVtblRlbXBsYXRlXT1cIm1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWZcIlxuICAgIChyb3dDbGlja2VkKT1cImNvbHVtblJvd0NsaWNrZWQoJGV2ZW50KVwiXG4gID5cbiAgPC92YWx0aW1vLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NyZWF0ZUVkaXRNb2RhbD5cbiAgPGNkcy1tb2RhbFxuICAgICpuZ0lmPVwie1xuICAgICAgdHlwZTogY3VycmVudE1vZGFsVHlwZSQgfCBhc3luYyxcbiAgICAgIHNob3c6IHNob3dNb2RhbCQgfCBhc3luYyxcbiAgICAgIHZhbGlkOiB2YWxpZCQgfCBhc3luYyxcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgdmFsaWRLZXk6IHZhbGlkS2V5JCB8IGFzeW5jLFxuICAgICAgZGlzYWJsZURlZmF1bHRTb3J0OiBkaXNhYmxlRGVmYXVsdFNvcnQkIHwgYXN5bmMsXG4gICAgICBzaG93RW51bTogc2hvd0VudW0kIHwgYXN5bmMsXG4gICAgICBpc1llc05vOiBpc1llc05vJCB8IGFzeW5jXG4gICAgfSBhcyBtb2RhbE9ic1wiXG4gICAgW29wZW5dPVwibW9kYWxPYnMuc2hvd1wiXG4gID5cbiAgICA8Y2RzLW1vZGFsLWhlYWRlciBbc2hvd0Nsb3NlQnV0dG9uXT1cInRydWVcIiAoY2xvc2VTZWxlY3QpPVwiY2xvc2VNb2RhbCgpXCI+XG4gICAgICA8aDMgY2RzTW9kYWxIZWFkZXJIZWFkaW5nPlxuICAgICAgICB7e1xuICAgICAgICAgIG1vZGFsT2JzLnR5cGUgPT09ICdjcmVhdGUnXG4gICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5hZGRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVkaXRDb2x1bW5UaXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgIH19XG4gICAgICA8L2gzPlxuICAgIDwvY2RzLW1vZGFsLWhlYWRlcj5cbiAgICA8c2VjdGlvbiBjZHNNb2RhbENvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kYWxDb250ZW50OyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc2VjdGlvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9kYWxGb290ZXI7IGNvbnRleHQ6IHttb2RhbE9iczogbW9kYWxPYnN9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvY2RzLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbENvbnRlbnQgbGV0LW1vZGFsT2JzPVwibW9kYWxPYnNcIj5cbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBjbGFzcz1cImxpc3QtY29sdW1uLWZvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi50aXRsZVRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4udGl0bGVUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMudHlwZSA9PT0gJ2VkaXQnXCJcbiAgICAgICAgW2ludmFsaWRdPVwibW9kYWxPYnMudmFsaWRLZXkgPT09IGZhbHNlXCJcbiAgICAgICAgW2ludmFsaWRUZXh0XT1cIidsaXN0Q29sdW1uLnVuaXF1ZUtleVdhcm5pbmcnIHwgdHJhbnNsYXRlXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi5rZXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5rZXlUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIiAvPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4ucGF0aCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLm9iamVjdHNBcGlQYXRoVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kaXNwbGF5VHlwZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJ2aWV3VHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCIgKm5nSWY9XCJzaG93RGF0ZUZvcm1hdCQgfCBhc3luY1wiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGF0ZUZvcm1hdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmRhdGVGb3JtYXRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlRm9ybWF0XCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIiAqbmdJZj1cIm1vZGFsT2JzLnNob3dFbnVtIHx8IG1vZGFsT2JzLmlzWWVzTm9cIj5cbiAgICAgIDxjZHMtbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcCBzZWxlY3QtbGFiZWxcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgICAgbW9kYWxPYnMuaXNZZXNOb1xuICAgICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5lbnVtVGl0bGVPcHRpb25hbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVudW1UaXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmVudW1Ub29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIihzaG93TW9kYWwkIHwgYXN5bmMpIHx8IChtb2RhbFNob3dpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICB0eXBlPVwia2V5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJlbnVtVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwiZGVmYXVsdEVudW1WYWx1ZXMkIHwgYXN5bmNcIlxuICAgICAgICA+PC92YWx0aW1vLWNhcmJvbi1tdWx0aS1pbnB1dD5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwic29ydGFibGVcIlxuICAgICAgICA+e3sgJ2xpc3RDb2x1bW4uc29ydGFibGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Nkcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMuZGlzYWJsZURlZmF1bHRTb3J0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwIHNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRlZmF1bHRTb3J0VGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kZWZhdWx0U29ydFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd25cbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0U29ydFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy5kaXNhYmxlRGVmYXVsdFNvcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJzb3J0SXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsRm9vdGVyIGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxjZHMtbW9kYWwtZm9vdGVyPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNkc0J1dHRvbj1cInNlY29uZGFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZU1vZGFsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUNhc0xpc3RDb2x1bW5zKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgbW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnZhbGlkID09PSBmYWxzZSB8fCBtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dJbmRleCQgfCBhc3luY1wiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJkZWxldGVSb3dDb25maXJtYXRpb24oJGV2ZW50KVwiXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwibGlzdENvbHVtbi5kZWxldGVDb2x1bW5cIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uQ29uZmlybWF0aW9uXCJcbiAgPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vQ29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5ub0NvbmZpZ1dhcm5pbmdUaXRsZScgfCB0cmFuc2xhdGUsXG4gICAgICAgIHNob3dDbG9zZTogZmFsc2VcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2Nkcy1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1pY29uXCI+PGNkcy1sb2FkaW5nPjwvY2RzLWxvYWRpbmc+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19