@mediusinc/mng-commons 5.4.0-rc.0 → 5.4.0-rc.1
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/esm2022/core/helpers/object.mjs +8 -1
- package/esm2022/table/api/data-providers/table.data-provider.mjs +12 -6
- package/esm2022/table/api/models/table-event.model.mjs +1 -1
- package/esm2022/table/components/table/table.component.mjs +14 -7
- package/esm2022/tableview/action/components/action/action.component.mjs +2 -2
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +31 -17
- package/esm2022/tableview/action/components/table/action-table.component.mjs +4 -4
- package/esm2022/tableview/action/services/view-container.service.mjs +1 -1
- package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +1 -1
- package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +9 -2
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +18 -1
- package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
- package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +1 -1
- package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +18 -6
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +82 -0
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +164 -14
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +49 -0
- package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +2 -0
- package/esm2022/tableview/editor/services/form-editor.service.mjs +1 -1
- package/esm2022/tableview/index.mjs +3 -1
- package/fesm2022/mediusinc-mng-commons-core.mjs +7 -0
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +11 -5
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +13 -6
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +42 -6
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +322 -40
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/i18n/en.json +14 -0
- package/i18n/sl.json +14 -0
- package/package.json +1 -1
- package/table/api/data-providers/table.data-provider.d.ts +14 -5
- package/table/api/models/table-event.model.d.ts +4 -3
- package/table/components/table/table.component.d.ts +11 -2
- package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +4 -0
- package/tableview/action/components/table/action-table.component.d.ts +2 -2
- package/tableview/action/services/view-container.service.d.ts +6 -5
- package/tableview/api/action/models/execution/view-container.model.d.ts +7 -24
- package/tableview/api/editor/data-providers/editor.data-provider.d.ts +10 -1
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +1 -1
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +1 -1
- package/tableview/api/editor/models/form-editor.event.d.ts +9 -0
- package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
- package/tableview/api/tableview/data-providers/tableview.data-provider.d.ts +10 -3
- package/tableview/editor/components/editor/auto-save-status/auto-save-status.component.d.ts +10 -0
- package/tableview/editor/components/editor/form-editor.component.d.ts +51 -4
- package/tableview/editor/helpers/editor-autosave.d.ts +17 -0
- package/tableview/editor/models/editor-auto-save-preview.model.d.ts +10 -0
- package/tableview/editor/services/form-editor.service.d.ts +2 -2
- package/tableview/index.d.ts +2 -0
- package/version-info.json +5 -5
|
@@ -1,23 +1,29 @@
|
|
|
1
|
-
import { AsyncPipe } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
1
|
+
import { AsyncPipe, DatePipe } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, booleanAttribute, computed, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
3
|
+
import { outputFromObservable, takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { FormArray, FormGroup, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
|
|
5
|
+
import { Router } from '@angular/router';
|
|
5
6
|
import { FormlyConfig, FormlyModule } from '@ngx-formly/core';
|
|
6
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
7
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
7
8
|
import { ButtonModule } from 'primeng/button';
|
|
8
9
|
import { MessagesModule } from 'primeng/messages';
|
|
9
|
-
import { BehaviorSubject, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
10
|
+
import { BehaviorSubject, debounceTime, distinctUntilChanged, tap } from 'rxjs';
|
|
10
11
|
import { map } from 'rxjs/operators';
|
|
11
|
-
import { CommonsService, LoggerService, objectDeepCopy } from '@mediusinc/mng-commons/core';
|
|
12
|
+
import { CommonsService, CommonsStorageService, LoggerService, StyleLevelEnum, StyleSizeEnum, objectDeepCopy } from '@mediusinc/mng-commons/core';
|
|
13
|
+
import { ButtonStyleBuilder, ButtonStyleRoundedEnum } from '@mediusinc/mng-commons/form/api';
|
|
12
14
|
import { FormEventTypeEnum, FormFieldEventComponentSubtype, TableviewEditorTypeEnum } from '@mediusinc/mng-commons/tableview/api';
|
|
15
|
+
import { generateAutosaveEditorKey } from '../../helpers/editor-autosave';
|
|
13
16
|
import { createFormlyConfigFromDescriptor } from '../../helpers/editor-formly';
|
|
14
17
|
import { getFormEditorInfoMessage, getFormEditorWarningMessage } from '../../helpers/notification';
|
|
15
18
|
import { FormEditorService, provideFormComponent } from '../../services/form-editor.service';
|
|
19
|
+
import { EditorAutoSaveStatusComponent } from './auto-save-status/auto-save-status.component';
|
|
16
20
|
import * as i0 from "@angular/core";
|
|
17
21
|
import * as i1 from "@ngx-formly/core";
|
|
18
22
|
import * as i2 from "@angular/forms";
|
|
19
23
|
import * as i3 from "primeng/messages";
|
|
20
24
|
import * as i4 from "primeng/button";
|
|
25
|
+
import * as i5 from "primeng/api";
|
|
26
|
+
import * as i6 from "@ngx-translate/core";
|
|
21
27
|
export class FormEditorComponent {
|
|
22
28
|
get parent() {
|
|
23
29
|
return this.formService.parent;
|
|
@@ -44,16 +50,26 @@ export class FormEditorComponent {
|
|
|
44
50
|
this.formlyConfig = inject(FormlyConfig);
|
|
45
51
|
this.translateService = inject(TranslateService);
|
|
46
52
|
this.commons = inject(CommonsService);
|
|
47
|
-
this.
|
|
53
|
+
this.cmpTypeName = 'FormEditorComponent';
|
|
54
|
+
this.logger = inject(LoggerService).create(this.cmpTypeName);
|
|
48
55
|
this.destroyRef = inject(DestroyRef);
|
|
49
56
|
this.formService = inject((FormEditorService));
|
|
57
|
+
this.commonsStorageService = inject(CommonsStorageService);
|
|
58
|
+
this.router = inject(Router);
|
|
59
|
+
this.autoSaveStorageKeyCompInit = true;
|
|
60
|
+
this.autoSaveStorageKey = computed(() => generateAutosaveEditorKey(this.descriptor(), this.item(), this.router.url, { editorId: this.editorId(), itemId: this.itemId() }));
|
|
50
61
|
this.descriptor = input.required();
|
|
51
|
-
this.submitLoading = input(false);
|
|
52
|
-
this.item =
|
|
53
|
-
this.isFormDisabled = input(false);
|
|
62
|
+
this.submitLoading = input(false, { transform: booleanAttribute });
|
|
63
|
+
this.item = model(undefined);
|
|
64
|
+
this.isFormDisabled = input(false, { transform: booleanAttribute });
|
|
65
|
+
this.editorId = input(undefined);
|
|
66
|
+
this.itemId = input(undefined);
|
|
67
|
+
this.showAutoSaveStatus = input(true, { transform: booleanAttribute });
|
|
54
68
|
// event outputs
|
|
55
69
|
this.formSubmit = output();
|
|
56
70
|
this.valueChange = output();
|
|
71
|
+
this.autoSaveStatusSubject = new BehaviorSubject({ state: 'initial', timestamp: new Date() });
|
|
72
|
+
this.autoSaveStatus = outputFromObservable(this.autoSaveStatusSubject.asObservable());
|
|
57
73
|
// content and view queries
|
|
58
74
|
this.submitButtonElementRef = viewChild('submitButton');
|
|
59
75
|
// formly specifics
|
|
@@ -71,6 +87,27 @@ export class FormEditorComponent {
|
|
|
71
87
|
this._formlyInitialItem = {}; // initialized in ngOnInit, should not be changed after
|
|
72
88
|
this.setterFields = computed(() => this.descriptor().fields.filter(f => typeof f.setter === 'function'));
|
|
73
89
|
this.formMessages = signal([]);
|
|
90
|
+
// autosave
|
|
91
|
+
this.restoreLocalStateButtonStyle = ButtonStyleBuilder.create(StyleLevelEnum.Success, StyleSizeEnum.Small).build();
|
|
92
|
+
this.previewLocalStateButtonStyle = ButtonStyleBuilder.create(StyleLevelEnum.Info, StyleSizeEnum.Small).build();
|
|
93
|
+
this.clearLocalStateButtonStyle = ButtonStyleBuilder.create(StyleLevelEnum.Danger, StyleSizeEnum.Small)
|
|
94
|
+
.withRoundedButton(ButtonStyleRoundedEnum.SQUARE)
|
|
95
|
+
.withTextButton()
|
|
96
|
+
.build();
|
|
97
|
+
this.autoSaveRestore = signal(null);
|
|
98
|
+
this.autoSave = toSignal(this.autoSaveStatusSubject);
|
|
99
|
+
this.autoSavePreviewButtonLabel = computed(() => {
|
|
100
|
+
switch (this.autoSave()?.state) {
|
|
101
|
+
case 'preview':
|
|
102
|
+
return 'mngEditor.autoSave.restore.previewCurrent';
|
|
103
|
+
case 'previewCurrent':
|
|
104
|
+
return 'mngEditor.autoSave.restore.previewAutosaved';
|
|
105
|
+
default:
|
|
106
|
+
return 'mngEditor.autoSave.restore.preview';
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
this.autoSaveShowRestore = computed(() => this.autoSaveRestore()?.saved != null);
|
|
110
|
+
this.autoSavePreviewDisabledForm = signal(false);
|
|
74
111
|
this.formService.init(this);
|
|
75
112
|
effect(() => {
|
|
76
113
|
const item = this.item();
|
|
@@ -82,11 +119,22 @@ export class FormEditorComponent {
|
|
|
82
119
|
// resetModel uses signal like concept
|
|
83
120
|
{ allowSignalWrites: true });
|
|
84
121
|
effect(() => {
|
|
85
|
-
this._formlyOptions.formState.disabled =
|
|
122
|
+
this._formlyOptions.formState.disabled =
|
|
123
|
+
this.isFormDisabled() || this.autoSavePreviewDisabledForm() || this._formlyOptions.formState.descriptor?.disabled === true || this._formlyOptions.formState.details;
|
|
86
124
|
untracked(() => {
|
|
87
125
|
this._formlyStateDisabledSubject.next(this._formlyOptions.formState.disabled);
|
|
88
126
|
});
|
|
89
127
|
});
|
|
128
|
+
effect(() => {
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
130
|
+
const key = this.autoSaveStorageKey();
|
|
131
|
+
untracked(() => {
|
|
132
|
+
this.autoSaveStopValueChangeListen();
|
|
133
|
+
this.autoSaveLoadSavedFromStorage();
|
|
134
|
+
this.autoSaveStartEventChangeListen(this.autoSaveStorageKeyCompInit);
|
|
135
|
+
this.autoSaveStorageKeyCompInit = false;
|
|
136
|
+
});
|
|
137
|
+
});
|
|
90
138
|
}
|
|
91
139
|
ngOnInit() {
|
|
92
140
|
// init form state
|
|
@@ -156,6 +204,7 @@ export class FormEditorComponent {
|
|
|
156
204
|
submitValid: true,
|
|
157
205
|
submitValue: formSubmitItem
|
|
158
206
|
});
|
|
207
|
+
this.onAutoSaveDismiss();
|
|
159
208
|
}
|
|
160
209
|
else {
|
|
161
210
|
// find and mark invalid tabs
|
|
@@ -251,6 +300,63 @@ export class FormEditorComponent {
|
|
|
251
300
|
return false;
|
|
252
301
|
}
|
|
253
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Restores the saved local state.
|
|
305
|
+
* If local storage keys exist for local state and local timestamp, restore their corresponding values.
|
|
306
|
+
*/
|
|
307
|
+
onAutoSaveRestore() {
|
|
308
|
+
const restore = this.autoSaveRestore();
|
|
309
|
+
if (restore?.saved) {
|
|
310
|
+
this.autoSaveStopValueChangeListen();
|
|
311
|
+
this.resetFormModel(restore.saved);
|
|
312
|
+
this.autoSaveRestore.set(null);
|
|
313
|
+
this.autoSaveStatusSubject.next({ state: 'restored', timestamp: restore.savedAt ?? new Date() });
|
|
314
|
+
this.autoSavePreviewDisabledForm.set(false);
|
|
315
|
+
this.autoSaveStartEventChangeListen();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Previews the saved local state.
|
|
320
|
+
* If local storage keys exist for local state and local timestamp, restore their corresponding values.
|
|
321
|
+
*/
|
|
322
|
+
onAutoSavePreview() {
|
|
323
|
+
if (!this.autoSaveRestore()?.saved) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
this.autoSaveStopValueChangeListen();
|
|
327
|
+
this.autoSavePreviewDisabledForm.set(true);
|
|
328
|
+
const state = this.autoSaveStatusSubject.value.state;
|
|
329
|
+
if (state !== 'preview' && state !== 'previewCurrent') {
|
|
330
|
+
// must store original value from current value form
|
|
331
|
+
this.autoSaveRestore.update(i => ({ ...i, original: this.getFormValue() }));
|
|
332
|
+
}
|
|
333
|
+
const restore = this.autoSaveRestore();
|
|
334
|
+
if (state === 'preview' && restore?.original) {
|
|
335
|
+
this.resetFormModel(restore.original);
|
|
336
|
+
this.autoSaveStatusSubject.next({ state: 'previewCurrent' });
|
|
337
|
+
}
|
|
338
|
+
else if (state !== 'preview' && restore?.saved) {
|
|
339
|
+
this.resetFormModel(restore.saved);
|
|
340
|
+
this.autoSaveStatusSubject.next({ state: 'preview', timestamp: restore.savedAt ?? new Date() });
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Removes local state from local storage.
|
|
345
|
+
* If local storage keys exist for local state and local timestamp, remove their corresponding values.
|
|
346
|
+
*/
|
|
347
|
+
onAutoSaveDismiss() {
|
|
348
|
+
if (this.autoSaveStorageKey()) {
|
|
349
|
+
const restore = this.autoSaveRestore();
|
|
350
|
+
if (this.autoSaveStatusSubject.value.state === 'preview' && restore?.original) {
|
|
351
|
+
this.resetFormModel(restore.original);
|
|
352
|
+
this.autoSaveStatusSubject.next({ state: 'initial', timestamp: new Date() });
|
|
353
|
+
}
|
|
354
|
+
this.commonsStorageService.removeItem(this.cmpTypeName, this.autoSaveStorageKey());
|
|
355
|
+
this.autoSaveRestore.set(null);
|
|
356
|
+
this.autoSavePreviewDisabledForm.set(false);
|
|
357
|
+
this.autoSaveStartEventChangeListen();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
254
360
|
getFormModelFromItem(item) {
|
|
255
361
|
const formModel = objectDeepCopy(item, { mapGettersToProperties: true }) ?? {};
|
|
256
362
|
const descriptor = this.descriptor();
|
|
@@ -311,11 +417,55 @@ export class FormEditorComponent {
|
|
|
311
417
|
}
|
|
312
418
|
return false;
|
|
313
419
|
}
|
|
420
|
+
autoSaveStartEventChangeListen(init = false) {
|
|
421
|
+
if (!this.descriptor().autoSave) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
setTimeout(() => {
|
|
425
|
+
if (!this.autoSaveEventsSubscription) {
|
|
426
|
+
this.autoSaveEventsSubscription = this._form.valueChanges
|
|
427
|
+
.pipe(debounceTime(250), distinctUntilChanged(),
|
|
428
|
+
// skip first one on init
|
|
429
|
+
tap(() => {
|
|
430
|
+
if (this.autoSaveStatusSubject.value.state !== 'saved' && this.autoSaveStatusSubject.value.state !== 'preview')
|
|
431
|
+
this.autoSaveStatusSubject.next({ ...this.autoSaveStatusSubject.value, state: 'saving' });
|
|
432
|
+
}), debounceTime(750), takeUntilDestroyed(this.destroyRef))
|
|
433
|
+
.subscribe(() => {
|
|
434
|
+
this.autoSaveSaveToStorage();
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}, init ? 0 : 500 // delay initial event listening for all the initializations to take place
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
autoSaveStopValueChangeListen() {
|
|
441
|
+
this.autoSaveEventsSubscription?.unsubscribe();
|
|
442
|
+
this.autoSaveEventsSubscription = undefined;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Saves the form value to localStorage if autoSave is enabled and the required keys are defined.
|
|
446
|
+
* @returns {void}
|
|
447
|
+
*/
|
|
448
|
+
autoSaveSaveToStorage() {
|
|
449
|
+
if (this.descriptor().autoSave !== true || this.autoSaveStatusSubject.value.state === 'preview' || this.autoSaveStatusSubject.value.state === 'previewCurrent') {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
this.commonsStorageService.setItem(this.cmpTypeName, this.autoSaveStorageKey(), { saved: this.getFormValue(), savedAt: new Date() });
|
|
453
|
+
this.autoSaveStatusSubject.next({ state: 'saved', timestamp: new Date() });
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Loads the value from the local storage if available
|
|
457
|
+
*/
|
|
458
|
+
autoSaveLoadSavedFromStorage() {
|
|
459
|
+
const { autoSave, model } = this.descriptor();
|
|
460
|
+
if (autoSave && model.i18nBaseKey) {
|
|
461
|
+
this.autoSaveRestore.set(this.commonsStorageService.getItem(this.cmpTypeName, this.autoSaveStorageKey()) ?? null);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
314
464
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FormEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
315
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
465
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FormEditorComponent, isStandalone: true, selector: "mng-form-editor", inputs: { descriptor: { classPropertyName: "descriptor", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, submitLoading: { classPropertyName: "submitLoading", publicName: "submitLoading", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, isFormDisabled: { classPropertyName: "isFormDisabled", publicName: "isFormDisabled", isSignal: true, isRequired: false, transformFunction: null }, editorId: { classPropertyName: "editorId", publicName: "editorId", isSignal: true, isRequired: false, transformFunction: null }, itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: false, transformFunction: null }, showAutoSaveStatus: { classPropertyName: "showAutoSaveStatus", publicName: "showAutoSaveStatus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", formSubmit: "formSubmit", valueChange: "valueChange", autoSaveStatus: "autoSaveStatus" }, providers: [provideFormComponent()], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (autoSaveShowRestore()) {\n <p-messages severity=\"warn\">\n <ng-template pTemplate>\n <div class=\"flex flex-grow-1 justify-content-between align-items-center\">\n <h6 class=\"m-0 p-0\">\n <em class=\"pi pi-save mr-4\"></em>\n {{\n 'mngEditor.autoSave.restore.title'\n | translate: {lastChange: autoSaveRestore()?.savedAt ? (autoSaveRestore()?.savedAt! | date: 'dd. MM. YYYY HH:mm:ss') : ''}\n }}\n </h6>\n <div>\n <p-button\n icon=\"pi pi-sync\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.restore' | translate\"\n [styleClass]=\"restoreLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSaveRestore()\"></p-button>\n @if (autoSave()?.state !== 'preview' || autoSave()?.state !== 'previewCurrent') {\n <p-button\n icon=\"pi pi-eye\"\n size=\"small\"\n [label]=\"autoSavePreviewButtonLabel() | translate\"\n [styleClass]=\"previewLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSavePreview()\"></p-button>\n }\n <p-button\n icon=\"pi pi-times\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.dismiss' | translate\"\n [styleClass]=\"clearLocalStateButtonStyle\"\n (click)=\"onAutoSaveDismiss()\"></p-button>\n </div>\n </div>\n </ng-template>\n </p-messages>\n}\n\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formlyFields\" [options]=\"formlyOptions\" [model]=\"formlyInitialItem\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"submitLoading()\" loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages()\" [enableService]=\"false\"></p-messages>\n\n@if (descriptor().autoSave && showAutoSaveStatus()) {\n <mng-editor-auto-save-status [status]=\"autoSave()\"></mng-editor-auto-save-status>\n}\n", dependencies: [{ kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i1.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i3.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "component", type: EditorAutoSaveStatusComponent, selector: "mng-editor-auto-save-status", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
316
466
|
}
|
|
317
467
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FormEditorComponent, decorators: [{
|
|
318
468
|
type: Component,
|
|
319
|
-
args: [{ standalone: true, selector: 'mng-form-editor', imports: [FormlyModule, ReactiveFormsModule, MessagesModule, AsyncPipe, ButtonModule], providers: [provideFormComponent()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formlyFields\" [options]=\"formlyOptions\" [model]=\"formlyInitialItem\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"submitLoading()\" loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages()\" [enableService]=\"false\"></p-messages>\n" }]
|
|
469
|
+
args: [{ standalone: true, selector: 'mng-form-editor', imports: [FormlyModule, ReactiveFormsModule, MessagesModule, AsyncPipe, ButtonModule, TranslateModule, DatePipe, EditorAutoSaveStatusComponent], providers: [provideFormComponent()], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (autoSaveShowRestore()) {\n <p-messages severity=\"warn\">\n <ng-template pTemplate>\n <div class=\"flex flex-grow-1 justify-content-between align-items-center\">\n <h6 class=\"m-0 p-0\">\n <em class=\"pi pi-save mr-4\"></em>\n {{\n 'mngEditor.autoSave.restore.title'\n | translate: {lastChange: autoSaveRestore()?.savedAt ? (autoSaveRestore()?.savedAt! | date: 'dd. MM. YYYY HH:mm:ss') : ''}\n }}\n </h6>\n <div>\n <p-button\n icon=\"pi pi-sync\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.restore' | translate\"\n [styleClass]=\"restoreLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSaveRestore()\"></p-button>\n @if (autoSave()?.state !== 'preview' || autoSave()?.state !== 'previewCurrent') {\n <p-button\n icon=\"pi pi-eye\"\n size=\"small\"\n [label]=\"autoSavePreviewButtonLabel() | translate\"\n [styleClass]=\"previewLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSavePreview()\"></p-button>\n }\n <p-button\n icon=\"pi pi-times\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.dismiss' | translate\"\n [styleClass]=\"clearLocalStateButtonStyle\"\n (click)=\"onAutoSaveDismiss()\"></p-button>\n </div>\n </div>\n </ng-template>\n </p-messages>\n}\n\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formlyFields\" [options]=\"formlyOptions\" [model]=\"formlyInitialItem\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"submitLoading()\" loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages()\" [enableService]=\"false\"></p-messages>\n\n@if (descriptor().autoSave && showAutoSaveStatus()) {\n <mng-editor-auto-save-status [status]=\"autoSave()\"></mng-editor-auto-save-status>\n}\n" }]
|
|
320
470
|
}], ctorParameters: () => [] });
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFpQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25MLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBa0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTVHLE9BQU8sRUFBQyxZQUFZLEVBQXFCLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzFGLE9BQU8sRUFRSCxpQkFBaUIsRUFDakIsOEJBQThCLEVBRTlCLHVCQUF1QixFQUMxQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBQyx3QkFBd0IsRUFBRSwyQkFBMkIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7QUFVM0YsTUFBTSxPQUFPLG1CQUFtQjtJQXVDNUIsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFRDtRQWpFaUIsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqQyxXQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdELGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQSxpQkFBbUMsQ0FBQSxDQUFDLENBQUM7UUFFcEUsZUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQThCLENBQUM7UUFDMUQsa0JBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsU0FBSSxHQUFHLEtBQUssQ0FBbUIsU0FBUyxDQUFDLENBQUM7UUFDMUMsbUJBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckMsZ0JBQWdCO1FBQ1QsZUFBVSxHQUFHLE1BQU0sRUFBK0IsQ0FBQztRQUNuRCxnQkFBVyxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBRXBDLDJCQUEyQjtRQUNwQiwyQkFBc0IsR0FBRyxTQUFTLENBQXlCLGNBQWMsQ0FBQyxDQUFDO1FBRWxGLG1CQUFtQjtRQUNGLFVBQUssR0FBRyxJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLGdDQUEyQixHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELG1CQUFjLEdBQW1DO1lBQzlELFNBQVMsRUFBRTtnQkFDUCxHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsS0FBSztnQkFDWCxRQUFRLEVBQUUsS0FBSztnQkFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQzFGO1NBQ0osQ0FBQztRQUNNLGtCQUFhLEdBQXdCLEVBQUUsQ0FBQyxDQUFDLHVEQUF1RDtRQUNoRyx1QkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFHaEYsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVyRyxpQkFBWSxHQUFHLE1BQU0sQ0FBWSxFQUFFLENBQUMsQ0FBQztRQThCeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsTUFBTSxDQUNGLEdBQUcsRUFBRTtZQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDakMsc0dBQXNHO2dCQUN0RyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDTCxDQUFDO1FBQ0Qsc0NBQXNDO1FBQ3RDLEVBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFDLENBQzVCLENBQUM7UUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDdkssU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sUUFBUTtRQUNYLGtCQUFrQjtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsS0FBSyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN4RSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQzdDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsS0FBSyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQzlDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsS0FBSyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuRixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTdELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxHLG9GQUFvRjtRQUNwRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFakUsd0NBQXdDO1FBQ3hDLElBQ0ksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVc7WUFDN0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLEtBQUssdUJBQXVCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxtQkFBbUIsS0FBSyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFDbkosQ0FBQztZQUNDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2dCQUNsQixHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3RCLHdCQUF3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxtREFBbUQsRUFBRSx5REFBeUQsRUFBRTtvQkFDNUosZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7aUJBQ25ELENBQUM7YUFDTCxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBaUMsRUFBRTtZQUNqRyxZQUFZLEVBQUUsOEJBQThCLENBQUMsT0FBTztTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7YUFDbEIsSUFBSSxDQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsRUFDbkMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QzthQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQWlDLEVBQUU7Z0JBQzFGLEtBQUssRUFBRSxDQUFDO2dCQUNSLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2FBQ3ZDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRVAsK0ZBQStGO1FBQy9GLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVc7UUFDZCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFpQyxFQUFFO1lBQ2pHLFlBQVksRUFBRSw4QkFBOEIsQ0FBQyxVQUFVO1NBQzFELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxNQUFNO1FBQ1QsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRCw2REFBNkQ7SUFDdEQsUUFBUSxDQUFDLEtBQVk7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNqQixPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsY0FBYzthQUMzQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFpQyxFQUFFO2dCQUNyRixXQUFXLEVBQUUsSUFBSTtnQkFDakIsV0FBVyxFQUFFLGNBQWM7YUFDOUIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSiw2QkFBNkI7WUFDN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN0QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEksQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBZ0MsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUMsQ0FBQztZQUN0RixLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxpQ0FBaUMsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDLENBQUM7WUFFckosSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBaUMsRUFBRTtnQkFDckYsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLFdBQVcsRUFBRSxjQUFjO2FBQzlCLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQThCO1FBQzlDLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUUzRixJQUFJLElBQUksRUFBRSxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDakQsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDcEMsQ0FBQztvQkFFRCxVQUFVLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO2dCQUVELFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU0sY0FBYyxDQUFDLElBQVcsRUFBRSxJQUFtQztRQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUksSUFBSSxFQUFFLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNqQywrRkFBK0Y7WUFDL0YsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxjQUFjLENBQUMsR0FBVztRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLGFBQWEsQ0FBOEIsR0FBYSxFQUFFLEtBQXFCLEVBQUUsSUFBa0M7UUFDdEgsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sbUJBQW1CLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBRSxJQUFrQztRQUNsRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLGlCQUFpQixDQUFDLENBQUM7WUFDM0UsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlLENBQThCLEdBQWEsRUFBRSxLQUFxQixFQUFFLElBQW9DO1FBQzFILE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxLQUFVLEVBQUUsSUFBb0M7UUFDdEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZSxDQUE4QixHQUFhLEVBQUUsS0FBc0IsRUFBRSxJQUFvQztRQUMzSCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBVyxFQUFFLElBQW9DO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztZQUMzRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQXNCO1FBQy9DLE1BQU0sU0FBUyxHQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUMsQ0FBeUIsSUFBSSxFQUFFLENBQUM7UUFFdEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQztnQkFFOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM3QixhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBd0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMvRixDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxPQUFPLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzs0QkFDcEQsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUNsRCxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQXdCLEVBQUUsT0FBaUI7UUFDN0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBMkIsSUFBSSxDQUFDO1FBQy9DLElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFNBQThCLEVBQUU7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMzQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7OEdBeFZRLG1CQUFtQjtrR0FBbkIsbUJBQW1CLDJxQkFIakIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLGtLQ3JDdkMsNGNBS0EsMkNEK0JjLFlBQVksNktBQUUsbUJBQW1CLG9iQUFFLGNBQWMsMlJBQWEsWUFBWTs7MkZBSTNFLG1CQUFtQjtrQkFSL0IsU0FBUztpQ0FDTSxJQUFJLFlBQ04saUJBQWlCLFdBRWxCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLGFBQzFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxtQkFDbEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE9uSW5pdCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlDb25maWcsIEZvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlNb2R1bGV9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TWVzc2FnZX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtCdXR0b25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7TWVzc2FnZXNNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbWVzc2FnZXMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWR9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtDb21tb25zU2VydmljZSwgTG9nZ2VyU2VydmljZSwgb2JqZWN0RGVlcENvcHl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbW1vbnNGb3JtbHlGb3JtT3B0aW9ucyxcbiAgICBFZGl0b3JEZXNjcmlwdG9ySW5zdCxcbiAgICBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yUmVzZXRGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yUmVzZXRGb3JtTW9kZWxPcHRzLFxuICAgIEZvcm1FZGl0b3JTZXRGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yU3VibWl0RXZlbnQsXG4gICAgRm9ybUV2ZW50VHlwZUVudW0sXG4gICAgRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLFxuICAgIElGb3JtRWRpdG9yQ29tcG9uZW50LFxuICAgIFRhYmxldmlld0VkaXRvclR5cGVFbnVtXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbmltcG9ydCB7Y3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3J9IGZyb20gJy4uLy4uL2hlbHBlcnMvZWRpdG9yLWZvcm1seSc7XG5pbXBvcnQge2dldEZvcm1FZGl0b3JJbmZvTWVzc2FnZSwgZ2V0Rm9ybUVkaXRvcldhcm5pbmdNZXNzYWdlfSBmcm9tICcuLi8uLi9oZWxwZXJzL25vdGlmaWNhdGlvbic7XG5pbXBvcnQge0Zvcm1FZGl0b3JTZXJ2aWNlLCBwcm92aWRlRm9ybUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1lZGl0b3Iuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZm9ybS1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW0Zvcm1seU1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWVzc2FnZXNNb2R1bGUsIEFzeW5jUGlwZSwgQnV0dG9uTW9kdWxlXSxcbiAgICBwcm92aWRlcnM6IFtwcm92aWRlRm9ybUNvbXBvbmVudCgpXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRWRpdG9yQ29tcG9uZW50PEl0ZW0gPSBhbnksIFBhcmVudEl0ZW0gPSBhbnk+IGltcGxlbWVudHMgSUZvcm1FZGl0b3JDb21wb25lbnQ8SXRlbSwgUGFyZW50SXRlbT4sIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1seUNvbmZpZyA9IGluamVjdChGb3JtbHlDb25maWcpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbnMgPSBpbmplY3QoQ29tbW9uc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpLmNyZWF0ZSgnRm9ybUVkaXRvckNvbXBvbmVudCcpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1TZXJ2aWNlID0gaW5qZWN0KEZvcm1FZGl0b3JTZXJ2aWNlPEl0ZW0sIFBhcmVudEl0ZW0+KTtcblxuICAgIHB1YmxpYyBkZXNjcmlwdG9yID0gaW5wdXQucmVxdWlyZWQ8RWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbT4+KCk7XG4gICAgcHVibGljIHN1Ym1pdExvYWRpbmcgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGl0ZW0gPSBpbnB1dDxJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyBpc0Zvcm1EaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8vIGV2ZW50IG91dHB1dHNcbiAgICBwdWJsaWMgZm9ybVN1Ym1pdCA9IG91dHB1dDxGb3JtRWRpdG9yU3VibWl0RXZlbnQ8SXRlbT4+KCk7XG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gb3V0cHV0PEl0ZW0+KCk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBwdWJsaWMgc3VibWl0QnV0dG9uRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmIHwgdW5kZWZpbmVkPignc3VibWl0QnV0dG9uJyk7XG5cbiAgICAvLyBmb3JtbHkgc3BlY2lmaWNzXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtbHlTdGF0ZURpc2FibGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1seU9wdGlvbnM6IENvbW1vbnNGb3JtbHlGb3JtT3B0aW9uczxJdGVtPiA9IHtcbiAgICAgICAgZm9ybVN0YXRlOiB7XG4gICAgICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICAgICAgZWRpdDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZCQ6IHRoaXMuX2Zvcm1seVN0YXRlRGlzYWJsZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJpdmF0ZSBfZm9ybWx5RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107IC8vIGluaXRpYWxpemVkIGluIG5nT25Jbml0LCBzaG91bGQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICBwcml2YXRlIF9mb3JtbHlJbml0aWFsSXRlbSA9IHt9OyAvLyBpbml0aWFsaXplZCBpbiBuZ09uSW5pdCwgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGFmdGVyXG4gICAgcHJpdmF0ZSBpbml0aWFsSXRlbUlucHV0OiBJdGVtIHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBzZXR0ZXJGaWVsZHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5maWVsZHMuZmlsdGVyKGYgPT4gdHlwZW9mIGYuc2V0dGVyID09PSAnZnVuY3Rpb24nKSk7XG5cbiAgICBwdWJsaWMgZm9ybU1lc3NhZ2VzID0gc2lnbmFsPE1lc3NhZ2VbXT4oW10pO1xuXG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybVNlcnZpY2UucGFyZW50O1xuICAgIH1cblxuICAgIGdldCBmb3JtKCk6IEZvcm1Hcm91cDx7W0sgaW4ga2V5b2YgSXRlbV06IEFic3RyYWN0Q29udHJvbDxJdGVtW0tdPn0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm07XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1VbnNhZmUoKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtO1xuICAgIH1cblxuICAgIGdldCBmb3JtbHlPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWx5T3B0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgZm9ybWx5RmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWx5RmllbGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9ubHkgdXNlZCBmb3IgZm9ybSBpbml0aWFsaXphdGlvbi4gRnVydGhlciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIHVzaW5nIHtyZXNldEZvcm1Nb2RlbH0uXG4gICAgICovXG4gICAgZ2V0IGZvcm1seUluaXRpYWxJdGVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWx5SW5pdGlhbEl0ZW07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UuaW5pdCh0aGlzKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbSgpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtICE9PSB0aGlzLmluaXRpYWxJdGVtSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGl0ZW0gaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB0aGUgZm9ybSB3YXMgaW5pdGlhbGl6ZWQgd2l0aC4gTXVzdCB0cmlnZ2VyIHJlc2V0IG9mIGZvcm0gbW9kZWwuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwoaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIHJlc2V0TW9kZWwgdXNlcyBzaWduYWwgbGlrZSBjb25jZXB0XG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlLmRpc2FibGVkID0gdGhpcy5pc0Zvcm1EaXNhYmxlZCgpIHx8IHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlLmRlc2NyaXB0b3I/LmRpc2FibGVkID09PSB0cnVlIHx8IHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlLmRldGFpbHM7XG4gICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1seVN0YXRlRGlzYWJsZWRTdWJqZWN0Lm5leHQodGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGlzYWJsZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy8gaW5pdCBmb3JtIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlLmFkZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZXNjcmlwdG9yKCkudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRWRpdCkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZWRpdCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZXNjcmlwdG9yKCkudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uRGV0YWlscykge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGV0YWlscyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcigpO1xuXG4gICAgICAgIC8vIGluaXQgZmllbGRzIGZvciBmb3JtbHlcbiAgICAgICAgdGhpcy5fZm9ybWx5RmllbGRzID0gY3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yKCksIHRoaXMuZm9ybWx5Q29uZmlnLCB0aGlzKTtcblxuICAgICAgICAvLyBpbnQgZm9ybSBtb2RlbCAob25seSBpbml0aWFsLCBubyBmdXJ0aGVyIGNoYW5nZXMgdG8gZm9ybU1vZGVsIHNob3VsZCBiZSBhbGxvd2VkISlcbiAgICAgICAgdGhpcy5pbml0aWFsSXRlbUlucHV0ID0gdGhpcy5pdGVtKCk7XG4gICAgICAgIHRoaXMuX2Zvcm1seUluaXRpYWxJdGVtID0gdGhpcy5nZXRGb3JtTW9kZWxGcm9tSXRlbSh0aGlzLml0ZW0oKSk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGxvY2FsaXphdGlvbnMgZWRpdC9hZGQgbWVzc2FnZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5pc0xvY2FsaXplZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGVzY3JpcHRvcigpLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCB8fCB0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnNldChbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5mb3JtTWVzc2FnZXMoKSxcbiAgICAgICAgICAgICAgICBnZXRGb3JtRWRpdG9ySW5mb01lc3NhZ2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLCAnbW5nRWRpdG9yLmxvY2FsaXphdGlvbnMuYWRkSW5EZWZhdWx0TGFuZ3VhZ2VUaXRsZScsICdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5hZGRJbkRlZmF1bHRMYW5ndWFnZURlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2U6IHRoaXMuY29tbW9ucy5nZXREZWZhdWx0TG9jYWxlKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWl0IGxpZmVjeWNsZSBldmVudFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uQ29tcG9uZW50TGlmZWN5Y2xlLCB0aGlzIGFzIElGb3JtRWRpdG9yQ29tcG9uZW50PGFueT4sIHtcbiAgICAgICAgICAgIGV2ZW50U3VidHlwZTogRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLk9OX0lOSVRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRoaXMuX2Zvcm0uZ2V0UmF3VmFsdWUoKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZT8uZW1pdCh2KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uVmFsdWVDaGFuZ2UsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlOiAoKSA9PiB0aGlzLmdldEZvcm1WYWx1ZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBtYXJrIGZvcm0gYXMgcHJpc3RpbmUsIHNob3VsZCBiZSBkb25lIGluIG5leHQgZXZlbnQgaG9vayB0byBhbGxvdyBmb3JtbHkgdG8gaW5pdGlhbGl6ZSBmaXJzdFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICAvLyBlbWl0IGxpZmVjeWNsZSBldmVudFxuICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uQ29tcG9uZW50TGlmZWN5Y2xlLCB0aGlzIGFzIElGb3JtRWRpdG9yQ29tcG9uZW50PGFueT4sIHtcbiAgICAgICAgICAgIGV2ZW50U3VidHlwZTogRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLk9OX0RFU1RST1lcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b25FbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uU3VibWl0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5zdWJtaXR0ZWRPbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnNldChbXSk7XG5cbiAgICAgICAgY29uc3QgZm9ybVN1Ym1pdEl0ZW0gPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5fZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgZm9ybUl0ZW06IGZvcm1TdWJtaXRJdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5TdWJtaXQsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbHVlOiBmb3JtU3VibWl0SXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFuZCBtYXJrIGludmFsaWQgdGFic1xuICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuX2Zvcm1seUZpZWxkcztcbiAgICAgICAgICAgIGlmIChmb3JtRmllbGRzWzBdLnR5cGUgPT09ICd0YWJzJyAmJiBmb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhYiBvZiBmb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGVbJ3RhYl8nICsgKHRhYi5pZCA/IHRhYi5pZCA6IHRhYi5rZXkgPz8gJycpICsgJ19pbnZhbGlkJ10gPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKHRhYi5maWVsZEdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBGb3JtRWRpdG9yU3VibWl0RXZlbnQ8SXRlbT4gPSB7c3VjY2VzczogZmFsc2UsIGZvcm1JdGVtOiBmb3JtU3VibWl0SXRlbX07XG4gICAgICAgICAgICBldmVudC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcygpLnB1c2goZ2V0Rm9ybUVkaXRvcldhcm5pbmdNZXNzYWdlKHRoaXMudHJhbnNsYXRlU2VydmljZSwgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0VGl0bGUnLCAnbW5nRWRpdG9yLmludmFsaWRGb3JtVG9hc3RNZXNzYWdlJykpO1xuXG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdChldmVudCk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCB0aGlzIGFzIElGb3JtRWRpdG9yQ29tcG9uZW50PGFueT4sIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3VibWl0VmFsdWU6IGZvcm1TdWJtaXRJdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtVmFsdWUob3B0cz86IHtvbWl0U2V0dGVycz86IGJvb2xlYW59KTogSXRlbSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IG9iamVjdERlZXBDb3B5KHRoaXMuX2Zvcm0uZ2V0UmF3VmFsdWUoKSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KTtcblxuICAgICAgICBpZiAob3B0cz8ub21pdFNldHRlcnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGVyRmllbGRzKCkuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXRoID0gZmllbGQucHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW3NwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgICAgIGZpZWxkLnNldHRlcj8uKGZvcm1WYWx1ZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybU1vZGVsKGl0ZW0/OiBJdGVtLCBvcHRzPzogRm9ybUVkaXRvclJlc2V0Rm9ybU1vZGVsT3B0cykge1xuICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLnJlc2V0TW9kZWw/Lih0aGlzLmdldEZvcm1Nb2RlbEZyb21JdGVtKGl0ZW0pKTtcblxuICAgICAgICBpZiAob3B0cz8ubWFya0FzUHJpc3RpbmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBtYXJrIGZvcm0gYXMgcHJpc3RpbmUsIHNob3VsZCBiZSBkb25lIGluIG5leHQgZXZlbnQgaG9vayB0byBhbGxvdyBmb3JtbHkgdG8gaW5pdGlhbGl6ZSBmaXJzdFxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybS5tYXJrQXNQcmlzdGluZSh7b25seVNlbGY6IG9wdHM/Lm9ubHlTZWxmfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZChrZXk6IGtleW9mIEl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmllbGRVbnNhZmUoa2V5IGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkVW5zYWZlKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGb3JtRmllbGQodGhpcy5fZm9ybSwga2V5LnNwbGl0KCcuJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWVsZFZhbHVlPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgSXRlbT4oa2V5OiBQcm9wZXJ0eSwgdmFsdWU6IEl0ZW1bUHJvcGVydHldLCBvcHRzPzogRm9ybUVkaXRvclNldEZpZWxkVmFsdWVPcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldEZpZWxkVmFsdWVVbnNhZmUoa2V5IGFzIHN0cmluZywgdmFsdWUsIG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWVsZFZhbHVlVW5zYWZlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRzPzogRm9ybUVkaXRvclNldEZpZWxkVmFsdWVPcHRzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZpZWxkVW5zYWZlKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hGaWVsZFZhbHVlPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgSXRlbT4oa2V5OiBQcm9wZXJ0eSwgdmFsdWU6IEl0ZW1bUHJvcGVydHldLCBvcHRzPzogRm9ybUVkaXRvclBhdGNoRmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0Y2hGaWVsZFZhbHVlVW5zYWZlKGtleSBhcyBzdHJpbmcsIHZhbHVlLCBvcHRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hGaWVsZFZhbHVlVW5zYWZlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRzPzogRm9ybUVkaXRvclBhdGNoRmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0RmllbGRVbnNhZmUoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0cyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0RmllbGRWYWx1ZTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEl0ZW0+KGtleTogUHJvcGVydHksIHZhbHVlPzogSXRlbVtQcm9wZXJ0eV0sIG9wdHM/OiBGb3JtRWRpdG9yUmVzZXRGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNldEZpZWxkVmFsdWVVbnNhZmUoa2V5IGFzIHN0cmluZywgdmFsdWUsIG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlPzogYW55LCBvcHRzPzogRm9ybUVkaXRvclJlc2V0RmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0RmllbGRVbnNhZmUoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWUsIG9wdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybU1vZGVsRnJvbUl0ZW0oaXRlbTogSXRlbSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGZvcm1Nb2RlbCA9IChvYmplY3REZWVwQ29weShpdGVtLCB7bWFwR2V0dGVyc1RvUHJvcGVydGllczogdHJ1ZX0pIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pID8/IHt9O1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgZGVzY3JpcHRvci5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQuZ2V0dGVyICYmIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhdGggPSBmaWVsZC5wcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gZm9ybU1vZGVsO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzcGxpdFBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSBmaWVsZC5nZXR0ZXIoaXRlbT8uW2ZpZWxkLnByb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0ID0gY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtTW9kZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRm9ybUZpZWxkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwga2V5UGF0aDogc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSAra2V5UGF0aFswXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5hdChpZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKG5leHRDb250cm9sISwga2V5UGF0aC5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FueUZpZWxkSW52YWxpZChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgbGV0IGZpZWxkSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKGZpZWxkLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGQudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtbHlGaWVsZHNcIiBbb3B0aW9uc109XCJmb3JtbHlPcHRpb25zXCIgW21vZGVsXT1cImZvcm1seUluaXRpYWxJdGVtXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uICNzdWJtaXRCdXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJoaWRkZW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiIFtsb2FkaW5nXT1cInN1Ym1pdExvYWRpbmcoKVwiIGxvYWRpbmdJY29uPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9idXR0b24+XG48L2Zvcm0+XG48cC1tZXNzYWdlcyBbdmFsdWVdPVwiZm9ybU1lc3NhZ2VzKClcIiBbZW5hYmxlU2VydmljZV09XCJmYWxzZVwiPjwvcC1tZXNzYWdlcz5cbiJdfQ==
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBSVYsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RixPQUFPLEVBQWtCLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFlBQVksRUFBcUIsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0UsT0FBTyxFQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1RixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBVSxhQUFhLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN4SixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRixPQUFPLEVBUUgsaUJBQWlCLEVBQ2pCLDhCQUE4QixFQUU5Qix1QkFBdUIsRUFDMUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRyxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQzs7Ozs7Ozs7QUFVNUYsTUFBTSxPQUFPLG1CQUFtQjtJQTBFNUIsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFRDtRQXBHaUIsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsQyxnQkFBVyxHQUFHLHFCQUFxQixDQUFDO1FBQ25DLFdBQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsaUJBQW1DLENBQUEsQ0FBQyxDQUFDO1FBRTFELDBCQUFxQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RELFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakMsK0JBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJLLGVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUE4QixDQUFDO1FBQzFELGtCQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFDNUQsU0FBSSxHQUFHLEtBQUssQ0FBbUIsU0FBUyxDQUFDLENBQUM7UUFDMUMsbUJBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztRQUM3RCxhQUFRLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUNoRCxXQUFNLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztRQUM5Qyx1QkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztRQUV2RSxnQkFBZ0I7UUFDVCxlQUFVLEdBQUcsTUFBTSxFQUErQixDQUFDO1FBQ25ELGdCQUFXLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFDNUIsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQXVCLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBQyxDQUFDLENBQUM7UUFDOUcsbUJBQWMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUV4RiwyQkFBMkI7UUFDcEIsMkJBQXNCLEdBQUcsU0FBUyxDQUF5QixjQUFjLENBQUMsQ0FBQztRQUVsRixtQkFBbUI7UUFDRixVQUFLLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxnQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxtQkFBYyxHQUFtQztZQUM5RCxTQUFTLEVBQUU7Z0JBQ1AsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUMxRjtTQUNKLENBQUM7UUFDTSxrQkFBYSxHQUF3QixFQUFFLENBQUMsQ0FBQyx1REFBdUQ7UUFDaEcsdUJBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUMsdURBQXVEO1FBR2hGLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFckcsaUJBQVksR0FBRyxNQUFNLENBQVksRUFBRSxDQUFDLENBQUM7UUFFNUMsV0FBVztRQUNLLGlDQUE0QixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5RyxpQ0FBNEIsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0csK0JBQTBCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQzthQUM3RyxpQkFBaUIsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7YUFDaEQsY0FBYyxFQUFFO2FBQ2hCLEtBQUssRUFBRSxDQUFDO1FBQ04sb0JBQWUsR0FBRyxNQUFNLENBQTBDLElBQUksQ0FBQyxDQUFDO1FBQ3hFLGFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDaEQsK0JBQTBCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsS0FBSyxTQUFTO29CQUNWLE9BQU8sMkNBQTJDLENBQUM7Z0JBQ3ZELEtBQUssZ0JBQWdCO29CQUNqQixPQUFPLDZDQUE2QyxDQUFDO2dCQUN6RDtvQkFDSSxPQUFPLG9DQUFvQyxDQUFDO1lBQ3BELENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNJLHdCQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzNFLGdDQUEyQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQStCaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsTUFBTSxDQUNGLEdBQUcsRUFBRTtZQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDakMsc0dBQXNHO2dCQUN0RyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDTCxDQUFDO1FBQ0Qsc0NBQXNDO1FBQ3RDLEVBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFDLENBQzVCLENBQUM7UUFFRixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUTtnQkFDbEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUN4SyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDUiw2REFBNkQ7WUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFFBQVE7UUFDWCxrQkFBa0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLEtBQUssdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLEtBQUssdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLEtBQUssdUJBQXVCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU3RCx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVsRyxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLHdDQUF3QztRQUN4QyxJQUNJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXO1lBQzdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLG1CQUFtQixLQUFLLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLEtBQUssdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQ25KLENBQUM7WUFDQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0Qix3QkFBd0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsbURBQW1ELEVBQUUseURBQXlELEVBQUU7b0JBQzVKLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO2lCQUNuRCxDQUFDO2FBQ0wsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLElBQWlDLEVBQUU7WUFDakcsWUFBWSxFQUFFLDhCQUE4QixDQUFDLE9BQU87U0FDdkQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO2FBQ2xCLElBQUksQ0FDRCxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLG9CQUFvQixFQUFFLEVBQ3RCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQ25DLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEM7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFpQyxFQUFFO2dCQUMxRixLQUFLLEVBQUUsQ0FBQztnQkFDUixTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTthQUN2QyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVQLCtGQUErRjtRQUMvRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxXQUFXO1FBQ2QsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBaUMsRUFBRTtZQUNqRyxZQUFZLEVBQUUsOEJBQThCLENBQUMsVUFBVTtTQUMxRCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsNkRBQTZEO0lBQ3RELFFBQVEsQ0FBQyxLQUFZO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsUUFBUSxFQUFFLGNBQWM7YUFDM0IsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBaUMsRUFBRTtnQkFDckYsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLFdBQVcsRUFBRSxjQUFjO2FBQzlCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ0osNkJBQTZCO1lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDdEMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVELEtBQUssTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BJLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQWdDLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDLENBQUM7WUFDdEYsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUNBQWlDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQyxDQUFDO1lBRXJKLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQWlDLEVBQUU7Z0JBQ3JGLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixXQUFXLEVBQUUsY0FBYzthQUM5QixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUE4QjtRQUM5QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFDLHNCQUFzQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFFM0YsSUFBSSxJQUFJLEVBQUUsV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUM1QyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLElBQUksT0FBTyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ2pELFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3BDLENBQUM7b0JBRUQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztnQkFFRCxVQUFVLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFXLEVBQUUsSUFBbUM7UUFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVsRSxJQUFJLElBQUksRUFBRSxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakMsK0ZBQStGO1lBQy9GLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVEsQ0FBQyxHQUFlO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sY0FBYyxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxhQUFhLENBQThCLEdBQWEsRUFBRSxLQUFxQixFQUFFLElBQWtDO1FBQ3RILE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxLQUFVLEVBQUUsSUFBa0M7UUFDbEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBRU0sZUFBZSxDQUE4QixHQUFhLEVBQUUsS0FBcUIsRUFBRSxJQUFvQztRQUMxSCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLElBQW9DO1FBQ3RGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztZQUMzRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBOEIsR0FBYSxFQUFFLEtBQXNCLEVBQUUsSUFBb0M7UUFDM0gsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0scUJBQXFCLENBQUMsR0FBVyxFQUFFLEtBQVcsRUFBRSxJQUFvQztRQUN2RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLGlCQUFpQixDQUFDLENBQUM7WUFDM0UsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxpQkFBaUI7UUFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUMsQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3BELG9EQUFvRDtZQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxFQUFDLENBQUMsQ0FBQztRQUNsRyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQjtRQUNwQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFDLENBQUMsQ0FBQztZQUMvRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUMxQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQXNCO1FBQy9DLE1BQU0sU0FBUyxHQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUMsQ0FBeUIsSUFBSSxFQUFFLENBQUM7UUFFdEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQztnQkFFOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM3QixhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBd0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMvRixDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxPQUFPLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzs0QkFDcEQsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDdkMsQ0FBQzt3QkFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUNsRCxDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQXdCLEVBQUUsT0FBaUI7UUFDN0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBMkIsSUFBSSxDQUFDO1FBQy9DLElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFNBQThCLEVBQUU7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1RCxDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMzQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyw4QkFBOEIsQ0FBQyxJQUFJLEdBQUcsS0FBSztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDWCxDQUFDO1FBRUQsVUFBVSxDQUNOLEdBQUcsRUFBRTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtxQkFDcEQsSUFBSSxDQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUU7Z0JBQ3RCLHlCQUF5QjtnQkFDekIsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDTCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO3dCQUMxRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO2dCQUNoRyxDQUFDLENBQUMsRUFDRixZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEM7cUJBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0wsQ0FBQyxFQUNELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsMEVBQTBFO1NBQzVGLENBQUM7SUFDTixDQUFDO0lBRU8sNkJBQTZCO1FBQ2pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztZQUM3SixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQW1DLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxFQUFDLENBQUMsQ0FBQztRQUNySyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNEJBQTRCO1FBQ2hDLE1BQU0sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFtQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEosQ0FBQztJQUNMLENBQUM7OEdBOWZRLG1CQUFtQjtrR0FBbkIsbUJBQW1CLDRuQ0FIakIsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLGtLQzNEdkMsaS9FQWlEQSwyQ0RTYyxZQUFZLDZLQUFFLG1CQUFtQixvYkFBRSxjQUFjLDJSQUFhLFlBQVksa3JCQUFFLGVBQWUsdUZBQUUsUUFBUSw2Q0FBRSw2QkFBNkI7OzJGQUlySSxtQkFBbUI7a0JBUi9CLFNBQVM7aUNBQ00sSUFBSSxZQUNOLGlCQUFpQixXQUVsQixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixDQUFDLGFBQ3BJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxtQkFDbEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBEYXRlUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbiAgICB2aWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge291dHB1dEZyb21PYnNlcnZhYmxlLCB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge0Zvcm1seUNvbmZpZywgRm9ybWx5RmllbGRDb25maWcsIEZvcm1seU1vZHVsZX0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge01lc3NhZ2V9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7QnV0dG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQge01lc3NhZ2VzTW9kdWxlfSBmcm9tICdwcmltZW5nL21lc3NhZ2VzJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRhcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0NvbW1vbnNTZXJ2aWNlLCBDb21tb25zU3RvcmFnZVNlcnZpY2UsIElkVHlwZSwgTG9nZ2VyU2VydmljZSwgU3R5bGVMZXZlbEVudW0sIFN0eWxlU2l6ZUVudW0sIG9iamVjdERlZXBDb3B5fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtCdXR0b25TdHlsZUJ1aWxkZXIsIEJ1dHRvblN0eWxlUm91bmRlZEVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuaW1wb3J0IHtcbiAgICBDb21tb25zRm9ybWx5Rm9ybU9wdGlvbnMsXG4gICAgRWRpdG9yRGVzY3JpcHRvckluc3QsXG4gICAgRm9ybUVkaXRvclBhdGNoRmllbGRWYWx1ZU9wdHMsXG4gICAgRm9ybUVkaXRvclJlc2V0RmllbGRWYWx1ZU9wdHMsXG4gICAgRm9ybUVkaXRvclJlc2V0Rm9ybU1vZGVsT3B0cyxcbiAgICBGb3JtRWRpdG9yU2V0RmllbGRWYWx1ZU9wdHMsXG4gICAgRm9ybUVkaXRvclN1Ym1pdEV2ZW50LFxuICAgIEZvcm1FdmVudFR5cGVFbnVtLFxuICAgIEZvcm1GaWVsZEV2ZW50Q29tcG9uZW50U3VidHlwZSxcbiAgICBJRm9ybUVkaXRvckNvbXBvbmVudCxcbiAgICBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge2dlbmVyYXRlQXV0b3NhdmVFZGl0b3JLZXl9IGZyb20gJy4uLy4uL2hlbHBlcnMvZWRpdG9yLWF1dG9zYXZlJztcbmltcG9ydCB7Y3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3J9IGZyb20gJy4uLy4uL2hlbHBlcnMvZWRpdG9yLWZvcm1seSc7XG5pbXBvcnQge2dldEZvcm1FZGl0b3JJbmZvTWVzc2FnZSwgZ2V0Rm9ybUVkaXRvcldhcm5pbmdNZXNzYWdlfSBmcm9tICcuLi8uLi9oZWxwZXJzL25vdGlmaWNhdGlvbic7XG5pbXBvcnQge0VkaXRvckF1dG9TYXZlUHJldmlld01vZGVsLCBFZGl0b3JBdXRvU2F2ZVN0YXR1c30gZnJvbSAnLi4vLi4vbW9kZWxzL2VkaXRvci1hdXRvLXNhdmUtcHJldmlldy5tb2RlbCc7XG5pbXBvcnQge0Zvcm1FZGl0b3JTZXJ2aWNlLCBwcm92aWRlRm9ybUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS1lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQge0VkaXRvckF1dG9TYXZlU3RhdHVzQ29tcG9uZW50fSBmcm9tICcuL2F1dG8tc2F2ZS1zdGF0dXMvYXV0by1zYXZlLXN0YXR1cy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWZvcm0tZWRpdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtGb3JtbHlNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1lc3NhZ2VzTW9kdWxlLCBBc3luY1BpcGUsIEJ1dHRvbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBEYXRlUGlwZSwgRWRpdG9yQXV0b1NhdmVTdGF0dXNDb21wb25lbnRdLFxuICAgIHByb3ZpZGVyczogW3Byb3ZpZGVGb3JtQ29tcG9uZW50KCldLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1FZGl0b3JDb21wb25lbnQ8SXRlbSA9IGFueSwgUGFyZW50SXRlbSA9IGFueT4gaW1wbGVtZW50cyBJRm9ybUVkaXRvckNvbXBvbmVudDxJdGVtLCBQYXJlbnRJdGVtPiwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybWx5Q29uZmlnID0gaW5qZWN0KEZvcm1seUNvbmZpZyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9ucyA9IGluamVjdChDb21tb25zU2VydmljZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNtcFR5cGVOYW1lID0gJ0Zvcm1FZGl0b3JDb21wb25lbnQnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpLmNyZWF0ZSh0aGlzLmNtcFR5cGVOYW1lKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtU2VydmljZSA9IGluamVjdChGb3JtRWRpdG9yU2VydmljZTxJdGVtLCBQYXJlbnRJdGVtPik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbnNTdG9yYWdlU2VydmljZSA9IGluamVjdChDb21tb25zU3RvcmFnZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG5cbiAgICBwcml2YXRlIGF1dG9TYXZlU3RvcmFnZUtleUNvbXBJbml0ID0gdHJ1ZTtcbiAgICBwcml2YXRlIGF1dG9TYXZlU3RvcmFnZUtleSA9IGNvbXB1dGVkKCgpID0+IGdlbmVyYXRlQXV0b3NhdmVFZGl0b3JLZXkodGhpcy5kZXNjcmlwdG9yKCksIHRoaXMuaXRlbSgpLCB0aGlzLnJvdXRlci51cmwsIHtlZGl0b3JJZDogdGhpcy5lZGl0b3JJZCgpLCBpdGVtSWQ6IHRoaXMuaXRlbUlkKCl9KSk7XG5cbiAgICBwdWJsaWMgZGVzY3JpcHRvciA9IGlucHV0LnJlcXVpcmVkPEVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+PigpO1xuICAgIHB1YmxpYyBzdWJtaXRMb2FkaW5nID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgaXRlbSA9IG1vZGVsPEl0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHVibGljIGlzRm9ybURpc2FibGVkID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgZWRpdG9ySWQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHVibGljIGl0ZW1JZCA9IGlucHV0PElkVHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICBwdWJsaWMgc2hvd0F1dG9TYXZlU3RhdHVzID0gaW5wdXQodHJ1ZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIHB1YmxpYyBmb3JtU3VibWl0ID0gb3V0cHV0PEZvcm1FZGl0b3JTdWJtaXRFdmVudDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBvdXRwdXQ8SXRlbT4oKTtcbiAgICBwcml2YXRlIGF1dG9TYXZlU3RhdHVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RWRpdG9yQXV0b1NhdmVTdGF0dXM+KHtzdGF0ZTogJ2luaXRpYWwnLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KTtcbiAgICBwdWJsaWMgYXV0b1NhdmVTdGF0dXMgPSBvdXRwdXRGcm9tT2JzZXJ2YWJsZSh0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5hc09ic2VydmFibGUoKSk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBwdWJsaWMgc3VibWl0QnV0dG9uRWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmIHwgdW5kZWZpbmVkPignc3VibWl0QnV0dG9uJyk7XG5cbiAgICAvLyBmb3JtbHkgc3BlY2lmaWNzXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtbHlTdGF0ZURpc2FibGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1seU9wdGlvbnM6IENvbW1vbnNGb3JtbHlGb3JtT3B0aW9uczxJdGVtPiA9IHtcbiAgICAgICAgZm9ybVN0YXRlOiB7XG4gICAgICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICAgICAgZWRpdDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZCQ6IHRoaXMuX2Zvcm1seVN0YXRlRGlzYWJsZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgfVxuICAgIH07XG4gICAgcHJpdmF0ZSBfZm9ybWx5RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107IC8vIGluaXRpYWxpemVkIGluIG5nT25Jbml0LCBzaG91bGQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJcbiAgICBwcml2YXRlIF9mb3JtbHlJbml0aWFsSXRlbSA9IHt9OyAvLyBpbml0aWFsaXplZCBpbiBuZ09uSW5pdCwgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGFmdGVyXG4gICAgcHJpdmF0ZSBpbml0aWFsSXRlbUlucHV0OiBJdGVtIHwgdW5kZWZpbmVkO1xuXG4gICAgcHJpdmF0ZSBzZXR0ZXJGaWVsZHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlc2NyaXB0b3IoKS5maWVsZHMuZmlsdGVyKGYgPT4gdHlwZW9mIGYuc2V0dGVyID09PSAnZnVuY3Rpb24nKSk7XG5cbiAgICBwdWJsaWMgZm9ybU1lc3NhZ2VzID0gc2lnbmFsPE1lc3NhZ2VbXT4oW10pO1xuXG4gICAgLy8gYXV0b3NhdmVcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVzdG9yZUxvY2FsU3RhdGVCdXR0b25TdHlsZSA9IEJ1dHRvblN0eWxlQnVpbGRlci5jcmVhdGUoU3R5bGVMZXZlbEVudW0uU3VjY2VzcywgU3R5bGVTaXplRW51bS5TbWFsbCkuYnVpbGQoKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJldmlld0xvY2FsU3RhdGVCdXR0b25TdHlsZSA9IEJ1dHRvblN0eWxlQnVpbGRlci5jcmVhdGUoU3R5bGVMZXZlbEVudW0uSW5mbywgU3R5bGVTaXplRW51bS5TbWFsbCkuYnVpbGQoKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xlYXJMb2NhbFN0YXRlQnV0dG9uU3R5bGUgPSBCdXR0b25TdHlsZUJ1aWxkZXIuY3JlYXRlKFN0eWxlTGV2ZWxFbnVtLkRhbmdlciwgU3R5bGVTaXplRW51bS5TbWFsbClcbiAgICAgICAgLndpdGhSb3VuZGVkQnV0dG9uKEJ1dHRvblN0eWxlUm91bmRlZEVudW0uU1FVQVJFKVxuICAgICAgICAud2l0aFRleHRCdXR0b24oKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBwdWJsaWMgYXV0b1NhdmVSZXN0b3JlID0gc2lnbmFsPEVkaXRvckF1dG9TYXZlUHJldmlld01vZGVsPEl0ZW0+IHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIGF1dG9TYXZlID0gdG9TaWduYWwodGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QpO1xuICAgIHB1YmxpYyBhdXRvU2F2ZVByZXZpZXdCdXR0b25MYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmF1dG9TYXZlKCk/LnN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdwcmV2aWV3JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21uZ0VkaXRvci5hdXRvU2F2ZS5yZXN0b3JlLnByZXZpZXdDdXJyZW50JztcbiAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXdDdXJyZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21uZ0VkaXRvci5hdXRvU2F2ZS5yZXN0b3JlLnByZXZpZXdBdXRvc2F2ZWQnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21uZ0VkaXRvci5hdXRvU2F2ZS5yZXN0b3JlLnByZXZpZXcnO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcHVibGljIGF1dG9TYXZlU2hvd1Jlc3RvcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmF1dG9TYXZlUmVzdG9yZSgpPy5zYXZlZCAhPSBudWxsKTtcbiAgICBwcml2YXRlIGF1dG9TYXZlUHJldmlld0Rpc2FibGVkRm9ybSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSBhdXRvU2F2ZUV2ZW50c1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLnBhcmVudDtcbiAgICB9XG5cbiAgICBnZXQgZm9ybSgpOiBGb3JtR3JvdXA8e1tLIGluIGtleW9mIEl0ZW1dOiBBYnN0cmFjdENvbnRyb2w8SXRlbVtLXT59PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtO1xuICAgIH1cblxuICAgIGdldCBmb3JtVW5zYWZlKCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybWx5T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seU9wdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1seUZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seUZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IHVzZWQgZm9yIGZvcm0gaW5pdGlhbGl6YXRpb24uIEZ1cnRoZXIgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSB1c2luZyB7cmVzZXRGb3JtTW9kZWx9LlxuICAgICAqL1xuICAgIGdldCBmb3JtbHlJbml0aWFsSXRlbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seUluaXRpYWxJdGVtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmluaXQodGhpcyk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPT0gdGhpcy5pbml0aWFsSXRlbUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBpdGVtIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgdGhlIGZvcm0gd2FzIGluaXRpYWxpemVkIHdpdGguIE11c3QgdHJpZ2dlciByZXNldCBvZiBmb3JtIG1vZGVsLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyByZXNldE1vZGVsIHVzZXMgc2lnbmFsIGxpa2UgY29uY2VwdFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Zvcm1EaXNhYmxlZCgpIHx8IHRoaXMuYXV0b1NhdmVQcmV2aWV3RGlzYWJsZWRGb3JtKCkgfHwgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGVzY3JpcHRvcj8uZGlzYWJsZWQgPT09IHRydWUgfHwgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGV0YWlscztcbiAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybWx5U3RhdGVEaXNhYmxlZFN1YmplY3QubmV4dCh0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5KCk7XG4gICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdG9wVmFsdWVDaGFuZ2VMaXN0ZW4oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TYXZlTG9hZFNhdmVkRnJvbVN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RhcnRFdmVudENoYW5nZUxpc3Rlbih0aGlzLmF1dG9TYXZlU3RvcmFnZUtleUNvbXBJbml0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RvcmFnZUtleUNvbXBJbml0ID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBpbml0IGZvcm0gc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcigpLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuYWRkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5lZGl0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kZXRhaWxzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgLy8gaW5pdCBmaWVsZHMgZm9yIGZvcm1seVxuICAgICAgICB0aGlzLl9mb3JtbHlGaWVsZHMgPSBjcmVhdGVGb3JtbHlDb25maWdGcm9tRGVzY3JpcHRvcih0aGlzLmRlc2NyaXB0b3IoKSwgdGhpcy5mb3JtbHlDb25maWcsIHRoaXMpO1xuXG4gICAgICAgIC8vIGludCBmb3JtIG1vZGVsIChvbmx5IGluaXRpYWwsIG5vIGZ1cnRoZXIgY2hhbmdlcyB0byBmb3JtTW9kZWwgc2hvdWxkIGJlIGFsbG93ZWQhKVxuICAgICAgICB0aGlzLmluaXRpYWxJdGVtSW5wdXQgPSB0aGlzLml0ZW0oKTtcbiAgICAgICAgdGhpcy5fZm9ybWx5SW5pdGlhbEl0ZW0gPSB0aGlzLmdldEZvcm1Nb2RlbEZyb21JdGVtKHRoaXMuaXRlbSgpKTtcblxuICAgICAgICAvLyBoYW5kbGUgbG9jYWxpemF0aW9ucyBlZGl0L2FkZCBtZXNzYWdlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLmlzTG9jYWxpemVkICYmXG4gICAgICAgICAgICAodGhpcy5kZXNjcmlwdG9yKCkudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkIHx8IHRoaXMuZGVzY3JpcHRvcigpLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkVkaXQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMuc2V0KFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZvcm1NZXNzYWdlcygpLFxuICAgICAgICAgICAgICAgIGdldEZvcm1FZGl0b3JJbmZvTWVzc2FnZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UsICdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5hZGRJbkRlZmF1bHRMYW5ndWFnZVRpdGxlJywgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlRGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5jb21tb25zLmdldERlZmF1bHRMb2NhbGUoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5Db21wb25lbnRMaWZlY3ljbGUsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fSU5JVFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZm9ybS5nZXRSYXdWYWx1ZSgpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlPy5lbWl0KHYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5WYWx1ZUNoYW5nZSwgdGhpcyBhcyBJRm9ybUVkaXRvckNvbXBvbmVudDxhbnk+LCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWU6ICgpID0+IHRoaXMuZ2V0Rm9ybVZhbHVlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG1hcmsgZm9ybSBhcyBwcmlzdGluZSwgc2hvdWxkIGJlIGRvbmUgaW4gbmV4dCBldmVudCBob29rIHRvIGFsbG93IGZvcm1seSB0byBpbml0aWFsaXplIGZpcnN0XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5Db21wb25lbnRMaWZlY3ljbGUsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fREVTVFJPWVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgb25TdWJtaXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlLnN1Ym1pdHRlZE9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMuc2V0KFtdKTtcblxuICAgICAgICBjb25zdCBmb3JtU3VibWl0SXRlbSA9IHRoaXMuZ2V0Rm9ybVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdCh7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBmb3JtSXRlbTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yKCkubmV4dEV2ZW50KEZvcm1FdmVudFR5cGVFbnVtLlN1Ym1pdCwgdGhpcyBhcyBJRm9ybUVkaXRvckNvbXBvbmVudDxhbnk+LCB7XG4gICAgICAgICAgICAgICAgc3VibWl0VmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc3VibWl0VmFsdWU6IGZvcm1TdWJtaXRJdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMub25BdXRvU2F2ZURpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZpbmQgYW5kIG1hcmsgaW52YWxpZCB0YWJzXG4gICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5fZm9ybWx5RmllbGRzO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZHNbMF0udHlwZSA9PT0gJ3RhYnMnICYmIGZvcm1GaWVsZHNbMF0uZmllbGRHcm91cCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFiIG9mIGZvcm1GaWVsZHNbMF0uZmllbGRHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZVsndGFiXycgKyAodGFiLmlkID8gdGFiLmlkIDogdGFiLmtleSA/PyAnJykgKyAnX2ludmFsaWQnXSA9IHRoaXMuaXNBbnlGaWVsZEludmFsaWQodGFiLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IEZvcm1FZGl0b3JTdWJtaXRFdmVudDxJdGVtPiA9IHtzdWNjZXNzOiBmYWxzZSwgZm9ybUl0ZW06IGZvcm1TdWJtaXRJdGVtfTtcbiAgICAgICAgICAgIGV2ZW50LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzKCkucHVzaChnZXRGb3JtRWRpdG9yV2FybmluZ01lc3NhZ2UodGhpcy50cmFuc2xhdGVTZXJ2aWNlLCAnbW5nRWRpdG9yLmludmFsaWRGb3JtVG9hc3RUaXRsZScsICdtbmdFZGl0b3IuaW52YWxpZEZvcm1Ub2FzdE1lc3NhZ2UnKSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5TdWJtaXQsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgICAgIHN1Ym1pdFZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWx1ZTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1WYWx1ZShvcHRzPzoge29taXRTZXR0ZXJzPzogYm9vbGVhbn0pOiBJdGVtIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gb2JqZWN0RGVlcENvcHkodGhpcy5fZm9ybS5nZXRSYXdWYWx1ZSgpLCB7bWFwR2V0dGVyc1RvUHJvcGVydGllczogdHJ1ZX0pO1xuXG4gICAgICAgIGlmIChvcHRzPy5vbWl0U2V0dGVycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXR0ZXJGaWVsZHMoKS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhdGggPSBmaWVsZC5wcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBmaWVsZFZhbHVlID0gZm9ybVZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ViUGF0aCA9IHNwbGl0UGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWVbc3BsaXRQYXRoW3NwbGl0UGF0aC5sZW5ndGggLSAxXV07XG4gICAgICAgICAgICAgICAgZmllbGQuc2V0dGVyPy4oZm9ybVZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGb3JtTW9kZWwoaXRlbT86IEl0ZW0sIG9wdHM/OiBGb3JtRWRpdG9yUmVzZXRGb3JtTW9kZWxPcHRzKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMucmVzZXRNb2RlbD8uKHRoaXMuZ2V0Rm9ybU1vZGVsRnJvbUl0ZW0oaXRlbSkpO1xuXG4gICAgICAgIGlmIChvcHRzPy5tYXJrQXNQcmlzdGluZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgZm9ybSBhcyBwcmlzdGluZSwgc2hvdWxkIGJlIGRvbmUgaW4gbmV4dCBldmVudCBob29rIHRvIGFsbG93IGZvcm1seSB0byBpbml0aWFsaXplIGZpcnN0XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtLm1hcmtBc1ByaXN0aW5lKHtvbmx5U2VsZjogb3B0cz8ub25seVNlbGZ9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKGtleToga2V5b2YgSXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmllbGRVbnNhZmUoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZCh0aGlzLl9mb3JtLCBrZXkuc3BsaXQoJy4nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpZWxkVmFsdWU8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBJdGVtPihrZXk6IFByb3BlcnR5LCB2YWx1ZTogSXRlbVtQcm9wZXJ0eV0sIG9wdHM/OiBGb3JtRWRpdG9yU2V0RmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RmllbGRWYWx1ZVVuc2FmZShrZXkgYXMgc3RyaW5nLCB2YWx1ZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yU2V0RmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0RmllbGRVbnNhZmUoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIG9wdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZpZWxkVmFsdWU8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBJdGVtPihrZXk6IFByb3BlcnR5LCB2YWx1ZTogSXRlbVtQcm9wZXJ0eV0sIG9wdHM/OiBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5IGFzIHN0cmluZywgdmFsdWUsIG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGaWVsZFZhbHVlPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgSXRlbT4oa2V5OiBQcm9wZXJ0eSwgdmFsdWU/OiBJdGVtW1Byb3BlcnR5XSwgb3B0cz86IEZvcm1FZGl0b3JSZXNldEZpZWxkVmFsdWVPcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0RmllbGRWYWx1ZVVuc2FmZShrZXkgYXMgc3RyaW5nLCB2YWx1ZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0RmllbGRWYWx1ZVVuc2FmZShrZXk6IHN0cmluZywgdmFsdWU/OiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yUmVzZXRGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZSwgb3B0cyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgdGhlIHNhdmVkIGxvY2FsIHN0YXRlLlxuICAgICAqIElmIGxvY2FsIHN0b3JhZ2Uga2V5cyBleGlzdCBmb3IgbG9jYWwgc3RhdGUgYW5kIGxvY2FsIHRpbWVzdGFtcCwgcmVzdG9yZSB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25BdXRvU2F2ZVJlc3RvcmUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3RvcmUgPSB0aGlzLmF1dG9TYXZlUmVzdG9yZSgpO1xuICAgICAgICBpZiAocmVzdG9yZT8uc2F2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdG9wVmFsdWVDaGFuZ2VMaXN0ZW4oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwocmVzdG9yZS5zYXZlZCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlUmVzdG9yZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5uZXh0KHtzdGF0ZTogJ3Jlc3RvcmVkJywgdGltZXN0YW1wOiByZXN0b3JlLnNhdmVkQXQgPz8gbmV3IERhdGUoKX0pO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVByZXZpZXdEaXNhYmxlZEZvcm0uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdGFydEV2ZW50Q2hhbmdlTGlzdGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aWV3cyB0aGUgc2F2ZWQgbG9jYWwgc3RhdGUuXG4gICAgICogSWYgbG9jYWwgc3RvcmFnZSBrZXlzIGV4aXN0IGZvciBsb2NhbCBzdGF0ZSBhbmQgbG9jYWwgdGltZXN0YW1wLCByZXN0b3JlIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkF1dG9TYXZlUHJldmlldygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9TYXZlUmVzdG9yZSgpPy5zYXZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRvU2F2ZVN0b3BWYWx1ZUNoYW5nZUxpc3RlbigpO1xuICAgICAgICB0aGlzLmF1dG9TYXZlUHJldmlld0Rpc2FibGVkRm9ybS5zZXQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ3ByZXZpZXcnICYmIHN0YXRlICE9PSAncHJldmlld0N1cnJlbnQnKSB7XG4gICAgICAgICAgICAvLyBtdXN0IHN0b3JlIG9yaWdpbmFsIHZhbHVlIGZyb20gY3VycmVudCB2YWx1ZSBmb3JtXG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlUmVzdG9yZS51cGRhdGUoaSA9PiAoey4uLmksIG9yaWdpbmFsOiB0aGlzLmdldEZvcm1WYWx1ZSgpfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZSA9IHRoaXMuYXV0b1NhdmVSZXN0b3JlKCk7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ3ByZXZpZXcnICYmIHJlc3RvcmU/Lm9yaWdpbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHJlc3RvcmUub3JpZ2luYWwpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdwcmV2aWV3Q3VycmVudCd9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPT0gJ3ByZXZpZXcnICYmIHJlc3RvcmU/LnNhdmVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHJlc3RvcmUuc2F2ZWQpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdwcmV2aWV3JywgdGltZXN0YW1wOiByZXN0b3JlLnNhdmVkQXQgPz8gbmV3IERhdGUoKX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsb2NhbCBzdGF0ZSBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogSWYgbG9jYWwgc3RvcmFnZSBrZXlzIGV4aXN0IGZvciBsb2NhbCBzdGF0ZSBhbmQgbG9jYWwgdGltZXN0YW1wLCByZW1vdmUgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIG9uQXV0b1NhdmVEaXNtaXNzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZVN0b3JhZ2VLZXkoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdG9yZSA9IHRoaXMuYXV0b1NhdmVSZXN0b3JlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgPT09ICdwcmV2aWV3JyAmJiByZXN0b3JlPy5vcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwocmVzdG9yZS5vcmlnaW5hbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdpbml0aWFsJywgdGltZXN0YW1wOiBuZXcgRGF0ZSgpfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuY21wVHlwZU5hbWUsIHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVJlc3RvcmUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVByZXZpZXdEaXNhYmxlZEZvcm0uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdGFydEV2ZW50Q2hhbmdlTGlzdGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm1Nb2RlbEZyb21JdGVtKGl0ZW06IEl0ZW0gfCB1bmRlZmluZWQpOiBhbnkge1xuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSAob2JqZWN0RGVlcENvcHkoaXRlbSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA/PyB7fTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGRlc2NyaXB0b3IuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldHRlciAmJiBpdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXRoID0gZmllbGQucHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE9iamVjdCA9IGZvcm1Nb2RlbDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdWJQYXRoID0gc3BsaXRQYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3BsaXRQYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdID0gZmllbGQuZ2V0dGVyKGl0ZW0/LltmaWVsZC5wcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybU1vZGVsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEZvcm1GaWVsZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGtleVBhdGg6IHN0cmluZ1tdKTogQWJzdHJhY3RDb250cm9sIHwgbnVsbCB7XG4gICAgICAgIGlmIChrZXlQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbC5nZXQoa2V5UGF0aFswXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5nZXQoa2V5UGF0aFswXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gK2tleVBhdGhbMF07XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGlkeCkpIHtcbiAgICAgICAgICAgICAgICBuZXh0Q29udHJvbCA9IGNvbnRyb2wuYXQoaWR4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZChuZXh0Q29udHJvbCEsIGtleVBhdGguc2xpY2UoMSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbnlGaWVsZEludmFsaWQoZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW10pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGxldCBmaWVsZEludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLmZpZWxkR3JvdXApKSB7XG4gICAgICAgICAgICAgICAgZmllbGRJbnZhbGlkID0gdGhpcy5pc0FueUZpZWxkSW52YWxpZChmaWVsZC5maWVsZEdyb3VwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkLnR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZmllbGRJbnZhbGlkID0gIWZpZWxkLmZvcm1Db250cm9sPy52YWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZEludmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdXRvU2F2ZVN0YXJ0RXZlbnRDaGFuZ2VMaXN0ZW4oaW5pdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy5kZXNjcmlwdG9yKCkuYXV0b1NhdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVFdmVudHNTdWJzY3JpcHRpb24gPSB0aGlzLl9mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGZpcnN0IG9uZSBvbiBpbml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1NhdmVTdGF0dXNTdWJqZWN0LnZhbHVlLnN0YXRlICE9PSAnc2F2ZWQnICYmIHRoaXMuYXV0b1NhdmVTdGF0dXNTdWJqZWN0LnZhbHVlLnN0YXRlICE9PSAncHJldmlldycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5uZXh0KHsuLi50aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC52YWx1ZSwgc3RhdGU6ICdzYXZpbmcnfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDc1MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTYXZlVG9TdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdCA/IDAgOiA1MDAgLy8gZGVsYXkgaW5pdGlhbCBldmVudCBsaXN0ZW5pbmcgZm9yIGFsbCB0aGUgaW5pdGlhbGl6YXRpb25zIHRvIHRha2UgcGxhY2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9TYXZlU3RvcFZhbHVlQ2hhbmdlTGlzdGVuKCkge1xuICAgICAgICB0aGlzLmF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIHRoZSBmb3JtIHZhbHVlIHRvIGxvY2FsU3RvcmFnZSBpZiBhdXRvU2F2ZSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWlyZWQga2V5cyBhcmUgZGVmaW5lZC5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGF1dG9TYXZlU2F2ZVRvU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcigpLmF1dG9TYXZlICE9PSB0cnVlIHx8IHRoaXMuYXV0b1NhdmVTdGF0dXNTdWJqZWN0LnZhbHVlLnN0YXRlID09PSAncHJldmlldycgfHwgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgPT09ICdwcmV2aWV3Q3VycmVudCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tbW9uc1N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW08RWRpdG9yQXV0b1NhdmVQcmV2aWV3TW9kZWw8SXRlbT4+KHRoaXMuY21wVHlwZU5hbWUsIHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5KCksIHtzYXZlZDogdGhpcy5nZXRGb3JtVmFsdWUoKSwgc2F2ZWRBdDogbmV3IERhdGUoKX0pO1xuICAgICAgICB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5uZXh0KHtzdGF0ZTogJ3NhdmVkJywgdGltZXN0YW1wOiBuZXcgRGF0ZSgpfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIHZhbHVlIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhdXRvU2F2ZUxvYWRTYXZlZEZyb21TdG9yYWdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7YXV0b1NhdmUsIG1vZGVsfSA9IHRoaXMuZGVzY3JpcHRvcigpO1xuICAgICAgICBpZiAoYXV0b1NhdmUgJiYgbW9kZWwuaTE4bkJhc2VLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVSZXN0b3JlLnNldCh0aGlzLmNvbW1vbnNTdG9yYWdlU2VydmljZS5nZXRJdGVtPEVkaXRvckF1dG9TYXZlUHJldmlld01vZGVsPEl0ZW0+Pih0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmF1dG9TYXZlU3RvcmFnZUtleSgpKSA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpZiAoYXV0b1NhdmVTaG93UmVzdG9yZSgpKSB7XG4gICAgPHAtbWVzc2FnZXMgc2V2ZXJpdHk9XCJ3YXJuXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWdyb3ctMSBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJtLTAgcC0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cInBpIHBpLXNhdmUgbXItNFwiPjwvZW0+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUudGl0bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHtsYXN0Q2hhbmdlOiBhdXRvU2F2ZVJlc3RvcmUoKT8uc2F2ZWRBdCA/IChhdXRvU2F2ZVJlc3RvcmUoKT8uc2F2ZWRBdCEgfCBkYXRlOiAnZGQuIE1NLiBZWVlZIEhIOm1tOnNzJykgOiAnJ31cbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUucmVzdG9yZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwicmVzdG9yZUxvY2FsU3RhdGVCdXR0b25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkF1dG9TYXZlUmVzdG9yZSgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChhdXRvU2F2ZSgpPy5zdGF0ZSAhPT0gJ3ByZXZpZXcnIHx8IGF1dG9TYXZlKCk/LnN0YXRlICE9PSAncHJldmlld0N1cnJlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktZXllXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJhdXRvU2F2ZVByZXZpZXdCdXR0b25MYWJlbCgpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJwcmV2aWV3TG9jYWxTdGF0ZUJ1dHRvblN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BdXRvU2F2ZVByZXZpZXcoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUuZGlzbWlzcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY2xlYXJMb2NhbFN0YXRlQnV0dG9uU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXV0b1NhdmVEaXNtaXNzKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLW1lc3NhZ2VzPlxufVxuXG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtbHlGaWVsZHNcIiBbb3B0aW9uc109XCJmb3JtbHlPcHRpb25zXCIgW21vZGVsXT1cImZvcm1seUluaXRpYWxJdGVtXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uICNzdWJtaXRCdXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJoaWRkZW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiIFtsb2FkaW5nXT1cInN1Ym1pdExvYWRpbmcoKVwiIGxvYWRpbmdJY29uPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9idXR0b24+XG48L2Zvcm0+XG48cC1tZXNzYWdlcyBbdmFsdWVdPVwiZm9ybU1lc3NhZ2VzKClcIiBbZW5hYmxlU2VydmljZV09XCJmYWxzZVwiPjwvcC1tZXNzYWdlcz5cblxuQGlmIChkZXNjcmlwdG9yKCkuYXV0b1NhdmUgJiYgc2hvd0F1dG9TYXZlU3RhdHVzKCkpIHtcbiAgICA8bW5nLWVkaXRvci1hdXRvLXNhdmUtc3RhdHVzIFtzdGF0dXNdPVwiYXV0b1NhdmUoKVwiPjwvbW5nLWVkaXRvci1hdXRvLXNhdmUtc3RhdHVzPlxufVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { TableviewEditorTypeEnum } from '@mediusinc/mng-commons/tableview/api';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a unique key for autosave data of an editor.
|
|
4
|
+
*
|
|
5
|
+
* @param {EditorDescriptorInst<Item>} descriptor - The editor descriptor instance.
|
|
6
|
+
* @param {Item | undefined} item - The item associated with the editor.
|
|
7
|
+
* @param {string} url - The URL of the editor.
|
|
8
|
+
* @param {Object} [opts] - An optional object containing additional options.
|
|
9
|
+
* @param {string} [opts.editorId] - The custom editor ID.
|
|
10
|
+
* @param {IdType} [opts.itemId] - The custom item ID.
|
|
11
|
+
* @return {string} - The generated autosave editor key.
|
|
12
|
+
*/
|
|
13
|
+
export function generateAutosaveEditorKey(descriptor, item, url, opts) {
|
|
14
|
+
const autoSaveIdentifier = descriptor.autoSaveIdentifier ?? url;
|
|
15
|
+
const editorId = generateEditorId(descriptor, opts?.editorId);
|
|
16
|
+
const itemId = generateItemId(descriptor, item, opts?.itemId);
|
|
17
|
+
return `autoSave~~${editorId}${itemId}~~${autoSaveIdentifier}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generates an ID for the editor based on the provided parameters.
|
|
21
|
+
*
|
|
22
|
+
* @template Item - The type of the item.
|
|
23
|
+
* @param {EditorDescriptorInst<Item>} descriptor - The editor descriptor instance.
|
|
24
|
+
* @param {string} [editorId] - The optional editor ID.
|
|
25
|
+
* @returns {string} - The generated editor ID.
|
|
26
|
+
*/
|
|
27
|
+
function generateEditorId({ model, tableviewEditorType }, editorId) {
|
|
28
|
+
if (editorId !== undefined) {
|
|
29
|
+
return editorId;
|
|
30
|
+
}
|
|
31
|
+
const editorTypeString = TableviewEditorTypeEnum[tableviewEditorType ?? TableviewEditorTypeEnum.None];
|
|
32
|
+
return `${model.i18nBaseKey}::${editorTypeString}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generates an item ID.
|
|
36
|
+
*
|
|
37
|
+
* @param {EditorDescriptorInst<Item>} model - The model descriptor.
|
|
38
|
+
* @param {Item} [item] - The item to generate an ID for.
|
|
39
|
+
* @param {IdType} [itemId] - The existing item ID (if any).
|
|
40
|
+
* @returns {string} - The generated item ID, prefixed with "::" or an empty string if no item ID exists.
|
|
41
|
+
*/
|
|
42
|
+
function generateItemId({ model }, item, itemId) {
|
|
43
|
+
if (itemId === undefined && item) {
|
|
44
|
+
const idProperty = model?.idProperty;
|
|
45
|
+
itemId = item?.[idProperty]?.toString();
|
|
46
|
+
}
|
|
47
|
+
return itemId ? `::${itemId}` : '';
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLWF1dG9zYXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvaGVscGVycy9lZGl0b3ItYXV0b3NhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1Qix1QkFBdUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBRW5HOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQU8sVUFBc0MsRUFBRSxJQUFzQixFQUFFLEdBQVcsRUFBRSxJQUEyQztJQUNwSyxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLENBQUM7SUFDaEUsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsT0FBTyxhQUFhLFFBQVEsR0FBRyxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCLENBQU8sRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQTZCLEVBQUUsUUFBaUI7SUFDdkcsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUNELE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUMsbUJBQW1CLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEcsT0FBTyxHQUFHLEtBQUssQ0FBQyxXQUFXLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFPLEVBQUMsS0FBSyxFQUE2QixFQUFFLElBQVcsRUFBRSxNQUFlO0lBQzNGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsVUFBVSxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxVQUErQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SWRUeXBlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9ySW5zdCwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIGtleSBmb3IgYXV0b3NhdmUgZGF0YSBvZiBhbiBlZGl0b3IuXG4gKlxuICogQHBhcmFtIHtFZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtPn0gZGVzY3JpcHRvciAtIFRoZSBlZGl0b3IgZGVzY3JpcHRvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7SXRlbSB8IHVuZGVmaW5lZH0gaXRlbSAtIFRoZSBpdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWRpdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgb2YgdGhlIGVkaXRvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0c10gLSBBbiBvcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZWRpdG9ySWRdIC0gVGhlIGN1c3RvbSBlZGl0b3IgSUQuXG4gKiBAcGFyYW0ge0lkVHlwZX0gW29wdHMuaXRlbUlkXSAtIFRoZSBjdXN0b20gaXRlbSBJRC5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBUaGUgZ2VuZXJhdGVkIGF1dG9zYXZlIGVkaXRvciBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUF1dG9zYXZlRWRpdG9yS2V5PEl0ZW0+KGRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+LCBpdGVtOiBJdGVtIHwgdW5kZWZpbmVkLCB1cmw6IHN0cmluZywgb3B0cz86IHtlZGl0b3JJZD86IHN0cmluZzsgaXRlbUlkPzogSWRUeXBlfSk6IHN0cmluZyB7XG4gICAgY29uc3QgYXV0b1NhdmVJZGVudGlmaWVyID0gZGVzY3JpcHRvci5hdXRvU2F2ZUlkZW50aWZpZXIgPz8gdXJsO1xuICAgIGNvbnN0IGVkaXRvcklkID0gZ2VuZXJhdGVFZGl0b3JJZChkZXNjcmlwdG9yLCBvcHRzPy5lZGl0b3JJZCk7XG4gICAgY29uc3QgaXRlbUlkID0gZ2VuZXJhdGVJdGVtSWQoZGVzY3JpcHRvciwgaXRlbSwgb3B0cz8uaXRlbUlkKTtcbiAgICByZXR1cm4gYGF1dG9TYXZlfn4ke2VkaXRvcklkfSR7aXRlbUlkfX5+JHthdXRvU2F2ZUlkZW50aWZpZXJ9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gSUQgZm9yIHRoZSBlZGl0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHRlbXBsYXRlIEl0ZW0gLSBUaGUgdHlwZSBvZiB0aGUgaXRlbS5cbiAqIEBwYXJhbSB7RWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbT59IGRlc2NyaXB0b3IgLSBUaGUgZWRpdG9yIGRlc2NyaXB0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2VkaXRvcklkXSAtIFRoZSBvcHRpb25hbCBlZGl0b3IgSUQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBnZW5lcmF0ZWQgZWRpdG9yIElELlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcklkPEl0ZW0+KHttb2RlbCwgdGFibGV2aWV3RWRpdG9yVHlwZX06IEVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+LCBlZGl0b3JJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGVkaXRvcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRvcklkO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3JUeXBlU3RyaW5nID0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW1bdGFibGV2aWV3RWRpdG9yVHlwZSA/PyBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5Ob25lXTtcbiAgICByZXR1cm4gYCR7bW9kZWwuaTE4bkJhc2VLZXl9Ojoke2VkaXRvclR5cGVTdHJpbmd9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gaXRlbSBJRC5cbiAqXG4gKiBAcGFyYW0ge0VkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+fSBtb2RlbCAtIFRoZSBtb2RlbCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIHtJdGVtfSBbaXRlbV0gLSBUaGUgaXRlbSB0byBnZW5lcmF0ZSBhbiBJRCBmb3IuXG4gKiBAcGFyYW0ge0lkVHlwZX0gW2l0ZW1JZF0gLSBUaGUgZXhpc3RpbmcgaXRlbSBJRCAoaWYgYW55KS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGdlbmVyYXRlZCBpdGVtIElELCBwcmVmaXhlZCB3aXRoIFwiOjpcIiBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gaXRlbSBJRCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSXRlbUlkPEl0ZW0+KHttb2RlbH06IEVkaXRvckRlc2NyaXB0b3JJbnN0PEl0ZW0+LCBpdGVtPzogSXRlbSwgaXRlbUlkPzogSWRUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQgJiYgaXRlbSkge1xuICAgICAgICBjb25zdCBpZFByb3BlcnR5ID0gbW9kZWw/LmlkUHJvcGVydHk7XG4gICAgICAgIGl0ZW1JZCA9IGl0ZW0/LltpZFByb3BlcnR5IGFzIGtleW9mIHR5cGVvZiBpdGVtXT8udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1JZCA/IGA6OiR7aXRlbUlkfWAgOiAnJztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLWF1dG8tc2F2ZS1wcmV2aWV3Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvbW9kZWxzL2VkaXRvci1hdXRvLXNhdmUtcHJldmlldy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBFZGl0b3JBdXRvU2F2ZVByZXZpZXdNb2RlbDxJdGVtPiB7XG4gICAgc2F2ZWQ/OiBJdGVtO1xuICAgIG9yaWdpbmFsPzogSXRlbTtcbiAgICBzYXZlZEF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgRWRpdG9yQXV0b1NhdmVTdGF0ZXMgPSAnaW5pdGlhbCcgfCAnc2F2ZWQnIHwgJ3NhdmluZycgfCAncHJldmlldycgfCAncHJldmlld0N1cnJlbnQnIHwgJ3Jlc3RvcmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JBdXRvU2F2ZVN0YXR1cyB7XG4gICAgc3RhdGU6IEVkaXRvckF1dG9TYXZlU3RhdGVzO1xuICAgIHRpbWVzdGFtcD86IERhdGU7XG59XG4iXX0=
|
|
@@ -93,4 +93,4 @@ export function provideFormComponent() {
|
|
|
93
93
|
deps: [Injector]
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RhYmxldmlldy9zcmMvZWRpdG9yL3NlcnZpY2VzL2Zvcm0tZWRpdG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQWtFLE1BQU0sZUFBZSxDQUFDO0FBTXBILE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDOztBQUlqRSxNQUFNLE9BQU8saUJBQWlCO0lBSTFCLElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBVyxJQUFJO1FBR1gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsYUFB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c0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3RvciwgSW5wdXRTaWduYWwsIElucHV0U2lnbmFsV2l0aFRyYW5zZm9ybSwgUHJvdmlkZXIsIFdyaXRhYmxlU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAsIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybU9wdGlvbnN9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5cbmltcG9ydCB7Q29tbW9uc0ludGVybmFsRXJyb3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0NvbW1vbnNGb3JtbHlGb3JtT3B0aW9ucywgRWRpdG9yRGVzY3JpcHRvckluc3QsIEZvcm1FZGl0b3JHZXRGb3JtVmFsdWVPcHRzLCBGb3JtRWRpdG9yUmVzZXRGb3JtTW9kZWxPcHRzLCBJRm9ybUVkaXRvckNvbXBvbmVudH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZXZpZXcvYXBpJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1FZGl0b3JTZXJ2aWNlPEl0ZW0sIFBhcmVudEl0ZW0gPSBhbnk+IGltcGxlbWVudHMgSUZvcm1FZGl0b3JDb21wb25lbnQ8SXRlbSwgUGFyZW50SXRlbT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudEZvcm0/OiBGb3JtRWRpdG9yU2VydmljZTxQYXJlbnRJdGVtLCBhbnk+O1xuICAgIHByaXZhdGUgX2Zvcm1Db21wb25lbnQ/OiBJRm9ybUVkaXRvckNvbXBvbmVudDxJdGVtPjtcblxuICAgIHB1YmxpYyBnZXQgcGFyZW50KCk6IElGb3JtRWRpdG9yQ29tcG9uZW50PFBhcmVudEl0ZW0+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudEZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Rm9ybTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZvcm1Db21wb25lbnQoKTogSUZvcm1FZGl0b3JDb21wb25lbnQ8SXRlbT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2Zvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRm9ybSBzZXJ2aWNlIHdhcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlc2NyaXB0b3IoKTogSW5wdXRTaWduYWw8RWRpdG9yRGVzY3JpcHRvckluc3Q8SXRlbT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5kZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNGb3JtRGlzYWJsZWQoKTogSW5wdXRTaWduYWxXaXRoVHJhbnNmb3JtPGJvb2xlYW4sIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5pc0Zvcm1EaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZvcm1NZXNzYWdlcygpOiBXcml0YWJsZVNpZ25hbDxNZXNzYWdlW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtTWVzc2FnZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmb3JtKCk6IEZvcm1Hcm91cDx7XG4gICAgICAgIFtLIGluIGtleW9mIEl0ZW1dOiBBYnN0cmFjdENvbnRyb2w8SXRlbVtLXT47XG4gICAgfT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50LmZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmb3JtVW5zYWZlKCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50LmZvcm1VbnNhZmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmb3JtbHlPcHRpb25zKCk6IEZvcm1seUZvcm1PcHRpb25zICYgQ29tbW9uc0Zvcm1seUZvcm1PcHRpb25zPEl0ZW0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5mb3JtbHlPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZm9ybWx5RmllbGRzKCk6IEZvcm1seUZpZWxkQ29uZmlnW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50LmZvcm1seUZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZvcm1seUluaXRpYWxJdGVtKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db21wb25lbnQuZm9ybWx5SW5pdGlhbEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnN1Ym1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtVmFsdWUob3B0cz86IEZvcm1FZGl0b3JHZXRGb3JtVmFsdWVPcHRzKTogSXRlbSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db21wb25lbnQuZ2V0Rm9ybVZhbHVlKG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm1Nb2RlbChpdGVtPzogSXRlbSwgb3B0cz86IEZvcm1FZGl0b3JSZXNldEZvcm1Nb2RlbE9wdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtQ29tcG9uZW50LnJlc2V0Rm9ybU1vZGVsKGl0ZW0sIG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZChrZXk6IGtleW9mIEl0ZW0pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5nZXRGaWVsZChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZFVuc2FmZShrZXk6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50LmdldEZpZWxkVW5zYWZlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpZWxkVmFsdWU8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBJdGVtPihrZXk6IFByb3BlcnR5LCB2YWx1ZTogSXRlbVtQcm9wZXJ0eV0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5zZXRGaWVsZFZhbHVlKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWVsZFZhbHVlVW5zYWZlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db21wb25lbnQuc2V0RmllbGRWYWx1ZVVuc2FmZShrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2hGaWVsZFZhbHVlPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgSXRlbT4oa2V5OiBQcm9wZXJ0eSwgdmFsdWU6IEl0ZW1bUHJvcGVydHldKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db21wb25lbnQucGF0Y2hGaWVsZFZhbHVlKGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5wYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0RmllbGRWYWx1ZTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEl0ZW0+KGtleTogUHJvcGVydHksIHZhbHVlPzogSXRlbVtQcm9wZXJ0eV0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5yZXNldEZpZWxkVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0RmllbGRWYWx1ZVVuc2FmZShrZXk6IHN0cmluZywgdmFsdWU/OiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudC5yZXNldEZpZWxkVmFsdWVVbnNhZmUoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmVudEZvcm0/OiBGb3JtRWRpdG9yU2VydmljZTxQYXJlbnRJdGVtPikge1xuICAgICAgICB0aGlzLl9wYXJlbnRGb3JtID0gcGFyZW50Rm9ybTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdChmb3JtQ29tcG9uZW50OiBJRm9ybUVkaXRvckNvbXBvbmVudDxJdGVtPikge1xuICAgICAgICB0aGlzLl9mb3JtQ29tcG9uZW50ID0gZm9ybUNvbXBvbmVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRm9ybUNvbXBvbmVudCgpOiBQcm92aWRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdmlkZTogRm9ybUVkaXRvclNlcnZpY2UsXG4gICAgICAgIHVzZUZhY3Rvcnk6IChpbmplY3RvcjogSW5qZWN0b3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGluamVjdG9yLmdldChGb3JtRWRpdG9yU2VydmljZSwgbnVsbCwge29wdGlvbmFsOiB0cnVlLCBza2lwU2VsZjogdHJ1ZX0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtRWRpdG9yU2VydmljZTxhbnk+KHBhcmVudCA/PyB1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgICBkZXBzOiBbSW5qZWN0b3JdXG4gICAgfTtcbn1cbiJdfQ==
|