nuxeo-development-framework 2.0.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/nuxeo-development-framework.umd.js +8335 -455
- package/bundles/nuxeo-development-framework.umd.js.map +1 -1
- package/esm2015/lib/components/activities-log/activities-log/activities-log.component.js +84 -0
- package/esm2015/lib/components/activities-log/activities-log/activities-log.service.js +35 -0
- package/esm2015/lib/components/activities-log/activities-log.module.js +30 -0
- package/esm2015/lib/components/attachment-item/attachment-item/attachment-item.component.js +54 -0
- package/esm2015/lib/components/attachment-item/attachment-item.module.js +44 -0
- package/esm2015/lib/components/attachment-modal/attachment-modal.module.js +40 -0
- package/esm2015/lib/components/attachment-modal/attachments/attachments.component.js +157 -0
- package/esm2015/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.js +30 -0
- package/esm2015/lib/components/confirmation-dialog/confirmation-dialog.module.js +30 -0
- package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.js +44 -0
- package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/icon.service.js +140 -0
- package/esm2015/lib/components/display-suitable-icon/display-suitable-icon.module.js +24 -0
- package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.js +177 -0
- package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.js +43 -0
- package/esm2015/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.js +39 -0
- package/esm2015/lib/components/dynamic-tabs/dynamic-tabs.module.js +34 -0
- package/esm2015/lib/components/file-manger/components/add-to-collection/add-to-collection.component.js +132 -0
- package/esm2015/lib/components/file-manger/components/copy/copy.component.js +119 -0
- package/esm2015/lib/components/file-manger/components/create-directory/create-directory.component.js +91 -0
- package/esm2015/lib/components/file-manger/components/create-modal/create-modal.component.js +455 -0
- package/esm2015/lib/components/file-manger/components/creation-type/creation-type.component.js +26 -0
- package/esm2015/lib/components/file-manger/components/delete/delete.component.js +77 -0
- package/esm2015/lib/components/file-manger/components/folder-modal/folder-modal.component.js +114 -0
- package/esm2015/lib/components/file-manger/components/loan-request/loan-request.component.js +80 -0
- package/esm2015/lib/components/file-manger/components/move/move.component.js +108 -0
- package/esm2015/lib/components/file-manger/components/publish-dialog/publish-dialog.component.js +111 -0
- package/esm2015/lib/components/file-manger/components/rename/rename.component.js +86 -0
- package/esm2015/lib/components/file-manger/components/scan-modal/scan-modal.component.js +313 -0
- package/esm2015/lib/components/file-manger/components/share-dialog/share-dialog.component.js +294 -0
- package/esm2015/lib/components/file-manger/components/sidepanel/sidepanel.component.js +256 -0
- package/esm2015/lib/components/file-manger/components/template-modal/template-modal.component.js +64 -0
- package/esm2015/lib/components/file-manger/components/transfer-doc/transfer-doc.component.js +71 -0
- package/esm2015/lib/components/file-manger/components/update-modal/update-modal.component.js +358 -0
- package/esm2015/lib/components/file-manger/file-manager.abstract.js +1004 -0
- package/esm2015/lib/components/file-manger/file-manger.module.js +275 -0
- package/esm2015/lib/components/hijri-gregorian-datepicker/hijri-gregorian-datepicker/hijri-datepicker/hijri-datepicker.component.js +8 -2
- package/esm2015/lib/components/hijri-gregorian-datepicker/utils/IslamicI18n.js +2 -2
- package/esm2015/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.js +51 -0
- package/esm2015/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.js +30 -0
- package/esm2015/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.js +177 -0
- package/esm2015/lib/components/permissions/permission.service.js +118 -0
- package/esm2015/lib/components/permissions/permissions/permissions.component.js +232 -0
- package/esm2015/lib/components/permissions/permissions-template/permissions-template.component.js +117 -0
- package/esm2015/lib/components/permissions/permissions.module.js +71 -0
- package/esm2015/lib/components/select-users-by-department/select-users-by-department.module.js +47 -0
- package/esm2015/lib/components/select-users-by-department/select-users-by-departments/department-management.service.js +27 -0
- package/esm2015/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.js +116 -0
- package/esm2015/lib/components/user/user/user.component.js +29 -0
- package/esm2015/lib/components/user/user.module.js +30 -0
- package/esm2015/lib/directive/directive.module.js +9 -4
- package/esm2015/lib/directive/drag-and-drop/drag-and-drop.directive.js +46 -0
- package/esm2015/lib/shared/libraryShared.module.js +1 -4
- package/esm2015/lib/shared-services/dialog-mangment.service.js +61 -0
- package/esm2015/lib/shared-services/dynamic-form.service.js +241 -0
- package/esm2015/lib/shared-services/file-manager.adapter.js +74 -0
- package/esm2015/lib/shared-services/file-manager.service.js +741 -0
- package/esm2015/lib/shared-services/global-pdftron.service.js +46 -0
- package/esm2015/lib/shared-services/mainfolder.service.js +157 -0
- package/esm2015/lib/shared-services/publishing-document.service.js +202 -0
- package/esm2015/lib/shared-services/recently-viewed.service.js +57 -0
- package/esm2015/lib/shared-services/shared-docs.service.js +135 -0
- package/esm2015/lib/shared-services/shared-services.module.js +20 -0
- package/esm2015/lib/shared-services/upload-file.service.js +29 -0
- package/esm2015/lib/shared-services/upload-managment.service.js +151 -0
- package/esm2015/lib/shared-services/user.service.js +54 -0
- package/esm2015/public-api.js +64 -1
- package/fesm2015/nuxeo-development-framework.js +7628 -154
- package/fesm2015/nuxeo-development-framework.js.map +1 -1
- package/lib/components/activities-log/activities-log/activities-log.component.d.ts +23 -0
- package/lib/components/activities-log/activities-log/activities-log.service.d.ts +9 -0
- package/lib/components/activities-log/activities-log.module.d.ts +10 -0
- package/lib/components/attachment-item/attachment-item/attachment-item.component.d.ts +21 -0
- package/lib/components/attachment-item/attachment-item.module.d.ts +13 -0
- package/lib/components/attachment-modal/attachment-modal.module.d.ts +12 -0
- package/lib/components/attachment-modal/attachments/attachments.component.d.ts +50 -0
- package/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +12 -0
- package/lib/components/confirmation-dialog/confirmation-dialog.module.d.ts +10 -0
- package/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.d.ts +17 -0
- package/lib/components/display-suitable-icon/display-suitable-icon/icon.service.d.ts +8 -0
- package/lib/components/display-suitable-icon/display-suitable-icon.module.d.ts +8 -0
- package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.d.ts +137 -0
- package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.d.ts +12 -0
- package/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.d.ts +13 -0
- package/lib/components/dynamic-tabs/dynamic-tabs.module.d.ts +11 -0
- package/lib/components/file-manger/components/add-to-collection/add-to-collection.component.d.ts +31 -0
- package/lib/components/file-manger/components/copy/copy.component.d.ts +32 -0
- package/lib/components/file-manger/components/create-directory/create-directory.component.d.ts +24 -0
- package/lib/components/file-manger/components/create-modal/create-modal.component.d.ts +108 -0
- package/lib/components/file-manger/components/creation-type/creation-type.component.d.ts +11 -0
- package/lib/components/file-manger/components/delete/delete.component.d.ts +30 -0
- package/lib/components/file-manger/components/folder-modal/folder-modal.component.d.ts +56 -0
- package/lib/components/file-manger/components/loan-request/loan-request.component.d.ts +23 -0
- package/lib/components/file-manger/components/move/move.component.d.ts +32 -0
- package/lib/components/file-manger/components/publish-dialog/publish-dialog.component.d.ts +32 -0
- package/lib/components/file-manger/components/rename/rename.component.d.ts +25 -0
- package/lib/components/file-manger/components/scan-modal/scan-modal.component.d.ts +95 -0
- package/lib/components/file-manger/components/share-dialog/share-dialog.component.d.ts +58 -0
- package/lib/components/file-manger/components/sidepanel/sidepanel.component.d.ts +62 -0
- package/lib/components/file-manger/components/template-modal/template-modal.component.d.ts +34 -0
- package/lib/components/file-manger/components/transfer-doc/transfer-doc.component.d.ts +24 -0
- package/lib/components/file-manger/components/update-modal/update-modal.component.d.ts +194 -0
- package/lib/components/file-manger/file-manager.abstract.d.ts +169 -0
- package/lib/components/file-manger/file-manger.module.d.ts +55 -0
- package/lib/components/hijri-gregorian-datepicker/hijri-gregorian-datepicker/hijri-datepicker/hijri-datepicker.component.d.ts +2 -0
- package/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.d.ts +17 -0
- package/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.d.ts +10 -0
- package/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.d.ts +44 -0
- package/lib/components/permissions/permission.service.d.ts +21 -0
- package/lib/components/permissions/permissions/permissions.component.d.ts +48 -0
- package/lib/components/permissions/permissions-template/permissions-template.component.d.ts +22 -0
- package/lib/components/permissions/permissions.module.d.ts +21 -0
- package/lib/components/select-users-by-department/select-users-by-department.module.d.ts +13 -0
- package/lib/components/select-users-by-department/select-users-by-departments/department-management.service.d.ts +10 -0
- package/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.d.ts +33 -0
- package/lib/components/user/user/user.component.d.ts +12 -0
- package/lib/components/user/user.module.d.ts +10 -0
- package/lib/directive/directive.module.d.ts +3 -2
- package/lib/directive/drag-and-drop/drag-and-drop.directive.d.ts +11 -0
- package/lib/shared/libraryShared.module.d.ts +1 -1
- package/lib/shared-services/dialog-mangment.service.d.ts +15 -0
- package/lib/shared-services/dynamic-form.service.d.ts +24 -0
- package/lib/shared-services/file-manager.adapter.d.ts +48 -0
- package/lib/shared-services/file-manager.service.d.ts +89 -0
- package/lib/shared-services/global-pdftron.service.d.ts +10 -0
- package/lib/shared-services/mainfolder.service.d.ts +29 -0
- package/lib/shared-services/publishing-document.service.d.ts +25 -0
- package/lib/shared-services/recently-viewed.service.d.ts +17 -0
- package/lib/shared-services/shared-docs.service.d.ts +21 -0
- package/lib/shared-services/shared-services.module.d.ts +7 -0
- package/lib/shared-services/upload-file.service.d.ts +10 -0
- package/lib/shared-services/upload-managment.service.d.ts +72 -0
- package/lib/shared-services/user.service.d.ts +12 -0
- package/package.json +7 -6
- package/public-api.d.ts +61 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import * as moment from 'moment';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/material/dialog";
|
|
7
|
+
import * as i2 from "../../../../shared-services/upload-managment.service";
|
|
8
|
+
import * as i3 from "../../../../shared-services/dialog-mangment.service";
|
|
9
|
+
import * as i4 from "../../../../shared-services/file-manager.service";
|
|
10
|
+
import * as i5 from "../../../custom-toastr/services/custom-toastr.service";
|
|
11
|
+
import * as i6 from "@angular/forms";
|
|
12
|
+
import * as i7 from "../../../../shared-services/dynamic-form.service";
|
|
13
|
+
import * as i8 from "../../../hijri-gregorian-datepicker/services/date-helper.service";
|
|
14
|
+
import * as i9 from "../../../../Core/adapters/adapter.service";
|
|
15
|
+
import * as i10 from "../../../../Core/services/translation/translation.service";
|
|
16
|
+
import * as i11 from "../../../../Core/services/nuxeo/nuxeo.service";
|
|
17
|
+
import * as i12 from "../../../../shared-services/user.service";
|
|
18
|
+
import * as i13 from "../../../../configuration/app-config.service";
|
|
19
|
+
import * as i14 from "../../../documents/components/document-scan/document-scan.service";
|
|
20
|
+
import * as i15 from "../../../documents/components/document-scan/document-scan.component";
|
|
21
|
+
import * as i16 from "../../../dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component";
|
|
22
|
+
import * as i17 from "../../../dynamic-form/components/dynamic-form/dynamic-form.component";
|
|
23
|
+
import * as i18 from "@angular/common";
|
|
24
|
+
import * as i19 from "../../../../directive/rtl/set-rtl.directive";
|
|
25
|
+
import * as i20 from "@ngx-translate/core";
|
|
26
|
+
export class ScanModalComponent {
|
|
27
|
+
constructor(data, dialogRef, uploadMangmentService, dialogMangmentService, fileMangerService, tosterService, formBuilder, dynamicFormService, dateHelperService, adapter, translationService, nuxeoService, userService, appConfService, envirnoment, documentScanService) {
|
|
28
|
+
this.data = data;
|
|
29
|
+
this.dialogRef = dialogRef;
|
|
30
|
+
this.uploadMangmentService = uploadMangmentService;
|
|
31
|
+
this.dialogMangmentService = dialogMangmentService;
|
|
32
|
+
this.fileMangerService = fileMangerService;
|
|
33
|
+
this.tosterService = tosterService;
|
|
34
|
+
this.formBuilder = formBuilder;
|
|
35
|
+
this.dynamicFormService = dynamicFormService;
|
|
36
|
+
this.dateHelperService = dateHelperService;
|
|
37
|
+
this.adapter = adapter;
|
|
38
|
+
this.translationService = translationService;
|
|
39
|
+
this.nuxeoService = nuxeoService;
|
|
40
|
+
this.userService = userService;
|
|
41
|
+
this.appConfService = appConfService;
|
|
42
|
+
this.envirnoment = envirnoment;
|
|
43
|
+
this.documentScanService = documentScanService;
|
|
44
|
+
this.activeTab = 'scan';
|
|
45
|
+
this.createWhenFinishMode = false;
|
|
46
|
+
this.selectedFile = {
|
|
47
|
+
staticData: {},
|
|
48
|
+
fileType: '',
|
|
49
|
+
dynamicForm: '',
|
|
50
|
+
dynamicData: {
|
|
51
|
+
valid: false,
|
|
52
|
+
data: {}
|
|
53
|
+
},
|
|
54
|
+
file: ''
|
|
55
|
+
};
|
|
56
|
+
this.temporaryDyanmicData = {};
|
|
57
|
+
this.showRenderer = false;
|
|
58
|
+
this.isArabic = false;
|
|
59
|
+
this.showStaticForm = false;
|
|
60
|
+
this.usingExtraFields = false; // flage to switch between static form types
|
|
61
|
+
this.myEnvironment = this.envirnoment;
|
|
62
|
+
}
|
|
63
|
+
ngOnInit() {
|
|
64
|
+
this.langSubscription = this.translationService.isArabic.subscribe(res => {
|
|
65
|
+
this.isArabic = res;
|
|
66
|
+
});
|
|
67
|
+
this.createWhenFinishMode = false;
|
|
68
|
+
this.fileType = this.dialogMangmentService.fileType;
|
|
69
|
+
this.source = this.dialogMangmentService.addingFrom;
|
|
70
|
+
this.fileMangerService.getFileSchemas(this.fileType.type).subscribe(schemas => {
|
|
71
|
+
schemas.map(item => {
|
|
72
|
+
if (item.name === "generaldocument") {
|
|
73
|
+
this.usingExtraFields = true;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
this.initiatfileForm();
|
|
77
|
+
//if starting from filemnager then i have fixed file type for all attachmetn and single dynaimc form type
|
|
78
|
+
if (this.source === 'fileManger') {
|
|
79
|
+
if (this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.length > 0) {
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
this.selectedFile = Object.assign({}, this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.shift());
|
|
82
|
+
this.temporaryDyanmicData = this.selectedFile.dynamicData.data;
|
|
83
|
+
this.fileForm.patchValue(this.selectedFile.staticData);
|
|
84
|
+
if (this.selectedFile['staticData']['agencyCategoryCode']) {
|
|
85
|
+
this.agencyNameFilter = {
|
|
86
|
+
category: this.selectedFile['staticData']['agencyCategoryCode']
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (this.selectedFile['staticData']['countryCategoryCode']) {
|
|
90
|
+
this.countryNameFilter = {
|
|
91
|
+
category: this.selectedFile['staticData']['countryCategoryCode']
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
this.openSubscriptions();
|
|
95
|
+
}, 2000);
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
this.showRenderer = true;
|
|
98
|
+
}, 3000);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.selectedFile.dynamicForm = this.dialogMangmentService.storedDynamicForm;
|
|
102
|
+
this.showRenderer = true;
|
|
103
|
+
this.openSubscriptions();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this.uploadStartSubscription = this.documentScanService.uploadStart.subscribe(res => {
|
|
108
|
+
this.uploadMangmentService.uploadedFilesStatus.uploadInProgress = res;
|
|
109
|
+
});
|
|
110
|
+
this.fileChangeSubscription = this.documentScanService.fileChange.subscribe(event => {
|
|
111
|
+
//console.log(event);
|
|
112
|
+
this.selectedFile.file = event;
|
|
113
|
+
let payLoad = this.constructPayLoad(this.selectedFile);
|
|
114
|
+
this.fileMangerService.createFile(payLoad, this.fileMangerService.selectedFolderId).subscribe(res => {
|
|
115
|
+
if (res['status'] && res['status'] === 'failed') {
|
|
116
|
+
this.uploadMangmentService.scanCreationFailed = true;
|
|
117
|
+
this.tosterService.show('error', 'TOASTER.ERROR', 'TOASTER.UPLOAD_ERROR');
|
|
118
|
+
this.removeSubscription();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.fileMangerService.onRefreshingFileManger.next();
|
|
122
|
+
this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.FILE_CREATED_SUCCE");
|
|
123
|
+
this.documentScanService.storedFile = {};
|
|
124
|
+
this.uploadMangmentService.resetStatus();
|
|
125
|
+
this.removeSubscription();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
this.scannerUploadButton = document.getElementById('scannerUploadButton');
|
|
130
|
+
}
|
|
131
|
+
initiatfileForm() {
|
|
132
|
+
if (this.usingExtraFields) {
|
|
133
|
+
this.fileForm = this.formBuilder.group({
|
|
134
|
+
title: ['', [Validators.required]],
|
|
135
|
+
description: [''],
|
|
136
|
+
subject: ['', [Validators.required]],
|
|
137
|
+
documentNumber: [''],
|
|
138
|
+
gdocumentDate: [null, [Validators.required]],
|
|
139
|
+
secrecyLevel: [null],
|
|
140
|
+
importanceLevel: [null],
|
|
141
|
+
departmentCode: [''],
|
|
142
|
+
agencyCategoryCode: [null],
|
|
143
|
+
agencyName: [null],
|
|
144
|
+
countryCategoryCode: [null],
|
|
145
|
+
countryName: [null],
|
|
146
|
+
remarks: ['']
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this.fileForm = this.formBuilder.group({
|
|
151
|
+
title: ['', [Validators.required]],
|
|
152
|
+
description: ['']
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
this.staticFormFields = this.appConfService.myConfiguration.staticFormFields;
|
|
156
|
+
if (this.fileFormSubscription) {
|
|
157
|
+
this.fileFormSubscription.unsubscribe();
|
|
158
|
+
}
|
|
159
|
+
if (this.fileForm.get('departmentCode')) {
|
|
160
|
+
this.fileForm.get('departmentCode').setValue(this.userService.getUserDepartmentFromPath(this.data.path));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
openSubscriptions() {
|
|
164
|
+
this.fileFormSubscription = this.fileForm.valueChanges.subscribe(data => {
|
|
165
|
+
this.selectedFile.staticData = data;
|
|
166
|
+
});
|
|
167
|
+
if (this.fileForm.get('agencyCategoryCode')) {
|
|
168
|
+
this.agencyCategCodeSubscription = this.fileForm.get('agencyCategoryCode').valueChanges.subscribe(res => {
|
|
169
|
+
this.fileForm.get('agencyName').setValue(null);
|
|
170
|
+
this.agencyNameFilter = {
|
|
171
|
+
category: res
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (this.fileForm.get('countryCategoryCode')) {
|
|
176
|
+
this.countryCategCodeSubscription = this.fileForm.get('countryCategoryCode').valueChanges.subscribe(res => {
|
|
177
|
+
this.fileForm.get('countryName').setValue(null);
|
|
178
|
+
this.countryNameFilter = {
|
|
179
|
+
category: res
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
onUploading(event) {
|
|
185
|
+
this.uploadMangmentService.uploadedFilesStatus.uploadInProgress = event;
|
|
186
|
+
}
|
|
187
|
+
// onScannerSuccess(event) {
|
|
188
|
+
// //console.log(event);
|
|
189
|
+
// this.selectedFile.file = event;
|
|
190
|
+
// let payLoad = this.constructPayLoad(this.selectedFile);
|
|
191
|
+
// this.fileMangerService.createFile(payLoad, this.fileMangerService.selectedFolderId).subscribe(res => {
|
|
192
|
+
// this.fileMangerService.onRefreshingFileManger.next();
|
|
193
|
+
// this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.FILE_CREATED_SUCCE")
|
|
194
|
+
// this.documentScanService.storedFile = {};
|
|
195
|
+
// this.uploadMangmentService.resetStatus();
|
|
196
|
+
// })
|
|
197
|
+
// }
|
|
198
|
+
ondynamicFormChange(dynamicData) {
|
|
199
|
+
if (dynamicData.data) {
|
|
200
|
+
console.log(dynamicData.data);
|
|
201
|
+
this.selectedFile.dynamicData = Object.assign({}, dynamicData);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
closeDialog() {
|
|
205
|
+
this.documentScanService.storedFile = {};
|
|
206
|
+
this.removeSubscription();
|
|
207
|
+
this.dialogRef.close(false);
|
|
208
|
+
}
|
|
209
|
+
minimizDialog() {
|
|
210
|
+
this.documentScanService.onMinimizing.emit(true);
|
|
211
|
+
this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.push(Object.assign({}, this.selectedFile));
|
|
212
|
+
this.removeSubscription();
|
|
213
|
+
this.dialogRef.close(true);
|
|
214
|
+
}
|
|
215
|
+
removeSubscription() {
|
|
216
|
+
setTimeout(() => {
|
|
217
|
+
this.uploadStartSubscription ? this.uploadStartSubscription.unsubscribe() : '';
|
|
218
|
+
this.fileChangeSubscription ? this.fileChangeSubscription.unsubscribe() : '';
|
|
219
|
+
}, 2000);
|
|
220
|
+
}
|
|
221
|
+
startAddingProperties() {
|
|
222
|
+
this.uploadMangmentService.addingPropertiesMode = true;
|
|
223
|
+
}
|
|
224
|
+
createDocument() {
|
|
225
|
+
this.documentScanService.onMinimizing.emit(true);
|
|
226
|
+
this.uploadMangmentService.uploadedFilesStatus.uploadedFiles.push(Object.assign({}, this.selectedFile));
|
|
227
|
+
this.scannerUploadButton.click();
|
|
228
|
+
this.dialogRef.close(true);
|
|
229
|
+
}
|
|
230
|
+
constructPayLoad(file) {
|
|
231
|
+
let props = this.dynamicFormService.constructDynamicFormPayload(file.dynamicData.data, file.dynamicForm);
|
|
232
|
+
let staticFormData = this.mappingStaticData(file.staticData);
|
|
233
|
+
let param = {
|
|
234
|
+
"document": {
|
|
235
|
+
"type": this.fileType.type,
|
|
236
|
+
"name": file.staticData.title,
|
|
237
|
+
"properties": Object.assign(Object.assign(Object.assign({}, props), staticFormData), { "file:content": {
|
|
238
|
+
"upload-batch": file.file.blob['upload-batch'],
|
|
239
|
+
"upload-fileId": file.file.blob['upload-fileId']
|
|
240
|
+
} })
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
if (file.fileType.documentCode) {
|
|
244
|
+
param["documentTypeCode"] = file.fileType.documentCode;
|
|
245
|
+
}
|
|
246
|
+
return { params: param, originFile: file };
|
|
247
|
+
}
|
|
248
|
+
mappingStaticData(data) {
|
|
249
|
+
if (data.gdocumentDate && data.gdocumentDate !== null) {
|
|
250
|
+
moment.locale('en');
|
|
251
|
+
data['hdocumentDate'] = this.dateHelperService.gregorianToHijri(data.gdocumentDate, 'iYYYY-iMM-iDD');
|
|
252
|
+
data.gdocumentDate = (moment(data.gdocumentDate).format("YYYY-MM-DDT00:00:00.000") + "Z");
|
|
253
|
+
}
|
|
254
|
+
return this.adapter.adaptOut(data, this.staticFormFields);
|
|
255
|
+
}
|
|
256
|
+
constructDynamicFormPayload(file) {
|
|
257
|
+
var _a;
|
|
258
|
+
let updatedDynamicValues = {};
|
|
259
|
+
Object.keys((_a = file === null || file === void 0 ? void 0 : file.dynamicData) === null || _a === void 0 ? void 0 : _a.data).map(key => {
|
|
260
|
+
let updatedKey = key.replace(':', '');
|
|
261
|
+
let prefix = file.dynamicForm.prefix[updatedKey];
|
|
262
|
+
if (prefix) {
|
|
263
|
+
// check if component is user selector to map its data from object to username or id only
|
|
264
|
+
if (file.dynamicData.data[key] && file.dynamicData.data[key]['userSelector'] && file.dynamicData.data[key]['userSelector'] === true) {
|
|
265
|
+
updatedDynamicValues[prefix + ':' + updatedKey] = file.dynamicData.data[key]['value']['id'] ? file.dynamicData.data[key]['value']['id'] : file.dynamicData.data[key]['value']['properties']['username'];
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
updatedDynamicValues[prefix + ':' + updatedKey] = file.dynamicData.data[key];
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
if (file.dynamicData.data[key]['userSelector'] && file.dynamicData.data[key]['userSelector'] === true) {
|
|
273
|
+
updatedDynamicValues[updatedKey] = file.dynamicData.data[key]['value']['id'] ? file.dynamicData.data[key]['value']['id'] : file.dynamicData.data[key]['value']['properties']['username'];
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
updatedDynamicValues[updatedKey] = file.dynamicData.data[key];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return updatedDynamicValues;
|
|
281
|
+
}
|
|
282
|
+
createWhenFinish() {
|
|
283
|
+
}
|
|
284
|
+
changTabTo(tabName) {
|
|
285
|
+
this.activeTab = tabName;
|
|
286
|
+
}
|
|
287
|
+
checkValidation() {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
ngOnDestroy() {
|
|
291
|
+
this.langSubscription ? this.langSubscription.unsubscribe() : '';
|
|
292
|
+
this.agencyCategCodeSubscription ? this.agencyCategCodeSubscription.unsubscribe() : null;
|
|
293
|
+
this.countryCategCodeSubscription ? this.countryCategCodeSubscription.unsubscribe() : null;
|
|
294
|
+
this.fileFormSubscription ? this.fileFormSubscription.unsubscribe() : null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
ScanModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: ScanModalComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }, { token: i2.UploadManagmentService }, { token: i3.DialogMangmentService }, { token: i4.FileManagerService }, { token: i5.CustomToastrService }, { token: i6.FormBuilder }, { token: i7.DynamicFormService }, { token: i8.DateHelperService }, { token: i9.AdapterService }, { token: i10.TranslationService }, { token: i11.NuxeoService }, { token: i12.UserService }, { token: i13.AppConfigService }, { token: 'environment' }, { token: i14.DocumentScanService }], target: i0.ɵɵFactoryTarget.Component });
|
|
298
|
+
ScanModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: ScanModalComponent, selector: "app-scan-modal", ngImport: i0, template: "<div class=\"scanner-modal-body relative h-full\">\r\n <!-- -->\r\n <!-- tabs -->\r\n <div\r\n class=\"scanner-tabs d-flex justify-around items-center border-b-2 border-gray-200 mb-5 text-gray-900 text-lg\"\r\n >\r\n <div\r\n class=\"scanner-single-tab cursor-pointer w-1/2 text-center py-2 border-gray-900 hover:bg-gray-100\"\r\n (click)=\"changTabTo('scan')\"\r\n [ngClass]=\"{ 'font-bold border-b-4': activeTab === 'scan' }\"\r\n >\r\n {{\"CREATE.SCAN\" | translate}}\r\n </div>\r\n <div\r\n class=\"scanner-single-tab cursor-pointer w-1/2 text-center py-2 border-gray-900 hover:bg-gray-100\"\r\n (click)=\"changTabTo('form')\"\r\n [ngClass]=\"{ 'font-bold border-b-4': activeTab === 'form' }\"\r\n >\r\n {{\"CREATE.DETAILS\" | translate}}\r\n </div>\r\n </div>\r\n <div class=\"tabs-body-wrapper\">\r\n <!-- uploader indicator loading -->\r\n <div\r\n class=\"upload-loader mx-2\"\r\n *ngIf=\"uploadMangmentService.uploadedFilesStatus.uploadInProgress\"\r\n >\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n </div>\r\n\r\n <!-- scanner -->\r\n <div class=\"\" [ngClass]=\"{ 'd-none': activeTab === 'form' }\">\r\n <app-document-scan\r\n [hideUploadButton]=\"true\"\r\n [useStoredFile]=\"true\"\r\n ></app-document-scan>\r\n </div>\r\n\r\n <!-- forms and properties -->\r\n <div\r\n class=\"forms-section\"\r\n [ngClass]=\"{ 'd-none': activeTab === 'scan' }\"\r\n >\r\n <div class=\"w-2/3\">\r\n <div class=\"mb-5\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.FILE_TYPE\" | translate }}\r\n </div>\r\n <div class=\"text-base text-gray-900\">\r\n {{ isArabic ? fileType.arabicText : fileType.englishText }}\r\n </div>\r\n </div>\r\n <div class=\"file-fields mt-3\" SetRtl>\r\n <form [formGroup]=\"fileForm\" *ngIf=\"fileForm\">\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.TITLE\" | translate\r\n }}<span class=\"text-red-500\">*</span>\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"title\"\r\n placeholder=\" {{ 'CREATE.TITLE' | translate }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DESCRIPTION\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"description\"\r\n placeholder=\" {{\r\n 'CREATE.DESCRIPTION' | translate\r\n }}\"\r\n />\r\n </div>\r\n\r\n <!------------------ new statis form ---------------------------->\r\n <div *ngIf=\"usingExtraFields\">\r\n \r\n <app-dynamic-fields-renderer [form]=\"fileForm\" [agencyNameFilter]=\"agencyNameFilter\" [countryNameFilter]=\"countryNameFilter\"></app-dynamic-fields-renderer>\r\n\r\n <!-- <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DOCUMENT_SUBJECT\" | translate\r\n }}<span class=\"text-red-500\">*</span>\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"subject\"\r\n placeholder=\" {{\r\n 'CREATE.DOCUMENT_SUBJECT' | translate\r\n }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DOCUMENT_NUMBER\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"documentNumber\"\r\n placeholder=\" {{\r\n 'CREATE.DOCUMENT_NUMBER' | translate\r\n }}\"\r\n />\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <cts-dynamic-form-hijri-dateitem\r\n formControlName=\"gdocumentDate\"\r\n label=\"CREATE.DOCUMENT_DATE\"\r\n >\r\n </cts-dynamic-form-hijri-dateitem>\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <app-dynamic-form-vocabulary-item\r\n [label]=\"'CREATE.SCRECY_LEVEL'\"\r\n [bindLabel]=\"'label'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"false\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n [vocabularyType]=\"'VOC_SecrecyLevel'\"\r\n formControlName=\"secrecyLevel\"\r\n >\r\n </app-dynamic-form-vocabulary-item>\r\n </div>\r\n <div class=\"single-field mb-3\">\r\n <app-dynamic-form-vocabulary-item\r\n [label]=\"'CREATE.IMPORTANCE_LEVEL'\"\r\n [bindLabel]=\"'label'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"false\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n [vocabularyType]=\"'VOC_Importance'\"\r\n formControlName=\"importanceLevel\"\r\n >\r\n </app-dynamic-form-vocabulary-item>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.DEPARTMENT_CODE\" | translate }}\r\n </div>\r\n <app-dynamic-form-department\r\n formControlName=\"departmentCode\"\r\n [placeholder]=\"'please select department'\"\r\n [pp_departmentNestedTree]=\"\r\n 'PP_OS_Departments'\r\n \"\r\n [pp_departmentTree]=\"'PP_OS_Departments'\"\r\n [customPrefix]=\"'osdept'\"\r\n [customParentProperty]=\"\r\n 'osdepartment_parentDepartmentCode'\r\n \"\r\n [useCustomAddEditAction]=\"true\"\r\n >\r\n </app-dynamic-form-department>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.AGENCY_CATEGORY_CODE'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"agencyCategoryCode\"\r\n [vocbularyId]=\"'VOC_AgencyCategory'\"\r\n [useFilter]=\"false\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.AGENCY_NAME'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"agencyName\"\r\n [vocbularyId]=\"'VOC_Agency'\"\r\n [filter]=\"agencyNameFilter\"\r\n [useFilter]=\"true\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.COUNTRY_CATEGORY_CODE'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"countryCategoryCode\"\r\n [vocbularyId]=\"'VOC_CountryCategory'\"\r\n [useFilter]=\"false\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <app-translated-vocabulary-select\r\n [label]=\"'CREATE.COUNTRY_NAME'\"\r\n [arbBindLabel]=\"'label_ar'\"\r\n [engBindLabel]=\"'label_en'\"\r\n [bindValue]=\"'id'\"\r\n placeholder=\"{{\r\n 'VOCABULARY.SELECT_ITEM' | translate\r\n }}\"\r\n [multiple]=\"false\"\r\n [searchable]=\"true\"\r\n [closeOnSelect]=\"true\"\r\n [hideSelectedItems]=\"false\"\r\n formControlName=\"countryName\"\r\n [vocbularyId]=\"'VOC_Country'\"\r\n [filter]=\"countryNameFilter\"\r\n [useFilter]=\"true\"\r\n >\r\n </app-translated-vocabulary-select>\r\n </div>\r\n\r\n <div class=\"single-field mb-3\">\r\n <div class=\"label-style\">\r\n {{ \"CREATE.REMARKS\" | translate }}\r\n </div>\r\n <input\r\n class=\"field-style\"\r\n formControlName=\"remarks\"\r\n placeholder=\" {{\r\n 'CREATE.REMARKS' | translate\r\n }}\"\r\n />\r\n </div> -->\r\n </div>\r\n\r\n <!-- ----------------------------------------------------------- -->\r\n </form>\r\n <!-- *ngIf=\"\" -->\r\n <div\r\n class=\"dynamic-part -mx-4\"\r\n *ngIf=\"selectedFile.dynamicForm && showRenderer\"\r\n >\r\n <app-dynamic-form\r\n [form]=\"selectedFile.dynamicForm\"\r\n [data]=\"temporaryDyanmicData\"\r\n (change)=\"ondynamicFormChange($event)\"\r\n ></app-dynamic-form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- actions and buttons -->\r\n <div\r\n class=\"w-full d-flex justify-between scanner-actions-wrapper absolute bottom-0\"\r\n >\r\n <div class=\"flex\">\r\n <button class=\"cancelation-button\" (click)=\"closeDialog()\">\r\n {{ \"BUTTONS.CANCEL\" | translate }}\r\n </button>\r\n <button class=\"cancelation-button mx-2\" (click)=\"minimizDialog()\">\r\n {{ \"BUTTONS.MINIMIZED\" | translate }}\r\n </button>\r\n </div>\r\n\r\n <!-- -->\r\n <div class=\"d-flex\">\r\n <!-- <button\r\n *ngIf=\"creationFailed\"\r\n [disabled]=\"\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n \"\r\n [ngClass]=\"{\r\n 'opacity-30 cursor-not-allowed':\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n }\"\r\n (click)=\"createDocument()\"\r\n class=\"submission-button\"\r\n >\r\n {{ \"BUTTONS.TRY_AGAIN\" | translate }}\r\n </button> -->\r\n <button\r\n (click)=\"createDocument()\"\r\n [disabled]=\"\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n \"\r\n [ngClass]=\"{\r\n 'opacity-30 cursor-not-allowed':\r\n scannerUploadButton.disabled ||\r\n !selectedFile.dynamicData.valid ||\r\n fileForm.invalid\r\n }\"\r\n class=\"submission-button\"\r\n >\r\n {{ uploadMangmentService.scanCreationFailed ? (\"BUTTONS.TRY_AGAIN\" | translate) : (\"BUTTONS.CREATE\" | translate) }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".forms-section{display:flex;justify-content:center}.tabs-body-wrapper{height:calc(100% - 125px);overflow-y:auto;overflow-x:hidden}\n"], components: [{ type: i15.ScanComponent, selector: "app-document-scan", inputs: ["useStoredFile", "hideUploadButton"], outputs: ["file"] }, { type: i16.DynamicFieldsRendererComponent, selector: "app-dynamic-fields-renderer", inputs: ["form", "agencyNameFilter", "countryNameFilter", "fields"] }, { type: i17.DynamicFormComponent, selector: "app-dynamic-form", inputs: ["form", "data", "readOnly"], outputs: ["change"] }], directives: [{ type: i18.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i18.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i19.SetRtlDirective, selector: "[SetRtl]" }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "translate": i20.TranslatePipe } });
|
|
299
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: ScanModalComponent, decorators: [{
|
|
300
|
+
type: Component,
|
|
301
|
+
args: [{
|
|
302
|
+
selector: 'app-scan-modal',
|
|
303
|
+
templateUrl: './scan-modal.component.html',
|
|
304
|
+
styleUrls: ['./scan-modal.component.scss']
|
|
305
|
+
}]
|
|
306
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
307
|
+
type: Inject,
|
|
308
|
+
args: [MAT_DIALOG_DATA]
|
|
309
|
+
}] }, { type: i1.MatDialogRef }, { type: i2.UploadManagmentService }, { type: i3.DialogMangmentService }, { type: i4.FileManagerService }, { type: i5.CustomToastrService }, { type: i6.FormBuilder }, { type: i7.DynamicFormService }, { type: i8.DateHelperService }, { type: i9.AdapterService }, { type: i10.TranslationService }, { type: i11.NuxeoService }, { type: i12.UserService }, { type: i13.AppConfigService }, { type: undefined, decorators: [{
|
|
310
|
+
type: Inject,
|
|
311
|
+
args: ['environment']
|
|
312
|
+
}] }, { type: i14.DocumentScanService }]; } });
|
|
313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtbWFuZ2VyL2NvbXBvbmVudHMvc2Nhbi1tb2RhbC9zY2FuLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL251eGVvLWRldmVsb3BtZW50LWZyYW1ld29yay9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1tYW5nZXIvY29tcG9uZW50cy9zY2FuLW1vZGFsL3NjYW4tbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU96RSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNqQyxNQUFNLE9BQU8sa0JBQWtCO0lBbUM3QixZQUE0QyxJQUFJLEVBQ3ZDLFNBQTJDLEVBQzNDLHFCQUE2QyxFQUM3QyxxQkFBNEMsRUFDM0MsaUJBQXFDLEVBQ3JDLGFBQWtDLEVBQ2xDLFdBQXlCLEVBQ3pCLGtCQUFzQyxFQUN0QyxpQkFBcUMsRUFDckMsT0FBd0IsRUFDeEIsa0JBQXVDLEVBQ3ZDLFlBQTRCLEVBQzVCLFdBQXlCLEVBQ3pCLGNBQWlDLEVBQ1YsV0FBVyxFQUNsQyxtQkFBeUM7UUFmUCxTQUFJLEdBQUosSUFBSSxDQUFBO1FBQ3ZDLGNBQVMsR0FBVCxTQUFTLENBQWtDO1FBQzNDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBd0I7UUFDN0MsMEJBQXFCLEdB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LDJCQUEyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RixJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQzs7K0dBdlRVLGtCQUFrQixrQkFtQ1QsZUFBZSxrYkFjekIsYUFBYTttR0FqRFosa0JBQWtCLHNEQ3ZCL0Isb3ppQkFnVkE7MkZEelRhLGtCQUFrQjtrQkFMOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxTQUFTLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztpQkFDM0M7OzBCQW9DYyxNQUFNOzJCQUFDLGVBQWU7OzBCQWNoQyxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBVcGxvYWRNYW5hZ21lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkLXNlcnZpY2VzL3VwbG9hZC1tYW5hZ21lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ01hbmdtZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9kaWFsb2ctbWFuZ21lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IER5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy9maWxlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkLXNlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQ3VzdG9tVG9hc3RyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10b2FzdHIvc2VydmljZXMvY3VzdG9tLXRvYXN0ci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9jdW1lbnRTY2FuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RvY3VtZW50cy9jb21wb25lbnRzL2RvY3VtZW50LXNjYW4vZG9jdW1lbnQtc2Nhbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0ZUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9oaWpyaS1ncmVnb3JpYW4tZGF0ZXBpY2tlci9zZXJ2aWNlcy9kYXRlLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9Db3JlL2FkYXB0ZXJzL2FkYXB0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL0NvcmUvc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE51eGVvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL0NvcmUvc2VydmljZXMvbnV4ZW8vbnV4ZW8uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uL2FwcC1jb25maWcuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zY2FuLW1vZGFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2Nhbi1tb2RhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2Nhbi1tb2RhbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY2FuTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHNjYW5uZXJVcGxvYWRCdXR0b247XHJcbiAgZmlsZVR5cGU7XHJcbiAgc291cmNlO1xyXG4gIGFjdGl2ZVRhYiA9ICdzY2FuJztcclxuICBjcmVhdGVXaGVuRmluaXNoTW9kZSA9IGZhbHNlO1xyXG4gIG15RW52aXJvbm1lbnRcclxuICBzZWxlY3RlZEZpbGUgPSB7XHJcbiAgICBzdGF0aWNEYXRhIDoge30sXHJcbiAgICBmaWxlVHlwZTogJycsXHJcbiAgICBkeW5hbWljRm9ybTogJycsXHJcbiAgICBkeW5hbWljRGF0YToge1xyXG4gICAgICB2YWxpZDogZmFsc2UsXHJcbiAgICAgIGRhdGE6IHt9XHJcbiAgICB9LFxyXG4gICAgZmlsZTogJydcclxuICB9O1xyXG4gIHRlbXBvcmFyeUR5YW5taWNEYXRhID0ge307XHJcbiAgc2hvd1JlbmRlcmVyID0gZmFsc2U7XHJcblxyXG4gIHVwbG9hZFN0YXJ0U3Vic2NyaXB0aW9uIDogU3Vic2NyaXB0aW9uO1xyXG4gIGZpbGVDaGFuZ2VTdWJzY3JpcHRpb24gIDpTdWJzY3JpcHRpb247XHJcbiAgZmlsZUZvcm1TdWJzY3JpcHRpb24gOiBTdWJzY3JpcHRpb247XHJcbiAgYWdlbmN5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uIDogU3Vic2NyaXB0aW9uO1xyXG4gIGNvdW50cnlDYXRlZ0NvZGVTdWJzY3JpcHRpb24gOiBTdWJzY3JpcHRpb247XHJcbiAgbGFuZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBpc0FyYWJpYyA9IGZhbHNlO1xyXG4gIHNob3dTdGF0aWNGb3JtID0gZmFsc2VcclxuICB1c2luZ0V4dHJhRmllbGRzID0gZmFsc2U7IC8vIGZsYWdlIHRvIHN3aXRjaCBiZXR3ZWVuIHN0YXRpYyBmb3JtIHR5cGVzXHJcbiAgZmlsZUZvcm0gOiBGb3JtR3JvdXA7XHJcbiAgc3RhdGljRm9ybUZpZWxkcztcclxuICBhZ2VuY3lOYW1lRmlsdGVyIDtcclxuICBjb3VudHJ5TmFtZUZpbHRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhLFxyXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFNjYW5Nb2RhbENvbXBvbmVudD4sXHJcbiAgICBwdWJsaWMgdXBsb2FkTWFuZ21lbnRTZXJ2aWNlOiBVcGxvYWRNYW5hZ21lbnRTZXJ2aWNlLFxyXG4gICAgcHVibGljIGRpYWxvZ01hbmdtZW50U2VydmljZTogRGlhbG9nTWFuZ21lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWxlTWFuZ2VyU2VydmljZTogRmlsZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b3N0ZXJTZXJ2aWNlOiBDdXN0b21Ub2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlciA6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBkeW5hbWljRm9ybVNlcnZpY2U6IER5bmFtaWNGb3JtU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZUhlbHBlclNlcnZpY2UgOiBEYXRlSGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgYWRhcHRlciA6IEFkYXB0ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2UgOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG51eGVvU2VydmljZSAgOiBOdXhlb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlIDogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwcENvbmZTZXJ2aWNlIDogQXBwQ29uZmlnU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm5vbWVudCxcclxuICAgIHByaXZhdGUgZG9jdW1lbnRTY2FuU2VydmljZSA6IERvY3VtZW50U2NhblNlcnZpY2UpIHsgXHJcbiAgICAgIHRoaXMubXlFbnZpcm9ubWVudCA9IHRoaXMuZW52aXJub21lbnRcclxuICAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxhbmdTdWJzY3JpcHRpb249IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmlzQXJhYmljLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLmlzQXJhYmljID0gcmVzO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVXaGVuRmluaXNoTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5maWxlVHlwZSA9IHRoaXMuZGlhbG9nTWFuZ21lbnRTZXJ2aWNlLmZpbGVUeXBlO1xyXG4gICAgdGhpcy5zb3VyY2UgPSB0aGlzLmRpYWxvZ01hbmdtZW50U2VydmljZS5hZGRpbmdGcm9tO1xyXG5cclxuICAgIHRoaXMuZmlsZU1hbmdlclNlcnZpY2UuZ2V0RmlsZVNjaGVtYXModGhpcy5maWxlVHlwZS50eXBlKS5zdWJzY3JpYmUoc2NoZW1hcyA9PiB7XHJcbiAgICAgIHNjaGVtYXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmKGl0ZW0ubmFtZSA9PT0gXCJnZW5lcmFsZG9jdW1lbnRcIil7XHJcbiAgICAgICAgICB0aGlzLnVzaW5nRXh0cmFGaWVsZHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgdGhpcy5pbml0aWF0ZmlsZUZvcm0oKTtcclxuICAgICAgICAgIC8vaWYgc3RhcnRpbmcgZnJvbSBmaWxlbW5hZ2VyIHRoZW4gaSBoYXZlIGZpeGVkIGZpbGUgdHlwZSBmb3IgYWxsIGF0dGFjaG1ldG4gYW5kIHNpbmdsZSBkeW5haW1jIGZvcm0gIHR5cGVcclxuICAgIGlmICh0aGlzLnNvdXJjZSA9PT0gJ2ZpbGVNYW5nZXInKSB7XHJcbiAgICAgIGlmKHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnVwbG9hZGVkRmlsZXNTdGF0dXMudXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKXtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gey4uLnRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnVwbG9hZGVkRmlsZXNTdGF0dXMudXBsb2FkZWRGaWxlcy5zaGlmdCgpfTtcclxuICAgICAgICAgIHRoaXMudGVtcG9yYXJ5RHlhbm1pY0RhdGEgPXRoaXMuc2VsZWN0ZWRGaWxlLmR5bmFtaWNEYXRhLmRhdGE7XHJcbiAgICAgICAgICB0aGlzLmZpbGVGb3JtLnBhdGNoVmFsdWUodGhpcy5zZWxlY3RlZEZpbGUuc3RhdGljRGF0YSk7XHJcbiAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkRmlsZVsnc3RhdGljRGF0YSddWydhZ2VuY3lDYXRlZ29yeUNvZGUnXSl7XHJcbiAgICAgICAgICAgIHRoaXMuYWdlbmN5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICBjYXRlZ29yeSA6IHRoaXMuc2VsZWN0ZWRGaWxlWydzdGF0aWNEYXRhJ11bJ2FnZW5jeUNhdGVnb3J5Q29kZSddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkRmlsZVsnc3RhdGljRGF0YSddWydjb3VudHJ5Q2F0ZWdvcnlDb2RlJ10pe1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50cnlOYW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgIGNhdGVnb3J5IDogdGhpcy5zZWxlY3RlZEZpbGVbJ3N0YXRpY0RhdGEnXVsnY291bnRyeUNhdGVnb3J5Q29kZSddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9wZW5TdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dSZW5kZXJlciA9IHRydWU7XHJcbiAgICAgICAgfSwgMzAwMCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUuZHluYW1pY0Zvcm0gPSB0aGlzLmRpYWxvZ01hbmdtZW50U2VydmljZS5zdG9yZWREeW5hbWljRm9ybTtcclxuICAgICAgICAgIHRoaXMuc2hvd1JlbmRlcmVyID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMub3BlblN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnVwbG9hZFN0YXJ0U3Vic2NyaXB0aW9uID0gdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLnVwbG9hZFN0YXJ0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZEluUHJvZ3Jlc3MgPSByZXM7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5maWxlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLmZpbGVDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgLy9jb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlLmZpbGUgPSBldmVudDtcclxuICAgICAgbGV0IHBheUxvYWQgPSB0aGlzLmNvbnN0cnVjdFBheUxvYWQodGhpcy5zZWxlY3RlZEZpbGUpO1xyXG4gICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLmNyZWF0ZUZpbGUocGF5TG9hZCwgdGhpcy5maWxlTWFuZ2VyU2VydmljZS5zZWxlY3RlZEZvbGRlcklkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICBpZihyZXNbJ3N0YXR1cyddICYmIHJlc1snc3RhdHVzJ10gPT09ICdmYWlsZWQnKXtcclxuICAgICAgICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnNjYW5DcmVhdGlvbkZhaWxlZCA9IHRydWU7XHJcbiAgICAgICAgIHRoaXMudG9zdGVyU2VydmljZS5zaG93KCdlcnJvcicgLCAnVE9BU1RFUi5FUlJPUicgLCAnVE9BU1RFUi5VUExPQURfRVJST1InKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLm9uUmVmcmVzaGluZ0ZpbGVNYW5nZXIubmV4dCgpO1xyXG4gICAgICAgICAgdGhpcy50b3N0ZXJTZXJ2aWNlLnNob3coJ3N1Y2Nlc3MnLCAnVE9BU1RFUi5TVUNDRVNTJywgXCJUT0FTVEVSLkZJTEVfQ1JFQVRFRF9TVUNDRVwiKVxyXG4gICAgICAgICAgdGhpcy5kb2N1bWVudFNjYW5TZXJ2aWNlLnN0b3JlZEZpbGUgPSB7fTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnJlc2V0U3RhdHVzKCk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICAgICB0aGlzLnNjYW5uZXJVcGxvYWRCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nhbm5lclVwbG9hZEJ1dHRvbicpO1xyXG4gIH1cclxuICBcclxuICBpbml0aWF0ZmlsZUZvcm0oKXtcclxuICAgIGlmKHRoaXMudXNpbmdFeHRyYUZpZWxkcyl7XHJcbiAgICAgIHRoaXMuZmlsZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgICB0aXRsZSA6IFsnJyAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgICAgZGVzY3JpcHRpb24gOiBbJyddLFxyXG4gICAgICAgIHN1YmplY3QgOiBbJycgLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyIDogWycnXSxcclxuICAgICAgICBnZG9jdW1lbnREYXRlIDogW251bGwgLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgIHNlY3JlY3lMZXZlbCA6IFtudWxsXSxcclxuICAgICAgICBpbXBvcnRhbmNlTGV2ZWw6W251bGxdLFxyXG4gICAgICAgIGRlcGFydG1lbnRDb2RlOlsnJ10sXHJcbiAgICAgICAgYWdlbmN5Q2F0ZWdvcnlDb2RlOltudWxsXSxcclxuICAgICAgICBhZ2VuY3lOYW1lOltudWxsXSxcclxuICAgICAgICBjb3VudHJ5Q2F0ZWdvcnlDb2RlOltudWxsXSxcclxuICAgICAgICBjb3VudHJ5TmFtZTpbbnVsbF0sXHJcbiAgICAgICAgcmVtYXJrczpbJyddXHJcbiAgICAgIH0pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5maWxlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgIHRpdGxlIDogWycnICwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICBkZXNjcmlwdGlvbiA6IFsnJ11cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljRm9ybUZpZWxkcyA9IHRoaXMuYXBwQ29uZlNlcnZpY2UubXlDb25maWd1cmF0aW9uLnN0YXRpY0Zvcm1GaWVsZHM7XHJcbiAgICBpZih0aGlzLmZpbGVGb3JtU3Vic2NyaXB0aW9uKXtcclxuICAgICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5maWxlRm9ybS5nZXQoJ2RlcGFydG1lbnRDb2RlJykpe1xyXG4gICAgICB0aGlzLmZpbGVGb3JtLmdldCgnZGVwYXJ0bWVudENvZGUnKS5zZXRWYWx1ZSh0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJEZXBhcnRtZW50RnJvbVBhdGgodGhpcy5kYXRhLnBhdGgpKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvcGVuU3Vic2NyaXB0aW9ucygpe1xyXG4gICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbiA9ICB0aGlzLmZpbGVGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlLnN0YXRpY0RhdGEgPSBkYXRhO1xyXG4gICAgfSlcclxuXHJcbiAgICBpZih0aGlzLmZpbGVGb3JtLmdldCgnYWdlbmN5Q2F0ZWdvcnlDb2RlJykpe1xyXG4gICAgICB0aGlzLmFnZW5jeUNhdGVnQ29kZVN1YnNjcmlwdGlvbiA9ICB0aGlzLmZpbGVGb3JtLmdldCgnYWdlbmN5Q2F0ZWdvcnlDb2RlJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsZUZvcm0uZ2V0KCdhZ2VuY3lOYW1lJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWdlbmN5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICBjYXRlZ29yeSA6IHJlc1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMuZmlsZUZvcm0uZ2V0KCdjb3VudHJ5Q2F0ZWdvcnlDb2RlJykpe1xyXG4gICAgICB0aGlzLmNvdW50cnlDYXRlZ0NvZGVTdWJzY3JpcHRpb24gPSAgdGhpcy5maWxlRm9ybS5nZXQoJ2NvdW50cnlDYXRlZ29yeUNvZGUnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5maWxlRm9ybS5nZXQoJ2NvdW50cnlOYW1lJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5jb3VudHJ5TmFtZUZpbHRlciA9IHtcclxuICAgICAgICAgIGNhdGVnb3J5IDogcmVzXHJcbiAgICAgICAgfTtcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvblVwbG9hZGluZyhldmVudCkge1xyXG4gICAgdGhpcy51cGxvYWRNYW5nbWVudFNlcnZpY2UudXBsb2FkZWRGaWxlc1N0YXR1cy51cGxvYWRJblByb2dyZXNzID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyBvblNjYW5uZXJTdWNjZXNzKGV2ZW50KSB7XHJcbiAgLy8gICAvL2NvbnNvbGUubG9nKGV2ZW50KTtcclxuICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWxlLmZpbGUgPSBldmVudDtcclxuICAvLyAgIGxldCBwYXlMb2FkID0gdGhpcy5jb25zdHJ1Y3RQYXlMb2FkKHRoaXMuc2VsZWN0ZWRGaWxlKTtcclxuICAvLyAgIHRoaXMuZmlsZU1hbmdlclNlcnZpY2UuY3JlYXRlRmlsZShwYXlMb2FkLCB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLnNlbGVjdGVkRm9sZGVySWQpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gIC8vICAgICB0aGlzLmZpbGVNYW5nZXJTZXJ2aWNlLm9uUmVmcmVzaGluZ0ZpbGVNYW5nZXIubmV4dCgpO1xyXG4gIC8vICAgICB0aGlzLnRvc3RlclNlcnZpY2Uuc2hvdygnc3VjY2VzcycsICdUT0FTVEVSLlNVQ0NFU1MnLCBcIlRPQVNURVIuRklMRV9DUkVBVEVEX1NVQ0NFXCIpXHJcbiAgLy8gICAgIHRoaXMuZG9jdW1lbnRTY2FuU2VydmljZS5zdG9yZWRGaWxlID0ge307XHJcbiAgLy8gICAgIHRoaXMudXBsb2FkTWFuZ21lbnRTZXJ2aWNlLnJlc2V0U3RhdHVzKCk7XHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcbiAgb25keW5hbWljRm9ybUNoYW5nZShkeW5hbWljRGF0YSkge1xyXG4gICAgaWYgKGR5bmFtaWNEYXRhLmRhdGEpIHtcclxuICAgICAgY29uc29sZS5sb2coZHluYW1pY0RhdGEuZGF0YSlcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEgPSB7IC4uLmR5bmFtaWNEYXRhIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZURpYWxvZygpIHtcclxuICAgIHRoaXMuZG9jdW1lbnRTY2FuU2VydmljZS5zdG9yZWRGaWxlID0ge307XHJcbiAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xyXG5cclxuICB9XHJcblxyXG4gIG1pbmltaXpEaWFsb2coKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50U2NhblNlcnZpY2Uub25NaW5pbWl6aW5nLmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZGVkRmlsZXMucHVzaCh7Li4udGhpcy5zZWxlY3RlZEZpbGV9KVxyXG4gICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU3Vic2NyaXB0aW9uKCl7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGxvYWRTdGFydFN1YnNjcmlwdGlvbiA/IHRoaXMudXBsb2FkU3RhcnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6ICcnO1xyXG4gICAgICB0aGlzLmZpbGVDaGFuZ2VTdWJzY3JpcHRpb24gPyB0aGlzLmZpbGVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6ICcnO1xyXG4gICAgfSwgMjAwMCk7XHJcbiAgfVxyXG5cclxuICBzdGFydEFkZGluZ1Byb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS5hZGRpbmdQcm9wZXJ0aWVzTW9kZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlRG9jdW1lbnQoKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50U2NhblNlcnZpY2Uub25NaW5pbWl6aW5nLmVtaXQodHJ1ZSk7XHJcbiAgICB0aGlzLnVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZGVkRmlsZXMucHVzaCh7Li4udGhpcy5zZWxlY3RlZEZpbGV9KTtcclxuICAgIHRoaXMuc2Nhbm5lclVwbG9hZEJ1dHRvbi5jbGljaygpO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RQYXlMb2FkKGZpbGUpIHtcclxuICAgIGxldCBwcm9wcyA9IHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbnN0cnVjdER5bmFtaWNGb3JtUGF5bG9hZChmaWxlLmR5bmFtaWNEYXRhLmRhdGEsIGZpbGUuZHluYW1pY0Zvcm0pO1xyXG4gICAgbGV0IHN0YXRpY0Zvcm1EYXRhID0gdGhpcy5tYXBwaW5nU3RhdGljRGF0YShmaWxlLnN0YXRpY0RhdGEpXHJcblxyXG4gICAgbGV0IHBhcmFtID0ge1xyXG4gICAgICBcImRvY3VtZW50XCI6IHtcclxuICAgICAgICBcInR5cGVcIjogdGhpcy5maWxlVHlwZS50eXBlLFxyXG4gICAgICAgIFwibmFtZVwiOiBmaWxlLnN0YXRpY0RhdGEudGl0bGUsXHJcbiAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuICAgICAgICAgIC4uLnByb3BzLFxyXG4gICAgICAgICAgLi4uc3RhdGljRm9ybURhdGEsXHJcbiAgICAgICAgICBcImZpbGU6Y29udGVudFwiOiB7XHJcbiAgICAgICAgICAgIFwidXBsb2FkLWJhdGNoXCI6IGZpbGUuZmlsZS5ibG9iWyd1cGxvYWQtYmF0Y2gnXSxcclxuICAgICAgICAgICAgXCJ1cGxvYWQtZmlsZUlkXCI6IGZpbGUuZmlsZS5ibG9iWyd1cGxvYWQtZmlsZUlkJ11cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpZiAoZmlsZS5maWxlVHlwZS5kb2N1bWVudENvZGUpIHtcclxuICAgICAgcGFyYW1bXCJkb2N1bWVudFR5cGVDb2RlXCJdID0gZmlsZS5maWxlVHlwZS5kb2N1bWVudENvZGVcclxuICAgIH1cclxuICAgIHJldHVybiB7cGFyYW1zIDogcGFyYW0gLCBvcmlnaW5GaWxlIDogZmlsZX07XHJcbiAgfVxyXG5cclxuICBtYXBwaW5nU3RhdGljRGF0YShkYXRhKXtcclxuICAgIGlmKGRhdGEuZ2RvY3VtZW50RGF0ZSAmJiBkYXRhLmdkb2N1bWVudERhdGUgIT09IG51bGwpe1xyXG4gICAgICBtb21lbnQubG9jYWxlKCdlbicpO1xyXG4gICAgICBkYXRhWydoZG9jdW1lbnREYXRlJ10gPSB0aGlzLmRhdGVIZWxwZXJTZXJ2aWNlLmdyZWdvcmlhblRvSGlqcmkoZGF0YS5nZG9jdW1lbnREYXRlLCdpWVlZWS1pTU0taUREJyk7XHJcbiAgICAgIGRhdGEuZ2RvY3VtZW50RGF0ZSA9IChtb21lbnQoZGF0YS5nZG9jdW1lbnREYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREVDAwOjAwOjAwLjAwMFwiKSArIFwiWlwiKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5hZGFwdE91dChkYXRhICwgdGhpcy5zdGF0aWNGb3JtRmllbGRzKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0RHluYW1pY0Zvcm1QYXlsb2FkKGZpbGUpIHtcclxuICAgIGxldCB1cGRhdGVkRHluYW1pY1ZhbHVlcyA9IHt9XHJcbiAgICBPYmplY3Qua2V5cyhmaWxlPy5keW5hbWljRGF0YT8uZGF0YSkubWFwKGtleSA9PiB7XHJcbiAgICAgIGxldCB1cGRhdGVkS2V5ID0ga2V5LnJlcGxhY2UoJzonLCAnJyk7XHJcbiAgICAgIGxldCBwcmVmaXggPSBmaWxlLmR5bmFtaWNGb3JtLnByZWZpeFt1cGRhdGVkS2V5XTtcclxuICAgICAgaWYgKHByZWZpeCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIGNvbXBvbmVudCBpcyB1c2VyIHNlbGVjdG9yIHRvIG1hcCBpdHMgZGF0YSBmcm9tIG9iamVjdCB0byB1c2VybmFtZSBvciBpZCBvbmx5IFxyXG4gICAgICAgIGlmKGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldICYmIGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd1c2VyU2VsZWN0b3InXSAmJiBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndXNlclNlbGVjdG9yJ10gPT09IHRydWUpe1xyXG4gICAgICAgICAgIHVwZGF0ZWREeW5hbWljVmFsdWVzW3ByZWZpeCArICc6JyArIHVwZGF0ZWRLZXldID0gZmlsZS5keW5hbWljRGF0YS5kYXRhW2tleV1bJ3ZhbHVlJ11bJ2lkJ10gPyBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndmFsdWUnXVsnaWQnXSA6IGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd2YWx1ZSddWydwcm9wZXJ0aWVzJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgdXBkYXRlZER5bmFtaWNWYWx1ZXNbcHJlZml4ICsgJzonICsgdXBkYXRlZEtleV0gPSBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmKGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd1c2VyU2VsZWN0b3InXSAmJiBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndXNlclNlbGVjdG9yJ10gPT09IHRydWUpe1xyXG4gICAgICAgICAgIHVwZGF0ZWREeW5hbWljVmFsdWVzW3VwZGF0ZWRLZXldID0gZmlsZS5keW5hbWljRGF0YS5kYXRhW2tleV1bJ3ZhbHVlJ11bJ2lkJ10gPyBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVsndmFsdWUnXVsnaWQnXSA6IGZpbGUuZHluYW1pY0RhdGEuZGF0YVtrZXldWyd2YWx1ZSddWydwcm9wZXJ0aWVzJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgdXBkYXRlZER5bmFtaWNWYWx1ZXNbdXBkYXRlZEtleV0gPSBmaWxlLmR5bmFtaWNEYXRhLmRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHVwZGF0ZWREeW5hbWljVmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlV2hlbkZpbmlzaCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBjaGFuZ1RhYlRvKHRhYk5hbWUpIHtcclxuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiTmFtZTtcclxuICB9XHJcbiAgY2hlY2tWYWxpZGF0aW9uKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKXtcclxuICAgIHRoaXMubGFuZ1N1YnNjcmlwdGlvbiA/IHRoaXMubGFuZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpIDogJyc7XHJcbiAgICB0aGlzLmFnZW5jeUNhdGVnQ29kZVN1YnNjcmlwdGlvbiA/IHRoaXMuYWdlbmN5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG4gICAgdGhpcy5jb3VudHJ5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uID8gdGhpcy5jb3VudHJ5Q2F0ZWdDb2RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG4gICAgdGhpcy5maWxlRm9ybVN1YnNjcmlwdGlvbiA/IHRoaXMuZmlsZUZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSA6IG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwic2Nhbm5lci1tb2RhbC1ib2R5IHJlbGF0aXZlIGgtZnVsbFwiPlxyXG4gICAgPCEtLSAgLS0+XHJcbiAgICA8IS0tIHRhYnMgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJzY2FubmVyLXRhYnMgZC1mbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlciBib3JkZXItYi0yIGJvcmRlci1ncmF5LTIwMCBtYi01IHRleHQtZ3JheS05MDAgdGV4dC1sZ1wiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInNjYW5uZXItc2luZ2xlLXRhYiBjdXJzb3ItcG9pbnRlciB3LTEvMiB0ZXh0LWNlbnRlciBweS0yIGJvcmRlci1ncmF5LTkwMCBob3ZlcjpiZy1ncmF5LTEwMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ1RhYlRvKCdzY2FuJylcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmb250LWJvbGQgYm9yZGVyLWItNCc6IGFjdGl2ZVRhYiA9PT0gJ3NjYW4nIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3tcIkNSRUFURS5TQ0FOXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJzY2FubmVyLXNpbmdsZS10YWIgY3Vyc29yLXBvaW50ZXIgdy0xLzIgdGV4dC1jZW50ZXIgcHktMiBib3JkZXItZ3JheS05MDAgaG92ZXI6YmctZ3JheS0xMDBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdUYWJUbygnZm9ybScpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZm9udC1ib2xkIGJvcmRlci1iLTQnOiBhY3RpdmVUYWIgPT09ICdmb3JtJyB9XCJcclxuICAgICAgICA+XHJcbiAgICAgICAge3tcIkNSRUFURS5ERVRBSUxTXCIgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1ib2R5LXdyYXBwZXJcIj5cclxuICAgICAgICA8IS0tIHVwbG9hZGVyIGluZGljYXRvciBsb2FkaW5nIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ1cGxvYWQtbG9hZGVyIG14LTJcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInVwbG9hZE1hbmdtZW50U2VydmljZS51cGxvYWRlZEZpbGVzU3RhdHVzLnVwbG9hZEluUHJvZ3Jlc3NcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gc2Nhbm5lciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgW25nQ2xhc3NdPVwieyAnZC1ub25lJzogYWN0aXZlVGFiID09PSAnZm9ybScgfVwiPlxyXG4gICAgICAgICAgICA8YXBwLWRvY3VtZW50LXNjYW5cclxuICAgICAgICAgICAgICAgIFtoaWRlVXBsb2FkQnV0dG9uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3VzZVN0b3JlZEZpbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgID48L2FwcC1kb2N1bWVudC1zY2FuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGZvcm1zIGFuZCBwcm9wZXJ0aWVzICAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybXMtc2VjdGlvblwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Qtbm9uZSc6IGFjdGl2ZVRhYiA9PT0gJ3NjYW4nIH1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMi8zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5GSUxFX1RZUEVcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTkwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0FyYWJpYyA/ICBmaWxlVHlwZS5hcmFiaWNUZXh0IDogZmlsZVR5cGUuZW5nbGlzaFRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZmllbGRzIG10LTNcIiBTZXRSdGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWxlRm9ybVwiICpuZ0lmPVwiZmlsZUZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5USVRMRVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08c3BhbiBjbGFzcz1cInRleHQtcmVkLTUwMFwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7eyAnQ1JFQVRFLlRJVExFJyB8IHRyYW5zbGF0ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5ERVNDUklQVElPTlwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1JFQVRFLkRFU0NSSVBUSU9OJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0gbmV3IHN0YXRpcyBmb3JtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNpbmdFeHRyYUZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZmllbGRzLXJlbmRlcmVyIFtmb3JtXT1cImZpbGVGb3JtXCIgW2FnZW5jeU5hbWVGaWx0ZXJdPVwiYWdlbmN5TmFtZUZpbHRlclwiIFtjb3VudHJ5TmFtZUZpbHRlcl09XCJjb3VudHJ5TmFtZUZpbHRlclwiPjwvYXBwLWR5bmFtaWMtZmllbGRzLXJlbmRlcmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwiQ1JFQVRFLkRPQ1VNRU5UX1NVQkpFQ1RcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxzcGFuIGNsYXNzPVwidGV4dC1yZWQtNTAwXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN1YmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NSRUFURS5ET0NVTUVOVF9TVUJKRUNUJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwiQ1JFQVRFLkRPQ1VNRU5UX05VTUJFUlwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkb2N1bWVudE51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiIHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1JFQVRFLkRPQ1VNRU5UX05VTUJFUicgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjdHMtZHluYW1pYy1mb3JtLWhpanJpLWRhdGVpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdkb2N1bWVudERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkNSRUFURS5ET0NVTUVOVF9EQVRFXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jdHMtZHluYW1pYy1mb3JtLWhpanJpLWRhdGVpdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuU0NSRUNZX0xFVkVMJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kTGFiZWxdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kVmFsdWVdPVwiJ2lkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWT0NBQlVMQVJZLlNFTEVDVF9JVEVNJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2b2NhYnVsYXJ5VHlwZV09XCInVk9DX1NlY3JlY3lMZXZlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWNyZWN5TGV2ZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1keW5hbWljLWZvcm0tdm9jYWJ1bGFyeS1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuSU1QT1JUQU5DRV9MRVZFTCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZExhYmVsXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYWJ1bGFyeVR5cGVdPVwiJ1ZPQ19JbXBvcnRhbmNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImltcG9ydGFuY2VMZXZlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWR5bmFtaWMtZm9ybS12b2NhYnVsYXJ5LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgXCJDUkVBVEUuREVQQVJUTUVOVF9DT0RFXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybS1kZXBhcnRtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlcGFydG1lbnRDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidwbGVhc2Ugc2VsZWN0IGRlcGFydG1lbnQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BwX2RlcGFydG1lbnROZXN0ZWRUcmVlXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BQX09TX0RlcGFydG1lbnRzJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHBfZGVwYXJ0bWVudFRyZWVdPVwiJ1BQX09TX0RlcGFydG1lbnRzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21QcmVmaXhdPVwiJ29zZGVwdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tUGFyZW50UHJvcGVydHldPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3NkZXBhcnRtZW50X3BhcmVudERlcGFydG1lbnRDb2RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlQ3VzdG9tQWRkRWRpdEFjdGlvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtZHluYW1pYy1mb3JtLWRlcGFydG1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWZpZWxkIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXRyYW5zbGF0ZWQtdm9jYWJ1bGFyeS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDUkVBVEUuQUdFTkNZX0NBVEVHT1JZX0NPREUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyYkJpbmRMYWJlbF09XCInbGFiZWxfYXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuZ0JpbmRMYWJlbF09XCInbGFiZWxfZW4nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRWYWx1ZV09XCInaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZPQ0FCVUxBUlkuU0VMRUNUX0lURU0nIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2VuY3lDYXRlZ29yeUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYnVsYXJ5SWRdPVwiJ1ZPQ19BZ2VuY3lDYXRlZ29yeSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlRmlsdGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NSRUFURS5BR0VOQ1lfTkFNRSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJiQmluZExhYmVsXT1cIidsYWJlbF9hcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5nQmluZExhYmVsXT1cIidsYWJlbF9lbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFnZW5jeU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdm9jYnVsYXJ5SWRdPVwiJ1ZPQ19BZ2VuY3knXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJhZ2VuY3lOYW1lRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NSRUFURS5DT1VOVFJZX0NBVEVHT1JZX0NPREUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyYkJpbmRMYWJlbF09XCInbGFiZWxfYXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuZ0JpbmRMYWJlbF09XCInbGFiZWxfZW4nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRWYWx1ZV09XCInaWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZPQ0FCVUxBUlkuU0VMRUNUX0lURU0nIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9zZU9uU2VsZWN0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZVNlbGVjdGVkSXRlbXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5Q2F0ZWdvcnlDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZvY2J1bGFyeUlkXT1cIidWT0NfQ291bnRyeUNhdGVnb3J5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VGaWx0ZXJdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC10cmFuc2xhdGVkLXZvY2FidWxhcnktc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1maWVsZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC10cmFuc2xhdGVkLXZvY2FidWxhcnktc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ1JFQVRFLkNPVU5UUllfTkFNRSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJiQmluZExhYmVsXT1cIidsYWJlbF9hcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5nQmluZExhYmVsXT1cIidsYWJlbF9lbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZFZhbHVlXT1cIidpZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVk9DQUJVTEFSWS5TRUxFQ1RfSVRFTScgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nsb3NlT25TZWxlY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0ZWRJdGVtc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZvY2J1bGFyeUlkXT1cIidWT0NfQ291bnRyeSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImNvdW50cnlOYW1lRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtdHJhbnNsYXRlZC12b2NhYnVsYXJ5LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZmllbGQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1zdHlsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBcIkNSRUFURS5SRU1BUktTXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zdHlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlbWFya3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NSRUFURS5SRU1BUktTJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtcGFydCAtbXgtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRGaWxlLmR5bmFtaWNGb3JtICYmIHNob3dSZW5kZXJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWR5bmFtaWMtZm9ybVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwic2VsZWN0ZWRGaWxlLmR5bmFtaWNGb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cInRlbXBvcmFyeUR5YW5taWNEYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25keW5hbWljRm9ybUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYXBwLWR5bmFtaWMtZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBhY3Rpb25zIGFuZCBidXR0b25zICAtLT5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cInctZnVsbCBkLWZsZXgganVzdGlmeS1iZXR3ZWVuIHNjYW5uZXItYWN0aW9ucy13cmFwcGVyIGFic29sdXRlIGJvdHRvbS0wXCJcclxuICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsYXRpb24tYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cclxuICAgICAgICAgICAgICAgIHt7IFwiQlVUVE9OUy5DQU5DRUxcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbGF0aW9uLWJ1dHRvbiBteC0yXCIgKGNsaWNrKT1cIm1pbmltaXpEaWFsb2coKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgXCJCVVRUT05TLk1JTklNSVpFRFwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tICAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjcmVhdGlvbkZhaWxlZFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lclVwbG9hZEJ1dHRvbi5kaXNhYmxlZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEudmFsaWQgfHxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdvcGFjaXR5LTMwIGN1cnNvci1ub3QtYWxsb3dlZCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXJVcGxvYWRCdXR0b24uZGlzYWJsZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmlsZS5keW5hbWljRGF0YS52YWxpZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVEb2N1bWVudCgpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VibWlzc2lvbi1idXR0b25cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBcIkJVVFRPTlMuVFJZX0FHQUlOXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlRG9jdW1lbnQoKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lclVwbG9hZEJ1dHRvbi5kaXNhYmxlZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3RlZEZpbGUuZHluYW1pY0RhdGEudmFsaWQgfHxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICdvcGFjaXR5LTMwIGN1cnNvci1ub3QtYWxsb3dlZCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXJVcGxvYWRCdXR0b24uZGlzYWJsZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkRmlsZS5keW5hbWljRGF0YS52YWxpZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRm9ybS5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VibWlzc2lvbi1idXR0b25cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyB1cGxvYWRNYW5nbWVudFNlcnZpY2Uuc2NhbkNyZWF0aW9uRmFpbGVkID8gIChcIkJVVFRPTlMuVFJZX0FHQUlOXCIgfCB0cmFuc2xhdGUpIDogKFwiQlVUVE9OUy5DUkVBVEVcIiB8IHRyYW5zbGF0ZSkgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|