@valtimo/object-management 10.2.1 → 10.4.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.
- package/README.md +16 -7
- package/esm2020/lib/components/object-management-detail-container/object-management-detail-container.component.mjs +6 -5
- package/esm2020/lib/components/object-management-detail-container/tabs/object-management-detail/object-management-detail.component.mjs +13 -7
- package/esm2020/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.mjs +434 -0
- package/esm2020/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.mjs +325 -0
- package/esm2020/lib/components/object-management-list/object-management-list.component.mjs +8 -5
- package/esm2020/lib/components/object-management-modal/object-management-modal.component.mjs +14 -11
- package/esm2020/lib/components/object-management-upload-modal/object-management-upload-modal.component.mjs +16 -7
- package/esm2020/lib/models/object-management.model.mjs +1 -1
- package/esm2020/lib/object-management-routing.module.mjs +2 -2
- package/esm2020/lib/object-management.module.mjs +65 -15
- package/esm2020/lib/services/object-management.service.mjs +29 -2
- package/esm2020/lib/services/tab.enum.mjs +2 -1
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/valtimo-object-management.mjs +826 -63
- package/fesm2015/valtimo-object-management.mjs.map +1 -1
- package/fesm2020/valtimo-object-management.mjs +864 -63
- package/fesm2020/valtimo-object-management.mjs.map +1 -1
- package/lib/components/object-management-detail-container/tabs/object-management-detail/object-management-detail.component.d.ts +2 -1
- package/lib/components/object-management-detail-container/tabs/object-management-list-columns/object-management-list-columns.component.d.ts +91 -0
- package/lib/components/object-management-detail-container/tabs/object-management-list-search-fields/object-management-list-search-fields.component.d.ts +76 -0
- package/lib/models/object-management.model.d.ts +29 -0
- package/lib/object-management.module.d.ts +10 -7
- package/lib/services/object-management.service.d.ts +10 -2
- package/lib/services/tab.enum.d.ts +2 -1
- package/package.json +1 -1
- package/esm2020/lib/components/object-management-detail-container/tabs/object-management-list-tab/object-management-list-tab.component.mjs +0 -30
- package/lib/components/object-management-detail-container/tabs/object-management-list-tab/object-management-list-tab.component.d.ts +0 -9
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2015-2020 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
|
+
// TODO:
|
|
261
|
+
}
|
|
262
|
+
saveCasListColumns() {
|
|
263
|
+
this.disableInput();
|
|
264
|
+
this.currentModalType$.pipe(take(1)).subscribe(currentModalType => {
|
|
265
|
+
if (currentModalType === 'create') {
|
|
266
|
+
this.addColumn();
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
this.updateColumn();
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
enumValueChange(value) {
|
|
274
|
+
this.formGroup.patchValue({ enum: value });
|
|
275
|
+
}
|
|
276
|
+
columnRowClicked(row) {
|
|
277
|
+
this.resetFormGroup();
|
|
278
|
+
combineLatest([this.viewTypeItems$, this.sortItems$])
|
|
279
|
+
.pipe(take(1))
|
|
280
|
+
.subscribe(([viewTypeItems, sortItems]) => {
|
|
281
|
+
const column = this.cachedObjectManagementListColumns.find(cachedColumn => cachedColumn.key === row.key);
|
|
282
|
+
const viewTypeItem = viewTypeItems.find(item => item.key === column.displayType.type);
|
|
283
|
+
const viewTypeItemIndex = viewTypeItems.findIndex(item => item.key === column.displayType.type);
|
|
284
|
+
const sortItem = sortItems.find(item => item.key === column.defaultSort);
|
|
285
|
+
const sortItemIndex = sortItems.findIndex(item => item.key === column.defaultSort);
|
|
286
|
+
const enumValues = column?.displayType?.displayTypeParameters?.enum;
|
|
287
|
+
const mappedEnumValues = [];
|
|
288
|
+
const columnDateFormat = column?.displayType?.displayTypeParameters?.dateFormat;
|
|
289
|
+
this.selectedViewTypeItemIndex$.next(viewTypeItemIndex);
|
|
290
|
+
if (sortItem) {
|
|
291
|
+
this.selectedSortItemIndex$.next(sortItemIndex);
|
|
292
|
+
}
|
|
293
|
+
if (enumValues) {
|
|
294
|
+
Object.keys(enumValues).forEach(key => {
|
|
295
|
+
mappedEnumValues.push({ key, value: enumValues[key] });
|
|
296
|
+
});
|
|
297
|
+
this.defaultEnumValues$.next(mappedEnumValues);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.defaultEnumValues$.next([{ key: '', value: '' }]);
|
|
301
|
+
}
|
|
302
|
+
this.formGroup.patchValue({
|
|
303
|
+
key: column.key,
|
|
304
|
+
title: column.title,
|
|
305
|
+
path: column.path,
|
|
306
|
+
sortable: column.sortable,
|
|
307
|
+
// @ts-ignore
|
|
308
|
+
displayType: { ...viewTypeItem },
|
|
309
|
+
// @ts-ignore
|
|
310
|
+
defaultSort: sortItem ? { ...sortItem } : { ...sortItems[0] },
|
|
311
|
+
...(columnDateFormat && {
|
|
312
|
+
dateFormat: columnDateFormat,
|
|
313
|
+
}),
|
|
314
|
+
});
|
|
315
|
+
this.openModal('edit');
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
updateObjectManagementListColumn(objectId, listColumn) {
|
|
319
|
+
this.disableInput();
|
|
320
|
+
this.objectManagementService
|
|
321
|
+
.putSearchList(objectId, this.formGroup.value.key, listColumn)
|
|
322
|
+
.pipe(tap(() => {
|
|
323
|
+
this.refreshObjectManagementListColumns();
|
|
324
|
+
localStorage.setItem(`list-search-${objectId}`, null);
|
|
325
|
+
}), catchError(() => {
|
|
326
|
+
this.enableInput();
|
|
327
|
+
return of(null);
|
|
328
|
+
}))
|
|
329
|
+
.subscribe();
|
|
330
|
+
}
|
|
331
|
+
addColumn() {
|
|
332
|
+
const formValue = this.formGroup.value;
|
|
333
|
+
this.objectId$
|
|
334
|
+
.pipe(take(1), switchMap(objectId => this.objectManagementService.postSearchList(objectId, this.mapFormValuesToColumn(formValue))), tap(() => {
|
|
335
|
+
this.closeModal();
|
|
336
|
+
this.refreshObjectManagementListColumns();
|
|
337
|
+
}), catchError(() => {
|
|
338
|
+
this.enableInput();
|
|
339
|
+
return of(null);
|
|
340
|
+
}))
|
|
341
|
+
.subscribe();
|
|
342
|
+
}
|
|
343
|
+
getDisplayTypeParametersView(displayTypeParameters) {
|
|
344
|
+
if (displayTypeParameters?.dateFormat) {
|
|
345
|
+
return displayTypeParameters.dateFormat;
|
|
346
|
+
}
|
|
347
|
+
else if (displayTypeParameters?.enum) {
|
|
348
|
+
return Object.keys(displayTypeParameters.enum).reduce((acc, curr) => {
|
|
349
|
+
const keyValuePairString = `${curr}: ${displayTypeParameters.enum[curr]}`;
|
|
350
|
+
if (!acc) {
|
|
351
|
+
return `${keyValuePairString}`;
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
return `${acc}, ${keyValuePairString}`;
|
|
355
|
+
}
|
|
356
|
+
}, '');
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
return '-';
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
updateColumn() {
|
|
363
|
+
this.objectId$
|
|
364
|
+
.pipe(take(1), switchMap(objectId => this.objectManagementService.putSearchList(objectId, this.formGroup.value.key, this.mapFormValuesToColumn(this.formGroup.value))), tap(() => {
|
|
365
|
+
this.closeModal();
|
|
366
|
+
this.refreshObjectManagementListColumns();
|
|
367
|
+
}), catchError(() => {
|
|
368
|
+
this.enableInput();
|
|
369
|
+
return of(null);
|
|
370
|
+
}))
|
|
371
|
+
.subscribe();
|
|
372
|
+
}
|
|
373
|
+
setDownload(objectId, ObjectManagementListColumns) {
|
|
374
|
+
this.downloadName$.next(`${objectId}.json`);
|
|
375
|
+
this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
|
|
376
|
+
encodeURIComponent(JSON.stringify(ObjectManagementListColumns, null, 2))));
|
|
377
|
+
}
|
|
378
|
+
disableInput() {
|
|
379
|
+
this.disableInput$.next(true);
|
|
380
|
+
this.formGroup.disable();
|
|
381
|
+
}
|
|
382
|
+
enableInput() {
|
|
383
|
+
this.disableInput$.next(false);
|
|
384
|
+
this.formGroup.enable();
|
|
385
|
+
}
|
|
386
|
+
refreshObjectManagementListColumns() {
|
|
387
|
+
this.refreshObjectManagementListColumns$.next(null);
|
|
388
|
+
}
|
|
389
|
+
resetFormGroup() {
|
|
390
|
+
this.formGroup.reset();
|
|
391
|
+
combineLatest([this.sortItems$, this.viewTypeItems$])
|
|
392
|
+
.pipe(take(1))
|
|
393
|
+
.subscribe(([sortItems, viewTypeItems]) => {
|
|
394
|
+
this.defaultEnumValues$.next([{ key: '', value: '' }]);
|
|
395
|
+
this.selectedViewTypeItemIndex$.next(0);
|
|
396
|
+
// @ts-ignore
|
|
397
|
+
this.formGroup.patchValue({ displayType: viewTypeItems[0] });
|
|
398
|
+
this.selectedSortItemIndex$.next(0);
|
|
399
|
+
// @ts-ignore
|
|
400
|
+
this.formGroup.patchValue({ defaultSort: sortItems[0] });
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
mapFormValuesToColumn(formValue) {
|
|
404
|
+
return {
|
|
405
|
+
key: formValue.key,
|
|
406
|
+
sortable: formValue.sortable,
|
|
407
|
+
...(formValue.defaultSort?.key !== this.INVALID_KEY && {
|
|
408
|
+
defaultSort: formValue.defaultSort?.key,
|
|
409
|
+
}),
|
|
410
|
+
title: formValue.title || '',
|
|
411
|
+
path: formValue.path,
|
|
412
|
+
displayType: {
|
|
413
|
+
type: formValue.displayType?.key,
|
|
414
|
+
displayTypeParameters: {
|
|
415
|
+
...(formValue.dateFormat && { dateFormat: formValue.dateFormat }),
|
|
416
|
+
...(Array.isArray(formValue.enum) &&
|
|
417
|
+
formValue.enum.length > 0 && {
|
|
418
|
+
enum: formValue.enum.reduce((acc, curr) => ({ ...acc, [curr.key]: curr.value }), {}),
|
|
419
|
+
}),
|
|
420
|
+
},
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
ObjectManagementListColumnsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ObjectManagementListColumnsComponent, deps: [{ token: i1.ObjectManagementService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
426
|
+
ObjectManagementListColumnsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ObjectManagementListColumnsComponent, selector: "valtimo-object-management-list-columns", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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 ibmLink\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 ibmButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" ibmIcon=\"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 <ibm-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 <ibm-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 ibmModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </ibm-modal-header>\n <section ibmModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </ibm-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 <ibm-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 ibmText formControlName=\"title\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input ibmText formControlName=\"path\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <ibm-dropdown-list [items]=\"viewTypeItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <ibm-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 ibmText formControlName=\"dateFormat\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <ibm-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 </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </ibm-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <ibm-dropdown-list [items]=\"sortItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <ibm-modal-footer>\n <ng-container>\n <button\n ibmButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n ibmButton=\"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 </ibm-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 <ibm-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><ibm-loading></ibm-loading></div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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: "ibm-label", inputs: ["labelInputID", "disabled", "labelState", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i8.TextInput, selector: "[ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.Button, selector: "[ibmButton]", inputs: ["ibmButton", "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"], outputs: ["valueChange"] }, { kind: "component", type: i8.Modal, selector: "ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i8.ModalHeader, selector: "ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i8.ModalFooter, selector: "ibm-modal-footer" }, { kind: "directive", type: i8.ModalContent, selector: "[ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i8.ModalHeaderHeading, selector: "[ibmModalHeaderHeading]" }, { kind: "component", type: i8.Notification, selector: "ibm-notification,ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "component", type: i8.Loading, selector: "ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "component", type: i8.Dropdown, selector: "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: "ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i8.Checkbox, selector: "ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "directive", type: i8.Link, selector: "[ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i8.IconDirective, selector: "[ibmIcon]", inputs: ["ibmIcon", "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", "cancelButtonText", "cancelButtonTextTranslationKey", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ObjectManagementListColumnsComponent, decorators: [{
|
|
428
|
+
type: Component,
|
|
429
|
+
args: [{ selector: 'valtimo-object-management-list-columns', template: "<!--\n ~ Copyright 2015-2020 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 ibmLink\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 ibmButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.loading\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" ibmIcon=\"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 <ibm-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 <ibm-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 ibmModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </ibm-modal-header>\n <section ibmModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </ibm-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 <ibm-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 ibmText formControlName=\"title\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input ibmText formControlName=\"path\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <ibm-dropdown-list [items]=\"viewTypeItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <ibm-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 ibmText formControlName=\"dateFormat\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <ibm-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 </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </ibm-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <ibm-dropdown-list [items]=\"sortItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <ibm-modal-footer>\n <ng-container>\n <button\n ibmButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n ibmButton=\"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 </ibm-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 <ibm-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><ibm-loading></ibm-loading></div>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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"] }]
|
|
430
|
+
}], ctorParameters: function () { return [{ type: i1.ObjectManagementService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
|
|
431
|
+
type: ViewChild,
|
|
432
|
+
args: ['moveRowButtons']
|
|
433
|
+
}] } });
|
|
434
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LWNvbHVtbnMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vb2JqZWN0LW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL29iamVjdC1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9vYmplY3QtbWFuYWdlbWVudC1saXN0LWNvbHVtbnMvb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBZSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUlkLE9BQU8sRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQWtCbEUsTUFBTSxPQUFPLG9DQUFvQztJQXlRL0MsWUFDbUIsdUJBQWdELEVBQ2hELEtBQXFCLEVBQ3JCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixTQUF1QjtRQUp2Qiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTVRakMsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFVLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUM5QyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBa0IsUUFBUSxDQUFDLENBQUM7UUFDbkUsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2pELGtCQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNwRCxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzFDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQW1CLFNBQVMsQ0FBQyxDQUFDO1FBRXRFLGdCQUFXLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUNqQyxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDOUMsVUFBVSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQzNCLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUN0QixDQUFDO1lBQ0YsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztZQUNoQyxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQzNCLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUN0QixDQUFDO1lBQ0YsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7UUFDTSxrQkFBYSxHQUFrQjtZQUN0QyxRQUFRO1lBQ1IsTUFBTTtZQUNOLFNBQVM7WUFDVCxNQUFNO1lBQ04sWUFBWTtZQUNaLHFCQUFxQjtTQUN0QixDQUFDO1FBRWUsWUFBTyxHQUE0QjtZQUNsRDtnQkFDRSxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLGNBQWMsRUFBRSxPQUFPO2FBQ3hCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFlBQVksRUFBRSxLQUFLO2dCQUNuQixjQUFjLEVBQUUsS0FBSzthQUN0QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixRQUFRLEVBQUUsS0FBSztnQkFDZixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsY0FBYyxFQUFFLE1BQU07YUFDdkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsWUFBWSxFQUFFLGFBQWE7Z0JBQzNCLGNBQWMsRUFBRSxhQUFhO2FBQzlCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFlBQVksRUFBRSx1QkFBdUI7Z0JBQ3JDLGNBQWMsRUFBRSx1QkFBdUI7YUFDeEM7WUFDRDtnQkFDRSxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsWUFBWSxFQUFFLFVBQVU7Z0JBQ3hCLGNBQWMsRUFBRSxVQUFVO2FBQzNCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFlBQVksRUFBRSxhQUFhO2dCQUMzQixjQUFjLEVBQUUsYUFBYTthQUM5QjtTQUNGLENBQUM7UUFDTSxzQ0FBaUMsR0FBNEIsRUFBRSxDQUFDO1FBQ3ZELHdDQUFtQyxHQUFHLElBQUksZUFBZSxDQUFPLElBQUksQ0FBQyxDQUFDO1FBRTlFLDRCQUF1QixHQUFpQyxJQUFJLENBQUMsZ0JBQWdCO2FBQ25GLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixJQUFJLENBQ0gsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxQixHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0UsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQztZQUNuRCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUM7U0FDeEMsQ0FBQyxDQUFDLENBQ0osQ0FDRixDQUFDO1FBRUssY0FBUyxHQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzdELEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FDL0IsQ0FBQztRQUVlLGlDQUE0QixHQUEyQixhQUFhLENBQUM7WUFDcEYsSUFBSSxDQUFDLFNBQVM7WUFDZCxJQUFJLENBQUMsbUNBQW1DO1NBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQ0wsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUMvRSxHQUFHLENBQUMsMkJBQTJCLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hELElBQ0UsMkJBQTJCO29CQUMzQixLQUFLLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDO29CQUMxQywyQkFBMkIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0QztvQkFDQSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO2lCQUN6RDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLDJCQUEyQixDQUFDO1lBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRU8sMkNBQXNDLEdBQzdDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzFGLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQixHQUFHLE1BQU07WUFDVCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHO1lBQzFCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO1lBQzFELFdBQVcsRUFDVCxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssS0FBSztnQkFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssTUFBTTtvQkFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUMzRCxHQUFHO1lBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ3hDLHlCQUF5QixNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUNyRDtZQUNELHFCQUFxQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FDekM7U0FDRixDQUFDLENBQUMsQ0FDSixDQUNGLENBQUM7UUFFSyx3QkFBbUIsR0FBRyxhQUFhLENBQUM7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQjtZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7U0FDNUIsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQ0QsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUNyQixnQkFBZ0IsS0FBSyxRQUFRO1lBQzdCLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUM5RSxFQUNELFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FDakIsQ0FBQztRQUVPLG9CQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUN6RCxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hFLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNuQixJQUFJLGNBQWMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBQyxVQUFVLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQzthQUM3QztRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FDakIsQ0FBQztRQUVPLGNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ25ELEdBQUcsQ0FDRCxVQUFVLENBQUMsRUFBRSxDQUNYLENBQUMsQ0FBQyxDQUNBLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3JELFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ3RELENBQ0osRUFDRCxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDNUMsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7YUFDdkM7UUFDSCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsS0FBSyxDQUFDLENBQ2pCLENBQUM7UUFFTyxhQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNsRCxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pFLENBQUM7UUFFTywrQkFBMEIsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUU1RCxtQkFBYyxHQUFnQyxhQUFhLENBQUM7WUFDbkUsSUFBSSxDQUFDLDBCQUEwQjtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNwQyxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsRUFBRSxFQUFFLENBQ2xDO1lBQ0U7Z0JBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUN0QjtZQUNELEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZFLEdBQUcsRUFBRSxJQUFJO2FBQ1YsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsSUFBSTtZQUNQLFFBQVEsRUFBRSxLQUFLLEtBQUsseUJBQXlCO1NBQzlDLENBQUMsQ0FBQyxDQUNKLENBQ0YsQ0FBQztRQUVPLDJCQUFzQixHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXhELGVBQVUsR0FBZ0MsYUFBYSxDQUFDO1lBQy9ELElBQUksQ0FBQyxzQkFBc0I7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxDQUM5QjtZQUNFO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDO2dCQUN0RSxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDdEI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztnQkFDaEUsR0FBRyxFQUFFLEtBQUs7YUFDWDtZQUNEO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO2dCQUNqRSxHQUFHLEVBQUUsTUFBTTthQUNaO1NBQ0YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsSUFBSTtZQUNQLFFBQVEsRUFBRSxLQUFLLEtBQUsscUJBQXFCO1NBQzFDLENBQUMsQ0FBQyxDQUNKLENBQ0YsQ0FBQztRQUVPLGNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEYsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsS0FBSyxDQUFDLENBQ2pCLENBQUM7UUFFTyxXQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqRixHQUFHLENBQ0QsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3pCLENBQUMsQ0FBQyxDQUNBLFVBQVUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLElBQUksQ0FBQyxXQUFXO1lBQ2hELFVBQVUsQ0FBQyxJQUFJO1lBQ2YsUUFBUTtZQUNSLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM3RSxDQUNKLEVBQ0QsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUNqQixDQUFDO0lBUUMsQ0FBQztJQUVKLFNBQVMsQ0FBQyxTQUEwQjtRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXZDLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7YUFBTSxJQUFJLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTLENBQUMsd0JBQWdDLEVBQUUsVUFBc0I7UUFDaEUsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQscUJBQXFCLENBQUMsd0JBQWdDO1FBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUU5RCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUVwQixJQUFJLENBQUMsU0FBUztpQkFDWCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFDekYsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLEVBQ3BELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FDSDtpQkFDQSxTQUFTLEVBQUUsQ0FBQztTQUNoQjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsd0JBQWdDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQy9FLENBQUM7SUFFRCxPQUFPLENBQ0wsd0JBQWdDLEVBQ2hDLE1BQWUsRUFDZixVQUFzQixFQUN0QixRQUFnQjtRQUVoQixNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNoRixNQUFNLG1CQUFtQixHQUFHLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFbEYsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTdCLFFBQVE7SUFDVixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ2hFLElBQUksZ0JBQWdCLEtBQUssUUFBUSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQXFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQWtCO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUN4RCxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FDN0MsQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEYsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUMvQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzdDLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDO1lBQ3BFLE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztZQUM5QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxDQUFDO1lBRWhGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUV4RCxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2pEO1lBRUQsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQzthQUN0RDtZQUVELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2dCQUN4QixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7Z0JBQ2YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsYUFBYTtnQkFDYixXQUFXLEVBQUUsRUFBQyxHQUFHLFlBQVksRUFBQztnQkFDOUIsYUFBYTtnQkFDYixXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSTtvQkFDdEIsVUFBVSxFQUFFLGdCQUFnQjtpQkFDN0IsQ0FBQzthQUNILENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0NBQWdDLENBQUMsUUFBZ0IsRUFBRSxVQUE0QjtRQUNyRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHVCQUF1QjthQUN6QixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7YUFDN0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztZQUMxQyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxTQUFTO1FBQ2YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFFdkMsSUFBSSxDQUFDLFNBQVM7YUFDWCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUNuQixJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUN6QyxRQUFRLEVBQ1IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUN0QyxDQUNGLEVBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztRQUM1QyxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLDRCQUE0QixDQUFDLHFCQUE0QztRQUMvRSxJQUFJLHFCQUFxQixFQUFFLFVBQVUsRUFBRTtZQUNyQyxPQUFPLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztTQUN6QzthQUFNLElBQUkscUJBQXFCLEVBQUUsSUFBSSxFQUFFO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxJQUFJLEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ1IsT0FBTyxHQUFHLGtCQUFrQixFQUFFLENBQUM7aUJBQ2hDO3FCQUFNO29CQUNMLE9BQU8sR0FBRyxHQUFHLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztpQkFDeEM7WUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDUjthQUFNO1lBQ0wsT0FBTyxHQUFHLENBQUM7U0FDWjtJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxTQUFTO2FBQ1gsSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDbkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FDeEMsUUFBUSxFQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFDeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQ2pELENBQ0YsRUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sV0FBVyxDQUNqQixRQUFnQixFQUNoQiwyQkFBb0Q7UUFFcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUNuQywrQkFBK0I7WUFDN0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDM0UsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxrQ0FBa0M7UUFDeEMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGFBQWE7WUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsYUFBYTtZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8scUJBQXFCLENBQUMsU0FBYztRQUMxQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSTtnQkFDckQsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRzthQUN4QyxDQUFDO1lBQ0YsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDcEIsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUc7Z0JBQ2hDLHFCQUFxQixFQUFFO29CQUNyQixHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxFQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFDLENBQUM7b0JBQy9ELEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7d0JBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSTt3QkFDM0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztxQkFDbkYsQ0FBQztpQkFDTDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7O2tJQWppQlUsb0NBQW9DO3NIQUFwQyxvQ0FBb0MsMk1DcERqRCw0MFZBaVRBOzRGRDdQYSxvQ0FBb0M7a0JBTGhELFNBQVM7K0JBQ0Usd0NBQXdDO2lPQUtkLHlCQUF5QjtzQkFBNUQsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge0NvbXBvbmVudCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlLCBEZWZpbml0aW9uQ29sdW1ufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TGlzdEl0ZW19IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZHJvcGRvd24vbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge011bHRpSW5wdXRWYWx1ZXN9IGZyb20gJ0B2YWx0aW1vL3VzZXItaW50ZXJmYWNlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMaXN0Q29sdW1uTW9kYWx9IGZyb20gJ0B2YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudCc7XG5pbXBvcnQge09iamVjdE1hbmFnZW1lbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9vYmplY3QtbWFuYWdlbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIERpc3BsYXlUeXBlUGFyYW1ldGVycyxcbiAgU2VhcmNoTGlzdENvbHVtbixcbiAgU2VhcmNoTGlzdENvbHVtblZpZXcsXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9vYmplY3QtbWFuYWdlbWVudC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tb2JqZWN0LW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29iamVjdC1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29iamVjdC1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdtb3ZlUm93QnV0dG9ucycpIHB1YmxpYyBtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICByZWFkb25seSBkb3dubG9hZE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlVXJsPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGN1cnJlbnRNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0Q29sdW1uTW9kYWw+KCdjcmVhdGUnKTtcbiAgcmVhZG9ubHkgc2hvd01vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBtb2RhbFNob3dpbmckID0gdGhpcy5zaG93TW9kYWwkLnBpcGUoZGVsYXkoMjUwKSk7XG4gIHJlYWRvbmx5IGRpc2FibGVJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0RlbGV0ZU1vZGFsJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRlbGV0ZVJvd0luZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgZGVmYXVsdEVudW1WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IElOVkFMSURfS0VZID0gJ2ludmFsaWQnO1xuICByZWFkb25seSBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICB0aXRsZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBrZXk6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgcGF0aDogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkYXRlRm9ybWF0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRpc3BsYXlUeXBlOiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIHNvcnRhYmxlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxuICAgIGRlZmF1bHRTb3J0OiBuZXcgRm9ybUNvbnRyb2woe1xuICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgIH0pLFxuICAgIGVudW06IG5ldyBGb3JtQ29udHJvbChbXSksXG4gIH0pO1xuICByZWFkb25seSBESVNQTEFZX1RZUEVTOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgICdzdHJpbmcnLFxuICAgICdkYXRlJyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2VudW0nLFxuICAgICdhcnJheUNvdW50JyxcbiAgICAndW5kZXJzY29yZXNUb1NwYWNlcycsXG4gIF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5TOiBBcnJheTxEZWZpbml0aW9uQ29sdW1uPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICd0aXRsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3RpdGxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2tleScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2tleScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdwYXRoJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAncGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5VHlwZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdzb3J0YWJsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3NvcnRhYmxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2RlZmF1bHRTb3J0JyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGVmYXVsdFNvcnQnLFxuICAgIH0sXG4gIF07XG4gIHByaXZhdGUgY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zOiBBcnJheTxTZWFyY2hMaXN0Q29sdW1uPiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsPihudWxsKTtcblxuICByZWFkb25seSBvYmplY3RNYW5hZ2VtZW50RmllbGRzJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0RmllbGQ+PiA9IHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgIC5zdHJlYW0oJ2tleScpXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKCkgPT5cbiAgICAgICAgdGhpcy5DT0xVTU5TLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgICBrZXk6IGNvbHVtbi5wcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICAgIC4uLihjb2x1bW4uZW51bSAmJiB7ZW51bTogY29sdW1uLmVudW19KSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICByZWFkb25seSBvYmplY3RJZCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgbWFwKHBhcmFtcyA9PiBwYXJhbXMuaWQgfHwgJycpLFxuICAgIGZpbHRlcihvYmplY3RJZCA9PiAhIW9iamVjdElkKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMub2JqZWN0SWQkLFxuICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbb2JqZWN0SWRdKSA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmdldFNlYXJjaExpc3Qob2JqZWN0SWQpKSxcbiAgICB0YXAob2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMub2JqZWN0SWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKG9iamVjdElkID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkob2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zKSAmJlxuICAgICAgICAgIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQob2JqZWN0SWQsIG9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHRhcChvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPT4ge1xuICAgICAgdGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPSBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnM7XG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgdHJhbnNsYXRlZE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQ6IE9ic2VydmFibGU8QXJyYXk8U2VhcmNoTGlzdENvbHVtblZpZXc+PiA9XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5vYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMkLCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKV0pLnBpcGUoXG4gICAgICBtYXAoKFtjb2x1bW5zXSkgPT5cbiAgICAgICAgY29sdW1ucy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUgfHwgJy0nLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGVcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVZZXMnKVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZU5vJyksXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6XG4gICAgICAgICAgICAoY29sdW1uLmRlZmF1bHRTb3J0ID09PSAnQVNDJyAmJlxuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZUFzYycpKSB8fFxuICAgICAgICAgICAgKGNvbHVtbi5kZWZhdWx0U29ydCA9PT0gJ0RFU0MnICYmXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaXN0Q29sdW1uLnNvcnRhYmxlRGVzYycpKSB8fFxuICAgICAgICAgICAgJy0nLFxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgIGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuJHtjb2x1bW4/LmRpc3BsYXlUeXBlPy50eXBlfWBcbiAgICAgICAgICApLFxuICAgICAgICAgIGRpc3BsYXlUeXBlUGFyYW1ldGVyczogdGhpcy5nZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KFxuICAgICAgICAgICAgY29sdW1uLmRpc3BsYXlUeXBlLmRpc3BsYXlUeXBlUGFyYW1ldGVyc1xuICAgICAgICAgICksXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZURlZmF1bHRTb3J0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQsXG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbY3VycmVudE1vZGFsVHlwZV0pID0+XG4gICAgICAgIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnICYmXG4gICAgICAgIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmZpbmQoY29sdW1uID0+ICEhY29sdW1uLmRlZmF1bHRTb3J0KVxuICAgICksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dEYXRlRm9ybWF0JCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgIG1hcChmb3JtVmFsdWVzID0+IGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzFdKSxcbiAgICB0YXAoc2hvd0RhdGVGb3JtYXQgPT4ge1xuICAgICAgaWYgKHNob3dEYXRlRm9ybWF0ID09PSBmYWxzZSAmJiAhIXRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGVGb3JtYXQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZGF0ZUZvcm1hdDogJyd9KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0VudW0kID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZm9ybVZhbHVlcyA9PlxuICAgICAgICAhIShcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1szXSB8fFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzJdXG4gICAgICAgIClcbiAgICApLFxuICAgIHRhcChzaG93RW51bSA9PiB7XG4gICAgICBjb25zdCBlbnVtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5lbnVtO1xuICAgICAgaWYgKHNob3dFbnVtID09PSBmYWxzZSAmJiBBcnJheS5pc0FycmF5KGVudW1WYWx1ZSkgJiYgZW51bVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZW51bTogW119KTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNZZXNObyQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoZm9ybVZhbHVlcyA9PiBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1syXSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICByZWFkb25seSB2aWV3VHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuc2VsZWN0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLkRJU1BMQVlfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbkRpc3BsYXlUeXBlLiR7dHlwZX1gKSxcbiAgICAgICAgICBrZXk6IHR5cGUsXG4gICAgICAgIH0pKSxcbiAgICAgIF0ubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgc2VsZWN0ZWQ6IGluZGV4ID09PSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4LFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkU29ydEl0ZW1JbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgc29ydEl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFNvcnRJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkU29ydEl0ZW1JbmRleF0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zZWxlY3REZWZhdWx0U29ydGApLFxuICAgICAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlQXNjYCksXG4gICAgICAgICAga2V5OiAnQVNDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlRGVzY2ApLFxuICAgICAgICAgIGtleTogJ0RFU0MnLFxuICAgICAgICB9LFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkU29ydEl0ZW1JbmRleCxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSB2YWxpZEtleSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMuY3VycmVudE1vZGFsVHlwZSRdKS5waXBlKFxuICAgIG1hcCgoW2Zvcm1WYWx1ZXMsIGN1cnJlbnRNb2RhbFR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ0tleXMgPSB0aGlzLmNhY2hlZE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnID8gIWV4aXN0aW5nS2V5cy5pbmNsdWRlcyhmb3JtVmFsdWVzLmtleSkgOiB0cnVlO1xuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSB2YWxpZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMudmFsaWRLZXkkXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW2Zvcm1WYWx1ZXMsIHZhbGlkS2V5XSkgPT5cbiAgICAgICAgISEoXG4gICAgICAgICAgZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ICE9PSB0aGlzLklOVkFMSURfS0VZICYmXG4gICAgICAgICAgZm9ybVZhbHVlcy5wYXRoICYmXG4gICAgICAgICAgdmFsaWRLZXkgJiZcbiAgICAgICAgICAoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZS5rZXkgPT09ICdlbnVtJyA/IGZvcm1WYWx1ZXMuZW51bT8ubGVuZ3RoID4gMCA6IHRydWUpXG4gICAgICAgIClcbiAgICApLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlOiBPYmplY3RNYW5hZ2VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuXG4gIG9wZW5Nb2RhbChtb2RhbFR5cGU6IExpc3RDb2x1bW5Nb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQubmV4dChtb2RhbFR5cGUpO1xuXG4gICAgaWYgKG1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5lbmFibGUoKTtcbiAgICAgIHRoaXMucmVzZXRGb3JtR3JvdXAoKTtcbiAgICB9IGVsc2UgaWYgKG1vZGFsVHlwZSA9PT0gJ2VkaXQnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgZGVsZXRlUm93KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyLCBjbGlja0V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVsZXRlUm93SW5kZXgkLm5leHQoc2VhcmNoTGlzdENvbHVtblJvd0luZGV4KTtcbiAgfVxuXG4gIGRlbGV0ZVJvd0NvbmZpcm1hdGlvbihzZWFyY2hMaXN0Q29sdW1uUm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbktleSA9IHRoaXMuZ2V0Q29sdW1uS2V5KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleCk7XG5cbiAgICBpZiAoY29sdW1uS2V5KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgICB0aGlzLm9iamVjdElkJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIHN3aXRjaE1hcChvYmplY3RJZCA9PiB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLmRlbGV0ZVNlYXJjaExpc3Qob2JqZWN0SWQsIGNvbHVtbktleSkpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMoKSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29sdW1uS2V5KHNlYXJjaExpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zW3NlYXJjaExpc3RDb2x1bW5Sb3dJbmRleF0/LmtleTtcbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgc2VhcmNoTGlzdENvbHVtblJvd0luZGV4OiBudW1iZXIsXG4gICAgbW92ZVVwOiBib29sZWFuLFxuICAgIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgb2JqZWN0SWQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMgPSBbLi4udGhpcy5jYWNoZWRPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNdO1xuICAgIGNvbnN0IHNlYXJjaExpc3RDb2x1bW5Sb3cgPSBvYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnNbc2VhcmNoTGlzdENvbHVtblJvd0luZGV4XTtcblxuICAgIGNsaWNrRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBUT0RPOlxuICB9XG5cbiAgc2F2ZUNhc0xpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW51bVZhbHVlQ2hhbmdlKHZhbHVlOiBBcnJheTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiB2YWx1ZX0pO1xuICB9XG5cbiAgY29sdW1uUm93Q2xpY2tlZChyb3c6IHtrZXk6IHN0cmluZ30pOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZpZXdUeXBlSXRlbXMkLCB0aGlzLnNvcnRJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt2aWV3VHlwZUl0ZW1zLCBzb3J0SXRlbXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2FjaGVkT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgY2FjaGVkQ29sdW1uID0+IGNhY2hlZENvbHVtbi5rZXkgPT09IHJvdy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtID0gdmlld1R5cGVJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kaXNwbGF5VHlwZS50eXBlKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtSW5kZXggPSB2aWV3VHlwZUl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICBpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3J0SXRlbSA9IHNvcnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRJdGVtSW5kZXggPSBzb3J0SXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW07XG4gICAgICAgIGNvbnN0IG1hcHBlZEVudW1WYWx1ZXM6IE11bHRpSW5wdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0ZUZvcm1hdCA9IGNvbHVtbj8uZGlzcGxheVR5cGU/LmRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLm5leHQodmlld1R5cGVJdGVtSW5kZXgpO1xuXG4gICAgICAgIGlmIChzb3J0SXRlbSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KHNvcnRJdGVtSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudW1WYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnVtVmFsdWVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtYXBwZWRFbnVtVmFsdWVzLnB1c2goe2tleSwgdmFsdWU6IGVudW1WYWx1ZXNba2V5XX0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQobWFwcGVkRW51bVZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB7Li4udmlld1R5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHNvcnRJdGVtID8gey4uLnNvcnRJdGVtfSA6IHsuLi5zb3J0SXRlbXNbMF19LFxuICAgICAgICAgIC4uLihjb2x1bW5EYXRlRm9ybWF0ICYmIHtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IGNvbHVtbkRhdGVGb3JtYXQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW4ob2JqZWN0SWQ6IHN0cmluZywgbGlzdENvbHVtbjogU2VhcmNoTGlzdENvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG4gICAgdGhpcy5vYmplY3RNYW5hZ2VtZW50U2VydmljZVxuICAgICAgLnB1dFNlYXJjaExpc3Qob2JqZWN0SWQsIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmtleSwgbGlzdENvbHVtbilcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucygpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBsaXN0LXNlYXJjaC0ke29iamVjdElkfWAsIG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ29sdW1uKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlO1xuXG4gICAgdGhpcy5vYmplY3RJZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAob2JqZWN0SWQgPT5cbiAgICAgICAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLnBvc3RTZWFyY2hMaXN0KFxuICAgICAgICAgICAgb2JqZWN0SWQsXG4gICAgICAgICAgICB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucygpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGlzcGxheVR5cGVQYXJhbWV0ZXJzVmlldyhkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IERpc3BsYXlUeXBlUGFyYW1ldGVycyk6IHN0cmluZyB7XG4gICAgaWYgKGRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlUeXBlUGFyYW1ldGVycy5kYXRlRm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5lbnVtKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW0pLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleVZhbHVlUGFpclN0cmluZyA9IGAke2N1cnJ9OiAke2Rpc3BsYXlUeXBlUGFyYW1ldGVycy5lbnVtW2N1cnJdfWA7XG4gICAgICAgIGlmICghYWNjKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2tleVZhbHVlUGFpclN0cmluZ31gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgJHthY2N9LCAke2tleVZhbHVlUGFpclN0cmluZ31gO1xuICAgICAgICB9XG4gICAgICB9LCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnLSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW4oKTogdm9pZCB7XG4gICAgdGhpcy5vYmplY3RJZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAob2JqZWN0SWQgPT5cbiAgICAgICAgICB0aGlzLm9iamVjdE1hbmFnZW1lbnRTZXJ2aWNlLnB1dFNlYXJjaExpc3QoXG4gICAgICAgICAgICBvYmplY3RJZCxcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmtleSxcbiAgICAgICAgICAgIHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKHRoaXMuZm9ybUdyb3VwLnZhbHVlKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldERvd25sb2FkKFxuICAgIG9iamVjdElkOiBzdHJpbmcsXG4gICAgT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zOiBBcnJheTxTZWFyY2hMaXN0Q29sdW1uPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRvd25sb2FkTmFtZSQubmV4dChgJHtvYmplY3RJZH0uanNvbmApO1xuICAgIHRoaXMuZG93bmxvYWRVcmwkLm5leHQoXG4gICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFxuICAgICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD1VVEYtOCwnICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zLCBudWxsLCAyKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hPYmplY3RNYW5hZ2VtZW50TGlzdENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoT2JqZWN0TWFuYWdlbWVudExpc3RDb2x1bW5zJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1Hcm91cCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5yZXNldCgpO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc29ydEl0ZW1zJCwgdGhpcy52aWV3VHlwZUl0ZW1zJF0pXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoW3NvcnRJdGVtcywgdmlld1R5cGVJdGVtc10pID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2Rpc3BsYXlUeXBlOiB2aWV3VHlwZUl0ZW1zWzBdfSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KDApO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2RlZmF1bHRTb3J0OiBzb3J0SXRlbXNbMF19KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBGb3JtVmFsdWVzVG9Db2x1bW4oZm9ybVZhbHVlOiBhbnkpOiBTZWFyY2hMaXN0Q29sdW1uIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBmb3JtVmFsdWUua2V5LFxuICAgICAgc29ydGFibGU6IGZvcm1WYWx1ZS5zb3J0YWJsZSxcbiAgICAgIC4uLihmb3JtVmFsdWUuZGVmYXVsdFNvcnQ/LmtleSAhPT0gdGhpcy5JTlZBTElEX0tFWSAmJiB7XG4gICAgICAgIGRlZmF1bHRTb3J0OiBmb3JtVmFsdWUuZGVmYXVsdFNvcnQ/LmtleSxcbiAgICAgIH0pLFxuICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSB8fCAnJyxcbiAgICAgIHBhdGg6IGZvcm1WYWx1ZS5wYXRoLFxuICAgICAgZGlzcGxheVR5cGU6IHtcbiAgICAgICAgdHlwZTogZm9ybVZhbHVlLmRpc3BsYXlUeXBlPy5rZXksXG4gICAgICAgIGRpc3BsYXlUeXBlUGFyYW1ldGVyczoge1xuICAgICAgICAgIC4uLihmb3JtVmFsdWUuZGF0ZUZvcm1hdCAmJiB7ZGF0ZUZvcm1hdDogZm9ybVZhbHVlLmRhdGVGb3JtYXR9KSxcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShmb3JtVmFsdWUuZW51bSkgJiZcbiAgICAgICAgICAgIGZvcm1WYWx1ZS5lbnVtLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgICAgICBlbnVtOiBmb3JtVmFsdWUuZW51bS5yZWR1Y2UoKGFjYywgY3VycikgPT4gKHsuLi5hY2MsIFtjdXJyLmtleV06IGN1cnIudmFsdWV9KSwge30pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgbGlzdENvbHVtbjogdHJhbnNsYXRlZE9iamVjdE1hbmFnZW1lbnRMaXN0Q29sdW1ucyQgfCBhc3luYyxcbiAgICBmaWVsZHM6IG9iamVjdE1hbmFnZW1lbnRGaWVsZHMkIHwgYXN5bmMsXG4gICAgb2JqZWN0SWQ6IG9iamVjdElkJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkVXJsOiBkb3dubG9hZFVybCQgfCBhc3luYyxcbiAgICBkb3dubG9hZE5hbWU6IGRvd25sb2FkTmFtZSQgfCBhc3luYyxcbiAgICBsb2FkaW5nOiBsb2FkaW5nJCB8IGFzeW5jXG4gIH0gYXMgb2JzXCJcbj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBwci0wIHBsLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtdC1tM3B4IG1iLTMgbXItMlwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uczsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFvYnMubG9hZGluZzsgZWxzZSBsb2FkaW5nXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib2JzLmxpc3RDb2x1bW4/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9Db25maWdXYXJuaW5nXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0OyBjb250ZXh0OiB7b2JzOiBvYnN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3JlYXRlRWRpdE1vZGFsXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZU1vZGFsXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9ucyBsZXQtb2JzPVwib2JzXCI+XG4gIDxhXG4gICAgaWJtTGlua1xuICAgIGNsYXNzPVwiY2VudGVyLWxpbmtcIlxuICAgIFtocmVmXT1cIm9icy5kb3dubG9hZFVybFwiXG4gICAgW2Rvd25sb2FkXT1cIm9icy5kb3dubG9hZE5hbWVcIlxuICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICFvYnMuZG93bmxvYWRVcmwgfHxcbiAgICAgICFvYnMuZG93bmxvYWROYW1lIHx8XG4gICAgICBvYnMubGlzdENvbHVtbj8ubGVuZ3RoIDwgMSB8fFxuICAgICAgb2JzLmRpc2FibGVJbnB1dCB8fFxuICAgICAgb2JzLmxvYWRpbmdcbiAgICBcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uZG93bmxvYWRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwib3Blbk1vZGFsKCdjcmVhdGUnKVwiXG4gICAgaWJtQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgc2l6ZT1cIm1kXCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmxvYWRpbmdcIlxuICAgIGNsYXNzPVwibWwtM1wiXG4gID5cbiAgICB7eyAnbGlzdENvbHVtbi5hZGRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGlibUljb249XCJhZGRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vdmVSb3dCdXR0b25zIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWxlbmd0aD1cImxlbmd0aFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb3ZlLXJvdy1idXR0b25zXCJcbiAgICAqbmdJZj1cIntcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkJCB8IGFzeW5jXG4gICAgfSBhcyBvYnNcIlxuICA+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1kZWxldGUgYnRuIGJ0bi1vdXRsaW5lLWRhbmdlciBtci0xXCJcbiAgICAgIChjbGljayk9XCJkZWxldGVSb3coaW5kZXgsICRldmVudClcIlxuICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZCBkaXNhYmxlZC1tb3ZlLXJvdy1idXR0b24nOiBvYnMuZGlzYWJsZUlucHV0fVwiXG4gICAgPjwvaT5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtZGkgbWRpLWFycm93LXVwLWJvbGQgYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMVwiXG4gICAgICAoY2xpY2spPVwibW92ZVJvdyhpbmRleCwgdHJ1ZSwgJGV2ZW50LCBvYnMub2JqZWN0SWQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IDAgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy1kb3duLWJvbGQgYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXG4gICAgICAoY2xpY2spPVwibW92ZVJvdyhpbmRleCwgZmFsc2UsICRldmVudCwgb2JzLm9iamVjdElkKVwiXG4gICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkIGRpc2FibGVkLW1vdmUtcm93LWJ1dHRvbic6IGluZGV4ID09PSBsZW5ndGggLSAxIHx8IG9icy5kaXNhYmxlSW5wdXR9XCJcbiAgICA+PC9pPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdCBsZXQtb2JzPVwib2JzXCI+XG4gIDx2YWx0aW1vLWxpc3RcbiAgICBbaXRlbXNdPVwib2JzLmxpc3RDb2x1bW5cIlxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAqbmdJZj1cIm9icy5saXN0Q29sdW1uOyBlbHNlIGxvYWRpbmdcIlxuICAgIFtsYXN0Q29sdW1uVGVtcGxhdGVdPVwibW92ZVJvd0J1dHRvbnNUZW1wbGF0ZVJlZlwiXG4gICAgKHJvd0NsaWNrZWQpPVwiY29sdW1uUm93Q2xpY2tlZCgkZXZlbnQpXCJcbiAgPlxuICA8L3ZhbHRpbW8tbGlzdD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3JlYXRlRWRpdE1vZGFsPlxuICA8aWJtLW1vZGFsXG4gICAgKm5nSWY9XCJ7XG4gICAgICB0eXBlOiBjdXJyZW50TW9kYWxUeXBlJCB8IGFzeW5jLFxuICAgICAgc2hvdzogc2hvd01vZGFsJCB8IGFzeW5jLFxuICAgICAgdmFsaWQ6IHZhbGlkJCB8IGFzeW5jLFxuICAgICAgZGlzYWJsZUlucHV0OiBkaXNhYmxlSW5wdXQkIHwgYXN5bmMsXG4gICAgICB2YWxpZEtleTogdmFsaWRLZXkkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlRGVmYXVsdFNvcnQ6IGRpc2FibGVEZWZhdWx0U29ydCQgfCBhc3luYyxcbiAgICAgIHNob3dFbnVtOiBzaG93RW51bSQgfCBhc3luYyxcbiAgICAgIGlzWWVzTm86IGlzWWVzTm8kIHwgYXN5bmNcbiAgICB9IGFzIG1vZGFsT2JzXCJcbiAgICBbb3Blbl09XCJtb2RhbE9icy5zaG93XCJcbiAgPlxuICAgIDxpYm0tbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJjbG9zZU1vZGFsKClcIj5cbiAgICAgIDxoMyBpYm1Nb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICAgIHt7XG4gICAgICAgICAgbW9kYWxPYnMudHlwZSA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgID8gKCdsaXN0Q29sdW1uLmFkZEJ1dHRvblRleHQnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAoJ2xpc3RDb2x1bW4uZWRpdENvbHVtblRpdGxlJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgfX1cbiAgICAgIDwvaDM+XG4gICAgPC9pYm0tbW9kYWwtaGVhZGVyPlxuICAgIDxzZWN0aW9uIGlibU1vZGFsQ29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RhbENvbnRlbnQ7IGNvbnRleHQ6IHttb2RhbE9iczogbW9kYWxPYnN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RhbEZvb3RlcjsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9pYm0tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsQ29udGVudCBsZXQtbW9kYWxPYnM9XCJtb2RhbE9ic1wiPlxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIGNsYXNzPVwibGlzdC1jb2x1bW4tZm9ybVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxpYm0tbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLnRpdGxlVGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi50aXRsZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBpYm1UZXh0IGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgLz5cbiAgICAgIDwvaWJtLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxpYm0tbGFiZWxcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy50eXBlID09PSAnZWRpdCdcIlxuICAgICAgICBbaW52YWxpZF09XCJtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcIlxuICAgICAgICBbaW52YWxpZFRleHRdPVwiJ2xpc3RDb2x1bW4udW5pcXVlS2V5V2FybmluZycgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmtleScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmtleVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBpYm1UZXh0IGZvcm1Db250cm9sTmFtZT1cImtleVwiIFtpbnZhbGlkXT1cIm1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVwiIC8+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8aWJtLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXBcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi5wYXRoJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4ucGF0aFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpbnB1dCBpYm1UZXh0IGZvcm1Db250cm9sTmFtZT1cInBhdGhcIiAvPlxuICAgICAgPC9pYm0tbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGlibS1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwIHNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRpc3BsYXlUeXBlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGVUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aWJtLWRyb3Bkb3duIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlUeXBlXCIgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICAgIDxpYm0tZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwidmlld1R5cGVJdGVtcyQgfCBhc3luY1wiPjwvaWJtLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvaWJtLWRyb3Bkb3duPlxuICAgICAgPC9pYm0tbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiICpuZ0lmPVwic2hvd0RhdGVGb3JtYXQkIHwgYXN5bmNcIj5cbiAgICAgIDxpYm0tbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRhdGVGb3JtYXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kYXRlRm9ybWF0VG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlibVRleHQgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUZvcm1hdFwiIC8+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCIgKm5nSWY9XCJtb2RhbE9icy5zaG93RW51bSB8fCBtb2RhbE9icy5pc1llc05vXCI+XG4gICAgICA8aWJtLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIG1vZGFsT2JzLmlzWWVzTm9cbiAgICAgICAgICAgICAgPyAoJ2xpc3RDb2x1bW4uZW51bVRpdGxlT3B0aW9uYWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lbnVtVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5lbnVtVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHZhbHRpbW8tY2FyYm9uLW11bHRpLWlucHV0XG4gICAgICAgICAgKm5nSWY9XCIoc2hvd01vZGFsJCB8IGFzeW5jKSB8fCAobW9kYWxTaG93aW5nJCB8IGFzeW5jKVwiXG4gICAgICAgICAgdHlwZT1cImtleVZhbHVlXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZW51bVZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtkZWZhdWx0VmFsdWVzXT1cImRlZmF1bHRFbnVtVmFsdWVzJCB8IGFzeW5jXCJcbiAgICAgICAgPjwvdmFsdGltby1jYXJib24tbXVsdGktaW5wdXQ+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8aWJtLWNoZWNrYm94IGZvcm1Db250cm9sTmFtZT1cInNvcnRhYmxlXCJcbiAgICAgICAgPnt7ICdsaXN0Q29sdW1uLnNvcnRhYmxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9pYm0tY2hlY2tib3g+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGlibS1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLmRpc2FibGVEZWZhdWx0U29ydFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcCBzZWxlY3QtbGFiZWxcIj5cbiAgICAgICAgICB7eyAnbGlzdENvbHVtbi5kZWZhdWx0U29ydFRpdGxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4uZGVmYXVsdFNvcnRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aWJtLWRyb3Bkb3duXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVmYXVsdFNvcnRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMuZGlzYWJsZURlZmF1bHRTb3J0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpYm0tZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwic29ydEl0ZW1zJCB8IGFzeW5jXCI+PC9pYm0tZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9pYm0tZHJvcGRvd24+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtb2RhbEZvb3RlciBsZXQtbW9kYWxPYnM9XCJtb2RhbE9ic1wiPlxuICA8aWJtLW1vZGFsLWZvb3Rlcj5cbiAgICA8bmctY29udGFpbmVyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBpYm1CdXR0b249XCJzZWNvbmRhcnlcIlxuICAgICAgICBbYXR0ci5tb2RhbC1wcmltYXJ5LWZvY3VzXT1cInRydWVcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLmNsb3NlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGlibUJ1dHRvbj1cInByaW1hcnlcIlxuICAgICAgICBbYXR0ci5tb2RhbC1wcmltYXJ5LWZvY3VzXT1cInRydWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMudmFsaWQgPT09IGZhbHNlXCJcbiAgICAgICAgKGNsaWNrKT1cInNhdmVDYXNMaXN0Q29sdW1ucygpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIG1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy52YWxpZCA9PT0gZmFsc2UgfHwgbW9kYWxPYnMudmFsaWRLZXkgPT09IGZhbHNlXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7ICdsaXN0Q29sdW1uLnNhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9pYm0tbW9kYWwtZm9vdGVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWxldGVNb2RhbD5cbiAgPHZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsXG4gICAgW3Nob3dNb2RhbFN1YmplY3QkXT1cInNob3dEZWxldGVNb2RhbCRcIlxuICAgIFtvdXRwdXRPbkNvbmZpcm1dPVwiZGVsZXRlUm93SW5kZXgkIHwgYXN5bmNcIlxuICAgIChjb25maXJtRXZlbnQpPVwiZGVsZXRlUm93Q29uZmlybWF0aW9uKCRldmVudClcIlxuICAgIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtblwiXG4gICAgdGl0bGVUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJsaXN0Q29sdW1uLmRlbGV0ZUNvbHVtbkNvbmZpcm1hdGlvblwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub0NvbmZpZ1dhcm5pbmc+XG4gIDxkaXYgY2xhc3M9XCJwbC0yIHByLTIgcGItMlwiPlxuICAgIDxpYm0tbm90aWZpY2F0aW9uXG4gICAgICBbbm90aWZpY2F0aW9uT2JqXT1cIntcbiAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICB0aXRsZTogJ2xpc3RDb2x1bW4ubm9Db25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlLFxuICAgICAgICBzaG93Q2xvc2U6IGZhbHNlXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9pYm0tbm90aWZpY2F0aW9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctaWNvblwiPjxpYm0tbG9hZGluZz48L2libS1sb2FkaW5nPjwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|