gamma-app-controller 1.1.18 → 1.1.20
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/esm2020/lib/application-controller/application-content.service.mjs +1 -1
- package/esm2020/lib/application-controller/application-controller.module.mjs +2 -2
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +2 -1
- package/esm2020/lib/application-controller/page-module/exception-operation/exception-operation.component.mjs +357 -0
- package/esm2020/lib/application-controller/page-module/exception-operation/exception-service.mjs +97 -0
- package/esm2020/lib/application-controller/page-templates/cdr-config/cdr-config.component.mjs +13 -3
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +124 -19
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -2
- package/esm2020/lib/gamma-app-controller.module.mjs +131 -8
- package/esm2020/public-api.mjs +3 -2
- package/fesm2015/gamma-app-controller.mjs +2504 -1842
- package/fesm2015/gamma-app-controller.mjs.map +1 -1
- package/fesm2020/gamma-app-controller.mjs +2497 -1840
- package/fesm2020/gamma-app-controller.mjs.map +1 -1
- package/lib/application-controller/page-module/exception-operation/exception-operation.component.d.ts +76 -0
- package/lib/application-controller/page-module/exception-operation/exception-service.d.ts +21 -0
- package/lib/application-controller/page-templates/cdr-config/cdr-config.component.d.ts +2 -1
- package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +18 -1
- package/lib/gamma-app-controller.module.d.ts +11 -2
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
import { confirm } from 'devextreme/ui/dialog';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../common";
|
|
5
|
+
import * as i2 from "./exception-service";
|
|
6
|
+
import * as i3 from "ngx-toastr";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
import * as i5 from "devextreme-angular/core";
|
|
9
|
+
import * as i6 from "devextreme-angular/ui/nested";
|
|
10
|
+
import * as i7 from "devextreme-angular/ui/data-grid";
|
|
11
|
+
import * as i8 from "devextreme-angular/ui/select-box";
|
|
12
|
+
import * as i9 from "devextreme-angular/ui/tag-box";
|
|
13
|
+
import * as i10 from "devextreme-angular/ui/text-box";
|
|
14
|
+
import * as i11 from "@angular/forms";
|
|
15
|
+
import * as i12 from "@angular/material/icon";
|
|
16
|
+
import * as i13 from "../../loading/loading.component";
|
|
17
|
+
export class ExceptionOperationComponent {
|
|
18
|
+
constructor(commonService, service, toastr) {
|
|
19
|
+
this.commonService = commonService;
|
|
20
|
+
this.service = service;
|
|
21
|
+
this.toastr = toastr;
|
|
22
|
+
this.contentType = "create";
|
|
23
|
+
this.exceptionMainObject = {
|
|
24
|
+
configId: "",
|
|
25
|
+
configName: "",
|
|
26
|
+
datasource: "",
|
|
27
|
+
active: false,
|
|
28
|
+
analyzerType: "",
|
|
29
|
+
dbConfig: "",
|
|
30
|
+
tableName: "",
|
|
31
|
+
dataSelectionType: "",
|
|
32
|
+
fileNameAttributeName: "",
|
|
33
|
+
filterList: [{
|
|
34
|
+
"columnName": "",
|
|
35
|
+
"dataType": "",
|
|
36
|
+
"operator": "",
|
|
37
|
+
"windowFunctionName": "",
|
|
38
|
+
"value": "",
|
|
39
|
+
"dateFormat": "",
|
|
40
|
+
}],
|
|
41
|
+
patternList: [
|
|
42
|
+
{
|
|
43
|
+
"regex": "",
|
|
44
|
+
"sample": "?_??_?",
|
|
45
|
+
"fileAttributes": [],
|
|
46
|
+
"analyzerKeys": [],
|
|
47
|
+
"sequenceKey": "",
|
|
48
|
+
"dynamicArgs": {}
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
this.analyzer_type = [{ key: "numeric_sequence", name: "Numeric Sequence" }, { key: "date_sequence", name: "Date Sequence" }];
|
|
53
|
+
this.isLoader = true;
|
|
54
|
+
}
|
|
55
|
+
ngOnInit() {
|
|
56
|
+
this.getExceptionDataCongigs();
|
|
57
|
+
this.service.getAppSqlFunctionList().subscribe(data => {
|
|
58
|
+
this.functionNameContainer = data;
|
|
59
|
+
});
|
|
60
|
+
this.service.getCdrBrowserOperations().subscribe(data => {
|
|
61
|
+
this.operator_list = data;
|
|
62
|
+
});
|
|
63
|
+
this.service.getAppDatasource().subscribe(data => {
|
|
64
|
+
this.datasourcelist = (data['datasource']) ? data['datasource'] : data;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
getExceptionDataCongigs() {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
this.service.listFileSequenceAnalyzerGroups().subscribe((data) => {
|
|
70
|
+
this.allExceptionConfigDataSource = data;
|
|
71
|
+
this.isLoader = false;
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
editExceptionConfigConfig(data) {
|
|
77
|
+
this.contentType = "edit";
|
|
78
|
+
this.isExceptionConfigCreation = true;
|
|
79
|
+
this.exceptionMainObject = data;
|
|
80
|
+
}
|
|
81
|
+
createExceptionConfig() {
|
|
82
|
+
this.isExceptionConfigCreation = true;
|
|
83
|
+
this.exceptionMainObject = {
|
|
84
|
+
configId: "",
|
|
85
|
+
configName: "",
|
|
86
|
+
datasource: "",
|
|
87
|
+
active: true,
|
|
88
|
+
analyzerType: "",
|
|
89
|
+
dbConfig: "",
|
|
90
|
+
tableName: "",
|
|
91
|
+
dataSelectionType: "",
|
|
92
|
+
fileNameAttributeName: "",
|
|
93
|
+
filterList: [{
|
|
94
|
+
"columnName": "",
|
|
95
|
+
"dataType": "",
|
|
96
|
+
"operator": "",
|
|
97
|
+
"windowFunctionName": "",
|
|
98
|
+
"dateFormat": "",
|
|
99
|
+
"value": ""
|
|
100
|
+
}],
|
|
101
|
+
patternList: [
|
|
102
|
+
{
|
|
103
|
+
"regex": "",
|
|
104
|
+
"sample": "",
|
|
105
|
+
"fileAttributes": [],
|
|
106
|
+
"analyzerKeys": [],
|
|
107
|
+
"sequenceKey": "",
|
|
108
|
+
"dynamicArgs": {}
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
getCancleExceptionCreation() {
|
|
114
|
+
this.isExceptionConfigCreation = false;
|
|
115
|
+
this.exceptionMainObject = {
|
|
116
|
+
configId: "",
|
|
117
|
+
configName: "",
|
|
118
|
+
datasource: "",
|
|
119
|
+
active: true,
|
|
120
|
+
analyzerType: "",
|
|
121
|
+
dbConfig: "",
|
|
122
|
+
tableName: "",
|
|
123
|
+
dataSelectionType: "",
|
|
124
|
+
fileNameAttributeName: "",
|
|
125
|
+
filterList: [{
|
|
126
|
+
"columnName": "",
|
|
127
|
+
"dataType": "",
|
|
128
|
+
"operator": "",
|
|
129
|
+
"windowFunctionName": "",
|
|
130
|
+
"value": "",
|
|
131
|
+
"dateFormat": ""
|
|
132
|
+
}],
|
|
133
|
+
patternList: [
|
|
134
|
+
{
|
|
135
|
+
"regex": "",
|
|
136
|
+
"sample": "",
|
|
137
|
+
"fileAttributes": [],
|
|
138
|
+
"analyzerKeys": [],
|
|
139
|
+
"sequenceKey": "",
|
|
140
|
+
"dynamicArgs": {}
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
getDataConfig(e) {
|
|
146
|
+
}
|
|
147
|
+
getProcessForConfig() {
|
|
148
|
+
this.exceptionMainObject.filterList.push({
|
|
149
|
+
"columnName": "",
|
|
150
|
+
"dataType": "",
|
|
151
|
+
"operator": "",
|
|
152
|
+
"windowFunctionName": "",
|
|
153
|
+
"dateFormat": "",
|
|
154
|
+
"value": ""
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
deleteColume(i) {
|
|
158
|
+
this.exceptionMainObject.filterList.splice(i, 1);
|
|
159
|
+
}
|
|
160
|
+
deleteDynamicArguments(item, key, index) {
|
|
161
|
+
delete this.exceptionMainObject.patternList[index]['dynamicArgs'][key];
|
|
162
|
+
}
|
|
163
|
+
addDynamicArgument(index) {
|
|
164
|
+
let newKey = '';
|
|
165
|
+
let newValue = '';
|
|
166
|
+
this.exceptionMainObject.patternList[index]['dynamicArgs'][newKey] = newValue;
|
|
167
|
+
}
|
|
168
|
+
moveItemForColumns(index, direction) {
|
|
169
|
+
if (index < 0 || index >= this.exceptionMainObject.filterList.length)
|
|
170
|
+
return;
|
|
171
|
+
const newPosition = direction === 'up' ? index - 1 : index + 1;
|
|
172
|
+
if (newPosition < 0 || newPosition >= this.exceptionMainObject.filterList.length)
|
|
173
|
+
return;
|
|
174
|
+
const itemToMove = this.exceptionMainObject.filterList[index];
|
|
175
|
+
this.exceptionMainObject.filterList.splice(index, 1);
|
|
176
|
+
this.exceptionMainObject.filterList.splice(newPosition, 0, itemToMove);
|
|
177
|
+
}
|
|
178
|
+
getAddPatternsConfig() {
|
|
179
|
+
this.exceptionMainObject.patternList.push({
|
|
180
|
+
"regex": "",
|
|
181
|
+
"sample": "",
|
|
182
|
+
"sequenceKey": "",
|
|
183
|
+
"fileAttributes": [],
|
|
184
|
+
"analyzerKeys": [],
|
|
185
|
+
"dynamicArgs": {}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
moveItemForpatterns(index, direction) {
|
|
189
|
+
if (index < 0 || index >= this.exceptionMainObject.patternList.length)
|
|
190
|
+
return;
|
|
191
|
+
const newPosition = direction === 'up' ? index - 1 : index + 1;
|
|
192
|
+
if (newPosition < 0 || newPosition >= this.exceptionMainObject.patternList.length)
|
|
193
|
+
return;
|
|
194
|
+
const itemToMove = this.exceptionMainObject.patternList[index];
|
|
195
|
+
this.exceptionMainObject.patternList.splice(index, 1);
|
|
196
|
+
this.exceptionMainObject.patternList.splice(newPosition, 0, itemToMove);
|
|
197
|
+
}
|
|
198
|
+
deletePatternsColume(i) {
|
|
199
|
+
this.exceptionMainObject.patternList.splice(i, 1);
|
|
200
|
+
}
|
|
201
|
+
onCustomFileAttributesAdd(args) {
|
|
202
|
+
const newValue = args.text;
|
|
203
|
+
args.customItem = newValue;
|
|
204
|
+
const isItemInDataSource = this.exceptionMainObject.patternList['fileAttributes'].some((item) => item === newValue);
|
|
205
|
+
if (!isItemInDataSource) {
|
|
206
|
+
this.exceptionMainObject.patternList['fileAttributes'].unshift(newValue);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
onCustomAnalizerKeyAdd(args) {
|
|
210
|
+
const newValue = args.text;
|
|
211
|
+
args.customItem = newValue;
|
|
212
|
+
const isItemInDataSource = this.exceptionMainObject.patternList['analyzerKeys'].some((item) => item === newValue);
|
|
213
|
+
if (!isItemInDataSource) {
|
|
214
|
+
this.exceptionMainObject.patternList['analyzerKeys'].unshift(newValue);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
updateExceptionConfig() {
|
|
218
|
+
this.loadingModal = true;
|
|
219
|
+
this.service.editFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
|
|
220
|
+
next: (data) => {
|
|
221
|
+
this.isExceptionConfigCreation = false;
|
|
222
|
+
this.loadingModal = false;
|
|
223
|
+
this.isLoader = true;
|
|
224
|
+
this.getExceptionDataCongigs();
|
|
225
|
+
}, error: (err) => {
|
|
226
|
+
this.loadingModal = false;
|
|
227
|
+
this.isLoader = false;
|
|
228
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
console.log(this.exceptionMainObject);
|
|
232
|
+
}
|
|
233
|
+
saveExceptionConfig() {
|
|
234
|
+
for (const element of this.exceptionMainObject.patternList) {
|
|
235
|
+
if (!element.fileAttributes.includes(element.sequenceKey)) {
|
|
236
|
+
this.toastr.error('Sequence Key not valid');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const allMatch = element.analyzerKeys.every(item => element.fileAttributes.includes(item));
|
|
240
|
+
const allKeysMatch = Object.keys(element.dynamicArgs).every(key => element.fileAttributes.includes(key));
|
|
241
|
+
if (!allMatch) {
|
|
242
|
+
this.toastr.error('Analyzer Keys not valid');
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (!allKeysMatch) {
|
|
246
|
+
this.toastr.error('Filler not valid');
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const updatedObj = Object.fromEntries(Object.entries(element.dynamicArgs).map(([key, value]) => [`default_${key}_filter`, value]));
|
|
250
|
+
element.dynamicArgs = updatedObj;
|
|
251
|
+
}
|
|
252
|
+
this.loadingModal = true;
|
|
253
|
+
this.service.saveFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
|
|
254
|
+
next: (data) => {
|
|
255
|
+
this.isExceptionConfigCreation = false;
|
|
256
|
+
this.loadingModal = false;
|
|
257
|
+
this.isLoader = true;
|
|
258
|
+
this.getExceptionDataCongigs();
|
|
259
|
+
}, error: (err) => {
|
|
260
|
+
this.loadingModal = false;
|
|
261
|
+
this.isLoader = false;
|
|
262
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
deleteExceptionConfig(data) {
|
|
267
|
+
let result = confirm("<i>Are You Sure?</i>", "Delete Config");
|
|
268
|
+
result.then((dialogResult) => {
|
|
269
|
+
if (dialogResult) {
|
|
270
|
+
this.loadingModal = true;
|
|
271
|
+
this.service.deleteFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
272
|
+
next: (data) => {
|
|
273
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
274
|
+
this.getExceptionDataCongigs().then(() => {
|
|
275
|
+
if (currentPageIndex !== undefined) {
|
|
276
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
277
|
+
}
|
|
278
|
+
this.isLoader = false;
|
|
279
|
+
this.toastr.success(data.response);
|
|
280
|
+
});
|
|
281
|
+
}, error: (err) => {
|
|
282
|
+
this.loadingModal = false;
|
|
283
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config Delete');
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
activatedException(data) {
|
|
290
|
+
let result = confirm("<i>Are You Sure?</i>", "Activate Config");
|
|
291
|
+
result.then((dialogResult) => {
|
|
292
|
+
if (dialogResult) {
|
|
293
|
+
this.service.activateFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
294
|
+
next: (data) => {
|
|
295
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
296
|
+
this.getExceptionDataCongigs().then(() => {
|
|
297
|
+
if (currentPageIndex !== undefined) {
|
|
298
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
299
|
+
}
|
|
300
|
+
this.isLoader = false;
|
|
301
|
+
this.toastr.success(data.response);
|
|
302
|
+
});
|
|
303
|
+
}, error: (err) => {
|
|
304
|
+
console.log(err);
|
|
305
|
+
this.loadingModal = false;
|
|
306
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
deActivatedException(data) {
|
|
313
|
+
let result = confirm("<i>Are You Sure?</i>", "Deactivate Config");
|
|
314
|
+
result.then((dialogResult) => {
|
|
315
|
+
if (dialogResult) {
|
|
316
|
+
this.service.deactivateFileSequenceAnalyzerGroup(data.configId).subscribe({
|
|
317
|
+
next: (data) => {
|
|
318
|
+
const currentPageIndex = this.dataGrid?.instance.pageIndex();
|
|
319
|
+
this.getExceptionDataCongigs().then(() => {
|
|
320
|
+
if (currentPageIndex !== undefined) {
|
|
321
|
+
this.dataGrid.instance.pageIndex(currentPageIndex);
|
|
322
|
+
}
|
|
323
|
+
this.isLoader = false;
|
|
324
|
+
this.toastr.success(data.response);
|
|
325
|
+
});
|
|
326
|
+
}, error: (err) => {
|
|
327
|
+
console.log(err);
|
|
328
|
+
this.loadingModal = false;
|
|
329
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
updateFileSequenceAnalyzerJobs() {
|
|
336
|
+
this.loadingModal = true;
|
|
337
|
+
this.service.updateFileSequenceAnalyzerJobs().subscribe({
|
|
338
|
+
next: (data) => {
|
|
339
|
+
this.loadingModal = false;
|
|
340
|
+
this.toastr.success("File Sequence Analyzer Jobs Updated");
|
|
341
|
+
}, error: err => {
|
|
342
|
+
this.loadingModal = false;
|
|
343
|
+
this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
ExceptionOperationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, deps: [{ token: i1.CommonService }, { token: i2.ExceptionConfigsService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
349
|
+
ExceptionOperationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ExceptionOperationComponent, selector: "app-exception-operation", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: ["gridContainer"], descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i6.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i7.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i6.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i6.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i6.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i6.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i8.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i10.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.LoadingComponent, selector: "app-loading" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] });
|
|
350
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, decorators: [{
|
|
351
|
+
type: Component,
|
|
352
|
+
args: [{ selector: 'app-exception-operation', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>" }]
|
|
353
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ExceptionConfigsService }, { type: i3.ToastrService }]; }, propDecorators: { dataGrid: [{
|
|
354
|
+
type: ViewChild,
|
|
355
|
+
args: ['gridContainer', { static: false }]
|
|
356
|
+
}] } });
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1tb2R1bGUvZXhjZXB0aW9uLW9wZXJhdGlvbi9leGNlcHRpb24tb3BlcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9wYWdlLW1vZHVsZS9leGNlcHRpb24tb3BlcmF0aW9uL2V4Y2VwdGlvbi1vcGVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFXL0MsTUFBTSxPQUFPLDJCQUEyQjtJQStDdEMsWUFDUyxhQUE0QixFQUMzQixPQUFnQyxFQUNoQyxNQUFxQjtRQUZ0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBOUMvQixnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUV2Qix3QkFBbUIsR0FBRztZQUNwQixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxFQUFFO1lBQ1osU0FBUyxFQUFFLEVBQUU7WUFDYixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLHFCQUFxQixFQUFFLEVBQUU7WUFDekIsVUFB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QU0sQ0FBQyxLQUFLLENBQUMsMkRBQTJELEVBQUUsa0JBQWtCLENBQUMsQ0FBQztvQkFDckcsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDhCQUE4QjtRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3RELElBQUksRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFFMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQTtZQUM1RCxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBRXJHLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDOzt3SEEzWVUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsMEtDYnhDLHUvMEJBMlpNOzJGRDlZTywyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UseUJBQXlCO3NLQUtZLFFBQVE7c0JBQXRELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJ2RldmV4dHJlbWUvdWkvZGlhbG9nJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IHsgRXhjZXB0aW9uQ29uZmlnc1NlcnZpY2UgfSBmcm9tICcuL2V4Y2VwdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZXhjZXB0aW9uLW9wZXJhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9leGNlcHRpb24tb3BlcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEV4Y2VwdGlvbk9wZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgZGF0YUdyaWQ6IER4RGF0YUdyaWRDb21wb25lbnQ7XG5cbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICBjb250ZW50VHlwZSA9IFwiY3JlYXRlXCI7XG4gIGZ1bmN0aW9uTmFtZUNvbnRhaW5lcjogYW55O1xuICBleGNlcHRpb25NYWluT2JqZWN0ID0ge1xuICAgIGNvbmZpZ0lkOiBcIlwiLFxuICAgIGNvbmZpZ05hbWU6IFwiXCIsXG4gICAgZGF0YXNvdXJjZTogXCJcIixcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIGFuYWx5emVyVHlwZTogXCJcIixcbiAgICBkYkNvbmZpZzogXCJcIixcbiAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgZGF0YVNlbGVjdGlvblR5cGU6IFwiXCIsXG4gICAgZmlsZU5hbWVBdHRyaWJ1dGVOYW1lOiBcIlwiLFxuICAgIGZpbHRlckxpc3Q6IFt7XG4gICAgICBcImNvbHVtbk5hbWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0b3JcIjogXCJcIixcbiAgICAgIFwid2luZG93RnVuY3Rpb25OYW1lXCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCIsXG4gICAgICBcImRhdGVGb3JtYXRcIjogXCJcIixcbiAgICB9XSxcbiAgICBwYXR0ZXJuTGlzdDogW1xuICAgICAge1xuICAgICAgICBcInJlZ2V4XCI6IFwiXCIsXG4gICAgICAgIFwic2FtcGxlXCI6IFwiP18/P18/XCIsXG4gICAgICAgIFwiZmlsZUF0dHJpYnV0ZXNcIjogW1xuXG4gICAgICAgIF0sXG4gICAgICAgIFwiYW5hbHl6ZXJLZXlzXCI6IFtcblxuICAgICAgICBdLFxuICAgICAgICBcInNlcXVlbmNlS2V5XCI6IFwiXCIsXG4gICAgICAgIFwiZHluYW1pY0FyZ3NcIjoge1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH1cbiAgYW5hbHl6ZXJfdHlwZSA9IFt7IGtleTogXCJudW1lcmljX3NlcXVlbmNlXCIsIG5hbWU6IFwiTnVtZXJpYyBTZXF1ZW5jZVwiIH0sIHsga2V5OiBcImRhdGVfc2VxdWVuY2VcIiwgbmFtZTogXCJEYXRlIFNlcXVlbmNlXCIgfV1cbiAgb3BlcmF0b3JfbGlzdDogYW55O1xuICBhbGxFeGNlcHRpb25Db25maWdEYXRhU291cmNlOiBhbnk7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbjogYm9vbGVhbjtcbiAgZGF0YXNvdXJjZWxpc3Q6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBFeGNlcHRpb25Db25maWdzU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKTtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwU3FsRnVuY3Rpb25MaXN0KCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgdGhpcy5mdW5jdGlvbk5hbWVDb250YWluZXIgPSBkYXRhO1xuICAgIH0pXG5cbiAgICB0aGlzLnNlcnZpY2UuZ2V0Q2RyQnJvd3Nlck9wZXJhdGlvbnMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLm9wZXJhdG9yX2xpc3QgPSBkYXRhO1xuICAgIH0pXG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcERhdGFzb3VyY2UoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmRhdGFzb3VyY2VsaXN0ID0gKGRhdGFbJ2RhdGFzb3VyY2UnXSkgPyBkYXRhWydkYXRhc291cmNlJ10gOiBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBnZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc2VydmljZS5saXN0RmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cHMoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5hbGxFeGNlcHRpb25Db25maWdEYXRhU291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBlZGl0RXhjZXB0aW9uQ29uZmlnQ29uZmlnKGRhdGEpIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gXCJlZGl0XCJcbiAgICB0aGlzLmlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb24gPSB0cnVlO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdCA9IGRhdGE7XG4gIH1cblxuXG5cbiAgY3JlYXRlRXhjZXB0aW9uQ29uZmlnKCkge1xuICAgIHRoaXMuaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbiA9IHRydWU7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0ID0ge1xuICAgICAgY29uZmlnSWQ6IFwiXCIsXG4gICAgICBjb25maWdOYW1lOiBcIlwiLFxuICAgICAgZGF0YXNvdXJjZTogXCJcIixcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIGFuYWx5emVyVHlwZTogXCJcIixcbiAgICAgIGRiQ29uZmlnOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgZGF0YVNlbGVjdGlvblR5cGU6IFwiXCIsXG4gICAgICBmaWxlTmFtZUF0dHJpYnV0ZU5hbWU6IFwiXCIsXG4gICAgICBmaWx0ZXJMaXN0OiBbe1xuICAgICAgICBcImNvbHVtbk5hbWVcIjogXCJcIixcbiAgICAgICAgXCJkYXRhVHlwZVwiOiBcIlwiLFxuICAgICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICAgIFwid2luZG93RnVuY3Rpb25OYW1lXCI6IFwiXCIsXG4gICAgICAgIFwiZGF0ZUZvcm1hdFwiOiBcIlwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiXCJcbiAgICAgIH1dLFxuICAgICAgcGF0dGVybkxpc3Q6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwicmVnZXhcIjogXCJcIixcbiAgICAgICAgICBcInNhbXBsZVwiOiBcIlwiLFxuICAgICAgICAgIFwiZmlsZUF0dHJpYnV0ZXNcIjogW1xuXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImFuYWx5emVyS2V5c1wiOiBbXG5cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwic2VxdWVuY2VLZXlcIjogXCJcIixcbiAgICAgICAgICBcImR5bmFtaWNBcmdzXCI6IHtcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfVxuXG4gIGdldENhbmNsZUV4Y2VwdGlvbkNyZWF0aW9uKCkge1xuICAgIHRoaXMuaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdCA9IHtcbiAgICAgIGNvbmZpZ0lkOiBcIlwiLFxuICAgICAgY29uZmlnTmFtZTogXCJcIixcbiAgICAgIGRhdGFzb3VyY2U6IFwiXCIsXG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICBhbmFseXplclR5cGU6IFwiXCIsXG4gICAgICBkYkNvbmZpZzogXCJcIixcbiAgICAgIHRhYmxlTmFtZTogXCJcIixcbiAgICAgIGRhdGFTZWxlY3Rpb25UeXBlOiBcIlwiLFxuICAgICAgZmlsZU5hbWVBdHRyaWJ1dGVOYW1lOiBcIlwiLFxuICAgICAgZmlsdGVyTGlzdDogW3tcbiAgICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgICAgXCJvcGVyYXRvclwiOiBcIlwiLFxuICAgICAgICBcIndpbmRvd0Z1bmN0aW9uTmFtZVwiOiBcIlwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiXCIsXG4gICAgICAgIFwiZGF0ZUZvcm1hdFwiOiBcIlwiXG4gICAgICB9XSxcbiAgICAgIHBhdHRlcm5MaXN0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcInJlZ2V4XCI6IFwiXCIsXG4gICAgICAgICAgXCJzYW1wbGVcIjogXCJcIixcbiAgICAgICAgICBcImZpbGVBdHRyaWJ1dGVzXCI6IFtcblxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJhbmFseXplcktleXNcIjogW1xuXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInNlcXVlbmNlS2V5XCI6IFwiXCIsXG4gICAgICAgICAgXCJkeW5hbWljQXJnc1wiOiB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuXG4gIH1cblxuXG4gIGdldFByb2Nlc3NGb3JDb25maWcoKSB7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3QucHVzaCh7XG4gICAgICBcImNvbHVtbk5hbWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0b3JcIjogXCJcIixcbiAgICAgIFwid2luZG93RnVuY3Rpb25OYW1lXCI6IFwiXCIsXG4gICAgICBcImRhdGVGb3JtYXRcIjogXCJcIixcbiAgICAgIFwidmFsdWVcIjogXCJcIlxuICAgIH0pXG4gIH1cblxuICBkZWxldGVDb2x1bWUoaSkge1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0LnNwbGljZShpLCAxKVxuICB9XG5cbiAgZGVsZXRlRHluYW1pY0FyZ3VtZW50cyhpdGVtLCBrZXksIGluZGV4KSB7XG4gICAgZGVsZXRlIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFtpbmRleF1bJ2R5bmFtaWNBcmdzJ11ba2V5XTtcbiAgfVxuICBhZGREeW5hbWljQXJndW1lbnQoaW5kZXgpIHtcbiAgICBsZXQgbmV3S2V5ID0gJyc7XG4gICAgbGV0IG5ld1ZhbHVlID0gJyc7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0W2luZGV4XVsnZHluYW1pY0FyZ3MnXVtuZXdLZXldID0gbmV3VmFsdWU7XG4gIH1cblxuXG5cbiAgbW92ZUl0ZW1Gb3JDb2x1bW5zKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3QubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdFtpbmRleF07XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGl0ZW1Ub01vdmUpO1xuICB9XG5cblxuXG4gIGdldEFkZFBhdHRlcm5zQ29uZmlnKCkge1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5wdXNoKHtcbiAgICAgIFwicmVnZXhcIjogXCJcIixcbiAgICAgIFwic2FtcGxlXCI6IFwiXCIsXG4gICAgICBcInNlcXVlbmNlS2V5XCI6IFwiXCIsXG4gICAgICBcImZpbGVBdHRyaWJ1dGVzXCI6IFtdLFxuICAgICAgXCJhbmFseXplcktleXNcIjogW10sXG4gICAgICBcImR5bmFtaWNBcmdzXCI6IHt9XG4gICAgfSlcbiAgfVxuXG4gIG1vdmVJdGVtRm9ycGF0dGVybnMoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3QubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICd1cCcgPyBpbmRleCAtIDEgOiBpbmRleCArIDE7XG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3QubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0W2luZGV4XTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3Quc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTtcbiAgfVxuXG4gIGRlbGV0ZVBhdHRlcm5zQ29sdW1lKGkpIHtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3Quc3BsaWNlKGksIDEpXG4gIH1cblxuICBvbkN1c3RvbUZpbGVBdHRyaWJ1dGVzQWRkKGFyZ3MpIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGFyZ3MudGV4dDtcbiAgICBhcmdzLmN1c3RvbUl0ZW0gPSBuZXdWYWx1ZTtcbiAgICBjb25zdCBpc0l0ZW1JbkRhdGFTb3VyY2UgPSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbJ2ZpbGVBdHRyaWJ1dGVzJ10uc29tZSgoaXRlbSkgPT4gaXRlbSA9PT0gbmV3VmFsdWUpO1xuICAgIGlmICghaXNJdGVtSW5EYXRhU291cmNlKSB7XG4gICAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbJ2ZpbGVBdHRyaWJ1dGVzJ10udW5zaGlmdChuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25DdXN0b21BbmFsaXplcktleUFkZChhcmdzKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBhcmdzLnRleHQ7XG4gICAgYXJncy5jdXN0b21JdGVtID0gbmV3VmFsdWU7XG4gICAgY29uc3QgaXNJdGVtSW5EYXRhU291cmNlID0gdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0WydhbmFseXplcktleXMnXS5zb21lKChpdGVtKSA9PiBpdGVtID09PSBuZXdWYWx1ZSk7XG4gICAgaWYgKCFpc0l0ZW1JbkRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFsnYW5hbHl6ZXJLZXlzJ10udW5zaGlmdChuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG5cblxuICB1cGRhdGVFeGNlcHRpb25Db25maWcoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5lZGl0RmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cCh0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ3JlYXRlIEV4Y2VwdGlvbiBDb25maWcnKVxuXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zb2xlLmxvZyh0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QpXG4gIH1cbiAgc2F2ZUV4Y2VwdGlvbkNvbmZpZygpIHtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3QpIHtcbiAgICAgIGlmICghZWxlbWVudC5maWxlQXR0cmlidXRlcy5pbmNsdWRlcyhlbGVtZW50LnNlcXVlbmNlS2V5KSkge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignU2VxdWVuY2UgS2V5IG5vdCB2YWxpZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsbE1hdGNoID0gZWxlbWVudC5hbmFseXplcktleXMuZXZlcnkoaXRlbSA9PiBlbGVtZW50LmZpbGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgIGNvbnN0IGFsbEtleXNNYXRjaCA9IE9iamVjdC5rZXlzKGVsZW1lbnQuZHluYW1pY0FyZ3MpLmV2ZXJ5KGtleSA9PiBlbGVtZW50LmZpbGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpO1xuXG4gICAgICBpZiAoIWFsbE1hdGNoKSB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdBbmFseXplciBLZXlzIG5vdCB2YWxpZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghYWxsS2V5c01hdGNoKSB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdGaWxsZXIgbm90IHZhbGlkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZE9iaiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZWxlbWVudC5keW5hbWljQXJncykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtgZGVmYXVsdF8ke2tleX1fZmlsdGVyYCwgdmFsdWVdKVxuICAgICAgKTtcbiAgICAgIGVsZW1lbnQuZHluYW1pY0FyZ3MgPSB1cGRhdGVkT2JqO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2Uuc2F2ZUZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXAodGhpcy5leGNlcHRpb25NYWluT2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzRXhjZXB0aW9uQ29uZmlnQ3JlYXRpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0NyZWF0ZSBFeGNlcHRpb24gQ29uZmlnJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBkZWxldGVFeGNlcHRpb25Db25maWcoZGF0YSkge1xuICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWxldGUgQ29uZmlnXCIpO1xuICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlXG4gICAgICAgIHRoaXMuc2VydmljZS5kZWxldGVGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwKGRhdGEuY29uZmlnSWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VJbmRleCA9IHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlLnBhZ2VJbmRleCgpO1xuICAgICAgICAgICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5wYWdlSW5kZXgoY3VycmVudFBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKGRhdGEucmVzcG9uc2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDRFIgQ29uZmlnIERlbGV0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlZEV4Y2VwdGlvbihkYXRhKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkFjdGl2YXRlIENvbmZpZ1wiKTtcbiAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2VydmljZS5hY3RpdmF0ZUZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXAoZGF0YS5jb25maWdJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UucGFnZUluZGV4KCk7XG4gICAgICAgICAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnBhZ2VJbmRleChjdXJyZW50UGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoZGF0YS5yZXNwb25zZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFeGNlcHRpb24gQ29uZmlnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGRlQWN0aXZhdGVkRXhjZXB0aW9uKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiRGVhY3RpdmF0ZSBDb25maWdcIik7XG4gICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICB0aGlzLnNlcnZpY2UuZGVhY3RpdmF0ZUZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXAoZGF0YS5jb25maWdJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UucGFnZUluZGV4KCk7XG4gICAgICAgICAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnBhZ2VJbmRleChjdXJyZW50UGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoZGF0YS5yZXNwb25zZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFeGNlcHRpb24gQ29uZmlnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJKb2JzKCkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlcnZpY2UudXBkYXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJKb2JzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiRmlsZSBTZXF1ZW5jZSBBbmFseXplciBKb2JzIFVwZGF0ZWRcIilcbiAgICAgIH0sIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXhjZXB0aW9uIENvbmZpZycpO1xuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iICBkYXJrOmJnLXRyYW5zcGFyZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCAgZmxleC1jb2wgbWwtMVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4ICBpdGVtcy1jZW50ZXIgZmxvYXQtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbi1zaXplLTJcIiBbc3ZnSWNvbl09XCInaGVyb2ljb25zX3NvbGlkOnRlbXBsYXRlJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aDJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0yeGwgbWQ6dGV4dC0yeGwgcHktMyBmb250LWV4dHJhYm9sZCBpdGVtcy1jZW50ZXIgbWwtMiB0cmFja2luZy10aWdodCBsZWFkaW5nLTUgdHJ1bmNhdGUgY2FwaXRhbGl6ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIENvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWwtMiBwLTAgbS0wXCI+XG5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEgaC1mdWxsIGJvcmRlci1sLTJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBwLTFcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlRXhjZXB0aW9uQ29uZmlnKClcIj5DcmVhdGUgQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm0tMyBwLTQgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLWxnIHNoYWRvdy1tZCBkYXJrOmJnLWdyYXktODAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0yIGZvbnQtYm9sZCB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTNcIj48aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLXRhYmxlIG1yLTJcIj48L2k+IEZpbGUgU2VxdWVuY2UgQW5hbHl6ZXIgY29uZmlncyB8IFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX1cIiAoY2xpY2spPVwidXBkYXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJKb2JzKClcIj5VcGRhdGU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICA8IS0tIDxhcHAtbG9hZGVyICpuZ0lmPVwiaXNMb2FkZXJcIj48L2FwcC1sb2FkZXI+IC0tPlxuICAgICAgICAgICAgPGR4LWRhdGEtZ3JpZCBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIiBbZGF0YVNvdXJjZV09XCJhbGxFeGNlcHRpb25Db25maWdEYXRhU291cmNlXCIgW3NlbGVjdGVkUm93S2V5c109XCJbXVwiXG4gICAgICAgICAgICAgICAgW3Nob3dCb3JkZXJzXT1cInRydWVcIiBbc2hvd1Jvd0xpbmVzXT1cInRydWVcIiBpZD1cImdyaWRDb250YWluZXJcIiBbaG92ZXJTdGF0ZUVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNMb2FkZXJcIj5cblxuICAgICAgICAgICAgICAgIDxkeG8tc2VhcmNoLXBhbmVsIFtoaWdobGlnaHRDYXNlU2Vuc2l0aXZlXT1cInRydWVcIiBbdmlzaWJsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPC9keG8tc2VhcmNoLXBhbmVsPlxuICAgICAgICAgICAgICAgIDxkeG8tZXhwb3J0IFtlbmFibGVkXT1cInRydWVcIiBmaWxlTmFtZT1cImFsZXJ0X2RhdGFfYnlfc3RhdHVzXCI+PC9keG8tZXhwb3J0PlxuICAgICAgICAgICAgICAgIDxkeG8tcGFnaW5nIFtwYWdlU2l6ZV09XCIxMFwiPjwvZHhvLXBhZ2luZz5cbiAgICAgICAgICAgICAgICA8ZHhvLXBhZ2VyIFtzaG93SW5mb109XCJ0cnVlXCIgW3Nob3dQYWdlU2l6ZVNlbGVjdG9yXT1cInRydWVcIiBbYWxsb3dlZFBhZ2VTaXplc109XCJbMTAsMjAsNTAsMTAwXVwiPlxuICAgICAgICAgICAgICAgIDwvZHhvLXBhZ2VyPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImNvbmZpZ05hbWVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZGF0YXNvdXJjZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJkYkNvbmZpZ1wiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJhbmFseXplclR5cGVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZmlsZU5hbWVBdHRyaWJ1dGVOYW1lXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImRhdGFTZWxlY3Rpb25UeXBlXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGNhcHRpb249XCJTdGF0dXNcIiBkYXRhRmllbGQ9XCJhY3RpdmVcIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGUxXCI+PC9keGktY29sdW1uPlxuXG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiYWN0aW9uXCIgY2VsbFRlbXBsYXRlPVwiY2VsbFRlbXBsYXRlXCIgW2ZpeGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uPVwicmlnaHRcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjZWxsVGVtcGxhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuUHJpbWFyeUJsdWV9fVwiIChjbGljayk9XCJlZGl0RXhjZXB0aW9uQ29uZmlnQ29uZmlnKGRhdGEuZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5QcmltYXJ5Qmx1ZX19XCIgKm5nSWY9XCJkYXRhLmRhdGEuYWN0aXZlID09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0RXhjZXB0aW9uQ29uZmlnQ29uZmlnKGRhdGEuZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9tZH19XCIgKGNsaWNrKT1cImRlbGV0ZUV4Y2VwdGlvbkNvbmZpZyhkYXRhLmRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjZWxsVGVtcGxhdGUxJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEuZGF0YS5hY3RpdmUgPT0gdHJ1ZVwiIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0blN1Y2Nlc3NHcmVlbn19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZUFjdGl2YXRlZEV4Y2VwdGlvbihkYXRhLmRhdGEpXCI+QWN0aXZlPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLmRhdGEuYWN0aXZlID09IGZhbHNlXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuV2FybmluZ1llbGxvd319XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmF0ZWRFeGNlcHRpb24oZGF0YS5kYXRhKVwiPkluYWN0aXZlPC9idXR0b24+XG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2R4LWRhdGEtZ3JpZD5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNFeGNlcHRpb25Db25maWdDcmVhdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtLTMgcC00IGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWQgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgICAgIDxoNlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTIgdGV4dC1sZyB0cmFja2luZy10aWdodCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSBib3JkZXItYiBwYi0zIGZsZXggaXRlbXMtY2VudGVyIGNhcGl0YWxpemVcIj5cbiAgICAgICAgICAgICAgICAgICAge3tjb250ZW50VHlwZX19IEV4Y2VwdGlvbiBDb25maWd1cmF0aW9uc1xuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bk90aGVyc1B1cnBsZX19XCIgKGNsaWNrKT1cImdldENhbmNsZUV4Y2VwdGlvbkNyZWF0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9oNj5cblxuICAgICAgICAgICAgICAgIDwhLS0gIChvblZhbHVlQ2hhbmdlZCk9XCJ2YWx1ZUNoYW5nZUZvckRhdGFiYXNlTmFtZSgkZXZlbnQpXCIgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5Db25maWcgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5jb25maWdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+RGF0YXNvdXJjZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImRhdGFzb3VyY2VsaXN0XCIgWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmRhdGFzb3VyY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkFuYWx5emVyIFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJhbmFseXplcl90eXBlXCIgdmFsdWVFeHByPVwia2V5XCIgZGlzcGxheUV4cHI9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuYW5hbHl6ZXJUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGJvcmRlci1iIG15LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERiIENvbmZpZzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ21vbmdvJywnaW1wYWxhJywncG9zdGdyZXMnLCdteXNxbCcsJ2JpZ3F1ZXJ5J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0RGF0YUNvbmZpZygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmRiQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVGFibGUgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QudGFibGVOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGEgU2VsZWN0aW9uIFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydzZWxlY3QnLCdkaXN0aW5jdCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmRhdGFTZWxlY3Rpb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRmlsZSBDb2x1bW4gTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuZmlsZU5hbWVBdHRyaWJ1dGVOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLWIgbXktNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIgYm9yZGVyLWIgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC0yeGwgZm9udC1leHRyYWJvbGRcIj5GaWx0ZXIgTGlzdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRQcm9jZXNzRm9yQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbXMgb2YgZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0O2xldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+Q29sdW1uIE5hbWU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy5jb2x1bW5OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5PcGVyYXRvcjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJvcGVyYXRvcl9saXN0XCIgdmFsdWVFeHByPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByPVwibmFtZVwiIFsobmdNb2RlbCldPVwiaXRlbXMub3BlcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+RGF0YXR5cGU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtcy5kYXRhVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5TZWxlY3QgRnVuY3Rpb248L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZnVuY3Rpb25OYW1lQ29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW1zLndpbmRvd0Z1bmN0aW9uTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbXMuZGF0YVR5cGUgPT0gJ2RhdGUnIHx8IGl0ZW1zLmRhdGFUeXBlID09ICd0aW1lc3RhbXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+RGF0ZSBGb3JtYXQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy5kYXRlRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+RGVmYXVsdCBWYWx1ZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yQ29sdW1ucyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bWUoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItYiBteS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMiBib3JkZXItYiBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTJ4bCBmb250LWV4dHJhYm9sZFwiPlBhdHRlcm4gTGlzdDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRBZGRQYXR0ZXJuc0NvbmZpZygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIFBhdHRlcm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW1zIG9mIGV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3Q7bGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5SZWdleDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy5yZWdleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzIgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5GaWxlIEF0dHJpYnV0ZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW211bHRpbGluZV09XCJ0cnVlXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEN1c3RvbVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DdXN0b21JdGVtQ3JlYXRpbmcpPVwib25DdXN0b21GaWxlQXR0cmlidXRlc0FkZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtcy5maWxlQXR0cmlidXRlc1wiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8zIHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+U2VxdWVuY2VLZXk8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMuc2VxdWVuY2VLZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzMgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5BbmFseXplciBLZXlzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFttdWx0aWxpbmVdPVwidHJ1ZVwiIFtzaG93U2VsZWN0aW9uQ29udHJvbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRDdXN0b21WYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ3VzdG9tSXRlbUNyZWF0aW5nKT1cIm9uQ3VzdG9tQW5hbGl6ZXJLZXlBZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbXMuYW5hbHl6ZXJLZXlzXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS82IHB4LTIgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0xXCI+U2FtcGxlPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLnNhbXBsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzYgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JwYXR0ZXJucyhpLCAndXAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IGV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JwYXR0ZXJucyhpLCAnZG93bicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVBhdHRlcm5zQ29sdW1lKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIG1iLTJcIj5EeW5hbWljIEFyZ3VtZW50cyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRHluYW1pY0FyZ3VtZW50KGkpXCI+QWRkIEFyZ3VtZW50czwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTVcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXMuZHluYW1pY0FyZ3MgfCBrZXl2YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPiBBcmd1bWVudCBLZXk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmtleVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPiBBcmd1bWVudCBWYWx1ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW1zLmR5bmFtaWNBcmdzW2l0ZW0ua2V5XVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRHluYW1pY0FyZ3VtZW50cyhpdGVtLGl0ZW0ua2V5LGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCIgKm5nSWY9XCJjb250ZW50VHlwZSAhPT0gJ3ZpZXcnXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUV4Y2VwdGlvbkNvbmZpZygpXCIgKm5nSWY9XCJjb250ZW50VHlwZSA9PSAnY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlIEV4Y2VwdGlvbiBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fSBjdXJzb3ItcG9pbnRlciBteC0xIG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUV4Y2VwdGlvbkNvbmZpZygpXCIgKm5nSWY9XCJjb250ZW50VHlwZSA9PSAnZWRpdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSBFeGNlcHRpb24gQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+Il19
|