kwikid-forms 0.6.43 → 0.6.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/bundles/kwikid-forms.umd.js +1020 -835
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.component.js +22 -32
  4. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.definitions.js +2 -1
  5. package/esm2015/lib/builder/builder-form-editor/builder-form-editor.helper.js +2 -4
  6. package/esm2015/lib/builder/builder-form-editor/builder.form-editor.constants.js +5 -5
  7. package/esm2015/lib/builder/builder-form-editor/builder.form-editor.service.js +6 -5
  8. package/esm2015/lib/builder/builder-form-list/builder-forms-list.component.js +4 -6
  9. package/esm2015/lib/builder/builder.component.js +43 -53
  10. package/esm2015/lib/builder/builder.helper.js +11 -13
  11. package/esm2015/lib/renderer/config-converter/config-converter.constants.js +22 -7
  12. package/esm2015/lib/renderer/config-converter/config-converter.helper.js +9 -10
  13. package/esm2015/lib/renderer/config-converter/config-converter.js +61 -37
  14. package/esm2015/lib/renderer/form-view/definitions/form-view.actions.definition.js +1 -1
  15. package/esm2015/lib/renderer/form-view/definitions/form-view.apis.definition.js +1 -1
  16. package/esm2015/lib/renderer/form-view/definitions/form-view.commons.definition.js +2 -1
  17. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +2 -1
  18. package/esm2015/lib/renderer/form-view/definitions/form-view.logs.definition.js +2 -1
  19. package/esm2015/lib/renderer/form-view/form-view.api.service.js +25 -24
  20. package/esm2015/lib/renderer/form-view/form-view.component.js +456 -292
  21. package/esm2015/lib/renderer/form-view/form-view.constants.js +17 -0
  22. package/esm2015/lib/renderer/form-view/form-view.module.js +15 -3
  23. package/esm2015/lib/renderer/form-view/form-view.service.js +6 -7
  24. package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +44 -58
  25. package/esm2015/lib/renderer/form-view/helpers/form-view.camera.helper.js +16 -20
  26. package/esm2015/lib/renderer/form-view/helpers/form-view.defaults.helper.js +36 -97
  27. package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +95 -92
  28. package/esm2015/lib/renderer/form-view/helpers/form-view.form-validations.helper.js +23 -22
  29. package/esm2015/lib/renderer/form-view/helpers/form-view.tasks.helper.js +5 -5
  30. package/esm2015/lib/renderer/form-view/pipes/filter-image-url-or-base64-from-object.pipe.js +34 -0
  31. package/esm2015/lib/renderer/form-view/pipes/filter-video-url-or-base64-from-object.pipe.js +30 -0
  32. package/esm2015/lib/renderer/forms-list/forms-list.component.js +31 -39
  33. package/esm2015/lib/renderer/forms-list/forms-list.definitions.js +2 -1
  34. package/esm2015/lib/renderer/renderer.actions.definitions.js +1 -1
  35. package/esm2015/lib/renderer/renderer.component.js +87 -113
  36. package/esm2015/lib/renderer/renderer.definitions.js +2 -1
  37. package/esm2015/lib/renderer/renderer.helper.js +2 -4
  38. package/fesm2015/kwikid-forms.js +1063 -922
  39. package/fesm2015/kwikid-forms.js.map +1 -1
  40. package/lib/builder/builder-form-editor/builder-form-editor.component.d.ts +4 -5
  41. package/lib/builder/builder-form-editor/builder.form-editor.service.d.ts +0 -1
  42. package/lib/builder/builder-form-list/builder-forms-list.component.d.ts +3 -5
  43. package/lib/renderer/config-converter/config-converter.constants.d.ts +21 -6
  44. package/lib/renderer/config-converter/config-converter.helper.d.ts +1 -0
  45. package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +45 -25
  46. package/lib/renderer/form-view/form-view.api.service.d.ts +0 -1
  47. package/lib/renderer/form-view/form-view.component.d.ts +13 -13
  48. package/lib/renderer/form-view/form-view.constants.d.ts +16 -0
  49. package/lib/renderer/form-view/form-view.module.d.ts +10 -8
  50. package/lib/renderer/form-view/form-view.service.d.ts +1 -2
  51. package/lib/renderer/form-view/helpers/form-view.camera.helper.d.ts +5 -7
  52. package/lib/renderer/form-view/helpers/form-view.defaults.helper.d.ts +4 -6
  53. package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +1 -1
  54. package/lib/renderer/form-view/helpers/form-view.form-validations.helper.d.ts +1 -2
  55. package/lib/renderer/form-view/helpers/form-view.tasks.helper.d.ts +1 -1
  56. package/lib/renderer/form-view/pipes/filter-image-url-or-base64-from-object.pipe.d.ts +7 -0
  57. package/lib/renderer/form-view/pipes/filter-video-url-or-base64-from-object.pipe.d.ts +7 -0
  58. package/lib/renderer/forms-list/forms-list.component.d.ts +1 -2
  59. package/package.json +1 -1
@@ -1,4 +1,6 @@
1
1
  import { __awaiter, __decorate } from "tslib";
2
+ /* eslint-disable no-unused-vars */
3
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
4
  import { Component, EventEmitter, Inject, Input, Output, ViewChild, ViewChildren } from "@angular/core";
3
5
  import { FormGroup } from "@angular/forms";
4
6
  import { TuiPreviewDialogService } from "@taiga-ui/addon-preview";
@@ -17,6 +19,7 @@ import { EMessageType } from "./definitions/form-view.commons.definition";
17
19
  import { EFieldType } from "./definitions/form-view.fields.definition";
18
20
  import { ELogEventType } from "./definitions/form-view.logs.definition";
19
21
  import { KwikIDFormViewApiService } from "./form-view.api.service";
22
+ import { FORM_VIEW_TIMERS } from "./form-view.constants";
20
23
  import { KwikIDFormViewService } from "./form-view.service";
21
24
  import { Apis } from "./helpers/form-view.apis.helper";
22
25
  import { CameraHelper } from "./helpers/form-view.camera.helper";
@@ -35,7 +38,9 @@ import * as i7 from "@taiga-ui/addon-preview";
35
38
  import * as i8 from "@angular/common";
36
39
  import * as i9 from "@angular/forms";
37
40
  import * as i10 from "./helpers/styles-sanitizer.pipe";
38
- import * as i11 from "../../common/pipes/timer-formatter.pipe";
41
+ import * as i11 from "./pipes/filter-image-url-or-base64-from-object.pipe";
42
+ import * as i12 from "./pipes/filter-video-url-or-base64-from-object.pipe";
43
+ import * as i13 from "../../common/pipes/timer-formatter.pipe";
39
44
  export class KwikIDFormViewComponent {
40
45
  constructor(cdRef, formViewService, formViewApiService, pushService, alertService, previewDialogService, dialogService, loaderService, cameraRecordService, ref, renderer) {
41
46
  this.cdRef = cdRef;
@@ -63,18 +68,19 @@ export class KwikIDFormViewComponent {
63
68
  this.fieldGroups = {};
64
69
  this.formFields = [];
65
70
  this.previousFormData = {};
71
+ this.cameraData = {};
66
72
  this.isShowCamera = false;
67
73
  this.isShowCameraFullscreen = false;
68
- this.cameraFieldKey = "";
69
- this.cameraData = undefined;
70
- this.cameraType = undefined;
71
- this.cameraImage = "";
72
- this.cameraVideo = "";
73
- this.cameraConfig = undefined;
74
- this.cameraRecordingTime = 0;
75
- this.cameraRecordingTimerSubcription = undefined;
76
- this.cameraRecordingState = "NONE";
77
- this.cameraRecordingStateSubcription = undefined;
74
+ this.activeCameraFieldKey = "";
75
+ this.activeCameraData = {};
76
+ this.activeCameraType = undefined;
77
+ this.activeCameraImage = "";
78
+ this.activeCameraVideo = "";
79
+ this.activeCameraConfig = undefined;
80
+ this.activeCameraRecordingTime = 0;
81
+ this.activeCameraRecordingTimerSubcription = undefined;
82
+ this.activeCameraRecordingState = "NONE";
83
+ this.activeCameraRecordingStateSubcription = undefined;
78
84
  this.previewProperties = {
79
85
  html: {
80
86
  before: "",
@@ -121,30 +127,30 @@ export class KwikIDFormViewComponent {
121
127
  resetCamera() {
122
128
  this.isShowCamera = false;
123
129
  this.isShowCameraFullscreen = false;
124
- this.cameraFieldKey = "";
125
- this.cameraData = undefined;
126
- this.cameraType = undefined;
127
- this.cameraImage = "";
128
- this.cameraVideo = "";
129
- this.cameraConfig = undefined;
130
- this.cameraRecordingTime = 0;
131
- this.cameraRecordingState = "NONE";
130
+ this.activeCameraFieldKey = "";
131
+ this.activeCameraData = undefined;
132
+ this.activeCameraType = undefined;
133
+ this.activeCameraImage = "";
134
+ this.activeCameraVideo = "";
135
+ this.activeCameraConfig = undefined;
136
+ this.activeCameraRecordingTime = 0;
137
+ this.activeCameraRecordingState = "NONE";
132
138
  }
133
139
  ngOnInit() {
134
140
  (() => __awaiter(this, void 0, void 0, function* () {
135
141
  const res = yield this.initFormConfig(this.formConfig);
136
142
  if (res) {
137
143
  this.loading = false;
138
- this.cameraRecordingTimerSubcription = this.cameraRecordService
144
+ this.activeCameraRecordingTimerSubcription = this.cameraRecordService
139
145
  .getTimerUpdate()
140
146
  .subscribe((time) => {
141
- this.cameraRecordingTime = time;
147
+ this.activeCameraRecordingTime = time;
142
148
  this.ref.detectChanges();
143
149
  });
144
- this.cameraRecordingStateSubcription = this.cameraRecordService
150
+ this.activeCameraRecordingStateSubcription = this.cameraRecordService
145
151
  .getRecordingState()
146
152
  .subscribe((state) => {
147
- this.cameraRecordingState = state;
153
+ this.activeCameraRecordingState = state;
148
154
  this.ref.detectChanges();
149
155
  });
150
156
  }
@@ -167,7 +173,7 @@ export class KwikIDFormViewComponent {
167
173
  if (verifyChange("formData")) {
168
174
  if (checkObjectKeyExists(changes.formData.currentValue, "data") &&
169
175
  checkObjectKeyExists(changes.formData.currentValue, "extendedData")) {
170
- this.formData = Object.assign(Object.assign({}, this.formData), changes.formData.currentValue["data"]);
176
+ this.formData = Object.assign(Object.assign({}, this.formData), changes.formData.currentValue.data);
171
177
  }
172
178
  else {
173
179
  this.formData = Object.assign(Object.assign({}, this.formData), changes.formData.currentValue);
@@ -177,9 +183,9 @@ export class KwikIDFormViewComponent {
177
183
  if (isNotEmptyValue(changes.popupFormCallback.currentValue)) {
178
184
  const popupFormData = checkObjectKeyExists(changes.popupFormCallback.currentValue.popupFormData, "data") &&
179
185
  checkObjectKeyExists(changes.popupFormCallback.currentValue.popupFormData, "extendedData")
180
- ? changes.popupFormCallback.currentValue.popupFormData["data"]
186
+ ? changes.popupFormCallback.currentValue.popupFormData.data
181
187
  : changes.popupFormCallback.currentValue.popupFormData;
182
- const popupFormConfig = changes.popupFormCallback.currentValue.popupFormConfig;
188
+ const { popupFormConfig } = changes.popupFormCallback.currentValue;
183
189
  this.popupFormData = mergeObjects(this.popupFormData, {
184
190
  [popupFormConfig.key]: popupFormData
185
191
  });
@@ -199,7 +205,7 @@ export class KwikIDFormViewComponent {
199
205
  }
200
206
  if (verifyChange("apiCallResponse")) {
201
207
  this.apiCallResponse = changes.apiCallResponse.currentValue;
202
- let field = getFormFieldByKey(this.formFields, this.apiCallResponse.key);
208
+ const field = getFormFieldByKey(this.formFields, this.apiCallResponse.key);
203
209
  const response = (_a = this.apiCallResponse) === null || _a === void 0 ? void 0 : _a.response;
204
210
  switch (field.type) {
205
211
  case EFieldType.FILE:
@@ -209,7 +215,7 @@ export class KwikIDFormViewComponent {
209
215
  api_key: this.apiCallResponse.key,
210
216
  field_key: this.apiCallResponse.key,
211
217
  response_type: "FILE_UPLOAD_API_SUCCESS",
212
- response: response
218
+ response
213
219
  });
214
220
  this.updateFiles(updatedFile, "NORMAL", this.apiCallResponse.key);
215
221
  }
@@ -228,14 +234,20 @@ export class KwikIDFormViewComponent {
228
234
  if (response) {
229
235
  this.resetCamera();
230
236
  const image = response === null || response === void 0 ? void 0 : response.image_url;
231
- this.formData[field.key] = getObjectDeepCopy([image]);
232
- this.mediaFiles[field.key] = getObjectDeepCopy([image]);
233
- this.formGroup.controls[field.key].patchValue(getObjectDeepCopy([image]), {
237
+ const imageOcr = response === null || response === void 0 ? void 0 : response.image_ocr;
238
+ const imageFacematch = response === null || response === void 0 ? void 0 : response.image_facematch;
239
+ const imageWatermark = response === null || response === void 0 ? void 0 : response.image_watermark;
240
+ const imageData = imageOcr || imageFacematch || imageWatermark
241
+ ? Object.assign(Object.assign(Object.assign({ image }, (imageOcr && { ocr: imageOcr })), (imageFacematch && { facematch: imageFacematch })), (imageWatermark && { watermark: imageWatermark })) : image;
242
+ this.formData[field.key] = getObjectDeepCopy([imageData]);
243
+ this.cameraData[field.key] = getObjectDeepCopy(imageData);
244
+ this.mediaFiles[field.key] = getObjectDeepCopy([imageData]);
245
+ this.formGroup.controls[field.key].patchValue(getObjectDeepCopy([imageData]), {
234
246
  emitEvent: false,
235
247
  onlySelf: false
236
248
  });
237
249
  this.formGroup.patchValue({
238
- [field.key]: getObjectDeepCopy([image])
250
+ [field.key]: getObjectDeepCopy([imageData])
239
251
  }, { emitEvent: false });
240
252
  this.formGroup.controls[field.key].updateValueAndValidity({
241
253
  emitEvent: false
@@ -251,6 +263,7 @@ export class KwikIDFormViewComponent {
251
263
  FIELD_CONFIG: field,
252
264
  FORM_FIELDS: this.formFields,
253
265
  FORM_DATA: this.formData,
266
+ CAMERA_DATA: this.cameraData,
254
267
  TASK_DATA: this.taskData,
255
268
  PREVIOUS_FORM_DATA: this.previousFormData,
256
269
  ALL_FORMS_DATA: this.allFormsData,
@@ -271,7 +284,7 @@ export class KwikIDFormViewComponent {
271
284
  api_key: this.apiCallResponse.key,
272
285
  field_key: this.apiCallResponse.key,
273
286
  response_type: "IMAGE_UPLOAD_API_SUCCESS",
274
- response: response
287
+ response
275
288
  });
276
289
  }
277
290
  else {
@@ -289,6 +302,7 @@ export class KwikIDFormViewComponent {
289
302
  this.resetCamera();
290
303
  const video = response === null || response === void 0 ? void 0 : response.video_url;
291
304
  this.formData[field.key] = getObjectDeepCopy([video]);
305
+ this.cameraData[field.key] = getObjectDeepCopy(video);
292
306
  this.mediaFiles[field.key] = getObjectDeepCopy([video]);
293
307
  this.formGroup.controls[field.key].patchValue(getObjectDeepCopy([video]), {
294
308
  emitEvent: false,
@@ -311,6 +325,7 @@ export class KwikIDFormViewComponent {
311
325
  FIELD_CONFIG: field,
312
326
  FORM_FIELDS: this.formFields,
313
327
  FORM_DATA: this.formData,
328
+ CAMERA_DATA: this.cameraData,
314
329
  TASK_DATA: this.taskData,
315
330
  PREVIOUS_FORM_DATA: this.previousFormData,
316
331
  ALL_FORMS_DATA: this.allFormsData,
@@ -331,7 +346,7 @@ export class KwikIDFormViewComponent {
331
346
  api_key: this.apiCallResponse.key,
332
347
  field_key: this.apiCallResponse.key,
333
348
  response_type: "VIDEO_UPLOAD_API_SUCCESS",
334
- response: response
349
+ response
335
350
  });
336
351
  }
337
352
  else {
@@ -347,7 +362,6 @@ export class KwikIDFormViewComponent {
347
362
  case EFieldType.LIVE_LOCATION:
348
363
  if (response) {
349
364
  this.formData[field.key] = getObjectDeepCopy(response);
350
- this.mediaFiles[field.key] = getObjectDeepCopy(response);
351
365
  this.formGroup.controls[field.key].patchValue(getObjectDeepCopy(response), {
352
366
  emitEvent: false,
353
367
  onlySelf: false
@@ -368,6 +382,7 @@ export class KwikIDFormViewComponent {
368
382
  API_RESPONSE: response,
369
383
  FORM_FIELDS: this.formFields,
370
384
  FORM_DATA: this.formData,
385
+ CAMERA_DATA: this.cameraData,
371
386
  TASK_DATA: this.taskData,
372
387
  PREVIOUS_FORM_DATA: this.previousFormData,
373
388
  ALL_FORMS_DATA: this.allFormsData,
@@ -384,6 +399,7 @@ export class KwikIDFormViewComponent {
384
399
  FIELD_CONFIG: field,
385
400
  FORM_FIELDS: this.formFields,
386
401
  FORM_DATA: this.formData,
402
+ CAMERA_DATA: this.cameraData,
387
403
  TASK_DATA: this.taskData,
388
404
  PREVIOUS_FORM_DATA: this.previousFormData,
389
405
  ALL_FORMS_DATA: this.allFormsData,
@@ -405,7 +421,7 @@ export class KwikIDFormViewComponent {
405
421
  api_key: this.apiCallResponse.key,
406
422
  field_key: this.apiCallResponse.key,
407
423
  response_type: "REVERSE_LAT_LONG_API_SUCCESS",
408
- response: response
424
+ response
409
425
  });
410
426
  }
411
427
  else {
@@ -420,6 +436,7 @@ export class KwikIDFormViewComponent {
420
436
  API_RESPONSE: {},
421
437
  FORM_FIELDS: this.formFields,
422
438
  FORM_DATA: this.formData,
439
+ CAMERA_DATA: this.cameraData,
423
440
  TASK_DATA: this.taskData,
424
441
  PREVIOUS_FORM_DATA: this.previousFormData,
425
442
  ALL_FORMS_DATA: this.allFormsData,
@@ -443,15 +460,15 @@ export class KwikIDFormViewComponent {
443
460
  let field = getFormFieldByKey(this.formFields, (_d = this.buttonClickResponse) === null || _d === void 0 ? void 0 : _d.key);
444
461
  if (checkObjectKeyExists(this.buttonClickResponse, "default")) {
445
462
  field.default = getObjectDeepCopy(this.buttonClickResponse.default);
446
- delete this.buttonClickResponse["default"];
463
+ delete this.buttonClickResponse.default;
447
464
  }
448
465
  if (checkObjectKeyExists(this.buttonClickResponse, "messages")) {
449
466
  field.messages = getObjectDeepCopy(this.buttonClickResponse.messages);
450
- delete this.buttonClickResponse["messages"];
467
+ delete this.buttonClickResponse.messages;
451
468
  }
452
469
  if (checkObjectKeyExists(this.buttonClickResponse, "validation")) {
453
470
  field.validation = getObjectDeepCopy(this.buttonClickResponse.validation);
454
- delete this.buttonClickResponse["validation"];
471
+ delete this.buttonClickResponse.validation;
455
472
  }
456
473
  field = getObjectDeepCopy(mergeObjects(field, this.buttonClickResponse));
457
474
  if (checkObjectKeyExists(field, "validation")) {
@@ -461,6 +478,7 @@ export class KwikIDFormViewComponent {
461
478
  FIELD_CONFIG: field,
462
479
  FORM_FIELDS: this.formFields,
463
480
  FORM_DATA: this.formData,
481
+ CAMERA_DATA: this.cameraData,
464
482
  TASK_DATA: this.taskData,
465
483
  PREVIOUS_FORM_DATA: this.previousFormData,
466
484
  ALL_FORMS_DATA: this.allFormsData,
@@ -484,11 +502,11 @@ export class KwikIDFormViewComponent {
484
502
  }
485
503
  }
486
504
  ngOnDestroy() {
487
- if (this.cameraRecordingTimerSubcription) {
488
- this.cameraRecordingTimerSubcription.unsubscribe();
505
+ if (this.activeCameraRecordingTimerSubcription) {
506
+ this.activeCameraRecordingTimerSubcription.unsubscribe();
489
507
  }
490
- if (this.cameraRecordingStateSubcription) {
491
- this.cameraRecordingStateSubcription.unsubscribe();
508
+ if (this.activeCameraRecordingStateSubcription) {
509
+ this.activeCameraRecordingStateSubcription.unsubscribe();
492
510
  }
493
511
  }
494
512
  triggerLogs(eventType, logs) {
@@ -514,11 +532,12 @@ export class KwikIDFormViewComponent {
514
532
  if (checkObjectKeyExists(this.formConfig, "tasks") &&
515
533
  checkObjectKeyExists(this.formConfig.tasks, "pre")) {
516
534
  this.triggerLogs(ELogEventType.FORM__TASK_PRE, {});
517
- for (let preTask of this.formConfig.tasks.pre) {
535
+ for (const preTask of this.formConfig.tasks.pre) {
518
536
  const task = new Tasks(preTask, {
519
537
  FORM_CONFIG: this.formConfig,
520
538
  FORM_FIELDS: this.formFields,
521
539
  FORM_DATA: this.formData,
540
+ CAMERA_DATA: this.cameraData,
522
541
  TASK_DATA: this.taskData,
523
542
  PREVIOUS_FORM_DATA: this.previousFormData,
524
543
  ALL_FORMS_DATA: this.allFormsData,
@@ -539,7 +558,7 @@ export class KwikIDFormViewComponent {
539
558
  clearInterval(intervalId);
540
559
  resolve();
541
560
  }
542
- }, 10);
561
+ }, FORM_VIEW_TIMERS.WAIT_FOR_CHANGES_BEFORE_MOVING_TO_NEXT_TASK);
543
562
  });
544
563
  if (this.stopTaskExecution) {
545
564
  break;
@@ -550,16 +569,24 @@ export class KwikIDFormViewComponent {
550
569
  if (this.stopTaskExecution) {
551
570
  return false;
552
571
  }
553
- this.formGroup = yield this.formViewService.createFormGroup(this.formFields, this.formData, this.previousFormData, this.allFormsData, this.extraData, this.takeAction.bind(this));
572
+ this.formGroup = yield this.formViewService.createFormGroup(this.formFields, {
573
+ FORM_CONFIG: this.formConfig,
574
+ FORM_DATA: this.formData,
575
+ CAMERA_DATA: this.cameraData,
576
+ TASK_DATA: this.taskData,
577
+ PREVIOUS_FORM_DATA: this.previousFormData,
578
+ ALL_FORMS_DATA: this.allFormsData,
579
+ EXTRA_DATA: this.extraData
580
+ }, this.takeAction.bind(this));
554
581
  /**
555
582
  * For some reason if their a field of type 'IMAGE' then
556
583
  * formData is adding a 'undefined' key with last image's value from the array.
557
584
  * Below piece of code is to remove that redundent value from formData.
558
585
  */
559
586
  if (checkObjectKeyExists(this.formData, "undefined")) {
560
- delete this.formData["undefined"];
587
+ delete this.formData.undefined;
561
588
  }
562
- for (let field of this.formFields) {
589
+ for (const field of this.formFields) {
563
590
  if (field.isFormElement) {
564
591
  this.previousFormData = Object.assign(Object.assign({}, this.previousFormData), { [field.key]: convertFormFieldValueToStandardFormat(field, this.formGroup.controls[field.key].value) });
565
592
  this.formData = Object.assign(Object.assign({}, this.formData), { [field.key]: convertFormFieldValueToStandardFormat(field, this.formGroup.controls[field.key].value) });
@@ -568,10 +595,12 @@ export class KwikIDFormViewComponent {
568
595
  }
569
596
  if (field.type === EFieldType.CAPTURE) {
570
597
  this.resetCamera();
598
+ this.cameraData = Object.assign(Object.assign({}, this.cameraData), { [field.key]: convertFormFieldValueToStandardFormat(field, this.formGroup.controls[field.key].value) });
571
599
  this.mediaFiles[field.key] = this.formGroup.controls[field.key].value;
572
600
  }
573
601
  if (field.type === EFieldType.RECORD) {
574
602
  this.resetCamera();
603
+ this.cameraData = Object.assign(Object.assign({}, this.cameraData), { [field.key]: convertFormFieldValueToStandardFormat(field, this.formGroup.controls[field.key].value) });
575
604
  this.mediaFiles[field.key] = this.formGroup.controls[field.key].value;
576
605
  }
577
606
  this.formGroup.controls[field.key].valueChanges
@@ -584,16 +613,18 @@ export class KwikIDFormViewComponent {
584
613
  }
585
614
  if (field.type === EFieldType.CAPTURE) {
586
615
  this.resetCamera();
616
+ this.cameraData = Object.assign(Object.assign({}, this.cameraData), { [field.key]: convertFormFieldValueToStandardFormat(field, currentValue) });
587
617
  this.mediaFiles[field.key] = currentValue;
588
618
  }
589
619
  if (field.type === EFieldType.RECORD) {
590
620
  this.resetCamera();
621
+ this.cameraData = Object.assign(Object.assign({}, this.cameraData), { [field.key]: convertFormFieldValueToStandardFormat(field, currentValue) });
591
622
  this.mediaFiles[field.key] = currentValue;
592
623
  }
593
624
  });
594
625
  }
595
626
  }
596
- for (let field of this.formFields) {
627
+ for (const field of this.formFields) {
597
628
  if (field.isFormElement) {
598
629
  if (checkObjectKeyExists(field, "validation")) {
599
630
  if (field.validation.triggers.includes("ON_INIT")) {
@@ -601,6 +632,7 @@ export class KwikIDFormViewComponent {
601
632
  FIELD_CONFIG: field,
602
633
  FORM_FIELDS: this.formFields,
603
634
  FORM_DATA: this.formData,
635
+ CAMERA_DATA: this.cameraData,
604
636
  TASK_DATA: this.taskData,
605
637
  PREVIOUS_FORM_DATA: this.previousFormData,
606
638
  ALL_FORMS_DATA: this.allFormsData,
@@ -637,7 +669,7 @@ export class KwikIDFormViewComponent {
637
669
  const formData = this.allFormsData[this.formConfig.key];
638
670
  if (checkObjectKeyExists(formData, "data") &&
639
671
  checkObjectKeyExists(formData, "extendedData")) {
640
- this.formData = Object.assign(Object.assign({}, this.formData), formData["data"]);
672
+ this.formData = Object.assign(Object.assign({}, this.formData), formData.data);
641
673
  }
642
674
  else {
643
675
  this.formData = Object.assign(Object.assign({}, this.formData), formData);
@@ -653,18 +685,20 @@ export class KwikIDFormViewComponent {
653
685
  const rulesMapping = new Rule(childFieldGroupConfig.rules, {
654
686
  FIELD_CONFIG: parentField,
655
687
  FORM_DATA: this.formData,
688
+ CAMERA_DATA: this.cameraData,
656
689
  TASK_DATA: this.taskData,
657
690
  PREVIOUS_FORM_DATA: this.previousFormData,
658
691
  ALL_FORMS_DATA: this.allFormsData,
659
692
  EXTRA_DATA: this.extraData
660
693
  }).mapping();
661
- for (let action of childFieldGroupConfig.actions) {
694
+ for (const action of childFieldGroupConfig.actions) {
662
695
  const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate();
663
696
  if (conditionSuccess) {
664
697
  const actions = new Action(action, rulesMapping, {
665
698
  FIELD_CONFIG: parentField,
666
699
  FORM_FIELDS: this.formFields,
667
700
  FORM_DATA: this.formData,
701
+ CAMERA_DATA: this.cameraData,
668
702
  TASK_DATA: this.taskData,
669
703
  PREVIOUS_FORM_DATA: this.previousFormData,
670
704
  ALL_FORMS_DATA: this.allFormsData,
@@ -691,18 +725,20 @@ export class KwikIDFormViewComponent {
691
725
  const rulesMapping = new Rule(connectedFieldConfig.rules, {
692
726
  FIELD_CONFIG: connectedField,
693
727
  FORM_DATA: this.formData,
728
+ CAMERA_DATA: this.cameraData,
694
729
  TASK_DATA: this.taskData,
695
730
  PREVIOUS_FORM_DATA: this.previousFormData,
696
731
  ALL_FORMS_DATA: this.allFormsData,
697
732
  EXTRA_DATA: this.extraData
698
733
  }).mapping();
699
- for (let action of connectedFieldConfig.actions) {
734
+ for (const action of connectedFieldConfig.actions) {
700
735
  const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate();
701
736
  if (conditionSuccess) {
702
737
  const actions = new Action(action, rulesMapping, {
703
738
  FORM_FIELDS: this.formFields,
704
739
  FIELD_CONFIG: connectedField,
705
740
  FORM_DATA: this.formData,
741
+ CAMERA_DATA: this.cameraData,
706
742
  TASK_DATA: this.taskData,
707
743
  PREVIOUS_FORM_DATA: this.previousFormData,
708
744
  ALL_FORMS_DATA: this.allFormsData,
@@ -717,7 +753,7 @@ export class KwikIDFormViewComponent {
717
753
  }
718
754
  handleConnectedElementFields(currentField, connectedFieldConfig, eventType, nested) {
719
755
  return __awaiter(this, void 0, void 0, function* () {
720
- let connectedField = getFormFieldByKey(this.formFields, connectedFieldConfig["key"]);
756
+ let connectedField = getFormFieldByKey(this.formFields, connectedFieldConfig.key);
721
757
  if (checkObjectKeyExists(connectedFieldConfig, "triggers")) {
722
758
  if (connectedFieldConfig.triggers.includes(eventType)) {
723
759
  connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
@@ -737,14 +773,14 @@ export class KwikIDFormViewComponent {
737
773
  if (currentField !== undefined) {
738
774
  if (checkObjectKeyExists(currentField, "connectedElements")) {
739
775
  if (checkObjectKeyExists(currentField.connectedElements, "connectedFieldGroups")) {
740
- let connectedFieldGroups = currentField.connectedElements.connectedFieldGroups;
741
- for (let connectedFieldGroupConfig of connectedFieldGroups) {
776
+ const { connectedFieldGroups } = currentField.connectedElements;
777
+ for (const connectedFieldGroupConfig of connectedFieldGroups) {
742
778
  yield this.handleConnectedElementFieldGroup(currentField, connectedFieldGroupConfig, eventType);
743
779
  }
744
780
  }
745
781
  if (checkObjectKeyExists(currentField.connectedElements, "connectedFields")) {
746
- let connectedFields = currentField.connectedElements.connectedFields;
747
- for (let connectedFieldConfig of connectedFields) {
782
+ const { connectedFields } = currentField.connectedElements;
783
+ for (const connectedFieldConfig of connectedFields) {
748
784
  currentField = yield this.handleConnectedElementFields(currentField, connectedFieldConfig, eventType, eventType);
749
785
  }
750
786
  }
@@ -758,7 +794,7 @@ export class KwikIDFormViewComponent {
758
794
  handleRemovedFile(e) {
759
795
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
760
796
  this.showApiLoader();
761
- if (this.formGroup["controls"][e.key].enabled) {
797
+ if (this.formGroup.controls[e.key].enabled) {
762
798
  this.files[e.key] = e.files;
763
799
  this.formData[e.key] = filterDuplicatesFiles(this.files[e.key]);
764
800
  this.formGroup.patchValue({
@@ -773,7 +809,7 @@ export class KwikIDFormViewComponent {
773
809
  key: field === null || field === void 0 ? void 0 : field.key,
774
810
  type: field === null || field === void 0 ? void 0 : field.type,
775
811
  payload: {
776
- field: field,
812
+ field,
777
813
  event: e
778
814
  }
779
815
  });
@@ -783,7 +819,7 @@ export class KwikIDFormViewComponent {
783
819
  return __awaiter(this, void 0, void 0, function* () {
784
820
  this.showApiLoader();
785
821
  const field = getFormFieldByKey(this.formFields, e.key);
786
- let values = Array.isArray(e.value) ? e.value : [e.value];
822
+ const values = Array.isArray(e.value) ? e.value : [e.value];
787
823
  if (checkObjectKeyExists(field, "properties") &&
788
824
  checkObjectKeyExists(field.properties, "uploadFileToServer") &&
789
825
  field.properties.uploadFileToServer) {
@@ -805,7 +841,7 @@ export class KwikIDFormViewComponent {
805
841
  lastModified: value.lastModified,
806
842
  webkitRelativePath: value.webkitRelativePath
807
843
  });
808
- }, 300); // 1000 ms = 1 sec
844
+ }, FORM_VIEW_TIMERS.WAIT_FOR_FILE_METADATA_DEEPCOPY); // 1000 ms = 1 sec
809
845
  }));
810
846
  this.updateFiles(updatedFile, "NORMAL", e.key);
811
847
  }
@@ -816,17 +852,46 @@ export class KwikIDFormViewComponent {
816
852
  /** Methods for Camera related fields like 'CAPTURE' or 'RECORD' */
817
853
  handleOnClickGetRemovedMediaFile(e) {
818
854
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
819
- this.showApiLoader();
820
- if (this.formGroup["controls"][e.key].enabled) {
855
+ if (this.formGroup.controls[e.key].enabled) {
856
+ this.showApiLoader();
857
+ const field = getFormFieldByKey(this.formFields, e.key);
821
858
  this.resetCamera();
822
859
  this.mediaFiles[e.key] = e.mediaFiles;
823
860
  this.formData[e.key] = filterDuplicatesMediaFiles(this.mediaFiles[e.key]);
861
+ this.cameraData[e.key] = convertFormFieldValueToStandardFormat(field, this.formData[e.key]);
824
862
  this.formGroup.patchValue({
825
863
  [e.key]: this.formData[e.key]
826
864
  }, { emitEvent: false });
827
865
  this.triggerLogs(ELogEventType.FORM__FIELD_MEDIA_FILE_REMOVE, Object.assign(Object.assign(Object.assign({ field_key: e.key }, ((_b = (_a = e.file) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : { file_name: (_c = e.file) === null || _c === void 0 ? void 0 : _c.name })), ((_e = (_d = e.file) === null || _d === void 0 ? void 0 : _d.size) !== null && _e !== void 0 ? _e : { file_size: (_f = e.file) === null || _f === void 0 ? void 0 : _f.size })), ((_h = (_g = e.file) === null || _g === void 0 ? void 0 : _g.type) !== null && _h !== void 0 ? _h : { file_type: (_j = e.file) === null || _j === void 0 ? void 0 : _j.type })));
866
+ this.getUnsavedDataState.emit(true);
867
+ if (field.isFormElement &&
868
+ checkObjectKeyExists(field, "validation") &&
869
+ field.validation.triggers.includes("ON_CHANGE")) {
870
+ const ruleEngine = new RuleEngine({
871
+ FIELD_CONFIG: field,
872
+ FORM_FIELDS: this.formFields,
873
+ FORM_DATA: this.formData,
874
+ CAMERA_DATA: this.cameraData,
875
+ TASK_DATA: this.taskData,
876
+ PREVIOUS_FORM_DATA: this.previousFormData,
877
+ ALL_FORMS_DATA: this.allFormsData,
878
+ EXTRA_DATA: this.extraData
879
+ }, this.takeAction.bind(this));
880
+ (() => __awaiter(this, void 0, void 0, function* () {
881
+ yield ruleEngine.run(field.validation);
882
+ }))();
883
+ }
884
+ if (field.isFormElement &&
885
+ checkObjectKeyExists(field, "connectedElements")) {
886
+ this.handleConnectedElements({
887
+ key: field.key,
888
+ value: this.formGroup.controls[field.key].value
889
+ }, "ON_CHANGE");
890
+ }
891
+ setTimeout(() => {
892
+ this.hideApiLoader();
893
+ }, 500);
828
894
  }
829
- this.hideApiLoader();
830
895
  }
831
896
  handleOnClickInputCamera(e, field) {
832
897
  var _a, _b, _c, _d, _e, _f;
@@ -836,35 +901,42 @@ export class KwikIDFormViewComponent {
836
901
  fullscreen: true
837
902
  });
838
903
  const fieldKey = field.key;
839
- const fieldcameraConfig = (_b = (_a = field === null || field === void 0 ? void 0 : field.properties) === null || _a === void 0 ? void 0 : _a.cameraConfig) !== null && _b !== void 0 ? _b : {};
840
- this.cameraType = (field === null || field === void 0 ? void 0 : field.type.toUpperCase()) || "";
841
- this.cameraFieldKey = fieldKey;
904
+ const fieldCameraConfig = (_a = field === null || field === void 0 ? void 0 : field.properties) !== null && _a !== void 0 ? _a : {};
905
+ this.activeCameraType = (field === null || field === void 0 ? void 0 : field.type.toUpperCase()) || "";
906
+ this.activeCameraFieldKey = fieldKey;
842
907
  this.triggerLogs(ELogEventType.FORM__FIELD_CAMERA_BUTTON_CLICK, {
843
908
  field_key: field.key,
844
909
  field_type: field.type,
845
- camera_type: this.cameraType
910
+ camera_type: this.activeCameraType
846
911
  });
847
- switch (this.cameraType) {
912
+ switch (this.activeCameraType) {
848
913
  case "CAPTURE":
849
- this.cameraConfig = mergeObjectsDeep([
850
- FIELD_PROPERTIES.capture.cameraConfig,
851
- fieldcameraConfig
914
+ this.activeCameraConfig = mergeObjectsDeep([
915
+ FIELD_PROPERTIES.capture,
916
+ fieldCameraConfig
852
917
  ]);
853
- if (((_d = (_c = this.cameraConfig) === null || _c === void 0 ? void 0 : _c.others) === null || _d === void 0 ? void 0 : _d.isWatermark) ||
854
- ((_f = (_e = this.cameraConfig) === null || _e === void 0 ? void 0 : _e.others) === null || _f === void 0 ? void 0 : _f.isWatermarkForImageUpload)) {
855
- const cameraHelper = new CameraHelper(field, this.formFields, this.allFormsData, this.formData, this.previousFormData, this.extraData);
856
- this.cameraData = {
918
+ this.activeCameraData = {};
919
+ if (((_d = (_c = (_b = this.activeCameraConfig) === null || _b === void 0 ? void 0 : _b.features) === null || _c === void 0 ? void 0 : _c.watermark) === null || _d === void 0 ? void 0 : _d.isEnabled) &&
920
+ !((_f = (_e = this.activeCameraConfig.features) === null || _e === void 0 ? void 0 : _e.watermark) === null || _f === void 0 ? void 0 : _f.isWatermarkFromServer)) {
921
+ const cameraHelper = new CameraHelper(field, {
922
+ FORM_FIELDS: this.formFields,
923
+ FIELD_CONFIG: field,
924
+ FORM_DATA: this.formData,
925
+ CAMERA_DATA: this.cameraData,
926
+ TASK_DATA: this.taskData,
927
+ PREVIOUS_FORM_DATA: this.previousFormData,
928
+ ALL_FORMS_DATA: this.allFormsData,
929
+ EXTRA_DATA: this.extraData
930
+ });
931
+ this.activeCameraData = {
857
932
  watermark: yield cameraHelper.getCameraWatermarkData()
858
933
  };
859
934
  }
860
- else {
861
- this.cameraData = undefined;
862
- }
863
935
  break;
864
936
  case "RECORD":
865
- this.cameraConfig = mergeObjectsDeep([
866
- FIELD_PROPERTIES.record.cameraConfig,
867
- fieldcameraConfig
937
+ this.activeCameraConfig = mergeObjectsDeep([
938
+ FIELD_PROPERTIES.record,
939
+ fieldCameraConfig
868
940
  ]);
869
941
  break;
870
942
  default:
@@ -882,22 +954,35 @@ export class KwikIDFormViewComponent {
882
954
  /** CameraType = CAPTURE */
883
955
  setCameraMedia(media) {
884
956
  return __awaiter(this, void 0, void 0, function* () {
885
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
957
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
886
958
  if (checkObjectKeyExists(field, "properties") &&
887
959
  checkObjectKeyExists(field.properties, "uploadFileToServer") &&
888
960
  field.properties.uploadFileToServer) {
889
961
  yield this.uploadFile(field, media);
890
962
  }
891
963
  else {
964
+ const activeCameraData = this.activeCameraData;
892
965
  this.resetCamera();
893
- this.formData[field.key] = getObjectDeepCopy([media]);
894
- this.mediaFiles[field.key] = getObjectDeepCopy([media]);
895
- this.formGroup.controls[field.key].patchValue(getObjectDeepCopy([media]), {
966
+ let updatedMedia = {};
967
+ switch (field.type) {
968
+ case EFieldType.CAPTURE:
969
+ updatedMedia = Object.assign(Object.assign({}, (isNotEmptyValue(activeCameraData) ? activeCameraData : {})), { image: media });
970
+ break;
971
+ case EFieldType.RECORD:
972
+ updatedMedia = Object.assign(Object.assign({}, (isNotEmptyValue(activeCameraData) ? activeCameraData : {})), { video: media });
973
+ break;
974
+ default:
975
+ break;
976
+ }
977
+ this.formData[field.key] = getObjectDeepCopy([updatedMedia]);
978
+ this.cameraData[field.key] = getObjectDeepCopy(updatedMedia);
979
+ this.mediaFiles[field.key] = getObjectDeepCopy([updatedMedia]);
980
+ this.formGroup.controls[field.key].patchValue(getObjectDeepCopy([updatedMedia]), {
896
981
  emitEvent: false,
897
982
  onlySelf: false
898
983
  });
899
984
  this.formGroup.patchValue({
900
- [field.key]: getObjectDeepCopy([media])
985
+ [field.key]: getObjectDeepCopy([updatedMedia])
901
986
  }, { emitEvent: false });
902
987
  this.formGroup.controls[field.key].updateValueAndValidity({
903
988
  emitEvent: false
@@ -913,6 +998,7 @@ export class KwikIDFormViewComponent {
913
998
  FIELD_CONFIG: field,
914
999
  FORM_FIELDS: this.formFields,
915
1000
  FORM_DATA: this.formData,
1001
+ CAMERA_DATA: this.cameraData,
916
1002
  TASK_DATA: this.taskData,
917
1003
  PREVIOUS_FORM_DATA: this.previousFormData,
918
1004
  ALL_FORMS_DATA: this.allFormsData,
@@ -937,13 +1023,13 @@ export class KwikIDFormViewComponent {
937
1023
  });
938
1024
  }
939
1025
  /** Camera Common Methods */
940
- handleGetCameraMedia(e, cameraType) {
941
- switch (cameraType) {
1026
+ handleGetCameraMedia(e, activeCameraType) {
1027
+ switch (activeCameraType) {
942
1028
  case "CAPTURE":
943
1029
  this.showApiLoader();
944
- this.cameraImage = "";
1030
+ this.activeCameraImage = "";
945
1031
  setTimeout(() => {
946
- var _a, _b, _c, _d, _e, _f, _g;
1032
+ var _a, _b, _c, _d, _e, _f, _g, _h;
947
1033
  /**
948
1034
  * Priority of Image to Set for Config Based
949
1035
  * 1. Masked
@@ -952,76 +1038,97 @@ export class KwikIDFormViewComponent {
952
1038
  *
953
1039
  * If no masked or cropped image is available then directly set Original Image
954
1040
  */
955
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
1041
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
956
1042
  const image = ((_a = field.properties) === null || _a === void 0 ? void 0 : _a.isMaskedImage)
957
1043
  ? (_b = e === null || e === void 0 ? void 0 : e.maskedImage) !== null && _b !== void 0 ? _b : e === null || e === void 0 ? void 0 : e.originalImage
958
1044
  : ((_c = field.properties) === null || _c === void 0 ? void 0 : _c.isCroppedImage)
959
1045
  ? (_d = e === null || e === void 0 ? void 0 : e.croppedImage) !== null && _d !== void 0 ? _d : e === null || e === void 0 ? void 0 : e.originalImage
960
1046
  : e === null || e === void 0 ? void 0 : e.originalImage;
961
- const isShowImagePreview = (_g = (_f = (_e = this.cameraConfig) === null || _e === void 0 ? void 0 : _e.others) === null || _f === void 0 ? void 0 : _f.preview) === null || _g === void 0 ? void 0 : _g.show;
1047
+ const isShowImagePreview = (_h = (_g = (_f = (_e = this.activeCameraConfig) === null || _e === void 0 ? void 0 : _e.cameraConfig) === null || _f === void 0 ? void 0 : _f.others) === null || _g === void 0 ? void 0 : _g.preview) === null || _h === void 0 ? void 0 : _h.show;
962
1048
  if (isShowImagePreview) {
963
- this.cameraImage = image;
1049
+ this.activeCameraImage = image;
964
1050
  }
965
1051
  else {
966
1052
  this.setCameraMedia(image);
967
1053
  }
968
1054
  this.hideApiLoader();
969
- }, 500); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
1055
+ }, FORM_VIEW_TIMERS.WAIT_FOR_KWIKID_CAMERA_TO_LOAD); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
970
1056
  break;
971
1057
  case "RECORD":
972
1058
  this.showApiLoader();
973
- this.cameraVideo = "";
1059
+ this.activeCameraVideo = "";
974
1060
  setTimeout(() => {
975
1061
  var _a, _b, _c;
976
1062
  /**
977
1063
  * Priority of Image to Set for Config Based
978
1064
  * 1. Original
979
1065
  */
980
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
1066
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
981
1067
  const video = e === null || e === void 0 ? void 0 : e.originalVideo;
982
- const isShowVideoPreview = (_c = (_b = (_a = this.cameraConfig) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.preview) === null || _c === void 0 ? void 0 : _c.show;
1068
+ const isShowVideoPreview = (_c = (_b = (_a = this.activeCameraConfig) === null || _a === void 0 ? void 0 : _a.others) === null || _b === void 0 ? void 0 : _b.preview) === null || _c === void 0 ? void 0 : _c.show;
983
1069
  if (isShowVideoPreview) {
984
- this.cameraVideo = video;
1070
+ this.activeCameraVideo = video;
985
1071
  }
986
1072
  else {
987
1073
  this.setCameraMedia(video);
988
1074
  }
989
1075
  this.hideApiLoader();
990
- }, 500); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
1076
+ }, FORM_VIEW_TIMERS.WAIT_FOR_KWIKID_CAMERA_TO_LOAD); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
991
1077
  break;
992
1078
  default:
993
1079
  break;
994
1080
  }
995
1081
  }
996
- handleOnClickSaveCameraMedia(e, cameraType) {
1082
+ handleOnClickSaveCameraMedia(e, activeCameraType) {
997
1083
  this.showApiLoader();
998
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
1084
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
999
1085
  this.triggerLogs(ELogEventType.FORM__CAMERA_SAVE_BUTTON_CLICK, {
1000
1086
  field_key: field.key,
1001
1087
  field_type: field.type,
1002
- camera_type: cameraType
1088
+ camera_type: activeCameraType
1003
1089
  });
1004
- switch (cameraType) {
1090
+ switch (activeCameraType) {
1005
1091
  case "CAPTURE":
1006
- this.cameraImage = "";
1092
+ this.activeCameraImage = "";
1007
1093
  setTimeout(() => {
1008
- const image = e === null || e === void 0 ? void 0 : e.originalImage;
1094
+ var _a, _b, _c, _d;
1095
+ /**
1096
+ * Priority of Image to Set for Config Based
1097
+ * 1. Masked
1098
+ * 2. Cropped
1099
+ * 3. Original
1100
+ *
1101
+ * If no masked or cropped image is available then directly set Original Image
1102
+ */
1103
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
1104
+ const image = ((_a = field.properties) === null || _a === void 0 ? void 0 : _a.isMaskedImage)
1105
+ ? (_b = e === null || e === void 0 ? void 0 : e.maskedImage) !== null && _b !== void 0 ? _b : e === null || e === void 0 ? void 0 : e.originalImage
1106
+ : ((_c = field.properties) === null || _c === void 0 ? void 0 : _c.isCroppedImage)
1107
+ ? (_d = e === null || e === void 0 ? void 0 : e.croppedImage) !== null && _d !== void 0 ? _d : e === null || e === void 0 ? void 0 : e.originalImage
1108
+ : e === null || e === void 0 ? void 0 : e.originalImage;
1009
1109
  this.setCameraMedia(image);
1010
1110
  this.hideApiLoader();
1011
- }, 500);
1111
+ }, FORM_VIEW_TIMERS.WAIT_FOR_KWIKID_CAMERA_TO_LOAD); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
1012
1112
  break;
1013
1113
  case "RECORD":
1014
- this.cameraVideo = "";
1114
+ this.activeCameraVideo = "";
1015
1115
  setTimeout(() => {
1116
+ /**
1117
+ * Priority of Image to Set for Config Based
1118
+ * 1. Original
1119
+ */
1120
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
1016
1121
  const video = e === null || e === void 0 ? void 0 : e.originalVideo;
1017
1122
  this.setCameraMedia(video);
1018
1123
  this.hideApiLoader();
1019
- }, 500);
1124
+ }, FORM_VIEW_TIMERS.WAIT_FOR_KWIKID_CAMERA_TO_LOAD); // Delay is added due to issus with KwikID Camera not being able to handle to fast processing.
1125
+ break;
1126
+ default:
1020
1127
  break;
1021
1128
  }
1022
1129
  }
1023
1130
  handleOnClickCameraBack(e) {
1024
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
1131
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
1025
1132
  this.triggerLogs(ELogEventType.FORM__CAMERA_BACK_BUTTON_CLICK, {
1026
1133
  field_key: field.key,
1027
1134
  field_type: field.type
@@ -1029,7 +1136,7 @@ export class KwikIDFormViewComponent {
1029
1136
  this.resetCamera();
1030
1137
  }
1031
1138
  handleOnClickCameraClose(e) {
1032
- const field = getFormFieldByKey(this.formFields, this.cameraFieldKey);
1139
+ const field = getFormFieldByKey(this.formFields, this.activeCameraFieldKey);
1033
1140
  this.triggerLogs(ELogEventType.FORM__CAMERA_CLOSE_BUTTON_CLICK, {
1034
1141
  field_key: field.key,
1035
1142
  field_type: field.type
@@ -1041,7 +1148,7 @@ export class KwikIDFormViewComponent {
1041
1148
  */
1042
1149
  updateFiles(file, state, key) {
1043
1150
  var _a;
1044
- const fileWithState = mergeObjects(file, { state: state });
1151
+ const fileWithState = mergeObjects(file, { state });
1045
1152
  const field = getFormFieldByKey(this.formFields, key);
1046
1153
  if ((_a = field.properties) === null || _a === void 0 ? void 0 : _a.multiple) {
1047
1154
  // If field.properties?.multiple is true, it means multiple files are allowed for this field.
@@ -1078,6 +1185,7 @@ export class KwikIDFormViewComponent {
1078
1185
  FIELD_CONFIG: field,
1079
1186
  FORM_FIELDS: this.formFields,
1080
1187
  FORM_DATA: this.formData,
1188
+ CAMERA_DATA: this.cameraData,
1081
1189
  TASK_DATA: this.taskData,
1082
1190
  PREVIOUS_FORM_DATA: this.previousFormData,
1083
1191
  ALL_FORMS_DATA: this.allFormsData,
@@ -1099,6 +1207,7 @@ export class KwikIDFormViewComponent {
1099
1207
  * This is a api upload mocking method. Set's to loading at first at point when API is called and then changes the status to random status after 2 seconds of delay showing a mocked response from API.
1100
1208
  */
1101
1209
  uploadFile(field, file) {
1210
+ var _a, _b, _c, _d, _e, _f;
1102
1211
  return __awaiter(this, void 0, void 0, function* () {
1103
1212
  switch (field.type) {
1104
1213
  case EFieldType.FILE:
@@ -1120,7 +1229,7 @@ export class KwikIDFormViewComponent {
1120
1229
  key: field.key,
1121
1230
  type: field.type,
1122
1231
  payload: {
1123
- file: file,
1232
+ file,
1124
1233
  metadata: {
1125
1234
  name: file.name,
1126
1235
  type: file.type,
@@ -1135,28 +1244,91 @@ export class KwikIDFormViewComponent {
1135
1244
  this.updateFiles(file, "ERROR", field.key);
1136
1245
  }
1137
1246
  break;
1138
- case EFieldType.CAPTURE:
1247
+ case EFieldType.CAPTURE: {
1139
1248
  // Actual API Call
1249
+ let ocrPayload = {};
1250
+ if (isNotEmptyValue((_b = (_a = field === null || field === void 0 ? void 0 : field.properties) === null || _a === void 0 ? void 0 : _a.features) === null || _b === void 0 ? void 0 : _b.ocr)) {
1251
+ ocrPayload = field.properties.features.ocr;
1252
+ }
1253
+ const facematchPayload = {};
1254
+ if (isNotEmptyValue((_d = (_c = field === null || field === void 0 ? void 0 : field.properties) === null || _c === void 0 ? void 0 : _c.features) === null || _d === void 0 ? void 0 : _d.facematch)) {
1255
+ facematchPayload.isEnabled =
1256
+ field.properties.features.facematch.isEnabled;
1257
+ facematchPayload.isFacematchFromServer =
1258
+ field.properties.features.facematch.isFacematchFromServer;
1259
+ facematchPayload.images = [];
1260
+ const facematchSources = field.properties.features.facematch.sources;
1261
+ for (const facematchSourceConfig of facematchSources) {
1262
+ const source = new Source({
1263
+ FIELD_CONFIG: field,
1264
+ FORM_FIELDS: this.formFields,
1265
+ FORM_DATA: this.formData,
1266
+ CAMERA_DATA: this.cameraData,
1267
+ TASK_DATA: this.taskData,
1268
+ PREVIOUS_FORM_DATA: this.previousFormData,
1269
+ ALL_FORMS_DATA: this.allFormsData,
1270
+ EXTRA_DATA: this.extraData
1271
+ });
1272
+ const sourceValue = yield source.getValueFromSource(facematchSourceConfig);
1273
+ const facematchSource = {
1274
+ key: facematchSourceConfig.id,
1275
+ value: sourceValue
1276
+ };
1277
+ facematchPayload.images.push(facematchSource);
1278
+ }
1279
+ }
1280
+ const watermarkPayload = {};
1281
+ if (isNotEmptyValue((_f = (_e = field === null || field === void 0 ? void 0 : field.properties) === null || _e === void 0 ? void 0 : _e.features) === null || _f === void 0 ? void 0 : _f.watermark)) {
1282
+ watermarkPayload.isEnabled =
1283
+ field.properties.features.watermark.isEnabled;
1284
+ watermarkPayload.isWatermarkFromServer =
1285
+ field.properties.features.watermark.isWatermarkFromServer;
1286
+ watermarkPayload.data = [];
1287
+ const watermarkSources = field.properties.features.watermark.sources;
1288
+ watermarkPayload.config = field.properties.features.watermark.sources;
1289
+ for (const watermarkSourceConfig of watermarkSources) {
1290
+ const source = new Source({
1291
+ FIELD_CONFIG: field,
1292
+ FORM_FIELDS: this.formFields,
1293
+ FORM_DATA: this.formData,
1294
+ CAMERA_DATA: this.cameraData,
1295
+ TASK_DATA: this.taskData,
1296
+ PREVIOUS_FORM_DATA: this.previousFormData,
1297
+ ALL_FORMS_DATA: this.allFormsData,
1298
+ EXTRA_DATA: this.extraData
1299
+ });
1300
+ const sourceValue = yield source.getValueFromSource(watermarkSourceConfig);
1301
+ const watermarkSource = {
1302
+ key: watermarkSourceConfig.id,
1303
+ value: sourceValue
1304
+ };
1305
+ watermarkPayload.data.push(watermarkSource);
1306
+ }
1307
+ }
1308
+ const imageUploadPayload = Object.assign(Object.assign(Object.assign({ image: file }, ((ocrPayload === null || ocrPayload === void 0 ? void 0 : ocrPayload.isEnabled) && {
1309
+ ocr: ocrPayload
1310
+ })), ((facematchPayload === null || facematchPayload === void 0 ? void 0 : facematchPayload.isEnabled) && {
1311
+ facematch: facematchPayload
1312
+ })), ((watermarkPayload === null || watermarkPayload === void 0 ? void 0 : watermarkPayload.isEnabled) && {
1313
+ watermark: watermarkPayload
1314
+ }));
1140
1315
  this.triggerLogs(ELogEventType.FORM__API_REQUEST_UPLOAD_IMAGE, {
1141
1316
  field_key: field.key,
1142
1317
  field_type: field.type,
1143
- request: {
1144
- image: file
1145
- }
1318
+ request: imageUploadPayload
1146
1319
  });
1147
1320
  try {
1148
1321
  this.onClickApiCall.emit({
1149
1322
  key: field.key,
1150
1323
  type: field.type,
1151
- payload: {
1152
- image: file
1153
- }
1324
+ payload: imageUploadPayload
1154
1325
  });
1155
1326
  }
1156
1327
  catch (err) {
1157
1328
  console.log("Failed to upload image to server!");
1158
1329
  }
1159
1330
  break;
1331
+ }
1160
1332
  case EFieldType.RECORD:
1161
1333
  // Actual API Call
1162
1334
  this.triggerLogs(ELogEventType.FORM__API_REQUEST_UPLOAD_VIDEO, {
@@ -1179,12 +1351,14 @@ export class KwikIDFormViewComponent {
1179
1351
  console.log("Failed to upload video to server!");
1180
1352
  }
1181
1353
  break;
1354
+ default:
1355
+ break;
1182
1356
  }
1183
1357
  });
1184
1358
  }
1185
1359
  handleOnClickFormFieldButton(field) {
1186
- let formData = this.formGroup.getRawValue();
1187
- for (let field of this.formFields) {
1360
+ const formData = this.formGroup.getRawValue();
1361
+ for (const field of this.formFields) {
1188
1362
  if (field.isFormElement) {
1189
1363
  if (field.hidden) {
1190
1364
  delete formData[field.key];
@@ -1202,7 +1376,7 @@ export class KwikIDFormViewComponent {
1202
1376
  label: field.label,
1203
1377
  value: isEmptyValue(formData[field.key]) ? "" : formData[field.key],
1204
1378
  type: field.type,
1205
- index: index
1379
+ index
1206
1380
  }
1207
1381
  };
1208
1382
  result[field.key] = fieldData[field.key];
@@ -1226,8 +1400,8 @@ export class KwikIDFormViewComponent {
1226
1400
  return field.key === _.key;
1227
1401
  });
1228
1402
  // set button status to default
1229
- field["api"]["status"]["value"] = EApiStatusType.LOADING;
1230
- field["showLoader"] = true;
1403
+ field.api.status.value = EApiStatusType.LOADING;
1404
+ field.showLoader = true;
1231
1405
  this.formFields[fieldIndex] = field;
1232
1406
  this.showApiLoader();
1233
1407
  this.fieldShowApiLoader(field.key);
@@ -1239,7 +1413,7 @@ export class KwikIDFormViewComponent {
1239
1413
  this.togglePermissionErrorNotification(true);
1240
1414
  setTimeout(() => {
1241
1415
  this.togglePermissionErrorNotification(false);
1242
- }, 3000);
1416
+ }, FORM_VIEW_TIMERS.LOCATION_PERMISSION_ERROR_TOGGLE);
1243
1417
  }
1244
1418
  else {
1245
1419
  this.triggerLogs(ELogEventType.FORM__LIVE_LOCATION_PERMISSION_SUCCESS, {
@@ -1249,12 +1423,12 @@ export class KwikIDFormViewComponent {
1249
1423
  }
1250
1424
  setTimeout(() => {
1251
1425
  // set button status to default
1252
- field["api"]["status"]["value"] = EApiStatusType.DEFAULT;
1253
- field["showLoader"] = false;
1426
+ field.api.status.value = EApiStatusType.DEFAULT;
1427
+ field.showLoader = false;
1254
1428
  this.formFields[fieldIndex] = field;
1255
1429
  this.hideApiLoader();
1256
1430
  this.fieldHideApiLoader(field.key);
1257
- }, 500);
1431
+ }, FORM_VIEW_TIMERS.LOCATION_PERMISSION_RESET_BUTTON_STATUS);
1258
1432
  }
1259
1433
  handleOnClickLiveLocation(e) {
1260
1434
  return __awaiter(this, void 0, void 0, function* () {
@@ -1264,8 +1438,8 @@ export class KwikIDFormViewComponent {
1264
1438
  field_type: field.type
1265
1439
  });
1266
1440
  // set button status to loading
1267
- field["api"]["status"]["value"] = EApiStatusType.LOADING;
1268
- field["showLoader"] = true;
1441
+ field.api.status.value = EApiStatusType.LOADING;
1442
+ field.showLoader = true;
1269
1443
  this.showApiLoader();
1270
1444
  this.formGroup.patchValue({
1271
1445
  [e.key]: e.value
@@ -1285,11 +1459,11 @@ export class KwikIDFormViewComponent {
1285
1459
  yield new Promise((resolve) => {
1286
1460
  setTimeout(() => {
1287
1461
  resolve(true);
1288
- }, 300); // 1000 ms = 1 sec
1462
+ }, FORM_VIEW_TIMERS.TIMER_300); // 1000 ms = 1 sec
1289
1463
  });
1290
1464
  // set button status to success
1291
- field["api"]["status"]["value"] = EApiStatusType.SUCCESS;
1292
- field["showLoader"] = false;
1465
+ field.api.status.value = EApiStatusType.SUCCESS;
1466
+ field.showLoader = false;
1293
1467
  if (field.isFormElement &&
1294
1468
  checkObjectKeyExists(field, "validation") &&
1295
1469
  field.validation.triggers.includes("ON_CHANGE")) {
@@ -1297,6 +1471,7 @@ export class KwikIDFormViewComponent {
1297
1471
  FIELD_CONFIG: field,
1298
1472
  FORM_FIELDS: this.formFields,
1299
1473
  FORM_DATA: this.formData,
1474
+ CAMERA_DATA: this.cameraData,
1300
1475
  TASK_DATA: this.taskData,
1301
1476
  PREVIOUS_FORM_DATA: this.previousFormData,
1302
1477
  ALL_FORMS_DATA: this.allFormsData,
@@ -1332,6 +1507,7 @@ export class KwikIDFormViewComponent {
1332
1507
  FIELD_CONFIG: field,
1333
1508
  FORM_FIELDS: this.formFields,
1334
1509
  FORM_DATA: this.formData,
1510
+ CAMERA_DATA: this.cameraData,
1335
1511
  TASK_DATA: this.taskData,
1336
1512
  PREVIOUS_FORM_DATA: this.previousFormData,
1337
1513
  ALL_FORMS_DATA: this.allFormsData,
@@ -1349,41 +1525,6 @@ export class KwikIDFormViewComponent {
1349
1525
  }, "ON_CHANGE");
1350
1526
  }
1351
1527
  }
1352
- handleOnClickResetFormFields2(e, field) {
1353
- var _a;
1354
- return __awaiter(this, void 0, void 0, function* () {
1355
- this.triggerLogs(ELogEventType.FORM__FIELD_RESET_BUTTON_CLICK, {
1356
- field_key: field.key
1357
- });
1358
- const resetFormFields = () => __awaiter(this, void 0, void 0, function* () {
1359
- for (let f of field.reset.fields) {
1360
- for (let action of f.actions) {
1361
- const resetField = getFormFieldByKey(this.formFields, action.props.fieldKey);
1362
- const actions = new Action(action, {}, {
1363
- FIELD_CONFIG: resetField,
1364
- FORM_FIELDS: this.formFields,
1365
- FORM_DATA: this.formData,
1366
- TASK_DATA: this.taskData,
1367
- PREVIOUS_FORM_DATA: this.previousFormData,
1368
- ALL_FORMS_DATA: this.allFormsData,
1369
- EXTRA_DATA: this.extraData
1370
- }, this.takeAction.bind(this));
1371
- yield actions.execute();
1372
- }
1373
- }
1374
- });
1375
- const BYPASS_RESET_CONFIRM = (_a = field === null || field === void 0 ? void 0 : field.properties) === null || _a === void 0 ? void 0 : _a.bypassResetConfirmation;
1376
- if (!BYPASS_RESET_CONFIRM) {
1377
- const CONFIRM_RESET = window.confirm("This action will reset all the fields. Do you still want to continue?");
1378
- if (CONFIRM_RESET) {
1379
- resetFormFields();
1380
- }
1381
- }
1382
- else {
1383
- resetFormFields();
1384
- }
1385
- });
1386
- }
1387
1528
  handleOnClickResetFormFields(e, field) {
1388
1529
  var _a;
1389
1530
  return __awaiter(this, void 0, void 0, function* () {
@@ -1392,13 +1533,14 @@ export class KwikIDFormViewComponent {
1392
1533
  });
1393
1534
  const resetFormFields = () => __awaiter(this, void 0, void 0, function* () {
1394
1535
  if (checkObjectPathExists(field, "reset.fields")) {
1395
- for (let f of field.reset.fields) {
1396
- for (let action of f.actions) {
1536
+ for (const f of field.reset.fields) {
1537
+ for (const action of f.actions) {
1397
1538
  const resetField = getFormFieldByKey(this.formFields, action.props.fieldKey);
1398
1539
  const actions = new Action(action, {}, {
1399
1540
  FIELD_CONFIG: resetField,
1400
1541
  FORM_FIELDS: this.formFields,
1401
1542
  FORM_DATA: this.formData,
1543
+ CAMERA_DATA: this.cameraData,
1402
1544
  TASK_DATA: this.taskData,
1403
1545
  PREVIOUS_FORM_DATA: this.previousFormData,
1404
1546
  ALL_FORMS_DATA: this.allFormsData,
@@ -1409,14 +1551,15 @@ export class KwikIDFormViewComponent {
1409
1551
  }
1410
1552
  }
1411
1553
  if (checkObjectPathExists(field, "reset.fieldGroups")) {
1412
- for (let fg of field.reset.fieldGroups) {
1413
- for (let action of fg.actions) {
1414
- for (let fieldKey of this.fieldGroups[fg.groupKey]) {
1554
+ for (const fg of field.reset.fieldGroups) {
1555
+ for (const action of fg.actions) {
1556
+ for (const fieldKey of this.fieldGroups[fg.groupKey]) {
1415
1557
  const resetField = getFormFieldByKey(this.formFields, fieldKey);
1416
1558
  const actions = new Action(action, {}, {
1417
1559
  FIELD_CONFIG: resetField,
1418
1560
  FORM_FIELDS: this.formFields,
1419
1561
  FORM_DATA: this.formData,
1562
+ CAMERA_DATA: this.cameraData,
1420
1563
  TASK_DATA: this.taskData,
1421
1564
  PREVIOUS_FORM_DATA: this.previousFormData,
1422
1565
  ALL_FORMS_DATA: this.allFormsData,
@@ -1447,6 +1590,7 @@ export class KwikIDFormViewComponent {
1447
1590
  API_CONFIG: api,
1448
1591
  FORM_FIELDS: this.formFields,
1449
1592
  FORM_DATA: this.formData,
1593
+ CAMERA_DATA: this.cameraData,
1450
1594
  TASK_DATA: this.taskData,
1451
1595
  PREVIOUS_FORM_DATA: this.previousFormData,
1452
1596
  ALL_FORMS_DATA: this.allFormsData,
@@ -1465,6 +1609,7 @@ export class KwikIDFormViewComponent {
1465
1609
  API_RESPONSE: api.response,
1466
1610
  FORM_FIELDS: this.formFields,
1467
1611
  FORM_DATA: this.formData,
1612
+ CAMERA_DATA: this.cameraData,
1468
1613
  TASK_DATA: this.taskData,
1469
1614
  PREVIOUS_FORM_DATA: this.previousFormData,
1470
1615
  ALL_FORMS_DATA: this.allFormsData,
@@ -1474,11 +1619,11 @@ export class KwikIDFormViewComponent {
1474
1619
  }
1475
1620
  else {
1476
1621
  setTimeout(() => {
1477
- field["api"]["status"]["value"] = EApiStatusType.FAILED;
1478
- field["showLoader"] = false;
1479
- }, 500);
1622
+ field.api.status.value = EApiStatusType.FAILED;
1623
+ field.showLoader = false;
1624
+ }, FORM_VIEW_TIMERS.TIMER_500);
1480
1625
  }
1481
- return { field: field, api: api };
1626
+ return { field, api };
1482
1627
  });
1483
1628
  }
1484
1629
  handleApiCall(api) {
@@ -1488,6 +1633,7 @@ export class KwikIDFormViewComponent {
1488
1633
  API_CONFIG: api,
1489
1634
  FORM_FIELDS: this.formFields,
1490
1635
  FORM_DATA: this.formData,
1636
+ CAMERA_DATA: this.cameraData,
1491
1637
  TASK_DATA: this.taskData,
1492
1638
  PREVIOUS_FORM_DATA: this.previousFormData,
1493
1639
  ALL_FORMS_DATA: this.allFormsData,
@@ -1498,6 +1644,7 @@ export class KwikIDFormViewComponent {
1498
1644
  API_CONFIG: api,
1499
1645
  FORM_FIELDS: this.formFields,
1500
1646
  FORM_DATA: this.formData,
1647
+ CAMERA_DATA: this.cameraData,
1501
1648
  TASK_DATA: this.taskData,
1502
1649
  PREVIOUS_FORM_DATA: this.previousFormData,
1503
1650
  ALL_FORMS_DATA: this.allFormsData,
@@ -1506,7 +1653,7 @@ export class KwikIDFormViewComponent {
1506
1653
  if (this.isValidRequestHeadersAndBody(api)) {
1507
1654
  api = yield apis.validateResponse();
1508
1655
  }
1509
- return { api: api };
1656
+ return { api };
1510
1657
  });
1511
1658
  }
1512
1659
  executeApiCall(api, object) {
@@ -1521,14 +1668,15 @@ export class KwikIDFormViewComponent {
1521
1668
  let apiCallResponse = {};
1522
1669
  let apiCallResponseStatusCode;
1523
1670
  if (this.isValidRequestHeadersAndBody(api)) {
1524
- if (api.request.url.hasOwnProperty("type") &&
1671
+ if (checkObjectKeyExists(api.request.url, "type") &&
1525
1672
  api.request.url.type === EApiRequestUrlType.MOCK) {
1526
1673
  apiCallResponse = yield new Promise((resolve) => {
1527
1674
  setTimeout(() => {
1528
1675
  resolve(api.request.url.props.mockedData);
1529
- }, 1000); // 1000 ms = 1 sec
1676
+ }, FORM_VIEW_TIMERS.WAIT_FOR_API_MOCK_DATA); // 1000 ms = 1 sec
1530
1677
  });
1531
- apiCallResponseStatusCode = (_b = (_a = api.request.url.props) === null || _a === void 0 ? void 0 : _a.statusCode) !== null && _b !== void 0 ? _b : 200; // Default Status Code for Mocked APIs
1678
+ apiCallResponseStatusCode =
1679
+ (_b = (_a = api.request.url.props) === null || _a === void 0 ? void 0 : _a.statusCode) !== null && _b !== void 0 ? _b : FORM_VIEW_TIMERS.API_MOCK_SUCCESS_STATUS_CODE; // Default Status Code for Mocked APIs
1532
1680
  }
1533
1681
  else {
1534
1682
  const url = api.request.url.value;
@@ -1555,12 +1703,13 @@ export class KwikIDFormViewComponent {
1555
1703
  catch (_13) {
1556
1704
  // Handle any errors
1557
1705
  apiCallResponse = {};
1558
- apiCallResponseStatusCode = 500; // Internal Server Error
1706
+ apiCallResponseStatusCode =
1707
+ FORM_VIEW_TIMERS.API_MOCK_ERROR_STATUS_CODE; // Internal Server Error
1559
1708
  }
1560
1709
  }
1561
1710
  else {
1562
1711
  // Extract the request body from the API configuration
1563
- let body = (_p = (_o = (_m = api === null || api === void 0 ? void 0 : api.request) === null || _m === void 0 ? void 0 : _m.body) === null || _o === void 0 ? void 0 : _o.value) !== null && _p !== void 0 ? _p : {};
1712
+ const body = (_p = (_o = (_m = api === null || api === void 0 ? void 0 : api.request) === null || _m === void 0 ? void 0 : _m.body) === null || _o === void 0 ? void 0 : _o.value) !== null && _p !== void 0 ? _p : {};
1564
1713
  // Check if the request body needs to be encrypted
1565
1714
  const isEncryptRequestBody = (_s = (_r = (_q = api === null || api === void 0 ? void 0 : api.request) === null || _q === void 0 ? void 0 : _q.body) === null || _r === void 0 ? void 0 : _r.isSecure) !== null && _s !== void 0 ? _s : false;
1566
1715
  // Check if the response needs to be decrypted
@@ -1580,7 +1729,8 @@ export class KwikIDFormViewComponent {
1580
1729
  catch (_14) {
1581
1730
  // Handle any errors
1582
1731
  apiCallResponse = {};
1583
- apiCallResponseStatusCode = 500; // Internal Server Error
1732
+ apiCallResponseStatusCode =
1733
+ FORM_VIEW_TIMERS.API_MOCK_ERROR_STATUS_CODE; // Internal Server Error
1584
1734
  }
1585
1735
  }
1586
1736
  }
@@ -1615,29 +1765,29 @@ export class KwikIDFormViewComponent {
1615
1765
  fullscreen: true,
1616
1766
  loaderText: "Please wait"
1617
1767
  });
1618
- this.viewFormsButton["disabled"] = true;
1619
- this.viewFormsButton["showLoader"] = true;
1620
- this.saveFormButton["disabled"] = true;
1621
- this.saveFormButton["showLoader"] = true;
1768
+ this.viewFormsButton.disabled = true;
1769
+ this.viewFormsButton.showLoader = true;
1770
+ this.saveFormButton.disabled = true;
1771
+ this.saveFormButton.showLoader = true;
1622
1772
  }
1623
1773
  hideApiLoader() {
1624
1774
  this.loaderService.hide();
1625
- this.viewFormsButton["disabled"] = false;
1626
- this.viewFormsButton["showLoader"] = false;
1627
- this.saveFormButton["disabled"] = false;
1628
- this.saveFormButton["showLoader"] = false;
1775
+ this.viewFormsButton.disabled = false;
1776
+ this.viewFormsButton.showLoader = false;
1777
+ this.saveFormButton.disabled = false;
1778
+ this.saveFormButton.showLoader = false;
1629
1779
  }
1630
1780
  handleOnClickApiCall(e) {
1631
1781
  return __awaiter(this, void 0, void 0, function* () {
1632
- let field = getFormFieldByKey(this.formFields, e.key);
1782
+ const field = getFormFieldByKey(this.formFields, e.key);
1633
1783
  if (field.type === EFieldType.API) {
1634
1784
  this.triggerLogs(ELogEventType.FORM__API_BUTTON_CLICK, {
1635
1785
  field_key: field.key,
1636
1786
  field_type: field.type
1637
1787
  });
1638
1788
  // set button status to loading
1639
- field["api"]["status"]["value"] = EApiStatusType.LOADING;
1640
- field["showLoader"] = true;
1789
+ field.api.status.value = EApiStatusType.LOADING;
1790
+ field.showLoader = true;
1641
1791
  this.showApiLoader();
1642
1792
  // Determine API Call time
1643
1793
  if (checkObjectKeyExists(field.api, "request")) {
@@ -1649,6 +1799,7 @@ export class KwikIDFormViewComponent {
1649
1799
  API_CONFIG: {},
1650
1800
  FORM_FIELDS: this.formFields,
1651
1801
  FORM_DATA: this.formData,
1802
+ CAMERA_DATA: this.cameraData,
1652
1803
  TASK_DATA: this.taskData,
1653
1804
  PREVIOUS_FORM_DATA: this.previousFormData,
1654
1805
  ALL_FORMS_DATA: this.allFormsData,
@@ -1673,14 +1824,14 @@ export class KwikIDFormViewComponent {
1673
1824
  if (this.formConfig.status === EFormsListStatus.COMPLETED) {
1674
1825
  this.onClickGoBack.emit({
1675
1826
  clicked: true,
1676
- mode: mode
1827
+ mode
1677
1828
  });
1678
1829
  }
1679
1830
  else if (this.formConfig.properties.header.backButton.bypassConfirmation ||
1680
1831
  window.confirm("Your data will be lost if you leave this page! Continue?")) {
1681
1832
  this.onClickGoBack.emit({
1682
1833
  clicked: true,
1683
- mode: mode
1834
+ mode
1684
1835
  });
1685
1836
  }
1686
1837
  }
@@ -1708,7 +1859,7 @@ export class KwikIDFormViewComponent {
1708
1859
  }
1709
1860
  const controls = new FormValidation().getFormFieldsInvalidControls(this.formGroup);
1710
1861
  let firstFieldWithError = "";
1711
- for (let control of controls) {
1862
+ for (const control of controls) {
1712
1863
  if (control.invalid) {
1713
1864
  const field = getFormFieldByKey(this.formFields, control.key);
1714
1865
  this.triggerLogs(ELogEventType.FORM__FIELD_ERROR_SHOW, {
@@ -1730,7 +1881,7 @@ export class KwikIDFormViewComponent {
1730
1881
  // }, 3000);
1731
1882
  return;
1732
1883
  }
1733
- for (let field of this.formFields) {
1884
+ for (const field of this.formFields) {
1734
1885
  if (field.isFormElement &&
1735
1886
  !field.hidden &&
1736
1887
  checkObjectKeyExists(field, "validation") &&
@@ -1739,6 +1890,7 @@ export class KwikIDFormViewComponent {
1739
1890
  FIELD_CONFIG: field,
1740
1891
  FORM_FIELDS: this.formFields,
1741
1892
  FORM_DATA: this.formData,
1893
+ CAMERA_DATA: this.cameraData,
1742
1894
  TASK_DATA: this.taskData,
1743
1895
  PREVIOUS_FORM_DATA: this.previousFormData,
1744
1896
  ALL_FORMS_DATA: this.allFormsData,
@@ -1749,13 +1901,13 @@ export class KwikIDFormViewComponent {
1749
1901
  this.toggleErrorNotification(true);
1750
1902
  setTimeout(() => {
1751
1903
  this.toggleErrorNotification(false);
1752
- }, 3000);
1904
+ }, FORM_VIEW_TIMERS.INVALID_FIELDS_SAVE_FORM_ERROR_TOGGLE);
1753
1905
  return;
1754
1906
  }
1755
1907
  }
1756
1908
  }
1757
- let formData = this.formGroup.getRawValue();
1758
- for (let field of this.formFields) {
1909
+ const formData = this.formGroup.getRawValue();
1910
+ for (const field of this.formFields) {
1759
1911
  if (field.isFormElement) {
1760
1912
  if (field.hidden) {
1761
1913
  delete formData[field.key];
@@ -1773,7 +1925,7 @@ export class KwikIDFormViewComponent {
1773
1925
  label: field.label,
1774
1926
  value: isEmptyValue(formData[field.key]) ? "" : formData[field.key],
1775
1927
  type: field.type,
1776
- index: index
1928
+ index
1777
1929
  }
1778
1930
  };
1779
1931
  result[field.key] = fieldData[field.key];
@@ -1784,6 +1936,7 @@ export class KwikIDFormViewComponent {
1784
1936
  if (isEmptyValue(formData[key])) {
1785
1937
  formData[key] = "";
1786
1938
  }
1939
+ return null;
1787
1940
  });
1788
1941
  /**
1789
1942
  * POST Tasks
@@ -1795,11 +1948,12 @@ export class KwikIDFormViewComponent {
1795
1948
  if (checkObjectKeyExists(this.formConfig, "tasks") &&
1796
1949
  checkObjectKeyExists(this.formConfig.tasks, "post")) {
1797
1950
  this.triggerLogs(ELogEventType.FORM__TASK_POST, {});
1798
- for (let postTask of this.formConfig.tasks.post) {
1951
+ for (const postTask of this.formConfig.tasks.post) {
1799
1952
  const task = new Tasks(postTask, {
1800
1953
  FORM_CONFIG: this.formConfig,
1801
1954
  FORM_FIELDS: this.formFields,
1802
1955
  FORM_DATA: this.formData,
1956
+ CAMERA_DATA: this.cameraData,
1803
1957
  TASK_DATA: this.taskData,
1804
1958
  PREVIOUS_FORM_DATA: this.previousFormData,
1805
1959
  ALL_FORMS_DATA: this.allFormsData,
@@ -1820,7 +1974,7 @@ export class KwikIDFormViewComponent {
1820
1974
  clearInterval(intervalId);
1821
1975
  resolve();
1822
1976
  }
1823
- }, 10);
1977
+ }, FORM_VIEW_TIMERS.WAIT_FOR_CHANGES_BEFORE_MOVING_TO_NEXT_TASK);
1824
1978
  });
1825
1979
  if (this.stopTaskExecution) {
1826
1980
  break;
@@ -1869,11 +2023,11 @@ export class KwikIDFormViewComponent {
1869
2023
  }
1870
2024
  // Component Helpers
1871
2025
  fieldHide(fieldKey) {
1872
- let field = getFormFieldByKey(this.formFields, fieldKey);
1873
- let fieldIndex = this.formFields.findIndex((_) => {
2026
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2027
+ const fieldIndex = this.formFields.findIndex((_) => {
1874
2028
  return field.key === _.key;
1875
2029
  });
1876
- this.formFields[fieldIndex]["hidden"] = true;
2030
+ this.formFields[fieldIndex].hidden = true;
1877
2031
  this.formGroup.updateValueAndValidity();
1878
2032
  this.triggerLogs(ELogEventType.FORM__FIELD_HIDE, {
1879
2033
  field_key: fieldKey,
@@ -1881,16 +2035,16 @@ export class KwikIDFormViewComponent {
1881
2035
  });
1882
2036
  }
1883
2037
  fieldGroupHide(fieldGroup) {
1884
- for (let fieldKey of this.fieldGroups[fieldGroup]) {
2038
+ for (const fieldKey of this.fieldGroups[fieldGroup]) {
1885
2039
  this.fieldHide(fieldKey);
1886
2040
  }
1887
2041
  }
1888
2042
  fieldShow(fieldKey) {
1889
- let field = getFormFieldByKey(this.formFields, fieldKey);
1890
- let fieldIndex = this.formFields.findIndex((_) => {
2043
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2044
+ const fieldIndex = this.formFields.findIndex((_) => {
1891
2045
  return field.key === _.key;
1892
2046
  });
1893
- this.formFields[fieldIndex]["hidden"] = false;
2047
+ this.formFields[fieldIndex].hidden = false;
1894
2048
  this.formGroup.updateValueAndValidity();
1895
2049
  this.triggerLogs(ELogEventType.FORM__FIELD_SHOW, {
1896
2050
  field_key: fieldKey,
@@ -1898,27 +2052,26 @@ export class KwikIDFormViewComponent {
1898
2052
  });
1899
2053
  }
1900
2054
  fieldGroupShow(fieldGroup) {
1901
- for (let fieldKey of this.fieldGroups[fieldGroup]) {
2055
+ for (const fieldKey of this.fieldGroups[fieldGroup]) {
1902
2056
  this.fieldShow(fieldKey);
1903
2057
  }
1904
2058
  }
1905
2059
  fieldDisable(fieldKey) {
1906
- let field = getFormFieldByKey(this.formFields, fieldKey);
1907
- let fieldIndex = this.formFields.findIndex((_) => {
2060
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2061
+ const fieldIndex = this.formFields.findIndex((_) => {
1908
2062
  return field.key === _.key;
1909
2063
  });
1910
2064
  if (field.isFormElement) {
1911
- this.formFields[fieldIndex]["disabled"] = true;
2065
+ this.formFields[fieldIndex].disabled = true;
1912
2066
  if (isNotEmptyValue(this.formGroup.controls)) {
1913
2067
  this.formGroup.controls[field.key].disable({
1914
2068
  emitEvent: false
1915
2069
  });
1916
2070
  }
1917
2071
  this.formGroup.updateValueAndValidity();
1918
- console.log("YES DISABLING THE FIELD");
1919
2072
  }
1920
2073
  else if (field.type === EFieldType.BUTTON) {
1921
- this.formFields[fieldIndex]["disabled"] = true;
2074
+ this.formFields[fieldIndex].disabled = true;
1922
2075
  }
1923
2076
  this.triggerLogs(ELogEventType.FORM__FIELD_DISABLE, {
1924
2077
  field_key: fieldKey,
@@ -1926,17 +2079,17 @@ export class KwikIDFormViewComponent {
1926
2079
  });
1927
2080
  }
1928
2081
  fieldGroupDisable(fieldGroup) {
1929
- for (let fieldKey of this.fieldGroups[fieldGroup]) {
2082
+ for (const fieldKey of this.fieldGroups[fieldGroup]) {
1930
2083
  this.fieldDisable(fieldKey);
1931
2084
  }
1932
2085
  }
1933
2086
  fieldEnable(fieldKey) {
1934
- let field = getFormFieldByKey(this.formFields, fieldKey);
1935
- let fieldIndex = this.formFields.findIndex((_) => {
2087
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2088
+ const fieldIndex = this.formFields.findIndex((_) => {
1936
2089
  return field.key === _.key;
1937
2090
  });
1938
2091
  if (field.isFormElement) {
1939
- this.formFields[fieldIndex]["disabled"] = false;
2092
+ this.formFields[fieldIndex].disabled = false;
1940
2093
  if (isNotEmptyValue(this.formGroup.controls)) {
1941
2094
  this.formGroup.controls[field.key].enable({
1942
2095
  emitEvent: false
@@ -1945,7 +2098,7 @@ export class KwikIDFormViewComponent {
1945
2098
  this.formGroup.updateValueAndValidity();
1946
2099
  }
1947
2100
  else if (field.type === EFieldType.BUTTON) {
1948
- this.formFields[fieldIndex]["disabled"] = false;
2101
+ this.formFields[fieldIndex].disabled = false;
1949
2102
  }
1950
2103
  this.triggerLogs(ELogEventType.FORM__FIELD_ENABLE, {
1951
2104
  field_key: fieldKey,
@@ -1953,14 +2106,14 @@ export class KwikIDFormViewComponent {
1953
2106
  });
1954
2107
  }
1955
2108
  fieldGroupEnable(fieldGroup) {
1956
- for (let fieldKey of this.fieldGroups[fieldGroup]) {
2109
+ for (const fieldKey of this.fieldGroups[fieldGroup]) {
1957
2110
  this.fieldEnable(fieldKey);
1958
2111
  }
1959
2112
  }
1960
2113
  fieldReset(fieldKey) {
1961
2114
  // Find the field and its index in the formFields array
1962
2115
  let field = getFormFieldByKey(this.formFields, fieldKey);
1963
- let fieldIndex = getFormFieldIndexByKey(this.formFields, fieldKey);
2116
+ const fieldIndex = getFormFieldIndexByKey(this.formFields, fieldKey);
1964
2117
  // Reset the value of the field in the formGroup
1965
2118
  const resetValue = convertFormFieldEmptyValueToKwikUIFormat(field);
1966
2119
  this.formData[fieldKey] = resetValue;
@@ -1989,23 +2142,24 @@ export class KwikIDFormViewComponent {
1989
2142
  });
1990
2143
  // Reset the value of the field in the formFields array
1991
2144
  switch (field.type) {
1992
- case EFieldType.API:
2145
+ case EFieldType.API: {
1993
2146
  const fieldApiCall = field;
1994
2147
  fieldApiCall.api.status.value = EApiStatusType.DEFAULT;
1995
2148
  this.formFields[fieldIndex] = fieldApiCall;
1996
2149
  break;
1997
- case EFieldType.LIVE_LOCATION:
2150
+ }
2151
+ case EFieldType.LIVE_LOCATION: {
1998
2152
  const fieldLiveLocation = field;
1999
2153
  fieldLiveLocation.api.status.value = EApiStatusType.DEFAULT;
2000
2154
  this.formFields[fieldIndex] = fieldLiveLocation;
2001
2155
  break;
2002
- default:
2003
- console.log("BAIJU BEFORE", getObjectDeepCopy(field), getObjectDeepCopy(this.formFields));
2156
+ }
2157
+ default: {
2004
2158
  field.focus = false;
2005
2159
  field.invalid = false;
2006
2160
  this.formFields[fieldIndex] = field;
2007
- console.log("BAIJU AFTER", getObjectDeepCopy(field), getObjectDeepCopy(this.formFields));
2008
2161
  break;
2162
+ }
2009
2163
  }
2010
2164
  this.triggerLogs(ELogEventType.FORM__FIELD_RESET, {
2011
2165
  field_key: fieldKey,
@@ -2013,55 +2167,61 @@ export class KwikIDFormViewComponent {
2013
2167
  });
2014
2168
  }
2015
2169
  fieldGroupReset(fieldGroup) {
2016
- for (let fieldKey of this.fieldGroups[fieldGroup]) {
2170
+ for (const fieldKey of this.fieldGroups[fieldGroup]) {
2017
2171
  this.fieldReset(fieldKey);
2018
2172
  }
2019
2173
  }
2020
2174
  fieldHideApiLoader(fieldKey) {
2021
- let field = getFormFieldByKey(this.formFields, fieldKey);
2022
- let fieldIndex = this.formFields.findIndex((_) => {
2175
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2176
+ const fieldIndex = this.formFields.findIndex((_) => {
2023
2177
  return field.key === _.key;
2024
2178
  });
2025
2179
  // Reset the value of the field in the formFields array
2026
2180
  switch (field.type) {
2027
- case EFieldType.API:
2181
+ case EFieldType.API: {
2028
2182
  const fieldApiCall = field;
2029
2183
  fieldApiCall.disabled = false;
2030
2184
  this.formFields[fieldIndex] = fieldApiCall;
2031
2185
  break;
2032
- case EFieldType.LIVE_LOCATION:
2186
+ }
2187
+ case EFieldType.LIVE_LOCATION: {
2033
2188
  const fieldLiveLocation = field;
2034
2189
  fieldLiveLocation.disabled = false;
2035
2190
  this.formFields[fieldIndex] = fieldLiveLocation;
2036
2191
  break;
2037
- default:
2192
+ }
2193
+ default: {
2038
2194
  break;
2195
+ }
2039
2196
  }
2040
2197
  }
2041
2198
  fieldShowApiLoader(fieldKey) {
2042
- let field = getFormFieldByKey(this.formFields, fieldKey);
2043
- let fieldIndex = this.formFields.findIndex((_) => {
2199
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2200
+ const fieldIndex = this.formFields.findIndex((_) => {
2044
2201
  return field.key === _.key;
2045
2202
  });
2046
2203
  // Reset the value of the field in the formFields array
2047
2204
  switch (field.type) {
2048
- case EFieldType.API:
2205
+ case EFieldType.API: {
2049
2206
  const fieldApiCall = field;
2050
2207
  fieldApiCall.disabled = true;
2051
2208
  this.formFields[fieldIndex] = fieldApiCall;
2052
2209
  break;
2053
- case EFieldType.LIVE_LOCATION:
2210
+ }
2211
+ case EFieldType.LIVE_LOCATION: {
2054
2212
  const fieldLiveLocation = field;
2055
2213
  fieldLiveLocation.disabled = true;
2056
2214
  this.formFields[fieldIndex] = fieldLiveLocation;
2057
2215
  break;
2058
- default:
2216
+ }
2217
+ default: {
2059
2218
  break;
2219
+ }
2060
2220
  }
2061
2221
  }
2062
2222
  setHtml(fieldKey, message) {
2063
2223
  let field = getFormFieldByKey(this.formFields, fieldKey);
2064
- let fieldIndex = this.formFields.findIndex((_) => {
2224
+ const fieldIndex = this.formFields.findIndex((_) => {
2065
2225
  return field.key === _.key;
2066
2226
  });
2067
2227
  field = appendHtmlMessage(field, message);
@@ -2069,7 +2229,7 @@ export class KwikIDFormViewComponent {
2069
2229
  }
2070
2230
  fieldErrorShow(fieldKey, message) {
2071
2231
  let field = getFormFieldByKey(this.formFields, fieldKey);
2072
- let fieldIndex = this.formFields.findIndex((_) => {
2232
+ const fieldIndex = this.formFields.findIndex((_) => {
2073
2233
  return field.key === _.key;
2074
2234
  });
2075
2235
  field = highlightFormFieldError(field, true);
@@ -2083,7 +2243,7 @@ export class KwikIDFormViewComponent {
2083
2243
  }
2084
2244
  fieldErrorHide(fieldKey, message) {
2085
2245
  let field = getFormFieldByKey(this.formFields, fieldKey);
2086
- let fieldIndex = this.formFields.findIndex((_) => {
2246
+ const fieldIndex = this.formFields.findIndex((_) => {
2087
2247
  return field.key === _.key;
2088
2248
  });
2089
2249
  field = highlightFormFieldError(field, false);
@@ -2097,7 +2257,7 @@ export class KwikIDFormViewComponent {
2097
2257
  }
2098
2258
  fieldMessageShow(fieldKey, message) {
2099
2259
  let field = getFormFieldByKey(this.formFields, fieldKey);
2100
- let fieldIndex = this.formFields.findIndex((_) => {
2260
+ const fieldIndex = this.formFields.findIndex((_) => {
2101
2261
  return field.key === _.key;
2102
2262
  });
2103
2263
  field = appendFormFieldMessage(field, message);
@@ -2110,7 +2270,7 @@ export class KwikIDFormViewComponent {
2110
2270
  }
2111
2271
  fieldMessageHide(fieldKey, message) {
2112
2272
  let field = getFormFieldByKey(this.formFields, fieldKey);
2113
- let fieldIndex = this.formFields.findIndex((_) => {
2273
+ const fieldIndex = this.formFields.findIndex((_) => {
2114
2274
  return field.key === _.key;
2115
2275
  });
2116
2276
  field = removeFormFieldMessage(field, message);
@@ -2124,7 +2284,7 @@ export class KwikIDFormViewComponent {
2124
2284
  fieldApiTimerMessageShow(fieldKey, timer) {
2125
2285
  return __awaiter(this, void 0, void 0, function* () {
2126
2286
  let field = getFormFieldByKey(this.formFields, fieldKey);
2127
- let fieldIndex = this.formFields.findIndex((_) => {
2287
+ const fieldIndex = this.formFields.findIndex((_) => {
2128
2288
  return field.key === _.key;
2129
2289
  });
2130
2290
  field = setApiTimerMessage(field, timer);
@@ -2140,7 +2300,7 @@ export class KwikIDFormViewComponent {
2140
2300
  fieldApiTimerMessageHide(fieldKey) {
2141
2301
  return __awaiter(this, void 0, void 0, function* () {
2142
2302
  let field = getFormFieldByKey(this.formFields, fieldKey);
2143
- let fieldIndex = this.formFields.findIndex((_) => {
2303
+ const fieldIndex = this.formFields.findIndex((_) => {
2144
2304
  return field.key === _.key;
2145
2305
  });
2146
2306
  field = setApiTimerMessage(field, undefined);
@@ -2151,6 +2311,7 @@ export class KwikIDFormViewComponent {
2151
2311
  FIELD_CONFIG: field,
2152
2312
  FORM_FIELDS: this.formFields,
2153
2313
  FORM_DATA: this.formData,
2314
+ CAMERA_DATA: this.cameraData,
2154
2315
  TASK_DATA: this.taskData,
2155
2316
  PREVIOUS_FORM_DATA: this.previousFormData,
2156
2317
  ALL_FORMS_DATA: this.allFormsData,
@@ -2320,7 +2481,7 @@ export class KwikIDFormViewComponent {
2320
2481
  let sourceValue = yield source.getValueFromSource(action.props.value.source);
2321
2482
  if (checkObjectKeyExists(action.props, "options")) {
2322
2483
  if (checkObjectKeyExists(action.props.options, "appendToPath")) {
2323
- let appendToPath = yield source.getValueFromSource(action.props.options.appendToPath.source);
2484
+ const appendToPath = yield source.getValueFromSource(action.props.options.appendToPath.source);
2324
2485
  if (isNotEmptyValue(appendToPath)) {
2325
2486
  const appendToPathStr = replaceString(appendToPath.match(`${action.props.options.appendToPath.filterSourceValue}`)[0], "[^a-zA-Z0-9_]", "_");
2326
2487
  const optionsPath = `${action.props.options.path}${appendToPathStr}`;
@@ -2362,10 +2523,11 @@ export class KwikIDFormViewComponent {
2362
2523
  return __awaiter(this, void 0, void 0, function* () {
2363
2524
  const entrypointApiKey = action.props.apiKey;
2364
2525
  let field = getFormFieldByKey(this.formFields, action.props.fieldKey);
2365
- const endpoints = field.api.endpoints;
2366
- const nextApiIndex = endpoints.findIndex((api) => api.apiKey == entrypointApiKey);
2526
+ const { endpoints } = field.api;
2527
+ const nextApiIndex = endpoints.findIndex((api) => api.apiKey === entrypointApiKey);
2367
2528
  const apiConfig = endpoints[nextApiIndex];
2368
2529
  const response = yield this.handleFieldApiCall(field, apiConfig);
2530
+ // eslint-disable-next-line prefer-destructuring
2369
2531
  field = response.field;
2370
2532
  field.api.endpoints[nextApiIndex] = response.api;
2371
2533
  });
@@ -2374,7 +2536,7 @@ export class KwikIDFormViewComponent {
2374
2536
  return __awaiter(this, void 0, void 0, function* () {
2375
2537
  const field = getFormFieldByKey(this.formFields, action.props.fieldKey);
2376
2538
  let multipleApiCallResponses = {};
2377
- field.api.endpoints.map((api) => {
2539
+ field.api.endpoints.forEach((api) => {
2378
2540
  if (checkObjectKeyExists(api.response, "value"))
2379
2541
  multipleApiCallResponses = setValueToObjectPath(multipleApiCallResponses, `${api.apiKey}`, api.response.value);
2380
2542
  });
@@ -2396,11 +2558,11 @@ export class KwikIDFormViewComponent {
2396
2558
  taskMultipleApiCalls(action, object) {
2397
2559
  return __awaiter(this, void 0, void 0, function* () {
2398
2560
  this.showApiLoader();
2399
- let multipleApiConfig = this.formConfig.apis[action.props.formApiKey];
2561
+ const multipleApiConfig = this.formConfig.apis[action.props.formApiKey];
2400
2562
  if (checkObjectKeyExists(action.props, "apiKey")) {
2401
2563
  const entrypointApiKey = action.props.apiKey;
2402
- const endpoints = multipleApiConfig.endpoints;
2403
- const nextApiIndex = endpoints.findIndex((api) => api.apiKey == entrypointApiKey);
2564
+ const { endpoints } = multipleApiConfig;
2565
+ const nextApiIndex = endpoints.findIndex((api) => api.apiKey === entrypointApiKey);
2404
2566
  const apiConfig = endpoints[nextApiIndex];
2405
2567
  const response = yield this.handleApiCall(apiConfig);
2406
2568
  multipleApiConfig.endpoints[nextApiIndex] = response.api;
@@ -2413,6 +2575,7 @@ export class KwikIDFormViewComponent {
2413
2575
  API_CONFIG: multipleApiConfig,
2414
2576
  FORM_FIELDS: this.formFields,
2415
2577
  FORM_DATA: this.formData,
2578
+ CAMERA_DATA: this.cameraData,
2416
2579
  TASK_DATA: this.taskData,
2417
2580
  PREVIOUS_FORM_DATA: this.previousFormData,
2418
2581
  ALL_FORMS_DATA: this.allFormsData,
@@ -2426,7 +2589,7 @@ export class KwikIDFormViewComponent {
2426
2589
  return __awaiter(this, void 0, void 0, function* () {
2427
2590
  const multipleApiConfig = this.formConfig.apis[action.props.formApiKey];
2428
2591
  let multipleApiCallResponses = {};
2429
- multipleApiConfig.endpoints.map((api) => {
2592
+ multipleApiConfig.endpoints.forEach((api) => {
2430
2593
  if (checkObjectKeyExists(api.response, "value"))
2431
2594
  multipleApiCallResponses = setValueToObjectPath(multipleApiCallResponses, `${api.apiKey}`, api.response.value);
2432
2595
  });
@@ -2465,11 +2628,12 @@ export class KwikIDFormViewComponent {
2465
2628
  if (checkObjectKeyExists(action.props.url, "url")) {
2466
2629
  let timeout = 2000;
2467
2630
  if (checkObjectKeyExists(action.props.url, "timeout") &&
2468
- typeof action.props.url.timeout == "number") {
2631
+ typeof action.props.url.timeout === "number") {
2632
+ // eslint-disable-next-line prefer-destructuring
2469
2633
  timeout = action.props.url.timeout;
2470
2634
  }
2471
2635
  this.triggerLogs(ELogEventType.FORM__REDIRECT_URL, {
2472
- timeout: timeout,
2636
+ timeout,
2473
2637
  redirect_url: action.props.url
2474
2638
  });
2475
2639
  setTimeout(() => {
@@ -2494,12 +2658,14 @@ export class KwikIDFormViewComponent {
2494
2658
  throw new Error(`formGroup or formData is 'undefined'.`);
2495
2659
  }
2496
2660
  else {
2497
- let formDataInKwikUIFormat = {};
2498
- for (let fieldKey in formData) {
2499
- const field = getFormFieldByKey(this.formFields, fieldKey);
2500
- if (!isUndefined(field) && !isNull(field)) {
2501
- formDataInKwikUIFormat[fieldKey] =
2502
- convertFormFieldValueToKwikUIFormat(field, formData[fieldKey]);
2661
+ const formDataInKwikUIFormat = {};
2662
+ for (const fieldKey in formData) {
2663
+ if (isNotEmptyValue(fieldKey)) {
2664
+ const field = getFormFieldByKey(this.formFields, fieldKey);
2665
+ if (!isUndefined(field) && !isNull(field)) {
2666
+ formDataInKwikUIFormat[fieldKey] =
2667
+ convertFormFieldValueToKwikUIFormat(field, formData[fieldKey]);
2668
+ }
2503
2669
  }
2504
2670
  }
2505
2671
  this.formGroup.patchValue(formDataInKwikUIFormat, { emitEvent: false });
@@ -2597,7 +2763,7 @@ export class KwikIDFormViewComponent {
2597
2763
  showErrorPreview(previewProperties) {
2598
2764
  this.showPreview({
2599
2765
  html: {
2600
- after: `<div style=\"padding-bottom:0.25rem;padding-top: 0.25rem;position: absolute;margin-top: calc(50vh);font-size: 1.4rem;background: white;padding: 2rem;border-radius: 1rem;box-shadow: 0px 0px 10px -3px black;overflow: auto;height: fit-content;max-height: 90vh; width: 70vw; margin-left: calc(15vw); line-height: 2rem;\">Error: ${previewProperties.message.message}</div>`
2766
+ after: `<div style="padding-bottom:0.25rem;padding-top: 0.25rem;position: absolute;margin-top: calc(50vh);font-size: 1.4rem;background: white;padding: 2rem;border-radius: 1rem;box-shadow: 0px 0px 10px -3px black;overflow: auto;height: fit-content;max-height: 90vh; width: 70vw; margin-left: calc(15vw); line-height: 2rem;">Error: ${previewProperties.message.message}</div>`
2601
2767
  },
2602
2768
  type: "popup"
2603
2769
  });
@@ -2606,8 +2772,8 @@ export class KwikIDFormViewComponent {
2606
2772
  const popupFormConfig = this.formConfig.popupForms[popupFormKey];
2607
2773
  this.onActionShowPopupForm.emit({
2608
2774
  activeFormData: mergeObjects(this.formData, this.taskData),
2609
- popupFormConfig: popupFormConfig,
2610
- popupType: popupType
2775
+ popupFormConfig,
2776
+ popupType
2611
2777
  });
2612
2778
  }
2613
2779
  alertShow(type, message) {
@@ -2711,10 +2877,10 @@ export class KwikIDFormViewComponent {
2711
2877
  break;
2712
2878
  case EActionKey.FIELD_ERROR_SHOW:
2713
2879
  if (checkObjectKeyExists(action.props.message, "source")) {
2714
- const fieldErrorShow_Source = new Source(object);
2715
- let fieldErrorShowSourceValue = yield fieldErrorShow_Source.getValueFromSource(action.props.message.source);
2716
- if (typeof fieldErrorShowSourceValue == "string" ||
2717
- typeof fieldErrorShowSourceValue == "number") {
2880
+ const fieldErrorShowSource = new Source(object);
2881
+ let fieldErrorShowSourceValue = yield fieldErrorShowSource.getValueFromSource(action.props.message.source);
2882
+ if (typeof fieldErrorShowSourceValue === "string" ||
2883
+ typeof fieldErrorShowSourceValue === "number") {
2718
2884
  fieldErrorShowSourceValue = String(fieldErrorShowSourceValue);
2719
2885
  }
2720
2886
  else {
@@ -2727,10 +2893,10 @@ export class KwikIDFormViewComponent {
2727
2893
  break;
2728
2894
  case EActionKey.FIELD_ERROR_HIDE:
2729
2895
  if (checkObjectKeyExists(action.props.message, "source")) {
2730
- const fieldErrorHide_Source = new Source(object);
2731
- let fieldErrorHideSourceValue = yield fieldErrorHide_Source.getValueFromSource(action.props.message.source);
2732
- if (typeof fieldErrorHideSourceValue == "string" ||
2733
- typeof fieldErrorHideSourceValue == "number") {
2896
+ const fieldErrorHideSource = new Source(object);
2897
+ let fieldErrorHideSourceValue = yield fieldErrorHideSource.getValueFromSource(action.props.message.source);
2898
+ if (typeof fieldErrorHideSourceValue === "string" ||
2899
+ typeof fieldErrorHideSourceValue === "number") {
2734
2900
  fieldErrorHideSourceValue = String(fieldErrorHideSourceValue);
2735
2901
  }
2736
2902
  else {
@@ -2802,23 +2968,24 @@ export class KwikIDFormViewComponent {
2802
2968
  break;
2803
2969
  case EActionKey.REDIRECT_TO_URL:
2804
2970
  if (checkObjectKeyExists(action.props.url, "source")) {
2805
- const redirectToUrl_Source = new Source(object);
2806
- let redirectToUrlSourceValue = yield redirectToUrl_Source.getValueFromSource(action.props.url.source);
2971
+ const redirectToUrlSource = new Source(object);
2972
+ let redirectToUrlSourceValue = yield redirectToUrlSource.getValueFromSource(action.props.url.source);
2807
2973
  if (isEmptyString(redirectToUrlSourceValue)) {
2808
2974
  redirectToUrlSourceValue = "";
2809
2975
  }
2810
2976
  action = setValueToObjectPath(action, "props.url.url", redirectToUrlSourceValue);
2811
2977
  }
2812
2978
  this.redirectToUrl(action);
2979
+ break;
2813
2980
  case EActionKey.PREVIEW_DIALOG_SHOW:
2814
2981
  this.showPreview(action.props);
2815
2982
  break;
2816
2983
  case EActionKey.PREVIEW_ERROR_SHOW:
2817
2984
  if (checkObjectKeyExists(action.props.message, "source")) {
2818
- const previewErrorShow_Source = new Source(object);
2819
- let previewErrorShowSourceValue = yield previewErrorShow_Source.getValueFromSource(action.props.message.source);
2820
- if (typeof previewErrorShowSourceValue == "string" ||
2821
- typeof previewErrorShowSourceValue == "number") {
2985
+ const previewErrorShowSource = new Source(object);
2986
+ let previewErrorShowSourceValue = yield previewErrorShowSource.getValueFromSource(action.props.message.source);
2987
+ if (typeof previewErrorShowSourceValue === "string" ||
2988
+ typeof previewErrorShowSourceValue === "number") {
2822
2989
  previewErrorShowSourceValue = String(previewErrorShowSourceValue);
2823
2990
  }
2824
2991
  else {
@@ -2868,10 +3035,10 @@ export class KwikIDFormViewComponent {
2868
3035
  break;
2869
3036
  case EActionKey.SET_HTML:
2870
3037
  if (checkObjectKeyExists(action.props.message, "source")) {
2871
- const fieldHtmlMessage_Source = new Source(object);
2872
- let fieldHtmlMessageSourceValue = yield fieldHtmlMessage_Source.getValueFromSource(action.props.message.source);
2873
- if (typeof fieldHtmlMessageSourceValue == "string" ||
2874
- typeof fieldHtmlMessageSourceValue == "number") {
3038
+ const fieldHtmlMessageSource = new Source(object);
3039
+ let fieldHtmlMessageSourceValue = yield fieldHtmlMessageSource.getValueFromSource(action.props.message.source);
3040
+ if (typeof fieldHtmlMessageSourceValue === "string" ||
3041
+ typeof fieldHtmlMessageSourceValue === "number") {
2875
3042
  fieldHtmlMessageSourceValue = String(fieldHtmlMessageSourceValue);
2876
3043
  }
2877
3044
  else {
@@ -2889,7 +3056,7 @@ export class KwikIDFormViewComponent {
2889
3056
  }
2890
3057
  }
2891
3058
  /** @nocollapse */ KwikIDFormViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDFormViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.KwikIDFormViewService }, { token: i2.KwikIDFormViewApiService }, { token: TuiPushService }, { token: TuiAlertService }, { token: TuiPreviewDialogService }, { token: TuiDialogService }, { token: i3.KwikUILoaderService }, { token: i4.KwikIDCameraRecordService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
2892
- /** @nocollapse */ KwikIDFormViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: { allFormsData: "allFormsData", extraData: "extraData", apiCallResponse: "apiCallResponse", buttonClickResponse: "buttonClickResponse", formConfig: "formConfig", formData: "formData", isMobileView: "isMobileView", popupFormCallback: "popupFormCallback", userConfig: "userConfig", stepConfig: "stepConfig" }, outputs: { getLogs: "getLogs", getUnsavedDataState: "getUnsavedDataState", onActionShowPopupForm: "onActionShowPopupForm", onClickApiCall: "onClickApiCall", onClickViewFile: "onClickViewFile", onClickFormFieldButton: "onClickFormFieldButton", onClickGoBack: "onClickGoBack", onClickSaveForm: "onClickSaveForm", onClickViewForms: "onClickViewForms" }, providers: [KwikIDFormViewService, KwikIDFormViewApiService], viewQueries: [{ propertyName: "formFieldContainerRef", first: true, predicate: ["formFieldContainerRef"], descendants: true }, { propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "preview", first: true, predicate: ["preview"], descendants: true }, { propertyName: "formFieldsRef", predicate: ["formFieldsRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"kwikid-form-container\"\n *ngIf=\"!loading\"\n>\n <div\n id=\"uf-form-fields-header-container\"\n *ngIf=\"\n !formConfig.properties?.header?.title?.hidden ||\n !formConfig.properties?.header?.logo?.hidden ||\n !formConfig.properties?.header?.steps?.hidden ||\n !formConfig.properties?.header?.backButton?.hidden\n \"\n >\n <img\n id=\"uf-header-logo\"\n *ngIf=\"!formConfig.properties?.header?.logo?.hidden && isMobileView\"\n [src]=\"formConfig.properties?.header?.logo?.src\"\n [alt]=\"formConfig.properties?.header?.logo?.alt\"\n [style]=\"\n formConfig.properties?.header?.logo?.styles ?? '' | styleSanitizer\n \"\n />\n <div id=\"uf-form-fields-header-main\">\n <div id=\"uf-form-fields-header-left\">\n <kwikui-button\n *ngIf=\"\n !formConfig.properties?.header.backButton.hidden && isMobileView\n \"\n [disabled]=\"backButton.disabled\"\n [showLoader]=\"backButton.showLoader\"\n appearance=\"mono\"\n icon=\"tuiIconArrowLeft\"\n shape=\"rounded\"\n (onClick)=\"\n handleOnClickGoBack(\n $event,\n formConfig.properties?.header.backButton.mode\n )\n \"\n ></kwikui-button>\n </div>\n <div id=\"uf-form-fields-header-right\">\n <div\n id=\"uf-form-fields-title\"\n *ngIf=\"!formConfig.properties?.header.title.hidden\"\n >{{ formConfig.properties?.header.title.label }}</div\n >\n <div\n id=\"uf-form-fields-steps\"\n *ngIf=\"!formConfig.properties?.header.steps.hidden\"\n >\n Step {{ formConfig.sequenceNo }} of {{ formConfig.formsListLength }}\n </div>\n </div>\n </div>\n <hr\n *ngIf=\"\n !formConfig.properties?.header.title.hidden ||\n !formConfig.properties?.header.steps.hidden ||\n !formConfig.properties?.header.backButton.hidden\n \"\n />\n </div>\n <form\n #formFieldContainerRef\n class=\"kwikid-form show\"\n [style]=\"formConfig.properties?.main?.styles ?? '' | styleSanitizer\"\n [formGroup]=\"formGroup\"\n >\n <ng-container\n *ngFor=\"\n let field of formFields;\n let i = index;\n trackBy: getUniqueIdentifier\n \"\n >\n <ng-container [ngSwitch]=\"field.type\">\n <!-- HTML Content -->\n <ng-container *ngSwitchCase=\"'html'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <div [innerHtml]=\"field.html | kwikuiSafeHtml\"></div>\n </div>\n </ng-container>\n <!-- Form Title -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div\n #formFieldsRef\n class=\"title\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n [class.hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <div>\n {{ field.label }}\n </div>\n <kwikui-button\n *ngIf=\"field?.reset\"\n appearance=\"whiteblock\"\n size=\"s\"\n [label]=\"field?.properties?.resetButtonLabel ?? 'Reset'\"\n (onClick)=\"handleOnClickResetFormFields($event, field)\"\n ></kwikui-button>\n </div>\n </ng-container>\n <!-- Button -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button\n [appearance]=\"field?.properties?.appearance ?? 'primary'\"\n [class]=\"field?.properties?.class\"\n [disabled]=\"field?.disabled\"\n [icon]=\"field?.properties?.icon\"\n [iconRight]=\"field?.properties?.iconRight\"\n [id]=\"field?.key\"\n [label]=\"field?.label\"\n [shape]=\"field?.properties?.shape\"\n [showLoader]=\"field?.properties?.loading ?? false\"\n [size]=\"field?.properties?.size\"\n [styles]=\"field?.properties?.styles\"\n [type]=\"'button'\"\n (onClick)=\"handleOnClickFormFieldButton(field)\"\n ></kwikui-button>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Text -->\n <ng-container *ngSwitchCase=\"'text'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input\n [case]=\"field?.properties?.case\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [type]=\"'text'\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Currency -->\n <ng-container *ngSwitchCase=\"'currency'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-currency\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [currencyType]=\"field?.properties?.currencyType\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n [value]=\"formGroup.controls[field.key].value\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-currency>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Email -->\n <ng-container *ngSwitchCase=\"'email'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-email\n [case]=\"field?.properties?.case\"\n [disabled]=\"field?.disabled\"\n [domains]=\"field?.properties?.domains\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-email>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Password -->\n <ng-container *ngSwitchCase=\"'password'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-password\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [hintContent]=\"field?.properties?.hintContent\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-password>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Textarea -->\n <ng-container *ngSwitchCase=\"'textarea'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-textarea\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-textarea>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Checkbox -->\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-checkbox\n [contentAlign]=\"field?.properties?.contentAlign ?? 'left'\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.properties?.placeholder\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size ?? 'l'\"\n [validators]=\"field?.validators\"\n [variant]=\"field?.properties?.variant ?? 'block'\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-checkbox>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Number -->\n <ng-container *ngSwitchCase=\"'number'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-number\n [decimal]=\"field?.properties?.decimal\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix ?? ''\"\n [precision]=\"field?.properties?.precision\"\n [prefix]=\"field?.properties?.prefix ?? ''\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-number>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Date -->\n <ng-container *ngSwitchCase=\"'date'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-date\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [maxCalculatedFromToday]=\"\n field?.properties?.maxCalculatedFromToday\n \"\n [min]=\"field?.properties?.min\"\n [minCalculatedFromToday]=\"\n field?.properties?.minCalculatedFromToday\n \"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-date>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Time -->\n <ng-container *ngSwitchCase=\"'time'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-time\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [items]=\"field?.properties?.items\"\n [label]=\"field?.label\"\n [mode]=\"field?.properties?.mode\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-time>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Phone -->\n <ng-container *ngSwitchCase=\"'phone'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-phone\n [countryCode]=\"field?.properties?.countryCode\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [phoneMaskAfterCountryCode]=\"\n field?.properties?.phoneMaskAfterCountryCode\n \"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [removeCountryCodeFromValue]=\"\n field?.properties?.removeCountryCodeFromValue\n \"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-phone>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Radio -->\n <ng-container *ngSwitchCase=\"'radio'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto; padding: 0px 0.5rem\"\n >\n <kwikui-input-radio\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [items]=\"field?.options\"\n [label]=\"field?.label\"\n [orientation]=\"field?.properties?.orientation\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-radio>\n </label>\n <ng-template #labelTemplate>\n <p\n class=\"tui-space_bottom-2\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Dropdown -->\n <ng-container *ngSwitchCase=\"'select'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-select\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [options]=\"field.options\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [searchable]=\"field?.properties?.searchable\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-select>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Slider -->\n <ng-container *ngSwitchCase=\"'slider'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-slider\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [quantum]=\"field?.properties?.quantum\"\n [size]=\"field?.properties?.size\"\n [steps]=\"field?.properties?.steps\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-slider>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- API Call -->\n <ng-container *ngSwitchCase=\"'api'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button-api-call\n [apiStatus]=\"field?.api?.status?.value\"\n [apiTimer]=\"field?.api?.timer\"\n [class]=\"field?.class\"\n [disabled]=\"field?.disabled\"\n [id]=\"field.key\"\n [label]=\"field?.api?.status?.labels[field?.api?.status?.value]\"\n [showLoader]=\"field?.disabled === 'loading'\"\n [size]=\"field?.properties?.size\"\n [styles]=\"\n field?.properties?.styles\n ? field?.properties?.styles\n : 'width: fit-content'\n \"\n (onClick)=\"handleOnClickApiCall($event)\"\n (onApiTimerStop)=\"handleOnApiTimerStop($event)\"\n ></kwikui-button-api-call>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Live Location -->\n <ng-container *ngSwitchCase=\"'live-location'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button-live-location\n [class]=\"field?.class\"\n [disabled]=\"field?.disabled\"\n [id]=\"field.key\"\n [label]=\"field?.api?.status?.labels[field?.api?.status?.value]\"\n [liveLocationStatus]=\"field?.api?.status?.value\"\n [shape]=\"field?.properties?.shape\"\n [isShowLatLongCaptureTimestamp]=\"\n field?.properties?.isShowLatLongCaptureTimestamp\n \"\n [showLoader]=\"field?.disabled\"\n [size]=\"field?.properties?.size\"\n styles=\"width: fit-content\"\n (onClick)=\"handleOnClickLiveLocation($event)\"\n (onLocationPermission)=\"handleOnLocationPermission($event)\"\n ></kwikui-button-live-location>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Mobile OTP -->\n <ng-container *ngSwitchCase=\"'otp'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-otp\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [mask]=\"field?.properties?.mask\"\n [mode]=\"field?.properties?.mode\"\n [otpLength]=\"field?.properties?.otpLength\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-otp>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Aadhaar Number -->\n <ng-container *ngSwitchCase=\"'aadhaar-number'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-aadhaar\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [mask]=\"field?.properties?.mask\"\n [placeholder]=\"field?.placeholder\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-aadhaar>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Preview Image -->\n <ng-container *ngSwitchCase=\"'image'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-image\n [altText]=\"field?.properties?.altText\"\n [class]=\"field?.properties?.class\"\n [html]=\"field?.properties?.html\"\n [id]=\"field.key\"\n [imageSrc]=\"formGroup.controls[field.key].value ?? ''\"\n [imageType]=\"field?.properties?.imageType\"\n [loadingType]=\"field?.properties?.loadingType\"\n [styles]=\"field?.properties?.styles\"\n ></kwikui-image>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- File Upload -->\n <ng-container *ngSwitchCase=\"'file'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto\"\n >\n <kwikui-input-files\n [accept]=\"field?.properties?.accept\"\n [class]=\"field?.properties?.class\"\n [disabled]=\"field?.disabled\"\n [files]=\"files[field.key]\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field?.key\"\n [label]=\"field?.properties?.label\"\n [link]=\"field?.properties?.link\"\n [maxFileSize]=\"field?.properties?.maxFileSize\"\n [multiple]=\"field?.properties?.multiple\"\n [setFileTypesToForm]=\"['NORMAL']\"\n [styles]=\"field?.properties?.styles\"\n [validators]=\"field?.validators\"\n [showViewButton]=\"field?.properties?.showViewButton\"\n (getKeyValue)=\"handleGetKeyValueFile($event)\"\n (getRemovedFile)=\"handleRemovedFile($event)\"\n (getViewButtonClick)=\"handleViewButtonClick($event, field)\"\n ></kwikui-input-files>\n </label>\n <ng-template #labelTemplate>\n <p\n style=\"padding: 0px 0.25rem; margin-bottom: 0.25rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Camera Capture -->\n <ng-container *ngSwitchCase=\"'capture'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n *ngIf=\"\n field?.label !== '' &&\n field?.label !== undefined &&\n field?.label !== null\n \"\n style=\"min-height: auto\"\n >\n <p\n *ngIf=\"field?.label !== ''\"\n style=\"padding: 0px 0.25rem; margin-bottom: 0.5rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </label>\n <kwikui-input-camera\n [buttonText]=\"field?.properties?.buttonText\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [mediaFiles]=\"mediaFiles[field.key]\"\n [properties]=\"field?.properties\"\n [showMediaFiles]=\"field?.properties?.showMediaFiles\"\n [type]=\"'capture'\"\n [validators]=\"field?.validators\"\n (onClick)=\"handleOnClickInputCamera($event, field)\"\n (getRemovedFile)=\"handleOnClickGetRemovedMediaFile($event)\"\n ></kwikui-input-camera>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Camera Record -->\n <ng-container *ngSwitchCase=\"'record'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n *ngIf=\"\n field?.label !== '' &&\n field?.label !== undefined &&\n field?.label !== null\n \"\n style=\"min-height: auto\"\n >\n <p\n *ngIf=\"field?.label !== ''\"\n style=\"padding: 0px 0.25rem; margin-bottom: 0.5rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </label>\n <kwikui-input-camera\n [buttonText]=\"field?.properties?.buttonText\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [mediaFiles]=\"mediaFiles[field.key]\"\n [properties]=\"field?.properties\"\n [showMediaFiles]=\"field?.properties?.showMediaFiles\"\n [type]=\"'record'\"\n [validators]=\"field?.validators\"\n (onClick)=\"handleOnClickInputCamera($event, field)\"\n (getRemovedFile)=\"handleOnClickGetRemovedMediaFile($event)\"\n ></kwikui-input-camera>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Star Rating -->\n <ng-container *ngSwitchCase=\"'star-rating'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto; padding: 0px 0.5rem\"\n >\n <kwikui-star-rating\n [color]=\"field?.properties?.color\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [iconMarked]=\"field?.properties?.iconMarked\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-star-rating>\n </label>\n <ng-template #labelTemplate>\n <p>\n <b\n >{{ field?.properties?.placeholder }}\n <span *ngIf=\"field.validators?.required\">*</span></b\n >\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </form>\n <div\n class=\"kwikid-form-buttons\"\n *ngIf=\"\n !formConfig.properties.footer.viewFormsButton.hidden ||\n !formConfig.properties.footer.saveButton.hidden\n \"\n >\n <kwikui-button\n *ngIf=\"\n !formConfig.properties.footer.viewFormsButton.hidden && isMobileView\n \"\n [appearance]=\"'secondary'\"\n [disabled]=\"viewFormsButton.disabled\"\n [label]=\"formConfig.properties.footer.viewFormsButton.label\"\n [showLoader]=\"viewFormsButton.showLoader\"\n [styles]=\"'width: 100%'\"\n (onClick)=\"handleOnClickViewForms($event)\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"!formConfig.properties.footer.saveButton.hidden\"\n [disabled]=\"saveFormButton.disabled\"\n [label]=\"formConfig.properties.footer.saveButton.label\"\n [showLoader]=\"saveFormButton.showLoader\"\n [styles]=\"'width: 100%'\"\n (onClick)=\"handleOnClickSaveForm($event)\"\n ></kwikui-button>\n </div>\n</div>\n<div\n class=\"kwikid-form-container-loading\"\n *ngIf=\"loading\"\n>\n <div\n *ngFor=\"let item of [].constructor(7); let i = index\"\n class=\"large-wrapper tui-skeleton tui-skeleton_rounded\"\n >\n </div>\n</div>\n\n<kwikui-loader></kwikui-loader>\n\n<tui-push\n id=\"field-error-notification\"\n *tuiPush=\"showErrorNotification\"\n heading=\"Missing/Incorrect Fields!\"\n type=\"Error\"\n (close)=\"toggleErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n\n<tui-push\n id=\"permission-error-notification\"\n *tuiPush=\"showPermissionErrorNotification\"\n heading=\"Please provide required permissions!\"\n type=\"Error\"\n (close)=\"togglePermissionErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n\n<ng-template\n #preview\n let-preview\n>\n <tui-preview\n [rotatable]=\"false\"\n [zoomable]=\"false\"\n class=\"preview-container\"\n >\n <tui-preview-title *ngIf=\"previewProperties.title !== ''\">{{\n previewProperties.title\n }}</tui-preview-title>\n\n <ng-container *ngIf=\"!previewProperties.unavailable\">\n <div\n *ngIf=\"previewProperties?.html?.before !== ''\"\n class=\"preview-html preview-html-before\"\n [style]=\"previewProperties?.html?.beforeStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.before | kwikuiSafeHtml\"\n ></div>\n\n <!-- Content within the iframe -->\n <div\n class=\"preview-iframe-content\"\n [style]=\"\n previewProperties?.iframe?.containerStyles ?? '' | styleSanitizer\n \"\n *ngIf=\"previewProperties.iframe.src !== ''\"\n >\n <!-- Your HTML content here -->\n <iframe\n [src]=\"previewProperties.iframe.src | kwikuiSafeUrl\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n [title]=\"previewProperties.iframe.title\"\n class=\"preview-iframe\"\n scrolling=\"auto\"\n ></iframe>\n </div>\n\n <div\n *ngIf=\"previewProperties?.html?.after !== ''\"\n class=\"preview-html preview-html-after\"\n [style]=\"previewProperties?.html?.afterStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.after | kwikuiSafeHtml\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"previewProperties.unavailable\">\n <div class=\"preview-unavailable\">\n <tui-svg\n src=\"tuiIconFileLarge\"\n class=\"t-icon\"\n ></tui-svg>\n <div>Preview unavailable</div>\n </div>\n </ng-container>\n\n <button\n tuiIconButton\n tuiPreviewAction\n icon=\"tuiIconCloseLarge\"\n title=\"Close\"\n type=\"button\"\n (click)=\"preview.complete()\"\n ></button>\n </tui-preview>\n</ng-template>\n\n<ng-template\n #dialog\n let-dialog\n>\n <div class=\"preview-container\">\n <ng-container *ngIf=\"!previewProperties.unavailable\">\n <div\n *ngIf=\"previewProperties?.html?.before !== ''\"\n class=\"preview-html preview-html-before\"\n [style]=\"previewProperties?.html?.beforeStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.before | kwikuiSafeHtml\"\n ></div>\n\n <!-- Content within the iframe -->\n <div\n class=\"preview-iframe-content\"\n [style]=\"\n previewProperties?.iframe?.containerStyles ?? '' | styleSanitizer\n \"\n *ngIf=\"previewProperties.iframe.src !== ''\"\n >\n <!-- Your HTML content here -->\n <iframe\n [src]=\"previewProperties.iframe.src | kwikuiSafeUrl\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n [title]=\"previewProperties.iframe.title\"\n class=\"preview-iframe\"\n scrolling=\"auto\"\n ></iframe>\n </div>\n\n <div\n *ngIf=\"previewProperties?.html?.after !== ''\"\n class=\"preview-html preview-html-after\"\n [style]=\"previewProperties?.html?.afterStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.after | kwikuiSafeHtml\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"previewProperties.unavailable\">\n <div class=\"preview-unavailable\">\n <tui-svg\n src=\"tuiIconFileLarge\"\n class=\"t-icon\"\n ></tui-svg>\n <div>Preview unavailable</div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<div\n id=\"kwikid-camera-container\"\n *ngIf=\"isShowCamera\"\n>\n <div\n id=\"kwikid-camera-wrapper\"\n [class.fullscreen]=\"isShowCameraFullscreen\"\n >\n <kwikid-camera\n [type]=\"cameraType\"\n [data]=\"cameraData\"\n [image]=\"cameraImage\"\n [video]=\"cameraVideo\"\n [config]=\"cameraConfig\"\n (getImage)=\"handleGetCameraMedia($event, 'CAPTURE')\"\n (getVideo)=\"handleGetCameraMedia($event, 'RECORD')\"\n (onClickBack)=\"handleOnClickCameraBack($event)\"\n (onClickClose)=\"handleOnClickCameraClose($event)\"\n (onClickSave)=\"handleOnClickSaveCameraMedia($event, cameraType)\"\n >\n <ng-container\n *ngIf=\"cameraType === 'CAPTURE'\"\n slot=\"capture-header\"\n >\n <div class=\"capture-header-container\">\n <div class=\"capture-header-left\"> </div>\n <div class=\"capture-header-center\">\n <kwikui-button\n *ngIf=\"cameraConfig?.header?.title !== ''\"\n appearance=\"whiteblock\"\n [label]=\"cameraConfig?.header?.title\"\n shape=\"rounded\"\n size=\"s\"\n ></kwikui-button>\n </div>\n <div class=\"capture-header-right\">\n <kwikui-button\n *ngIf=\"cameraConfig?.header?.isExpand\"\n id=\"kwikid-camera-header-enlarge-button\"\n appearance=\"whiteblock\"\n [icon]=\"\n isShowCameraFullscreen ? 'tuiIconMinimize2' : 'tuiIconMaximize2'\n \"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"isShowCameraFullscreen = !isShowCameraFullscreen\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"cameraConfig?.header?.isClose\"\n id=\"kwikid-camera-header-close-button\"\n appearance=\"whiteblock\"\n icon=\"tuiIconCloseLarge\"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"handleOnClickCameraClose($event)\"\n ></kwikui-button>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"cameraType === 'RECORD'\"\n slot=\"record-header\"\n >\n <div class=\"record-header-container\">\n <div class=\"record-header-row row-1\">\n <div class=\"record-header-left\">\n <kwikui-button\n *ngIf=\"\n cameraConfig?.header?.isBack && cameraRecordingState == 'NONE'\n \"\n appearance=\"whiteblock\"\n icon=\"tuiIconArrowLeft\"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"handleOnClickCameraClose($event)\"\n ></kwikui-button>\n </div>\n <div class=\"record-header-center\">\n <kwikui-button\n *ngIf=\"cameraConfig?.header?.title !== ''\"\n appearance=\"whiteblock\"\n [label]=\"cameraConfig?.header?.title\"\n shape=\"rounded\"\n size=\"s\"\n ></kwikui-button>\n </div>\n <div class=\"record-header-right\">\n <kwikui-button\n *ngIf=\"cameraConfig?.header?.isExpand\"\n id=\"kwikid-camera-header-enlarge-button\"\n appearance=\"whiteblock\"\n [icon]=\"\n isShowCameraFullscreen\n ? 'tuiIconMinimize2'\n : 'tuiIconMaximize2'\n \"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"isShowCameraFullscreen = !isShowCameraFullscreen\"\n ></kwikui-button>\n </div>\n </div>\n <div class=\"record-header-row row-2\">\n <div\n id=\"blinking-dot-container\"\n [class.recording]=\"cameraRecordingState == 'RECORDING'\"\n [class.paused]=\"cameraRecordingState == 'PAUSED'\"\n [class.recorded]=\"\n cameraRecordingState == 'NONE' ||\n cameraRecordingState === 'RECORDED'\n \"\n >\n <div\n *ngIf=\"cameraRecordingState == 'RECORDING'\"\n class=\"dot recording blink\"\n >\n </div>\n <div\n *ngIf=\"cameraRecordingState === 'PAUSED'\"\n class=\"dot paused\"\n >\n </div>\n <div\n *ngIf=\"\n cameraRecordingState == 'NONE' ||\n cameraRecordingState === 'RECORDED'\n \"\n class=\"dot recorded\"\n >\n </div>\n <div>\n &nbsp;{{ cameraRecordingTime | formatTimer }}\n <ng-container\n *ngIf=\"cameraConfig?.others?.maxRecordingTimeInSeconds\"\n >\n /\n {{\n cameraConfig?.others?.maxRecordingTimeInSeconds\n | formatTimer\n }}\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </kwikid-camera>\n </div>\n</div>\n", styles: [".kwikid-form-container{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center}.kwikid-form.show{width:100%;height:100%;padding:1rem;overflow-y:auto;display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:stretch;scroll-behavior:smooth}.kwikid-form.show>*:not(:last-child){margin-bottom:1rem}.kwikid-form-buttons{width:100%;bottom:0px;padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}.kwikid-form-buttons>*:not(:last-child){margin-right:1rem}.kwikid-form-buttons *{flex-grow:1}#uf-form-fields-header-container{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:flex-start;padding:1rem 1rem 0}#uf-form-fields-header-container>*:not(:last-child){margin-bottom:.5rem}#uf-form-fields-header-container #uf-header-logo{width:-moz-fit-content;width:fit-content;height:50px}#uf-form-fields-header-container #uf-form-fields-header-main{display:flex;flex-direction:row;align-content:center;justify-content:flex-start;align-items:center;width:100%}#uf-form-fields-header-container #uf-form-fields-header-main>*:not(:last-child){margin-right:.25rem}#uf-form-fields-header-container #uf-form-fields-header-main #uf-form-fields-header-right{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:flex-start}#uf-form-fields-header-container #uf-form-fields-header-main #uf-form-fields-header-right>*{margin-bottom:.5rem}#uf-form-fields-header-container hr{width:100%}#uf-form-fields-title{color:#000;font-size:1.75em;font-weight:bold}#uf-form-fields-steps{color:var(--color-on-secondary-container);font-size:1rem}.title{border-left:.25rem solid var(--tui-primary);padding:.75rem;font-size:1.4em;font-weight:bold;background-color:var(--tui-secondary);display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center}.title>*:not(:last-child){margin-right:.5rem}.title:not(:first-child){margin-top:.5rem}.title.hidden{display:none}.large-wrapper{width:100%;height:60px}.large-wrapper:first-child{margin-bottom:auto}.large-wrapper:last-child{margin-top:auto}.kwikid-form-container-loading{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;padding:1rem}.kwikid-form-container-loading>* :not(:last-child){margin-bottom:1rem}#field-error-notification,#permission-error-notification{background-color:var(--tui-error-fill);color:#fff!important}#field-error-notification .t-top,#permission-error-notification .t-top{color:#fff!important}#field-error-notification .t-close,#permission-error-notification .t-close{color:#fff!important}.preview-container{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;align-content:center;height:calc(100vh - 3rem)}@media only screen and (min-width: 768px){.preview-container{height:calc(100vh - 10rem);width:calc(100vw - 10rem)}}.preview-container>*:not(:last-child){margin-bottom:1rem}.preview-container .preview-html{flex-grow:1}.preview-container .preview-iframe-content{height:100%;flex-grow:1}.preview-container .preview-iframe-content .preview-iframe{width:100%;height:100%}.preview-container .preview-unavailable{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;color:#fff;font-size:1.2rem;top:50%;left:50%;width:100%;height:100vh}.preview-container .preview-unavailable>*:not(:last-child){margin-bottom:1rem}#kwikid-camera-container{width:100%;height:100%;position:fixed;top:50%;left:50%;background-color:#0000008f;transform:translate(-50%,-50%);z-index:100}#kwikid-camera-container #kwikid-camera-wrapper{width:min(80%);height:max(85%);box-shadow:#0000008f 0 22px 70px 4px;overflow:hidden;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:1rem;background-color:#000;transition:5s linear ease}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container{display:flex;width:100%;max-width:100%;padding:0}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-left{flex:1;text-align:left}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-center{flex:1;width:100%;min-width:max-content;text-align:center;margin:auto}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-right{flex:1;text-align:right;display:flex;justify-content:flex-end;grid-gap:1rem;gap:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container{display:flex;width:100%;max-width:100%;padding:0;color:#fff;flex-direction:column;justify-content:flex-start;align-items:stretch}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1{display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin-bottom:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-left{flex:1;display:flex;justify-content:flex-start;grid-gap:1rem;gap:1rem;text-align:left}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-center{flex:1;width:100%;min-width:max-content;text-align:center;margin:auto}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-right{flex:1;text-align:right;display:flex;justify-content:flex-end;grid-gap:1rem;gap:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2{display:flex;flex-direction:row;justify-content:center;align-items:center}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;grid-gap:.25rem;gap:.25rem;padding:.35rem .6rem;width:-moz-fit-content;width:fit-content;border-radius:2rem;background-color:#f5f5f5}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.recording{color:red;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.paused{color:#525252;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.recorded{color:#000;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot{display:inline-block;width:.75rem;height:.75rem;border-radius:100%}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.recording{background-color:red;box-shadow:0 0 5px -1px red}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.paused{background-color:#525252;box-shadow:0 0 5px -1px #000}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.recorded{background-color:#000;box-shadow:0 0 5px -1px #000}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.blink{animation:blinker 1s cubic-bezier(.5,0,1,1) infinite alternate}@keyframes blinker{0%{opacity:1}to{opacity:0}}#kwikid-camera-container #kwikid-camera-wrapper.fullscreen{width:100%;height:100%;border-radius:0;transition:5s linear ease}@media only screen and (max-width: 600px){#kwikid-camera-container #kwikid-camera-wrapper{width:100%;height:100%;border-radius:0;transition:5s linear ease}#kwikid-camera-container #kwikid-camera-wrapper #kwikid-camera-header-enlarge-button{display:none}}\n", "::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\n"], components: [{ type: i3.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i3.KwikUIMessagesComponent, selector: "kwikui-messages", inputs: ["id", "messages"] }, { type: i3.KwikUIInputComponent, selector: "kwikui-input", inputs: ["case", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "type", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputCurrencyComponent, selector: "kwikui-input-currency", inputs: ["currencyType", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators", "value"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputEmailComponent, selector: "kwikui-input-email", inputs: ["case", "disabled", "domains", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputPasswordComponent, selector: "kwikui-input-password", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUITextareaComponent, selector: "kwikui-textarea", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUICheckboxComponent, selector: "kwikui-checkbox", inputs: ["contentAlign", "disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "placeholder", "properties", "size", "validators", "variant"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputNumberComponent, selector: "kwikui-input-number", inputs: ["decimal", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "min", "placeholder", "postfix", "precision", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputDateComponent, selector: "kwikui-input-date", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "maxCalculatedFromToday", "min", "minCalculatedFromToday", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputTimeComponent, selector: "kwikui-input-time", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "items", "invalid", "label", "mode", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputPhoneComponent, selector: "kwikui-input-phone", inputs: ["countryCode", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "phoneMaskAfterCountryCode", "placeholder", "postfix", "prefix", "properties", "removeCountryCodeFromValue", "size", "validators"], outputs: ["getKeyValue"] }, { type: i5.TuiLabelComponent, selector: "label[tuiLabel]", inputs: ["tuiLabel", "context"] }, { type: i3.KwikUIInputRadioComponent, selector: "kwikui-input-radio", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "items", "label", "orientation", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputSelectComponent, selector: "kwikui-input-select", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "options", "placeholder", "properties", "searchable", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputSliderComponent, selector: "kwikui-input-slider", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "min", "placeholder", "postfix", "prefix", "properties", "quantum", "size", "steps", "type", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIButtonApiCallComponent, selector: "kwikui-button-api-call", inputs: ["apiTimer", "apiStatus", "class", "disabled", "id", "label", "shape", "showLoader", "size", "styles"], outputs: ["onClick", "onApiTimerStop"] }, { type: i3.KwikUIButtonLiveLocationComponent, selector: "kwikui-button-live-location", inputs: ["liveLocationStatus", "class", "disabled", "id", "label", "shape", "showLoader", "size", "styles", "isShowLatLongCaptureTimestamp"], outputs: ["onClick", "onLocationPermission"] }, { type: i3.KwikUIInputOtpComponent, selector: "kwikui-input-otp", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "mask", "mode", "otpLength", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputAadhaarComponent, selector: "kwikui-input-aadhaar", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "mask", "placeholder", "properties", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIImageComponent, selector: "kwikui-image", inputs: ["altText", "class", "html", "id", "imageSrc", "imageType", "loadingType", "styles"], outputs: ["onClick"] }, { type: i3.KwikUIInputFilesComponent, selector: "kwikui-input-files", inputs: ["accept", "class", "disabled", "files", "formControl", "formControlName", "icon", "id", "label", "link", "maxFileSize", "multiple", "setFileTypesToForm", "showAddedFiles", "size", "styles", "validators", "variant", "showViewButton"], outputs: ["getKeyValue", "getRemovedFile", "getViewButtonClick"] }, { type: i4.KwikUIInputCameraComponent, selector: "kwikui-input-camera", inputs: ["buttonText", "disabled", "focus", "formControl", "formControlName", "icon", "id", "invalid", "mediaFiles", "properties", "showMediaFiles", "size", "type", "validators"], outputs: ["onClick", "getRemovedFile"] }, { type: i3.KwikUIStarRatingComponent, selector: "kwikui-star-rating", inputs: ["color", "disabled", "focus", "formControl", "formControlName", "icon", "iconMarked", "id", "invalid", "label", "max", "min", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i6.TuiPushComponent, selector: "tui-push", inputs: ["heading", "type", "lines", "timestamp"], outputs: ["close"] }, { type: i5.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i7.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { type: i7.TuiPreviewTitleComponent, selector: "tui-preview-title" }, { type: i5.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }, { type: i4.KwikIDCameraComponent, selector: "kwikid-camera", inputs: ["type", "config", "data", "image", "video"], outputs: ["getImage", "onClickSave", "getVideo"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i9.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.TuiPushAlertDirective, selector: "[tuiPush]", inputs: ["tuiPush"] }, { type: i6.TuiPushDirective, selector: "tui-push" }, { type: i7.TuiPreviewActionDirective, selector: "[tuiPreviewAction]" }], pipes: { "styleSanitizer": i10.StyleSanitizerPipe, "kwikuiSafeHtml": i3.KwikUISafeHtmlPipe, "kwikuiSafeUrl": i3.KwikUISafeUrlPipe, "formatTimer": i11.TimerPipe } });
3059
+ /** @nocollapse */ KwikIDFormViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: { allFormsData: "allFormsData", extraData: "extraData", apiCallResponse: "apiCallResponse", buttonClickResponse: "buttonClickResponse", formConfig: "formConfig", formData: "formData", isMobileView: "isMobileView", popupFormCallback: "popupFormCallback", userConfig: "userConfig", stepConfig: "stepConfig" }, outputs: { getLogs: "getLogs", getUnsavedDataState: "getUnsavedDataState", onActionShowPopupForm: "onActionShowPopupForm", onClickApiCall: "onClickApiCall", onClickViewFile: "onClickViewFile", onClickFormFieldButton: "onClickFormFieldButton", onClickGoBack: "onClickGoBack", onClickSaveForm: "onClickSaveForm", onClickViewForms: "onClickViewForms" }, providers: [KwikIDFormViewService, KwikIDFormViewApiService], viewQueries: [{ propertyName: "formFieldContainerRef", first: true, predicate: ["formFieldContainerRef"], descendants: true }, { propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "preview", first: true, predicate: ["preview"], descendants: true }, { propertyName: "formFieldsRef", predicate: ["formFieldsRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"kwikid-form-container\"\n *ngIf=\"!loading\"\n>\n <div\n id=\"uf-form-fields-header-container\"\n *ngIf=\"\n !formConfig.properties?.header?.title?.hidden ||\n !formConfig.properties?.header?.logo?.hidden ||\n !formConfig.properties?.header?.steps?.hidden ||\n !formConfig.properties?.header?.backButton?.hidden\n \"\n >\n <img\n id=\"uf-header-logo\"\n *ngIf=\"!formConfig.properties?.header?.logo?.hidden && isMobileView\"\n [src]=\"formConfig.properties?.header?.logo?.src\"\n [alt]=\"formConfig.properties?.header?.logo?.alt\"\n [style]=\"\n formConfig.properties?.header?.logo?.styles ?? '' | styleSanitizer\n \"\n />\n <div id=\"uf-form-fields-header-main\">\n <div id=\"uf-form-fields-header-left\">\n <kwikui-button\n *ngIf=\"\n !formConfig.properties?.header.backButton.hidden && isMobileView\n \"\n [disabled]=\"backButton.disabled\"\n [showLoader]=\"backButton.showLoader\"\n appearance=\"mono\"\n icon=\"tuiIconArrowLeft\"\n shape=\"rounded\"\n (onClick)=\"\n handleOnClickGoBack(\n $event,\n formConfig.properties?.header.backButton.mode\n )\n \"\n ></kwikui-button>\n </div>\n <div id=\"uf-form-fields-header-right\">\n <div\n id=\"uf-form-fields-title\"\n *ngIf=\"!formConfig.properties?.header.title.hidden\"\n >{{ formConfig.properties?.header.title.label }}</div\n >\n <div\n id=\"uf-form-fields-steps\"\n *ngIf=\"!formConfig.properties?.header.steps.hidden\"\n >\n Step {{ formConfig.sequenceNo }} of {{ formConfig.formsListLength }}\n </div>\n </div>\n </div>\n <hr\n *ngIf=\"\n !formConfig.properties?.header.title.hidden ||\n !formConfig.properties?.header.steps.hidden ||\n !formConfig.properties?.header.backButton.hidden\n \"\n />\n </div>\n <form\n #formFieldContainerRef\n class=\"kwikid-form show\"\n [style]=\"formConfig.properties?.main?.styles ?? '' | styleSanitizer\"\n [formGroup]=\"formGroup\"\n >\n <ng-container\n *ngFor=\"\n let field of formFields;\n let i = index;\n trackBy: getUniqueIdentifier\n \"\n >\n <ng-container [ngSwitch]=\"field.type\">\n <!-- HTML Content -->\n <ng-container *ngSwitchCase=\"'html'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <div [innerHtml]=\"field.html | kwikuiSafeHtml\"></div>\n </div>\n </ng-container>\n <!-- Form Title -->\n <ng-container *ngSwitchCase=\"'title'\">\n <div\n #formFieldsRef\n class=\"title\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n [class.hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <div>\n {{ field.label }}\n </div>\n <kwikui-button\n *ngIf=\"field?.reset\"\n appearance=\"whiteblock\"\n size=\"s\"\n [label]=\"field?.properties?.resetButtonLabel ?? 'Reset'\"\n (onClick)=\"handleOnClickResetFormFields($event, field)\"\n ></kwikui-button>\n </div>\n </ng-container>\n <!-- Button -->\n <ng-container *ngSwitchCase=\"'button'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button\n [appearance]=\"field?.properties?.appearance ?? 'primary'\"\n [class]=\"field?.properties?.class\"\n [disabled]=\"field?.disabled\"\n [icon]=\"field?.properties?.icon\"\n [iconRight]=\"field?.properties?.iconRight\"\n [id]=\"field?.key\"\n [label]=\"field?.label\"\n [shape]=\"field?.properties?.shape\"\n [showLoader]=\"field?.properties?.loading ?? false\"\n [size]=\"field?.properties?.size\"\n [styles]=\"field?.properties?.styles\"\n [type]=\"'button'\"\n (onClick)=\"handleOnClickFormFieldButton(field)\"\n ></kwikui-button>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Text -->\n <ng-container *ngSwitchCase=\"'text'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input\n [case]=\"field?.properties?.case\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [type]=\"'text'\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Currency -->\n <ng-container *ngSwitchCase=\"'currency'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-currency\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [currencyType]=\"field?.properties?.currencyType\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n [value]=\"formGroup.controls[field.key].value\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-currency>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Email -->\n <ng-container *ngSwitchCase=\"'email'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-email\n [case]=\"field?.properties?.case\"\n [disabled]=\"field?.disabled\"\n [domains]=\"field?.properties?.domains\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-email>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Password -->\n <ng-container *ngSwitchCase=\"'password'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-password\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [hintContent]=\"field?.properties?.hintContent\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-password>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Textarea -->\n <ng-container *ngSwitchCase=\"'textarea'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-textarea\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-textarea>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Checkbox -->\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-checkbox\n [contentAlign]=\"field?.properties?.contentAlign ?? 'left'\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.properties?.placeholder\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size ?? 'l'\"\n [validators]=\"field?.validators\"\n [variant]=\"field?.properties?.variant ?? 'block'\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-checkbox>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Number -->\n <ng-container *ngSwitchCase=\"'number'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-number\n [decimal]=\"field?.properties?.decimal\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix ?? ''\"\n [precision]=\"field?.properties?.precision\"\n [prefix]=\"field?.properties?.prefix ?? ''\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-number>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Date -->\n <ng-container *ngSwitchCase=\"'date'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-date\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [maxCalculatedFromToday]=\"\n field?.properties?.maxCalculatedFromToday\n \"\n [min]=\"field?.properties?.min\"\n [minCalculatedFromToday]=\"\n field?.properties?.minCalculatedFromToday\n \"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-date>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Time -->\n <ng-container *ngSwitchCase=\"'time'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-time\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [items]=\"field?.properties?.items\"\n [label]=\"field?.label\"\n [mode]=\"field?.properties?.mode\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-time>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Phone -->\n <ng-container *ngSwitchCase=\"'phone'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-phone\n [countryCode]=\"field?.properties?.countryCode\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [phoneMaskAfterCountryCode]=\"\n field?.properties?.phoneMaskAfterCountryCode\n \"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [removeCountryCodeFromValue]=\"\n field?.properties?.removeCountryCodeFromValue\n \"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-phone>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Radio -->\n <ng-container *ngSwitchCase=\"'radio'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto; padding: 0px 0.5rem\"\n >\n <kwikui-input-radio\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [items]=\"field?.options\"\n [label]=\"field?.label\"\n [orientation]=\"field?.properties?.orientation\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-radio>\n </label>\n <ng-template #labelTemplate>\n <p\n class=\"tui-space_bottom-2\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Dropdown -->\n <ng-container *ngSwitchCase=\"'select'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-select\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [options]=\"field.options\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [searchable]=\"field?.properties?.searchable\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-select>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Input Slider -->\n <ng-container *ngSwitchCase=\"'slider'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-slider\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [postfix]=\"field?.properties?.postfix\"\n [prefix]=\"field?.properties?.prefix\"\n [properties]=\"field?.properties\"\n [quantum]=\"field?.properties?.quantum\"\n [size]=\"field?.properties?.size\"\n [steps]=\"field?.properties?.steps\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-slider>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- API Call -->\n <ng-container *ngSwitchCase=\"'api'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button-api-call\n [apiStatus]=\"field?.api?.status?.value\"\n [apiTimer]=\"field?.api?.timer\"\n [class]=\"field?.class\"\n [disabled]=\"field?.disabled\"\n [id]=\"field.key\"\n [label]=\"field?.api?.status?.labels[field?.api?.status?.value]\"\n [showLoader]=\"field?.disabled === 'loading'\"\n [size]=\"field?.properties?.size\"\n [styles]=\"\n field?.properties?.styles\n ? field?.properties?.styles\n : 'width: fit-content'\n \"\n (onClick)=\"handleOnClickApiCall($event)\"\n (onApiTimerStop)=\"handleOnApiTimerStop($event)\"\n ></kwikui-button-api-call>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Live Location -->\n <ng-container *ngSwitchCase=\"'live-location'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-button-live-location\n [class]=\"field?.class\"\n [disabled]=\"field?.disabled\"\n [id]=\"field.key\"\n [label]=\"field?.api?.status?.labels[field?.api?.status?.value]\"\n [liveLocationStatus]=\"field?.api?.status?.value\"\n [shape]=\"field?.properties?.shape\"\n [isShowLatLongCaptureTimestamp]=\"\n field?.properties?.isShowLatLongCaptureTimestamp\n \"\n [showLoader]=\"field?.disabled\"\n [size]=\"field?.properties?.size\"\n styles=\"width: fit-content\"\n (onClick)=\"handleOnClickLiveLocation($event)\"\n (onLocationPermission)=\"handleOnLocationPermission($event)\"\n ></kwikui-button-live-location>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Mobile OTP -->\n <ng-container *ngSwitchCase=\"'otp'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-otp\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [mask]=\"field?.properties?.mask\"\n [mode]=\"field?.properties?.mode\"\n [otpLength]=\"field?.properties?.otpLength\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-otp>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Aadhaar Number -->\n <ng-container *ngSwitchCase=\"'aadhaar-number'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-input-aadhaar\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [mask]=\"field?.properties?.mask\"\n [placeholder]=\"field?.placeholder\"\n [properties]=\"field?.properties\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-input-aadhaar>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Preview Image -->\n <ng-container *ngSwitchCase=\"'image'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <kwikui-image\n [altText]=\"field?.properties?.altText\"\n [class]=\"field?.properties?.class\"\n [html]=\"field?.properties?.html\"\n [id]=\"field.key\"\n [imageSrc]=\"formGroup.controls[field.key].value ?? ''\"\n [imageType]=\"field?.properties?.imageType\"\n [loadingType]=\"field?.properties?.loadingType\"\n [styles]=\"field?.properties?.styles\"\n ></kwikui-image>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- File Upload -->\n <ng-container *ngSwitchCase=\"'file'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto\"\n >\n <kwikui-input-files\n [accept]=\"field?.properties?.accept\"\n [class]=\"field?.properties?.class\"\n [disabled]=\"field?.disabled\"\n [files]=\"files[field.key]\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [id]=\"field?.key\"\n [label]=\"field?.properties?.label\"\n [link]=\"field?.properties?.link\"\n [maxFileSize]=\"field?.properties?.maxFileSize\"\n [multiple]=\"field?.properties?.multiple\"\n [setFileTypesToForm]=\"['NORMAL']\"\n [styles]=\"field?.properties?.styles\"\n [validators]=\"field?.validators\"\n [showViewButton]=\"field?.properties?.showViewButton\"\n (getKeyValue)=\"handleGetKeyValueFile($event)\"\n (getRemovedFile)=\"handleRemovedFile($event)\"\n (getViewButtonClick)=\"handleViewButtonClick($event, field)\"\n ></kwikui-input-files>\n </label>\n <ng-template #labelTemplate>\n <p\n style=\"padding: 0px 0.25rem; margin-bottom: 0.25rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Camera Capture -->\n <ng-container *ngSwitchCase=\"'capture'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n *ngIf=\"\n field?.label !== '' &&\n field?.label !== undefined &&\n field?.label !== null\n \"\n style=\"min-height: auto\"\n >\n <p\n *ngIf=\"field?.label !== ''\"\n style=\"padding: 0px 0.25rem; margin-bottom: 0.5rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </label>\n <kwikui-input-camera\n [buttonText]=\"field?.properties?.buttonText\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [mediaFiles]=\"\n mediaFiles[field.key] | filterImageUrlOrBase64FromObject\n \"\n [properties]=\"field?.properties\"\n [showMediaFiles]=\"field?.properties?.showMediaFiles\"\n [type]=\"'capture'\"\n [validators]=\"field?.validators\"\n (onClick)=\"handleOnClickInputCamera($event, field)\"\n (getRemovedFile)=\"handleOnClickGetRemovedMediaFile($event)\"\n ></kwikui-input-camera>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Camera Record -->\n <ng-container *ngSwitchCase=\"'record'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n *ngIf=\"\n field?.label !== '' &&\n field?.label !== undefined &&\n field?.label !== null\n \"\n style=\"min-height: auto\"\n >\n <p\n *ngIf=\"field?.label !== ''\"\n style=\"padding: 0px 0.25rem; margin-bottom: 0.5rem\"\n [hidden]=\"field?.hidden\"\n id=\"field_{{ field.key }}\"\n >\n <b>\n {{ field.label }}\n <span *ngIf=\"field.validators?.required\">*</span>\n </b>\n </p>\n </label>\n <kwikui-input-camera\n [buttonText]=\"field?.properties?.buttonText\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [mediaFiles]=\"\n mediaFiles[field.key] | filterVideoUrlOrBase64FromObject\n \"\n [properties]=\"field?.properties\"\n [showMediaFiles]=\"field?.properties?.showMediaFiles\"\n [type]=\"'record'\"\n [validators]=\"field?.validators\"\n (onClick)=\"handleOnClickInputCamera($event, field)\"\n (getRemovedFile)=\"handleOnClickGetRemovedMediaFile($event)\"\n ></kwikui-input-camera>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n <!-- Star Rating -->\n <ng-container *ngSwitchCase=\"'star-rating'\">\n <div\n #formFieldsRef\n [hidden]=\"field?.hidden\"\n [style]=\"field?.properties?.containerStyles ?? '' | styleSanitizer\"\n id=\"field_{{ field.key }}\"\n >\n <label\n [tuiLabel]=\"labelTemplate\"\n style=\"min-height: auto; padding: 0px 0.5rem\"\n >\n <kwikui-star-rating\n [color]=\"field?.properties?.color\"\n [disabled]=\"field?.disabled\"\n [focus]=\"field?.focus\"\n [formControl]=\"formGroup.controls[field.key]\"\n [formControlName]=\"field.key\"\n [icon]=\"field?.properties?.icon\"\n [iconMarked]=\"field?.properties?.iconMarked\"\n [id]=\"field.key\"\n [invalid]=\"field?.invalid\"\n [label]=\"field?.label\"\n [max]=\"field?.properties?.max\"\n [min]=\"field?.properties?.min\"\n [placeholder]=\"field?.properties?.placeholder\"\n [properties]=\"field?.properties\"\n [size]=\"field?.properties?.size\"\n [validators]=\"field?.validators\"\n (getKeyValue)=\"handleGetKeyValue($event)\"\n ></kwikui-star-rating>\n </label>\n <ng-template #labelTemplate>\n <p>\n <b\n >{{ field?.properties?.placeholder }}\n <span *ngIf=\"field.validators?.required\">*</span></b\n >\n </p>\n </ng-template>\n <kwikui-messages\n [messages]=\"field.messages\"\n [id]=\"field.key\"\n ></kwikui-messages>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </form>\n <div\n class=\"kwikid-form-buttons\"\n *ngIf=\"\n !formConfig.properties.footer.viewFormsButton.hidden ||\n !formConfig.properties.footer.saveButton.hidden\n \"\n >\n <kwikui-button\n *ngIf=\"\n !formConfig.properties.footer.viewFormsButton.hidden && isMobileView\n \"\n [appearance]=\"'secondary'\"\n [disabled]=\"viewFormsButton.disabled\"\n [label]=\"formConfig.properties.footer.viewFormsButton.label\"\n [showLoader]=\"viewFormsButton.showLoader\"\n [styles]=\"'width: 100%'\"\n (onClick)=\"handleOnClickViewForms($event)\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"!formConfig.properties.footer.saveButton.hidden\"\n [disabled]=\"saveFormButton.disabled\"\n [label]=\"formConfig.properties.footer.saveButton.label\"\n [showLoader]=\"saveFormButton.showLoader\"\n [styles]=\"'width: 100%'\"\n (onClick)=\"handleOnClickSaveForm($event)\"\n ></kwikui-button>\n </div>\n</div>\n<div\n class=\"kwikid-form-container-loading\"\n *ngIf=\"loading\"\n>\n <div\n *ngFor=\"let item of [].constructor(7); let i = index\"\n class=\"large-wrapper tui-skeleton tui-skeleton_rounded\"\n >\n </div>\n</div>\n\n<kwikui-loader></kwikui-loader>\n\n<tui-push\n id=\"field-error-notification\"\n *tuiPush=\"showErrorNotification\"\n heading=\"Missing/Incorrect Fields!\"\n type=\"Error\"\n (close)=\"toggleErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n\n<tui-push\n id=\"permission-error-notification\"\n *tuiPush=\"showPermissionErrorNotification\"\n heading=\"Please provide required permissions!\"\n type=\"Error\"\n (close)=\"togglePermissionErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n\n<ng-template\n #preview\n let-preview\n>\n <tui-preview\n [rotatable]=\"false\"\n [zoomable]=\"false\"\n class=\"preview-container\"\n >\n <tui-preview-title *ngIf=\"previewProperties.title !== ''\">{{\n previewProperties.title\n }}</tui-preview-title>\n\n <ng-container *ngIf=\"!previewProperties.unavailable\">\n <div\n *ngIf=\"previewProperties?.html?.before !== ''\"\n class=\"preview-html preview-html-before\"\n [style]=\"previewProperties?.html?.beforeStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.before | kwikuiSafeHtml\"\n ></div>\n\n <!-- Content within the iframe -->\n <div\n class=\"preview-iframe-content\"\n [style]=\"\n previewProperties?.iframe?.containerStyles ?? '' | styleSanitizer\n \"\n *ngIf=\"previewProperties.iframe.src !== ''\"\n >\n <!-- Your HTML content here -->\n <iframe\n [src]=\"previewProperties.iframe.src | kwikuiSafeUrl\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n [title]=\"previewProperties.iframe.title\"\n class=\"preview-iframe\"\n scrolling=\"auto\"\n ></iframe>\n </div>\n\n <div\n *ngIf=\"previewProperties?.html?.after !== ''\"\n class=\"preview-html preview-html-after\"\n [style]=\"previewProperties?.html?.afterStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.after | kwikuiSafeHtml\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"previewProperties.unavailable\">\n <div class=\"preview-unavailable\">\n <tui-svg\n src=\"tuiIconFileLarge\"\n class=\"t-icon\"\n ></tui-svg>\n <div>Preview unavailable</div>\n </div>\n </ng-container>\n\n <button\n tuiIconButton\n tuiPreviewAction\n icon=\"tuiIconCloseLarge\"\n title=\"Close\"\n type=\"button\"\n (click)=\"preview.complete()\"\n ></button>\n </tui-preview>\n</ng-template>\n\n<ng-template\n #dialog\n let-dialog\n>\n <div class=\"preview-container\">\n <ng-container *ngIf=\"!previewProperties.unavailable\">\n <div\n *ngIf=\"previewProperties?.html?.before !== ''\"\n class=\"preview-html preview-html-before\"\n [style]=\"previewProperties?.html?.beforeStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.before | kwikuiSafeHtml\"\n ></div>\n\n <!-- Content within the iframe -->\n <div\n class=\"preview-iframe-content\"\n [style]=\"\n previewProperties?.iframe?.containerStyles ?? '' | styleSanitizer\n \"\n *ngIf=\"previewProperties.iframe.src !== ''\"\n >\n <!-- Your HTML content here -->\n <iframe\n [src]=\"previewProperties.iframe.src | kwikuiSafeUrl\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n [title]=\"previewProperties.iframe.title\"\n class=\"preview-iframe\"\n scrolling=\"auto\"\n ></iframe>\n </div>\n\n <div\n *ngIf=\"previewProperties?.html?.after !== ''\"\n class=\"preview-html preview-html-after\"\n [style]=\"previewProperties?.html?.afterStyles ?? '' | styleSanitizer\"\n [innerHtml]=\"previewProperties.html.after | kwikuiSafeHtml\"\n ></div>\n </ng-container>\n\n <ng-container *ngIf=\"previewProperties.unavailable\">\n <div class=\"preview-unavailable\">\n <tui-svg\n src=\"tuiIconFileLarge\"\n class=\"t-icon\"\n ></tui-svg>\n <div>Preview unavailable</div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<div\n id=\"kwikid-camera-container\"\n *ngIf=\"isShowCamera\"\n>\n <div\n id=\"kwikid-camera-wrapper\"\n [class.fullscreen]=\"isShowCameraFullscreen\"\n >\n <kwikid-camera\n [type]=\"activeCameraType\"\n [data]=\"activeCameraData\"\n [image]=\"activeCameraImage\"\n [video]=\"activeCameraVideo\"\n [config]=\"activeCameraConfig?.cameraConfig\"\n (getImage)=\"handleGetCameraMedia($event, 'CAPTURE')\"\n (getVideo)=\"handleGetCameraMedia($event, 'RECORD')\"\n (onClickBack)=\"handleOnClickCameraBack($event)\"\n (onClickClose)=\"handleOnClickCameraClose($event)\"\n (onClickSave)=\"handleOnClickSaveCameraMedia($event, activeCameraType)\"\n >\n <ng-container\n *ngIf=\"activeCameraType === 'CAPTURE'\"\n slot=\"capture-header\"\n >\n <div class=\"capture-header-container\">\n <div class=\"capture-header-left\"> </div>\n <div class=\"capture-header-center\">\n <kwikui-button\n *ngIf=\"activeCameraConfig?.cameraConfig?.header?.title !== ''\"\n appearance=\"whiteblock\"\n [label]=\"activeCameraConfig?.cameraConfig?.header?.title\"\n shape=\"rounded\"\n size=\"s\"\n ></kwikui-button>\n </div>\n <div class=\"capture-header-right\">\n <kwikui-button\n *ngIf=\"activeCameraConfig?.cameraConfig?.header?.isExpand\"\n id=\"kwikid-camera-header-enlarge-button\"\n appearance=\"whiteblock\"\n [icon]=\"\n isShowCameraFullscreen ? 'tuiIconMinimize2' : 'tuiIconMaximize2'\n \"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"isShowCameraFullscreen = !isShowCameraFullscreen\"\n ></kwikui-button>\n <kwikui-button\n *ngIf=\"activeCameraConfig?.cameraConfig?.header?.isClose\"\n id=\"kwikid-camera-header-close-button\"\n appearance=\"whiteblock\"\n icon=\"tuiIconCloseLarge\"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"handleOnClickCameraClose($event)\"\n ></kwikui-button>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"activeCameraType === 'RECORD'\"\n slot=\"record-header\"\n >\n <div class=\"record-header-container\">\n <div class=\"record-header-row row-1\">\n <div class=\"record-header-left\">\n <kwikui-button\n *ngIf=\"\n activeCameraConfig?.cameraConfig?.header?.isBack &&\n activeCameraRecordingState == 'NONE'\n \"\n appearance=\"whiteblock\"\n icon=\"tuiIconArrowLeft\"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"handleOnClickCameraClose($event)\"\n ></kwikui-button>\n </div>\n <div class=\"record-header-center\">\n <kwikui-button\n *ngIf=\"activeCameraConfig?.cameraConfig?.header?.title !== ''\"\n appearance=\"whiteblock\"\n [label]=\"activeCameraConfig?.cameraConfig?.header?.title\"\n shape=\"rounded\"\n size=\"s\"\n ></kwikui-button>\n </div>\n <div class=\"record-header-right\">\n <kwikui-button\n *ngIf=\"activeCameraConfig?.cameraConfig?.header?.isExpand\"\n id=\"kwikid-camera-header-enlarge-button\"\n appearance=\"whiteblock\"\n [icon]=\"\n isShowCameraFullscreen\n ? 'tuiIconMinimize2'\n : 'tuiIconMaximize2'\n \"\n shape=\"rounded\"\n size=\"s\"\n (click)=\"isShowCameraFullscreen = !isShowCameraFullscreen\"\n ></kwikui-button>\n </div>\n </div>\n <div class=\"record-header-row row-2\">\n <div\n id=\"blinking-dot-container\"\n [class.recording]=\"activeCameraRecordingState == 'RECORDING'\"\n [class.paused]=\"activeCameraRecordingState == 'PAUSED'\"\n [class.recorded]=\"\n activeCameraRecordingState == 'NONE' ||\n activeCameraRecordingState === 'RECORDED'\n \"\n >\n <div\n *ngIf=\"activeCameraRecordingState == 'RECORDING'\"\n class=\"dot recording blink\"\n >\n </div>\n <div\n *ngIf=\"activeCameraRecordingState === 'PAUSED'\"\n class=\"dot paused\"\n >\n </div>\n <div\n *ngIf=\"\n activeCameraRecordingState == 'NONE' ||\n activeCameraRecordingState === 'RECORDED'\n \"\n class=\"dot recorded\"\n >\n </div>\n <div>\n &nbsp;{{ activeCameraRecordingTime | formatTimer }}\n <ng-container\n *ngIf=\"\n activeCameraConfig?.cameraConfig?.others\n ?.maxRecordingTimeInSeconds\n \"\n >\n /\n {{\n activeCameraConfig?.cameraConfig?.others\n ?.maxRecordingTimeInSeconds | formatTimer\n }}\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </kwikid-camera>\n </div>\n</div>\n", styles: [".kwikid-form-container{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center}.kwikid-form.show{width:100%;height:100%;padding:1rem;overflow-y:auto;display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:stretch;scroll-behavior:smooth}.kwikid-form.show>*:not(:last-child){margin-bottom:1rem}.kwikid-form-buttons{width:100%;bottom:0px;padding:1rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}.kwikid-form-buttons>*:not(:last-child){margin-right:1rem}.kwikid-form-buttons *{flex-grow:1}#uf-form-fields-header-container{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:flex-start;padding:1rem 1rem 0}#uf-form-fields-header-container>*:not(:last-child){margin-bottom:.5rem}#uf-form-fields-header-container #uf-header-logo{width:-moz-fit-content;width:fit-content;height:50px}#uf-form-fields-header-container #uf-form-fields-header-main{display:flex;flex-direction:row;align-content:center;justify-content:flex-start;align-items:center;width:100%}#uf-form-fields-header-container #uf-form-fields-header-main>*:not(:last-child){margin-right:.25rem}#uf-form-fields-header-container #uf-form-fields-header-main #uf-form-fields-header-right{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:flex-start}#uf-form-fields-header-container #uf-form-fields-header-main #uf-form-fields-header-right>*{margin-bottom:.5rem}#uf-form-fields-header-container hr{width:100%}#uf-form-fields-title{color:#000;font-size:1.75em;font-weight:bold}#uf-form-fields-steps{color:var(--color-on-secondary-container);font-size:1rem}.title{border-left:.25rem solid var(--tui-primary);padding:.75rem;font-size:1.4em;font-weight:bold;background-color:var(--tui-secondary);display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center}.title>*:not(:last-child){margin-right:.5rem}.title:not(:first-child){margin-top:.5rem}.title.hidden{display:none}.large-wrapper{width:100%;height:60px}.large-wrapper:first-child{margin-bottom:auto}.large-wrapper:last-child{margin-top:auto}.kwikid-form-container-loading{width:100%;height:100%;margin:0 auto;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;padding:1rem}.kwikid-form-container-loading>* :not(:last-child){margin-bottom:1rem}#field-error-notification,#permission-error-notification{background-color:var(--tui-error-fill);color:#fff!important}#field-error-notification .t-top,#permission-error-notification .t-top{color:#fff!important}#field-error-notification .t-close,#permission-error-notification .t-close{color:#fff!important}.preview-container{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;align-content:center;height:calc(100vh - 3rem)}@media only screen and (min-width: 768px){.preview-container{height:calc(100vh - 10rem);width:calc(100vw - 10rem)}}.preview-container>*:not(:last-child){margin-bottom:1rem}.preview-container .preview-html{flex-grow:1}.preview-container .preview-iframe-content{height:100%;flex-grow:1}.preview-container .preview-iframe-content .preview-iframe{width:100%;height:100%}.preview-container .preview-unavailable{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;color:#fff;font-size:1.2rem;top:50%;left:50%;width:100%;height:100vh}.preview-container .preview-unavailable>*:not(:last-child){margin-bottom:1rem}#kwikid-camera-container{width:100%;height:100%;position:fixed;top:50%;left:50%;background-color:#0000008f;transform:translate(-50%,-50%);z-index:100}#kwikid-camera-container #kwikid-camera-wrapper{width:min(80%);height:max(85%);box-shadow:#0000008f 0 22px 70px 4px;overflow:hidden;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:1rem;background-color:#000;transition:5s linear ease}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container{display:flex;width:100%;max-width:100%;padding:0}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-left{flex:1;text-align:left}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-center{flex:1;width:100%;min-width:max-content;text-align:center;margin:auto}#kwikid-camera-container #kwikid-camera-wrapper .capture-header-container .capture-header-right{flex:1;text-align:right;display:flex;justify-content:flex-end;grid-gap:1rem;gap:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container{display:flex;width:100%;max-width:100%;padding:0;color:#fff;flex-direction:column;justify-content:flex-start;align-items:stretch}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1{display:flex;flex-direction:row;justify-content:space-between;align-items:center;margin-bottom:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-left{flex:1;display:flex;justify-content:flex-start;grid-gap:1rem;gap:1rem;text-align:left}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-center{flex:1;width:100%;min-width:max-content;text-align:center;margin:auto}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-1 .record-header-right{flex:1;text-align:right;display:flex;justify-content:flex-end;grid-gap:1rem;gap:1rem}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2{display:flex;flex-direction:row;justify-content:center;align-items:center}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;grid-gap:.25rem;gap:.25rem;padding:.35rem .6rem;width:-moz-fit-content;width:fit-content;border-radius:2rem;background-color:#f5f5f5}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.recording{color:red;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.paused{color:#525252;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container.recorded{color:#000;font-weight:bold}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot{display:inline-block;width:.75rem;height:.75rem;border-radius:100%}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.recording{background-color:red;box-shadow:0 0 5px -1px red}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.paused{background-color:#525252;box-shadow:0 0 5px -1px #000}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.recorded{background-color:#000;box-shadow:0 0 5px -1px #000}#kwikid-camera-container #kwikid-camera-wrapper .record-header-container .record-header-row.row-2 #blinking-dot-container .dot.blink{animation:blinker 1s cubic-bezier(.5,0,1,1) infinite alternate}@keyframes blinker{0%{opacity:1}to{opacity:0}}#kwikid-camera-container #kwikid-camera-wrapper.fullscreen{width:100%;height:100%;border-radius:0;transition:5s linear ease}@media only screen and (max-width: 600px){#kwikid-camera-container #kwikid-camera-wrapper{width:100%;height:100%;border-radius:0;transition:5s linear ease}#kwikid-camera-container #kwikid-camera-wrapper #kwikid-camera-header-enlarge-button{display:none}}\n", "::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\n"], components: [{ type: i3.KwikUIButtonComponent, selector: "kwikui-button", inputs: ["appearance", "class", "disabled", "icon", "iconRight", "id", "label", "shape", "showLoader", "size", "styles", "type", "pseudoHover"], outputs: ["onClick"] }, { type: i3.KwikUIMessagesComponent, selector: "kwikui-messages", inputs: ["id", "messages"] }, { type: i3.KwikUIInputComponent, selector: "kwikui-input", inputs: ["case", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "type", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputCurrencyComponent, selector: "kwikui-input-currency", inputs: ["currencyType", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators", "value"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputEmailComponent, selector: "kwikui-input-email", inputs: ["case", "disabled", "domains", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputPasswordComponent, selector: "kwikui-input-password", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUITextareaComponent, selector: "kwikui-textarea", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUICheckboxComponent, selector: "kwikui-checkbox", inputs: ["contentAlign", "disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "placeholder", "properties", "size", "validators", "variant"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputNumberComponent, selector: "kwikui-input-number", inputs: ["decimal", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "min", "placeholder", "postfix", "precision", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputDateComponent, selector: "kwikui-input-date", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "maxCalculatedFromToday", "min", "minCalculatedFromToday", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputTimeComponent, selector: "kwikui-input-time", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "items", "invalid", "label", "mode", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputPhoneComponent, selector: "kwikui-input-phone", inputs: ["countryCode", "disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "phoneMaskAfterCountryCode", "placeholder", "postfix", "prefix", "properties", "removeCountryCodeFromValue", "size", "validators"], outputs: ["getKeyValue"] }, { type: i5.TuiLabelComponent, selector: "label[tuiLabel]", inputs: ["tuiLabel", "context"] }, { type: i3.KwikUIInputRadioComponent, selector: "kwikui-input-radio", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "items", "label", "orientation", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputSelectComponent, selector: "kwikui-input-select", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "options", "placeholder", "properties", "searchable", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputSliderComponent, selector: "kwikui-input-slider", inputs: ["disabled", "focus", "formControl", "formControlName", "hintContent", "icon", "id", "invalid", "label", "max", "min", "placeholder", "postfix", "prefix", "properties", "quantum", "size", "steps", "type", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIButtonApiCallComponent, selector: "kwikui-button-api-call", inputs: ["apiTimer", "apiStatus", "class", "disabled", "id", "label", "shape", "showLoader", "size", "styles"], outputs: ["onClick", "onApiTimerStop"] }, { type: i3.KwikUIButtonLiveLocationComponent, selector: "kwikui-button-live-location", inputs: ["liveLocationStatus", "class", "disabled", "id", "label", "shape", "showLoader", "size", "styles", "isShowLatLongCaptureTimestamp"], outputs: ["onClick", "onLocationPermission"] }, { type: i3.KwikUIInputOtpComponent, selector: "kwikui-input-otp", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "mask", "mode", "otpLength", "placeholder", "postfix", "prefix", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIInputAadhaarComponent, selector: "kwikui-input-aadhaar", inputs: ["disabled", "focus", "formControl", "formControlName", "id", "invalid", "label", "mask", "placeholder", "properties", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUIImageComponent, selector: "kwikui-image", inputs: ["altText", "class", "html", "id", "imageSrc", "imageType", "loadingType", "styles"], outputs: ["onClick"] }, { type: i3.KwikUIInputFilesComponent, selector: "kwikui-input-files", inputs: ["accept", "class", "disabled", "files", "formControl", "formControlName", "icon", "id", "label", "link", "maxFileSize", "multiple", "setFileTypesToForm", "showAddedFiles", "size", "styles", "validators", "variant", "showViewButton"], outputs: ["getKeyValue", "getRemovedFile", "getViewButtonClick"] }, { type: i4.KwikUIInputCameraComponent, selector: "kwikui-input-camera", inputs: ["buttonText", "disabled", "focus", "formControl", "formControlName", "icon", "id", "invalid", "mediaFiles", "properties", "showMediaFiles", "size", "type", "validators"], outputs: ["onClick", "getRemovedFile"] }, { type: i3.KwikUIStarRatingComponent, selector: "kwikui-star-rating", inputs: ["color", "disabled", "focus", "formControl", "formControlName", "icon", "iconMarked", "id", "invalid", "label", "max", "min", "placeholder", "properties", "size", "validators"], outputs: ["getKeyValue"] }, { type: i3.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i6.TuiPushComponent, selector: "tui-push", inputs: ["heading", "type", "lines", "timestamp"], outputs: ["close"] }, { type: i5.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i7.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { type: i7.TuiPreviewTitleComponent, selector: "tui-preview-title" }, { type: i5.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }, { type: i4.KwikIDCameraComponent, selector: "kwikid-camera", inputs: ["type", "config", "data", "image", "video"], outputs: ["getImage", "onClickSave", "getVideo"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i9.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.TuiPushAlertDirective, selector: "[tuiPush]", inputs: ["tuiPush"] }, { type: i6.TuiPushDirective, selector: "tui-push" }, { type: i7.TuiPreviewActionDirective, selector: "[tuiPreviewAction]" }], pipes: { "styleSanitizer": i10.StyleSanitizerPipe, "kwikuiSafeHtml": i3.KwikUISafeHtmlPipe, "filterImageUrlOrBase64FromObject": i11.FilterImageUrlOrBase64FromObjectPipe, "filterVideoUrlOrBase64FromObject": i12.FilterVideoUrlOrBase64FromObjectPipe, "kwikuiSafeUrl": i3.KwikUISafeUrlPipe, "formatTimer": i13.TimerPipe } });
2893
3060
  __decorate([
2894
3061
  logMethod
2895
3062
  ], KwikIDFormViewComponent.prototype, "resetCamera", null);
@@ -2980,9 +3147,6 @@ __decorate([
2980
3147
  __decorate([
2981
3148
  logMethod
2982
3149
  ], KwikIDFormViewComponent.prototype, "handleGetKeyValue", null);
2983
- __decorate([
2984
- logMethod
2985
- ], KwikIDFormViewComponent.prototype, "handleOnClickResetFormFields2", null);
2986
3150
  __decorate([
2987
3151
  logMethod
2988
3152
  ], KwikIDFormViewComponent.prototype, "handleOnClickResetFormFields", null);
@@ -3236,5 +3400,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
3236
3400
  type: Output
3237
3401
  }], onClickViewForms: [{
3238
3402
  type: Output
3239
- }], resetCamera: [], ngOnInit: [], ngOnChanges: [], ngOnDestroy: [], triggerLogs: [], initFormConfig: [], setFormFieldsFromFormConfig: [], setFormFieldGroupsFromFormConfig: [], setFormDataFromAllFormsData: [], handleConnectedElementFieldGroupActions: [], handleConnectedElementFieldGroup: [], handleConnectedElementFieldActions: [], handleConnectedElementFields: [], handleConnectedElements: [], handleRemovedFile: [], handleViewButtonClick: [], handleGetKeyValueFile: [], handleOnClickGetRemovedMediaFile: [], handleOnClickInputCamera: [], setCameraMedia: [], handleGetCameraMedia: [], handleOnClickSaveCameraMedia: [], handleOnClickCameraBack: [], handleOnClickCameraClose: [], updateFiles: [], uploadFile: [], handleOnClickFormFieldButton: [], handleOnLocationPermission: [], handleOnClickLiveLocation: [], handleGetKeyValue: [], handleOnClickResetFormFields2: [], handleOnClickResetFormFields: [], handleFieldApiCall: [], handleApiCall: [], executeApiCall: [], isValidRequestHeadersAndBody: [], handleOnClickApiCall: [], handleOnClickGoBack: [], handleOnClickViewForms: [], handleOnClickSaveForm: [], handleOnApiTimerStop: [], handleOnScrollToField: [], toggleErrorNotification: [], togglePermissionErrorNotification: [], fieldHide: [], fieldGroupHide: [], fieldShow: [], fieldGroupShow: [], fieldDisable: [], fieldGroupDisable: [], fieldEnable: [], fieldGroupEnable: [], fieldReset: [], fieldGroupReset: [], fieldHideApiLoader: [], fieldShowApiLoader: [], setHtml: [], fieldErrorShow: [], fieldErrorHide: [], fieldMessageShow: [], fieldMessageHide: [], setValue: [], setFieldDefaultValue: [], setApiStatus: [], setApiHeaderValue: [], setApiHeaderValidity: [], setApiBodyValue: [], setApiBodyValidity: [], setFieldValidity: [], setDropdownOptions: [], apiCall: [], fieldApiCall: [], fieldMultipleApiCalls: [], fieldMultipleApiCallsEnd: [], taskApiCall: [], taskMultipleApiCalls: [], taskMultipleApiCallsEnd: [], dialogShow: [], dialogHide: [], redirectToUrl: [], patchFieldControlValue: [], setFieldControlValue: [], patchFormGroup: [], isFieldValid: [], isFieldEnabled: [], getFormGroupRawValues: [], showPreview: [], showErrorPreview: [], showPopupForm: [], alertShow: [], takeActionOnFieldGroup: [], takeAction: [] } });
3240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9mb3JtLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBS04sU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUNMLGVBQWUsRUFFZixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNoQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksRUFDSixVQUFVLEVBQ1YsTUFBTSxFQUdOLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsWUFBWSxFQUNaLGVBQWUsRUFDZixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixvQkFBb0IsRUFDckIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxFQUFFLElBQUks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OlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2FkZG9uLXByZXZpZXdcIjtcbmltcG9ydCB7XG4gIFR1aUFsZXJ0U2VydmljZSxcbiAgVHVpRGlhbG9nQ29udGV4dCxcbiAgVHVpRGlhbG9nU2VydmljZSxcbiAgVHVpTm90aWZpY2F0aW9uXG59IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgVHVpUHVzaFNlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2tpdFwiO1xuaW1wb3J0IHsgS3dpa0lEQ2FtZXJhUmVjb3JkU2VydmljZSB9IGZyb20gXCJrd2lraWQtY2FtZXJhXCI7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIENvbmRpdGlvbixcbiAgRVNvdXJjZUtleSxcbiAgUnVsZSxcbiAgUnVsZUVuZ2luZSxcbiAgU291cmNlLFxuICBUQWN0aW9uLFxuICBURW5naW5lLFxuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBnZXRPYmplY3REZWVwQ29weSxcbiAgZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aCxcbiAgaXNFbXB0eVN0cmluZyxcbiAgaXNFbXB0eVZhbHVlLFxuICBpc05vdEVtcHR5VmFsdWUsXG4gIGlzTnVsbCxcbiAgaXNVbmRlZmluZWQsXG4gIGxvZ01ldGhvZCxcbiAgbWVyZ2VPYmplY3RzLFxuICBtZXJnZU9iamVjdHNEZWVwLFxuICByZXBsYWNlU3RyaW5nLFxuICBzZXRWYWx1ZVRvT2JqZWN0UGF0aFxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IEt3aWtVSUxvYWRlclNlcnZpY2UgfSBmcm9tIFwia3dpa3VpXCI7XG5pbXBvcnQgeyBwYWlyd2lzZSwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4uL2NvbmZpZy1jb252ZXJ0ZXIvY29uZmlnLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRklFTERfUFJPUEVSVElFUyB9IGZyb20gXCIuLi9jb25maWctY29udmVydGVyL2NvbmZpZy1jb252ZXJ0ZXIuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBnZXRMYW5ndWFnZSxcbiAgdXBkYXRlTGFuZ3VhZ2Vcbn0gZnJvbSBcIi4uL2NvbmZpZy1jb252ZXJ0ZXIvY29uZmlnLWNvbnZlcnRlci5oZWxwZXJcIjtcbmltcG9ydCB7IEVGb3Jtc0xpc3RTdGF0dXMgfSBmcm9tIFwiLi4vZm9ybXMtbGlzdC9mb3Jtcy1saXN0LmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFjdGlvbnMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgRUFwaVJlcXVlc3RVcmxUeXBlLFxuICBFQXBpU3RhdHVzVHlwZSxcbiAgVEFwaSxcbiAgVEFwaUVuZHBvaW50LFxuICBUQXBpVGltZXJcbn0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFwaXMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgRU1lc3NhZ2VUeXBlLFxuICBURm9ybVZpZXdHb0JhY2tNb2RlLFxuICBUTWVzc2FnZVxufSBmcm9tIFwiLi9kZWZpbml0aW9ucy9mb3JtLXZpZXcuY29tbW9ucy5kZWZpbml0aW9uXCI7XG5pbXBvcnQge1xuICBFRmllbGRUeXBlLFxuICBURmllbGRBcGlDYWxsLFxuICBURmllbGRMaXZlTG9jYXRpb24sXG4gIFRGaWVsZFRpdGxlXG59IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5maWVsZHMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRUxvZ0V2ZW50VHlwZSB9IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5sb2dzLmRlZmluaXRpb25cIjtcbmltcG9ydCB7IEt3aWtJREZvcm1WaWV3QXBpU2VydmljZSB9IGZyb20gXCIuL2Zvcm0tdmlldy5hcGkuc2VydmljZVwiO1xuaW1wb3J0IHsgS3dpa0lERm9ybVZpZXdTZXJ2aWNlIH0gZnJvbSBcIi4vZm9ybS12aWV3LnNlcnZpY2VcIjtcbmltcG9ydCB7IEFwaXMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5hcGlzLmhlbHBlclwiO1xuaW1wb3J0IHsgQ2FtZXJhSGVscGVyIH0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuY2FtZXJhLmhlbHBlclwiO1xuaW1wb3J0IHtcbiAgYXBwZW5kRm9ybUZpZWxkTWVzc2FnZSxcbiAgYXBwZW5kSHRtbE1lc3NhZ2UsXG4gIGNvbnZlcnRGb3JtRmllbGRFbXB0eVZhbHVlVG9Ld2lrVUlGb3JtYXQsXG4gIGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvS3dpa1VJRm9ybWF0LFxuICBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0LFxuICBmaWx0ZXJEdXBsaWNhdGVzRmlsZXMsXG4gIGZpbHRlckR1cGxpY2F0ZXNNZWRpYUZpbGVzLFxuICBnZXRGb3JtRmllbGRCeUtleSxcbiAgZ2V0Rm9ybUZpZWxkSW5kZXhCeUtleSxcbiAgaGlnaGxpZ2h0Rm9ybUZpZWxkRXJyb3IsXG4gIHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UsXG4gIHNldEFwaVRpbWVyTWVzc2FnZSxcbiAgc2hvd0Zvcm1GaWVsZEVycm9yXG59IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmZpZWxkcy5oZWxwZXJcIjtcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uIH0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuZm9ybS12YWxpZGF0aW9ucy5oZWxwZXJcIjtcbmltcG9ydCB7IGZvcm1hdEV2ZW50TG9ncyB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmxvZ3MuaGVscGVyXCI7XG5pbXBvcnQgeyBUYXNrcyB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LnRhc2tzLmhlbHBlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa2lkLWZvcm0tdmlld1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZm9ybS12aWV3LmNvbXBvbmVudC5zY3NzXCIsIFwiLi4vc2hhcmVkLnNjc3NcIl0sXG4gIHByb3ZpZGVyczogW0t3aWtJREZvcm1WaWV3U2VydmljZSwgS3dpa0lERm9ybVZpZXdBcGlTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURGb3JtVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKFwiZm9ybUZpZWxkQ29udGFpbmVyUmVmXCIpIGZvcm1GaWVsZENvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZHJlbihcImZvcm1GaWVsZHNSZWZcIikgZm9ybUZpZWxkc1JlZjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dcIikgcmVhZG9ubHkgZGlhbG9nOiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PHZvaWQ+PjtcbiAgQFZpZXdDaGlsZChcInByZXZpZXdcIikgcmVhZG9ubHkgcHJldmlldzogVGVtcGxhdGVSZWY8VHVpRGlhbG9nQ29udGV4dDx2b2lkPj47XG5cbiAgQElucHV0KCkgYWxsRm9ybXNEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGV4dHJhRGF0YTogYW55O1xuICBASW5wdXQoKSBhcGlDYWxsUmVzcG9uc2U6IGFueTtcbiAgQElucHV0KCkgYnV0dG9uQ2xpY2tSZXNwb25zZTogYW55O1xuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBhbnk7XG4gIEBJbnB1dCgpIGZvcm1EYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGlzTW9iaWxlVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwb3B1cEZvcm1DYWxsYmFjazogYW55ID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSB1c2VyQ29uZmlnOiBhbnk7XG4gIEBJbnB1dCgpIHN0ZXBDb25maWc6IGFueTtcblxuICBAT3V0cHV0KCkgZ2V0TG9nczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGdldFVuc2F2ZWREYXRhU3RhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkFjdGlvblNob3dQb3B1cEZvcm06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkNsaWNrQXBpQ2FsbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uQ2xpY2tWaWV3RmlsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uQ2xpY2tGb3JtRmllbGRCdXR0b246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkNsaWNrR29CYWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25DbGlja1NhdmVGb3JtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25DbGlja1ZpZXdGb3JtczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmaWVsZEdyb3VwczogYW55ID0ge307XG4gIGZvcm1GaWVsZHM6IGFueVtdID0gW107XG4gIHByZXZpb3VzRm9ybURhdGE6IGFueSA9IHt9O1xuXG4gIGlzU2hvd0NhbWVyYTogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1Nob3dDYW1lcmFGdWxsc2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGNhbWVyYUZpZWxkS2V5OiBzdHJpbmcgPSBcIlwiO1xuICBjYW1lcmFEYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gIGNhbWVyYVR5cGU6IFwiQ0FQVFVSRVwiIHwgXCJSRUNPUkRcIiA9IHVuZGVmaW5lZDtcbiAgY2FtZXJhSW1hZ2U6IHN0cmluZyA9IFwiXCI7XG4gIGNhbWVyYVZpZGVvOiBzdHJpbmcgPSBcIlwiO1xuICBjYW1lcmFDb25maWc6IGFueSA9IHVuZGVmaW5lZDtcbiAgY2FtZXJhUmVjb3JkaW5nVGltZTogbnVtYmVyID0gMDtcbiAgY2FtZXJhUmVjb3JkaW5nVGltZXJTdWJjcmlwdGlvbjogYW55ID0gdW5kZWZpbmVkO1xuICBjYW1lcmFSZWNvcmRpbmdTdGF0ZTogc3RyaW5nID0gXCJOT05FXCI7XG4gIGNhbWVyYVJlY29yZGluZ1N0YXRlU3ViY3JpcHRpb246IGFueSA9IHVuZGVmaW5lZDtcblxuICBAbG9nTWV0aG9kXG4gIHJlc2V0Q2FtZXJhKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93Q2FtZXJhID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3dDYW1lcmFGdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgdGhpcy5jYW1lcmFGaWVsZEtleSA9IFwiXCI7XG4gICAgdGhpcy5jYW1lcmFEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FtZXJhVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNhbWVyYUltYWdlID0gXCJcIjtcbiAgICB0aGlzLmNhbWVyYVZpZGVvID0gXCJcIjtcbiAgICB0aGlzLmNhbWVyYUNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNhbWVyYVJlY29yZGluZ1RpbWUgPSAwO1xuICAgIHRoaXMuY2FtZXJhUmVjb3JkaW5nU3RhdGUgPSBcIk5PTkVcIjtcbiAgfVxuXG4gIHByZXZpZXdQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgaHRtbDoge1xuICAgICAgYmVmb3JlOiBcIlwiLFxuICAgICAgYmVmb3JlU3R5bGVzOiBcIlwiLFxuICAgICAgYWZ0ZXI6IFwiXCIsXG4gICAgICBhZnRlclN0eWxlczogXCJcIlxuICAgIH0sXG4gICAgaWZyYW1lOiB7XG4gICAgICBzcmM6IFwiXCIsXG4gICAgICB0aXRsZTogXCJcIlxuICAgIH0sXG4gICAgdHlwZTogXCJkaWFsb2dcIixcbiAgICBzaXplOiBcImF1dG9cIixcbiAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gIH07XG5cbiAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gIGFwaUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYmFja0J1dHRvbiA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc2hvd0xvYWRlcjogZmFsc2VcbiAgfTtcbiAgdmlld0Zvcm1zQnV0dG9uID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyOiBmYWxzZVxuICB9O1xuICBzYXZlRm9ybUJ1dHRvbiA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc2hvd0xvYWRlcjogZmFsc2VcbiAgfTtcblxuICBmaWxlczogYW55ID0ge307XG4gIG1lZGlhRmlsZXM6IGFueSA9IHt9O1xuXG4gIHN0b3BUYXNrRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHdhaXRpbmdGb3JDaGFuZ2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHBvcHVwRm9ybUNvbmZpZzogYW55ID0gdW5kZWZpbmVkO1xuICBwb3B1cEZvcm1EYXRhOiBhbnkgPSB7fTtcbiAgdGFza0RhdGE6IGFueSA9IHt9O1xuXG4gIHByZXZpZXdEaWFsb2dSZWY6IGFueTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9ybVZpZXdTZXJ2aWNlOiBLd2lrSURGb3JtVmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtVmlld0FwaVNlcnZpY2U6IEt3aWtJREZvcm1WaWV3QXBpU2VydmljZSxcbiAgICBASW5qZWN0KFR1aVB1c2hTZXJ2aWNlKVxuICAgIHByb3RlY3RlZCByZWFkb25seSBwdXNoU2VydmljZTogVHVpUHVzaFNlcnZpY2UsXG4gICAgQEluamVjdChUdWlBbGVydFNlcnZpY2UpXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogVHVpQWxlcnRTZXJ2aWNlLFxuICAgIEBJbmplY3QoVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmV2aWV3RGlhbG9nU2VydmljZTogVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UsXG4gICAgQEluamVjdChUdWlEaWFsb2dTZXJ2aWNlKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogVHVpRGlhbG9nU2VydmljZSxcbiAgICBwdWJsaWMgbG9hZGVyU2VydmljZTogS3dpa1VJTG9hZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGNhbWVyYVJlY29yZFNlcnZpY2U6IEt3aWtJRENhbWVyYVJlY29yZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5pbml0Rm9ybUNvbmZpZyh0aGlzLmZvcm1Db25maWcpO1xuXG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY2FtZXJhUmVjb3JkaW5nVGltZXJTdWJjcmlwdGlvbiA9IHRoaXMuY2FtZXJhUmVjb3JkU2VydmljZVxuICAgICAgICAgIC5nZXRUaW1lclVwZGF0ZSgpXG4gICAgICAgICAgLnN1YnNjcmliZSgodGltZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYVJlY29yZGluZ1RpbWUgPSB0aW1lO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbWVyYVJlY29yZGluZ1N0YXRlU3ViY3JpcHRpb24gPSB0aGlzLmNhbWVyYVJlY29yZFNlcnZpY2VcbiAgICAgICAgICAuZ2V0UmVjb3JkaW5nU3RhdGUoKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhUmVjb3JkaW5nU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywga2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImV4dHJhRGF0YVwiKSkge1xuICAgICAgdGhpcy5leHRyYURhdGEgPSBjaGFuZ2VzLmV4dHJhRGF0YS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJ1c2VyQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcgPSBjaGFuZ2VzLnVzZXJDb25maWcuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwic3RlcENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5zdGVwQ29uZmlnID0gY2hhbmdlcy5zdGVwQ29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1EYXRhXCIpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlLCBcImRhdGFcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcy5mb3JtRGF0YS5jdXJyZW50VmFsdWUsIFwiZXh0ZW5kZWREYXRhXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIC4uLmNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlW1wiZGF0YVwiXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIC4uLmNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJwb3B1cEZvcm1DYWxsYmFja1wiKSkge1xuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZShjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcG9wdXBGb3JtRGF0YSA9XG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZS5wb3B1cEZvcm1EYXRhLFxuICAgICAgICAgICAgXCJkYXRhXCJcbiAgICAgICAgICApICYmXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZS5wb3B1cEZvcm1EYXRhLFxuICAgICAgICAgICAgXCJleHRlbmRlZERhdGFcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgID8gY2hhbmdlcy5wb3B1cEZvcm1DYWxsYmFjay5jdXJyZW50VmFsdWUucG9wdXBGb3JtRGF0YVtcImRhdGFcIl1cbiAgICAgICAgICAgIDogY2hhbmdlcy5wb3B1cEZvcm1DYWxsYmFjay5jdXJyZW50VmFsdWUucG9wdXBGb3JtRGF0YTtcblxuICAgICAgICBjb25zdCBwb3B1cEZvcm1Db25maWcgPVxuICAgICAgICAgIGNoYW5nZXMucG9wdXBGb3JtQ2FsbGJhY2suY3VycmVudFZhbHVlLnBvcHVwRm9ybUNvbmZpZztcblxuICAgICAgICB0aGlzLnBvcHVwRm9ybURhdGEgPSBtZXJnZU9iamVjdHModGhpcy5wb3B1cEZvcm1EYXRhLCB7XG4gICAgICAgICAgW3BvcHVwRm9ybUNvbmZpZy5rZXldOiBwb3B1cEZvcm1EYXRhXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSBtZXJnZU9iamVjdHModGhpcy5mb3JtRGF0YSwgdGhpcy5wb3B1cEZvcm1EYXRhKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIFwic3RvcFRhc2tFeGVjdXRpb25cIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdG9wVGFza0V4ZWN1dGlvbiA9XG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZS5zdG9wVGFza0V4ZWN1dGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0b3BUYXNrRXhlY3V0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiaXNNb2JpbGVWaWV3XCIpKSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGNoYW5nZXMuaXNNb2JpbGVWaWV3LmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFwaUNhbGxSZXNwb25zZVwiKSkge1xuICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2UgPSBjaGFuZ2VzLmFwaUNhbGxSZXNwb25zZS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmFwaUNhbGxSZXNwb25zZT8ucmVzcG9uc2U7XG5cbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICBjYXNlIEVGaWVsZFR5cGUuRklMRTpcbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRGaWxlID0gZ2V0T2JqZWN0RGVlcENvcHkoe1xuICAgICAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgICAgIC4uLnJlc3BvbnNlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfRklMRSwge1xuICAgICAgICAgICAgICBhcGlfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgIGZpZWxkX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiBcIkZJTEVfVVBMT0FEX0FQSV9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsZXModXBkYXRlZEZpbGUsIFwiTk9STUFMXCIsIHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRGaWxlID0gZ2V0T2JqZWN0RGVlcENvcHkoe1xuICAgICAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgICAgIC4uLnRoaXMuYXBpQ2FsbFJlc3BvbnNlPy5wYXlsb2FkPy5tZXRhZGF0YVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVTUE9OU0VfVVBMT0FEX0ZJTEUsIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJGSUxFX1VQTE9BRF9BUElfRVJST1JcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsZXModXBkYXRlZEZpbGUsIFwiRVJST1JcIiwgdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFRmllbGRUeXBlLkNBUFRVUkU6XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gcmVzcG9uc2U/LmltYWdlX3VybDtcblxuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW2ltYWdlXSk7XG4gICAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KFtpbWFnZV0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICBnZXRPYmplY3REZWVwQ29weShbaW1hZ2VdKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25seVNlbGY6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IGdldE9iamVjdERlZXBDb3B5KFtpbWFnZV0pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfSU1BR0UsIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJJTUFHRV9VUExPQURfQVBJX1NVQ0NFU1NcIixcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfSU1BR0UsIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJJTUFHRV9VUExPQURfQVBJX0VSUk9SXCJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlsZSBVcGxvYWQgZm9yIEltYWdlIEZhaWxlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5SRUNPUkQ6XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcmVzcG9uc2U/LnZpZGVvX3VybDtcblxuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW3ZpZGVvXSk7XG4gICAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KFt2aWRlb10pO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICBnZXRPYmplY3REZWVwQ29weShbdmlkZW9dKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25seVNlbGY6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IGdldE9iamVjdERlZXBDb3B5KFt2aWRlb10pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfVklERU8sIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJWSURFT19VUExPQURfQVBJX1NVQ0NFU1NcIixcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfVklERU8sIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJWSURFT19VUExPQURfQVBJX0VSUk9SXCJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlsZSBVcGxvYWQgZm9yIFZpZGVvIEZhaWxlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5MSVZFX0xPQ0FUSU9OOlxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5tZWRpYUZpbGVzW2ZpZWxkLmtleV0gPSBnZXRPYmplY3REZWVwQ29weShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgIGdldE9iamVjdERlZXBDb3B5KHJlc3BvbnNlKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25seVNlbGY6IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IGdldE9iamVjdERlZXBDb3B5KHJlc3BvbnNlKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmdldFVuc2F2ZWREYXRhU3RhdGUuZW1pdCh0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgYXBpcyA9IG5ldyBBcGlzKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBBUElfQ09ORklHOiBmaWVsZC5hcGksXG4gICAgICAgICAgICAgICAgQVBJX1JFU1BPTlNFOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhcGkgPSBhd2FpdCBhcGlzLnZhbGlkYXRlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgZmllbGQuYXBpID0gYXBpO1xuICAgICAgICAgICAgfSkoKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikgJiZcbiAgICAgICAgICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0NIQU5HRVwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIk9OX0NIQU5HRVwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKFxuICAgICAgICAgICAgICBFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9SRVZFUlNFX0xBVF9MT05HLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICAgIGZpZWxkX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6IFwiUkVWRVJTRV9MQVRfTE9OR19BUElfU1VDQ0VTU1wiLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKFxuICAgICAgICAgICAgICBFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9SRVZFUlNFX0xBVF9MT05HLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICAgIGZpZWxkX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6IFwiUkVWRVJTRV9MQVRfTE9OR19BUElfRVJST1JcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgICAgICAgIEFQSV9DT05GSUc6IGZpZWxkLmFwaSxcbiAgICAgICAgICAgICAgICBBUElfUkVTUE9OU0U6IHt9LFxuICAgICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFwaSA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXNwb25zZSgpO1xuICAgICAgICAgICAgICBmaWVsZC5hcGkgPSBhcGk7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmV2ZXJzZSBMb2NhdGlvbiBmb3IgTGF0TG9uZyBGYWlsZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJidXR0b25DbGlja1Jlc3BvbnNlXCIpKSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UgPSBjaGFuZ2VzLmJ1dHRvbkNsaWNrUmVzcG9uc2UuY3VycmVudFZhbHVlO1xuXG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLCBcImtleVwiKSkge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgdGhpcy5idXR0b25DbGlja1Jlc3BvbnNlPy5rZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gZ2V0T2JqZWN0RGVlcENvcHkodGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLmRlZmF1bHQpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2VbXCJkZWZhdWx0XCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UsIFwibWVzc2FnZXNcIikpIHtcbiAgICAgICAgICBmaWVsZC5tZXNzYWdlcyA9IGdldE9iamVjdERlZXBDb3B5KHRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZS5tZXNzYWdlcyk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZVtcIm1lc3NhZ2VzXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UsIFwidmFsaWRhdGlvblwiKSkge1xuICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb24gPSBnZXRPYmplY3REZWVwQ29weShcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZS52YWxpZGF0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5idXR0b25DbGlja1Jlc3BvbnNlW1widmFsaWRhdGlvblwiXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkID0gZ2V0T2JqZWN0RGVlcENvcHkoXG4gICAgICAgICAgbWVyZ2VPYmplY3RzKGZpZWxkLCB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC52YWxpZGF0aW9uLCBcInRyaWdnZXJzXCIpICYmXG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fUkVTUE9OU0VcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgcnVsZUVuZ2luZS5ydW4oZmllbGQudmFsaWRhdGlvbik7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiYWxsRm9ybXNEYXRhXCIpKSB7XG4gICAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IGNoYW5nZXMuYWxsRm9ybXNEYXRhLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1Db25maWdcIikpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IGNoYW5nZXMuZm9ybUNvbmZpZy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdEZvcm1Db25maWcodGhpcy5mb3JtQ29uZmlnKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW1lcmFSZWNvcmRpbmdUaW1lclN1YmNyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNhbWVyYVJlY29yZGluZ1RpbWVyU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FtZXJhUmVjb3JkaW5nU3RhdGVTdWJjcmlwdGlvbikge1xuICAgICAgdGhpcy5jYW1lcmFSZWNvcmRpbmdTdGF0ZVN1YmNyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICB0cmlnZ2VyTG9ncyhldmVudFR5cGU6IEVMb2dFdmVudFR5cGUsIGxvZ3M6IGFueSkge1xuICAgIHRoaXMuZ2V0TG9ncy5lbWl0KFxuICAgICAgZm9ybWF0RXZlbnRMb2dzKFxuICAgICAgICBldmVudFR5cGUsXG4gICAgICAgIHRoaXMuc3RlcENvbmZpZyxcbiAgICAgICAgdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgICBnZXRPYmplY3REZWVwQ29weShsb2dzKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGluaXRGb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xuICAgIGZvcm1Db25maWcgPSBuZXcgQ29udmVydGVyKCkuY29udmVydEZvcm1Db25maWcoZm9ybUNvbmZpZyk7XG5cbiAgICBmb3JtQ29uZmlnID0gbmV3IENvbnZlcnRlcigpLnVwZGF0ZUZvcm1Db25maWdQcm9wZXJ0aWVzKGZvcm1Db25maWcpO1xuXG4gICAgdGhpcy5zZXRGb3JtRmllbGRzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZyk7XG5cbiAgICB0aGlzLnNldEZvcm1GaWVsZEdyb3Vwc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWcpO1xuXG4gICAgdGhpcy5zZXRGb3JtRGF0YUZyb21BbGxGb3Jtc0RhdGEoKTtcblxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQ09ORklHX0xPQURfU1VDQ0VTUywge1xuICAgICAgLi4uKGZvcm1Db25maWcuc2VxdWVuY2VObyAmJiB7XG4gICAgICAgIGZvcm1fc2VxdWVuY2Vfbm86IGZvcm1Db25maWcuc2VxdWVuY2VOb1xuICAgICAgfSksXG4gICAgICAuLi4oZm9ybUNvbmZpZy5zdGF0dXMgJiYgeyBmb3JtX3N0YXR1czogZm9ybUNvbmZpZy5zdGF0dXMgfSlcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFBSRSBGb3JtIFRhc2tzXG4gICAgICogMS4gQVBJIENhbGxzLlxuICAgICAqIDIuIEFsdGVyIERhdGEgU3RydWN0dXJlLlxuICAgICAqIDMuIEFsdGVyIEZvcm0gQ29uZmlnLlxuICAgICAqL1xuICAgIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuZm9ybUNvbmZpZywgXCJ0YXNrc1wiKSAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5mb3JtQ29uZmlnLnRhc2tzLCBcInByZVwiKVxuICAgICkge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1RBU0tfUFJFLCB7fSk7XG5cbiAgICAgIGZvciAobGV0IHByZVRhc2sgb2YgdGhpcy5mb3JtQ29uZmlnLnRhc2tzLnByZSkge1xuICAgICAgICBjb25zdCB0YXNrID0gbmV3IFRhc2tzKFxuICAgICAgICAgIHByZVRhc2ssXG4gICAgICAgICAge1xuICAgICAgICAgICAgRk9STV9DT05GSUc6IHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RvcFRhc2tFeGVjdXRpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHByZVRhc2ssIFwid2FpdFwiKSkge1xuICAgICAgICAgIHRoaXMud2FpdGluZ0ZvckNoYW5nZXMgPSBwcmVUYXNrLndhaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGFzay5leGVjdXRlKCk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgbmdPbkNoYW5nZXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBjb250aW51aW5nIHRvIHRoZSBuZXh0IHRhc2tcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndhaXRpbmdGb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0b3BUYXNrRXhlY3V0aW9uKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtRGF0YSA9IG1lcmdlT2JqZWN0cyh0aGlzLmZvcm1EYXRhLCB0aGlzLnBvcHVwRm9ybURhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0b3BUYXNrRXhlY3V0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBhd2FpdCB0aGlzLmZvcm1WaWV3U2VydmljZS5jcmVhdGVGb3JtR3JvdXAoXG4gICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICB0aGlzLmZvcm1EYXRhLFxuICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICB0aGlzLmV4dHJhRGF0YSxcbiAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvciBzb21lIHJlYXNvbiBpZiB0aGVpciBhIGZpZWxkIG9mIHR5cGUgJ0lNQUdFJyB0aGVuXG4gICAgICogZm9ybURhdGEgaXMgYWRkaW5nIGEgJ3VuZGVmaW5lZCcga2V5IHdpdGggbGFzdCBpbWFnZSdzIHZhbHVlIGZyb20gdGhlIGFycmF5LlxuICAgICAqIEJlbG93IHBpZWNlIG9mIGNvZGUgaXMgdG8gcmVtb3ZlIHRoYXQgcmVkdW5kZW50IHZhbHVlIGZyb20gZm9ybURhdGEuXG4gICAgICovXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuZm9ybURhdGEsIFwidW5kZWZpbmVkXCIpKSB7XG4gICAgICBkZWxldGUgdGhpcy5mb3JtRGF0YVtcInVuZGVmaW5lZFwiXTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50KSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgW2ZpZWxkLmtleV06IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICApXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFtmaWVsZC5rZXldOiBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkZJTEUpIHtcbiAgICAgICAgICB0aGlzLmZpbGVzW2ZpZWxkLmtleV0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkNBUFRVUkUpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gICAgICAgICAgdGhpcy5tZWRpYUZpbGVzW2ZpZWxkLmtleV0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLlJFQ09SRCkge1xuICAgICAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcbiAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKHBhaXJ3aXNlKCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICBbZmllbGQua2V5XTogY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFtmaWVsZC5rZXldOiBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gRUZpZWxkVHlwZS5GSUxFKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZXNbZmllbGQua2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkNBUFRVUkUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldENhbWVyYSgpO1xuICAgICAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLlJFQ09SRCkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gICAgICAgICAgICAgIHRoaXMubWVkaWFGaWxlc1tmaWVsZC5rZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikpIHtcbiAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0lOSVRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYXdhaXQgcnVsZUVuZ2luZS5ydW4oZmllbGQudmFsaWRhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJPTl9JTklUXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEZvcm1GaWVsZHNGcm9tRm9ybUNvbmZpZyhmb3JtQ29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybUNvbmZpZywgXCJmaWVsZHNcIikpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IGZvcm1Db25maWcuZmllbGRzO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybUNvbmZpZy5tdWx0aUZvcm0sIFwiZmllbGRzXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmZvcm1GaWVsZHMgPSBmb3JtQ29uZmlnLm11bHRpRm9ybS5maWVsZHM7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRGb3JtRmllbGRHcm91cHNGcm9tRm9ybUNvbmZpZyhmb3JtQ29uZmlnOiBhbnkpIHtcbiAgICB0aGlzLmZpZWxkR3JvdXBzID0gZm9ybUNvbmZpZy5maWVsZEdyb3VwcztcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2V0Rm9ybURhdGFGcm9tQWxsRm9ybXNEYXRhKCkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmFsbEZvcm1zRGF0YSwgdGhpcy5mb3JtQ29uZmlnLmtleSkpIHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5hbGxGb3Jtc0RhdGFbdGhpcy5mb3JtQ29uZmlnLmtleV07XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybURhdGEsIFwiZGF0YVwiKSAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtRGF0YSwgXCJleHRlbmRlZERhdGFcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgLi4uZm9ybURhdGFbXCJkYXRhXCJdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgLi4uZm9ybURhdGFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXBBY3Rpb25zKFxuICAgIGNoaWxkRmllbGRHcm91cENvbmZpZzogYW55LFxuICAgIHBhcmVudEZpZWxkOiBhbnlcbiAgKSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNoaWxkRmllbGRHcm91cENvbmZpZywgXCJydWxlc1wiKSkge1xuICAgICAgY29uc3QgcnVsZXNNYXBwaW5nID0gbmV3IFJ1bGUoY2hpbGRGaWVsZEdyb3VwQ29uZmlnLnJ1bGVzLCB7XG4gICAgICAgIEZJRUxEX0NPTkZJRzogcGFyZW50RmllbGQsXG4gICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgfSkubWFwcGluZygpO1xuXG4gICAgICBmb3IgKGxldCBhY3Rpb24gb2YgY2hpbGRGaWVsZEdyb3VwQ29uZmlnLmFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb24oXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBydWxlc01hcHBpbmcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogcGFyZW50RmllbGQsXG4gICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbk9uRmllbGRHcm91cC5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRHcm91cChcbiAgICBjdXJyZW50RmllbGQ6IGFueSxcbiAgICBjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnOiBhbnksXG4gICAgZXZlbnRUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcsIFwidHJpZ2dlcnNcIikpIHtcbiAgICAgIGlmIChjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnLnRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRHcm91cEFjdGlvbnMoXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRHcm91cENvbmZpZyxcbiAgICAgICAgICBjdXJyZW50RmllbGRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEFjdGlvbnMoXG4gICAgY29ubmVjdGVkRmllbGRDb25maWc6IGFueSxcbiAgICBjb25uZWN0ZWRGaWVsZDogYW55XG4gICkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZENvbmZpZywgXCJydWxlc1wiKSkge1xuICAgICAgY29uc3QgcnVsZXNNYXBwaW5nID0gbmV3IFJ1bGUoY29ubmVjdGVkRmllbGRDb25maWcucnVsZXMsIHtcbiAgICAgICAgRklFTERfQ09ORklHOiBjb25uZWN0ZWRGaWVsZCxcbiAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICB9KS5tYXBwaW5nKCk7XG5cbiAgICAgIGZvciAobGV0IGFjdGlvbiBvZiBjb25uZWN0ZWRGaWVsZENvbmZpZy5hY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN1Y2Nlc3MgPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICBpZiAoY29uZGl0aW9uU3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGNvbm5lY3RlZEZpZWxkLFxuICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25uZWN0ZWRGaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkcyhcbiAgICBjdXJyZW50RmllbGQ6IGFueSxcbiAgICBjb25uZWN0ZWRGaWVsZENvbmZpZzogYW55LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIG5lc3RlZDogc3RyaW5nXG4gICkge1xuICAgIGxldCBjb25uZWN0ZWRGaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KFxuICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgY29ubmVjdGVkRmllbGRDb25maWdbXCJrZXlcIl1cbiAgICApO1xuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkQ29uZmlnLCBcInRyaWdnZXJzXCIpKSB7XG4gICAgICBpZiAoY29ubmVjdGVkRmllbGRDb25maWcudHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnRUeXBlKSkge1xuICAgICAgICBjb25uZWN0ZWRGaWVsZCA9IGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkQWN0aW9ucyhcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZyxcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRDb25maWcsIFwiaGFuZGxlTmVzdGVkRmllbGRzXCIpKSB7XG4gICAgICBpZiAoY29ubmVjdGVkRmllbGRDb25maWcuaGFuZGxlTmVzdGVkRmllbGRzKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgeyBrZXk6IGNvbm5lY3RlZEZpZWxkQ29uZmlnLmtleSB9LFxuICAgICAgICAgIGV2ZW50VHlwZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudEZpZWxkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhlOiBhbnksIGV2ZW50VHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IGN1cnJlbnRGaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgaWYgKGN1cnJlbnRGaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY3VycmVudEZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhcbiAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIFwiY29ubmVjdGVkRmllbGRHcm91cHNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGNvbm5lY3RlZEZpZWxkR3JvdXBzID1cbiAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cy5jb25uZWN0ZWRGaWVsZEdyb3VwcztcbiAgICAgICAgICBmb3IgKGxldCBjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnIG9mIGNvbm5lY3RlZEZpZWxkR3JvdXBzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEdyb3VwKFxuICAgICAgICAgICAgICBjdXJyZW50RmllbGQsXG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcsXG4gICAgICAgICAgICAgIGV2ZW50VHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgXCJjb25uZWN0ZWRGaWVsZHNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGNvbm5lY3RlZEZpZWxkcyA9IGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cy5jb25uZWN0ZWRGaWVsZHM7XG4gICAgICAgICAgZm9yIChsZXQgY29ubmVjdGVkRmllbGRDb25maWcgb2YgY29ubmVjdGVkRmllbGRzKSB7XG4gICAgICAgICAgICBjdXJyZW50RmllbGQgPSBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZHMoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXG4gICAgICAgICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGaWVsZCBmb3IgdGhlIGdpdmVuIGtleSBbJyR7ZS5rZXl9J10gaXMgbm90IGZvdW5kIHdpdGggZXZlbnRUeXBlOiAnJHtldmVudFR5cGV9Jy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlUmVtb3ZlZEZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXBbXCJjb250cm9sc1wiXVtlLmtleV0uZW5hYmxlZCkge1xuICAgICAgdGhpcy5maWxlc1tlLmtleV0gPSBlLmZpbGVzO1xuXG4gICAgICB0aGlzLmZvcm1EYXRhW2Uua2V5XSA9IGZpbHRlckR1cGxpY2F0ZXNGaWxlcyh0aGlzLmZpbGVzW2Uua2V5XSk7XG5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBbZS5rZXldOiB0aGlzLmZvcm1EYXRhW2Uua2V5XVxuICAgICAgICB9LFxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfRklMRV9SRU1PVkUsIHtcbiAgICAgIGZpZWxkX2tleTogZS5rZXksXG4gICAgICAuLi4oZS5maWxlPy5uYW1lID8/IHsgZmlsZV9uYW1lOiBlLmZpbGU/Lm5hbWUgfSksXG4gICAgICAuLi4oZS5maWxlPy5zaXplID8/IHsgZmlsZV9zaXplOiBlLmZpbGU/LnNpemUgfSksXG4gICAgICAuLi4oZS5maWxlPy50eXBlID8/IHsgZmlsZV90eXBlOiBlLmZpbGU/LnR5cGUgfSlcbiAgICB9KTtcblxuICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVWaWV3QnV0dG9uQ2xpY2soZTogYW55LCBmaWVsZDogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrVmlld0ZpbGUuZW1pdCh7XG4gICAgICBrZXk6IGZpZWxkPy5rZXksXG4gICAgICB0eXBlOiBmaWVsZD8udHlwZSxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZmllbGQ6IGZpZWxkLFxuICAgICAgICBldmVudDogZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVHZXRLZXlWYWx1ZUZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgbGV0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZS52YWx1ZSkgPyBlLnZhbHVlIDogW2UudmFsdWVdO1xuXG4gICAgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwicHJvcGVydGllc1wiKSAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQucHJvcGVydGllcywgXCJ1cGxvYWRGaWxlVG9TZXJ2ZXJcIikgJiZcbiAgICAgIGZpZWxkLnByb3BlcnRpZXMudXBsb2FkRmlsZVRvU2VydmVyXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZEZpbGUoZmllbGQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlcyh2YWx1ZSwgXCJMT0FESU5HXCIsIGUua2V5KTtcblxuICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfRklMRV9BREQsIHtcbiAgICAgICAgICBmaWVsZF9rZXk6IGUua2V5LFxuICAgICAgICAgIC4uLihlLmZpbGU/Lm5hbWUgPz8geyBmaWxlX25hbWU6IGUuZmlsZT8ubmFtZSB9KSxcbiAgICAgICAgICAuLi4oZS5maWxlPy5zaXplID8/IHsgZmlsZV9zaXplOiBlLmZpbGU/LnNpemUgfSksXG4gICAgICAgICAgLi4uKGUuZmlsZT8udHlwZSA/PyB7IGZpbGVfdHlwZTogZS5maWxlPy50eXBlIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWxlID0gZ2V0T2JqZWN0RGVlcENvcHkoXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBpZDogdXVpZHY0KCksXG4gICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB2YWx1ZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiB2YWx1ZS53ZWJraXRSZWxhdGl2ZVBhdGhcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAzMDApOyAvLyAxMDAwIG1zID0gMSBzZWNcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXModXBkYXRlZEZpbGUsIFwiTk9STUFMXCIsIGUua2V5KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1ldGhvZHMgZm9yIENhbWVyYSByZWxhdGVkIGZpZWxkcyBsaWtlICdDQVBUVVJFJyBvciAgJ1JFQ09SRCcgKi9cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrR2V0UmVtb3ZlZE1lZGlhRmlsZShlOiBhbnkpIHtcbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgIGlmICh0aGlzLmZvcm1Hcm91cFtcImNvbnRyb2xzXCJdW2Uua2V5XS5lbmFibGVkKSB7XG4gICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgIHRoaXMubWVkaWFGaWxlc1tlLmtleV0gPSBlLm1lZGlhRmlsZXM7XG5cbiAgICAgIHRoaXMuZm9ybURhdGFbZS5rZXldID0gZmlsdGVyRHVwbGljYXRlc01lZGlhRmlsZXModGhpcy5tZWRpYUZpbGVzW2Uua2V5XSk7XG5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBbZS5rZXldOiB0aGlzLmZvcm1EYXRhW2Uua2V5XVxuICAgICAgICB9LFxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX01FRElBX0ZJTEVfUkVNT1ZFLCB7XG4gICAgICAgIGZpZWxkX2tleTogZS5rZXksXG4gICAgICAgIC4uLihlLmZpbGU/Lm5hbWUgPz8geyBmaWxlX25hbWU6IGUuZmlsZT8ubmFtZSB9KSxcbiAgICAgICAgLi4uKGUuZmlsZT8uc2l6ZSA/PyB7IGZpbGVfc2l6ZTogZS5maWxlPy5zaXplIH0pLFxuICAgICAgICAuLi4oZS5maWxlPy50eXBlID8/IHsgZmlsZV90eXBlOiBlLmZpbGU/LnR5cGUgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrSW5wdXRDYW1lcmEoZTogYW55LCBmaWVsZDogYW55KSB7XG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLnNob3coe1xuICAgICAgbG9hZGVyVGV4dDogXCJMb2FkaW5nIENhbWVyYS4uLlwiLFxuICAgICAgZnVsbHNjcmVlbjogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBmaWVsZC5rZXk7XG4gICAgY29uc3QgZmllbGRjYW1lcmFDb25maWcgPSBmaWVsZD8ucHJvcGVydGllcz8uY2FtZXJhQ29uZmlnID8/IHt9O1xuXG4gICAgdGhpcy5jYW1lcmFUeXBlID0gZmllbGQ/LnR5cGUudG9VcHBlckNhc2UoKSB8fCBcIlwiO1xuICAgIHRoaXMuY2FtZXJhRmllbGRLZXkgPSBmaWVsZEtleTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9DQU1FUkFfQlVUVE9OX0NMSUNLLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBjYW1lcmFfdHlwZTogdGhpcy5jYW1lcmFUeXBlXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuY2FtZXJhVHlwZSkge1xuICAgICAgY2FzZSBcIkNBUFRVUkVcIjpcbiAgICAgICAgdGhpcy5jYW1lcmFDb25maWcgPSBtZXJnZU9iamVjdHNEZWVwKFtcbiAgICAgICAgICBGSUVMRF9QUk9QRVJUSUVTLmNhcHR1cmUuY2FtZXJhQ29uZmlnLFxuICAgICAgICAgIGZpZWxkY2FtZXJhQ29uZmlnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmNhbWVyYUNvbmZpZz8ub3RoZXJzPy5pc1dhdGVybWFyayB8fFxuICAgICAgICAgIHRoaXMuY2FtZXJhQ29uZmlnPy5vdGhlcnM/LmlzV2F0ZXJtYXJrRm9ySW1hZ2VVcGxvYWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY2FtZXJhSGVscGVyID0gbmV3IENhbWVyYUhlbHBlcihcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgdGhpcy5leHRyYURhdGFcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5jYW1lcmFEYXRhID0ge1xuICAgICAgICAgICAgd2F0ZXJtYXJrOiBhd2FpdCBjYW1lcmFIZWxwZXIuZ2V0Q2FtZXJhV2F0ZXJtYXJrRGF0YSgpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNhbWVyYURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUkVDT1JEXCI6XG4gICAgICAgIHRoaXMuY2FtZXJhQ29uZmlnID0gbWVyZ2VPYmplY3RzRGVlcChbXG4gICAgICAgICAgRklFTERfUFJPUEVSVElFUy5yZWNvcmQuY2FtZXJhQ29uZmlnLFxuICAgICAgICAgIGZpZWxkY2FtZXJhQ29uZmlnXG4gICAgICAgIF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlnIGFuZCBvdGhlciBkYXRhIGlzIHNldCBub3csIHNvIHdlIGNhbiBzaG93IHRoZSBjYW1lcmEuXG4gICAgICovXG4gICAgdGhpcy5pc1Nob3dDYW1lcmEgPSB0cnVlO1xuXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGUoKTtcbiAgfVxuXG4gIC8qKiBLd2lrSUQgQ2FtZXJhIE1ldGhvZHMgKi9cbiAgLyoqIENhbWVyYVR5cGUgPSBDQVBUVVJFICovXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0Q2FtZXJhTWVkaWEobWVkaWE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCB0aGlzLmNhbWVyYUZpZWxkS2V5KTtcblxuICAgIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInByb3BlcnRpZXNcIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLnByb3BlcnRpZXMsIFwidXBsb2FkRmlsZVRvU2VydmVyXCIpICYmXG4gICAgICBmaWVsZC5wcm9wZXJ0aWVzLnVwbG9hZEZpbGVUb1NlcnZlclxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRGaWxlKGZpZWxkLCBtZWRpYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcblxuICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW21lZGlhXSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KFttZWRpYV0pO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5wYXRjaFZhbHVlKFxuICAgICAgICBnZXRPYmplY3REZWVwQ29weShbbWVkaWFdKSxcbiAgICAgICAge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgb25seVNlbGY6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgW2ZpZWxkLmtleV06IGdldE9iamVjdERlZXBDb3B5KFttZWRpYV0pXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0ZJTEVfQURELCB7XG4gICAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FtZXJhIENvbW1vbiBNZXRob2RzICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0Q2FtZXJhTWVkaWEoZTogYW55LCBjYW1lcmFUeXBlOiBcIkNBUFRVUkVcIiB8IFwiUkVDT1JEXCIpIHtcbiAgICBzd2l0Y2ggKGNhbWVyYVR5cGUpIHtcbiAgICAgIGNhc2UgXCJDQVBUVVJFXCI6XG4gICAgICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgICAgIHRoaXMuY2FtZXJhSW1hZ2UgPSBcIlwiO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFByaW9yaXR5IG9mIEltYWdlIHRvIFNldCBmb3IgQ29uZmlnIEJhc2VkXG4gICAgICAgICAgICogMS4gTWFza2VkXG4gICAgICAgICAgICogMi4gQ3JvcHBlZFxuICAgICAgICAgICAqIDMuIE9yaWdpbmFsXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBJZiBubyBtYXNrZWQgb3IgY3JvcHBlZCBpbWFnZSBpcyBhdmFpbGFibGUgdGhlbiBkaXJlY3RseSBzZXQgT3JpZ2luYWwgSW1hZ2VcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgdGhpcy5jYW1lcmFGaWVsZEtleSk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZSA9IGZpZWxkLnByb3BlcnRpZXM/LmlzTWFza2VkSW1hZ2VcbiAgICAgICAgICAgID8gZT8ubWFza2VkSW1hZ2UgPz8gZT8ub3JpZ2luYWxJbWFnZVxuICAgICAgICAgICAgOiBmaWVsZC5wcm9wZXJ0aWVzPy5pc0Nyb3BwZWRJbWFnZVxuICAgICAgICAgICAgPyBlPy5jcm9wcGVkSW1hZ2UgPz8gZT8ub3JpZ2luYWxJbWFnZVxuICAgICAgICAgICAgOiBlPy5vcmlnaW5hbEltYWdlO1xuXG4gICAgICAgICAgY29uc3QgaXNTaG93SW1hZ2VQcmV2aWV3ID0gdGhpcy5jYW1lcmFDb25maWc/Lm90aGVycz8ucHJldmlldz8uc2hvdztcblxuICAgICAgICAgIGlmIChpc1Nob3dJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhSW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRDYW1lcmFNZWRpYShpbWFnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgIH0sIDUwMCk7IC8vIERlbGF5IGlzIGFkZGVkIGR1ZSB0byBpc3N1cyB3aXRoIEt3aWtJRCBDYW1lcmEgbm90IGJlaW5nIGFibGUgdG8gaGFuZGxlIHRvIGZhc3QgcHJvY2Vzc2luZy5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUkVDT1JEXCI6XG4gICAgICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgICAgIHRoaXMuY2FtZXJhVmlkZW8gPSBcIlwiO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFByaW9yaXR5IG9mIEltYWdlIHRvIFNldCBmb3IgQ29uZmlnIEJhc2VkXG4gICAgICAgICAgICogMS4gT3JpZ2luYWxcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgdGhpcy5jYW1lcmFGaWVsZEtleSk7XG5cbiAgICAgICAgICBjb25zdCB2aWRlbyA9IGU/Lm9yaWdpbmFsVmlkZW87XG5cbiAgICAgICAgICBjb25zdCBpc1Nob3dWaWRlb1ByZXZpZXcgPSB0aGlzLmNhbWVyYUNvbmZpZz8ub3RoZXJzPy5wcmV2aWV3Py5zaG93O1xuXG4gICAgICAgICAgaWYgKGlzU2hvd1ZpZGVvUHJldmlldykge1xuICAgICAgICAgICAgdGhpcy5jYW1lcmFWaWRlbyA9IHZpZGVvO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENhbWVyYU1lZGlhKHZpZGVvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgICAgfSwgNTAwKTsgLy8gRGVsYXkgaXMgYWRkZWQgZHVlIHRvIGlzc3VzIHdpdGggS3dpa0lEIENhbWVyYSBub3QgYmVpbmcgYWJsZSB0byBoYW5kbGUgdG8gZmFzdCBwcm9jZXNzaW5nLlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1NhdmVDYW1lcmFNZWRpYShlOiBhbnksIGNhbWVyYVR5cGU6IFwiQ0FQVFVSRVwiIHwgXCJSRUNPUkRcIikge1xuICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIHRoaXMuY2FtZXJhRmllbGRLZXkpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0NBTUVSQV9TQVZFX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgY2FtZXJhX3R5cGU6IGNhbWVyYVR5cGVcbiAgICB9KTtcblxuICAgIHN3aXRjaCAoY2FtZXJhVHlwZSkge1xuICAgICAgY2FzZSBcIkNBUFRVUkVcIjpcbiAgICAgICAgdGhpcy5jYW1lcmFJbWFnZSA9IFwiXCI7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW1hZ2UgPSBlPy5vcmlnaW5hbEltYWdlO1xuXG4gICAgICAgICAgdGhpcy5zZXRDYW1lcmFNZWRpYShpbWFnZSk7XG5cbiAgICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUkVDT1JEXCI6XG4gICAgICAgIHRoaXMuY2FtZXJhVmlkZW8gPSBcIlwiO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZpZGVvID0gZT8ub3JpZ2luYWxWaWRlbztcblxuICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTWVkaWEodmlkZW8pO1xuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0NhbWVyYUJhY2soZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIHRoaXMuY2FtZXJhRmllbGRLZXkpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0NBTUVSQV9CQUNLX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tDYW1lcmFDbG9zZShlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgdGhpcy5jYW1lcmFGaWVsZEtleSk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQ0FNRVJBX0NMT1NFX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGZpbGVzIGFycmF5IHdpdGggdGhlIG5ldyBmaWxlIGFuZCBpdCdzIHN0YXRlIGFuZCByZXNwb25zZSBmcm9tIHRoZSBhcGkgb2YgdXBsb2FkaW5nIHRoZSBmaWxlLlxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICB1cGRhdGVGaWxlcyhmaWxlOiBhbnksIHN0YXRlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsZVdpdGhTdGF0ZSA9IG1lcmdlT2JqZWN0cyhmaWxlIGFzIGFueSwgeyBzdGF0ZTogc3RhdGUgfSk7XG5cbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywga2V5KTtcblxuICAgIGlmIChmaWVsZC5wcm9wZXJ0aWVzPy5tdWx0aXBsZSkge1xuICAgICAgLy8gSWYgZmllbGQucHJvcGVydGllcz8ubXVsdGlwbGUgaXMgdHJ1ZSwgaXQgbWVhbnMgbXVsdGlwbGUgZmlsZXMgYXJlIGFsbG93ZWQgZm9yIHRoaXMgZmllbGQuXG4gICAgICAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGZpbGVzIGFycmF5IGZvciB0aGUgc3BlY2lmaWMga2V5IHdpdGggdGhlIG5ldyBmaWxlLlxuICAgICAgY29uc3QgdXBkYXRlZEZpbGVzID0gW1xuICAgICAgICAuLi50aGlzLmZpbGVzW2tleV0uZmlsdGVyKFxuICAgICAgICAgIChmKSA9PiBmLm5hbWUgIT09IGZpbGVXaXRoU3RhdGUubmFtZSB8fCBmLnNpemUgIT09IGZpbGVXaXRoU3RhdGUuc2l6ZVxuICAgICAgICApLFxuICAgICAgICBmaWxlV2l0aFN0YXRlXG4gICAgICBdO1xuXG4gICAgICAvLyBBcHBseSB0aGUgZmlsdGVyRHVwbGljYXRlc0ZpbGVzIGZ1bmN0aW9uIHRvIGVuc3VyZSB1bmlxdWVuZXNzIGluIHRoZSB1cGRhdGVkRmlsZXMgYXJyYXkuXG4gICAgICB0aGlzLmZpbGVzW2tleV0gPSBmaWx0ZXJEdXBsaWNhdGVzRmlsZXModXBkYXRlZEZpbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgZmllbGQucHJvcGVydGllcz8ubXVsdGlwbGUgaXMgZmFsc2UsIG9ubHkgb25lIGZpbGUgaXMgYWxsb3dlZCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGV4aXN0aW5nIGZpbGVzIGFycmF5IGZvciB0aGUgc3BlY2lmaWMga2V5IHdpdGggYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbmV3IGZpbGUuXG4gICAgICB0aGlzLmZpbGVzW2tleV0gPSBbZmlsZVdpdGhTdGF0ZV07XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBmb3JtRGF0YSBhbmQgZm9ybUdyb3VwIGNvbnRyb2xzIGZvciB0aGUgc3BlY2lmaWMga2V5IHdpdGggdGhlIG5vcm1hbEZpbGVzIGFycmF5LlxuICAgIGNvbnN0IG5vcm1hbEZpbGVzID0gdGhpcy5maWxlc1trZXldLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpbGUuc3RhdGUgPT09IFwiTk9STUFMXCI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm1EYXRhW2tleV0gPSBub3JtYWxGaWxlcztcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1trZXldLnBhdGNoVmFsdWUobm9ybWFsRmlsZXMsIHtcbiAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICBvbmx5U2VsZjogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICBba2V5XTogbm9ybWFsRmlsZXNcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG5cbiAgICB0aGlzLmdldFVuc2F2ZWREYXRhU3RhdGUuZW1pdCh0cnVlKTtcblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikgJiZcbiAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAge1xuICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgcnVsZUVuZ2luZS5ydW4oZmllbGQudmFsaWRhdGlvbik7XG4gICAgICB9KSgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJPTl9DSEFOR0VcIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIGFwaSB1cGxvYWQgbW9ja2luZyBtZXRob2QuIFNldCdzIHRvIGxvYWRpbmcgYXQgZmlyc3QgYXQgcG9pbnQgd2hlbiBBUEkgaXMgY2FsbGVkIGFuZCB0aGVuIGNoYW5nZXMgdGhlIHN0YXR1cyB0byByYW5kb20gc3RhdHVzIGFmdGVyIDIgc2Vjb25kcyBvZiBkZWxheSBzaG93aW5nIGEgbW9ja2VkIHJlc3BvbnNlIGZyb20gQVBJLlxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB1cGxvYWRGaWxlKGZpZWxkOiBhbnksIGZpbGU6IGFueSkge1xuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkZJTEU6XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMoZmlsZSwgXCJMT0FESU5HXCIsIGZpZWxkLmtleSk7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9GSUxFLCB7XG4gICAgICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICByZXF1ZXN0OiBnZXRPYmplY3REZWVwQ29weSh7XG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFjdHVhbCBBUEkgQ2FsbFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdCh7XG4gICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB3ZWJraXRSZWxhdGl2ZVBhdGg6IGZpbGUud2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVGaWxlcyhmaWxlLCBcIkVSUk9SXCIsIGZpZWxkLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuQ0FQVFVSRTpcbiAgICAgICAgLy8gQWN0dWFsIEFQSSBDYWxsXG5cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9JTUFHRSwge1xuICAgICAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgaW1hZ2U6IGZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkNsaWNrQXBpQ2FsbC5lbWl0KHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgaW1hZ2U6IGZpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gdXBsb2FkIGltYWdlIHRvIHNlcnZlciFcIik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuUkVDT1JEOlxuICAgICAgICAvLyBBY3R1YWwgQVBJIENhbGxcblxuICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFUVVFU1RfVVBMT0FEX1ZJREVPLCB7XG4gICAgICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB2aWRlbzogZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm9uQ2xpY2tBcGlDYWxsLmVtaXQoe1xuICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICB2aWRlbzogZmlsZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZhaWxlZCB0byB1cGxvYWQgdmlkZW8gdG8gc2VydmVyIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tGb3JtRmllbGRCdXR0b24oZmllbGQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBmb3JtRGF0YSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50KSB7XG4gICAgICAgIGlmIChmaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgICBkZWxldGUgZm9ybURhdGFbZmllbGQua2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldID0gY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZm9ybURhdGFbZmllbGQua2V5XVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHRlbmRlZEZvcm1EYXRhID0gdGhpcy5mb3JtRmllbGRzLnJlZHVjZSgocmVzdWx0LCBmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50ICYmICFmaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgY29uc3QgZmllbGREYXRhID0ge1xuICAgICAgICAgIFtmaWVsZC5rZXldOiB7XG4gICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbCxcbiAgICAgICAgICAgIHZhbHVlOiBpc0VtcHR5VmFsdWUoZm9ybURhdGFbZmllbGQua2V5XSkgPyBcIlwiIDogZm9ybURhdGFbZmllbGQua2V5XSxcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdFtmaWVsZC5rZXldID0gZmllbGREYXRhW2ZpZWxkLmtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGZpZWxkX2xhYmVsOiBmaWVsZC5sYWJlbFxuICAgIH0pO1xuXG4gICAgdGhpcy5vbkNsaWNrRm9ybUZpZWxkQnV0dG9uLmVtaXQoe1xuICAgICAgY29uZmlnOiBmaWVsZCxcbiAgICAgIGRhdGE6IG1lcmdlT2JqZWN0cyh0aGlzLmZvcm1EYXRhLCB0aGlzLnBvcHVwRm9ybURhdGEsIHRoaXMudGFza0RhdGEpLFxuICAgICAgZXh0ZW5kZWREYXRhOiBleHRlbmRlZEZvcm1EYXRhXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uTG9jYXRpb25QZXJtaXNzaW9uKGU6IGFueSkge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICAvLyBzZXQgYnV0dG9uIHN0YXR1cyB0byBkZWZhdWx0XG4gICAgZmllbGRbXCJhcGlcIl1bXCJzdGF0dXNcIl1bXCJ2YWx1ZVwiXSA9IEVBcGlTdGF0dXNUeXBlLkxPQURJTkc7XG4gICAgZmllbGRbXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcbiAgICB0aGlzLmZpZWxkU2hvd0FwaUxvYWRlcihmaWVsZC5rZXkpO1xuXG4gICAgaWYgKCFlLnBlcm1pc3Npb24pIHtcbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19MSVZFX0xPQ0FUSU9OX1BFUk1JU1NJT05fRVJST1IsIHtcbiAgICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnRvZ2dsZVBlcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvbih0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRvZ2dsZVBlcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvbihmYWxzZSk7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0xJVkVfTE9DQVRJT05fUEVSTUlTU0lPTl9TVUNDRVNTLCB7XG4gICAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIHNldCBidXR0b24gc3RhdHVzIHRvIGRlZmF1bHRcbiAgICAgIGZpZWxkW1wiYXBpXCJdW1wic3RhdHVzXCJdW1widmFsdWVcIl0gPSBFQXBpU3RhdHVzVHlwZS5ERUZBVUxUO1xuICAgICAgZmllbGRbXCJzaG93TG9hZGVyXCJdID0gZmFsc2U7XG4gICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICAgICAgdGhpcy5maWVsZEhpZGVBcGlMb2FkZXIoZmllbGQua2V5KTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrTGl2ZUxvY2F0aW9uKGU6IGFueSkge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fTElWRV9MT0NBVElPTl9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgIH0pO1xuXG4gICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gbG9hZGluZ1xuICAgIGZpZWxkW1wiYXBpXCJdW1wic3RhdHVzXCJdW1widmFsdWVcIl0gPSBFQXBpU3RhdHVzVHlwZS5MT0FESU5HO1xuICAgIGZpZWxkW1wic2hvd0xvYWRlclwiXSA9IHRydWU7XG5cbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICB7XG4gICAgICAgIFtlLmtleV06IGUudmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1EYXRhW2Uua2V5XSA9IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICBmaWVsZCxcbiAgICAgIGUudmFsdWVcbiAgICApO1xuXG4gICAgdGhpcy5nZXRVbnNhdmVkRGF0YVN0YXRlLmVtaXQodHJ1ZSk7XG5cbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJwcm9wZXJ0aWVzXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5wcm9wZXJ0aWVzLCBcImlzR2V0TG9jYXRpb25Gcm9tTGF0TG9uZ1wiKSAmJlxuICAgICAgZmllbGQucHJvcGVydGllcy5pc0dldExvY2F0aW9uRnJvbUxhdExvbmdcbiAgICApIHtcbiAgICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdCh7XG4gICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgLi4uZS5saXZlTG9jYXRpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0sIDMwMCk7IC8vIDEwMDAgbXMgPSAxIHNlY1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHNldCBidXR0b24gc3RhdHVzIHRvIHN1Y2Nlc3NcbiAgICAgIGZpZWxkW1wiYXBpXCJdW1wic3RhdHVzXCJdW1widmFsdWVcIl0gPSBFQXBpU3RhdHVzVHlwZS5TVUNDRVNTO1xuICAgICAgZmllbGRbXCJzaG93TG9hZGVyXCJdID0gZmFsc2U7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICAgICkge1xuICAgICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcnVsZUVuZ2luZS5ydW4oZmllbGQudmFsaWRhdGlvbik7XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJPTl9DSEFOR0VcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBET00gRXZlbnQgSGFuZGxlcnNcbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVHZXRLZXlWYWx1ZShlOiBhbnkpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICBbZS5rZXldOiBlLnZhbHVlXG4gICAgICB9LFxuICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcbiAgICB0aGlzLmZvcm1EYXRhW2Uua2V5XSA9IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICBmaWVsZCxcbiAgICAgIGUudmFsdWVcbiAgICApO1xuXG4gICAgdGhpcy5nZXRVbnNhdmVkRGF0YVN0YXRlLmVtaXQodHJ1ZSk7XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgIHtcbiAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICk7XG5cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAge1xuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrUmVzZXRGb3JtRmllbGRzMihlOiBhbnksIGZpZWxkOiBURmllbGRUaXRsZSkge1xuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9SRVNFVF9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGQua2V5XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNldEZvcm1GaWVsZHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGxldCBmIG9mIGZpZWxkLnJlc2V0LmZpZWxkcykge1xuICAgICAgICBmb3IgKGxldCBhY3Rpb24gb2YgZi5hY3Rpb25zKSB7XG4gICAgICAgICAgY29uc3QgcmVzZXRGaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KFxuICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgYWN0aW9uLnByb3BzLmZpZWxkS2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IHJlc2V0RmllbGQsXG4gICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBCWVBBU1NfUkVTRVRfQ09ORklSTSA9IGZpZWxkPy5wcm9wZXJ0aWVzPy5ieXBhc3NSZXNldENvbmZpcm1hdGlvbjtcblxuICAgIGlmICghQllQQVNTX1JFU0VUX0NPTkZJUk0pIHtcbiAgICAgIGNvbnN0IENPTkZJUk1fUkVTRVQgPSB3aW5kb3cuY29uZmlybShcbiAgICAgICAgXCJUaGlzIGFjdGlvbiB3aWxsIHJlc2V0IGFsbCB0aGUgZmllbGRzLiBEbyB5b3Ugc3RpbGwgd2FudCB0byBjb250aW51ZT9cIlxuICAgICAgKTtcblxuICAgICAgaWYgKENPTkZJUk1fUkVTRVQpIHtcbiAgICAgICAgcmVzZXRGb3JtRmllbGRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2V0Rm9ybUZpZWxkcygpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlT25DbGlja1Jlc2V0Rm9ybUZpZWxkcyhlOiBhbnksIGZpZWxkOiBURmllbGRUaXRsZSkge1xuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9SRVNFVF9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGQua2V5XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNldEZvcm1GaWVsZHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RQYXRoRXhpc3RzKGZpZWxkLCBcInJlc2V0LmZpZWxkc1wiKSkge1xuICAgICAgICBmb3IgKGxldCBmIG9mIGZpZWxkLnJlc2V0LmZpZWxkcykge1xuICAgICAgICAgIGZvciAobGV0IGFjdGlvbiBvZiBmLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc2V0RmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMuZmllbGRLZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogcmVzZXRGaWVsZCxcbiAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tPYmplY3RQYXRoRXhpc3RzKGZpZWxkLCBcInJlc2V0LmZpZWxkR3JvdXBzXCIpKSB7XG4gICAgICAgIGZvciAobGV0IGZnIG9mIGZpZWxkLnJlc2V0LmZpZWxkR3JvdXBzKSB7XG4gICAgICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIGZnLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZpZWxkS2V5IG9mIHRoaXMuZmllbGRHcm91cHNbZmcuZ3JvdXBLZXldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc2V0RmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb24oXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogcmVzZXRGaWVsZCxcbiAgICAgICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLnRha2VBY3Rpb25PbkZpZWxkR3JvdXAuYmluZCh0aGlzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgQllQQVNTX1JFU0VUX0NPTkZJUk0gPSBmaWVsZD8ucHJvcGVydGllcz8uYnlwYXNzUmVzZXRDb25maXJtYXRpb247XG5cbiAgICBpZiAoIUJZUEFTU19SRVNFVF9DT05GSVJNKSB7XG4gICAgICBjb25zdCBDT05GSVJNX1JFU0VUID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIFwiVGhpcyBhY3Rpb24gd2lsbCByZXNldCBhbGwgdGhlIGZpZWxkcy4gRG8geW91IHN0aWxsIHdhbnQgdG8gY29udGludWU/XCJcbiAgICAgICk7XG5cbiAgICAgIGlmIChDT05GSVJNX1JFU0VUKSB7XG4gICAgICAgIHJlc2V0Rm9ybUZpZWxkcygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNldEZvcm1GaWVsZHMoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZUZpZWxkQXBpQ2FsbChmaWVsZDogVEZpZWxkQXBpQ2FsbCwgYXBpOiBhbnkpIHtcbiAgICBhcGkgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBcGlDYWxsKGFwaSwge1xuICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgIEFQSV9DT05GSUc6IGFwaSxcbiAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5pc1ZhbGlkUmVxdWVzdEhlYWRlcnNBbmRCb2R5KGFwaSkpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5hcGksIFwicmVxdWVzdFwiKSkge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgW2ZpZWxkLmtleV06IGFwaS5yZXNwb25zZS52YWx1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgW2ZpZWxkLmtleV06IGFwaS5yZXNwb25zZS52YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXBpcyA9IG5ldyBBcGlzKFxuICAgICAgICB7XG4gICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICBBUElfQ09ORklHOiBhcGksXG4gICAgICAgICAgQVBJX1JFU1BPTlNFOiBhcGkucmVzcG9uc2UsXG4gICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgYXBpID0gYXdhaXQgYXBpcy52YWxpZGF0ZVJlc3BvbnNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaWVsZFtcImFwaVwiXVtcInN0YXR1c1wiXVtcInZhbHVlXCJdID0gRUFwaVN0YXR1c1R5cGUuRkFJTEVEO1xuICAgICAgICBmaWVsZFtcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZmllbGQ6IGZpZWxkLCBhcGk6IGFwaSB9O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVBcGlDYWxsKGFwaTogYW55KSB7XG4gICAgYXBpID0gYXdhaXQgdGhpcy5leGVjdXRlQXBpQ2FsbChhcGksIHtcbiAgICAgIEZPUk1fQ09ORklHOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICBBUElfQ09ORklHOiBhcGksXG4gICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgIH0pO1xuXG4gICAgY29uc3QgYXBpcyA9IG5ldyBBcGlzKFxuICAgICAge1xuICAgICAgICBGT1JNX0NPTkZJRzogdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgICBBUElfQ09ORklHOiBhcGksXG4gICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgfSxcbiAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmlzVmFsaWRSZXF1ZXN0SGVhZGVyc0FuZEJvZHkoYXBpKSkge1xuICAgICAgYXBpID0gYXdhaXQgYXBpcy52YWxpZGF0ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYXBpOiBhcGkgfTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgZXhlY3V0ZUFwaUNhbGwoYXBpOiBhbnksIG9iamVjdDogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMob2JqZWN0LCB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKSk7XG5cbiAgICBhcGkgPSBhd2FpdCBhcGlzLnNldFVybCgpO1xuICAgIGFwaSA9IGF3YWl0IGFwaXMuc2V0UmVxdWVzdEhlYWRlcnMoKTtcbiAgICBhcGkgPSBhd2FpdCBhcGlzLnZhbGlkYXRlUmVxdWVzdEhlYWRlcnMoKTtcbiAgICBhcGkgPSBhd2FpdCBhcGlzLnNldFJlcXVlc3RCb2R5KCk7XG4gICAgYXBpID0gYXdhaXQgYXBpcy52YWxpZGF0ZVJlcXVlc3RCb2R5KCk7XG5cbiAgICBsZXQgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcbiAgICBsZXQgYXBpQ2FsbFJlc3BvbnNlU3RhdHVzQ29kZTtcblxuICAgIGlmICh0aGlzLmlzVmFsaWRSZXF1ZXN0SGVhZGVyc0FuZEJvZHkoYXBpKSkge1xuICAgICAgaWYgKFxuICAgICAgICBhcGkucmVxdWVzdC51cmwuaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpICYmXG4gICAgICAgIGFwaS5yZXF1ZXN0LnVybC50eXBlID09PSBFQXBpUmVxdWVzdFVybFR5cGUuTU9DS1xuICAgICAgKSB7XG4gICAgICAgIGFwaUNhbGxSZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGFwaS5yZXF1ZXN0LnVybC5wcm9wcy5tb2NrZWREYXRhKTtcbiAgICAgICAgICB9LCAxMDAwKTsgLy8gMTAwMCBtcyA9IDEgc2VjXG4gICAgICAgIH0pO1xuICAgICAgICBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlID0gYXBpLnJlcXVlc3QudXJsLnByb3BzPy5zdGF0dXNDb2RlID8/IDIwMDsgLy8gRGVmYXVsdCBTdGF0dXMgQ29kZSBmb3IgTW9ja2VkIEFQSXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gYXBpLnJlcXVlc3QudXJsLnZhbHVlO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IGFwaS5yZXF1ZXN0Py5tZXRob2QgPz8gXCJQT1NUXCI7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi4oYXBpLnJlcXVlc3Q/LmhlYWRlcnM/LnZhbHVlIHx8IHt9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAvLyBUcmlnZ2VyIGxvZ3MgZm9yIEFQSSByZXF1ZXN0IHdpdGggdGhlIG1ldGhvZCBhbmQgQVBJIGtleVxuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVRVUVTVCwge1xuICAgICAgICAgICAgZm9ybV9hcGlfbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBmb3JtX2FwaV9rZXk6IGFwaT8uYXBpS2V5ID8/IFwiXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgbmVlZHMgdG8gYmUgZGVjcnlwdGVkXG4gICAgICAgICAgICBjb25zdCBpc0RlY3J5cHRSZXNwb25zZTogYm9vbGVhbiA9IGFwaT8ucmVzcG9uc2U/LmlzU2VjdXJlID8/IGZhbHNlO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHNpZ25hdHVyZSBuZWVkcyB0byBiZSB2ZXJpZmllZFxuICAgICAgICAgICAgY29uc3QgaXNWZXJpZnlTaWduYXR1cmU6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICBhcGk/LnJlc3BvbnNlPy5pc1ZlcmlmeVNpZ25hdHVyZSA/PyBmYWxzZTtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgQVBJIGNhbGwgZm9yIEdFVCBtZXRob2RcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQXBpQ2FsbDogYW55ID1cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtVmlld0FwaVNlcnZpY2UuZXhlY3V0ZUFwaUNhbGwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICAgICAge30sIC8vIE5vIHJlcXVlc3QgYm9keSBmb3IgR0VUIG1ldGhvZFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlzRW5jcnlwdFJlcXVlc3RCb2R5IGlzIG5vdCBhcHBsaWNhYmxlIGZvciBHRVQgbWV0aG9kXG4gICAgICAgICAgICAgICAgaXNEZWNyeXB0UmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJpZnlTaWduYXR1cmVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFwaUNhbGxSZXNwb25zZSA9IGV4ZWN1dGVkQXBpQ2FsbC5kYXRhO1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlU3RhdHVzQ29kZSA9IGV4ZWN1dGVkQXBpQ2FsbC5zdGF0dXM7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYW55IGVycm9yc1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlID0ge307XG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlID0gNTAwOyAvLyBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcmVxdWVzdCBib2R5IGZyb20gdGhlIEFQSSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgbGV0IGJvZHk6IGFueSA9IGFwaT8ucmVxdWVzdD8uYm9keT8udmFsdWUgPz8ge307XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdCBib2R5IG5lZWRzIHRvIGJlIGVuY3J5cHRlZFxuICAgICAgICAgIGNvbnN0IGlzRW5jcnlwdFJlcXVlc3RCb2R5OiBib29sZWFuID1cbiAgICAgICAgICAgIGFwaT8ucmVxdWVzdD8uYm9keT8uaXNTZWN1cmUgPz8gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIG5lZWRzIHRvIGJlIGRlY3J5cHRlZFxuICAgICAgICAgIGNvbnN0IGlzRGVjcnlwdFJlc3BvbnNlOiBib29sZWFuID0gYXBpPy5yZXNwb25zZT8uaXNTZWN1cmUgPz8gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHNpZ25hdHVyZSBuZWVkcyB0byBiZSB2ZXJpZmllZFxuICAgICAgICAgIGNvbnN0IGlzVmVyaWZ5U2lnbmF0dXJlOiBib29sZWFuID1cbiAgICAgICAgICAgIGFwaT8ucmVzcG9uc2U/LmlzVmVyaWZ5U2lnbmF0dXJlID8/IGZhbHNlO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBsb2dzIGZvciBBUEkgcmVxdWVzdCB3aXRoIHRoZSBtZXRob2QgYW5kIEFQSSBrZXlcbiAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICAgIGZvcm1fYXBpX21ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgZm9ybV9hcGlfa2V5OiBhcGk/LmFwaUtleSA/PyBcIlwiLFxuICAgICAgICAgICAgZm9ybV9hcGlfcmVxdWVzdF9lbmNyeXB0ZWQ6IGlzRW5jcnlwdFJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgLi4uKCFpc0VuY3J5cHRSZXF1ZXN0Qm9keSAmJiB7XG4gICAgICAgICAgICAgIGZvcm1fYXBpX3JlcXVlc3RfYm9keTogYm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBBUEkgY2FsbCBmb3IgUE9TVCBtZXRob2RcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQXBpQ2FsbDogYW55ID1cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtVmlld0FwaVNlcnZpY2UuZXhlY3V0ZUFwaUNhbGwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBpc0VuY3J5cHRSZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICBpc0RlY3J5cHRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlID0gZXhlY3V0ZWRBcGlDYWxsLmRhdGE7XG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlID0gZXhlY3V0ZWRBcGlDYWxsLnN0YXR1cztcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3JzXG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2UgPSB7fTtcbiAgICAgICAgICAgIGFwaUNhbGxSZXNwb25zZVN0YXR1c0NvZGUgPSA1MDA7IC8vIEludGVybmFsIFNlcnZlciBFcnJvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhcGkucmVzcG9uc2UgPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgYXBpLnJlc3BvbnNlLFxuICAgICAgICBcInZhbHVlXCIsXG4gICAgICAgIGFwaUNhbGxSZXNwb25zZVxuICAgICAgKTtcblxuICAgICAgYXBpLnJlc3BvbnNlID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgIGFwaS5yZXNwb25zZSxcbiAgICAgICAgXCJzdGF0dXNcIixcbiAgICAgICAgYXBpQ2FsbFJlc3BvbnNlU3RhdHVzQ29kZVxuICAgICAgKTtcblxuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRSwge1xuICAgICAgICBmb3JtX2FwaV9rZXk6IGFwaT8uYXBpS2V5ID8/IFwiXCIsXG4gICAgICAgIGZvcm1fYXBpX3Jlc3BvbnNlX2VuY3J5cHRlZDogYXBpPy5yZXNwb25zZT8uaXNTZWN1cmUgPz8gZmFsc2UsXG4gICAgICAgIC4uLigoIWFwaT8ucmVzcG9uc2U/LmlzU2VjdXJlID8/IGZhbHNlKSAmJiB7XG4gICAgICAgICAgZm9ybV9hcGlfcmVzcG9uc2VfYm9keTogYXBpQ2FsbFJlc3BvbnNlID8/IHt9XG4gICAgICAgIH0pLFxuICAgICAgICBmb3JtX2FwaV9zdGF0dXNfY29kZTogYXBpQ2FsbFJlc3BvbnNlU3RhdHVzQ29kZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVRVUVTVF9JTlZBTElELCB7XG4gICAgICAgIGZvcm1fYXBpX2tleTogYXBpPy5hcGlLZXkgPz8gXCJcIixcbiAgICAgICAgZm9ybV9hcGlfcmVxdWVzdF9lbmNyeXB0ZWQ6IGFwaT8ucmVxdWVzdD8uYm9keT8uaXNTZWN1cmUgPz8gZmFsc2UsXG4gICAgICAgIC4uLigoIWFwaT8ucmVxdWVzdD8uYm9keT8uaXNTZWN1cmUgPz8gZmFsc2UpICYmIHtcbiAgICAgICAgICBmb3JtX2FwaV9yZXF1ZXN0X2JvZHk6IGFwaT8ucmVxdWVzdD8uYm9keT8udmFsdWUgPz8ge31cbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhcGk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGlzVmFsaWRSZXF1ZXN0SGVhZGVyc0FuZEJvZHkoYXBpOiBUQXBpKSB7XG4gICAgY29uc3QgYm9keVZhbGlkYXRpb24gPVxuICAgICAgKGFwaS5yZXF1ZXN0LmJvZHk/LnZhbGlkYXRpb24gYXMgVEVuZ2luZSAmIHtcbiAgICAgICAgaXNfdmFsaWQ6IGJvb2xlYW47XG4gICAgICB9KSB8fFxuICAgICAgKGFwaS5yZXF1ZXN0LmJvZHkgYXMgYW55ICYge1xuICAgICAgICBpc192YWxpZDogYm9vbGVhbjtcbiAgICAgIH0pO1xuICAgIGNvbnN0IGhlYWRlcnNWYWxpZGF0aW9uID1cbiAgICAgIChhcGkucmVxdWVzdC5oZWFkZXJzPy52YWxpZGF0aW9uIGFzIFRFbmdpbmUgJiB7XG4gICAgICAgIGlzX3ZhbGlkOiBib29sZWFuO1xuICAgICAgfSkgfHxcbiAgICAgIChhcGkucmVxdWVzdC5oZWFkZXJzIGFzIGFueSAmIHtcbiAgICAgICAgaXNfdmFsaWQ6IGJvb2xlYW47XG4gICAgICB9KTtcblxuICAgIGlmICghYm9keVZhbGlkYXRpb24gJiYgIWhlYWRlcnNWYWxpZGF0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIChib2R5VmFsaWRhdGlvbj8uaXNfdmFsaWQgfHwgZmFsc2UpICYmXG4gICAgICAoaGVhZGVyc1ZhbGlkYXRpb24/LmlzX3ZhbGlkIHx8IGZhbHNlKVxuICAgICk7XG4gIH1cblxuICBzaG93QXBpTG9hZGVyKCkge1xuICAgIHRoaXMubG9hZGVyU2VydmljZS5zaG93KHtcbiAgICAgIGZ1bGxzY3JlZW46IHRydWUsXG4gICAgICBsb2FkZXJUZXh0OiBcIlBsZWFzZSB3YWl0XCJcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcImRpc2FibGVkXCJdID0gdHJ1ZTtcbiAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcInNob3dMb2FkZXJcIl0gPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJkaXNhYmxlZFwiXSA9IHRydWU7XG4gICAgdGhpcy5zYXZlRm9ybUJ1dHRvbltcInNob3dMb2FkZXJcIl0gPSB0cnVlO1xuICB9XG5cbiAgaGlkZUFwaUxvYWRlcigpIHtcbiAgICB0aGlzLmxvYWRlclNlcnZpY2UuaGlkZSgpO1xuICAgIHRoaXMudmlld0Zvcm1zQnV0dG9uW1wiZGlzYWJsZWRcIl0gPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVGb3JtQnV0dG9uW1wiZGlzYWJsZWRcIl0gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVGb3JtQnV0dG9uW1wic2hvd0xvYWRlclwiXSA9IGZhbHNlO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrQXBpQ2FsbChlOiBhbnkpIHtcbiAgICBsZXQgZmllbGQ6IFRGaWVsZEFwaUNhbGwgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcblxuICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkFQSSkge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXQgYnV0dG9uIHN0YXR1cyB0byBsb2FkaW5nXG4gICAgICBmaWVsZFtcImFwaVwiXVtcInN0YXR1c1wiXVtcInZhbHVlXCJdID0gRUFwaVN0YXR1c1R5cGUuTE9BRElORztcbiAgICAgIGZpZWxkW1wic2hvd0xvYWRlclwiXSA9IHRydWU7XG5cbiAgICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgQVBJIENhbGwgdGltZVxuXG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuYXBpLCBcInJlcXVlc3RcIikpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZEFwaUNhbGwoZmllbGQsIGZpZWxkLmFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgIEFQSV9DT05GSUc6IHt9LFxuICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgYXBpcy5jYWxsTmV4dEFwaShmaWVsZC5hcGkuZW50cnlwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gb3B0aW1pemUgdGhlIERPTSB1cGRhdGUgYnkgQW5ndWxhciBmb3IgdXNpbmcgKm5nRm9yIG9uIGxhcmdlIG5vLiBvZiBpdGVtcy5cbiAgICogQHBhcmFtIGluZGV4IG51bWJlclxuICAgKiBAcGFyYW0gaXRlbSBmaWVsZENvbmZpZ1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGdldFVuaXF1ZUlkZW50aWZpZXIoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5rZXk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tHb0JhY2soZTogYW55LCBtb2RlOiBURm9ybVZpZXdHb0JhY2tNb2RlKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5zdGF0dXMgPT09IEVGb3Jtc0xpc3RTdGF0dXMuQ09NUExFVEVEKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tHb0JhY2suZW1pdCh7XG4gICAgICAgIGNsaWNrZWQ6IHRydWUsXG4gICAgICAgIG1vZGU6IG1vZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmZvcm1Db25maWcucHJvcGVydGllcy5oZWFkZXIuYmFja0J1dHRvbi5ieXBhc3NDb25maXJtYXRpb24gfHxcbiAgICAgIHdpbmRvdy5jb25maXJtKFwiWW91ciBkYXRhIHdpbGwgYmUgbG9zdCBpZiB5b3UgbGVhdmUgdGhpcyBwYWdlISBDb250aW51ZT9cIilcbiAgICApIHtcbiAgICAgIHRoaXMub25DbGlja0dvQmFjay5lbWl0KHtcbiAgICAgICAgY2xpY2tlZDogdHJ1ZSxcbiAgICAgICAgbW9kZTogbW9kZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrVmlld0Zvcm1zKGU6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1Db25maWcuc3RhdHVzID09PSBFRm9ybXNMaXN0U3RhdHVzLkNPTVBMRVRFRCkge1xuICAgICAgdGhpcy5vbkNsaWNrVmlld0Zvcm1zLmVtaXQoe1xuICAgICAgICBjbGlja2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5mb3JtQ29uZmlnLnByb3BlcnRpZXMuZm9vdGVyLnZpZXdGb3Jtc0J1dHRvbi5ieXBhc3NDb25maXJtYXRpb24gfHxcbiAgICAgIHdpbmRvdy5jb25maXJtKFwiWW91ciBkYXRhIHdpbGwgYmUgbG9zdCBpZiB5b3UgbGVhdmUgdGhpcyBwYWdlISBDb250aW51ZT9cIilcbiAgICApIHtcbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19WSUVXX0JVVFRPTl9DTElDSywge30pO1xuXG4gICAgICB0aGlzLm9uQ2xpY2tWaWV3Rm9ybXMuZW1pdCh7XG4gICAgICAgIGNsaWNrZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlT25DbGlja1NhdmVGb3JtKGU6IGFueSkge1xuICAgIGlmIChlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fU0FWRV9CVVRUT05fQ0xJQ0ssIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1NBVkVfQVVUTywge30pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IEZvcm1WYWxpZGF0aW9uKCkuZ2V0Rm9ybUZpZWxkc0ludmFsaWRDb250cm9scyhcbiAgICAgIHRoaXMuZm9ybUdyb3VwXG4gICAgKTtcblxuICAgIGxldCBmaXJzdEZpZWxkV2l0aEVycm9yOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgZm9yIChsZXQgY29udHJvbCBvZiBjb250cm9scykge1xuICAgICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgY29udHJvbC5rZXkpO1xuICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfRVJST1JfU0hPVywge1xuICAgICAgICAgIGZpZWxkX2tleTogY29udHJvbC5rZXksXG4gICAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICBmaWVsZF9lcnJvcl90eXBlczogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbC5rZXldLmVycm9yc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpcnN0RmllbGRXaXRoRXJyb3IpKSB7XG4gICAgICAgICAgZmlyc3RGaWVsZFdpdGhFcnJvciA9IGNvbnRyb2wua2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1GaWVsZHMgPSBzaG93Rm9ybUZpZWxkRXJyb3IoXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbC5rZXldLmVycm9ycyxcbiAgICAgICAgY29udHJvbC5rZXksXG4gICAgICAgIGNvbnRyb2wuaW52YWxpZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGZpcnN0RmllbGRXaXRoRXJyb3IpKSB7XG4gICAgICB0aGlzLmhhbmRsZU9uU2Nyb2xsVG9GaWVsZChmaXJzdEZpZWxkV2l0aEVycm9yKTtcblxuICAgICAgLy8gdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbih0cnVlKTtcbiAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKGZhbHNlKTtcbiAgICAgIC8vIH0sIDMwMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgIWZpZWxkLmhpZGRlbiAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9TQVZFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcblxuICAgICAgICBpZiAoIWZpZWxkLnZhbGlkYXRpb24uaXNfdmFsaWQpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHRydWUpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSk7XG4gICAgICAgICAgfSwgMzAwMCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBpZiAoZmllbGQuaGlkZGVuKSB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1EYXRhW2ZpZWxkLmtleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGFbZmllbGQua2V5XSA9IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW5kZWRGb3JtRGF0YSA9IHRoaXMuZm9ybUZpZWxkcy5yZWR1Y2UoKHJlc3VsdCwgZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCAmJiAhZmllbGQuaGlkZGVuKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkRGF0YSA9IHtcbiAgICAgICAgICBbZmllbGQua2V5XToge1xuICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogaXNFbXB0eVZhbHVlKGZvcm1EYXRhW2ZpZWxkLmtleV0pID8gXCJcIiA6IGZvcm1EYXRhW2ZpZWxkLmtleV0sXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRbZmllbGQua2V5XSA9IGZpZWxkRGF0YVtmaWVsZC5rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICBPYmplY3Qua2V5cyhmb3JtRGF0YSkubWFwKChrZXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5VmFsdWUoZm9ybURhdGFba2V5XSkpIHtcbiAgICAgICAgZm9ybURhdGFba2V5XSA9IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBQT1NUIFRhc2tzXG4gICAgICogMS4gQVBJIENhbGxzLlxuICAgICAqIDIuIEFsdGVyIERhdGEgU3RydWN0dXJlLlxuICAgICAqIDMuIFRyaWdnZXIgYW4gSW50ZXJuYWwgUG9wdXAgRm9ybS5cbiAgICAgKiA0LiBVUkwgUmVkaXJlY3Rpb24gb3IgbmV3IG9wZW5pbmcgb2YgVVJMIGluIGV4dGVybmFsIHRhYi5cbiAgICAgKi9cbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmZvcm1Db25maWcsIFwidGFza3NcIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuZm9ybUNvbmZpZy50YXNrcywgXCJwb3N0XCIpXG4gICAgKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fVEFTS19QT1NULCB7fSk7XG5cbiAgICAgIGZvciAobGV0IHBvc3RUYXNrIG9mIHRoaXMuZm9ybUNvbmZpZy50YXNrcy5wb3N0KSB7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgVGFza3MoXG4gICAgICAgICAgcG9zdFRhc2ssXG4gICAgICAgICAge1xuICAgICAgICAgICAgRk9STV9DT05GSUc6IHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RvcFRhc2tFeGVjdXRpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHBvc3RUYXNrLCBcIndhaXRcIikpIHtcbiAgICAgICAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gcG9zdFRhc2sud2FpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrLmV4ZWN1dGUoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciBuZ09uQ2hhbmdlcyB0byBiZSBjYWxsZWQgYmVmb3JlIGNvbnRpbnVpbmcgdG8gdGhlIG5leHQgdGFza1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2FpdGluZ0ZvckNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RvcFRhc2tFeGVjdXRpb24pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdG9wVGFza0V4ZWN1dGlvbiB8fCB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuc3RvcFRhc2tFeGVjdXRpb24gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9uQ2xpY2tTYXZlRm9ybS5lbWl0KHtcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgICBkYXRhOiBtZXJnZU9iamVjdHMoXG4gICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGFbdGhpcy5mb3JtQ29uZmlnLmtleV0sXG4gICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgdGhpcy5wb3B1cEZvcm1EYXRhLFxuICAgICAgICAgIHRoaXMudGFza0RhdGFcbiAgICAgICAgKSxcbiAgICAgICAgZXh0ZW5kZWREYXRhOiBleHRlbmRlZEZvcm1EYXRhXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRVbnNhdmVkRGF0YVN0YXRlLmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5vbkNsaWNrU2F2ZUZvcm0uZW1pdCh7XG4gICAgICAgIGZvcm1Db25maWc6IHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgZGF0YTogbWVyZ2VPYmplY3RzKGZvcm1EYXRhLCB0aGlzLnBvcHVwRm9ybURhdGEsIHRoaXMudGFza0RhdGEpLFxuICAgICAgICBleHRlbmRlZERhdGE6IGV4dGVuZGVkRm9ybURhdGFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlT25BcGlUaW1lclN0b3AoZTogYW55KSB7XG4gICAgdGhpcy5maWVsZEFwaVRpbWVyTWVzc2FnZUhpZGUoZS5rZXkpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPblNjcm9sbFRvRmllbGQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHRhcmdldEZpZWxkID0gdGhpcy5mb3JtRmllbGRzUmVmXG4gICAgICAudG9BcnJheSgpXG4gICAgICAuZmluZChcbiAgICAgICAgKGZvcm1GaWVsZFJlZikgPT4gZm9ybUZpZWxkUmVmLm5hdGl2ZUVsZW1lbnQuaWQgPT09IGBmaWVsZF8ke2ZpZWxkS2V5fWBcbiAgICAgICk7XG5cbiAgICBpZiAodGFyZ2V0RmllbGQpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5mb3JtRmllbGRDb250YWluZXJSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGZpZWxkRWwgPSB0YXJnZXRGaWVsZC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICBjb250YWluZXJFbCxcbiAgICAgICAgXCJzY3JvbGxUb3BcIixcbiAgICAgICAgZmllbGRFbC5vZmZzZXRUb3AgLSBjb250YWluZXJFbC5vZmZzZXRUb3BcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2hvd0Vycm9yTm90aWZpY2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBsb2dNZXRob2RcbiAgdG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oc2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Vycm9yTm90aWZpY2F0aW9uID0gc2hvdztcbiAgfVxuXG4gIHNob3dQZXJtaXNzaW9uRXJyb3JOb3RpZmljYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQGxvZ01ldGhvZFxuICB0b2dnbGVQZXJtaXNzaW9uRXJyb3JOb3RpZmljYXRpb24oc2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1Blcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvbiA9IHNob3c7XG4gIH1cblxuICAvLyBDb21wb25lbnQgSGVscGVyc1xuICBAbG9nTWV0aG9kXG4gIGZpZWxkSGlkZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiaGlkZGVuXCJdID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfSElERSwge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cEhpZGUoZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmaWVsZEdyb3VwXSkge1xuICAgICAgdGhpcy5maWVsZEhpZGUoZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRTaG93KGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF1bXCJoaWRkZW5cIl0gPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfU0hPVywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cFNob3coZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmaWVsZEdyb3VwXSkge1xuICAgICAgdGhpcy5maWVsZFNob3coZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGREaXNhYmxlKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiZGlzYWJsZWRcIl0gPSB0cnVlO1xuXG4gICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLmRpc2FibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFwiWUVTIERJU0FCTElORyBUSEUgRklFTERcIik7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkJVVFRPTikge1xuICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiZGlzYWJsZWRcIl0gPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9ESVNBQkxFLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwRGlzYWJsZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRGlzYWJsZShmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEVuYWJsZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImRpc2FibGVkXCJdID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gRUZpZWxkVHlwZS5CVVRUT04pIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImRpc2FibGVkXCJdID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0VOQUJMRSwge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cEVuYWJsZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRW5hYmxlKGZpZWxkS2V5KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkUmVzZXQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIC8vIEZpbmQgdGhlIGZpZWxkIGFuZCBpdHMgaW5kZXggaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IGdldEZvcm1GaWVsZEluZGV4QnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG5cbiAgICAvLyBSZXNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtR3JvdXBcbiAgICBjb25zdCByZXNldFZhbHVlID0gY29udmVydEZvcm1GaWVsZEVtcHR5VmFsdWVUb0t3aWtVSUZvcm1hdChmaWVsZCk7XG5cbiAgICB0aGlzLmZvcm1EYXRhW2ZpZWxkS2V5XSA9IHJlc2V0VmFsdWU7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnJlc2V0KHJlc2V0VmFsdWUsIHtcbiAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICBvbmx5U2VsZjogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgW2ZpZWxkLmtleV06IHJlc2V0VmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe1xuICAgICAgZW1pdEV2ZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCB0aGUgbWVzc2FnZXMgYW5kIGVycm9ycyBmb3IgdGhlIGZpZWxkXG4gICAgZmllbGQgPSByZW1vdmVGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCB7XG4gICAgICB0eXBlOiBFTWVzc2FnZVR5cGUuV0FSTklORyxcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcbiAgICBmaWVsZCA9IHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5TVUNDRVNTLFxuICAgICAgbWVzc2FnZTogXCJcIlxuICAgIH0pO1xuICAgIHRoaXMuZmllbGRFcnJvckhpZGUoZmllbGRLZXksIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5FUlJPUixcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5BUEk6XG4gICAgICAgIGNvbnN0IGZpZWxkQXBpQ2FsbCA9IGZpZWxkIGFzIFRGaWVsZEFwaUNhbGw7XG4gICAgICAgIGZpZWxkQXBpQ2FsbC5hcGkuc3RhdHVzLnZhbHVlID0gRUFwaVN0YXR1c1R5cGUuREVGQVVMVDtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRBcGlDYWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5MSVZFX0xPQ0FUSU9OOlxuICAgICAgICBjb25zdCBmaWVsZExpdmVMb2NhdGlvbiA9IGZpZWxkIGFzIFRGaWVsZExpdmVMb2NhdGlvbjtcbiAgICAgICAgZmllbGRMaXZlTG9jYXRpb24uYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkTGl2ZUxvY2F0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIFwiQkFJSlUgQkVGT1JFXCIsXG4gICAgICAgICAgZ2V0T2JqZWN0RGVlcENvcHkoZmllbGQpLFxuICAgICAgICAgIGdldE9iamVjdERlZXBDb3B5KHRoaXMuZm9ybUZpZWxkcylcbiAgICAgICAgKTtcbiAgICAgICAgZmllbGQuZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgZmllbGQuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcblxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBcIkJBSUpVIEFGVEVSXCIsXG4gICAgICAgICAgZ2V0T2JqZWN0RGVlcENvcHkoZmllbGQpLFxuICAgICAgICAgIGdldE9iamVjdERlZXBDb3B5KHRoaXMuZm9ybUZpZWxkcylcbiAgICAgICAgKTtcblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfUkVTRVQsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkR3JvdXBSZXNldChmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkUmVzZXQoZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRIaWRlQXBpTG9hZGVyKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtRmllbGRzIGFycmF5XG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuQVBJOlxuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRBcGlDYWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5MSVZFX0xPQ0FUSU9OOlxuICAgICAgICBjb25zdCBmaWVsZExpdmVMb2NhdGlvbiA9IGZpZWxkIGFzIFRGaWVsZExpdmVMb2NhdGlvbjtcbiAgICAgICAgZmllbGRMaXZlTG9jYXRpb24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRMaXZlTG9jYXRpb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZFNob3dBcGlMb2FkZXIoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5BUEk6XG4gICAgICAgIGNvbnN0IGZpZWxkQXBpQ2FsbCA9IGZpZWxkIGFzIFRGaWVsZEFwaUNhbGw7XG4gICAgICAgIGZpZWxkQXBpQ2FsbC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkQXBpQ2FsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuTElWRV9MT0NBVElPTjpcbiAgICAgICAgY29uc3QgZmllbGRMaXZlTG9jYXRpb24gPSBmaWVsZCBhcyBURmllbGRMaXZlTG9jYXRpb247XG4gICAgICAgIGZpZWxkTGl2ZUxvY2F0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRMaXZlTG9jYXRpb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRIdG1sKGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBhcHBlbmRIdG1sTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRFcnJvclNob3coZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGhpZ2hsaWdodEZvcm1GaWVsZEVycm9yKGZpZWxkLCB0cnVlKTtcbiAgICBmaWVsZCA9IGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfRVJST1JfU0hPVywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBmaWVsZF9lcnJvcl9tZXNzYWdlOiBtZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkRXJyb3JIaWRlKGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBoaWdobGlnaHRGb3JtRmllbGRFcnJvcihmaWVsZCwgZmFsc2UpO1xuICAgIGZpZWxkID0gcmVtb3ZlRm9ybUZpZWxkTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9FUlJPUl9ISURFLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGZpZWxkX2Vycm9yX21lc3NhZ2U6IG1lc3NhZ2VcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRNZXNzYWdlU2hvdyhmaWVsZEtleTogc3RyaW5nLCBtZXNzYWdlOiBUTWVzc2FnZSkge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIGZpZWxkID0gYXBwZW5kRm9ybUZpZWxkTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9NRVNTQUdFX1NIT1csIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgZmllbGRfbWVzc2FnZTogbWVzc2FnZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZE1lc3NhZ2VIaWRlKGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSByZW1vdmVGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX01FU1NBR0VfSElERSwge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBmaWVsZF9tZXNzYWdlOiBtZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaWVsZEFwaVRpbWVyTWVzc2FnZVNob3coXG4gICAgZmllbGRLZXk6IHN0cmluZyxcbiAgICB0aW1lcjogVEFwaVRpbWVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIGZpZWxkID0gc2V0QXBpVGltZXJNZXNzYWdlKGZpZWxkLCB0aW1lcik7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9BUElfVElNRVJfTUVTU0FHRV9TSE9XLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGZpZWxkX3RpbWVyOiB0aW1lclxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmllbGRBcGlUaW1lck1lc3NhZ2VIaWRlKGZpZWxkS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IHNldEFwaVRpbWVyTWVzc2FnZShmaWVsZCwgdW5kZWZpbmVkKTtcblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikgJiZcbiAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9BUElfVElNRVJfU1RPUFwiKVxuICAgICkge1xuICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICB7XG4gICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICApO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJPTl9BUElfVElNRVJfU1RPUFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREUsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldFZhbHVlKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGF3YWl0IHNvdXJjZS5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXG4gICAgKTtcbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sIHNvdXJjZVZhbHVlKTtcblxuICAgIG9iamVjdC5GSUVMRF9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkZJRUxEX0NPTkZJRztcblxuICAgIHRoaXMuZm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LkZPUk1fREFUQTtcbiAgICB0aGlzLnBhdGNoRm9ybUdyb3VwKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc291cmNlLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICB0aGlzLmV4dHJhRGF0YSA9IHNvdXJjZS5vYmplY3QuRVhUUkFfREFUQTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0RmllbGREZWZhdWx0VmFsdWUoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICApO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiRklFTERfQ09ORklHXCIsXG4gICAgICAgICAgICBwYXRoOiBcImRlZmF1bHQudmFsdWUudmFsdWVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJGT1JNX0RBVEFcIixcbiAgICAgICAgICAgIHBhdGg6IFN0cmluZyhhY3Rpb24ucHJvcHMuZmllbGRLZXkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNvdXJjZS5vYmplY3QuRklFTERfQ09ORklHO1xuICAgIHRoaXMuZm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LkZPUk1fREFUQTtcbiAgICB0aGlzLnBhdGNoRm9ybUdyb3VwKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc291cmNlLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICB0aGlzLmV4dHJhRGF0YSA9IHNvdXJjZS5vYmplY3QuRVhUUkFfREFUQTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0QXBpU3RhdHVzKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGFjdGlvbi5wcm9wcy5zdGF0dXM7XG5cbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJGSUVMRF9DT05GSUdcIixcbiAgICAgICAgICAgIHBhdGg6IFwiYXBpLnN0YXR1cy52YWx1ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNvdXJjZS5vYmplY3QuRklFTERfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlIZWFkZXJWYWx1ZShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKGFjdGlvbi5wcm9wcy5zb3VyY2UpO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogYHJlcXVlc3QuaGVhZGVycy52YWx1ZS4ke2FjdGlvbi5wcm9wcy5rZXl9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlIZWFkZXJWYWxpZGl0eShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhY3Rpb24ucHJvcHMudmFsaWQ7XG5cbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJBUElfQ09ORklHXCIsXG4gICAgICAgICAgICBwYXRoOiBcInJlcXVlc3QuaGVhZGVycy5pc192YWxpZFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkFQSV9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkFQSV9DT05GSUc7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldEFwaUJvZHlWYWx1ZShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKGFjdGlvbi5wcm9wcy5zb3VyY2UpO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogYHJlcXVlc3QuYm9keS52YWx1ZS4ke2FjdGlvbi5wcm9wcy5rZXl9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlCb2R5VmFsaWRpdHkoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYWN0aW9uLnByb3BzLnZhbGlkO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogXCJyZXF1ZXN0LmJvZHkuaXNfdmFsaWRcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRGaWVsZFZhbGlkaXR5KGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGFjdGlvbi5wcm9wcy52YWxpZDtcblxuICAgIHNvdXJjZS5zZXRWYWx1ZVRvU291cmNlKFxuICAgICAge1xuICAgICAgICBrZXk6IEVTb3VyY2VLZXkuT0JKRUNULFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAga2V5OiBcIkZJRUxEX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogXCJ2YWxpZGF0aW9uLmlzX3ZhbGlkXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VWYWx1ZVxuICAgICk7XG5cbiAgICBvYmplY3QuRklFTERfQ09ORklHID0gc291cmNlLm9iamVjdC5GSUVMRF9DT05GSUc7XG4gICAgb2JqZWN0LkFQSV9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkFQSV9DT05GSUc7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldERyb3Bkb3duT3B0aW9ucyhhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgbGV0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICApO1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMsIFwib3B0aW9uc1wiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy5vcHRpb25zLCBcImFwcGVuZFRvUGF0aFwiKSkge1xuICAgICAgICBsZXQgYXBwZW5kVG9QYXRoID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMub3B0aW9ucy5hcHBlbmRUb1BhdGguc291cmNlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUoYXBwZW5kVG9QYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGFwcGVuZFRvUGF0aFN0ciA9IHJlcGxhY2VTdHJpbmcoXG4gICAgICAgICAgICBhcHBlbmRUb1BhdGgubWF0Y2goXG4gICAgICAgICAgICAgIGAke2FjdGlvbi5wcm9wcy5vcHRpb25zLmFwcGVuZFRvUGF0aC5maWx0ZXJTb3VyY2VWYWx1ZX1gXG4gICAgICAgICAgICApWzBdLFxuICAgICAgICAgICAgXCJbXmEtekEtWjAtOV9dXCIsXG4gICAgICAgICAgICBcIl9cIlxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBvcHRpb25zUGF0aCA9IGAke2FjdGlvbi5wcm9wcy5vcHRpb25zLnBhdGh9JHthcHBlbmRUb1BhdGhTdHJ9YDtcbiAgICAgICAgICBzb3VyY2VWYWx1ZSA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgoc291cmNlVmFsdWUsIG9wdGlvbnNQYXRoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlVmFsdWUgPSBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKFxuICAgICAgICAgIHNvdXJjZVZhbHVlLFxuICAgICAgICAgIGFjdGlvbi5wcm9wcy5vcHRpb25zLnBhdGhcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoYWN0aW9uLnByb3BzLnZhbHVlLmRlc3RpbmF0aW9uLCBzb3VyY2VWYWx1ZSk7XG5cbiAgICBvYmplY3QuRklFTERfQ09ORklHID0gc291cmNlLm9iamVjdC5GSUVMRF9DT05GSUc7XG4gICAgdGhpcy5mb3JtRGF0YSA9IHNvdXJjZS5vYmplY3QuRk9STV9EQVRBO1xuICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc291cmNlLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICB0aGlzLmV4dHJhRGF0YSA9IHNvdXJjZS5vYmplY3QuRVhUUkFfREFUQTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgYXBpQ2FsbChhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTxUQXBpPiB7XG4gICAgbGV0IGFwaUNvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZy5hcGlzW2FjdGlvbi5wcm9wcy5mb3JtQXBpS2V5XTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5oYW5kbGVBcGlDYWxsKGFwaUNvbmZpZyk7XG5cbiAgICBhcGlDb25maWcgPSByZXNwb25zZS5hcGk7XG5cbiAgICB0aGlzLmZvcm1Db25maWcgPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgIGBhcGlzLiR7YWN0aW9uLnByb3BzLmZvcm1BcGlLZXl9YCxcbiAgICAgIGFwaUNvbmZpZ1xuICAgICk7XG5cbiAgICB0aGlzLmZvcm1EYXRhID0gbWVyZ2VPYmplY3RzKHRoaXMuZm9ybURhdGEsIHtcbiAgICAgIFthY3Rpb24ucHJvcHMuZm9ybUFwaUtleV06IGFwaUNvbmZpZy5yZXNwb25zZS52YWx1ZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFwaUNvbmZpZztcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgZmllbGRBcGlDYWxsKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgIGNvbnN0IGFwaUNvbmZpZyA9IGF3YWl0IHRoaXMuYXBpQ2FsbChhY3Rpb24sIG9iamVjdCk7XG5cbiAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgZmllbGRNdWx0aXBsZUFwaUNhbGxzKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnRyeXBvaW50QXBpS2V5ID0gYWN0aW9uLnByb3BzLmFwaUtleTtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgY29uc3QgZW5kcG9pbnRzID0gZmllbGQuYXBpLmVuZHBvaW50cztcbiAgICBjb25zdCBuZXh0QXBpSW5kZXggPSBlbmRwb2ludHMuZmluZEluZGV4KFxuICAgICAgKGFwaTogVEFwaUVuZHBvaW50KSA9PiBhcGkuYXBpS2V5ID09IGVudHJ5cG9pbnRBcGlLZXlcbiAgICApO1xuICAgIGNvbnN0IGFwaUNvbmZpZyA9IGVuZHBvaW50c1tuZXh0QXBpSW5kZXhdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkQXBpQ2FsbChmaWVsZCwgYXBpQ29uZmlnKTtcblxuICAgIGZpZWxkID0gcmVzcG9uc2UuZmllbGQ7XG4gICAgZmllbGQuYXBpLmVuZHBvaW50c1tuZXh0QXBpSW5kZXhdID0gcmVzcG9uc2UuYXBpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBmaWVsZE11bHRpcGxlQXBpQ2FsbHNFbmQoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgIGxldCBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMgPSB7fTtcbiAgICBmaWVsZC5hcGkuZW5kcG9pbnRzLm1hcCgoYXBpOiBUQXBpRW5kcG9pbnQpID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhcGkucmVzcG9uc2UsIFwidmFsdWVcIikpXG4gICAgICAgIG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlcyA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICAgIG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlcyxcbiAgICAgICAgICBgJHthcGkuYXBpS2V5fWAsXG4gICAgICAgICAgYXBpLnJlc3BvbnNlLnZhbHVlXG4gICAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICBbZmllbGQua2V5XTogbXVsdGlwbGVBcGlDYWxsUmVzcG9uc2VzXG4gICAgfTtcbiAgICB0aGlzLnBhdGNoRm9ybUdyb3VwKHRoaXMuZm9ybURhdGEpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YXNrQXBpQ2FsbChhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBjb25zdCBhcGlDb25maWcgPSBhd2FpdCB0aGlzLmFwaUNhbGwoYWN0aW9uLCBvYmplY3QpO1xuXG4gICAgdGhpcy50YXNrRGF0YSA9IG1lcmdlT2JqZWN0cyh0aGlzLnRhc2tEYXRhLCB7XG4gICAgICBbYWN0aW9uLnByb3BzLmZvcm1BcGlLZXldOiBhcGlDb25maWcucmVzcG9uc2UudmFsdWVcbiAgICB9KTtcblxuICAgIHRoaXMud2FpdGluZ0ZvckNoYW5nZXMgPSBmYWxzZTtcblxuICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YXNrTXVsdGlwbGVBcGlDYWxscyhhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBsZXQgbXVsdGlwbGVBcGlDb25maWcgPSB0aGlzLmZvcm1Db25maWcuYXBpc1thY3Rpb24ucHJvcHMuZm9ybUFwaUtleV07XG5cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLCBcImFwaUtleVwiKSkge1xuICAgICAgY29uc3QgZW50cnlwb2ludEFwaUtleSA9IGFjdGlvbi5wcm9wcy5hcGlLZXk7XG4gICAgICBjb25zdCBlbmRwb2ludHMgPSBtdWx0aXBsZUFwaUNvbmZpZy5lbmRwb2ludHM7XG4gICAgICBjb25zdCBuZXh0QXBpSW5kZXggPSBlbmRwb2ludHMuZmluZEluZGV4KFxuICAgICAgICAoYXBpOiBUQXBpRW5kcG9pbnQpID0+IGFwaS5hcGlLZXkgPT0gZW50cnlwb2ludEFwaUtleVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGFwaUNvbmZpZyA9IGVuZHBvaW50c1tuZXh0QXBpSW5kZXhdO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaGFuZGxlQXBpQ2FsbChhcGlDb25maWcpO1xuXG4gICAgICBtdWx0aXBsZUFwaUNvbmZpZy5lbmRwb2ludHNbbmV4dEFwaUluZGV4XSA9IHJlc3BvbnNlLmFwaTtcblxuICAgICAgdGhpcy5mb3JtQ29uZmlnID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgYGFwaXMuJHthY3Rpb24ucHJvcHMuZm9ybUFwaUtleX1gLFxuICAgICAgICBtdWx0aXBsZUFwaUNvbmZpZ1xuICAgICAgKTtcblxuICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcbiAgICAgICAge1xuICAgICAgICAgIEZPUk1fQ09ORklHOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgICAgQVBJX0NPTkZJRzogbXVsdGlwbGVBcGlDb25maWcsXG4gICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgYXdhaXQgYXBpcy5jYWxsTmV4dEFwaShtdWx0aXBsZUFwaUNvbmZpZy5lbnRyeXBvaW50KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHRhc2tNdWx0aXBsZUFwaUNhbGxzRW5kKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtdWx0aXBsZUFwaUNvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZy5hcGlzW2FjdGlvbi5wcm9wcy5mb3JtQXBpS2V5XTtcblxuICAgIGxldCBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMgPSB7fTtcbiAgICBtdWx0aXBsZUFwaUNvbmZpZy5lbmRwb2ludHMubWFwKChhcGk6IFRBcGlFbmRwb2ludCkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFwaS5yZXNwb25zZSwgXCJ2YWx1ZVwiKSlcbiAgICAgICAgbXVsdGlwbGVBcGlDYWxsUmVzcG9uc2VzID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgbXVsdGlwbGVBcGlDYWxsUmVzcG9uc2VzLFxuICAgICAgICAgIGAke2FwaS5hcGlLZXl9YCxcbiAgICAgICAgICBhcGkucmVzcG9uc2UudmFsdWVcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLnRhc2tEYXRhID0ge1xuICAgICAgLi4udGhpcy50YXNrRGF0YSxcbiAgICAgIFthY3Rpb24ucHJvcHMuZm9ybUFwaUtleV06IG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlc1xuICAgIH07XG5cbiAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgfVxuXG4gIGRpYWxvZ1JlZjogYW55ID0gdW5kZWZpbmVkO1xuICBAbG9nTWV0aG9kXG4gIGRpYWxvZ1Nob3cob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0RJQUxPR19TSE9XLCB7fSk7XG5cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZVxuICAgICAgLm9wZW4ob3B0aW9ucz8uaHRtbCwge1xuICAgICAgICBjbG9zZWFibGU6IHRydWUsXG4gICAgICAgIGRpc21pc3NpYmxlOiB0cnVlLFxuICAgICAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwsXG4gICAgICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gXCJzXCIsXG4gICAgICAgIGRhdGE6IHsgYnV0dG9uOiBvcHRpb25zPy5idXR0b24gfVxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19ESUFMT0dfRVJST1IsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRElBTE9HX0hJREUsIHt9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGRpYWxvZ0hpZGUoKSB7XG4gICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcmVkaXJlY3RUb1VybChhY3Rpb246IFRBY3Rpb24pIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLCBcInVybFwiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy51cmwsIFwidXJsXCIpKSB7XG4gICAgICAgIGxldCB0aW1lb3V0ID0gMjAwMDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy51cmwsIFwidGltZW91dFwiKSAmJlxuICAgICAgICAgIHR5cGVvZiBhY3Rpb24ucHJvcHMudXJsLnRpbWVvdXQgPT0gXCJudW1iZXJcIlxuICAgICAgICApIHtcbiAgICAgICAgICB0aW1lb3V0ID0gYWN0aW9uLnByb3BzLnVybC50aW1lb3V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1JFRElSRUNUX1VSTCwge1xuICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICAgICAgcmVkaXJlY3RfdXJsOiBhY3Rpb24ucHJvcHMudXJsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMudXJsLCBcInRhcmdldFwiKSkge1xuICAgICAgICAgICAgd2luZG93Lm9wZW4oYWN0aW9uLnByb3BzLnVybC51cmwsIGFjdGlvbi5wcm9wcy51cmwudGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoYWN0aW9uLnByb3BzLnVybC51cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBwYXRjaEZpZWxkQ29udHJvbFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNba2V5XS5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEZpZWxkQ29udHJvbFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNba2V5XS5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBwYXRjaEZvcm1Hcm91cChmb3JtRGF0YTogYW55KSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHRoaXMuZm9ybUdyb3VwKSB8fCBpc1VuZGVmaW5lZChmb3JtRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZm9ybUdyb3VwIG9yIGZvcm1EYXRhIGlzICd1bmRlZmluZWQnLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZm9ybURhdGFJbkt3aWtVSUZvcm1hdCA9IHt9O1xuICAgICAgZm9yIChsZXQgZmllbGRLZXkgaW4gZm9ybURhdGEpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmaWVsZCkgJiYgIWlzTnVsbChmaWVsZCkpIHtcbiAgICAgICAgICBmb3JtRGF0YUluS3dpa1VJRm9ybWF0W2ZpZWxkS2V5XSA9XG4gICAgICAgICAgICBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb0t3aWtVSUZvcm1hdChmaWVsZCwgZm9ybURhdGFbZmllbGRLZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShmb3JtRGF0YUluS3dpa1VJRm9ybWF0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBpc0ZpZWxkVmFsaWQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZEtleV0udmFsaWQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGlzRmllbGRFbmFibGVkKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGRLZXldLmVuYWJsZWQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGdldEZvcm1Hcm91cFJhd1ZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2hvd1ByZXZpZXcocHJldmlld1Byb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMgPSBtZXJnZU9iamVjdHMoXG4gICAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLFxuICAgICAgcHJldmlld1Byb3BlcnRpZXNcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgaXNFbXB0eVZhbHVlKHRoaXMucHJldmlld1Byb3BlcnRpZXMuaWZyYW1lLnNyYykgJiZcbiAgICAgIGlzRW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYmVmb3JlKSAmJlxuICAgICAgaXNFbXB0eVZhbHVlKHRoaXMucHJldmlld1Byb3BlcnRpZXMuaHRtbC5hZnRlcilcbiAgICApIHtcbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzZXRQcmV2aWV3UHJvcGVydGllcyA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMgPSB7XG4gICAgICAgIGh0bWw6IHtcbiAgICAgICAgICBiZWZvcmU6IFwiXCIsXG4gICAgICAgICAgYmVmb3JlU3R5bGVzOiBcIlwiLFxuICAgICAgICAgIGFmdGVyOiBcIlwiLFxuICAgICAgICAgIGFmdGVyU3R5bGVzOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIGlmcmFtZToge1xuICAgICAgICAgIHNyYzogXCJcIixcbiAgICAgICAgICB0aXRsZTogXCJcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcImRpYWxvZ1wiLFxuICAgICAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICBzaXplOiBcImF1dG9cIixcbiAgICAgICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBzaG93RGlhbG9nID0gKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0RJQUxPR19TSE9XLCB7fSk7XG5cbiAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZVxuICAgICAgICAub3Blbih0aGlzLmRpYWxvZywge1xuICAgICAgICAgIGNsb3NlYWJsZTogdHJ1ZSxcbiAgICAgICAgICBkaXNtaXNzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBzaXplOiB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzPy5zaXplIHx8IFwiYXV0b1wiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYuY29tcGxldGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRElBTE9HX0VSUk9SLCB7fSk7XG5cbiAgICAgICAgICAgIHJlc2V0UHJldmlld1Byb3BlcnRpZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRElBTE9HX0hJREUsIHt9KTtcblxuICAgICAgICAgICAgcmVzZXRQcmV2aWV3UHJvcGVydGllcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNob3dQcmV2aWV3ID0gKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1BSRVZJRVdfU0hPVywge30pO1xuXG4gICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYgPSB0aGlzLnByZXZpZXdEaWFsb2dTZXJ2aWNlXG4gICAgICAgIC5vcGVuKHRoaXMucHJldmlldyB8fCBcIlwiKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1BSRVZJRVdfRVJST1IsIHt9KTtcblxuICAgICAgICAgICAgcmVzZXRQcmV2aWV3UHJvcGVydGllcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19QUkVWSUVXX0hJREUsIHt9KTtcblxuICAgICAgICAgICAgcmVzZXRQcmV2aWV3UHJvcGVydGllcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5wcmV2aWV3UHJvcGVydGllcy50eXBlKSB7XG4gICAgICBjYXNlIFwiZGlhbG9nXCI6XG4gICAgICAgIHNob3dEaWFsb2coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicG9wdXBcIjpcbiAgICAgICAgc2hvd1ByZXZpZXcoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzaG93RGlhbG9nKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2hvd0Vycm9yUHJldmlldyhwcmV2aWV3UHJvcGVydGllczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93UHJldmlldyh7XG4gICAgICBodG1sOiB7XG4gICAgICAgIGFmdGVyOiBgPGRpdiBzdHlsZT1cXFwicGFkZGluZy1ib3R0b206MC4yNXJlbTtwYWRkaW5nLXRvcDogMC4yNXJlbTtwb3NpdGlvbjogYWJzb2x1dGU7bWFyZ2luLXRvcDogY2FsYyg1MHZoKTtmb250LXNpemU6IDEuNHJlbTtiYWNrZ3JvdW5kOiB3aGl0ZTtwYWRkaW5nOiAycmVtO2JvcmRlci1yYWRpdXM6IDFyZW07Ym94LXNoYWRvdzogMHB4IDBweCAxMHB4IC0zcHggYmxhY2s7b3ZlcmZsb3c6IGF1dG87aGVpZ2h0OiBmaXQtY29udGVudDttYXgtaGVpZ2h0OiA5MHZoOyB3aWR0aDogNzB2dzsgbWFyZ2luLWxlZnQ6IGNhbGMoMTV2dyk7IGxpbmUtaGVpZ2h0OiAycmVtO1xcXCI+RXJyb3I6ICR7cHJldmlld1Byb3BlcnRpZXMubWVzc2FnZS5tZXNzYWdlfTwvZGl2PmBcbiAgICAgIH0sXG4gICAgICB0eXBlOiBcInBvcHVwXCJcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2hvd1BvcHVwRm9ybShcbiAgICBwb3B1cEZvcm1LZXk6IHN0cmluZyxcbiAgICBwb3B1cFR5cGU6IFwiRElBTE9HXCIgfCBcIlBPUFVQXCIgPSBcIkRJQUxPR1wiXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBvcHVwRm9ybUNvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZy5wb3B1cEZvcm1zW3BvcHVwRm9ybUtleV07XG5cbiAgICB0aGlzLm9uQWN0aW9uU2hvd1BvcHVwRm9ybS5lbWl0KHtcbiAgICAgIGFjdGl2ZUZvcm1EYXRhOiBtZXJnZU9iamVjdHModGhpcy5mb3JtRGF0YSwgdGhpcy50YXNrRGF0YSksXG4gICAgICBwb3B1cEZvcm1Db25maWc6IHBvcHVwRm9ybUNvbmZpZyxcbiAgICAgIHBvcHVwVHlwZTogcG9wdXBUeXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFsZXJ0U2hvdyh0eXBlOiBUdWlOb3RpZmljYXRpb24sIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9TSE9XLCB7XG4gICAgICBhbGVydF9tZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgYWxlcnRfdHlwZTogdHlwZVxuICAgIH0pO1xuXG4gICAgdGhpcy5hbGVydFNlcnZpY2VcbiAgICAgIC5vcGVuKGAke21lc3NhZ2V9YCwge1xuICAgICAgICBzdGF0dXM6XG4gICAgICAgICAgdHlwZSA9PT0gXCJlcnJvclwiXG4gICAgICAgICAgICA/IFR1aU5vdGlmaWNhdGlvbi5FcnJvclxuICAgICAgICAgICAgOiB0eXBlID09PSBcIndhcm5pbmdcIlxuICAgICAgICAgICAgPyBUdWlOb3RpZmljYXRpb24uV2FybmluZ1xuICAgICAgICAgICAgOiB0eXBlID09PSBcInN1Y2Nlc3NcIlxuICAgICAgICAgICAgPyBUdWlOb3RpZmljYXRpb24uU3VjY2Vzc1xuICAgICAgICAgICAgOiBUdWlOb3RpZmljYXRpb24uSW5mb1xuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9FUlJPUiwge30pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9ISURFLCB7fSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YWtlQWN0aW9uT25GaWVsZEdyb3VwKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGJlbG93IGNvZGUgaXMgY3VycmVudGx5IGNvbW1lbnRlZCBiZWNhdXNlIG5vdCBhbGwgYWN0aW9ucyBuZWVkIHRvIGJlIGxvZ2dlZCBhdCBiYWNrZW5kLlxuICAgICAqIFdpbGwgbG9vayBsYXRlciBpbnRvIHdoZXJlIG9ubHkgc3BlY2lmaWMgYWN0aW9ucyBuZWVkcyB0byBiZSBsb2dnZWQgb3IgYWxsLlxuICAgICAqIEN1cnJlbnRseSBsb2dzIGFyZSBzZW50IGZyb20gd2l0aGluZyB0aGUgYWN0aW9uJ3Mgc3BlY2lmaWMgbWV0aG9kcy5cbiAgICAgKiBDb2RlIC1cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FDVElPTl9FWEVDVVRFX0dST1VQLCB7XG4gICAgICAgICAgYWN0aW9uX2tleTogYWN0aW9uLmtleSxcbiAgICAgICAgICAuLi4oYWN0aW9uLmlkICYmIHsgYWN0aW9uX2lkOiBhY3Rpb24uaWQgfSksXG4gICAgICAgICAgLi4uKGFjdGlvbi5wcm9wcy5ncm91cEtleSAmJiB7IGFjdGlvbl9pZDogYWN0aW9uLnByb3BzLmdyb3VwS2V5IH0pXG4gICAgICAgIH0pO1xuICAgICovXG5cbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBIaWRlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRHcm91cFNob3coYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRU5BQkxFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBFbmFibGUoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRElTQUJMRTpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwRGlzYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9SRVNFVDpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwUmVzZXQoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfU0hPV19BUElfTE9BREVSOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBEaXNhYmxlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX0hJREVfQVBJX0xPQURFUjpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwRGlzYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdGFrZUFjdGlvbihhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBiZWxvdyBjb2RlIGlzIGN1cnJlbnRseSBjb21tZW50ZWQgYmVjYXVzZSBub3QgYWxsIGFjdGlvbnMgbmVlZCB0byBiZSBsb2dnZWQgYXQgYmFja2VuZC5cbiAgICAgKiBXaWxsIGxvb2sgbGF0ZXIgaW50byB3aGVyZSBvbmx5IHNwZWNpZmljIGFjdGlvbnMgbmVlZHMgdG8gYmUgbG9nZ2VkIG9yIGFsbC5cbiAgICAgKiBDdXJyZW50bHkgbG9ncyBhcmUgc2VudCBmcm9tIHdpdGhpbmcgdGhlIGFjdGlvbidzIHNwZWNpZmljIG1ldGhvZHMuXG4gICAgICogQ29kZSAtXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BQ1RJT05fRVhFQ1VURSwge1xuICAgICAgICAgIGFjdGlvbl9rZXk6IGFjdGlvbi5rZXksXG4gICAgICAgICAgLi4uKGFjdGlvbi5pZCAmJiB7IGFjdGlvbl9pZDogYWN0aW9uLmlkIH0pXG4gICAgICAgIH0pO1xuICAgICovXG5cbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkSGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9TSE9XOlxuICAgICAgICB0aGlzLmZpZWxkU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ESVNBQkxFOlxuICAgICAgICB0aGlzLmZpZWxkRGlzYWJsZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9FTkFCTEU6XG4gICAgICAgIHRoaXMuZmllbGRFbmFibGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfU0hPV19BUElfTE9BREVSOlxuICAgICAgICB0aGlzLmZpZWxkRW5hYmxlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0hJREVfQVBJX0xPQURFUjpcbiAgICAgICAgdGhpcy5maWVsZEVuYWJsZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9SRVNFVDpcbiAgICAgICAgdGhpcy5maWVsZFJlc2V0KGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX1NIT1c6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9yU2hvd19Tb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICAgICAgICBsZXQgZmllbGRFcnJvclNob3dTb3VyY2VWYWx1ZSA9XG4gICAgICAgICAgICBhd2FpdCBmaWVsZEVycm9yU2hvd19Tb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmllbGRFcnJvclNob3dTb3VyY2VWYWx1ZSA9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgZmllbGRFcnJvclNob3dTb3VyY2VWYWx1ZSA9PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID0gU3RyaW5nKGZpZWxkRXJyb3JTaG93U291cmNlVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5tZXNzYWdlID0gdXBkYXRlTGFuZ3VhZ2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLm1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICBnZXRMYW5ndWFnZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmllbGRFcnJvclNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5LCBhY3Rpb24ucHJvcHMubWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX0hJREU6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9ySGlkZV9Tb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICAgICAgICBsZXQgZmllbGRFcnJvckhpZGVTb3VyY2VWYWx1ZSA9XG4gICAgICAgICAgICBhd2FpdCBmaWVsZEVycm9ySGlkZV9Tb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmllbGRFcnJvckhpZGVTb3VyY2VWYWx1ZSA9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgZmllbGRFcnJvckhpZGVTb3VyY2VWYWx1ZSA9PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID0gU3RyaW5nKGZpZWxkRXJyb3JIaWRlU291cmNlVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpZWxkRXJyb3JIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9NRVNTQUdFX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRNZXNzYWdlU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfTUVTU0FHRVNfSElERTpcbiAgICAgICAgdGhpcy5maWVsZE1lc3NhZ2VIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9BUElfVElNRVJfTUVTU0FHRV9TSE9XOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkQXBpVGltZXJNZXNzYWdlU2hvdyhcbiAgICAgICAgICBhY3Rpb24ucHJvcHMuZmllbGRLZXksXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnRpbWVyXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREU6XG4gICAgICAgIGF3YWl0IHRoaXMuZmllbGRBcGlUaW1lck1lc3NhZ2VIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9WQUxVRTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRWYWx1ZShhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9GSUVMRF9ERUZBVUxUX1ZBTFVFOlxuICAgICAgICBhd2FpdCB0aGlzLnNldEZpZWxkRGVmYXVsdFZhbHVlKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0FQSV9TVEFUVVM6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpU3RhdHVzKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0FQSV9IRUFERVJfVkFMVUU6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpSGVhZGVyVmFsdWUoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfQVBJX0hFQURFUl9WQUxJRElUWTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRBcGlIZWFkZXJWYWxpZGl0eShhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9BUElfQk9EWV9WQUxVRTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRBcGlCb2R5VmFsdWUoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfQVBJX0JPRFlfVkFMSURJVFk6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpQm9keVZhbGlkaXR5KGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0RST1BET1dOX09QVElPTlM6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RHJvcGRvd25PcHRpb25zKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0ZJRUxEX1ZBTElESVRZOlxuICAgICAgICBhd2FpdCB0aGlzLnNldEZpZWxkVmFsaWRpdHkoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5IQU5ETEVfQ09OTkVDVEVEX0VMRU1FTlRTOlxuICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHsga2V5OiBhY3Rpb24ucHJvcHMuZmllbGRLZXkgfSxcbiAgICAgICAgICBcIk9OX0FDVElPTlwiXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkQXBpQ2FsbChhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMX01VTFRJUExFOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkTXVsdGlwbGVBcGlDYWxscyhhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMX01VTFRJUExFX0VORDpcbiAgICAgICAgYXdhaXQgdGhpcy5maWVsZE11bHRpcGxlQXBpQ2FsbHNFbmQoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5UQVNLX0FQSV9DQUxMOlxuICAgICAgICBhd2FpdCB0aGlzLnRhc2tBcGlDYWxsKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuVEFTS19BUElfQ0FMTF9NVUxUSVBMRTpcbiAgICAgICAgYXdhaXQgdGhpcy50YXNrTXVsdGlwbGVBcGlDYWxscyhhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlRBU0tfQVBJX0NBTExfTVVMVElQTEVfRU5EOlxuICAgICAgICBhd2FpdCB0aGlzLnRhc2tNdWx0aXBsZUFwaUNhbGxzRW5kKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuUkVESVJFQ1RfVE9fVVJMOlxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLnVybCwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCByZWRpcmVjdFRvVXJsX1NvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgICAgICAgIGxldCByZWRpcmVjdFRvVXJsU291cmNlVmFsdWUgPVxuICAgICAgICAgICAgYXdhaXQgcmVkaXJlY3RUb1VybF9Tb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMudXJsLnNvdXJjZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpc0VtcHR5U3RyaW5nKHJlZGlyZWN0VG9VcmxTb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VG9VcmxTb3VyY2VWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWN0aW9uID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBcInByb3BzLnVybC51cmxcIixcbiAgICAgICAgICAgIHJlZGlyZWN0VG9VcmxTb3VyY2VWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWRpcmVjdFRvVXJsKGFjdGlvbik7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuUFJFVklFV19ESUFMT0dfU0hPVzpcbiAgICAgICAgdGhpcy5zaG93UHJldmlldyhhY3Rpb24ucHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5QUkVWSUVXX0VSUk9SX1NIT1c6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBwcmV2aWV3RXJyb3JTaG93X1NvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgICAgICAgIGxldCBwcmV2aWV3RXJyb3JTaG93U291cmNlVmFsdWUgPVxuICAgICAgICAgICAgYXdhaXQgcHJldmlld0Vycm9yU2hvd19Tb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwcmV2aWV3RXJyb3JTaG93U291cmNlVmFsdWUgPT0gXCJudW1iZXJcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID0gU3RyaW5nKHByZXZpZXdFcnJvclNob3dTb3VyY2VWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpZXdFcnJvclNob3dTb3VyY2VWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWN0aW9uID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBcInByb3BzLm1lc3NhZ2UubWVzc2FnZVwiLFxuICAgICAgICAgICAgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dFcnJvclByZXZpZXcoYWN0aW9uLnByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuUE9QVVBfRk9STV9TSE9XOlxuICAgICAgICB0aGlzLnNob3dQb3B1cEZvcm0oXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnBvcHVwRm9ybUtleSxcbiAgICAgICAgICBhY3Rpb24ucHJvcHM/LnBvcHVwVHlwZSA/PyBcIkRJQUxPR1wiXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNUT1BfV0FJVElORzpcbiAgICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TQ1JPTExfVE9fRklFTEQ6XG4gICAgICAgIHRoaXMuaGFuZGxlT25TY3JvbGxUb0ZpZWxkKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5Lk5PVElGSUNBVElPTl9FUlJPUl9TSE9XOlxuICAgICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5OT1RJRklDQVRJT05fRVJST1JfSElERTpcbiAgICAgICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlJFU1VNRV9UQVNLX0VYRUNVVElPTjpcbiAgICAgICAgdGhpcy5zdG9wVGFza0V4ZWN1dGlvbiA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TVE9QX1RBU0tfRVhFQ1VUSU9OOlxuICAgICAgICB0aGlzLnN0b3BUYXNrRXhlY3V0aW9uID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRElBTE9HX1NIT1c6XG4gICAgICAgIHRoaXMuZGlhbG9nU2hvdyh7XG4gICAgICAgICAgaHRtbDogYWN0aW9uLnByb3BzPy5odG1sLFxuICAgICAgICAgIGxhYmVsOiBhY3Rpb24ucHJvcHM/LmxhYmVsLFxuICAgICAgICAgIHNpemU6IGFjdGlvbi5wcm9wcz8uc2l6ZSxcbiAgICAgICAgICBidXR0b246IGFjdGlvbi5wcm9wcz8uYnV0dG9uXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5ESUFMT0dfSElERTpcbiAgICAgICAgdGhpcy5kaWFsb2dIaWRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNBVkVfRk9STTpcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0odW5kZWZpbmVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuQUxFUlRfU0hPVzpcbiAgICAgICAgdGhpcy5hbGVydFNob3coYWN0aW9uLnByb3BzLnR5cGUsIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0hUTUw6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZEh0bWxNZXNzYWdlX1NvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgICAgICAgIGxldCBmaWVsZEh0bWxNZXNzYWdlU291cmNlVmFsdWUgPVxuICAgICAgICAgICAgYXdhaXQgZmllbGRIdG1sTWVzc2FnZV9Tb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBmaWVsZEh0bWxNZXNzYWdlU291cmNlVmFsdWUgPT0gXCJudW1iZXJcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID0gU3RyaW5nKGZpZWxkSHRtbE1lc3NhZ2VTb3VyY2VWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkSHRtbE1lc3NhZ2VTb3VyY2VWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWN0aW9uID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBcInByb3BzLm1lc3NhZ2UubWVzc2FnZVwiLFxuICAgICAgICAgICAgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5tZXNzYWdlID0gdXBkYXRlTGFuZ3VhZ2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLm1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICBnZXRMYW5ndWFnZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0SHRtbChhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJrd2lraWQtZm9ybS1jb250YWluZXJcIlxuICAqbmdJZj1cIiFsb2FkaW5nXCJcbj5cbiAgPGRpdlxuICAgIGlkPVwidWYtZm9ybS1maWVsZHMtaGVhZGVyLWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJcbiAgICAgICFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlcj8udGl0bGU/LmhpZGRlbiB8fFxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5sb2dvPy5oaWRkZW4gfHxcbiAgICAgICFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlcj8uc3RlcHM/LmhpZGRlbiB8fFxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5iYWNrQnV0dG9uPy5oaWRkZW5cbiAgICBcIlxuICA+XG4gICAgPGltZ1xuICAgICAgaWQ9XCJ1Zi1oZWFkZXItbG9nb1wiXG4gICAgICAqbmdJZj1cIiFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlcj8ubG9nbz8uaGlkZGVuICYmIGlzTW9iaWxlVmlld1wiXG4gICAgICBbc3JjXT1cImZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5sb2dvPy5zcmNcIlxuICAgICAgW2FsdF09XCJmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlcj8ubG9nbz8uYWx0XCJcbiAgICAgIFtzdHlsZV09XCJcbiAgICAgICAgZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXI/LmxvZ28/LnN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXG4gICAgICBcIlxuICAgIC8+XG4gICAgPGRpdiBpZD1cInVmLWZvcm0tZmllbGRzLWhlYWRlci1tYWluXCI+XG4gICAgICA8ZGl2IGlkPVwidWYtZm9ybS1maWVsZHMtaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLmJhY2tCdXR0b24uaGlkZGVuICYmIGlzTW9iaWxlVmlld1xuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJhY2tCdXR0b24uZGlzYWJsZWRcIlxuICAgICAgICAgIFtzaG93TG9hZGVyXT1cImJhY2tCdXR0b24uc2hvd0xvYWRlclwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm1vbm9cIlxuICAgICAgICAgIGljb249XCJ0dWlJY29uQXJyb3dMZWZ0XCJcbiAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgIChvbkNsaWNrKT1cIlxuICAgICAgICAgICAgaGFuZGxlT25DbGlja0dvQmFjayhcbiAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICBmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlci5iYWNrQnV0dG9uLm1vZGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGlkPVwidWYtZm9ybS1maWVsZHMtaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD1cInVmLWZvcm0tZmllbGRzLXRpdGxlXCJcbiAgICAgICAgICAqbmdJZj1cIiFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlci50aXRsZS5oaWRkZW5cIlxuICAgICAgICAgID57eyBmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlci50aXRsZS5sYWJlbCB9fTwvZGl2XG4gICAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPVwidWYtZm9ybS1maWVsZHMtc3RlcHNcIlxuICAgICAgICAgICpuZ0lmPVwiIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLnN0ZXBzLmhpZGRlblwiXG4gICAgICAgID5cbiAgICAgICAgICBTdGVwIHt7IGZvcm1Db25maWcuc2VxdWVuY2VObyB9fSBvZiB7eyBmb3JtQ29uZmlnLmZvcm1zTGlzdExlbmd0aCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxoclxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLnRpdGxlLmhpZGRlbiB8fFxuICAgICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXIuc3RlcHMuaGlkZGVuIHx8XG4gICAgICAgICFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlci5iYWNrQnV0dG9uLmhpZGRlblxuICAgICAgXCJcbiAgICAvPlxuICA8L2Rpdj5cbiAgPGZvcm1cbiAgICAjZm9ybUZpZWxkQ29udGFpbmVyUmVmXG4gICAgY2xhc3M9XCJrd2lraWQtZm9ybSBzaG93XCJcbiAgICBbc3R5bGVdPVwiZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5tYWluPy5zdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwiXG4gICAgICAgIGxldCBmaWVsZCBvZiBmb3JtRmllbGRzO1xuICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICB0cmFja0J5OiBnZXRVbmlxdWVJZGVudGlmaWVyXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkLnR5cGVcIj5cbiAgICAgICAgPCEtLSBIVE1MIENvbnRlbnQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidodG1sJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cImZpZWxkLmh0bWwgfCBrd2lrdWlTYWZlSHRtbFwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBGb3JtIFRpdGxlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGl0bGUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQ/LnJlc2V0XCJcbiAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIndoaXRlYmxvY2tcIlxuICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucHJvcGVydGllcz8ucmVzZXRCdXR0b25MYWJlbCA/PyAnUmVzZXQnXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlT25DbGlja1Jlc2V0Rm9ybUZpZWxkcygkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBCdXR0b24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJmaWVsZD8ucHJvcGVydGllcz8uYXBwZWFyYW5jZSA/PyAncHJpbWFyeSdcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNsYXNzXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pY29uXCJcbiAgICAgICAgICAgICAgW2ljb25SaWdodF09XCJmaWVsZD8ucHJvcGVydGllcz8uaWNvblJpZ2h0XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkPy5rZXlcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3NoYXBlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaGFwZVwiXG4gICAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5sb2FkaW5nID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxuICAgICAgICAgICAgICBbc3R5bGVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zdHlsZXNcIlxuICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uJ1wiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tGb3JtRmllbGRCdXR0b24oZmllbGQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBUZXh0IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXRcbiAgICAgICAgICAgICAgW2Nhc2VdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNhc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQ+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBDdXJyZW5jeSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1jdXJyZW5jeVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtjdXJyZW5jeVR5cGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmN1cnJlbmN5VHlwZVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Bvc3RmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBvc3RmaXhcIlxuICAgICAgICAgICAgICBbcHJlZml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wcmVmaXhcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWN1cnJlbmN5PlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlbWFpbCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtZW1haWxcbiAgICAgICAgICAgICAgW2Nhc2VdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNhc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2RvbWFpbnNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmRvbWFpbnNcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1lbWFpbD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIFBhc3N3b3JkIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFzc3dvcmQnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXBhc3N3b3JkXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaGludENvbnRlbnRdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmhpbnRDb250ZW50XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtcGFzc3dvcmQ+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBUZXh0YXJlYSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS10ZXh0YXJlYVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLXRleHRhcmVhPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktY2hlY2tib3hcbiAgICAgICAgICAgICAgW2NvbnRlbnRBbGlnbl09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGVudEFsaWduID8/ICdsZWZ0J1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemUgPz8gJ2wnXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICBbdmFyaWFudF09XCJmaWVsZD8ucHJvcGVydGllcz8udmFyaWFudCA/PyAnYmxvY2snXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWNoZWNrYm94PlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgTnVtYmVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1udW1iZXJcbiAgICAgICAgICAgICAgW2RlY2ltYWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmRlY2ltYWxcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeCA/PyAnJ1wiXG4gICAgICAgICAgICAgIFtwcmVjaXNpb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWNpc2lvblwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeCA/PyAnJ1wiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtbnVtYmVyPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgRGF0ZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWRhdGVcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbbWF4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXhcIlxuICAgICAgICAgICAgICBbbWF4Q2FsY3VsYXRlZEZyb21Ub2RheV09XCJcbiAgICAgICAgICAgICAgICBmaWVsZD8ucHJvcGVydGllcz8ubWF4Q2FsY3VsYXRlZEZyb21Ub2RheVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbbWluXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5taW5cIlxuICAgICAgICAgICAgICBbbWluQ2FsY3VsYXRlZEZyb21Ub2RheV09XCJcbiAgICAgICAgICAgICAgICBmaWVsZD8ucHJvcGVydGllcz8ubWluQ2FsY3VsYXRlZEZyb21Ub2RheVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Bvc3RmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBvc3RmaXhcIlxuICAgICAgICAgICAgICBbcHJlZml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wcmVmaXhcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWRhdGU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBUaW1lIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtdGltZVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pdGVtc1wiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbbW9kZV09XCJmaWVsZD8ucHJvcGVydGllcz8ubW9kZVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtdGltZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFBob25lIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXBob25lXG4gICAgICAgICAgICAgIFtjb3VudHJ5Q29kZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY291bnRyeUNvZGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5waG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3JlbW92ZUNvdW50cnlDb2RlRnJvbVZhbHVlXT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5yZW1vdmVDb3VudHJ5Q29kZUZyb21WYWx1ZVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1waG9uZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFJhZGlvIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8nXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgW3R1aUxhYmVsXT1cImxhYmVsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IGF1dG87IHBhZGRpbmc6IDBweCAwLjVyZW1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8a3dpa3VpLWlucHV0LXJhZGlvXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZD8ub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW29yaWVudGF0aW9uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5vcmllbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtcmFkaW8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbFRlbXBsYXRlPlxuICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHVpLXNwYWNlX2JvdHRvbS0yXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1zZWxlY3RcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJmaWVsZC5vcHRpb25zXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNlYXJjaGFibGVcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1zZWxlY3Q+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBTbGlkZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzbGlkZXInXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXNsaWRlclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3F1YW50dW1dPVwiZmllbGQ/LnByb3BlcnRpZXM/LnF1YW50dW1cIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZVwiXG4gICAgICAgICAgICAgIFtzdGVwc109XCJmaWVsZD8ucHJvcGVydGllcz8uc3RlcHNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1zbGlkZXI+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBBUEkgQ2FsbCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FwaSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uLWFwaS1jYWxsXG4gICAgICAgICAgICAgIFthcGlTdGF0dXNdPVwiZmllbGQ/LmFwaT8uc3RhdHVzPy52YWx1ZVwiXG4gICAgICAgICAgICAgIFthcGlUaW1lcl09XCJmaWVsZD8uYXBpPy50aW1lclwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJmaWVsZD8uY2xhc3NcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8uYXBpPy5zdGF0dXM/LmxhYmVsc1tmaWVsZD8uYXBpPy5zdGF0dXM/LnZhbHVlXVwiXG4gICAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImZpZWxkPy5kaXNhYmxlZCA9PT0gJ2xvYWRpbmcnXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxuICAgICAgICAgICAgICBbc3R5bGVzXT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5zdHlsZXNcbiAgICAgICAgICAgICAgICAgID8gZmllbGQ/LnByb3BlcnRpZXM/LnN0eWxlc1xuICAgICAgICAgICAgICAgICAgOiAnd2lkdGg6IGZpdC1jb250ZW50J1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVPbkNsaWNrQXBpQ2FsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQXBpVGltZXJTdG9wKT1cImhhbmRsZU9uQXBpVGltZXJTdG9wKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbi1hcGktY2FsbD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIExpdmUgTG9jYXRpb24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXZlLWxvY2F0aW9uJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b24tbGl2ZS1sb2NhdGlvblxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZmllbGQ/LmNsYXNzXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmFwaT8uc3RhdHVzPy5sYWJlbHNbZmllbGQ/LmFwaT8uc3RhdHVzPy52YWx1ZV1cIlxuICAgICAgICAgICAgICBbbGl2ZUxvY2F0aW9uU3RhdHVzXT1cImZpZWxkPy5hcGk/LnN0YXR1cz8udmFsdWVcIlxuICAgICAgICAgICAgICBbc2hhcGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNoYXBlXCJcbiAgICAgICAgICAgICAgW2lzU2hvd0xhdExvbmdDYXB0dXJlVGltZXN0YW1wXT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5pc1Nob3dMYXRMb25nQ2FwdHVyZVRpbWVzdGFtcFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZVwiXG4gICAgICAgICAgICAgIHN0eWxlcz1cIndpZHRoOiBmaXQtY29udGVudFwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tMaXZlTG9jYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkxvY2F0aW9uUGVybWlzc2lvbik9XCJoYW5kbGVPbkxvY2F0aW9uUGVybWlzc2lvbigkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24tbGl2ZS1sb2NhdGlvbj5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIE1vYmlsZSBPVFAgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidvdHAnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LW90cFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXNrXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXNrXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1vZGVcIlxuICAgICAgICAgICAgICBbb3RwTGVuZ3RoXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5vdHBMZW5ndGhcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZVwiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LW90cD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEFhZGhhYXIgTnVtYmVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWFkaGFhci1udW1iZXInXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWFhZGhhYXJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbbWFza109XCJmaWVsZD8ucHJvcGVydGllcz8ubWFza1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWFhZGhhYXI+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBQcmV2aWV3IEltYWdlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW1hZ2UnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWltYWdlXG4gICAgICAgICAgICAgIFthbHRUZXh0XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5hbHRUZXh0XCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jbGFzc1wiXG4gICAgICAgICAgICAgIFtodG1sXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5odG1sXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbWFnZVNyY109XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgIFtpbWFnZVR5cGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmltYWdlVHlwZVwiXG4gICAgICAgICAgICAgIFtsb2FkaW5nVHlwZV09XCJmaWVsZD8ucHJvcGVydGllcz8ubG9hZGluZ1R5cGVcIlxuICAgICAgICAgICAgICBbc3R5bGVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zdHlsZXNcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWltYWdlPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gRmlsZSBVcGxvYWQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFt0dWlMYWJlbF09XCJsYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiBhdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1maWxlc1xuICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmFjY2VwdFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jbGFzc1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2ZpbGVzXT1cImZpbGVzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJmaWVsZD8ua2V5XCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbbGlua109XCJmaWVsZD8ucHJvcGVydGllcz8ubGlua1wiXG4gICAgICAgICAgICAgICAgW21heEZpbGVTaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXhGaWxlU2l6ZVwiXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgW3NldEZpbGVUeXBlc1RvRm9ybV09XCJbJ05PUk1BTCddXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zdHlsZXNcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICBbc2hvd1ZpZXdCdXR0b25dPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNob3dWaWV3QnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWVGaWxlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChnZXRSZW1vdmVkRmlsZSk9XCJoYW5kbGVSZW1vdmVkRmlsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZ2V0Vmlld0J1dHRvbkNsaWNrKT1cImhhbmRsZVZpZXdCdXR0b25DbGljaygkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1maWxlcz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAwcHggMC4yNXJlbTsgbWFyZ2luLWJvdHRvbTogMC4yNXJlbVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBDYW1lcmEgQ2FwdHVyZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NhcHR1cmUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09ICcnICYmXG4gICAgICAgICAgICAgICAgZmllbGQ/LmxhYmVsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09IG51bGxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiBhdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkPy5sYWJlbCAhPT0gJydcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMHB4IDAuMjVyZW07IG1hcmdpbi1ib3R0b206IDAuNXJlbVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWNhbWVyYVxuICAgICAgICAgICAgICBbYnV0dG9uVGV4dF09XCJmaWVsZD8ucHJvcGVydGllcz8uYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJmaWVsZD8ucHJvcGVydGllcz8uaWNvblwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFttZWRpYUZpbGVzXT1cIm1lZGlhRmlsZXNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3Nob3dNZWRpYUZpbGVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaG93TWVkaWFGaWxlc1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIidjYXB0dXJlJ1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlT25DbGlja0lucHV0Q2FtZXJhKCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgKGdldFJlbW92ZWRGaWxlKT1cImhhbmRsZU9uQ2xpY2tHZXRSZW1vdmVkTWVkaWFGaWxlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWNhbWVyYT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIENhbWVyYSBSZWNvcmQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyZWNvcmQnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09ICcnICYmXG4gICAgICAgICAgICAgICAgZmllbGQ/LmxhYmVsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09IG51bGxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiBhdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkPy5sYWJlbCAhPT0gJydcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMHB4IDAuMjVyZW07IG1hcmdpbi1ib3R0b206IDAuNXJlbVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWNhbWVyYVxuICAgICAgICAgICAgICBbYnV0dG9uVGV4dF09XCJmaWVsZD8ucHJvcGVydGllcz8uYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJmaWVsZD8ucHJvcGVydGllcz8uaWNvblwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFttZWRpYUZpbGVzXT1cIm1lZGlhRmlsZXNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3Nob3dNZWRpYUZpbGVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaG93TWVkaWFGaWxlc1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIidyZWNvcmQnXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVPbkNsaWNrSW5wdXRDYW1lcmEoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAoZ2V0UmVtb3ZlZEZpbGUpPVwiaGFuZGxlT25DbGlja0dldFJlbW92ZWRNZWRpYUZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtY2FtZXJhPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gU3RhciBSYXRpbmcgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGFyLXJhdGluZydcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBbdHVpTGFiZWxdPVwibGFiZWxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogYXV0bzsgcGFkZGluZzogMHB4IDAuNXJlbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxrd2lrdWktc3Rhci1yYXRpbmdcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbG9yXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJmaWVsZD8ucHJvcGVydGllcz8uaWNvblwiXG4gICAgICAgICAgICAgICAgW2ljb25NYXJrZWRdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lmljb25NYXJrZWRcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXhcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9rd2lrdWktc3Rhci1yYXRpbmc+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsYWJlbFRlbXBsYXRlPlxuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICA8YlxuICAgICAgICAgICAgICAgICAgPnt7IGZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlciB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzPy5yZXF1aXJlZFwiPio8L3NwYW4+PC9iXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9mb3JtPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJrd2lraWQtZm9ybS1idXR0b25zXCJcbiAgICAqbmdJZj1cIlxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcy5mb290ZXIudmlld0Zvcm1zQnV0dG9uLmhpZGRlbiB8fFxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcy5mb290ZXIuc2F2ZUJ1dHRvbi5oaWRkZW5cbiAgICBcIlxuICA+XG4gICAgPGt3aWt1aS1idXR0b25cbiAgICAgICpuZ0lmPVwiXG4gICAgICAgICFmb3JtQ29uZmlnLnByb3BlcnRpZXMuZm9vdGVyLnZpZXdGb3Jtc0J1dHRvbi5oaWRkZW4gJiYgaXNNb2JpbGVWaWV3XG4gICAgICBcIlxuICAgICAgW2FwcGVhcmFuY2VdPVwiJ3NlY29uZGFyeSdcIlxuICAgICAgW2Rpc2FibGVkXT1cInZpZXdGb3Jtc0J1dHRvbi5kaXNhYmxlZFwiXG4gICAgICBbbGFiZWxdPVwiZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci52aWV3Rm9ybXNCdXR0b24ubGFiZWxcIlxuICAgICAgW3Nob3dMb2FkZXJdPVwidmlld0Zvcm1zQnV0dG9uLnNob3dMb2FkZXJcIlxuICAgICAgW3N0eWxlc109XCInd2lkdGg6IDEwMCUnXCJcbiAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tWaWV3Rm9ybXMoJGV2ZW50KVwiXG4gICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgKm5nSWY9XCIhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci5zYXZlQnV0dG9uLmhpZGRlblwiXG4gICAgICBbZGlzYWJsZWRdPVwic2F2ZUZvcm1CdXR0b24uZGlzYWJsZWRcIlxuICAgICAgW2xhYmVsXT1cImZvcm1Db25maWcucHJvcGVydGllcy5mb290ZXIuc2F2ZUJ1dHRvbi5sYWJlbFwiXG4gICAgICBbc2hvd0xvYWRlcl09XCJzYXZlRm9ybUJ1dHRvbi5zaG93TG9hZGVyXCJcbiAgICAgIFtzdHlsZXNdPVwiJ3dpZHRoOiAxMDAlJ1wiXG4gICAgICAob25DbGljayk9XCJoYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50KVwiXG4gICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXZcbiAgY2xhc3M9XCJrd2lraWQtZm9ybS1jb250YWluZXItbG9hZGluZ1wiXG4gICpuZ0lmPVwibG9hZGluZ1wiXG4+XG4gIDxkaXZcbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbXS5jb25zdHJ1Y3Rvcig3KTsgbGV0IGkgPSBpbmRleFwiXG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyIHR1aS1za2VsZXRvbiB0dWktc2tlbGV0b25fcm91bmRlZFwiXG4gID5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGt3aWt1aS1sb2FkZXI+PC9rd2lrdWktbG9hZGVyPlxuXG48dHVpLXB1c2hcbiAgaWQ9XCJmaWVsZC1lcnJvci1ub3RpZmljYXRpb25cIlxuICAqdHVpUHVzaD1cInNob3dFcnJvck5vdGlmaWNhdGlvblwiXG4gIGhlYWRpbmc9XCJNaXNzaW5nL0luY29ycmVjdCBGaWVsZHMhXCJcbiAgdHlwZT1cIkVycm9yXCJcbiAgKGNsb3NlKT1cInRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKGZhbHNlKVwiXG4+XG4gIDx0dWktc3ZnXG4gICAgc3JjPVwidHVpSWNvblhDaXJjbGVcIlxuICAgIHN0eWxlPVwiY29sb3I6ICNmZmYgIWltcG9ydGFudFwiXG4gID5cbiAgPC90dWktc3ZnPlxuPC90dWktcHVzaD5cblxuPHR1aS1wdXNoXG4gIGlkPVwicGVybWlzc2lvbi1lcnJvci1ub3RpZmljYXRpb25cIlxuICAqdHVpUHVzaD1cInNob3dQZXJtaXNzaW9uRXJyb3JOb3RpZmljYXRpb25cIlxuICBoZWFkaW5nPVwiUGxlYXNlIHByb3ZpZGUgcmVxdWlyZWQgcGVybWlzc2lvbnMhXCJcbiAgdHlwZT1cIkVycm9yXCJcbiAgKGNsb3NlKT1cInRvZ2dsZVBlcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvbihmYWxzZSlcIlxuPlxuICA8dHVpLXN2Z1xuICAgIHNyYz1cInR1aUljb25YQ2lyY2xlXCJcbiAgICBzdHlsZT1cImNvbG9yOiAjZmZmICFpbXBvcnRhbnRcIlxuICA+XG4gIDwvdHVpLXN2Zz5cbjwvdHVpLXB1c2g+XG5cbjxuZy10ZW1wbGF0ZVxuICAjcHJldmlld1xuICBsZXQtcHJldmlld1xuPlxuICA8dHVpLXByZXZpZXdcbiAgICBbcm90YXRhYmxlXT1cImZhbHNlXCJcbiAgICBbem9vbWFibGVdPVwiZmFsc2VcIlxuICAgIGNsYXNzPVwicHJldmlldy1jb250YWluZXJcIlxuICA+XG4gICAgPHR1aS1wcmV2aWV3LXRpdGxlICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXMudGl0bGUgIT09ICcnXCI+e3tcbiAgICAgIHByZXZpZXdQcm9wZXJ0aWVzLnRpdGxlXG4gICAgfX08L3R1aS1wcmV2aWV3LXRpdGxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwcmV2aWV3UHJvcGVydGllcy51bmF2YWlsYWJsZVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5iZWZvcmUgIT09ICcnXCJcbiAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWh0bWwgcHJldmlldy1odG1sLWJlZm9yZVwiXG4gICAgICAgIFtzdHlsZV09XCJwcmV2aWV3UHJvcGVydGllcz8uaHRtbD8uYmVmb3JlU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cInByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYmVmb3JlIHwga3dpa3VpU2FmZUh0bWxcIlxuICAgICAgPjwvZGl2PlxuXG4gICAgICA8IS0tIENvbnRlbnQgd2l0aGluIHRoZSBpZnJhbWUgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicHJldmlldy1pZnJhbWUtY29udGVudFwiXG4gICAgICAgIFtzdHlsZV09XCJcbiAgICAgICAgICBwcmV2aWV3UHJvcGVydGllcz8uaWZyYW1lPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclxuICAgICAgICBcIlxuICAgICAgICAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS5zcmMgIT09ICcnXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBZb3VyIEhUTUwgY29udGVudCBoZXJlIC0tPlxuICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgW3NyY109XCJwcmV2aWV3UHJvcGVydGllcy5pZnJhbWUuc3JjIHwga3dpa3VpU2FmZVVybFwiXG4gICAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgICBhbGxvdz1cImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCJcbiAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW5cbiAgICAgICAgICBbdGl0bGVdPVwicHJldmlld1Byb3BlcnRpZXMuaWZyYW1lLnRpdGxlXCJcbiAgICAgICAgICBjbGFzcz1cInByZXZpZXctaWZyYW1lXCJcbiAgICAgICAgICBzY3JvbGxpbmc9XCJhdXRvXCJcbiAgICAgICAgPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcz8uaHRtbD8uYWZ0ZXIgIT09ICcnXCJcbiAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWh0bWwgcHJldmlldy1odG1sLWFmdGVyXCJcbiAgICAgICAgW3N0eWxlXT1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5hZnRlclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgW2lubmVySHRtbF09XCJwcmV2aWV3UHJvcGVydGllcy5odG1sLmFmdGVyIHwga3dpa3VpU2FmZUh0bWxcIlxuICAgICAgPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy11bmF2YWlsYWJsZVwiPlxuICAgICAgICA8dHVpLXN2Z1xuICAgICAgICAgIHNyYz1cInR1aUljb25GaWxlTGFyZ2VcIlxuICAgICAgICAgIGNsYXNzPVwidC1pY29uXCJcbiAgICAgICAgPjwvdHVpLXN2Zz5cbiAgICAgICAgPGRpdj5QcmV2aWV3IHVuYXZhaWxhYmxlPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxidXR0b25cbiAgICAgIHR1aUljb25CdXR0b25cbiAgICAgIHR1aVByZXZpZXdBY3Rpb25cbiAgICAgIGljb249XCJ0dWlJY29uQ2xvc2VMYXJnZVwiXG4gICAgICB0aXRsZT1cIkNsb3NlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cInByZXZpZXcuY29tcGxldGUoKVwiXG4gICAgPjwvYnV0dG9uPlxuICA8L3R1aS1wcmV2aWV3PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNkaWFsb2dcbiAgbGV0LWRpYWxvZ1xuPlxuICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmJlZm9yZSAhPT0gJydcIlxuICAgICAgICBjbGFzcz1cInByZXZpZXctaHRtbCBwcmV2aWV3LWh0bWwtYmVmb3JlXCJcbiAgICAgICAgW3N0eWxlXT1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5iZWZvcmVTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwicHJldmlld1Byb3BlcnRpZXMuaHRtbC5iZWZvcmUgfCBrd2lrdWlTYWZlSHRtbFwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDwhLS0gQ29udGVudCB3aXRoaW4gdGhlIGlmcmFtZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1jb250ZW50XCJcbiAgICAgICAgW3N0eWxlXT1cIlxuICAgICAgICAgIHByZXZpZXdQcm9wZXJ0aWVzPy5pZnJhbWU/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXG4gICAgICAgIFwiXG4gICAgICAgICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXMuaWZyYW1lLnNyYyAhPT0gJydcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFlvdXIgSFRNTCBjb250ZW50IGhlcmUgLS0+XG4gICAgICAgIDxpZnJhbWVcbiAgICAgICAgICBbc3JjXT1cInByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS5zcmMgfCBrd2lrdWlTYWZlVXJsXCJcbiAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgIGFsbG93PVwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIlxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgIFt0aXRsZV09XCJwcmV2aWV3UHJvcGVydGllcy5pZnJhbWUudGl0bGVcIlxuICAgICAgICAgIGNsYXNzPVwicHJldmlldy1pZnJhbWVcIlxuICAgICAgICAgIHNjcm9sbGluZz1cImF1dG9cIlxuICAgICAgICA+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5hZnRlciAhPT0gJydcIlxuICAgICAgICBjbGFzcz1cInByZXZpZXctaHRtbCBwcmV2aWV3LWh0bWwtYWZ0ZXJcIlxuICAgICAgICBbc3R5bGVdPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmFmdGVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cInByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYWZ0ZXIgfCBrd2lrdWlTYWZlSHRtbFwiXG4gICAgICA+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LXVuYXZhaWxhYmxlXCI+XG4gICAgICAgIDx0dWktc3ZnXG4gICAgICAgICAgc3JjPVwidHVpSWNvbkZpbGVMYXJnZVwiXG4gICAgICAgICAgY2xhc3M9XCJ0LWljb25cIlxuICAgICAgICA+PC90dWktc3ZnPlxuICAgICAgICA8ZGl2PlByZXZpZXcgdW5hdmFpbGFibGU8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXZcbiAgaWQ9XCJrd2lraWQtY2FtZXJhLWNvbnRhaW5lclwiXG4gICpuZ0lmPVwiaXNTaG93Q2FtZXJhXCJcbj5cbiAgPGRpdlxuICAgIGlkPVwia3dpa2lkLWNhbWVyYS13cmFwcGVyXCJcbiAgICBbY2xhc3MuZnVsbHNjcmVlbl09XCJpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXCJcbiAgPlxuICAgIDxrd2lraWQtY2FtZXJhXG4gICAgICBbdHlwZV09XCJjYW1lcmFUeXBlXCJcbiAgICAgIFtkYXRhXT1cImNhbWVyYURhdGFcIlxuICAgICAgW2ltYWdlXT1cImNhbWVyYUltYWdlXCJcbiAgICAgIFt2aWRlb109XCJjYW1lcmFWaWRlb1wiXG4gICAgICBbY29uZmlnXT1cImNhbWVyYUNvbmZpZ1wiXG4gICAgICAoZ2V0SW1hZ2UpPVwiaGFuZGxlR2V0Q2FtZXJhTWVkaWEoJGV2ZW50LCAnQ0FQVFVSRScpXCJcbiAgICAgIChnZXRWaWRlbyk9XCJoYW5kbGVHZXRDYW1lcmFNZWRpYSgkZXZlbnQsICdSRUNPUkQnKVwiXG4gICAgICAob25DbGlja0JhY2spPVwiaGFuZGxlT25DbGlja0NhbWVyYUJhY2soJGV2ZW50KVwiXG4gICAgICAob25DbGlja0Nsb3NlKT1cImhhbmRsZU9uQ2xpY2tDYW1lcmFDbG9zZSgkZXZlbnQpXCJcbiAgICAgIChvbkNsaWNrU2F2ZSk9XCJoYW5kbGVPbkNsaWNrU2F2ZUNhbWVyYU1lZGlhKCRldmVudCwgY2FtZXJhVHlwZSlcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjYW1lcmFUeXBlID09PSAnQ0FQVFVSRSdcIlxuICAgICAgICBzbG90PVwiY2FwdHVyZS1oZWFkZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FwdHVyZS1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcHR1cmUtaGVhZGVyLWxlZnRcIj4gPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcHR1cmUtaGVhZGVyLWNlbnRlclwiPlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJjYW1lcmFDb25maWc/LmhlYWRlcj8udGl0bGUgIT09ICcnXCJcbiAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIndoaXRlYmxvY2tcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiY2FtZXJhQ29uZmlnPy5oZWFkZXI/LnRpdGxlXCJcbiAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZGVkXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FwdHVyZS1oZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzRXhwYW5kXCJcbiAgICAgICAgICAgICAgaWQ9XCJrd2lraWQtY2FtZXJhLWhlYWRlci1lbmxhcmdlLWJ1dHRvblwiXG4gICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ3aGl0ZWJsb2NrXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgaXNTaG93Q2FtZXJhRnVsbHNjcmVlbiA/ICd0dWlJY29uTWluaW1pemUyJyA6ICd0dWlJY29uTWF4aW1pemUyJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJpc1Nob3dDYW1lcmFGdWxsc2NyZWVuID0gIWlzU2hvd0NhbWVyYUZ1bGxzY3JlZW5cIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzQ2xvc2VcIlxuICAgICAgICAgICAgICBpZD1cImt3aWtpZC1jYW1lcmEtaGVhZGVyLWNsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ3aGl0ZWJsb2NrXCJcbiAgICAgICAgICAgICAgaWNvbj1cInR1aUljb25DbG9zZUxhcmdlXCJcbiAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZGVkXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT25DbGlja0NhbWVyYUNsb3NlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjYW1lcmFUeXBlID09PSAnUkVDT1JEJ1wiXG4gICAgICAgIHNsb3Q9XCJyZWNvcmQtaGVhZGVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1oZWFkZXItcm93IHJvdy0xXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGNhbWVyYUNvbmZpZz8uaGVhZGVyPy5pc0JhY2sgJiYgY2FtZXJhUmVjb3JkaW5nU3RhdGUgPT0gJ05PTkUnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cInR1aUljb25BcnJvd0xlZnRcIlxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRlZFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPbkNsaWNrQ2FtZXJhQ2xvc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtaGVhZGVyLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhQ29uZmlnPy5oZWFkZXI/LnRpdGxlICE9PSAnJ1wiXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIndoaXRlYmxvY2tcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjYW1lcmFDb25maWc/LmhlYWRlcj8udGl0bGVcIlxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRlZFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzRXhwYW5kXCJcbiAgICAgICAgICAgICAgICBpZD1cImt3aWtpZC1jYW1lcmEtaGVhZGVyLWVubGFyZ2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgICBpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgID8gJ3R1aUljb25NaW5pbWl6ZTInXG4gICAgICAgICAgICAgICAgICAgIDogJ3R1aUljb25NYXhpbWl6ZTInXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNTaG93Q2FtZXJhRnVsbHNjcmVlbiA9ICFpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXCJcbiAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtaGVhZGVyLXJvdyByb3ctMlwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD1cImJsaW5raW5nLWRvdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MucmVjb3JkaW5nXT1cImNhbWVyYVJlY29yZGluZ1N0YXRlID09ICdSRUNPUkRJTkcnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnBhdXNlZF09XCJjYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnUEFVU0VEJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWNvcmRlZF09XCJcbiAgICAgICAgICAgICAgICBjYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnTk9ORScgfHxcbiAgICAgICAgICAgICAgICBjYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PT0gJ1JFQ09SREVEJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnUkVDT1JESU5HJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkb3QgcmVjb3JkaW5nIGJsaW5rXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FtZXJhUmVjb3JkaW5nU3RhdGUgPT09ICdQQVVTRUQnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRvdCBwYXVzZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGNhbWVyYVJlY29yZGluZ1N0YXRlID09ICdOT05FJyB8fFxuICAgICAgICAgICAgICAgICAgY2FtZXJhUmVjb3JkaW5nU3RhdGUgPT09ICdSRUNPUkRFRCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZG90IHJlY29yZGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAmbmJzcDt7eyBjYW1lcmFSZWNvcmRpbmdUaW1lIHwgZm9ybWF0VGltZXIgfX1cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNhbWVyYUNvbmZpZz8ub3RoZXJzPy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAvXG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICBjYW1lcmFDb25maWc/Lm90aGVycz8ubWF4UmVjb3JkaW5nVGltZUluU2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybWF0VGltZXJcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9rd2lraWQtY2FtZXJhPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
3403
+ }], resetCamera: [], ngOnInit: [], ngOnChanges: [], ngOnDestroy: [], triggerLogs: [], initFormConfig: [], setFormFieldsFromFormConfig: [], setFormFieldGroupsFromFormConfig: [], setFormDataFromAllFormsData: [], handleConnectedElementFieldGroupActions: [], handleConnectedElementFieldGroup: [], handleConnectedElementFieldActions: [], handleConnectedElementFields: [], handleConnectedElements: [], handleRemovedFile: [], handleViewButtonClick: [], handleGetKeyValueFile: [], handleOnClickGetRemovedMediaFile: [], handleOnClickInputCamera: [], setCameraMedia: [], handleGetCameraMedia: [], handleOnClickSaveCameraMedia: [], handleOnClickCameraBack: [], handleOnClickCameraClose: [], updateFiles: [], uploadFile: [], handleOnClickFormFieldButton: [], handleOnLocationPermission: [], handleOnClickLiveLocation: [], handleGetKeyValue: [], handleOnClickResetFormFields: [], handleFieldApiCall: [], handleApiCall: [], executeApiCall: [], isValidRequestHeadersAndBody: [], handleOnClickApiCall: [], handleOnClickGoBack: [], handleOnClickViewForms: [], handleOnClickSaveForm: [], handleOnApiTimerStop: [], handleOnScrollToField: [], toggleErrorNotification: [], togglePermissionErrorNotification: [], fieldHide: [], fieldGroupHide: [], fieldShow: [], fieldGroupShow: [], fieldDisable: [], fieldGroupDisable: [], fieldEnable: [], fieldGroupEnable: [], fieldReset: [], fieldGroupReset: [], fieldHideApiLoader: [], fieldShowApiLoader: [], setHtml: [], fieldErrorShow: [], fieldErrorHide: [], fieldMessageShow: [], fieldMessageHide: [], setValue: [], setFieldDefaultValue: [], setApiStatus: [], setApiHeaderValue: [], setApiHeaderValidity: [], setApiBodyValue: [], setApiBodyValidity: [], setFieldValidity: [], setDropdownOptions: [], apiCall: [], fieldApiCall: [], fieldMultipleApiCalls: [], fieldMultipleApiCallsEnd: [], taskApiCall: [], taskMultipleApiCalls: [], taskMultipleApiCallsEnd: [], dialogShow: [], dialogHide: [], redirectToUrl: [], patchFieldControlValue: [], setFieldControlValue: [], patchFormGroup: [], isFieldValid: [], isFieldEnabled: [], getFormGroupRawValues: [], showPreview: [], showErrorPreview: [], showPopupForm: [], alertShow: [], takeActionOnFieldGroup: [], takeAction: [] } });
3404
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9mb3JtLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsbUNBQW1DO0FBQ25DLHNEQUFzRDtBQUN0RCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFLTixTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsZUFBZSxFQUVmLGdCQUFnQixFQUNoQixlQUFlLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFVBQVUsRUFDVixNQUFNLEVBR04sb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixZQUFZLEVBQ1osZUFBZSxFQUNmLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLG9CQUFvQixFQUNyQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztB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QyxNQU1qQyxTQUFTLE1BZ0JULGNBQWMsTUFPZCxTQUFTLE1BZ0JULGNBQWMsTUFPZCxZQUFZLE1BMEJaLGlCQUFpQixNQU9qQixXQUFXLE1BMEJYLGdCQUFnQixNQU9oQixVQUFVLE1BcUVWLGVBQWUsTUFPZixrQkFBa0IsTUEyQmxCLGtCQUFrQixNQTJCbEIsT0FBTyxNQVlQLGNBQWMsTUFtQmQsY0FBYyxNQW1CZCxnQkFBZ0IsTUFrQmhCLGdCQUFnQixNQTBGVixRQUFRLE1Ba0JSLG9CQUFvQixNQXlDcEIsWUFBWSxNQXNCWixpQkFBaUIsTUFzQmpCLG9CQUFvQixNQXNCcEIsZUFBZSxNQXNCZixrQkFBa0IsTUFzQmxCLGdCQUFnQixNQXVCaEIsa0JBQWtCLE1Bd0NsQixPQUFPLE1BcUJQLFlBQVksTUFTWixxQkFBcUIsTUFpQnJCLHdCQUF3QixNQW1CeEIsV0FBVyxNQWVYLG9CQUFvQixNQTZDcEIsdUJBQXVCLE1BeUI3QixVQUFVLE1Bc0JWLFVBQVUsTUFPVixhQUFhLE1BNkJiLHNCQUFzQixNQUt0QixvQkFBb0IsTUFLcEIsY0FBYyxNQW1CZCxZQUFZLE1BS1osY0FBYyxNQUtkLHFCQUFxQixNQUtyQixXQUFXLE1BZ0dYLGdCQUFnQixNQVVoQixhQUFhLE1BY2IsU0FBUyxNQTRCSCxzQkFBc0IsTUF5Q3RCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUdWlQcmV2aWV3RGlhbG9nU2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvYWRkb24tcHJldmlld1wiO1xuaW1wb3J0IHtcbiAgVHVpQWxlcnRTZXJ2aWNlLFxuICBUdWlEaWFsb2dDb250ZXh0LFxuICBUdWlEaWFsb2dTZXJ2aWNlLFxuICBUdWlOb3RpZmljYXRpb25cbn0gZnJvbSBcIkB0YWlnYS11aS9jb3JlXCI7XG5pbXBvcnQgeyBUdWlQdXNoU2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkva2l0XCI7XG5pbXBvcnQgeyBLd2lrSURDYW1lcmFSZWNvcmRTZXJ2aWNlIH0gZnJvbSBcImt3aWtpZC1jYW1lcmFcIjtcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQ29uZGl0aW9uLFxuICBFU291cmNlS2V5LFxuICBSdWxlLFxuICBSdWxlRW5naW5lLFxuICBTb3VyY2UsXG4gIFRBY3Rpb24sXG4gIFRFbmdpbmUsXG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBjaGVja09iamVjdFBhdGhFeGlzdHMsXG4gIGdldE9iamVjdERlZXBDb3B5LFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc0VtcHR5U3RyaW5nLFxuICBpc0VtcHR5VmFsdWUsXG4gIGlzTm90RW1wdHlWYWx1ZSxcbiAgaXNOdWxsLFxuICBpc1VuZGVmaW5lZCxcbiAgbG9nTWV0aG9kLFxuICBtZXJnZU9iamVjdHMsXG4gIG1lcmdlT2JqZWN0c0RlZXAsXG4gIHJlcGxhY2VTdHJpbmcsXG4gIHNldFZhbHVlVG9PYmplY3RQYXRoXG59IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0IHsgS3dpa1VJTG9hZGVyU2VydmljZSB9IGZyb20gXCJrd2lrdWlcIjtcbmltcG9ydCB7IHBhaXJ3aXNlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4uL2NvbmZpZy1jb252ZXJ0ZXIvY29uZmlnLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRklFTERfUFJPUEVSVElFUyB9IGZyb20gXCIuLi9jb25maWctY29udmVydGVyL2NvbmZpZy1jb252ZXJ0ZXIuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBnZXRMYW5ndWFnZSxcbiAgdXBkYXRlTGFuZ3VhZ2Vcbn0gZnJvbSBcIi4uL2NvbmZpZy1jb252ZXJ0ZXIvY29uZmlnLWNvbnZlcnRlci5oZWxwZXJcIjtcbmltcG9ydCB7IEVGb3Jtc0xpc3RTdGF0dXMgfSBmcm9tIFwiLi4vZm9ybXMtbGlzdC9mb3Jtcy1saXN0LmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFjdGlvbnMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgRUFwaVJlcXVlc3RVcmxUeXBlLFxuICBFQXBpU3RhdHVzVHlwZSxcbiAgVEFwaSxcbiAgVEFwaUVuZHBvaW50LFxuICBUQXBpVGltZXJcbn0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFwaXMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgRU1lc3NhZ2VUeXBlLFxuICBURm9ybVZpZXdHb0JhY2tNb2RlLFxuICBUTWVzc2FnZVxufSBmcm9tIFwiLi9kZWZpbml0aW9ucy9mb3JtLXZpZXcuY29tbW9ucy5kZWZpbml0aW9uXCI7XG5pbXBvcnQge1xuICBFRmllbGRUeXBlLFxuICBURmllbGRBcGlDYWxsLFxuICBURmllbGRMaXZlTG9jYXRpb24sXG4gIFRGaWVsZFRpdGxlXG59IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5maWVsZHMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRUxvZ0V2ZW50VHlwZSB9IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5sb2dzLmRlZmluaXRpb25cIjtcbmltcG9ydCB7IEt3aWtJREZvcm1WaWV3QXBpU2VydmljZSB9IGZyb20gXCIuL2Zvcm0tdmlldy5hcGkuc2VydmljZVwiO1xuaW1wb3J0IHsgRk9STV9WSUVXX1RJTUVSUyB9IGZyb20gXCIuL2Zvcm0tdmlldy5jb25zdGFudHNcIjtcbmltcG9ydCB7IEt3aWtJREZvcm1WaWV3U2VydmljZSB9IGZyb20gXCIuL2Zvcm0tdmlldy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBcGlzIH0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuYXBpcy5oZWxwZXJcIjtcbmltcG9ydCB7IENhbWVyYUhlbHBlciB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmNhbWVyYS5oZWxwZXJcIjtcbmltcG9ydCB7XG4gIGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UsXG4gIGFwcGVuZEh0bWxNZXNzYWdlLFxuICBjb252ZXJ0Rm9ybUZpZWxkRW1wdHlWYWx1ZVRvS3dpa1VJRm9ybWF0LFxuICBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb0t3aWtVSUZvcm1hdCxcbiAgY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdCxcbiAgZmlsdGVyRHVwbGljYXRlc0ZpbGVzLFxuICBmaWx0ZXJEdXBsaWNhdGVzTWVkaWFGaWxlcyxcbiAgZ2V0Rm9ybUZpZWxkQnlLZXksXG4gIGdldEZvcm1GaWVsZEluZGV4QnlLZXksXG4gIGhpZ2hsaWdodEZvcm1GaWVsZEVycm9yLFxuICByZW1vdmVGb3JtRmllbGRNZXNzYWdlLFxuICBzZXRBcGlUaW1lck1lc3NhZ2UsXG4gIHNob3dGb3JtRmllbGRFcnJvclxufSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5maWVsZHMuaGVscGVyXCI7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvbiB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmZvcm0tdmFsaWRhdGlvbnMuaGVscGVyXCI7XG5pbXBvcnQgeyBmb3JtYXRFdmVudExvZ3MgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5sb2dzLmhlbHBlclwiO1xuaW1wb3J0IHsgVGFza3MgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy50YXNrcy5oZWxwZXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWtpZC1mb3JtLXZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9mb3JtLXZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2Zvcm0tdmlldy5jb21wb25lbnQuc2Nzc1wiLCBcIi4uL3NoYXJlZC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtLd2lrSURGb3JtVmlld1NlcnZpY2UsIEt3aWtJREZvcm1WaWV3QXBpU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgS3dpa0lERm9ybVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChcImZvcm1GaWVsZENvbnRhaW5lclJlZlwiKSBmb3JtRmllbGRDb250YWluZXJSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbihcImZvcm1GaWVsZHNSZWZcIikgZm9ybUZpZWxkc1JlZjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBWaWV3Q2hpbGQoXCJkaWFsb2dcIikgcmVhZG9ubHkgZGlhbG9nOiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PHZvaWQ+PjtcblxuICBAVmlld0NoaWxkKFwicHJldmlld1wiKSByZWFkb25seSBwcmV2aWV3OiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PHZvaWQ+PjtcblxuICBASW5wdXQoKSBhbGxGb3Jtc0RhdGE6IGFueTtcblxuICBASW5wdXQoKSBleHRyYURhdGE6IGFueTtcblxuICBASW5wdXQoKSBhcGlDYWxsUmVzcG9uc2U6IGFueTtcblxuICBASW5wdXQoKSBidXR0b25DbGlja1Jlc3BvbnNlOiBhbnk7XG5cbiAgQElucHV0KCkgZm9ybUNvbmZpZzogYW55O1xuXG4gIEBJbnB1dCgpIGZvcm1EYXRhOiBhbnk7XG5cbiAgQElucHV0KCkgaXNNb2JpbGVWaWV3ID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcG9wdXBGb3JtQ2FsbGJhY2s6IGFueSA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSB1c2VyQ29uZmlnOiBhbnk7XG5cbiAgQElucHV0KCkgc3RlcENvbmZpZzogYW55O1xuXG4gIEBPdXRwdXQoKSBnZXRMb2dzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBnZXRVbnNhdmVkRGF0YVN0YXRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBvbkFjdGlvblNob3dQb3B1cEZvcm06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uQ2xpY2tBcGlDYWxsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBvbkNsaWNrVmlld0ZpbGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uQ2xpY2tGb3JtRmllbGRCdXR0b246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uQ2xpY2tHb0JhY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uQ2xpY2tTYXZlRm9ybTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgb25DbGlja1ZpZXdGb3JtczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmaWVsZEdyb3VwczogYW55ID0ge307XG5cbiAgZm9ybUZpZWxkczogYW55W10gPSBbXTtcblxuICBwcmV2aW91c0Zvcm1EYXRhOiBhbnkgPSB7fTtcblxuICBjYW1lcmFEYXRhOiBhbnkgPSB7fTtcblxuICBpc1Nob3dDYW1lcmEgPSBmYWxzZTtcblxuICBpc1Nob3dDYW1lcmFGdWxsc2NyZWVuID0gZmFsc2U7XG5cbiAgYWN0aXZlQ2FtZXJhRmllbGRLZXkgPSBcIlwiO1xuXG4gIGFjdGl2ZUNhbWVyYURhdGE6IGFueSA9IHt9O1xuXG4gIGFjdGl2ZUNhbWVyYVR5cGU6IFwiQ0FQVFVSRVwiIHwgXCJSRUNPUkRcIiA9IHVuZGVmaW5lZDtcblxuICBhY3RpdmVDYW1lcmFJbWFnZSA9IFwiXCI7XG5cbiAgYWN0aXZlQ2FtZXJhVmlkZW8gPSBcIlwiO1xuXG4gIGFjdGl2ZUNhbWVyYUNvbmZpZzogYW55ID0gdW5kZWZpbmVkO1xuXG4gIGFjdGl2ZUNhbWVyYVJlY29yZGluZ1RpbWUgPSAwO1xuXG4gIGFjdGl2ZUNhbWVyYVJlY29yZGluZ1RpbWVyU3ViY3JpcHRpb246IGFueSA9IHVuZGVmaW5lZDtcblxuICBhY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZSA9IFwiTk9ORVwiO1xuXG4gIGFjdGl2ZUNhbWVyYVJlY29yZGluZ1N0YXRlU3ViY3JpcHRpb246IGFueSA9IHVuZGVmaW5lZDtcblxuICBAbG9nTWV0aG9kXG4gIHJlc2V0Q2FtZXJhKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93Q2FtZXJhID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3dDYW1lcmFGdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVDYW1lcmFGaWVsZEtleSA9IFwiXCI7XG4gICAgdGhpcy5hY3RpdmVDYW1lcmFEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYWN0aXZlQ2FtZXJhVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGl2ZUNhbWVyYUltYWdlID0gXCJcIjtcbiAgICB0aGlzLmFjdGl2ZUNhbWVyYVZpZGVvID0gXCJcIjtcbiAgICB0aGlzLmFjdGl2ZUNhbWVyYUNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGl2ZUNhbWVyYVJlY29yZGluZ1RpbWUgPSAwO1xuICAgIHRoaXMuYWN0aXZlQ2FtZXJhUmVjb3JkaW5nU3RhdGUgPSBcIk5PTkVcIjtcbiAgfVxuXG4gIHByZXZpZXdQcm9wZXJ0aWVzOiBhbnkgPSB7XG4gICAgaHRtbDoge1xuICAgICAgYmVmb3JlOiBcIlwiLFxuICAgICAgYmVmb3JlU3R5bGVzOiBcIlwiLFxuICAgICAgYWZ0ZXI6IFwiXCIsXG4gICAgICBhZnRlclN0eWxlczogXCJcIlxuICAgIH0sXG4gICAgaWZyYW1lOiB7XG4gICAgICBzcmM6IFwiXCIsXG4gICAgICB0aXRsZTogXCJcIlxuICAgIH0sXG4gICAgdHlwZTogXCJkaWFsb2dcIixcbiAgICBzaXplOiBcImF1dG9cIixcbiAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gIH07XG5cbiAgbG9hZGluZyA9IHRydWU7XG5cbiAgYXBpTG9hZGluZyA9IGZhbHNlO1xuXG4gIGJhY2tCdXR0b24gPSB7XG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHNob3dMb2FkZXI6IGZhbHNlXG4gIH07XG5cbiAgdmlld0Zvcm1zQnV0dG9uID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyOiBmYWxzZVxuICB9O1xuXG4gIHNhdmVGb3JtQnV0dG9uID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyOiBmYWxzZVxuICB9O1xuXG4gIGZpbGVzOiBhbnkgPSB7fTtcblxuICBtZWRpYUZpbGVzOiBhbnkgPSB7fTtcblxuICBzdG9wVGFza0V4ZWN1dGlvbiA9IGZhbHNlO1xuXG4gIHdhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG5cbiAgcG9wdXBGb3JtQ29uZmlnOiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgcG9wdXBGb3JtRGF0YTogYW55ID0ge307XG5cbiAgdGFza0RhdGE6IGFueSA9IHt9O1xuXG4gIHByZXZpZXdEaWFsb2dSZWY6IGFueTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9ybVZpZXdTZXJ2aWNlOiBLd2lrSURGb3JtVmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtVmlld0FwaVNlcnZpY2U6IEt3aWtJREZvcm1WaWV3QXBpU2VydmljZSxcbiAgICBASW5qZWN0KFR1aVB1c2hTZXJ2aWNlKVxuICAgIHByb3RlY3RlZCByZWFkb25seSBwdXNoU2VydmljZTogVHVpUHVzaFNlcnZpY2UsXG4gICAgQEluamVjdChUdWlBbGVydFNlcnZpY2UpXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogVHVpQWxlcnRTZXJ2aWNlLFxuICAgIEBJbmplY3QoVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmV2aWV3RGlhbG9nU2VydmljZTogVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UsXG4gICAgQEluamVjdChUdWlEaWFsb2dTZXJ2aWNlKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogVHVpRGlhbG9nU2VydmljZSxcbiAgICBwdWJsaWMgbG9hZGVyU2VydmljZTogS3dpa1VJTG9hZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGNhbWVyYVJlY29yZFNlcnZpY2U6IEt3aWtJRENhbWVyYVJlY29yZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5pbml0Rm9ybUNvbmZpZyh0aGlzLmZvcm1Db25maWcpO1xuXG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhUmVjb3JkaW5nVGltZXJTdWJjcmlwdGlvbiA9IHRoaXMuY2FtZXJhUmVjb3JkU2VydmljZVxuICAgICAgICAgIC5nZXRUaW1lclVwZGF0ZSgpXG4gICAgICAgICAgLnN1YnNjcmliZSgodGltZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYVJlY29yZGluZ1RpbWUgPSB0aW1lO1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYVJlY29yZGluZ1N0YXRlU3ViY3JpcHRpb24gPSB0aGlzLmNhbWVyYVJlY29yZFNlcnZpY2VcbiAgICAgICAgICAuZ2V0UmVjb3JkaW5nU3RhdGUoKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHN0YXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhUmVjb3JkaW5nU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywga2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImV4dHJhRGF0YVwiKSkge1xuICAgICAgdGhpcy5leHRyYURhdGEgPSBjaGFuZ2VzLmV4dHJhRGF0YS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJ1c2VyQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcgPSBjaGFuZ2VzLnVzZXJDb25maWcuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwic3RlcENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5zdGVwQ29uZmlnID0gY2hhbmdlcy5zdGVwQ29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1EYXRhXCIpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlLCBcImRhdGFcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcy5mb3JtRGF0YS5jdXJyZW50VmFsdWUsIFwiZXh0ZW5kZWREYXRhXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIC4uLmNoYW5nZXMuZm9ybURhdGEuY3VycmVudFZhbHVlLmRhdGFcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgICAgLi4udGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAuLi5jaGFuZ2VzLmZvcm1EYXRhLmN1cnJlbnRWYWx1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwicG9wdXBGb3JtQ2FsbGJhY2tcIikpIHtcbiAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUoY2hhbmdlcy5wb3B1cEZvcm1DYWxsYmFjay5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwRm9ybURhdGEgPVxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgY2hhbmdlcy5wb3B1cEZvcm1DYWxsYmFjay5jdXJyZW50VmFsdWUucG9wdXBGb3JtRGF0YSxcbiAgICAgICAgICAgIFwiZGF0YVwiXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgY2hhbmdlcy5wb3B1cEZvcm1DYWxsYmFjay5jdXJyZW50VmFsdWUucG9wdXBGb3JtRGF0YSxcbiAgICAgICAgICAgIFwiZXh0ZW5kZWREYXRhXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IGNoYW5nZXMucG9wdXBGb3JtQ2FsbGJhY2suY3VycmVudFZhbHVlLnBvcHVwRm9ybURhdGEuZGF0YVxuICAgICAgICAgICAgOiBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZS5wb3B1cEZvcm1EYXRhO1xuXG4gICAgICAgIGNvbnN0IHsgcG9wdXBGb3JtQ29uZmlnIH0gPSBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICB0aGlzLnBvcHVwRm9ybURhdGEgPSBtZXJnZU9iamVjdHModGhpcy5wb3B1cEZvcm1EYXRhLCB7XG4gICAgICAgICAgW3BvcHVwRm9ybUNvbmZpZy5rZXldOiBwb3B1cEZvcm1EYXRhXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSBtZXJnZU9iamVjdHModGhpcy5mb3JtRGF0YSwgdGhpcy5wb3B1cEZvcm1EYXRhKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIFwic3RvcFRhc2tFeGVjdXRpb25cIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zdG9wVGFza0V4ZWN1dGlvbiA9XG4gICAgICAgICAgICBjaGFuZ2VzLnBvcHVwRm9ybUNhbGxiYWNrLmN1cnJlbnRWYWx1ZS5zdG9wVGFza0V4ZWN1dGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0b3BUYXNrRXhlY3V0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiaXNNb2JpbGVWaWV3XCIpKSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGNoYW5nZXMuaXNNb2JpbGVWaWV3LmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFwaUNhbGxSZXNwb25zZVwiKSkge1xuICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2UgPSBjaGFuZ2VzLmFwaUNhbGxSZXNwb25zZS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkoXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuYXBpQ2FsbFJlc3BvbnNlPy5yZXNwb25zZTtcblxuICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5GSUxFOlxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZEZpbGUgPSBnZXRPYmplY3REZWVwQ29weSh7XG4gICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgICAgICAgLi4ucmVzcG9uc2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9GSUxFLCB7XG4gICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgZmllbGRfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6IFwiRklMRV9VUExPQURfQVBJX1NVQ0NFU1NcIixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzKHVwZGF0ZWRGaWxlLCBcIk5PUk1BTFwiLCB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRmlsZSA9IGdldE9iamVjdERlZXBDb3B5KHtcbiAgICAgICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgICAgICAuLi50aGlzLmFwaUNhbGxSZXNwb25zZT8ucGF5bG9hZD8ubWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9GSUxFLCB7XG4gICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgZmllbGRfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6IFwiRklMRV9VUExPQURfQVBJX0VSUk9SXCJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzKHVwZGF0ZWRGaWxlLCBcIkVSUk9SXCIsIHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5DQVBUVVJFOlxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldENhbWVyYSgpO1xuXG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHJlc3BvbnNlPy5pbWFnZV91cmw7XG4gICAgICAgICAgICBjb25zdCBpbWFnZU9jciA9IHJlc3BvbnNlPy5pbWFnZV9vY3I7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUZhY2VtYXRjaCA9IHJlc3BvbnNlPy5pbWFnZV9mYWNlbWF0Y2g7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVdhdGVybWFyayA9IHJlc3BvbnNlPy5pbWFnZV93YXRlcm1hcms7XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9XG4gICAgICAgICAgICAgIGltYWdlT2NyIHx8IGltYWdlRmFjZW1hdGNoIHx8IGltYWdlV2F0ZXJtYXJrXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgICAgICAgICAuLi4oaW1hZ2VPY3IgJiYgeyBvY3I6IGltYWdlT2NyIH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oaW1hZ2VGYWNlbWF0Y2ggJiYgeyBmYWNlbWF0Y2g6IGltYWdlRmFjZW1hdGNoIH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oaW1hZ2VXYXRlcm1hcmsgJiYgeyB3YXRlcm1hcms6IGltYWdlV2F0ZXJtYXJrIH0pXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBpbWFnZTtcblxuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW2ltYWdlRGF0YV0pO1xuICAgICAgICAgICAgdGhpcy5jYW1lcmFEYXRhW2ZpZWxkLmtleV0gPSBnZXRPYmplY3REZWVwQ29weShpbWFnZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5tZWRpYUZpbGVzW2ZpZWxkLmtleV0gPSBnZXRPYmplY3REZWVwQ29weShbaW1hZ2VEYXRhXSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgZ2V0T2JqZWN0RGVlcENvcHkoW2ltYWdlRGF0YV0pLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvbmx5U2VsZjogZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBbZmllbGQua2V5XTogZ2V0T2JqZWN0RGVlcENvcHkoW2ltYWdlRGF0YV0pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIk9OX0NIQU5HRVwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVTUE9OU0VfVVBMT0FEX0lNQUdFLCB7XG4gICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgZmllbGRfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6IFwiSU1BR0VfVVBMT0FEX0FQSV9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfSU1BR0UsIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJJTUFHRV9VUExPQURfQVBJX0VSUk9SXCJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlsZSBVcGxvYWQgZm9yIEltYWdlIEZhaWxlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5SRUNPUkQ6XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZpZGVvID0gcmVzcG9uc2U/LnZpZGVvX3VybDtcblxuICAgICAgICAgICAgdGhpcy5mb3JtRGF0YVtmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW3ZpZGVvXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYURhdGFbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KHZpZGVvKTtcbiAgICAgICAgICAgIHRoaXMubWVkaWFGaWxlc1tmaWVsZC5rZXldID0gZ2V0T2JqZWN0RGVlcENvcHkoW3ZpZGVvXSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgIGdldE9iamVjdERlZXBDb3B5KFt2aWRlb10pLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvbmx5U2VsZjogZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBbZmllbGQua2V5XTogZ2V0T2JqZWN0RGVlcENvcHkoW3ZpZGVvXSlcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe1xuICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe1xuICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5nZXRVbnNhdmVkRGF0YVN0YXRlLmVtaXQodHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVNQT05TRV9VUExPQURfVklERU8sIHtcbiAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJWSURFT19VUExPQURfQVBJX1NVQ0NFU1NcIixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9WSURFTywge1xuICAgICAgICAgICAgICBhcGlfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgIGZpZWxkX2tleTogdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5LFxuICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiBcIlZJREVPX1VQTE9BRF9BUElfRVJST1JcIlxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGaWxlIFVwbG9hZCBmb3IgVmlkZW8gRmFpbGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFRmllbGRUeXBlLkxJVkVfTE9DQVRJT046XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1EYXRhW2ZpZWxkLmtleV0gPSBnZXRPYmplY3REZWVwQ29weShyZXNwb25zZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgZ2V0T2JqZWN0RGVlcENvcHkocmVzcG9uc2UpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvbmx5U2VsZjogZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBbZmllbGQua2V5XTogZ2V0T2JqZWN0RGVlcENvcHkocmVzcG9uc2UpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICAgICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgICAgICAgIEFQSV9DT05GSUc6IGZpZWxkLmFwaSxcbiAgICAgICAgICAgICAgICBBUElfUkVTUE9OU0U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgYXBpID0gYXdhaXQgYXBpcy52YWxpZGF0ZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgIGZpZWxkLmFwaSA9IGFwaTtcbiAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoXG4gICAgICAgICAgICAgIEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFU1BPTlNFX1JFVkVSU0VfTEFUX0xPTkcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcGlfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgICAgZmllbGRfa2V5OiB0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogXCJSRVZFUlNFX0xBVF9MT05HX0FQSV9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhcbiAgICAgICAgICAgICAgRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVTUE9OU0VfUkVWRVJTRV9MQVRfTE9ORyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgICBmaWVsZF9rZXk6IHRoaXMuYXBpQ2FsbFJlc3BvbnNlLmtleSxcbiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiBcIlJFVkVSU0VfTEFUX0xPTkdfQVBJX0VSUk9SXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgYXBpcyA9IG5ldyBBcGlzKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBBUElfQ09ORklHOiBmaWVsZC5hcGksXG4gICAgICAgICAgICAgICAgQVBJX1JFU1BPTlNFOiB7fSxcbiAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFwaSA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXNwb25zZSgpO1xuICAgICAgICAgICAgICBmaWVsZC5hcGkgPSBhcGk7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmV2ZXJzZSBMb2NhdGlvbiBmb3IgTGF0TG9uZyBGYWlsZWRcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJidXR0b25DbGlja1Jlc3BvbnNlXCIpKSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UgPSBjaGFuZ2VzLmJ1dHRvbkNsaWNrUmVzcG9uc2UuY3VycmVudFZhbHVlO1xuXG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLCBcImtleVwiKSkge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgdGhpcy5idXR0b25DbGlja1Jlc3BvbnNlPy5rZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0ID0gZ2V0T2JqZWN0RGVlcENvcHkodGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLmRlZmF1bHQpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLCBcIm1lc3NhZ2VzXCIpKSB7XG4gICAgICAgICAgZmllbGQubWVzc2FnZXMgPSBnZXRPYmplY3REZWVwQ29weSh0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UubWVzc2FnZXMpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UubWVzc2FnZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZSwgXCJ2YWxpZGF0aW9uXCIpKSB7XG4gICAgICAgICAgZmllbGQudmFsaWRhdGlvbiA9IGdldE9iamVjdERlZXBDb3B5KFxuICAgICAgICAgICAgdGhpcy5idXR0b25DbGlja1Jlc3BvbnNlLnZhbGlkYXRpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UudmFsaWRhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkID0gZ2V0T2JqZWN0RGVlcENvcHkoXG4gICAgICAgICAgbWVyZ2VPYmplY3RzKGZpZWxkLCB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInZhbGlkYXRpb25cIikpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC52YWxpZGF0aW9uLCBcInRyaWdnZXJzXCIpICYmXG4gICAgICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fUkVTUE9OU0VcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJhbGxGb3Jtc0RhdGFcIikpIHtcbiAgICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gY2hhbmdlcy5hbGxGb3Jtc0RhdGEuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZm9ybUNvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnID0gY2hhbmdlcy5mb3JtQ29uZmlnLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0Rm9ybUNvbmZpZyh0aGlzLmZvcm1Db25maWcpO1xuICAgICAgfSkoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUNhbWVyYVJlY29yZGluZ1RpbWVyU3ViY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhUmVjb3JkaW5nVGltZXJTdWJjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZVN1YmNyaXB0aW9uKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNhbWVyYVJlY29yZGluZ1N0YXRlU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHRyaWdnZXJMb2dzKGV2ZW50VHlwZTogRUxvZ0V2ZW50VHlwZSwgbG9nczogYW55KSB7XG4gICAgdGhpcy5nZXRMb2dzLmVtaXQoXG4gICAgICBmb3JtYXRFdmVudExvZ3MoXG4gICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgdGhpcy5zdGVwQ29uZmlnLFxuICAgICAgICB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgIGdldE9iamVjdERlZXBDb3B5KGxvZ3MpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaW5pdEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KSB7XG4gICAgZm9ybUNvbmZpZyA9IG5ldyBDb252ZXJ0ZXIoKS5jb252ZXJ0Rm9ybUNvbmZpZyhmb3JtQ29uZmlnKTtcblxuICAgIGZvcm1Db25maWcgPSBuZXcgQ29udmVydGVyKCkudXBkYXRlRm9ybUNvbmZpZ1Byb3BlcnRpZXMoZm9ybUNvbmZpZyk7XG5cbiAgICB0aGlzLnNldEZvcm1GaWVsZHNGcm9tRm9ybUNvbmZpZyhmb3JtQ29uZmlnKTtcblxuICAgIHRoaXMuc2V0Rm9ybUZpZWxkR3JvdXBzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZyk7XG5cbiAgICB0aGlzLnNldEZvcm1EYXRhRnJvbUFsbEZvcm1zRGF0YSgpO1xuXG4gICAgdGhpcy5mb3JtQ29uZmlnID0gZm9ybUNvbmZpZztcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19DT05GSUdfTE9BRF9TVUNDRVNTLCB7XG4gICAgICAuLi4oZm9ybUNvbmZpZy5zZXF1ZW5jZU5vICYmIHtcbiAgICAgICAgZm9ybV9zZXF1ZW5jZV9ubzogZm9ybUNvbmZpZy5zZXF1ZW5jZU5vXG4gICAgICB9KSxcbiAgICAgIC4uLihmb3JtQ29uZmlnLnN0YXR1cyAmJiB7IGZvcm1fc3RhdHVzOiBmb3JtQ29uZmlnLnN0YXR1cyB9KVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUFJFIEZvcm0gVGFza3NcbiAgICAgKiAxLiBBUEkgQ2FsbHMuXG4gICAgICogMi4gQWx0ZXIgRGF0YSBTdHJ1Y3R1cmUuXG4gICAgICogMy4gQWx0ZXIgRm9ybSBDb25maWcuXG4gICAgICovXG4gICAgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5mb3JtQ29uZmlnLCBcInRhc2tzXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmZvcm1Db25maWcudGFza3MsIFwicHJlXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fVEFTS19QUkUsIHt9KTtcblxuICAgICAgZm9yIChjb25zdCBwcmVUYXNrIG9mIHRoaXMuZm9ybUNvbmZpZy50YXNrcy5wcmUpIHtcbiAgICAgICAgY29uc3QgdGFzayA9IG5ldyBUYXNrcyhcbiAgICAgICAgICBwcmVUYXNrLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZPUk1fQ09ORklHOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zdG9wVGFza0V4ZWN1dGlvbiA9IGZhbHNlO1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMocHJlVGFzaywgXCJ3YWl0XCIpKSB7XG4gICAgICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IHByZVRhc2sud2FpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrLmV4ZWN1dGUoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciBuZ09uQ2hhbmdlcyB0byBiZSBjYWxsZWQgYmVmb3JlIGNvbnRpbnVpbmcgdG8gdGhlIG5leHQgdGFza1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2FpdGluZ0ZvckNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuV0FJVF9GT1JfQ0hBTkdFU19CRUZPUkVfTU9WSU5HX1RPX05FWFRfVEFTSyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0b3BUYXNrRXhlY3V0aW9uKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtRGF0YSA9IG1lcmdlT2JqZWN0cyh0aGlzLmZvcm1EYXRhLCB0aGlzLnBvcHVwRm9ybURhdGEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0b3BUYXNrRXhlY3V0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBhd2FpdCB0aGlzLmZvcm1WaWV3U2VydmljZS5jcmVhdGVGb3JtR3JvdXAoXG4gICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICB7XG4gICAgICAgIEZPUk1fQ09ORklHOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgfSxcbiAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvciBzb21lIHJlYXNvbiBpZiB0aGVpciBhIGZpZWxkIG9mIHR5cGUgJ0lNQUdFJyB0aGVuXG4gICAgICogZm9ybURhdGEgaXMgYWRkaW5nIGEgJ3VuZGVmaW5lZCcga2V5IHdpdGggbGFzdCBpbWFnZSdzIHZhbHVlIGZyb20gdGhlIGFycmF5LlxuICAgICAqIEJlbG93IHBpZWNlIG9mIGNvZGUgaXMgdG8gcmVtb3ZlIHRoYXQgcmVkdW5kZW50IHZhbHVlIGZyb20gZm9ybURhdGEuXG4gICAgICovXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuZm9ybURhdGEsIFwidW5kZWZpbmVkXCIpKSB7XG4gICAgICBkZWxldGUgdGhpcy5mb3JtRGF0YS51bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50KSB7XG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgW2ZpZWxkLmtleV06IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICApXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFtmaWVsZC5rZXldOiBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkZJTEUpIHtcbiAgICAgICAgICB0aGlzLmZpbGVzW2ZpZWxkLmtleV0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkNBUFRVUkUpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgICAgICB0aGlzLmNhbWVyYURhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICBbZmllbGQua2V5XTogY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5tZWRpYUZpbGVzW2ZpZWxkLmtleV0gPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLlJFQ09SRCkge1xuICAgICAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcblxuICAgICAgICAgIHRoaXMuY2FtZXJhRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgIFtmaWVsZC5rZXldOiBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKHBhaXJ3aXNlKCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICBbZmllbGQua2V5XTogY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1ZhbHVlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFtmaWVsZC5rZXldOiBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gRUZpZWxkVHlwZS5GSUxFKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZXNbZmllbGQua2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLkNBUFRVUkUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXNldENhbWVyYSgpO1xuXG4gICAgICAgICAgICAgIHRoaXMuY2FtZXJhRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBFRmllbGRUeXBlLlJFQ09SRCkge1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG5cbiAgICAgICAgICAgICAgdGhpcy5jYW1lcmFEYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgICAgICBbZmllbGQua2V5XTogY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHRoaXMubWVkaWFGaWxlc1tmaWVsZC5rZXldID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSkge1xuICAgICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fSU5JVFwiKSkge1xuICAgICAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiT05fSU5JVFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRGb3JtRmllbGRzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwiZmllbGRzXCIpKSB7XG4gICAgICB0aGlzLmZvcm1GaWVsZHMgPSBmb3JtQ29uZmlnLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybUNvbmZpZywgXCJtdWx0aUZvcm1cIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcubXVsdGlGb3JtLCBcImZpZWxkc1wiKVxuICAgICkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gZm9ybUNvbmZpZy5tdWx0aUZvcm0uZmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2V0Rm9ybUZpZWxkR3JvdXBzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KSB7XG4gICAgdGhpcy5maWVsZEdyb3VwcyA9IGZvcm1Db25maWcuZmllbGRHcm91cHM7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEZvcm1EYXRhRnJvbUFsbEZvcm1zRGF0YSgpIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5hbGxGb3Jtc0RhdGEsIHRoaXMuZm9ybUNvbmZpZy5rZXkpKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuYWxsRm9ybXNEYXRhW3RoaXMuZm9ybUNvbmZpZy5rZXldO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1EYXRhLCBcImRhdGFcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybURhdGEsIFwiZXh0ZW5kZWREYXRhXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIC4uLmZvcm1EYXRhLmRhdGFcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgICAgLi4udGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAuLi5mb3JtRGF0YVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRHcm91cEFjdGlvbnMoXG4gICAgY2hpbGRGaWVsZEdyb3VwQ29uZmlnOiBhbnksXG4gICAgcGFyZW50RmllbGQ6IGFueVxuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hpbGRGaWVsZEdyb3VwQ29uZmlnLCBcInJ1bGVzXCIpKSB7XG4gICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZShjaGlsZEZpZWxkR3JvdXBDb25maWcucnVsZXMsIHtcbiAgICAgICAgRklFTERfQ09ORklHOiBwYXJlbnRGaWVsZCxcbiAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICB9KS5tYXBwaW5nKCk7XG5cbiAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGNoaWxkRmllbGRHcm91cENvbmZpZy5hY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN1Y2Nlc3MgPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICBpZiAoY29uZGl0aW9uU3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IHBhcmVudEZpZWxkLFxuICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnRha2VBY3Rpb25PbkZpZWxkR3JvdXAuYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXAoXG4gICAgY3VycmVudEZpZWxkOiBhbnksXG4gICAgY29ubmVjdGVkRmllbGRHcm91cENvbmZpZzogYW55LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nXG4gICkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnLCBcInRyaWdnZXJzXCIpKSB7XG4gICAgICBpZiAoY29ubmVjdGVkRmllbGRHcm91cENvbmZpZy50cmlnZ2Vycy5pbmNsdWRlcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXBBY3Rpb25zKFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcsXG4gICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxuICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnOiBhbnksXG4gICAgY29ubmVjdGVkRmllbGQ6IGFueVxuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRDb25maWcsIFwicnVsZXNcIikpIHtcbiAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKGNvbm5lY3RlZEZpZWxkQ29uZmlnLnJ1bGVzLCB7XG4gICAgICAgIEZJRUxEX0NPTkZJRzogY29ubmVjdGVkRmllbGQsXG4gICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgfSkubWFwcGluZygpO1xuXG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBjb25uZWN0ZWRGaWVsZENvbmZpZy5hY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblN1Y2Nlc3MgPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICBpZiAoY29uZGl0aW9uU3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGNvbm5lY3RlZEZpZWxkLFxuICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25uZWN0ZWRGaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkcyhcbiAgICBjdXJyZW50RmllbGQ6IGFueSxcbiAgICBjb25uZWN0ZWRGaWVsZENvbmZpZzogYW55LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIG5lc3RlZDogc3RyaW5nXG4gICkge1xuICAgIGxldCBjb25uZWN0ZWRGaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KFxuICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgY29ubmVjdGVkRmllbGRDb25maWcua2V5XG4gICAgKTtcblxuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZENvbmZpZywgXCJ0cmlnZ2Vyc1wiKSkge1xuICAgICAgaWYgKGNvbm5lY3RlZEZpZWxkQ29uZmlnLnRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgY29ubmVjdGVkRmllbGQgPSBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEFjdGlvbnMoXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXG4gICAgICAgICAgY29ubmVjdGVkRmllbGRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkQ29uZmlnLCBcImhhbmRsZU5lc3RlZEZpZWxkc1wiKSkge1xuICAgICAgaWYgKGNvbm5lY3RlZEZpZWxkQ29uZmlnLmhhbmRsZU5lc3RlZEZpZWxkcykge1xuICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHsga2V5OiBjb25uZWN0ZWRGaWVsZENvbmZpZy5rZXkgfSxcbiAgICAgICAgICBldmVudFR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRGaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoZTogYW55LCBldmVudFR5cGU6IHN0cmluZykge1xuICAgIGxldCBjdXJyZW50RmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcblxuICAgIGlmIChjdXJyZW50RmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGN1cnJlbnRGaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjdXJyZW50RmllbGQuY29ubmVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBcImNvbm5lY3RlZEZpZWxkR3JvdXBzXCJcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgY29ubmVjdGVkRmllbGRHcm91cHMgfSA9IGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cztcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcgb2YgY29ubmVjdGVkRmllbGRHcm91cHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXAoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRHcm91cENvbmZpZyxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjdXJyZW50RmllbGQuY29ubmVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBcImNvbm5lY3RlZEZpZWxkc1wiXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IGNvbm5lY3RlZEZpZWxkcyB9ID0gY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzO1xuICAgICAgICAgIGZvciAoY29uc3QgY29ubmVjdGVkRmllbGRDb25maWcgb2YgY29ubmVjdGVkRmllbGRzKSB7XG4gICAgICAgICAgICBjdXJyZW50RmllbGQgPSBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZHMoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXG4gICAgICAgICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGaWVsZCBmb3IgdGhlIGdpdmVuIGtleSBbJyR7ZS5rZXl9J10gaXMgbm90IGZvdW5kIHdpdGggZXZlbnRUeXBlOiAnJHtldmVudFR5cGV9Jy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlUmVtb3ZlZEZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZS5rZXldLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuZmlsZXNbZS5rZXldID0gZS5maWxlcztcblxuICAgICAgdGhpcy5mb3JtRGF0YVtlLmtleV0gPSBmaWx0ZXJEdXBsaWNhdGVzRmlsZXModGhpcy5maWxlc1tlLmtleV0pO1xuXG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgW2Uua2V5XTogdGhpcy5mb3JtRGF0YVtlLmtleV1cbiAgICAgICAgfSxcbiAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0ZJTEVfUkVNT1ZFLCB7XG4gICAgICBmaWVsZF9rZXk6IGUua2V5LFxuICAgICAgLi4uKGUuZmlsZT8ubmFtZSA/PyB7IGZpbGVfbmFtZTogZS5maWxlPy5uYW1lIH0pLFxuICAgICAgLi4uKGUuZmlsZT8uc2l6ZSA/PyB7IGZpbGVfc2l6ZTogZS5maWxlPy5zaXplIH0pLFxuICAgICAgLi4uKGUuZmlsZT8udHlwZSA/PyB7IGZpbGVfdHlwZTogZS5maWxlPy50eXBlIH0pXG4gICAgfSk7XG5cbiAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlVmlld0J1dHRvbkNsaWNrKGU6IGFueSwgZmllbGQ6IGFueSkge1xuICAgIHRoaXMub25DbGlja1ZpZXdGaWxlLmVtaXQoe1xuICAgICAga2V5OiBmaWVsZD8ua2V5LFxuICAgICAgdHlwZTogZmllbGQ/LnR5cGUsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBldmVudDogZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVHZXRLZXlWYWx1ZUZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShlLnZhbHVlKSA/IGUudmFsdWUgOiBbZS52YWx1ZV07XG5cbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJwcm9wZXJ0aWVzXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5wcm9wZXJ0aWVzLCBcInVwbG9hZEZpbGVUb1NlcnZlclwiKSAmJlxuICAgICAgZmllbGQucHJvcGVydGllcy51cGxvYWRGaWxlVG9TZXJ2ZXJcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBsb2FkRmlsZShmaWVsZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzKHZhbHVlLCBcIkxPQURJTkdcIiwgZS5rZXkpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9GSUxFX0FERCwge1xuICAgICAgICAgIGZpZWxkX2tleTogZS5rZXksXG4gICAgICAgICAgLi4uKGUuZmlsZT8ubmFtZSA/PyB7IGZpbGVfbmFtZTogZS5maWxlPy5uYW1lIH0pLFxuICAgICAgICAgIC4uLihlLmZpbGU/LnNpemUgPz8geyBmaWxlX3NpemU6IGUuZmlsZT8uc2l6ZSB9KSxcbiAgICAgICAgICAuLi4oZS5maWxlPy50eXBlID8/IHsgZmlsZV90eXBlOiBlLmZpbGU/LnR5cGUgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZEZpbGUgPSBnZXRPYmplY3REZWVwQ29weShcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGlkOiB1dWlkdjQoKSxcbiAgICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHZhbHVlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB3ZWJraXRSZWxhdGl2ZVBhdGg6IHZhbHVlLndlYmtpdFJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuV0FJVF9GT1JfRklMRV9NRVRBREFUQV9ERUVQQ09QWSk7IC8vIDEwMDAgbXMgPSAxIHNlY1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVGaWxlcyh1cGRhdGVkRmlsZSwgXCJOT1JNQUxcIiwgZS5rZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogTWV0aG9kcyBmb3IgQ2FtZXJhIHJlbGF0ZWQgZmllbGRzIGxpa2UgJ0NBUFRVUkUnIG9yICAnUkVDT1JEJyAqL1xuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tHZXRSZW1vdmVkTWVkaWFGaWxlKGU6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tlLmtleV0uZW5hYmxlZCkge1xuICAgICAgdGhpcy5zaG93QXBpTG9hZGVyKCk7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG5cbiAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcblxuICAgICAgdGhpcy5tZWRpYUZpbGVzW2Uua2V5XSA9IGUubWVkaWFGaWxlcztcblxuICAgICAgdGhpcy5mb3JtRGF0YVtlLmtleV0gPSBmaWx0ZXJEdXBsaWNhdGVzTWVkaWFGaWxlcyh0aGlzLm1lZGlhRmlsZXNbZS5rZXldKTtcblxuICAgICAgdGhpcy5jYW1lcmFEYXRhW2Uua2V5XSA9IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICB0aGlzLmZvcm1EYXRhW2Uua2V5XVxuICAgICAgKTtcblxuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcbiAgICAgICAge1xuICAgICAgICAgIFtlLmtleV06IHRoaXMuZm9ybURhdGFbZS5rZXldXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfTUVESUFfRklMRV9SRU1PVkUsIHtcbiAgICAgICAgZmllbGRfa2V5OiBlLmtleSxcbiAgICAgICAgLi4uKGUuZmlsZT8ubmFtZSA/PyB7IGZpbGVfbmFtZTogZS5maWxlPy5uYW1lIH0pLFxuICAgICAgICAuLi4oZS5maWxlPy5zaXplID8/IHsgZmlsZV9zaXplOiBlLmZpbGU/LnNpemUgfSksXG4gICAgICAgIC4uLihlLmZpbGU/LnR5cGUgPz8geyBmaWxlX3R5cGU6IGUuZmlsZT8udHlwZSB9KVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIk9OX0NIQU5HRVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrSW5wdXRDYW1lcmEoZTogYW55LCBmaWVsZDogYW55KSB7XG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLnNob3coe1xuICAgICAgbG9hZGVyVGV4dDogXCJMb2FkaW5nIENhbWVyYS4uLlwiLFxuICAgICAgZnVsbHNjcmVlbjogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgZmllbGRLZXkgPSBmaWVsZC5rZXk7XG4gICAgY29uc3QgZmllbGRDYW1lcmFDb25maWcgPSBmaWVsZD8ucHJvcGVydGllcyA/PyB7fTtcblxuICAgIHRoaXMuYWN0aXZlQ2FtZXJhVHlwZSA9IGZpZWxkPy50eXBlLnRvVXBwZXJDYXNlKCkgfHwgXCJcIjtcbiAgICB0aGlzLmFjdGl2ZUNhbWVyYUZpZWxkS2V5ID0gZmllbGRLZXk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfQ0FNRVJBX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgY2FtZXJhX3R5cGU6IHRoaXMuYWN0aXZlQ2FtZXJhVHlwZVxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZUNhbWVyYVR5cGUpIHtcbiAgICAgIGNhc2UgXCJDQVBUVVJFXCI6XG4gICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhQ29uZmlnID0gbWVyZ2VPYmplY3RzRGVlcChbXG4gICAgICAgICAgRklFTERfUFJPUEVSVElFUy5jYXB0dXJlLFxuICAgICAgICAgIGZpZWxkQ2FtZXJhQ29uZmlnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhRGF0YSA9IHt9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYUNvbmZpZz8uZmVhdHVyZXM/LndhdGVybWFyaz8uaXNFbmFibGVkICYmXG4gICAgICAgICAgIXRoaXMuYWN0aXZlQ2FtZXJhQ29uZmlnLmZlYXR1cmVzPy53YXRlcm1hcms/LmlzV2F0ZXJtYXJrRnJvbVNlcnZlclxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjYW1lcmFIZWxwZXIgPSBuZXcgQ2FtZXJhSGVscGVyKGZpZWxkLCB7XG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYURhdGEgPSB7XG4gICAgICAgICAgICB3YXRlcm1hcms6IGF3YWl0IGNhbWVyYUhlbHBlci5nZXRDYW1lcmFXYXRlcm1hcmtEYXRhKClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlJFQ09SRFwiOlxuICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYUNvbmZpZyA9IG1lcmdlT2JqZWN0c0RlZXAoW1xuICAgICAgICAgIEZJRUxEX1BST1BFUlRJRVMucmVjb3JkLFxuICAgICAgICAgIGZpZWxkQ2FtZXJhQ29uZmlnXG4gICAgICAgIF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlnIGFuZCBvdGhlciBkYXRhIGlzIHNldCBub3csIHNvIHdlIGNhbiBzaG93IHRoZSBjYW1lcmEuXG4gICAgICovXG4gICAgdGhpcy5pc1Nob3dDYW1lcmEgPSB0cnVlO1xuXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGUoKTtcbiAgfVxuXG4gIC8qKiBLd2lrSUQgQ2FtZXJhIE1ldGhvZHMgKi9cbiAgLyoqIENhbWVyYVR5cGUgPSBDQVBUVVJFICovXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0Q2FtZXJhTWVkaWEobWVkaWE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCB0aGlzLmFjdGl2ZUNhbWVyYUZpZWxkS2V5KTtcblxuICAgIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInByb3BlcnRpZXNcIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLnByb3BlcnRpZXMsIFwidXBsb2FkRmlsZVRvU2VydmVyXCIpICYmXG4gICAgICBmaWVsZC5wcm9wZXJ0aWVzLnVwbG9hZEZpbGVUb1NlcnZlclxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRGaWxlKGZpZWxkLCBtZWRpYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUNhbWVyYURhdGEgPSB0aGlzLmFjdGl2ZUNhbWVyYURhdGE7XG5cbiAgICAgIHRoaXMucmVzZXRDYW1lcmEoKTtcblxuICAgICAgbGV0IHVwZGF0ZWRNZWRpYTogYW55ID0ge307XG5cbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICBjYXNlIEVGaWVsZFR5cGUuQ0FQVFVSRTpcbiAgICAgICAgICB1cGRhdGVkTWVkaWEgPSB7XG4gICAgICAgICAgICAuLi4oaXNOb3RFbXB0eVZhbHVlKGFjdGl2ZUNhbWVyYURhdGEpID8gYWN0aXZlQ2FtZXJhRGF0YSA6IHt9KSxcbiAgICAgICAgICAgIGltYWdlOiBtZWRpYVxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRUZpZWxkVHlwZS5SRUNPUkQ6XG4gICAgICAgICAgdXBkYXRlZE1lZGlhID0ge1xuICAgICAgICAgICAgLi4uKGlzTm90RW1wdHlWYWx1ZShhY3RpdmVDYW1lcmFEYXRhKSA/IGFjdGl2ZUNhbWVyYURhdGEgOiB7fSksXG4gICAgICAgICAgICB2aWRlbzogbWVkaWFcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm1EYXRhW2ZpZWxkLmtleV0gPSBnZXRPYmplY3REZWVwQ29weShbdXBkYXRlZE1lZGlhXSk7XG4gICAgICB0aGlzLmNhbWVyYURhdGFbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KHVwZGF0ZWRNZWRpYSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZXNbZmllbGQua2V5XSA9IGdldE9iamVjdERlZXBDb3B5KFt1cGRhdGVkTWVkaWFdKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucGF0Y2hWYWx1ZShcbiAgICAgICAgZ2V0T2JqZWN0RGVlcENvcHkoW3VwZGF0ZWRNZWRpYV0pLFxuICAgICAgICB7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICBvbmx5U2VsZjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBbZmllbGQua2V5XTogZ2V0T2JqZWN0RGVlcENvcHkoW3VwZGF0ZWRNZWRpYV0pXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQ0hBTkdFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIk9OX0NIQU5HRVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9GSUxFX0FERCwge1xuICAgICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbWVyYSBDb21tb24gTWV0aG9kcyAqL1xuICBAbG9nTWV0aG9kXG4gIGhhbmRsZUdldENhbWVyYU1lZGlhKGU6IGFueSwgYWN0aXZlQ2FtZXJhVHlwZTogXCJDQVBUVVJFXCIgfCBcIlJFQ09SRFwiKSB7XG4gICAgc3dpdGNoIChhY3RpdmVDYW1lcmFUeXBlKSB7XG4gICAgICBjYXNlIFwiQ0FQVFVSRVwiOlxuICAgICAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYUltYWdlID0gXCJcIjtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBQcmlvcml0eSBvZiBJbWFnZSB0byBTZXQgZm9yIENvbmZpZyBCYXNlZFxuICAgICAgICAgICAqIDEuIE1hc2tlZFxuICAgICAgICAgICAqIDIuIENyb3BwZWRcbiAgICAgICAgICAgKiAzLiBPcmlnaW5hbFxuICAgICAgICAgICAqXG4gICAgICAgICAgICogSWYgbm8gbWFza2VkIG9yIGNyb3BwZWQgaW1hZ2UgaXMgYXZhaWxhYmxlIHRoZW4gZGlyZWN0bHkgc2V0IE9yaWdpbmFsIEltYWdlXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhRmllbGRLZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgaW1hZ2UgPSBmaWVsZC5wcm9wZXJ0aWVzPy5pc01hc2tlZEltYWdlXG4gICAgICAgICAgICA/IGU/Lm1hc2tlZEltYWdlID8/IGU/Lm9yaWdpbmFsSW1hZ2VcbiAgICAgICAgICAgIDogZmllbGQucHJvcGVydGllcz8uaXNDcm9wcGVkSW1hZ2VcbiAgICAgICAgICAgICAgPyBlPy5jcm9wcGVkSW1hZ2UgPz8gZT8ub3JpZ2luYWxJbWFnZVxuICAgICAgICAgICAgICA6IGU/Lm9yaWdpbmFsSW1hZ2U7XG5cbiAgICAgICAgICBjb25zdCBpc1Nob3dJbWFnZVByZXZpZXcgPVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDYW1lcmFDb25maWc/LmNhbWVyYUNvbmZpZz8ub3RoZXJzPy5wcmV2aWV3Py5zaG93O1xuXG4gICAgICAgICAgaWYgKGlzU2hvd0ltYWdlUHJldmlldykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDYW1lcmFJbWFnZSA9IGltYWdlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENhbWVyYU1lZGlhKGltYWdlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICAgICAgfSwgRk9STV9WSUVXX1RJTUVSUy5XQUlUX0ZPUl9LV0lLSURfQ0FNRVJBX1RPX0xPQUQpOyAvLyBEZWxheSBpcyBhZGRlZCBkdWUgdG8gaXNzdXMgd2l0aCBLd2lrSUQgQ2FtZXJhIG5vdCBiZWluZyBhYmxlIHRvIGhhbmRsZSB0byBmYXN0IHByb2Nlc3NpbmcuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlJFQ09SRFwiOlxuICAgICAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYVZpZGVvID0gXCJcIjtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBQcmlvcml0eSBvZiBJbWFnZSB0byBTZXQgZm9yIENvbmZpZyBCYXNlZFxuICAgICAgICAgICAqIDEuIE9yaWdpbmFsXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhRmllbGRLZXlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgdmlkZW8gPSBlPy5vcmlnaW5hbFZpZGVvO1xuXG4gICAgICAgICAgY29uc3QgaXNTaG93VmlkZW9QcmV2aWV3ID1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhQ29uZmlnPy5vdGhlcnM/LnByZXZpZXc/LnNob3c7XG5cbiAgICAgICAgICBpZiAoaXNTaG93VmlkZW9QcmV2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYVZpZGVvID0gdmlkZW87XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTWVkaWEodmlkZW8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICAgICAgICB9LCBGT1JNX1ZJRVdfVElNRVJTLldBSVRfRk9SX0tXSUtJRF9DQU1FUkFfVE9fTE9BRCk7IC8vIERlbGF5IGlzIGFkZGVkIGR1ZSB0byBpc3N1cyB3aXRoIEt3aWtJRCBDYW1lcmEgbm90IGJlaW5nIGFibGUgdG8gaGFuZGxlIHRvIGZhc3QgcHJvY2Vzc2luZy5cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tTYXZlQ2FtZXJhTWVkaWEoZTogYW55LCBhY3RpdmVDYW1lcmFUeXBlOiBcIkNBUFRVUkVcIiB8IFwiUkVDT1JEXCIpIHtcbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCB0aGlzLmFjdGl2ZUNhbWVyYUZpZWxkS2V5KTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19DQU1FUkFfU0FWRV9CVVRUT05fQ0xJQ0ssIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGNhbWVyYV90eXBlOiBhY3RpdmVDYW1lcmFUeXBlXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKGFjdGl2ZUNhbWVyYVR5cGUpIHtcbiAgICAgIGNhc2UgXCJDQVBUVVJFXCI6XG4gICAgICAgIHRoaXMuYWN0aXZlQ2FtZXJhSW1hZ2UgPSBcIlwiO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFByaW9yaXR5IG9mIEltYWdlIHRvIFNldCBmb3IgQ29uZmlnIEJhc2VkXG4gICAgICAgICAgICogMS4gTWFza2VkXG4gICAgICAgICAgICogMi4gQ3JvcHBlZFxuICAgICAgICAgICAqIDMuIE9yaWdpbmFsXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBJZiBubyBtYXNrZWQgb3IgY3JvcHBlZCBpbWFnZSBpcyBhdmFpbGFibGUgdGhlbiBkaXJlY3RseSBzZXQgT3JpZ2luYWwgSW1hZ2VcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KFxuICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDYW1lcmFGaWVsZEtleVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZSA9IGZpZWxkLnByb3BlcnRpZXM/LmlzTWFza2VkSW1hZ2VcbiAgICAgICAgICAgID8gZT8ubWFza2VkSW1hZ2UgPz8gZT8ub3JpZ2luYWxJbWFnZVxuICAgICAgICAgICAgOiBmaWVsZC5wcm9wZXJ0aWVzPy5pc0Nyb3BwZWRJbWFnZVxuICAgICAgICAgICAgICA/IGU/LmNyb3BwZWRJbWFnZSA/PyBlPy5vcmlnaW5hbEltYWdlXG4gICAgICAgICAgICAgIDogZT8ub3JpZ2luYWxJbWFnZTtcblxuICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTWVkaWEoaW1hZ2UpO1xuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuV0FJVF9GT1JfS1dJS0lEX0NBTUVSQV9UT19MT0FEKTsgLy8gRGVsYXkgaXMgYWRkZWQgZHVlIHRvIGlzc3VzIHdpdGggS3dpa0lEIENhbWVyYSBub3QgYmVpbmcgYWJsZSB0byBoYW5kbGUgdG8gZmFzdCBwcm9jZXNzaW5nLlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJSRUNPUkRcIjpcbiAgICAgICAgdGhpcy5hY3RpdmVDYW1lcmFWaWRlbyA9IFwiXCI7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogUHJpb3JpdHkgb2YgSW1hZ2UgdG8gU2V0IGZvciBDb25maWcgQmFzZWRcbiAgICAgICAgICAgKiAxLiBPcmlnaW5hbFxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkoXG4gICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNhbWVyYUZpZWxkS2V5XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHZpZGVvID0gZT8ub3JpZ2luYWxWaWRlbztcblxuICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTWVkaWEodmlkZW8pO1xuXG4gICAgICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuV0FJVF9GT1JfS1dJS0lEX0NBTUVSQV9UT19MT0FEKTsgLy8gRGVsYXkgaXMgYWRkZWQgZHVlIHRvIGlzc3VzIHdpdGggS3dpa0lEIENhbWVyYSBub3QgYmVpbmcgYWJsZSB0byBoYW5kbGUgdG8gZmFzdCBwcm9jZXNzaW5nLlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0NhbWVyYUJhY2soZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIHRoaXMuYWN0aXZlQ2FtZXJhRmllbGRLZXkpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0NBTUVSQV9CQUNLX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tDYW1lcmFDbG9zZShlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgdGhpcy5hY3RpdmVDYW1lcmFGaWVsZEtleSk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQ0FNRVJBX0NMT1NFX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Q2FtZXJhKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGZpbGVzIGFycmF5IHdpdGggdGhlIG5ldyBmaWxlIGFuZCBpdCdzIHN0YXRlIGFuZCByZXNwb25zZSBmcm9tIHRoZSBhcGkgb2YgdXBsb2FkaW5nIHRoZSBmaWxlLlxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICB1cGRhdGVGaWxlcyhmaWxlOiBhbnksIHN0YXRlOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsZVdpdGhTdGF0ZSA9IG1lcmdlT2JqZWN0cyhmaWxlIGFzIGFueSwgeyBzdGF0ZSB9KTtcblxuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBrZXkpO1xuXG4gICAgaWYgKGZpZWxkLnByb3BlcnRpZXM/Lm11bHRpcGxlKSB7XG4gICAgICAvLyBJZiBmaWVsZC5wcm9wZXJ0aWVzPy5tdWx0aXBsZSBpcyB0cnVlLCBpdCBtZWFucyBtdWx0aXBsZSBmaWxlcyBhcmUgYWxsb3dlZCBmb3IgdGhpcyBmaWVsZC5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgZmlsZXMgYXJyYXkgZm9yIHRoZSBzcGVjaWZpYyBrZXkgd2l0aCB0aGUgbmV3IGZpbGUuXG4gICAgICBjb25zdCB1cGRhdGVkRmlsZXMgPSBbXG4gICAgICAgIC4uLnRoaXMuZmlsZXNba2V5XS5maWx0ZXIoXG4gICAgICAgICAgKGYpID0+IGYubmFtZSAhPT0gZmlsZVdpdGhTdGF0ZS5uYW1lIHx8IGYuc2l6ZSAhPT0gZmlsZVdpdGhTdGF0ZS5zaXplXG4gICAgICAgICksXG4gICAgICAgIGZpbGVXaXRoU3RhdGVcbiAgICAgIF07XG5cbiAgICAgIC8vIEFwcGx5IHRoZSBmaWx0ZXJEdXBsaWNhdGVzRmlsZXMgZnVuY3Rpb24gdG8gZW5zdXJlIHVuaXF1ZW5lc3MgaW4gdGhlIHVwZGF0ZWRGaWxlcyBhcnJheS5cbiAgICAgIHRoaXMuZmlsZXNba2V5XSA9IGZpbHRlckR1cGxpY2F0ZXNGaWxlcyh1cGRhdGVkRmlsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBmaWVsZC5wcm9wZXJ0aWVzPy5tdWx0aXBsZSBpcyBmYWxzZSwgb25seSBvbmUgZmlsZSBpcyBhbGxvd2VkIGZvciB0aGlzIGZpZWxkLlxuICAgICAgLy8gUmVwbGFjZSB0aGUgZXhpc3RpbmcgZmlsZXMgYXJyYXkgZm9yIHRoZSBzcGVjaWZpYyBrZXkgd2l0aCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuZXcgZmlsZS5cbiAgICAgIHRoaXMuZmlsZXNba2V5XSA9IFtmaWxlV2l0aFN0YXRlXTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGZvcm1EYXRhIGFuZCBmb3JtR3JvdXAgY29udHJvbHMgZm9yIHRoZSBzcGVjaWZpYyBrZXkgd2l0aCB0aGUgbm9ybWFsRmlsZXMgYXJyYXkuXG4gICAgY29uc3Qgbm9ybWFsRmlsZXMgPSB0aGlzLmZpbGVzW2tleV0uZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICByZXR1cm4gZmlsZS5zdGF0ZSA9PT0gXCJOT1JNQUxcIjtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybURhdGFba2V5XSA9IG5vcm1hbEZpbGVzO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0ucGF0Y2hWYWx1ZShub3JtYWxGaWxlcywge1xuICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgIG9ubHlTZWxmOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICB7XG4gICAgICAgIFtrZXldOiBub3JtYWxGaWxlc1xuICAgICAgfSxcbiAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgKTtcblxuICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgaWYgKFxuICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0NIQU5HRVwiKVxuICAgICkge1xuICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICB7XG4gICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICk7XG5cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAge1xuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBhcGkgdXBsb2FkIG1vY2tpbmcgbWV0aG9kLiBTZXQncyB0byBsb2FkaW5nIGF0IGZpcnN0IGF0IHBvaW50IHdoZW4gQVBJIGlzIGNhbGxlZCBhbmQgdGhlbiBjaGFuZ2VzIHRoZSBzdGF0dXMgdG8gcmFuZG9tIHN0YXR1cyBhZnRlciAyIHNlY29uZHMgb2YgZGVsYXkgc2hvd2luZyBhIG1vY2tlZCByZXNwb25zZSBmcm9tIEFQSS5cbiAgICovXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdXBsb2FkRmlsZShmaWVsZDogYW55LCBmaWxlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5GSUxFOlxuICAgICAgICB0aGlzLnVwZGF0ZUZpbGVzKGZpbGUsIFwiTE9BRElOR1wiLCBmaWVsZC5rZXkpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVRVUVTVF9VUExPQURfRklMRSwge1xuICAgICAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgcmVxdWVzdDogZ2V0T2JqZWN0RGVlcENvcHkoe1xuICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgICAgIHdlYmtpdFJlbGF0aXZlUGF0aDogZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGhcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBY3R1YWwgQVBJIENhbGxcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm9uQ2xpY2tBcGlDYWxsLmVtaXQoe1xuICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgd2Via2l0UmVsYXRpdmVQYXRoOiBmaWxlLndlYmtpdFJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsZXMoZmlsZSwgXCJFUlJPUlwiLCBmaWVsZC5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkNBUFRVUkU6IHtcbiAgICAgICAgLy8gQWN0dWFsIEFQSSBDYWxsXG5cbiAgICAgICAgbGV0IG9jclBheWxvYWQ6IGFueSA9IHt9O1xuICAgICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGZpZWxkPy5wcm9wZXJ0aWVzPy5mZWF0dXJlcz8ub2NyKSkge1xuICAgICAgICAgIG9jclBheWxvYWQgPSBmaWVsZC5wcm9wZXJ0aWVzLmZlYXR1cmVzLm9jcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhY2VtYXRjaFBheWxvYWQ6IGFueSA9IHt9O1xuICAgICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGZpZWxkPy5wcm9wZXJ0aWVzPy5mZWF0dXJlcz8uZmFjZW1hdGNoKSkge1xuICAgICAgICAgIGZhY2VtYXRjaFBheWxvYWQuaXNFbmFibGVkID1cbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMuZmVhdHVyZXMuZmFjZW1hdGNoLmlzRW5hYmxlZDtcblxuICAgICAgICAgIGZhY2VtYXRjaFBheWxvYWQuaXNGYWNlbWF0Y2hGcm9tU2VydmVyID1cbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMuZmVhdHVyZXMuZmFjZW1hdGNoLmlzRmFjZW1hdGNoRnJvbVNlcnZlcjtcblxuICAgICAgICAgIGZhY2VtYXRjaFBheWxvYWQuaW1hZ2VzID0gW107XG4gICAgICAgICAgY29uc3QgZmFjZW1hdGNoU291cmNlcyA9IGZpZWxkLnByb3BlcnRpZXMuZmVhdHVyZXMuZmFjZW1hdGNoLnNvdXJjZXM7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGZhY2VtYXRjaFNvdXJjZUNvbmZpZyBvZiBmYWNlbWF0Y2hTb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKHtcbiAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBmYWNlbWF0Y2hTb3VyY2VDb25maWdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZhY2VtYXRjaFNvdXJjZSA9IHtcbiAgICAgICAgICAgICAga2V5OiBmYWNlbWF0Y2hTb3VyY2VDb25maWcuaWQsXG4gICAgICAgICAgICAgIHZhbHVlOiBzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZmFjZW1hdGNoUGF5bG9hZC5pbWFnZXMucHVzaChmYWNlbWF0Y2hTb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdhdGVybWFya1BheWxvYWQ6IGFueSA9IHt9O1xuICAgICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGZpZWxkPy5wcm9wZXJ0aWVzPy5mZWF0dXJlcz8ud2F0ZXJtYXJrKSkge1xuICAgICAgICAgIHdhdGVybWFya1BheWxvYWQuaXNFbmFibGVkID1cbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMuZmVhdHVyZXMud2F0ZXJtYXJrLmlzRW5hYmxlZDtcblxuICAgICAgICAgIHdhdGVybWFya1BheWxvYWQuaXNXYXRlcm1hcmtGcm9tU2VydmVyID1cbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMuZmVhdHVyZXMud2F0ZXJtYXJrLmlzV2F0ZXJtYXJrRnJvbVNlcnZlcjtcblxuICAgICAgICAgIHdhdGVybWFya1BheWxvYWQuZGF0YSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHdhdGVybWFya1NvdXJjZXMgPSBmaWVsZC5wcm9wZXJ0aWVzLmZlYXR1cmVzLndhdGVybWFyay5zb3VyY2VzO1xuXG4gICAgICAgICAgd2F0ZXJtYXJrUGF5bG9hZC5jb25maWcgPSBmaWVsZC5wcm9wZXJ0aWVzLmZlYXR1cmVzLndhdGVybWFyay5zb3VyY2VzO1xuXG4gICAgICAgICAgZm9yIChjb25zdCB3YXRlcm1hcmtTb3VyY2VDb25maWcgb2Ygd2F0ZXJtYXJrU291cmNlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZSh7XG4gICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgd2F0ZXJtYXJrU291cmNlQ29uZmlnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB3YXRlcm1hcmtTb3VyY2UgPSB7XG4gICAgICAgICAgICAgIGtleTogd2F0ZXJtYXJrU291cmNlQ29uZmlnLmlkLFxuICAgICAgICAgICAgICB2YWx1ZTogc291cmNlVmFsdWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHdhdGVybWFya1BheWxvYWQuZGF0YS5wdXNoKHdhdGVybWFya1NvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW1hZ2VVcGxvYWRQYXlsb2FkID0ge1xuICAgICAgICAgIGltYWdlOiBmaWxlLFxuICAgICAgICAgIC4uLihvY3JQYXlsb2FkPy5pc0VuYWJsZWQgJiYge1xuICAgICAgICAgICAgb2NyOiBvY3JQYXlsb2FkXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uKGZhY2VtYXRjaFBheWxvYWQ/LmlzRW5hYmxlZCAmJiB7XG4gICAgICAgICAgICBmYWNlbWF0Y2g6IGZhY2VtYXRjaFBheWxvYWRcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi4od2F0ZXJtYXJrUGF5bG9hZD8uaXNFbmFibGVkICYmIHtcbiAgICAgICAgICAgIHdhdGVybWFyazogd2F0ZXJtYXJrUGF5bG9hZFxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9JTUFHRSwge1xuICAgICAgICAgIGZpZWxkX2tleTogZmllbGQua2V5LFxuICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgcmVxdWVzdDogaW1hZ2VVcGxvYWRQYXlsb2FkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5vbkNsaWNrQXBpQ2FsbC5lbWl0KHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IGltYWdlVXBsb2FkUGF5bG9hZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkZhaWxlZCB0byB1cGxvYWQgaW1hZ2UgdG8gc2VydmVyIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5SRUNPUkQ6XG4gICAgICAgIC8vIEFjdHVhbCBBUEkgQ2FsbFxuXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVRVUVTVF9VUExPQURfVklERU8sIHtcbiAgICAgICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHZpZGVvOiBmaWxlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdCh7XG4gICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIHZpZGVvOiBmaWxlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHVwbG9hZCB2aWRlbyB0byBzZXJ2ZXIhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrRm9ybUZpZWxkQnV0dG9uKGZpZWxkOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGZpZWxkLmhpZGRlbikge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtmaWVsZC5rZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuZGVkRm9ybURhdGEgPSB0aGlzLmZvcm1GaWVsZHMucmVkdWNlKChyZXN1bHQsIGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQgJiYgIWZpZWxkLmhpZGRlbikge1xuICAgICAgICBjb25zdCBmaWVsZERhdGEgPSB7XG4gICAgICAgICAgW2ZpZWxkLmtleV06IHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IGlzRW1wdHlWYWx1ZShmb3JtRGF0YVtmaWVsZC5rZXldKSA/IFwiXCIgOiBmb3JtRGF0YVtmaWVsZC5rZXldLFxuICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRbZmllbGQua2V5XSA9IGZpZWxkRGF0YVtmaWVsZC5rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfQlVUVE9OX0NMSUNLLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBmaWVsZF9sYWJlbDogZmllbGQubGFiZWxcbiAgICB9KTtcblxuICAgIHRoaXMub25DbGlja0Zvcm1GaWVsZEJ1dHRvbi5lbWl0KHtcbiAgICAgIGNvbmZpZzogZmllbGQsXG4gICAgICBkYXRhOiBtZXJnZU9iamVjdHModGhpcy5mb3JtRGF0YSwgdGhpcy5wb3B1cEZvcm1EYXRhLCB0aGlzLnRhc2tEYXRhKSxcbiAgICAgIGV4dGVuZGVkRGF0YTogZXh0ZW5kZWRGb3JtRGF0YVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkxvY2F0aW9uUGVybWlzc2lvbihlOiBhbnkpIHtcbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gZGVmYXVsdFxuICAgIGZpZWxkLmFwaS5zdGF0dXMudmFsdWUgPSBFQXBpU3RhdHVzVHlwZS5MT0FESU5HO1xuICAgIGZpZWxkLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuICAgIHRoaXMuZmllbGRTaG93QXBpTG9hZGVyKGZpZWxkLmtleSk7XG5cbiAgICBpZiAoIWUucGVybWlzc2lvbikge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0xJVkVfTE9DQVRJT05fUEVSTUlTU0lPTl9FUlJPUiwge1xuICAgICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudG9nZ2xlUGVybWlzc2lvbkVycm9yTm90aWZpY2F0aW9uKHRydWUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlUGVybWlzc2lvbkVycm9yTm90aWZpY2F0aW9uKGZhbHNlKTtcbiAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuTE9DQVRJT05fUEVSTUlTU0lPTl9FUlJPUl9UT0dHTEUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fTElWRV9MT0NBVElPTl9QRVJNSVNTSU9OX1NVQ0NFU1MsIHtcbiAgICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gZGVmYXVsdFxuICAgICAgZmllbGQuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICBmaWVsZC5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICAgICAgdGhpcy5maWVsZEhpZGVBcGlMb2FkZXIoZmllbGQua2V5KTtcbiAgICB9LCBGT1JNX1ZJRVdfVElNRVJTLkxPQ0FUSU9OX1BFUk1JU1NJT05fUkVTRVRfQlVUVE9OX1NUQVRVUyk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tMaXZlTG9jYXRpb24oZTogYW55KSB7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19MSVZFX0xPQ0FUSU9OX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG5cbiAgICAvLyBzZXQgYnV0dG9uIHN0YXR1cyB0byBsb2FkaW5nXG4gICAgZmllbGQuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkxPQURJTkc7XG4gICAgZmllbGQuc2hvd0xvYWRlciA9IHRydWU7XG5cbiAgICB0aGlzLnNob3dBcGlMb2FkZXIoKTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICB7XG4gICAgICAgIFtlLmtleV06IGUudmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1EYXRhW2Uua2V5XSA9IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICBmaWVsZCxcbiAgICAgIGUudmFsdWVcbiAgICApO1xuXG4gICAgdGhpcy5nZXRVbnNhdmVkRGF0YVN0YXRlLmVtaXQodHJ1ZSk7XG5cbiAgICBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJwcm9wZXJ0aWVzXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5wcm9wZXJ0aWVzLCBcImlzR2V0TG9jYXRpb25Gcm9tTGF0TG9uZ1wiKSAmJlxuICAgICAgZmllbGQucHJvcGVydGllcy5pc0dldExvY2F0aW9uRnJvbUxhdExvbmdcbiAgICApIHtcbiAgICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdCh7XG4gICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgLi4uZS5saXZlTG9jYXRpb25cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuVElNRVJfMzAwKTsgLy8gMTAwMCBtcyA9IDEgc2VjXG4gICAgICB9KTtcblxuICAgICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gc3VjY2Vzc1xuICAgICAgZmllbGQuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLlNVQ0NFU1M7XG4gICAgICBmaWVsZC5zaG93TG9hZGVyID0gZmFsc2U7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICAgICkge1xuICAgICAgICBjb25zdCBydWxlRW5naW5lID0gbmV3IFJ1bGVFbmdpbmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRE9NIEV2ZW50IEhhbmRsZXJzXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0S2V5VmFsdWUoZTogYW55KSB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgW2Uua2V5XTogZS52YWx1ZVxuICAgICAgfSxcbiAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgKTtcblxuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG4gICAgdGhpcy5mb3JtRGF0YVtlLmtleV0gPSBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgZmllbGQsXG4gICAgICBlLnZhbHVlXG4gICAgKTtcblxuICAgIHRoaXMuZ2V0VW5zYXZlZERhdGFTdGF0ZS5lbWl0KHRydWUpO1xuXG4gICAgaWYgKFxuICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdGlvblwiKSAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0NIQU5HRVwiKVxuICAgICkge1xuICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICB7XG4gICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICk7XG5cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHJ1bGVFbmdpbmUucnVuKGZpZWxkLnZhbGlkYXRpb24pO1xuICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAge1xuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiT05fQ0hBTkdFXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrUmVzZXRGb3JtRmllbGRzKGU6IGFueSwgZmllbGQ6IFRGaWVsZFRpdGxlKSB7XG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX1JFU0VUX0JVVFRPTl9DTElDSywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZC5rZXlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc2V0Rm9ybUZpZWxkcyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdFBhdGhFeGlzdHMoZmllbGQsIFwicmVzZXQuZmllbGRzXCIpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZC5yZXNldC5maWVsZHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBmLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc2V0RmllbGQgPSBnZXRGb3JtRmllbGRCeUtleShcbiAgICAgICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMuZmllbGRLZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogcmVzZXRGaWVsZCxcbiAgICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGVja09iamVjdFBhdGhFeGlzdHMoZmllbGQsIFwicmVzZXQuZmllbGRHcm91cHNcIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBmZyBvZiBmaWVsZC5yZXNldC5maWVsZEdyb3Vwcykge1xuICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGZnLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmZy5ncm91cEtleV0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzZXRGaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgRklFTERfQ09ORklHOiByZXNldEZpZWxkLFxuICAgICAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLnRha2VBY3Rpb25PbkZpZWxkR3JvdXAuYmluZCh0aGlzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgQllQQVNTX1JFU0VUX0NPTkZJUk0gPSBmaWVsZD8ucHJvcGVydGllcz8uYnlwYXNzUmVzZXRDb25maXJtYXRpb247XG5cbiAgICBpZiAoIUJZUEFTU19SRVNFVF9DT05GSVJNKSB7XG4gICAgICBjb25zdCBDT05GSVJNX1JFU0VUID0gd2luZG93LmNvbmZpcm0oXG4gICAgICAgIFwiVGhpcyBhY3Rpb24gd2lsbCByZXNldCBhbGwgdGhlIGZpZWxkcy4gRG8geW91IHN0aWxsIHdhbnQgdG8gY29udGludWU/XCJcbiAgICAgICk7XG5cbiAgICAgIGlmIChDT05GSVJNX1JFU0VUKSB7XG4gICAgICAgIHJlc2V0Rm9ybUZpZWxkcygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNldEZvcm1GaWVsZHMoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZUZpZWxkQXBpQ2FsbChmaWVsZDogVEZpZWxkQXBpQ2FsbCwgYXBpOiBhbnkpIHtcbiAgICBhcGkgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBcGlDYWxsKGFwaSwge1xuICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgIEFQSV9DT05GSUc6IGFwaSxcbiAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNWYWxpZFJlcXVlc3RIZWFkZXJzQW5kQm9keShhcGkpKSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuYXBpLCBcInJlcXVlc3RcIikpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFtmaWVsZC5rZXldOiBhcGkucmVzcG9uc2UudmFsdWVcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFtmaWVsZC5rZXldOiBhcGkucmVzcG9uc2UudmFsdWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcbiAgICAgICAge1xuICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgQVBJX0NPTkZJRzogYXBpLFxuICAgICAgICAgIEFQSV9SRVNQT05TRTogYXBpLnJlc3BvbnNlLFxuICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgYXBpID0gYXdhaXQgYXBpcy52YWxpZGF0ZVJlc3BvbnNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaWVsZC5hcGkuc3RhdHVzLnZhbHVlID0gRUFwaVN0YXR1c1R5cGUuRkFJTEVEO1xuICAgICAgICAoZmllbGQgYXMgYW55KS5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICB9LCBGT1JNX1ZJRVdfVElNRVJTLlRJTUVSXzUwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZmllbGQsIGFwaSB9O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVBcGlDYWxsKGFwaTogYW55KSB7XG4gICAgYXBpID0gYXdhaXQgdGhpcy5leGVjdXRlQXBpQ2FsbChhcGksIHtcbiAgICAgIEZPUk1fQ09ORklHOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICBBUElfQ09ORklHOiBhcGksXG4gICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICB9KTtcblxuICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcbiAgICAgIHtcbiAgICAgICAgRk9STV9DT05GSUc6IHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgQVBJX0NPTkZJRzogYXBpLFxuICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgIH0sXG4gICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5pc1ZhbGlkUmVxdWVzdEhlYWRlcnNBbmRCb2R5KGFwaSkpIHtcbiAgICAgIGFwaSA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGFwaSB9O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBleGVjdXRlQXBpQ2FsbChhcGk6IGFueSwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhvYmplY3QsIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpKTtcblxuICAgIGFwaSA9IGF3YWl0IGFwaXMuc2V0VXJsKCk7XG4gICAgYXBpID0gYXdhaXQgYXBpcy5zZXRSZXF1ZXN0SGVhZGVycygpO1xuICAgIGFwaSA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXF1ZXN0SGVhZGVycygpO1xuICAgIGFwaSA9IGF3YWl0IGFwaXMuc2V0UmVxdWVzdEJvZHkoKTtcbiAgICBhcGkgPSBhd2FpdCBhcGlzLnZhbGlkYXRlUmVxdWVzdEJvZHkoKTtcblxuICAgIGxldCBhcGlDYWxsUmVzcG9uc2U6IGFueSA9IHt9O1xuICAgIGxldCBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlO1xuXG4gICAgaWYgKHRoaXMuaXNWYWxpZFJlcXVlc3RIZWFkZXJzQW5kQm9keShhcGkpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFwaS5yZXF1ZXN0LnVybCwgXCJ0eXBlXCIpICYmXG4gICAgICAgIGFwaS5yZXF1ZXN0LnVybC50eXBlID09PSBFQXBpUmVxdWVzdFVybFR5cGUuTU9DS1xuICAgICAgKSB7XG4gICAgICAgIGFwaUNhbGxSZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGFwaS5yZXF1ZXN0LnVybC5wcm9wcy5tb2NrZWREYXRhKTtcbiAgICAgICAgICB9LCBGT1JNX1ZJRVdfVElNRVJTLldBSVRfRk9SX0FQSV9NT0NLX0RBVEEpOyAvLyAxMDAwIG1zID0gMSBzZWNcbiAgICAgICAgfSk7XG4gICAgICAgIGFwaUNhbGxSZXNwb25zZVN0YXR1c0NvZGUgPVxuICAgICAgICAgIGFwaS5yZXF1ZXN0LnVybC5wcm9wcz8uc3RhdHVzQ29kZSA/P1xuICAgICAgICAgIEZPUk1fVklFV19USU1FUlMuQVBJX01PQ0tfU1VDQ0VTU19TVEFUVVNfQ09ERTsgLy8gRGVmYXVsdCBTdGF0dXMgQ29kZSBmb3IgTW9ja2VkIEFQSXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gYXBpLnJlcXVlc3QudXJsLnZhbHVlO1xuICAgICAgICBjb25zdCBtZXRob2Q6IHN0cmluZyA9IGFwaS5yZXF1ZXN0Py5tZXRob2QgPz8gXCJQT1NUXCI7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi4oYXBpLnJlcXVlc3Q/LmhlYWRlcnM/LnZhbHVlIHx8IHt9KVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAvLyBUcmlnZ2VyIGxvZ3MgZm9yIEFQSSByZXF1ZXN0IHdpdGggdGhlIG1ldGhvZCBhbmQgQVBJIGtleVxuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVRVUVTVCwge1xuICAgICAgICAgICAgZm9ybV9hcGlfbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBmb3JtX2FwaV9rZXk6IGFwaT8uYXBpS2V5ID8/IFwiXCJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgbmVlZHMgdG8gYmUgZGVjcnlwdGVkXG4gICAgICAgICAgICBjb25zdCBpc0RlY3J5cHRSZXNwb25zZTogYm9vbGVhbiA9IGFwaT8ucmVzcG9uc2U/LmlzU2VjdXJlID8/IGZhbHNlO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHNpZ25hdHVyZSBuZWVkcyB0byBiZSB2ZXJpZmllZFxuICAgICAgICAgICAgY29uc3QgaXNWZXJpZnlTaWduYXR1cmU6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICBhcGk/LnJlc3BvbnNlPy5pc1ZlcmlmeVNpZ25hdHVyZSA/PyBmYWxzZTtcblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgQVBJIGNhbGwgZm9yIEdFVCBtZXRob2RcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQXBpQ2FsbDogYW55ID1cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtVmlld0FwaVNlcnZpY2UuZXhlY3V0ZUFwaUNhbGwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICAgICAge30sIC8vIE5vIHJlcXVlc3QgYm9keSBmb3IgR0VUIG1ldGhvZFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlzRW5jcnlwdFJlcXVlc3RCb2R5IGlzIG5vdCBhcHBsaWNhYmxlIGZvciBHRVQgbWV0aG9kXG4gICAgICAgICAgICAgICAgaXNEZWNyeXB0UmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgaXNWZXJpZnlTaWduYXR1cmVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFwaUNhbGxSZXNwb25zZSA9IGV4ZWN1dGVkQXBpQ2FsbC5kYXRhO1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlU3RhdHVzQ29kZSA9IGV4ZWN1dGVkQXBpQ2FsbC5zdGF0dXM7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYW55IGVycm9yc1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlID0ge307XG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlID1cbiAgICAgICAgICAgICAgRk9STV9WSUVXX1RJTUVSUy5BUElfTU9DS19FUlJPUl9TVEFUVVNfQ09ERTsgLy8gSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHJlcXVlc3QgYm9keSBmcm9tIHRoZSBBUEkgY29uZmlndXJhdGlvblxuICAgICAgICAgIGNvbnN0IGJvZHk6IGFueSA9IGFwaT8ucmVxdWVzdD8uYm9keT8udmFsdWUgPz8ge307XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdCBib2R5IG5lZWRzIHRvIGJlIGVuY3J5cHRlZFxuICAgICAgICAgIGNvbnN0IGlzRW5jcnlwdFJlcXVlc3RCb2R5OiBib29sZWFuID1cbiAgICAgICAgICAgIGFwaT8ucmVxdWVzdD8uYm9keT8uaXNTZWN1cmUgPz8gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIG5lZWRzIHRvIGJlIGRlY3J5cHRlZFxuICAgICAgICAgIGNvbnN0IGlzRGVjcnlwdFJlc3BvbnNlOiBib29sZWFuID0gYXBpPy5yZXNwb25zZT8uaXNTZWN1cmUgPz8gZmFsc2U7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3BvbnNlIHNpZ25hdHVyZSBuZWVkcyB0byBiZSB2ZXJpZmllZFxuICAgICAgICAgIGNvbnN0IGlzVmVyaWZ5U2lnbmF0dXJlOiBib29sZWFuID1cbiAgICAgICAgICAgIGFwaT8ucmVzcG9uc2U/LmlzVmVyaWZ5U2lnbmF0dXJlID8/IGZhbHNlO1xuXG4gICAgICAgICAgLy8gVHJpZ2dlciBsb2dzIGZvciBBUEkgcmVxdWVzdCB3aXRoIHRoZSBtZXRob2QgYW5kIEFQSSBrZXlcbiAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICAgIGZvcm1fYXBpX21ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgZm9ybV9hcGlfa2V5OiBhcGk/LmFwaUtleSA/PyBcIlwiLFxuICAgICAgICAgICAgZm9ybV9hcGlfcmVxdWVzdF9lbmNyeXB0ZWQ6IGlzRW5jcnlwdFJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgLi4uKCFpc0VuY3J5cHRSZXF1ZXN0Qm9keSAmJiB7XG4gICAgICAgICAgICAgIGZvcm1fYXBpX3JlcXVlc3RfYm9keTogYm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBBUEkgY2FsbCBmb3IgUE9TVCBtZXRob2RcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQXBpQ2FsbDogYW55ID1cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mb3JtVmlld0FwaVNlcnZpY2UuZXhlY3V0ZUFwaUNhbGwoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBpc0VuY3J5cHRSZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICBpc0RlY3J5cHRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYXBpQ2FsbFJlc3BvbnNlID0gZXhlY3V0ZWRBcGlDYWxsLmRhdGE7XG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2VTdGF0dXNDb2RlID0gZXhlY3V0ZWRBcGlDYWxsLnN0YXR1cztcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3JzXG4gICAgICAgICAgICBhcGlDYWxsUmVzcG9uc2UgPSB7fTtcbiAgICAgICAgICAgIGFwaUNhbGxSZXNwb25zZVN0YXR1c0NvZGUgPVxuICAgICAgICAgICAgICBGT1JNX1ZJRVdfVElNRVJTLkFQSV9NT0NLX0VSUk9SX1NUQVRVU19DT0RFOyAvLyBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBpLnJlc3BvbnNlID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgIGFwaS5yZXNwb25zZSxcbiAgICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgICBhcGlDYWxsUmVzcG9uc2VcbiAgICAgICk7XG5cbiAgICAgIGFwaS5yZXNwb25zZSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICBhcGkucmVzcG9uc2UsXG4gICAgICAgIFwic3RhdHVzXCIsXG4gICAgICAgIGFwaUNhbGxSZXNwb25zZVN0YXR1c0NvZGVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BUElfUkVTUE9OU0UsIHtcbiAgICAgICAgZm9ybV9hcGlfa2V5OiBhcGk/LmFwaUtleSA/PyBcIlwiLFxuICAgICAgICBmb3JtX2FwaV9yZXNwb25zZV9lbmNyeXB0ZWQ6IGFwaT8ucmVzcG9uc2U/LmlzU2VjdXJlID8/IGZhbHNlLFxuICAgICAgICAuLi4oKCFhcGk/LnJlc3BvbnNlPy5pc1NlY3VyZSA/PyBmYWxzZSkgJiYge1xuICAgICAgICAgIGZvcm1fYXBpX3Jlc3BvbnNlX2JvZHk6IGFwaUNhbGxSZXNwb25zZSA/PyB7fVxuICAgICAgICB9KSxcbiAgICAgICAgZm9ybV9hcGlfc3RhdHVzX2NvZGU6IGFwaUNhbGxSZXNwb25zZVN0YXR1c0NvZGVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX1JFUVVFU1RfSU5WQUxJRCwge1xuICAgICAgICBmb3JtX2FwaV9rZXk6IGFwaT8uYXBpS2V5ID8/IFwiXCIsXG4gICAgICAgIGZvcm1fYXBpX3JlcXVlc3RfZW5jcnlwdGVkOiBhcGk/LnJlcXVlc3Q/LmJvZHk/LmlzU2VjdXJlID8/IGZhbHNlLFxuICAgICAgICAuLi4oKCFhcGk/LnJlcXVlc3Q/LmJvZHk/LmlzU2VjdXJlID8/IGZhbHNlKSAmJiB7XG4gICAgICAgICAgZm9ybV9hcGlfcmVxdWVzdF9ib2R5OiBhcGk/LnJlcXVlc3Q/LmJvZHk/LnZhbHVlID8/IHt9XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBpc1ZhbGlkUmVxdWVzdEhlYWRlcnNBbmRCb2R5KGFwaTogVEFwaSkge1xuICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID1cbiAgICAgIChhcGkucmVxdWVzdC5ib2R5Py52YWxpZGF0aW9uIGFzIFRFbmdpbmUgJiB7XG4gICAgICAgIGlzX3ZhbGlkOiBib29sZWFuO1xuICAgICAgfSkgfHxcbiAgICAgIChhcGkucmVxdWVzdC5ib2R5IGFzIGFueSAmIHtcbiAgICAgICAgaXNfdmFsaWQ6IGJvb2xlYW47XG4gICAgICB9KTtcbiAgICBjb25zdCBoZWFkZXJzVmFsaWRhdGlvbiA9XG4gICAgICAoYXBpLnJlcXVlc3QuaGVhZGVycz8udmFsaWRhdGlvbiBhcyBURW5naW5lICYge1xuICAgICAgICBpc192YWxpZDogYm9vbGVhbjtcbiAgICAgIH0pIHx8XG4gICAgICAoYXBpLnJlcXVlc3QuaGVhZGVycyBhcyBhbnkgJiB7XG4gICAgICAgIGlzX3ZhbGlkOiBib29sZWFuO1xuICAgICAgfSk7XG5cbiAgICBpZiAoIWJvZHlWYWxpZGF0aW9uICYmICFoZWFkZXJzVmFsaWRhdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAoYm9keVZhbGlkYXRpb24/LmlzX3ZhbGlkIHx8IGZhbHNlKSAmJlxuICAgICAgKGhlYWRlcnNWYWxpZGF0aW9uPy5pc192YWxpZCB8fCBmYWxzZSlcbiAgICApO1xuICB9XG5cbiAgc2hvd0FwaUxvYWRlcigpIHtcbiAgICB0aGlzLmxvYWRlclNlcnZpY2Uuc2hvdyh7XG4gICAgICBmdWxsc2NyZWVuOiB0cnVlLFxuICAgICAgbG9hZGVyVGV4dDogXCJQbGVhc2Ugd2FpdFwiXG4gICAgfSk7XG4gICAgdGhpcy52aWV3Rm9ybXNCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMudmlld0Zvcm1zQnV0dG9uLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUZvcm1CdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUZvcm1CdXR0b24uc2hvd0xvYWRlciA9IHRydWU7XG4gIH1cblxuICBoaWRlQXBpTG9hZGVyKCkge1xuICAgIHRoaXMubG9hZGVyU2VydmljZS5oaWRlKCk7XG4gICAgdGhpcy52aWV3Rm9ybXNCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbi5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlRm9ybUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUZvcm1CdXR0b24uc2hvd0xvYWRlciA9IGZhbHNlO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrQXBpQ2FsbChlOiBhbnkpIHtcbiAgICBjb25zdCBmaWVsZDogVEZpZWxkQXBpQ2FsbCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IEVGaWVsZFR5cGUuQVBJKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQVBJX0JVVFRPTl9DTElDSywge1xuICAgICAgICBmaWVsZF9rZXk6IGZpZWxkLmtleSxcbiAgICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNldCBidXR0b24gc3RhdHVzIHRvIGxvYWRpbmdcbiAgICAgIGZpZWxkLmFwaS5zdGF0dXMudmFsdWUgPSBFQXBpU3RhdHVzVHlwZS5MT0FESU5HO1xuICAgICAgZmllbGQuc2hvd0xvYWRlciA9IHRydWU7XG5cbiAgICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgQVBJIENhbGwgdGltZVxuXG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuYXBpLCBcInJlcXVlc3RcIikpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGaWVsZEFwaUNhbGwoZmllbGQsIGZpZWxkLmFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICAgIEFQSV9DT05GSUc6IHt9LFxuICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IGFwaXMuY2FsbE5leHRBcGkoZmllbGQuYXBpLmVudHJ5cG9pbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG9wdGltaXplIHRoZSBET00gdXBkYXRlIGJ5IEFuZ3VsYXIgZm9yIHVzaW5nICpuZ0ZvciBvbiBsYXJnZSBuby4gb2YgaXRlbXMuXG4gICAqIEBwYXJhbSBpbmRleCBudW1iZXJcbiAgICogQHBhcmFtIGl0ZW0gZmllbGRDb25maWdcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBnZXRVbmlxdWVJZGVudGlmaWVyKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0ua2V5O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrR29CYWNrKGU6IGFueSwgbW9kZTogVEZvcm1WaWV3R29CYWNrTW9kZSkge1xuICAgIGlmICh0aGlzLmZvcm1Db25maWcuc3RhdHVzID09PSBFRm9ybXNMaXN0U3RhdHVzLkNPTVBMRVRFRCkge1xuICAgICAgdGhpcy5vbkNsaWNrR29CYWNrLmVtaXQoe1xuICAgICAgICBjbGlja2VkOiB0cnVlLFxuICAgICAgICBtb2RlXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5mb3JtQ29uZmlnLnByb3BlcnRpZXMuaGVhZGVyLmJhY2tCdXR0b24uYnlwYXNzQ29uZmlybWF0aW9uIHx8XG4gICAgICB3aW5kb3cuY29uZmlybShcIllvdXIgZGF0YSB3aWxsIGJlIGxvc3QgaWYgeW91IGxlYXZlIHRoaXMgcGFnZSEgQ29udGludWU/XCIpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uQ2xpY2tHb0JhY2suZW1pdCh7XG4gICAgICAgIGNsaWNrZWQ6IHRydWUsXG4gICAgICAgIG1vZGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1ZpZXdGb3JtcyhlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLnN0YXR1cyA9PT0gRUZvcm1zTGlzdFN0YXR1cy5DT01QTEVURUQpIHtcbiAgICAgIHRoaXMub25DbGlja1ZpZXdGb3Jtcy5lbWl0KHtcbiAgICAgICAgY2xpY2tlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci52aWV3Rm9ybXNCdXR0b24uYnlwYXNzQ29uZmlybWF0aW9uIHx8XG4gICAgICB3aW5kb3cuY29uZmlybShcIllvdXIgZGF0YSB3aWxsIGJlIGxvc3QgaWYgeW91IGxlYXZlIHRoaXMgcGFnZSEgQ29udGludWU/XCIpXG4gICAgKSB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fVklFV19CVVRUT05fQ0xJQ0ssIHt9KTtcblxuICAgICAgdGhpcy5vbkNsaWNrVmlld0Zvcm1zLmVtaXQoe1xuICAgICAgICBjbGlja2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tTYXZlRm9ybShlOiBhbnkpIHtcbiAgICBpZiAoZSkge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1NBVkVfQlVUVE9OX0NMSUNLLCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19TQVZFX0FVVE8sIHt9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBGb3JtVmFsaWRhdGlvbigpLmdldEZvcm1GaWVsZHNJbnZhbGlkQ29udHJvbHMoXG4gICAgICB0aGlzLmZvcm1Hcm91cFxuICAgICk7XG5cbiAgICBsZXQgZmlyc3RGaWVsZFdpdGhFcnJvciA9IFwiXCI7XG5cbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgY29udHJvbHMpIHtcbiAgICAgIGlmIChjb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGNvbnRyb2wua2V5KTtcbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0VSUk9SX1NIT1csIHtcbiAgICAgICAgICBmaWVsZF9rZXk6IGNvbnRyb2wua2V5LFxuICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgZmllbGRfZXJyb3JfdHlwZXM6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2wua2V5XS5lcnJvcnNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaXJzdEZpZWxkV2l0aEVycm9yKSkge1xuICAgICAgICAgIGZpcnN0RmllbGRXaXRoRXJyb3IgPSBjb250cm9sLmtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5mb3JtRmllbGRzID0gc2hvd0Zvcm1GaWVsZEVycm9yKFxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2wua2V5XS5lcnJvcnMsXG4gICAgICAgIGNvbnRyb2wua2V5LFxuICAgICAgICBjb250cm9sLmludmFsaWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZShmaXJzdEZpZWxkV2l0aEVycm9yKSkge1xuICAgICAgdGhpcy5oYW5kbGVPblNjcm9sbFRvRmllbGQoZmlyc3RGaWVsZFdpdGhFcnJvcik7XG5cbiAgICAgIC8vIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24odHJ1ZSk7XG4gICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSk7XG4gICAgICAvLyB9LCAzMDAwKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgICAgIWZpZWxkLmhpZGRlbiAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9TQVZFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcnVsZUVuZ2luZSA9IG5ldyBSdWxlRW5naW5lKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICAgIFRBU0tfREFUQTogdGhpcy50YXNrRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgcnVsZUVuZ2luZS5ydW4oZmllbGQudmFsaWRhdGlvbik7XG5cbiAgICAgICAgaWYgKCFmaWVsZC52YWxpZGF0aW9uLmlzX3ZhbGlkKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbih0cnVlKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oZmFsc2UpO1xuICAgICAgICAgIH0sIEZPUk1fVklFV19USU1FUlMuSU5WQUxJRF9GSUVMRFNfU0FWRV9GT1JNX0VSUk9SX1RPR0dMRSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGZpZWxkLmhpZGRlbikge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtmaWVsZC5rZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuZGVkRm9ybURhdGEgPSB0aGlzLmZvcm1GaWVsZHMucmVkdWNlKChyZXN1bHQsIGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQgJiYgIWZpZWxkLmhpZGRlbikge1xuICAgICAgICBjb25zdCBmaWVsZERhdGEgPSB7XG4gICAgICAgICAgW2ZpZWxkLmtleV06IHtcbiAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IGlzRW1wdHlWYWx1ZShmb3JtRGF0YVtmaWVsZC5rZXldKSA/IFwiXCIgOiBmb3JtRGF0YVtmaWVsZC5rZXldLFxuICAgICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRbZmllbGQua2V5XSA9IGZpZWxkRGF0YVtmaWVsZC5rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICBPYmplY3Qua2V5cyhmb3JtRGF0YSkubWFwKChrZXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5VmFsdWUoZm9ybURhdGFba2V5XSkpIHtcbiAgICAgICAgZm9ybURhdGFba2V5XSA9IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUE9TVCBUYXNrc1xuICAgICAqIDEuIEFQSSBDYWxscy5cbiAgICAgKiAyLiBBbHRlciBEYXRhIFN0cnVjdHVyZS5cbiAgICAgKiAzLiBUcmlnZ2VyIGFuIEludGVybmFsIFBvcHVwIEZvcm0uXG4gICAgICogNC4gVVJMIFJlZGlyZWN0aW9uIG9yIG5ldyBvcGVuaW5nIG9mIFVSTCBpbiBleHRlcm5hbCB0YWIuXG4gICAgICovXG4gICAgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5mb3JtQ29uZmlnLCBcInRhc2tzXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmZvcm1Db25maWcudGFza3MsIFwicG9zdFwiKVxuICAgICkge1xuICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1RBU0tfUE9TVCwge30pO1xuXG4gICAgICBmb3IgKGNvbnN0IHBvc3RUYXNrIG9mIHRoaXMuZm9ybUNvbmZpZy50YXNrcy5wb3N0KSB7XG4gICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgVGFza3MoXG4gICAgICAgICAgcG9zdFRhc2ssXG4gICAgICAgICAge1xuICAgICAgICAgICAgRk9STV9DT05GSUc6IHRoaXMuZm9ybUNvbmZpZyxcbiAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICBDQU1FUkFfREFUQTogdGhpcy5jYW1lcmFEYXRhLFxuICAgICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0b3BUYXNrRXhlY3V0aW9uID0gZmFsc2U7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhwb3N0VGFzaywgXCJ3YWl0XCIpKSB7XG4gICAgICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IHBvc3RUYXNrLndhaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGFzay5leGVjdXRlKCk7XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgbmdPbkNoYW5nZXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBjb250aW51aW5nIHRvIHRoZSBuZXh0IHRhc2tcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndhaXRpbmdGb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBGT1JNX1ZJRVdfVElNRVJTLldBSVRfRk9SX0NIQU5HRVNfQkVGT1JFX01PVklOR19UT19ORVhUX1RBU0spO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5zdG9wVGFza0V4ZWN1dGlvbikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0b3BUYXNrRXhlY3V0aW9uIHx8IHRoaXMud2FpdGluZ0ZvckNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zdG9wVGFza0V4ZWN1dGlvbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMub25DbGlja1NhdmVGb3JtLmVtaXQoe1xuICAgICAgICBmb3JtQ29uZmlnOiB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgIGRhdGE6IG1lcmdlT2JqZWN0cyhcbiAgICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YVt0aGlzLmZvcm1Db25maWcua2V5XSxcbiAgICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgICB0aGlzLnBvcHVwRm9ybURhdGEsXG4gICAgICAgICAgdGhpcy50YXNrRGF0YVxuICAgICAgICApLFxuICAgICAgICBleHRlbmRlZERhdGE6IGV4dGVuZGVkRm9ybURhdGFcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFVuc2F2ZWREYXRhU3RhdGUuZW1pdChmYWxzZSk7XG4gICAgICB0aGlzLm9uQ2xpY2tTYXZlRm9ybS5lbWl0KHtcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgICBkYXRhOiBtZXJnZU9iamVjdHMoZm9ybURhdGEsIHRoaXMucG9wdXBGb3JtRGF0YSwgdGhpcy50YXNrRGF0YSksXG4gICAgICAgIGV4dGVuZGVkRGF0YTogZXh0ZW5kZWRGb3JtRGF0YVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkFwaVRpbWVyU3RvcChlOiBhbnkpIHtcbiAgICB0aGlzLmZpZWxkQXBpVGltZXJNZXNzYWdlSGlkZShlLmtleSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uU2Nyb2xsVG9GaWVsZChmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGFyZ2V0RmllbGQgPSB0aGlzLmZvcm1GaWVsZHNSZWZcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5maW5kKFxuICAgICAgICAoZm9ybUZpZWxkUmVmKSA9PiBmb3JtRmllbGRSZWYubmF0aXZlRWxlbWVudC5pZCA9PT0gYGZpZWxkXyR7ZmllbGRLZXl9YFxuICAgICAgKTtcblxuICAgIGlmICh0YXJnZXRGaWVsZCkge1xuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmZvcm1GaWVsZENvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgZmllbGRFbCA9IHRhcmdldEZpZWxkLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoXG4gICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgICBcInNjcm9sbFRvcFwiLFxuICAgICAgICBmaWVsZEVsLm9mZnNldFRvcCAtIGNvbnRhaW5lckVsLm9mZnNldFRvcFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzaG93RXJyb3JOb3RpZmljYXRpb24gPSBmYWxzZTtcblxuICBAbG9nTWV0aG9kXG4gIHRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHNob3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFcnJvck5vdGlmaWNhdGlvbiA9IHNob3c7XG4gIH1cblxuICBzaG93UGVybWlzc2lvbkVycm9yTm90aWZpY2F0aW9uID0gZmFsc2U7XG5cbiAgQGxvZ01ldGhvZFxuICB0b2dnbGVQZXJtaXNzaW9uRXJyb3JOb3RpZmljYXRpb24oc2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1Blcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvbiA9IHNob3c7XG4gIH1cblxuICAvLyBDb21wb25lbnQgSGVscGVyc1xuICBAbG9nTWV0aG9kXG4gIGZpZWxkSGlkZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBjb25zdCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XS5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9ISURFLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwSGlkZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkS2V5IG9mIHRoaXMuZmllbGRHcm91cHNbZmllbGRHcm91cF0pIHtcbiAgICAgIHRoaXMuZmllbGRIaWRlKGZpZWxkS2V5KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkU2hvdyhmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBjb25zdCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XS5oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfU0hPVywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGVcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cFNob3coZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkU2hvdyhmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZERpc2FibGUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scykpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5kaXNhYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gRUZpZWxkVHlwZS5CVVRUT04pIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0RJU0FCTEUsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkR3JvdXBEaXNhYmxlKGZpZWxkR3JvdXA6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmaWVsZEdyb3VwXSkge1xuICAgICAgdGhpcy5maWVsZERpc2FibGUoZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRFbmFibGUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gRUZpZWxkVHlwZS5CVVRUT04pIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GSUVMRF9FTkFCTEUsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkR3JvdXBFbmFibGUoZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRW5hYmxlKGZpZWxkS2V5KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkUmVzZXQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIC8vIEZpbmQgdGhlIGZpZWxkIGFuZCBpdHMgaW5kZXggaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBjb25zdCBmaWVsZEluZGV4ID0gZ2V0Rm9ybUZpZWxkSW5kZXhCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1Hcm91cFxuICAgIGNvbnN0IHJlc2V0VmFsdWUgPSBjb252ZXJ0Rm9ybUZpZWxkRW1wdHlWYWx1ZVRvS3dpa1VJRm9ybWF0KGZpZWxkKTtcblxuICAgIHRoaXMuZm9ybURhdGFbZmllbGRLZXldID0gcmVzZXRWYWx1ZTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucmVzZXQocmVzZXRWYWx1ZSwge1xuICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgIG9ubHlTZWxmOiB0cnVlXG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICBbZmllbGQua2V5XTogcmVzZXRWYWx1ZVxuICAgICAgfSxcbiAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgKTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XG4gICAgICBlbWl0RXZlbnQ6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IHRoZSBtZXNzYWdlcyBhbmQgZXJyb3JzIGZvciB0aGUgZmllbGRcbiAgICBmaWVsZCA9IHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5XQVJOSU5HLFxuICAgICAgbWVzc2FnZTogXCJcIlxuICAgIH0pO1xuICAgIGZpZWxkID0gcmVtb3ZlRm9ybUZpZWxkTWVzc2FnZShmaWVsZCwge1xuICAgICAgdHlwZTogRU1lc3NhZ2VUeXBlLlNVQ0NFU1MsXG4gICAgICBtZXNzYWdlOiBcIlwiXG4gICAgfSk7XG4gICAgdGhpcy5maWVsZEVycm9ySGlkZShmaWVsZEtleSwge1xuICAgICAgdHlwZTogRU1lc3NhZ2VUeXBlLkVSUk9SLFxuICAgICAgbWVzc2FnZTogXCJcIlxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgZm9ybUZpZWxkcyBhcnJheVxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkFQSToge1xuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkQXBpQ2FsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVGaWVsZFR5cGUuTElWRV9MT0NBVElPTjoge1xuICAgICAgICBjb25zdCBmaWVsZExpdmVMb2NhdGlvbiA9IGZpZWxkIGFzIFRGaWVsZExpdmVMb2NhdGlvbjtcbiAgICAgICAgZmllbGRMaXZlTG9jYXRpb24uYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkTGl2ZUxvY2F0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgZmllbGQuZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgZmllbGQuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX1JFU0VULCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwUmVzZXQoZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkUmVzZXQoZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRIaWRlQXBpTG9hZGVyKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgZm9ybUZpZWxkcyBhcnJheVxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkFQSToge1xuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRBcGlDYWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRUZpZWxkVHlwZS5MSVZFX0xPQ0FUSU9OOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTGl2ZUxvY2F0aW9uID0gZmllbGQgYXMgVEZpZWxkTGl2ZUxvY2F0aW9uO1xuICAgICAgICBmaWVsZExpdmVMb2NhdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZExpdmVMb2NhdGlvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRTaG93QXBpTG9hZGVyKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgZm9ybUZpZWxkcyBhcnJheVxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBFRmllbGRUeXBlLkFQSToge1xuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZEFwaUNhbGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFRmllbGRUeXBlLkxJVkVfTE9DQVRJT046IHtcbiAgICAgICAgY29uc3QgZmllbGRMaXZlTG9jYXRpb24gPSBmaWVsZCBhcyBURmllbGRMaXZlTG9jYXRpb247XG4gICAgICAgIGZpZWxkTGl2ZUxvY2F0aW9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGRMaXZlTG9jYXRpb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEh0bWwoZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBjb25zdCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIGZpZWxkID0gYXBwZW5kSHRtbE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkRXJyb3JTaG93KGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGhpZ2hsaWdodEZvcm1GaWVsZEVycm9yKGZpZWxkLCB0cnVlKTtcbiAgICBmaWVsZCA9IGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfRVJST1JfU0hPVywge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBmaWVsZF9lcnJvcl9tZXNzYWdlOiBtZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkRXJyb3JIaWRlKGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGhpZ2hsaWdodEZvcm1GaWVsZEVycm9yKGZpZWxkLCBmYWxzZSk7XG4gICAgZmllbGQgPSByZW1vdmVGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0VSUk9SX0hJREUsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgZmllbGRfZXJyb3JfbWVzc2FnZTogbWVzc2FnZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZE1lc3NhZ2VTaG93KGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgY29uc3QgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG5cbiAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRklFTERfTUVTU0FHRV9TSE9XLCB7XG4gICAgICBmaWVsZF9rZXk6IGZpZWxkS2V5LFxuICAgICAgZmllbGRfdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGZpZWxkX21lc3NhZ2U6IG1lc3NhZ2VcbiAgICB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRNZXNzYWdlSGlkZShmaWVsZEtleTogc3RyaW5nLCBtZXNzYWdlOiBUTWVzc2FnZSkge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSByZW1vdmVGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX01FU1NBR0VfSElERSwge1xuICAgICAgZmllbGRfa2V5OiBmaWVsZEtleSxcbiAgICAgIGZpZWxkX3R5cGU6IGZpZWxkLnR5cGUsXG4gICAgICBmaWVsZF9tZXNzYWdlOiBtZXNzYWdlXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaWVsZEFwaVRpbWVyTWVzc2FnZVNob3coXG4gICAgZmllbGRLZXk6IHN0cmluZyxcbiAgICB0aW1lcjogVEFwaVRpbWVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBzZXRBcGlUaW1lck1lc3NhZ2UoZmllbGQsIHRpbWVyKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX1NIT1csIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlLFxuICAgICAgZmllbGRfdGltZXI6IHRpbWVyXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaWVsZEFwaVRpbWVyTWVzc2FnZUhpZGUoZmllbGRLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGNvbnN0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBzZXRBcGlUaW1lck1lc3NhZ2UoZmllbGQsIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ2YWxpZGF0aW9uXCIpICYmXG4gICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fQVBJX1RJTUVSX1NUT1BcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHJ1bGVFbmdpbmUgPSBuZXcgUnVsZUVuZ2luZShcbiAgICAgICAge1xuICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgQ0FNRVJBX0RBVEE6IHRoaXMuY2FtZXJhRGF0YSxcbiAgICAgICAgICBUQVNLX0RBVEE6IHRoaXMudGFza0RhdGEsXG4gICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICApO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBydWxlRW5naW5lLnJ1bihmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJPTl9BUElfVElNRVJfU1RPUFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREUsIHtcbiAgICAgIGZpZWxkX2tleTogZmllbGRLZXksXG4gICAgICBmaWVsZF90eXBlOiBmaWVsZC50eXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldFZhbHVlKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGF3YWl0IHNvdXJjZS5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXG4gICAgKTtcbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sIHNvdXJjZVZhbHVlKTtcblxuICAgIG9iamVjdC5GSUVMRF9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkZJRUxEX0NPTkZJRztcblxuICAgIHRoaXMuZm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LkZPUk1fREFUQTtcbiAgICB0aGlzLnBhdGNoRm9ybUdyb3VwKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc291cmNlLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICB0aGlzLmV4dHJhRGF0YSA9IHNvdXJjZS5vYmplY3QuRVhUUkFfREFUQTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0RmllbGREZWZhdWx0VmFsdWUoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICApO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiRklFTERfQ09ORklHXCIsXG4gICAgICAgICAgICBwYXRoOiBcImRlZmF1bHQudmFsdWUudmFsdWVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJGT1JNX0RBVEFcIixcbiAgICAgICAgICAgIHBhdGg6IFN0cmluZyhhY3Rpb24ucHJvcHMuZmllbGRLZXkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNvdXJjZS5vYmplY3QuRklFTERfQ09ORklHO1xuICAgIHRoaXMuZm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LkZPUk1fREFUQTtcbiAgICB0aGlzLnBhdGNoRm9ybUdyb3VwKHRoaXMuZm9ybURhdGEpO1xuICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc291cmNlLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSBzb3VyY2Uub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICB0aGlzLmV4dHJhRGF0YSA9IHNvdXJjZS5vYmplY3QuRVhUUkFfREFUQTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0QXBpU3RhdHVzKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGFjdGlvbi5wcm9wcy5zdGF0dXM7XG5cbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJGSUVMRF9DT05GSUdcIixcbiAgICAgICAgICAgIHBhdGg6IFwiYXBpLnN0YXR1cy52YWx1ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNvdXJjZS5vYmplY3QuRklFTERfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlIZWFkZXJWYWx1ZShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKGFjdGlvbi5wcm9wcy5zb3VyY2UpO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogYHJlcXVlc3QuaGVhZGVycy52YWx1ZS4ke2FjdGlvbi5wcm9wcy5rZXl9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlIZWFkZXJWYWxpZGl0eShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhY3Rpb24ucHJvcHMudmFsaWQ7XG5cbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBFU291cmNlS2V5Lk9CSkVDVCxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogXCJBUElfQ09ORklHXCIsXG4gICAgICAgICAgICBwYXRoOiBcInJlcXVlc3QuaGVhZGVycy5pc192YWxpZFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlVmFsdWVcbiAgICApO1xuXG4gICAgb2JqZWN0LkFQSV9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkFQSV9DT05GSUc7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldEFwaUJvZHlWYWx1ZShhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKGFjdGlvbi5wcm9wcy5zb3VyY2UpO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogYHJlcXVlc3QuYm9keS52YWx1ZS4ke2FjdGlvbi5wcm9wcy5rZXl9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRBcGlCb2R5VmFsaWRpdHkoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYWN0aW9uLnByb3BzLnZhbGlkO1xuXG4gICAgc291cmNlLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICB7XG4gICAgICAgIGtleTogRVNvdXJjZUtleS5PQkpFQ1QsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgICBrZXk6IFwiQVBJX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogXCJyZXF1ZXN0LmJvZHkuaXNfdmFsaWRcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZVZhbHVlXG4gICAgKTtcblxuICAgIG9iamVjdC5BUElfQ09ORklHID0gc291cmNlLm9iamVjdC5BUElfQ09ORklHO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBzZXRGaWVsZFZhbGlkaXR5KGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IGFjdGlvbi5wcm9wcy52YWxpZDtcblxuICAgIHNvdXJjZS5zZXRWYWx1ZVRvU291cmNlKFxuICAgICAge1xuICAgICAgICBrZXk6IEVTb3VyY2VLZXkuT0JKRUNULFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIG9iamVjdDoge1xuICAgICAgICAgICAga2V5OiBcIkZJRUxEX0NPTkZJR1wiLFxuICAgICAgICAgICAgcGF0aDogXCJ2YWxpZGF0aW9uLmlzX3ZhbGlkXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzb3VyY2VWYWx1ZVxuICAgICk7XG5cbiAgICBvYmplY3QuRklFTERfQ09ORklHID0gc291cmNlLm9iamVjdC5GSUVMRF9DT05GSUc7XG4gICAgb2JqZWN0LkFQSV9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkFQSV9DT05GSUc7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHNldERyb3Bkb3duT3B0aW9ucyhhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgbGV0IHNvdXJjZVZhbHVlID0gYXdhaXQgc291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICApO1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMsIFwib3B0aW9uc1wiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy5vcHRpb25zLCBcImFwcGVuZFRvUGF0aFwiKSkge1xuICAgICAgICBjb25zdCBhcHBlbmRUb1BhdGggPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgIGFjdGlvbi5wcm9wcy5vcHRpb25zLmFwcGVuZFRvUGF0aC5zb3VyY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZShhcHBlbmRUb1BhdGgpKSB7XG4gICAgICAgICAgY29uc3QgYXBwZW5kVG9QYXRoU3RyID0gcmVwbGFjZVN0cmluZyhcbiAgICAgICAgICAgIGFwcGVuZFRvUGF0aC5tYXRjaChcbiAgICAgICAgICAgICAgYCR7YWN0aW9uLnByb3BzLm9wdGlvbnMuYXBwZW5kVG9QYXRoLmZpbHRlclNvdXJjZVZhbHVlfWBcbiAgICAgICAgICAgIClbMF0sXG4gICAgICAgICAgICBcIlteYS16QS1aMC05X11cIixcbiAgICAgICAgICAgIFwiX1wiXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG9wdGlvbnNQYXRoID0gYCR7YWN0aW9uLnByb3BzLm9wdGlvbnMucGF0aH0ke2FwcGVuZFRvUGF0aFN0cn1gO1xuICAgICAgICAgIHNvdXJjZVZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aChzb3VyY2VWYWx1ZSwgb3B0aW9uc1BhdGgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VyY2VWYWx1ZSA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgoXG4gICAgICAgICAgc291cmNlVmFsdWUsXG4gICAgICAgICAgYWN0aW9uLnByb3BzLm9wdGlvbnMucGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2Uuc2V0VmFsdWVUb1NvdXJjZShhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sIHNvdXJjZVZhbHVlKTtcblxuICAgIG9iamVjdC5GSUVMRF9DT05GSUcgPSBzb3VyY2Uub2JqZWN0LkZJRUxEX0NPTkZJRztcbiAgICB0aGlzLmZvcm1EYXRhID0gc291cmNlLm9iamVjdC5GT1JNX0RBVEE7XG4gICAgdGhpcy5hbGxGb3Jtc0RhdGEgPSBzb3VyY2Uub2JqZWN0LkFMTF9GT1JNU19EQVRBO1xuICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9IHNvdXJjZS5vYmplY3QuUFJFVklPVVNfRk9STV9EQVRBO1xuICAgIHRoaXMuZXh0cmFEYXRhID0gc291cmNlLm9iamVjdC5FWFRSQV9EQVRBO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBhcGlDYWxsKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBsZXQgYXBpQ29uZmlnID0gdGhpcy5mb3JtQ29uZmlnLmFwaXNbYWN0aW9uLnByb3BzLmZvcm1BcGlLZXldO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZUFwaUNhbGwoYXBpQ29uZmlnKTtcblxuICAgIGFwaUNvbmZpZyA9IHJlc3BvbnNlLmFwaTtcblxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgYGFwaXMuJHthY3Rpb24ucHJvcHMuZm9ybUFwaUtleX1gLFxuICAgICAgYXBpQ29uZmlnXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybURhdGEgPSBtZXJnZU9iamVjdHModGhpcy5mb3JtRGF0YSwge1xuICAgICAgW2FjdGlvbi5wcm9wcy5mb3JtQXBpS2V5XTogYXBpQ29uZmlnLnJlc3BvbnNlLnZhbHVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXBpQ29uZmlnO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBmaWVsZEFwaUNhbGwoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgY29uc3QgYXBpQ29uZmlnID0gYXdhaXQgdGhpcy5hcGlDYWxsKGFjdGlvbiwgb2JqZWN0KTtcblxuICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBmaWVsZE11bHRpcGxlQXBpQ2FsbHMoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRBcGlLZXkgPSBhY3Rpb24ucHJvcHMuYXBpS2V5O1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICBjb25zdCB7IGVuZHBvaW50cyB9ID0gZmllbGQuYXBpO1xuICAgIGNvbnN0IG5leHRBcGlJbmRleCA9IGVuZHBvaW50cy5maW5kSW5kZXgoXG4gICAgICAoYXBpOiBUQXBpRW5kcG9pbnQpID0+IGFwaS5hcGlLZXkgPT09IGVudHJ5cG9pbnRBcGlLZXlcbiAgICApO1xuICAgIGNvbnN0IGFwaUNvbmZpZyA9IGVuZHBvaW50c1tuZXh0QXBpSW5kZXhdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZUZpZWxkQXBpQ2FsbChmaWVsZCwgYXBpQ29uZmlnKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgIGZpZWxkID0gcmVzcG9uc2UuZmllbGQ7XG4gICAgZmllbGQuYXBpLmVuZHBvaW50c1tuZXh0QXBpSW5kZXhdID0gcmVzcG9uc2UuYXBpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBmaWVsZE11bHRpcGxlQXBpQ2FsbHNFbmQoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgIGxldCBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMgPSB7fTtcbiAgICBmaWVsZC5hcGkuZW5kcG9pbnRzLmZvckVhY2goKGFwaTogVEFwaUVuZHBvaW50KSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYXBpLnJlc3BvbnNlLCBcInZhbHVlXCIpKVxuICAgICAgICBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMgPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMsXG4gICAgICAgICAgYCR7YXBpLmFwaUtleX1gLFxuICAgICAgICAgIGFwaS5yZXNwb25zZS52YWx1ZVxuICAgICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgW2ZpZWxkLmtleV06IG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlc1xuICAgIH07XG4gICAgdGhpcy5wYXRjaEZvcm1Hcm91cCh0aGlzLmZvcm1EYXRhKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdGFza0FwaUNhbGwoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgY29uc3QgYXBpQ29uZmlnID0gYXdhaXQgdGhpcy5hcGlDYWxsKGFjdGlvbiwgb2JqZWN0KTtcblxuICAgIHRoaXMudGFza0RhdGEgPSBtZXJnZU9iamVjdHModGhpcy50YXNrRGF0YSwge1xuICAgICAgW2FjdGlvbi5wcm9wcy5mb3JtQXBpS2V5XTogYXBpQ29uZmlnLnJlc3BvbnNlLnZhbHVlXG4gICAgfSk7XG5cbiAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0aGlzLmhpZGVBcGlMb2FkZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdGFza011bHRpcGxlQXBpQ2FsbHMoYWN0aW9uOiBUQWN0aW9uLCBvYmplY3Q6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2hvd0FwaUxvYWRlcigpO1xuXG4gICAgY29uc3QgbXVsdGlwbGVBcGlDb25maWcgPSB0aGlzLmZvcm1Db25maWcuYXBpc1thY3Rpb24ucHJvcHMuZm9ybUFwaUtleV07XG5cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLCBcImFwaUtleVwiKSkge1xuICAgICAgY29uc3QgZW50cnlwb2ludEFwaUtleSA9IGFjdGlvbi5wcm9wcy5hcGlLZXk7XG4gICAgICBjb25zdCB7IGVuZHBvaW50cyB9ID0gbXVsdGlwbGVBcGlDb25maWc7XG4gICAgICBjb25zdCBuZXh0QXBpSW5kZXggPSBlbmRwb2ludHMuZmluZEluZGV4KFxuICAgICAgICAoYXBpOiBUQXBpRW5kcG9pbnQpID0+IGFwaS5hcGlLZXkgPT09IGVudHJ5cG9pbnRBcGlLZXlcbiAgICAgICk7XG4gICAgICBjb25zdCBhcGlDb25maWcgPSBlbmRwb2ludHNbbmV4dEFwaUluZGV4XTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmhhbmRsZUFwaUNhbGwoYXBpQ29uZmlnKTtcblxuICAgICAgbXVsdGlwbGVBcGlDb25maWcuZW5kcG9pbnRzW25leHRBcGlJbmRleF0gPSByZXNwb25zZS5hcGk7XG5cbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICB0aGlzLmZvcm1Db25maWcsXG4gICAgICAgIGBhcGlzLiR7YWN0aW9uLnByb3BzLmZvcm1BcGlLZXl9YCxcbiAgICAgICAgbXVsdGlwbGVBcGlDb25maWdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaGlkZUFwaUxvYWRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgIHtcbiAgICAgICAgICBGT1JNX0NPTkZJRzogdGhpcy5mb3JtQ29uZmlnLFxuICAgICAgICAgIEFQSV9DT05GSUc6IG11bHRpcGxlQXBpQ29uZmlnLFxuICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIENBTUVSQV9EQVRBOiB0aGlzLmNhbWVyYURhdGEsXG4gICAgICAgICAgVEFTS19EQVRBOiB0aGlzLnRhc2tEYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICBFWFRSQV9EQVRBOiB0aGlzLmV4dHJhRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgYXdhaXQgYXBpcy5jYWxsTmV4dEFwaShtdWx0aXBsZUFwaUNvbmZpZy5lbnRyeXBvaW50KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHRhc2tNdWx0aXBsZUFwaUNhbGxzRW5kKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtdWx0aXBsZUFwaUNvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZy5hcGlzW2FjdGlvbi5wcm9wcy5mb3JtQXBpS2V5XTtcblxuICAgIGxldCBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXMgPSB7fTtcbiAgICBtdWx0aXBsZUFwaUNvbmZpZy5lbmRwb2ludHMuZm9yRWFjaCgoYXBpOiBUQXBpRW5kcG9pbnQpID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhcGkucmVzcG9uc2UsIFwidmFsdWVcIikpXG4gICAgICAgIG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlcyA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICAgIG11bHRpcGxlQXBpQ2FsbFJlc3BvbnNlcyxcbiAgICAgICAgICBgJHthcGkuYXBpS2V5fWAsXG4gICAgICAgICAgYXBpLnJlc3BvbnNlLnZhbHVlXG4gICAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy50YXNrRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMudGFza0RhdGEsXG4gICAgICBbYWN0aW9uLnByb3BzLmZvcm1BcGlLZXldOiBtdWx0aXBsZUFwaUNhbGxSZXNwb25zZXNcbiAgICB9O1xuXG4gICAgdGhpcy53YWl0aW5nRm9yQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5oaWRlQXBpTG9hZGVyKCk7XG4gIH1cblxuICBkaWFsb2dSZWY6IGFueSA9IHVuZGVmaW5lZDtcblxuICBAbG9nTWV0aG9kXG4gIGRpYWxvZ1Nob3cob3B0aW9uczogYW55KSB7XG4gICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0RJQUxPR19TSE9XLCB7fSk7XG5cbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZVxuICAgICAgLm9wZW4ob3B0aW9ucz8uaHRtbCwge1xuICAgICAgICBjbG9zZWFibGU6IHRydWUsXG4gICAgICAgIGRpc21pc3NpYmxlOiB0cnVlLFxuICAgICAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwsXG4gICAgICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gXCJzXCIsXG4gICAgICAgIGRhdGE6IHsgYnV0dG9uOiBvcHRpb25zPy5idXR0b24gfVxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19ESUFMT0dfRVJST1IsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRElBTE9HX0hJREUsIHt9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGRpYWxvZ0hpZGUoKSB7XG4gICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcmVkaXJlY3RUb1VybChhY3Rpb246IFRBY3Rpb24pIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLCBcInVybFwiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy51cmwsIFwidXJsXCIpKSB7XG4gICAgICAgIGxldCB0aW1lb3V0ID0gMjAwMDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy51cmwsIFwidGltZW91dFwiKSAmJlxuICAgICAgICAgIHR5cGVvZiBhY3Rpb24ucHJvcHMudXJsLnRpbWVvdXQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgICAgdGltZW91dCA9IGFjdGlvbi5wcm9wcy51cmwudGltZW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19SRURJUkVDVF9VUkwsIHtcbiAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgIHJlZGlyZWN0X3VybDogYWN0aW9uLnByb3BzLnVybFxuICAgICAgICB9KTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLnVybCwgXCJ0YXJnZXRcIikpIHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGFjdGlvbi5wcm9wcy51cmwudXJsLCBhY3Rpb24ucHJvcHMudXJsLnRhcmdldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGFjdGlvbi5wcm9wcy51cmwudXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcGF0Y2hGaWVsZENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0ucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRGaWVsZENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcGF0Y2hGb3JtR3JvdXAoZm9ybURhdGE6IGFueSkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLmZvcm1Hcm91cCkgfHwgaXNVbmRlZmluZWQoZm9ybURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cCBvciBmb3JtRGF0YSBpcyAndW5kZWZpbmVkJy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm9ybURhdGFJbkt3aWtVSUZvcm1hdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmaWVsZEtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGZpZWxkS2V5KSkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmaWVsZCkgJiYgIWlzTnVsbChmaWVsZCkpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhSW5Ld2lrVUlGb3JtYXRbZmllbGRLZXldID1cbiAgICAgICAgICAgICAgY29udmVydEZvcm1GaWVsZFZhbHVlVG9Ld2lrVUlGb3JtYXQoZmllbGQsIGZvcm1EYXRhW2ZpZWxkS2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKGZvcm1EYXRhSW5Ld2lrVUlGb3JtYXQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGlzRmllbGRWYWxpZChmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkS2V5XS52YWxpZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaXNGaWVsZEVuYWJsZWQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZEtleV0uZW5hYmxlZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZ2V0Rm9ybUdyb3VwUmF3VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzaG93UHJldmlldyhwcmV2aWV3UHJvcGVydGllczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aWV3UHJvcGVydGllcyA9IG1lcmdlT2JqZWN0cyhcbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMsXG4gICAgICBwcmV2aWV3UHJvcGVydGllc1xuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5pZnJhbWUuc3JjKSAmJlxuICAgICAgaXNFbXB0eVZhbHVlKHRoaXMucHJldmlld1Byb3BlcnRpZXMuaHRtbC5iZWZvcmUpICYmXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5odG1sLmFmdGVyKVxuICAgICkge1xuICAgICAgdGhpcy5wcmV2aWV3UHJvcGVydGllcy51bmF2YWlsYWJsZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNldFByZXZpZXdQcm9wZXJ0aWVzID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcmV2aWV3UHJvcGVydGllcyA9IHtcbiAgICAgICAgaHRtbDoge1xuICAgICAgICAgIGJlZm9yZTogXCJcIixcbiAgICAgICAgICBiZWZvcmVTdHlsZXM6IFwiXCIsXG4gICAgICAgICAgYWZ0ZXI6IFwiXCIsXG4gICAgICAgICAgYWZ0ZXJTdHlsZXM6IFwiXCJcbiAgICAgICAgfSxcbiAgICAgICAgaWZyYW1lOiB7XG4gICAgICAgICAgc3JjOiBcIlwiLFxuICAgICAgICAgIHRpdGxlOiBcIlwiXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IFwiZGlhbG9nXCIsXG4gICAgICAgIHBvcHVwRm9ybUtleTogXCJcIixcbiAgICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICAgIHNpemU6IFwiYXV0b1wiLFxuICAgICAgICB1bmF2YWlsYWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IHNob3dEaWFsb2cgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fRElBTE9HX1NIT1csIHt9KTtcblxuICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlXG4gICAgICAgIC5vcGVuKHRoaXMuZGlhbG9nLCB7XG4gICAgICAgICAgY2xvc2VhYmxlOiB0cnVlLFxuICAgICAgICAgIGRpc21pc3NpYmxlOiB0cnVlLFxuICAgICAgICAgIHNpemU6IHRoaXMucHJldmlld1Byb3BlcnRpZXM/LnNpemUgfHwgXCJhdXRvXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZi5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19ESUFMT0dfRVJST1IsIHt9KTtcblxuICAgICAgICAgICAgcmVzZXRQcmV2aWV3UHJvcGVydGllcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19ESUFMT0dfSElERSwge30pO1xuXG4gICAgICAgICAgICByZXNldFByZXZpZXdQcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hvd1ByZXZpZXcgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fUFJFVklFV19TSE9XLCB7fSk7XG5cbiAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZiA9IHRoaXMucHJldmlld0RpYWxvZ1NlcnZpY2VcbiAgICAgICAgLm9wZW4odGhpcy5wcmV2aWV3IHx8IFwiXCIpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fUFJFVklFV19FUlJPUiwge30pO1xuXG4gICAgICAgICAgICByZXNldFByZXZpZXdQcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX1BSRVZJRVdfSElERSwge30pO1xuXG4gICAgICAgICAgICByZXNldFByZXZpZXdQcm9wZXJ0aWVzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJkaWFsb2dcIjpcbiAgICAgICAgc2hvd0RpYWxvZygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwb3B1cFwiOlxuICAgICAgICBzaG93UHJldmlldygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNob3dEaWFsb2coKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzaG93RXJyb3JQcmV2aWV3KHByZXZpZXdQcm9wZXJ0aWVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dQcmV2aWV3KHtcbiAgICAgIGh0bWw6IHtcbiAgICAgICAgYWZ0ZXI6IGA8ZGl2IHN0eWxlPVwicGFkZGluZy1ib3R0b206MC4yNXJlbTtwYWRkaW5nLXRvcDogMC4yNXJlbTtwb3NpdGlvbjogYWJzb2x1dGU7bWFyZ2luLXRvcDogY2FsYyg1MHZoKTtmb250LXNpemU6IDEuNHJlbTtiYWNrZ3JvdW5kOiB3aGl0ZTtwYWRkaW5nOiAycmVtO2JvcmRlci1yYWRpdXM6IDFyZW07Ym94LXNoYWRvdzogMHB4IDBweCAxMHB4IC0zcHggYmxhY2s7b3ZlcmZsb3c6IGF1dG87aGVpZ2h0OiBmaXQtY29udGVudDttYXgtaGVpZ2h0OiA5MHZoOyB3aWR0aDogNzB2dzsgbWFyZ2luLWxlZnQ6IGNhbGMoMTV2dyk7IGxpbmUtaGVpZ2h0OiAycmVtO1wiPkVycm9yOiAke3ByZXZpZXdQcm9wZXJ0aWVzLm1lc3NhZ2UubWVzc2FnZX08L2Rpdj5gXG4gICAgICB9LFxuICAgICAgdHlwZTogXCJwb3B1cFwiXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNob3dQb3B1cEZvcm0oXG4gICAgcG9wdXBGb3JtS2V5OiBzdHJpbmcsXG4gICAgcG9wdXBUeXBlOiBcIkRJQUxPR1wiIHwgXCJQT1BVUFwiID0gXCJESUFMT0dcIlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwb3B1cEZvcm1Db25maWcgPSB0aGlzLmZvcm1Db25maWcucG9wdXBGb3Jtc1twb3B1cEZvcm1LZXldO1xuXG4gICAgdGhpcy5vbkFjdGlvblNob3dQb3B1cEZvcm0uZW1pdCh7XG4gICAgICBhY3RpdmVGb3JtRGF0YTogbWVyZ2VPYmplY3RzKHRoaXMuZm9ybURhdGEsIHRoaXMudGFza0RhdGEpLFxuICAgICAgcG9wdXBGb3JtQ29uZmlnLFxuICAgICAgcG9wdXBUeXBlXG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFsZXJ0U2hvdyh0eXBlOiBUdWlOb3RpZmljYXRpb24sIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9TSE9XLCB7XG4gICAgICBhbGVydF9tZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgYWxlcnRfdHlwZTogdHlwZVxuICAgIH0pO1xuXG4gICAgdGhpcy5hbGVydFNlcnZpY2VcbiAgICAgIC5vcGVuKGAke21lc3NhZ2V9YCwge1xuICAgICAgICBzdGF0dXM6XG4gICAgICAgICAgdHlwZSA9PT0gXCJlcnJvclwiXG4gICAgICAgICAgICA/IFR1aU5vdGlmaWNhdGlvbi5FcnJvclxuICAgICAgICAgICAgOiB0eXBlID09PSBcIndhcm5pbmdcIlxuICAgICAgICAgICAgICA/IFR1aU5vdGlmaWNhdGlvbi5XYXJuaW5nXG4gICAgICAgICAgICAgIDogdHlwZSA9PT0gXCJzdWNjZXNzXCJcbiAgICAgICAgICAgICAgICA/IFR1aU5vdGlmaWNhdGlvbi5TdWNjZXNzXG4gICAgICAgICAgICAgICAgOiBUdWlOb3RpZmljYXRpb24uSW5mb1xuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9FUlJPUiwge30pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BTEVSVF9ISURFLCB7fSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YWtlQWN0aW9uT25GaWVsZEdyb3VwKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGJlbG93IGNvZGUgaXMgY3VycmVudGx5IGNvbW1lbnRlZCBiZWNhdXNlIG5vdCBhbGwgYWN0aW9ucyBuZWVkIHRvIGJlIGxvZ2dlZCBhdCBiYWNrZW5kLlxuICAgICAqIFdpbGwgbG9vayBsYXRlciBpbnRvIHdoZXJlIG9ubHkgc3BlY2lmaWMgYWN0aW9ucyBuZWVkcyB0byBiZSBsb2dnZWQgb3IgYWxsLlxuICAgICAqIEN1cnJlbnRseSBsb2dzIGFyZSBzZW50IGZyb20gd2l0aGluZyB0aGUgYWN0aW9uJ3Mgc3BlY2lmaWMgbWV0aG9kcy5cbiAgICAgKiBDb2RlIC1cbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0FDVElPTl9FWEVDVVRFX0dST1VQLCB7XG4gICAgICAgICAgYWN0aW9uX2tleTogYWN0aW9uLmtleSxcbiAgICAgICAgICAuLi4oYWN0aW9uLmlkICYmIHsgYWN0aW9uX2lkOiBhY3Rpb24uaWQgfSksXG4gICAgICAgICAgLi4uKGFjdGlvbi5wcm9wcy5ncm91cEtleSAmJiB7IGFjdGlvbl9pZDogYWN0aW9uLnByb3BzLmdyb3VwS2V5IH0pXG4gICAgICAgIH0pO1xuICAgICovXG5cbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBIaWRlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRHcm91cFNob3coYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRU5BQkxFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBFbmFibGUoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRElTQUJMRTpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwRGlzYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9SRVNFVDpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwUmVzZXQoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfU0hPV19BUElfTE9BREVSOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBEaXNhYmxlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX0hJREVfQVBJX0xPQURFUjpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwRGlzYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdGFrZUFjdGlvbihhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBiZWxvdyBjb2RlIGlzIGN1cnJlbnRseSBjb21tZW50ZWQgYmVjYXVzZSBub3QgYWxsIGFjdGlvbnMgbmVlZCB0byBiZSBsb2dnZWQgYXQgYmFja2VuZC5cbiAgICAgKiBXaWxsIGxvb2sgbGF0ZXIgaW50byB3aGVyZSBvbmx5IHNwZWNpZmljIGFjdGlvbnMgbmVlZHMgdG8gYmUgbG9nZ2VkIG9yIGFsbC5cbiAgICAgKiBDdXJyZW50bHkgbG9ncyBhcmUgc2VudCBmcm9tIHdpdGhpbmcgdGhlIGFjdGlvbidzIHNwZWNpZmljIG1ldGhvZHMuXG4gICAgICogQ29kZSAtXG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19BQ1RJT05fRVhFQ1VURSwge1xuICAgICAgICAgIGFjdGlvbl9rZXk6IGFjdGlvbi5rZXksXG4gICAgICAgICAgLi4uKGFjdGlvbi5pZCAmJiB7IGFjdGlvbl9pZDogYWN0aW9uLmlkIH0pXG4gICAgICAgIH0pO1xuICAgICovXG5cbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkSGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9TSE9XOlxuICAgICAgICB0aGlzLmZpZWxkU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ESVNBQkxFOlxuICAgICAgICB0aGlzLmZpZWxkRGlzYWJsZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9FTkFCTEU6XG4gICAgICAgIHRoaXMuZmllbGRFbmFibGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfU0hPV19BUElfTE9BREVSOlxuICAgICAgICB0aGlzLmZpZWxkRW5hYmxlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0hJREVfQVBJX0xPQURFUjpcbiAgICAgICAgdGhpcy5maWVsZEVuYWJsZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9SRVNFVDpcbiAgICAgICAgdGhpcy5maWVsZFJlc2V0KGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX1NIT1c6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9yU2hvd1NvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgICAgICAgIGxldCBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID1cbiAgICAgICAgICAgIGF3YWl0IGZpZWxkRXJyb3JTaG93U291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgYWN0aW9uLnByb3BzLm1lc3NhZ2Uuc291cmNlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGZpZWxkRXJyb3JTaG93U291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID0gU3RyaW5nKGZpZWxkRXJyb3JTaG93U291cmNlVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBmaWVsZEVycm9yU2hvd1NvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5tZXNzYWdlID0gdXBkYXRlTGFuZ3VhZ2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLm1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICBnZXRMYW5ndWFnZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmllbGRFcnJvclNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5LCBhY3Rpb24ucHJvcHMubWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0VSUk9SX0hJREU6XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMubWVzc2FnZSwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9ySGlkZVNvdXJjZSA9IG5ldyBTb3VyY2Uob2JqZWN0KTtcblxuICAgICAgICAgIGxldCBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID1cbiAgICAgICAgICAgIGF3YWl0IGZpZWxkRXJyb3JIaWRlU291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgYWN0aW9uLnByb3BzLm1lc3NhZ2Uuc291cmNlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGZpZWxkRXJyb3JIaWRlU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID0gU3RyaW5nKGZpZWxkRXJyb3JIaWRlU291cmNlVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBmaWVsZEVycm9ySGlkZVNvdXJjZVZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpZWxkRXJyb3JIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9NRVNTQUdFX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRNZXNzYWdlU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfTUVTU0FHRVNfSElERTpcbiAgICAgICAgdGhpcy5maWVsZE1lc3NhZ2VIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9BUElfVElNRVJfTUVTU0FHRV9TSE9XOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkQXBpVGltZXJNZXNzYWdlU2hvdyhcbiAgICAgICAgICBhY3Rpb24ucHJvcHMuZmllbGRLZXksXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnRpbWVyXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREU6XG4gICAgICAgIGF3YWl0IHRoaXMuZmllbGRBcGlUaW1lck1lc3NhZ2VIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9WQUxVRTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRWYWx1ZShhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9GSUVMRF9ERUZBVUxUX1ZBTFVFOlxuICAgICAgICBhd2FpdCB0aGlzLnNldEZpZWxkRGVmYXVsdFZhbHVlKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0FQSV9TVEFUVVM6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpU3RhdHVzKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0FQSV9IRUFERVJfVkFMVUU6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpSGVhZGVyVmFsdWUoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfQVBJX0hFQURFUl9WQUxJRElUWTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRBcGlIZWFkZXJWYWxpZGl0eShhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9BUElfQk9EWV9WQUxVRTpcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRBcGlCb2R5VmFsdWUoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfQVBJX0JPRFlfVkFMSURJVFk6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QXBpQm9keVZhbGlkaXR5KGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0RST1BET1dOX09QVElPTlM6XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RHJvcGRvd25PcHRpb25zKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX0ZJRUxEX1ZBTElESVRZOlxuICAgICAgICBhd2FpdCB0aGlzLnNldEZpZWxkVmFsaWRpdHkoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5IQU5ETEVfQ09OTkVDVEVEX0VMRU1FTlRTOlxuICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHsga2V5OiBhY3Rpb24ucHJvcHMuZmllbGRLZXkgfSxcbiAgICAgICAgICBcIk9OX0FDVElPTlwiXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkQXBpQ2FsbChhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMX01VTFRJUExFOlxuICAgICAgICBhd2FpdCB0aGlzLmZpZWxkTXVsdGlwbGVBcGlDYWxscyhhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkFQSV9DQUxMX01VTFRJUExFX0VORDpcbiAgICAgICAgYXdhaXQgdGhpcy5maWVsZE11bHRpcGxlQXBpQ2FsbHNFbmQoYWN0aW9uLCBvYmplY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5UQVNLX0FQSV9DQUxMOlxuICAgICAgICBhd2FpdCB0aGlzLnRhc2tBcGlDYWxsKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuVEFTS19BUElfQ0FMTF9NVUxUSVBMRTpcbiAgICAgICAgYXdhaXQgdGhpcy50YXNrTXVsdGlwbGVBcGlDYWxscyhhY3Rpb24sIG9iamVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlRBU0tfQVBJX0NBTExfTVVMVElQTEVfRU5EOlxuICAgICAgICBhd2FpdCB0aGlzLnRhc2tNdWx0aXBsZUFwaUNhbGxzRW5kKGFjdGlvbiwgb2JqZWN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuUkVESVJFQ1RfVE9fVVJMOlxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLnVybCwgXCJzb3VyY2VcIikpIHtcbiAgICAgICAgICBjb25zdCByZWRpcmVjdFRvVXJsU291cmNlID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgICAgICAgbGV0IHJlZGlyZWN0VG9VcmxTb3VyY2VWYWx1ZSA9XG4gICAgICAgICAgICBhd2FpdCByZWRpcmVjdFRvVXJsU291cmNlLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgYWN0aW9uLnByb3BzLnVybC5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eVN0cmluZyhyZWRpcmVjdFRvVXJsU291cmNlVmFsdWUpKSB7XG4gICAgICAgICAgICByZWRpcmVjdFRvVXJsU291cmNlVmFsdWUgPSBcIlwiO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGlvbiA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgXCJwcm9wcy51cmwudXJsXCIsXG4gICAgICAgICAgICByZWRpcmVjdFRvVXJsU291cmNlVmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1VybChhY3Rpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5QUkVWSUVXX0RJQUxPR19TSE9XOlxuICAgICAgICB0aGlzLnNob3dQcmV2aWV3KGFjdGlvbi5wcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlBSRVZJRVdfRVJST1JfU0hPVzpcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy5tZXNzYWdlLCBcInNvdXJjZVwiKSkge1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdFcnJvclNob3dTb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICAgICAgICBsZXQgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID1cbiAgICAgICAgICAgIGF3YWl0IHByZXZpZXdFcnJvclNob3dTb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmV2aWV3RXJyb3JTaG93U291cmNlVmFsdWUgPSBTdHJpbmcocHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlld0Vycm9yU2hvd1NvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBwcmV2aWV3RXJyb3JTaG93U291cmNlVmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yUHJldmlldyhhY3Rpb24ucHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5QT1BVUF9GT1JNX1NIT1c6XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwRm9ybShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMucG9wdXBGb3JtS2V5LFxuICAgICAgICAgIGFjdGlvbi5wcm9wcz8ucG9wdXBUeXBlID8/IFwiRElBTE9HXCJcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU1RPUF9XQUlUSU5HOlxuICAgICAgICB0aGlzLndhaXRpbmdGb3JDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNDUk9MTF9UT19GSUVMRDpcbiAgICAgICAgdGhpcy5oYW5kbGVPblNjcm9sbFRvRmllbGQoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuTk9USUZJQ0FUSU9OX0VSUk9SX1NIT1c6XG4gICAgICAgIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24odHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5Lk5PVElGSUNBVElPTl9FUlJPUl9ISURFOlxuICAgICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuUkVTVU1FX1RBU0tfRVhFQ1VUSU9OOlxuICAgICAgICB0aGlzLnN0b3BUYXNrRXhlY3V0aW9uID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNUT1BfVEFTS19FWEVDVVRJT046XG4gICAgICAgIHRoaXMuc3RvcFRhc2tFeGVjdXRpb24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5ESUFMT0dfU0hPVzpcbiAgICAgICAgdGhpcy5kaWFsb2dTaG93KHtcbiAgICAgICAgICBodG1sOiBhY3Rpb24ucHJvcHM/Lmh0bWwsXG4gICAgICAgICAgbGFiZWw6IGFjdGlvbi5wcm9wcz8ubGFiZWwsXG4gICAgICAgICAgc2l6ZTogYWN0aW9uLnByb3BzPy5zaXplLFxuICAgICAgICAgIGJ1dHRvbjogYWN0aW9uLnByb3BzPy5idXR0b25cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkRJQUxPR19ISURFOlxuICAgICAgICB0aGlzLmRpYWxvZ0hpZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0FWRV9GT1JNOlxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2xpY2tTYXZlRm9ybSh1bmRlZmluZWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5BTEVSVF9TSE9XOlxuICAgICAgICB0aGlzLmFsZXJ0U2hvdyhhY3Rpb24ucHJvcHMudHlwZSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfSFRNTDpcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGlvbi5wcm9wcy5tZXNzYWdlLCBcInNvdXJjZVwiKSkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkSHRtbE1lc3NhZ2VTb3VyY2UgPSBuZXcgU291cmNlKG9iamVjdCk7XG5cbiAgICAgICAgICBsZXQgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID1cbiAgICAgICAgICAgIGF3YWl0IGZpZWxkSHRtbE1lc3NhZ2VTb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5zb3VyY2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWVsZEh0bWxNZXNzYWdlU291cmNlVmFsdWUgPSBTdHJpbmcoZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGRIdG1sTWVzc2FnZVNvdXJjZVZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY3Rpb24gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIFwicHJvcHMubWVzc2FnZS5tZXNzYWdlXCIsXG4gICAgICAgICAgICBmaWVsZEh0bWxNZXNzYWdlU291cmNlVmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbi5wcm9wcy5tZXNzYWdlLm1lc3NhZ2UgPSB1cGRhdGVMYW5ndWFnZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMubWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICAgIGdldExhbmd1YWdlKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRIdG1sKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImt3aWtpZC1mb3JtLWNvbnRhaW5lclwiXG4gICpuZ0lmPVwiIWxvYWRpbmdcIlxuPlxuICA8ZGl2XG4gICAgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1oZWFkZXItY29udGFpbmVyXCJcbiAgICAqbmdJZj1cIlxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy50aXRsZT8uaGlkZGVuIHx8XG4gICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXI/LmxvZ28/LmhpZGRlbiB8fFxuICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5zdGVwcz8uaGlkZGVuIHx8XG4gICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXI/LmJhY2tCdXR0b24/LmhpZGRlblxuICAgIFwiXG4gID5cbiAgICA8aW1nXG4gICAgICBpZD1cInVmLWhlYWRlci1sb2dvXCJcbiAgICAgICpuZ0lmPVwiIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5sb2dvPy5oaWRkZW4gJiYgaXNNb2JpbGVWaWV3XCJcbiAgICAgIFtzcmNdPVwiZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXI/LmxvZ28/LnNyY1wiXG4gICAgICBbYWx0XT1cImZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyPy5sb2dvPy5hbHRcIlxuICAgICAgW3N0eWxlXT1cIlxuICAgICAgICBmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlcj8ubG9nbz8uc3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcbiAgICAgIFwiXG4gICAgLz5cbiAgICA8ZGl2IGlkPVwidWYtZm9ybS1maWVsZHMtaGVhZGVyLW1haW5cIj5cbiAgICAgIDxkaXYgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1oZWFkZXItbGVmdFwiPlxuICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXIuYmFja0J1dHRvbi5oaWRkZW4gJiYgaXNNb2JpbGVWaWV3XG4gICAgICAgICAgXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYmFja0J1dHRvbi5kaXNhYmxlZFwiXG4gICAgICAgICAgW3Nob3dMb2FkZXJdPVwiYmFja0J1dHRvbi5zaG93TG9hZGVyXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwibW9ub1wiXG4gICAgICAgICAgaWNvbj1cInR1aUljb25BcnJvd0xlZnRcIlxuICAgICAgICAgIHNoYXBlPVwicm91bmRlZFwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiXG4gICAgICAgICAgICBoYW5kbGVPbkNsaWNrR29CYWNrKFxuICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgIGZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLmJhY2tCdXR0b24ubW9kZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIFwiXG4gICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1oZWFkZXItcmlnaHRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPVwidWYtZm9ybS1maWVsZHMtdGl0bGVcIlxuICAgICAgICAgICpuZ0lmPVwiIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLnRpdGxlLmhpZGRlblwiXG4gICAgICAgICAgPnt7IGZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLnRpdGxlLmxhYmVsIH19PC9kaXZcbiAgICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1zdGVwc1wiXG4gICAgICAgICAgKm5nSWY9XCIhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXIuc3RlcHMuaGlkZGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgIFN0ZXAge3sgZm9ybUNvbmZpZy5zZXF1ZW5jZU5vIH19IG9mIHt7IGZvcm1Db25maWcuZm9ybXNMaXN0TGVuZ3RoIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGhyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzPy5oZWFkZXIudGl0bGUuaGlkZGVuIHx8XG4gICAgICAgICFmb3JtQ29uZmlnLnByb3BlcnRpZXM/LmhlYWRlci5zdGVwcy5oaWRkZW4gfHxcbiAgICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcz8uaGVhZGVyLmJhY2tCdXR0b24uaGlkZGVuXG4gICAgICBcIlxuICAgIC8+XG4gIDwvZGl2PlxuICA8Zm9ybVxuICAgICNmb3JtRmllbGRDb250YWluZXJSZWZcbiAgICBjbGFzcz1cImt3aWtpZC1mb3JtIHNob3dcIlxuICAgIFtzdHlsZV09XCJmb3JtQ29uZmlnLnByb3BlcnRpZXM/Lm1haW4/LnN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdGb3I9XCJcbiAgICAgICAgbGV0IGZpZWxkIG9mIGZvcm1GaWVsZHM7XG4gICAgICAgIGxldCBpID0gaW5kZXg7XG4gICAgICAgIHRyYWNrQnk6IGdldFVuaXF1ZUlkZW50aWZpZXJcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmllbGQudHlwZVwiPlxuICAgICAgICA8IS0tIEhUTUwgQ29udGVudCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2h0bWwnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwiZmllbGQuaHRtbCB8IGt3aWt1aVNhZmVIdG1sXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEZvcm0gVGl0bGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aXRsZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWVsZD8ucmVzZXRcIlxuICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5yZXNldEJ1dHRvbkxhYmVsID8/ICdSZXNldCdcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVPbkNsaWNrUmVzZXRGb3JtRmllbGRzKCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEJ1dHRvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5hcHBlYXJhbmNlID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJmaWVsZD8ucHJvcGVydGllcz8uY2xhc3NcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lmljb25cIlxuICAgICAgICAgICAgICBbaWNvblJpZ2h0XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pY29uUmlnaHRcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQ/LmtleVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbc2hhcGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNoYXBlXCJcbiAgICAgICAgICAgICAgW3Nob3dMb2FkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmxvYWRpbmcgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZVwiXG4gICAgICAgICAgICAgIFtzdHlsZXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnN0eWxlc1wiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24nXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbihmaWVsZClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFRleHQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dFxuICAgICAgICAgICAgICBbY2FzZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY2FzZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IEN1cnJlbmN5IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWN1cnJlbmN5XG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2N1cnJlbmN5VHlwZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY3VycmVuY3lUeXBlXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtY3VycmVuY3k+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBFbWFpbCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VtYWlsJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1lbWFpbFxuICAgICAgICAgICAgICBbY2FzZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY2FzZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZG9tYWluc109XCJmaWVsZD8ucHJvcGVydGllcz8uZG9tYWluc1wiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Bvc3RmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBvc3RmaXhcIlxuICAgICAgICAgICAgICBbcHJlZml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wcmVmaXhcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWVtYWlsPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gUGFzc3dvcmQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwYXNzd29yZCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtcGFzc3dvcmRcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtoaW50Q29udGVudF09XCJmaWVsZD8ucHJvcGVydGllcz8uaGludENvbnRlbnRcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1wYXNzd29yZD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIFRleHRhcmVhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLXRleHRhcmVhXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktdGV4dGFyZWE+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1jaGVja2JveFxuICAgICAgICAgICAgICBbY29udGVudEFsaWduXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250ZW50QWxpZ24gPz8gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZSA/PyAnbCdcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIFt2YXJpYW50XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy52YXJpYW50ID8/ICdibG9jaydcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktY2hlY2tib3g+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBOdW1iZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LW51bWJlclxuICAgICAgICAgICAgICBbZGVjaW1hbF09XCJmaWVsZD8ucHJvcGVydGllcz8uZGVjaW1hbFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZD8ucHJvcGVydGllcz8ubWF4XCJcbiAgICAgICAgICAgICAgW21pbl09XCJmaWVsZD8ucHJvcGVydGllcz8ubWluXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4ID8/ICcnXCJcbiAgICAgICAgICAgICAgW3ByZWNpc2lvbl09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlY2lzaW9uXCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4ID8/ICcnXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1udW1iZXI+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBEYXRlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtZGF0ZVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgIFttYXhDYWxjdWxhdGVkRnJvbVRvZGF5XT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5tYXhDYWxjdWxhdGVkRnJvbVRvZGF5XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgIFttaW5DYWxjdWxhdGVkRnJvbVRvZGF5XT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5taW5DYWxjdWxhdGVkRnJvbVRvZGF5XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeFwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeFwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtZGF0ZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFRpbWUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aW1lJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC10aW1lXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbaXRlbXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lml0ZW1zXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttb2RlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tb2RlXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC10aW1lPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgUGhvbmUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwaG9uZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtcGhvbmVcbiAgICAgICAgICAgICAgW2NvdW50cnlDb2RlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb3VudHJ5Q29kZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3Bob25lTWFza0FmdGVyQ291bnRyeUNvZGVdPVwiXG4gICAgICAgICAgICAgICAgZmllbGQ/LnByb3BlcnRpZXM/LnBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbcmVtb3ZlQ291bnRyeUNvZGVGcm9tVmFsdWVdPVwiXG4gICAgICAgICAgICAgICAgZmllbGQ/LnByb3BlcnRpZXM/LnJlbW92ZUNvdW50cnlDb2RlRnJvbVZhbHVlXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LXBob25lPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgUmFkaW8gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpbydcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBbdHVpTGFiZWxdPVwibGFiZWxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogYXV0bzsgcGFkZGluZzogMHB4IDAuNXJlbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtcmFkaW9cbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpZWxkPy5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbb3JpZW50YXRpb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm9yaWVudGF0aW9uXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1yYWRpbz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dWktc3BhY2VfYm90dG9tLTJcIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzPy5yZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9iPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXNlbGVjdFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2VhcmNoYWJsZVwiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LXNlbGVjdD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFNsaWRlciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NsaWRlcidcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtc2xpZGVyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZD8ucHJvcGVydGllcz8ubWF4XCJcbiAgICAgICAgICAgICAgW21pbl09XCJmaWVsZD8ucHJvcGVydGllcz8ubWluXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4XCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4XCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbcXVhbnR1bV09XCJmaWVsZD8ucHJvcGVydGllcz8ucXVhbnR1bVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgW3N0ZXBzXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zdGVwc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LXNsaWRlcj5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEFQSSBDYWxsIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXBpJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b24tYXBpLWNhbGxcbiAgICAgICAgICAgICAgW2FwaVN0YXR1c109XCJmaWVsZD8uYXBpPy5zdGF0dXM/LnZhbHVlXCJcbiAgICAgICAgICAgICAgW2FwaVRpbWVyXT1cImZpZWxkPy5hcGk/LnRpbWVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImZpZWxkPy5jbGFzc1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5hcGk/LnN0YXR1cz8ubGFiZWxzW2ZpZWxkPy5hcGk/LnN0YXR1cz8udmFsdWVdXCJcbiAgICAgICAgICAgICAgW3Nob3dMb2FkZXJdPVwiZmllbGQ/LmRpc2FibGVkID09PSAnbG9hZGluZydcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2l6ZVwiXG4gICAgICAgICAgICAgIFtzdHlsZXNdPVwiXG4gICAgICAgICAgICAgICAgZmllbGQ/LnByb3BlcnRpZXM/LnN0eWxlc1xuICAgICAgICAgICAgICAgICAgPyBmaWVsZD8ucHJvcGVydGllcz8uc3R5bGVzXG4gICAgICAgICAgICAgICAgICA6ICd3aWR0aDogZml0LWNvbnRlbnQnXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxuICAgICAgICAgICAgICAob25BcGlUaW1lclN0b3ApPVwiaGFuZGxlT25BcGlUaW1lclN0b3AoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uLWFwaS1jYWxsPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gTGl2ZSBMb2NhdGlvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpdmUtbG9jYXRpb24nXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvbi1saXZlLWxvY2F0aW9uXG4gICAgICAgICAgICAgIFtjbGFzc109XCJmaWVsZD8uY2xhc3NcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8uYXBpPy5zdGF0dXM/LmxhYmVsc1tmaWVsZD8uYXBpPy5zdGF0dXM/LnZhbHVlXVwiXG4gICAgICAgICAgICAgIFtsaXZlTG9jYXRpb25TdGF0dXNdPVwiZmllbGQ/LmFwaT8uc3RhdHVzPy52YWx1ZVwiXG4gICAgICAgICAgICAgIFtzaGFwZV09XCJmaWVsZD8ucHJvcGVydGllcz8uc2hhcGVcIlxuICAgICAgICAgICAgICBbaXNTaG93TGF0TG9uZ0NhcHR1cmVUaW1lc3RhbXBdPVwiXG4gICAgICAgICAgICAgICAgZmllbGQ/LnByb3BlcnRpZXM/LmlzU2hvd0xhdExvbmdDYXB0dXJlVGltZXN0YW1wXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgc3R5bGVzPVwid2lkdGg6IGZpdC1jb250ZW50XCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlT25DbGlja0xpdmVMb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uTG9jYXRpb25QZXJtaXNzaW9uKT1cImhhbmRsZU9uTG9jYXRpb25QZXJtaXNzaW9uKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbi1saXZlLWxvY2F0aW9uPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gTW9iaWxlIE9UUCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ290cCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtb3RwXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW21hc2tdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1hc2tcIlxuICAgICAgICAgICAgICBbbW9kZV09XCJmaWVsZD8ucHJvcGVydGllcz8ubW9kZVwiXG4gICAgICAgICAgICAgIFtvdHBMZW5ndGhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm90cExlbmd0aFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtb3RwPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQWFkaGFhciBOdW1iZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhYWRoYWFyLW51bWJlcidcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtYWFkaGFhclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXNrXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5tYXNrXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtYWFkaGFhcj5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIFByZXZpZXcgSW1hZ2UgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW1hZ2VcbiAgICAgICAgICAgICAgW2FsdFRleHRdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmFsdFRleHRcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNsYXNzXCJcbiAgICAgICAgICAgICAgW2h0bWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lmh0bWxcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ltYWdlU3JjXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICAgW2ltYWdlVHlwZV09XCJmaWVsZD8ucHJvcGVydGllcz8uaW1hZ2VUeXBlXCJcbiAgICAgICAgICAgICAgW2xvYWRpbmdUeXBlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5sb2FkaW5nVHlwZVwiXG4gICAgICAgICAgICAgIFtzdHlsZXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnN0eWxlc1wiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW1hZ2U+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBGaWxlIFVwbG9hZCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgI2Zvcm1GaWVsZHNSZWZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgW3R1aUxhYmVsXT1cImxhYmVsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IGF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8a3dpa3VpLWlucHV0LWZpbGVzXG4gICAgICAgICAgICAgICAgW2FjY2VwdF09XCJmaWVsZD8ucHJvcGVydGllcz8uYWNjZXB0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNsYXNzXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZmlsZXNdPVwiZmlsZXNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImZpZWxkPy5rZXlcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ucHJvcGVydGllcz8ubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtsaW5rXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5saW5rXCJcbiAgICAgICAgICAgICAgICBbbWF4RmlsZVNpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heEZpbGVTaXplXCJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICBbc2V0RmlsZVR5cGVzVG9Gb3JtXT1cIlsnTk9STUFMJ11cIlxuICAgICAgICAgICAgICAgIFtzdHlsZXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnN0eWxlc1wiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAgIFtzaG93Vmlld0J1dHRvbl09XCJmaWVsZD8ucHJvcGVydGllcz8uc2hvd1ZpZXdCdXR0b25cIlxuICAgICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZUZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGdldFJlbW92ZWRGaWxlKT1cImhhbmRsZVJlbW92ZWRGaWxlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChnZXRWaWV3QnV0dG9uQ2xpY2spPVwiaGFuZGxlVmlld0J1dHRvbkNsaWNrKCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWZpbGVzPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDBweCAwLjI1cmVtOyBtYXJnaW4tYm90dG9tOiAwLjI1cmVtXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIENhbWVyYSBDYXB0dXJlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FwdHVyZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5sYWJlbCAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIGZpZWxkPy5sYWJlbCAhPT0gbnVsbFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IGF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQ/LmxhYmVsICE9PSAnJ1wiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAwcHggMC4yNXJlbTsgbWFyZ2luLWJvdHRvbTogMC41cmVtXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtY2FtZXJhXG4gICAgICAgICAgICAgIFtidXR0b25UZXh0XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5idXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pY29uXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW21lZGlhRmlsZXNdPVwiXG4gICAgICAgICAgICAgICAgbWVkaWFGaWxlc1tmaWVsZC5rZXldIHwgZmlsdGVySW1hZ2VVcmxPckJhc2U2NEZyb21PYmplY3RcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbc2hvd01lZGlhRmlsZXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNob3dNZWRpYUZpbGVzXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ2NhcHR1cmUnXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJoYW5kbGVPbkNsaWNrSW5wdXRDYW1lcmEoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAoZ2V0UmVtb3ZlZEZpbGUpPVwiaGFuZGxlT25DbGlja0dldFJlbW92ZWRNZWRpYUZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtY2FtZXJhPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQ2FtZXJhIFJlY29yZCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JlY29yZCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZm9ybUZpZWxkc1JlZlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5sYWJlbCAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICBmaWVsZD8ubGFiZWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIGZpZWxkPy5sYWJlbCAhPT0gbnVsbFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IGF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQ/LmxhYmVsICE9PSAnJ1wiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAwcHggMC4yNXJlbTsgbWFyZ2luLWJvdHRvbTogMC41cmVtXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycz8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtY2FtZXJhXG4gICAgICAgICAgICAgIFtidXR0b25UZXh0XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5idXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pY29uXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW21lZGlhRmlsZXNdPVwiXG4gICAgICAgICAgICAgICAgbWVkaWFGaWxlc1tmaWVsZC5rZXldIHwgZmlsdGVyVmlkZW9VcmxPckJhc2U2NEZyb21PYmplY3RcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbc2hvd01lZGlhRmlsZXNdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNob3dNZWRpYUZpbGVzXCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3JlY29yZCdcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tJbnB1dENhbWVyYSgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgIChnZXRSZW1vdmVkRmlsZSk9XCJoYW5kbGVPbkNsaWNrR2V0UmVtb3ZlZE1lZGlhRmlsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1jYW1lcmE+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBTdGFyIFJhdGluZyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXItcmF0aW5nJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNmb3JtRmllbGRzUmVmXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgW3N0eWxlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jb250YWluZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFt0dWlMYWJlbF09XCJsYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiBhdXRvOyBwYWRkaW5nOiAwcHggMC41cmVtXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGt3aWt1aS1zdGFyLXJhdGluZ1xuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJmaWVsZD8ucHJvcGVydGllcz8uY29sb3JcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5pY29uXCJcbiAgICAgICAgICAgICAgICBbaWNvbk1hcmtlZF09XCJmaWVsZD8ucHJvcGVydGllcz8uaWNvbk1hcmtlZFwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJmaWVsZD8ucHJvcGVydGllcz8ubWluXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1zdGFyLXJhdGluZz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxiXG4gICAgICAgICAgICAgICAgICA+e3sgZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkXCI+Kjwvc3Bhbj48L2JcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Zvcm0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImt3aWtpZC1mb3JtLWJ1dHRvbnNcIlxuICAgICpuZ0lmPVwiXG4gICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci52aWV3Rm9ybXNCdXR0b24uaGlkZGVuIHx8XG4gICAgICAhZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci5zYXZlQnV0dG9uLmhpZGRlblxuICAgIFwiXG4gID5cbiAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgIWZvcm1Db25maWcucHJvcGVydGllcy5mb290ZXIudmlld0Zvcm1zQnV0dG9uLmhpZGRlbiAmJiBpc01vYmlsZVZpZXdcbiAgICAgIFwiXG4gICAgICBbYXBwZWFyYW5jZV09XCInc2Vjb25kYXJ5J1wiXG4gICAgICBbZGlzYWJsZWRdPVwidmlld0Zvcm1zQnV0dG9uLmRpc2FibGVkXCJcbiAgICAgIFtsYWJlbF09XCJmb3JtQ29uZmlnLnByb3BlcnRpZXMuZm9vdGVyLnZpZXdGb3Jtc0J1dHRvbi5sYWJlbFwiXG4gICAgICBbc2hvd0xvYWRlcl09XCJ2aWV3Rm9ybXNCdXR0b24uc2hvd0xvYWRlclwiXG4gICAgICBbc3R5bGVzXT1cIid3aWR0aDogMTAwJSdcIlxuICAgICAgKG9uQ2xpY2spPVwiaGFuZGxlT25DbGlja1ZpZXdGb3JtcygkZXZlbnQpXCJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAqbmdJZj1cIiFmb3JtQ29uZmlnLnByb3BlcnRpZXMuZm9vdGVyLnNhdmVCdXR0b24uaGlkZGVuXCJcbiAgICAgIFtkaXNhYmxlZF09XCJzYXZlRm9ybUJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICBbbGFiZWxdPVwiZm9ybUNvbmZpZy5wcm9wZXJ0aWVzLmZvb3Rlci5zYXZlQnV0dG9uLmxhYmVsXCJcbiAgICAgIFtzaG93TG9hZGVyXT1cInNhdmVGb3JtQnV0dG9uLnNob3dMb2FkZXJcIlxuICAgICAgW3N0eWxlc109XCInd2lkdGg6IDEwMCUnXCJcbiAgICAgIChvbkNsaWNrKT1cImhhbmRsZU9uQ2xpY2tTYXZlRm9ybSgkZXZlbnQpXCJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cImt3aWtpZC1mb3JtLWNvbnRhaW5lci1sb2FkaW5nXCJcbiAgKm5nSWY9XCJsb2FkaW5nXCJcbj5cbiAgPGRpdlxuICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtdLmNvbnN0cnVjdG9yKDcpOyBsZXQgaSA9IGluZGV4XCJcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXIgdHVpLXNrZWxldG9uIHR1aS1za2VsZXRvbl9yb3VuZGVkXCJcbiAgPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48a3dpa3VpLWxvYWRlcj48L2t3aWt1aS1sb2FkZXI+XG5cbjx0dWktcHVzaFxuICBpZD1cImZpZWxkLWVycm9yLW5vdGlmaWNhdGlvblwiXG4gICp0dWlQdXNoPVwic2hvd0Vycm9yTm90aWZpY2F0aW9uXCJcbiAgaGVhZGluZz1cIk1pc3NpbmcvSW5jb3JyZWN0IEZpZWxkcyFcIlxuICB0eXBlPVwiRXJyb3JcIlxuICAoY2xvc2UpPVwidG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oZmFsc2UpXCJcbj5cbiAgPHR1aS1zdmdcbiAgICBzcmM9XCJ0dWlJY29uWENpcmNsZVwiXG4gICAgc3R5bGU9XCJjb2xvcjogI2ZmZiAhaW1wb3J0YW50XCJcbiAgPlxuICA8L3R1aS1zdmc+XG48L3R1aS1wdXNoPlxuXG48dHVpLXB1c2hcbiAgaWQ9XCJwZXJtaXNzaW9uLWVycm9yLW5vdGlmaWNhdGlvblwiXG4gICp0dWlQdXNoPVwic2hvd1Blcm1pc3Npb25FcnJvck5vdGlmaWNhdGlvblwiXG4gIGhlYWRpbmc9XCJQbGVhc2UgcHJvdmlkZSByZXF1aXJlZCBwZXJtaXNzaW9ucyFcIlxuICB0eXBlPVwiRXJyb3JcIlxuICAoY2xvc2UpPVwidG9nZ2xlUGVybWlzc2lvbkVycm9yTm90aWZpY2F0aW9uKGZhbHNlKVwiXG4+XG4gIDx0dWktc3ZnXG4gICAgc3JjPVwidHVpSWNvblhDaXJjbGVcIlxuICAgIHN0eWxlPVwiY29sb3I6ICNmZmYgIWltcG9ydGFudFwiXG4gID5cbiAgPC90dWktc3ZnPlxuPC90dWktcHVzaD5cblxuPG5nLXRlbXBsYXRlXG4gICNwcmV2aWV3XG4gIGxldC1wcmV2aWV3XG4+XG4gIDx0dWktcHJldmlld1xuICAgIFtyb3RhdGFibGVdPVwiZmFsc2VcIlxuICAgIFt6b29tYWJsZV09XCJmYWxzZVwiXG4gICAgY2xhc3M9XCJwcmV2aWV3LWNvbnRhaW5lclwiXG4gID5cbiAgICA8dHVpLXByZXZpZXctdGl0bGUgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcy50aXRsZSAhPT0gJydcIj57e1xuICAgICAgcHJldmlld1Byb3BlcnRpZXMudGl0bGVcbiAgICB9fTwvdHVpLXByZXZpZXctdGl0bGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmJlZm9yZSAhPT0gJydcIlxuICAgICAgICBjbGFzcz1cInByZXZpZXctaHRtbCBwcmV2aWV3LWh0bWwtYmVmb3JlXCJcbiAgICAgICAgW3N0eWxlXT1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5iZWZvcmVTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwicHJldmlld1Byb3BlcnRpZXMuaHRtbC5iZWZvcmUgfCBrd2lrdWlTYWZlSHRtbFwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDwhLS0gQ29udGVudCB3aXRoaW4gdGhlIGlmcmFtZSAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZS1jb250ZW50XCJcbiAgICAgICAgW3N0eWxlXT1cIlxuICAgICAgICAgIHByZXZpZXdQcm9wZXJ0aWVzPy5pZnJhbWU/LmNvbnRhaW5lclN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXG4gICAgICAgIFwiXG4gICAgICAgICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXMuaWZyYW1lLnNyYyAhPT0gJydcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFlvdXIgSFRNTCBjb250ZW50IGhlcmUgLS0+XG4gICAgICAgIDxpZnJhbWVcbiAgICAgICAgICBbc3JjXT1cInByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS5zcmMgfCBrd2lrdWlTYWZlVXJsXCJcbiAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgIGFsbG93PVwiYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIlxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlblxuICAgICAgICAgIFt0aXRsZV09XCJwcmV2aWV3UHJvcGVydGllcy5pZnJhbWUudGl0bGVcIlxuICAgICAgICAgIGNsYXNzPVwicHJldmlldy1pZnJhbWVcIlxuICAgICAgICAgIHNjcm9sbGluZz1cImF1dG9cIlxuICAgICAgICA+PC9pZnJhbWU+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzPy5odG1sPy5hZnRlciAhPT0gJydcIlxuICAgICAgICBjbGFzcz1cInByZXZpZXctaHRtbCBwcmV2aWV3LWh0bWwtYWZ0ZXJcIlxuICAgICAgICBbc3R5bGVdPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmFmdGVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cInByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYWZ0ZXIgfCBrd2lrdWlTYWZlSHRtbFwiXG4gICAgICA+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LXVuYXZhaWxhYmxlXCI+XG4gICAgICAgIDx0dWktc3ZnXG4gICAgICAgICAgc3JjPVwidHVpSWNvbkZpbGVMYXJnZVwiXG4gICAgICAgICAgY2xhc3M9XCJ0LWljb25cIlxuICAgICAgICA+PC90dWktc3ZnPlxuICAgICAgICA8ZGl2PlByZXZpZXcgdW5hdmFpbGFibGU8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGJ1dHRvblxuICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgdHVpUHJldmlld0FjdGlvblxuICAgICAgaWNvbj1cInR1aUljb25DbG9zZUxhcmdlXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwicHJldmlldy5jb21wbGV0ZSgpXCJcbiAgICA+PC9idXR0b24+XG4gIDwvdHVpLXByZXZpZXc+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RpYWxvZ1xuICBsZXQtZGlhbG9nXG4+XG4gIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGVcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcz8uaHRtbD8uYmVmb3JlICE9PSAnJ1wiXG4gICAgICAgIGNsYXNzPVwicHJldmlldy1odG1sIHByZXZpZXctaHRtbC1iZWZvcmVcIlxuICAgICAgICBbc3R5bGVdPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmJlZm9yZVN0eWxlcyA/PyAnJyB8IHN0eWxlU2FuaXRpemVyXCJcbiAgICAgICAgW2lubmVySHRtbF09XCJwcmV2aWV3UHJvcGVydGllcy5odG1sLmJlZm9yZSB8IGt3aWt1aVNhZmVIdG1sXCJcbiAgICAgID48L2Rpdj5cblxuICAgICAgPCEtLSBDb250ZW50IHdpdGhpbiB0aGUgaWZyYW1lIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInByZXZpZXctaWZyYW1lLWNvbnRlbnRcIlxuICAgICAgICBbc3R5bGVdPVwiXG4gICAgICAgICAgcHJldmlld1Byb3BlcnRpZXM/LmlmcmFtZT8uY29udGFpbmVyU3R5bGVzID8/ICcnIHwgc3R5bGVTYW5pdGl6ZXJcbiAgICAgICAgXCJcbiAgICAgICAgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcy5pZnJhbWUuc3JjICE9PSAnJ1wiXG4gICAgICA+XG4gICAgICAgIDwhLS0gWW91ciBIVE1MIGNvbnRlbnQgaGVyZSAtLT5cbiAgICAgICAgPGlmcmFtZVxuICAgICAgICAgIFtzcmNdPVwicHJldmlld1Byb3BlcnRpZXMuaWZyYW1lLnNyYyB8IGt3aWt1aVNhZmVVcmxcIlxuICAgICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgICAgYWxsb3c9XCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZVwiXG4gICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgW3RpdGxlXT1cInByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS50aXRsZVwiXG4gICAgICAgICAgY2xhc3M9XCJwcmV2aWV3LWlmcmFtZVwiXG4gICAgICAgICAgc2Nyb2xsaW5nPVwiYXV0b1wiXG4gICAgICAgID48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwicHJldmlld1Byb3BlcnRpZXM/Lmh0bWw/LmFmdGVyICE9PSAnJ1wiXG4gICAgICAgIGNsYXNzPVwicHJldmlldy1odG1sIHByZXZpZXctaHRtbC1hZnRlclwiXG4gICAgICAgIFtzdHlsZV09XCJwcmV2aWV3UHJvcGVydGllcz8uaHRtbD8uYWZ0ZXJTdHlsZXMgPz8gJycgfCBzdHlsZVNhbml0aXplclwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwicHJldmlld1Byb3BlcnRpZXMuaHRtbC5hZnRlciB8IGt3aWt1aVNhZmVIdG1sXCJcbiAgICAgID48L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcy51bmF2YWlsYWJsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctdW5hdmFpbGFibGVcIj5cbiAgICAgICAgPHR1aS1zdmdcbiAgICAgICAgICBzcmM9XCJ0dWlJY29uRmlsZUxhcmdlXCJcbiAgICAgICAgICBjbGFzcz1cInQtaWNvblwiXG4gICAgICAgID48L3R1aS1zdmc+XG4gICAgICAgIDxkaXY+UHJldmlldyB1bmF2YWlsYWJsZTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdlxuICBpZD1cImt3aWtpZC1jYW1lcmEtY29udGFpbmVyXCJcbiAgKm5nSWY9XCJpc1Nob3dDYW1lcmFcIlxuPlxuICA8ZGl2XG4gICAgaWQ9XCJrd2lraWQtY2FtZXJhLXdyYXBwZXJcIlxuICAgIFtjbGFzcy5mdWxsc2NyZWVuXT1cImlzU2hvd0NhbWVyYUZ1bGxzY3JlZW5cIlxuICA+XG4gICAgPGt3aWtpZC1jYW1lcmFcbiAgICAgIFt0eXBlXT1cImFjdGl2ZUNhbWVyYVR5cGVcIlxuICAgICAgW2RhdGFdPVwiYWN0aXZlQ2FtZXJhRGF0YVwiXG4gICAgICBbaW1hZ2VdPVwiYWN0aXZlQ2FtZXJhSW1hZ2VcIlxuICAgICAgW3ZpZGVvXT1cImFjdGl2ZUNhbWVyYVZpZGVvXCJcbiAgICAgIFtjb25maWddPVwiYWN0aXZlQ2FtZXJhQ29uZmlnPy5jYW1lcmFDb25maWdcIlxuICAgICAgKGdldEltYWdlKT1cImhhbmRsZUdldENhbWVyYU1lZGlhKCRldmVudCwgJ0NBUFRVUkUnKVwiXG4gICAgICAoZ2V0VmlkZW8pPVwiaGFuZGxlR2V0Q2FtZXJhTWVkaWEoJGV2ZW50LCAnUkVDT1JEJylcIlxuICAgICAgKG9uQ2xpY2tCYWNrKT1cImhhbmRsZU9uQ2xpY2tDYW1lcmFCYWNrKCRldmVudClcIlxuICAgICAgKG9uQ2xpY2tDbG9zZSk9XCJoYW5kbGVPbkNsaWNrQ2FtZXJhQ2xvc2UoJGV2ZW50KVwiXG4gICAgICAob25DbGlja1NhdmUpPVwiaGFuZGxlT25DbGlja1NhdmVDYW1lcmFNZWRpYSgkZXZlbnQsIGFjdGl2ZUNhbWVyYVR5cGUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlQ2FtZXJhVHlwZSA9PT0gJ0NBUFRVUkUnXCJcbiAgICAgICAgc2xvdD1cImNhcHR1cmUtaGVhZGVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcHR1cmUtaGVhZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXB0dXJlLWhlYWRlci1sZWZ0XCI+IDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXB0dXJlLWhlYWRlci1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlQ2FtZXJhQ29uZmlnPy5jYW1lcmFDb25maWc/LmhlYWRlcj8udGl0bGUgIT09ICcnXCJcbiAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIndoaXRlYmxvY2tcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiYWN0aXZlQ2FtZXJhQ29uZmlnPy5jYW1lcmFDb25maWc/LmhlYWRlcj8udGl0bGVcIlxuICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXB0dXJlLWhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJhY3RpdmVDYW1lcmFDb25maWc/LmNhbWVyYUNvbmZpZz8uaGVhZGVyPy5pc0V4cGFuZFwiXG4gICAgICAgICAgICAgIGlkPVwia3dpa2lkLWNhbWVyYS1oZWFkZXItZW5sYXJnZS1idXR0b25cIlxuICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIlxuICAgICAgICAgICAgICAgIGlzU2hvd0NhbWVyYUZ1bGxzY3JlZW4gPyAndHVpSWNvbk1pbmltaXplMicgOiAndHVpSWNvbk1heGltaXplMidcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZGVkXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaXNTaG93Q2FtZXJhRnVsbHNjcmVlbiA9ICFpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImFjdGl2ZUNhbWVyYUNvbmZpZz8uY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzQ2xvc2VcIlxuICAgICAgICAgICAgICBpZD1cImt3aWtpZC1jYW1lcmEtaGVhZGVyLWNsb3NlLWJ1dHRvblwiXG4gICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ3aGl0ZWJsb2NrXCJcbiAgICAgICAgICAgICAgaWNvbj1cInR1aUljb25DbG9zZUxhcmdlXCJcbiAgICAgICAgICAgICAgc2hhcGU9XCJyb3VuZGVkXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlT25DbGlja0NhbWVyYUNsb3NlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVDYW1lcmFUeXBlID09PSAnUkVDT1JEJ1wiXG4gICAgICAgIHNsb3Q9XCJyZWNvcmQtaGVhZGVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1oZWFkZXItcm93IHJvdy0xXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjb3JkLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNhbWVyYUNvbmZpZz8uY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzQmFjayAmJlxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ2FtZXJhUmVjb3JkaW5nU3RhdGUgPT0gJ05PTkUnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgICAgaWNvbj1cInR1aUljb25BcnJvd0xlZnRcIlxuICAgICAgICAgICAgICAgIHNoYXBlPVwicm91bmRlZFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPbkNsaWNrQ2FtZXJhQ2xvc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtaGVhZGVyLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlQ2FtZXJhQ29uZmlnPy5jYW1lcmFDb25maWc/LmhlYWRlcj8udGl0bGUgIT09ICcnXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImFjdGl2ZUNhbWVyYUNvbmZpZz8uY2FtZXJhQ29uZmlnPy5oZWFkZXI/LnRpdGxlXCJcbiAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZC1oZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGl2ZUNhbWVyYUNvbmZpZz8uY2FtZXJhQ29uZmlnPy5oZWFkZXI/LmlzRXhwYW5kXCJcbiAgICAgICAgICAgICAgICBpZD1cImt3aWtpZC1jYW1lcmEtaGVhZGVyLWVubGFyZ2UtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgICBpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgID8gJ3R1aUljb25NaW5pbWl6ZTInXG4gICAgICAgICAgICAgICAgICAgIDogJ3R1aUljb25NYXhpbWl6ZTInXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBzaGFwZT1cInJvdW5kZWRcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNTaG93Q2FtZXJhRnVsbHNjcmVlbiA9ICFpc1Nob3dDYW1lcmFGdWxsc2NyZWVuXCJcbiAgICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWNvcmQtaGVhZGVyLXJvdyByb3ctMlwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD1cImJsaW5raW5nLWRvdC1jb250YWluZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MucmVjb3JkaW5nXT1cImFjdGl2ZUNhbWVyYVJlY29yZGluZ1N0YXRlID09ICdSRUNPUkRJTkcnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnBhdXNlZF09XCJhY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnUEFVU0VEJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWNvcmRlZF09XCJcbiAgICAgICAgICAgICAgICBhY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnTk9ORScgfHxcbiAgICAgICAgICAgICAgICBhY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PT0gJ1JFQ09SREVEJ1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJhY3RpdmVDYW1lcmFSZWNvcmRpbmdTdGF0ZSA9PSAnUkVDT1JESU5HJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkb3QgcmVjb3JkaW5nIGJsaW5rXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlQ2FtZXJhUmVjb3JkaW5nU3RhdGUgPT09ICdQQVVTRUQnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRvdCBwYXVzZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUNhbWVyYVJlY29yZGluZ1N0YXRlID09ICdOT05FJyB8fFxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ2FtZXJhUmVjb3JkaW5nU3RhdGUgPT09ICdSRUNPUkRFRCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZG90IHJlY29yZGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAmbmJzcDt7eyBhY3RpdmVDYW1lcmFSZWNvcmRpbmdUaW1lIHwgZm9ybWF0VGltZXIgfX1cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVDYW1lcmFDb25maWc/LmNhbWVyYUNvbmZpZz8ub3RoZXJzXG4gICAgICAgICAgICAgICAgICAgICAgPy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIC9cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNhbWVyYUNvbmZpZz8uY2FtZXJhQ29uZmlnPy5vdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICA/Lm1heFJlY29yZGluZ1RpbWVJblNlY29uZHMgfCBmb3JtYXRUaW1lclxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2t3aWtpZC1jYW1lcmE+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=