@netgrif/components-core 6.3.1 → 6.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/data-fields/date-field/abstract-date-field.component.mjs +14 -5
- package/esm2020/lib/data-fields/date-time-field/abstract-date-time-field.component.mjs +14 -5
- package/esm2020/lib/data-fields/time-instance-abstract-field/abstract-time-instance-field.component.mjs +29 -4
- package/esm2020/lib/data-fields/time-instance-abstract-field/models/abstract-time-instance-field.mjs +5 -5
- package/esm2020/lib/data-fields/user-field/abstract-user-field.component.mjs +4 -1
- package/esm2020/lib/task/services/task-data.service.mjs +20 -20
- package/esm2020/lib/task-content/services/field-converter.service.mjs +2 -2
- package/fesm2015/netgrif-components-core.mjs +132 -93
- package/fesm2015/netgrif-components-core.mjs.map +1 -1
- package/fesm2020/netgrif-components-core.mjs +132 -93
- package/fesm2020/netgrif-components-core.mjs.map +1 -1
- package/lib/data-fields/date-field/abstract-date-field.component.d.ts +7 -2
- package/lib/data-fields/date-time-field/abstract-date-time-field.component.d.ts +7 -2
- package/lib/data-fields/time-instance-abstract-field/abstract-time-instance-field.component.d.ts +13 -3
- package/lib/data-fields/user-field/abstract-user-field.component.d.ts +1 -0
- package/lib/task/services/task-data.service.d.ts +6 -6
- package/package.json +1 -1
|
@@ -265,7 +265,7 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
265
265
|
}
|
|
266
266
|
const requestContext = this.createUpdateRequestContext();
|
|
267
267
|
this._eventQueue.scheduleEvent(new QueuedEvent(() => this.isSetDataRequestStillValid(requestContext.body), nextEvent => {
|
|
268
|
-
this.performSetDataRequest(setTaskId, requestContext
|
|
268
|
+
this.performSetDataRequest(setTaskId, requestContext, afterAction, nextEvent);
|
|
269
269
|
}, nextEvent => {
|
|
270
270
|
this.revertSetDataRequest(requestContext);
|
|
271
271
|
nextEvent.resolve(false);
|
|
@@ -356,12 +356,12 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
356
356
|
/**
|
|
357
357
|
* Performs a `setData` request on the task currently stored in the `taskContent` service
|
|
358
358
|
* @param setTaskId ID of the task
|
|
359
|
-
* @param
|
|
359
|
+
* @param context context of the `setData` request
|
|
360
360
|
* @param afterAction the action that should be performed after the request is processed
|
|
361
361
|
* @param nextEvent indicates to the event queue that the next event can be processed
|
|
362
362
|
*/
|
|
363
|
-
performSetDataRequest(setTaskId,
|
|
364
|
-
if (Object.keys(body).length === 0) {
|
|
363
|
+
performSetDataRequest(setTaskId, context, afterAction, nextEvent) {
|
|
364
|
+
if (Object.keys(context.body).length === 0) {
|
|
365
365
|
this.sendNotification(TaskEvent.SET_DATA, true);
|
|
366
366
|
afterAction.resolve(true);
|
|
367
367
|
nextEvent.resolve(true);
|
|
@@ -369,7 +369,7 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
369
369
|
}
|
|
370
370
|
this._taskState.startLoading(setTaskId);
|
|
371
371
|
this._taskState.startUpdating(setTaskId);
|
|
372
|
-
this._taskResourceService.setData(this._safeTask.stringId, body).pipe(take(1))
|
|
372
|
+
this._taskResourceService.setData(this._safeTask.stringId, context.body).pipe(take(1))
|
|
373
373
|
.subscribe((response) => {
|
|
374
374
|
if (!this.isTaskRelevant(setTaskId)) {
|
|
375
375
|
this._log.debug('current task changed before the set data response could be received, discarding...');
|
|
@@ -380,13 +380,13 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
380
380
|
return;
|
|
381
381
|
}
|
|
382
382
|
if (response.success) {
|
|
383
|
-
this.processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent,
|
|
383
|
+
this.processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context);
|
|
384
384
|
}
|
|
385
385
|
else if (response.error !== undefined) {
|
|
386
|
-
this.processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent,
|
|
386
|
+
this.processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context);
|
|
387
387
|
}
|
|
388
388
|
}, error => {
|
|
389
|
-
this.processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent,
|
|
389
|
+
this.processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, context);
|
|
390
390
|
});
|
|
391
391
|
}
|
|
392
392
|
/**
|
|
@@ -397,7 +397,7 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
397
397
|
* @param nextEvent indicates to the event queue that the next event can be processed
|
|
398
398
|
* @param body hold the data that was sent in request
|
|
399
399
|
*/
|
|
400
|
-
processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent,
|
|
400
|
+
processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context) {
|
|
401
401
|
if (response.error !== '') {
|
|
402
402
|
this._snackBar.openErrorSnackBar(this._translate.instant(response.error));
|
|
403
403
|
}
|
|
@@ -411,8 +411,8 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
411
411
|
this._changedFieldsService.emitChangedFields(changedFieldsMap);
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
|
-
this.revertToPreviousValue();
|
|
415
|
-
this.clearWaitingForResponseFlag(body);
|
|
414
|
+
this.revertToPreviousValue(context);
|
|
415
|
+
this.clearWaitingForResponseFlag(context.body);
|
|
416
416
|
this.updateStateInfo(afterAction, false, setTaskId);
|
|
417
417
|
nextEvent.resolve(false);
|
|
418
418
|
this._taskOperations.reload();
|
|
@@ -423,15 +423,15 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
423
423
|
* @param response the resulting Event outcome of the set data request
|
|
424
424
|
* @param afterAction the action that should be performed after the request is processed
|
|
425
425
|
* @param nextEvent indicates to the event queue that the next event can be processed
|
|
426
|
-
* @param
|
|
426
|
+
* @param context hold the data that was sent in request
|
|
427
427
|
*/
|
|
428
|
-
processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent,
|
|
428
|
+
processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context) {
|
|
429
429
|
const outcome = response.outcome;
|
|
430
430
|
const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(outcome);
|
|
431
431
|
if (Object.keys(changedFieldsMap).length > 0) {
|
|
432
432
|
this._changedFieldsService.emitChangedFields(changedFieldsMap);
|
|
433
433
|
}
|
|
434
|
-
this.clearWaitingForResponseFlag(body);
|
|
434
|
+
this.clearWaitingForResponseFlag(context.body);
|
|
435
435
|
this._snackBar.openSuccessSnackBar(!!outcome.message ? outcome.message : this._translate.instant('tasks.snackbar.dataSaved'));
|
|
436
436
|
this.updateStateInfo(afterAction, true, setTaskId);
|
|
437
437
|
nextEvent.resolve(true);
|
|
@@ -444,7 +444,7 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
444
444
|
* @param nextEvent indicates to the event queue that the next event can be processed
|
|
445
445
|
* @param body hold the data that was sent in request
|
|
446
446
|
*/
|
|
447
|
-
processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent,
|
|
447
|
+
processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, context) {
|
|
448
448
|
this._log.debug('setting task data failed', error);
|
|
449
449
|
if (!this.isTaskRelevant(setTaskId)) {
|
|
450
450
|
this._log.debug('current task changed before the get data error could be received');
|
|
@@ -454,8 +454,8 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
454
454
|
nextEvent.resolve(false);
|
|
455
455
|
return;
|
|
456
456
|
}
|
|
457
|
-
this.revertToPreviousValue();
|
|
458
|
-
this.clearWaitingForResponseFlag(body);
|
|
457
|
+
this.revertToPreviousValue(context);
|
|
458
|
+
this.clearWaitingForResponseFlag(context.body);
|
|
459
459
|
this._snackBar.openErrorSnackBar(this._translate.instant('tasks.snackbar.failedSave'));
|
|
460
460
|
this.updateStateInfo(afterAction, false, setTaskId);
|
|
461
461
|
nextEvent.resolve(false);
|
|
@@ -531,10 +531,10 @@ export class TaskDataService extends TaskHandlingService {
|
|
|
531
531
|
sendNotification(event, success) {
|
|
532
532
|
this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, event, success));
|
|
533
533
|
}
|
|
534
|
-
revertToPreviousValue() {
|
|
534
|
+
revertToPreviousValue(context) {
|
|
535
535
|
this._safeTask.dataGroups.forEach(dataGroup => {
|
|
536
536
|
dataGroup.fields.forEach(field => {
|
|
537
|
-
if (field.initialized && field.valid && field.
|
|
537
|
+
if (field.initialized && field.valid && Object.keys(context.previousValues).includes(field.stringId)) {
|
|
538
538
|
field.revertToPreviousValue();
|
|
539
539
|
}
|
|
540
540
|
});
|
|
@@ -558,4 +558,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
558
558
|
}] }, { type: i8.SelectedCaseService, decorators: [{
|
|
559
559
|
type: Optional
|
|
560
560
|
}] }, { type: i9.TaskContentService }, { type: i10.CallChainService }, { type: i11.EventQueueService }, { type: i12.UserComparatorService }, { type: i13.EventService }, { type: i14.ChangedFieldsService }]; } });
|
|
561
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2svc2VydmljZXMvdGFzay1kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBYSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFVdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFOUUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXpFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBRzdHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFRbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUY7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsbUJBQW1CO0lBS3BELFlBQXNCLFVBQW1DLEVB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QUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs2R0Eza0JRLGVBQWUsNlBBWUosbUJBQW1CO2lIQVo5QixlQUFlOzRGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQWFNLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc30gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2NoYW5nZWQtZmllbGRzJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvdGFzay1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVxdWVzdFN0YXRlU2VydmljZX0gZnJvbSAnLi90YXNrLXJlcXVlc3Qtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtTbmFja0JhclNlcnZpY2V9IGZyb20gJy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvdGFzay1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7RmllbGRDb252ZXJ0ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvZmllbGQtY29udmVydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrU2V0RGF0YVJlcXVlc3RCb2R5fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3Rhc2stc2V0LWRhdGEtcmVxdWVzdC1ib2R5JztcbmltcG9ydCB7VGFza0hhbmRsaW5nU2VydmljZX0gZnJvbSAnLi90YXNrLWhhbmRsaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHtOQUVfVEFTS19PUEVSQVRJT05TfSBmcm9tICcuLi9tb2RlbHMvdGFzay1vcGVyYXRpb25zLWluamVjdGlvbi10b2tlbic7XG5pbXBvcnQge1Rhc2tPcGVyYXRpb25zfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rhc2stb3BlcmF0aW9ucyc7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0ZpbGVGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZmlsZS1maWVsZC9tb2RlbHMvZmlsZS1maWVsZCc7XG5pbXBvcnQge1NlbGVjdGVkQ2FzZVNlcnZpY2V9IGZyb20gJy4vc2VsZWN0ZWQtY2FzZS5zZXJ2aWNlJztcbmltcG9ydCB7RmlsZUxpc3RGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZmlsZS1saXN0LWZpZWxkL21vZGVscy9maWxlLWxpc3QtZmllbGQnO1xuaW1wb3J0IHtjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb259IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQge1Rhc2tFdmVudH0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQnO1xuaW1wb3J0IHtUYXNrRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvc2VydmljZXMvdGFzay1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7RGF0YUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9tb2RlbHMvYWJzdHJhY3QtZGF0YS1maWVsZCc7XG5pbXBvcnQge0NhbGxDaGFpblNlcnZpY2V9IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9jYWxsLWNoYWluLnNlcnZpY2UnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0R5bmFtaWNFbnVtZXJhdGlvbkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9lbnVtZXJhdGlvbi1maWVsZC9tb2RlbHMvZHluYW1pYy1lbnVtZXJhdGlvbi1maWVsZCc7XG5pbXBvcnQge0RhdGFHcm91cH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9kYXRhLWdyb3Vwcyc7XG5pbXBvcnQge0V2ZW50UXVldWVTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9zZXJ2aWNlcy9ldmVudC1xdWV1ZS5zZXJ2aWNlJztcbmltcG9ydCB7UXVldWVkRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL21vZGVsL3F1ZXVlZC1ldmVudCc7XG5pbXBvcnQge0FmdGVyQWN0aW9ufSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vYWZ0ZXItYWN0aW9uJztcbmltcG9ydCB7VXNlckNvbXBhcmF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi91c2VyL3NlcnZpY2VzL3VzZXItY29tcGFyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1NldERhdGFSZXF1ZXN0Q29udGV4dH0gZnJvbSAnLi4vbW9kZWxzL3Rhc2stc2V0LWRhdGEtcmVxdWVzdC1jb250ZXh0JztcbmltcG9ydCB7RXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL21lc3NhZ2UtcmVzb3VyY2UnO1xuaW1wb3J0IHtFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vY2hhbmdlZC1maWVsZHMvc2VydmljZXMvY2hhbmdlZC1maWVsZHMuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNNYXB9IGZyb20gJy4uLy4uL2V2ZW50L3NlcnZpY2VzL2ludGVyZmFjZXMvY2hhbmdlZC1maWVsZHMtbWFwJztcbmltcG9ydCB7VGFza0ZpZWxkc30gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZmllbGRzJztcbmltcG9ydCB7RW51bWVyYXRpb25GaWVsZH0gZnJvbSBcIi4uLy4uL2RhdGEtZmllbGRzL2VudW1lcmF0aW9uLWZpZWxkL21vZGVscy9lbnVtZXJhdGlvbi1maWVsZFwiO1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGxvYWRpbmcgYW5kIHVwZGF0aW5nIG9mIGRhdGEgZmllbGRzIGFuZCBiZWhhdmlvdXIgb2ZcbiAqIGEgc2luZ2xlIFRhc2sgb2JqZWN0IG1hbmFnZWQgYnkgYSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBpbnN0YW5jZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhc2tEYXRhU2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHJvdGVjdGVkIF91cGRhdGVTdWNjZXNzJDogU3ViamVjdDxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2RhdGFSZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdGFza1N0YXRlOiBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrUmVzb3VyY2VTZXJ2aWNlOiBUYXNrUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZmllbGRDb252ZXJ0ZXJTZXJ2aWNlOiBGaWVsZENvbnZlcnRlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrRXZlbnQ6IFRhc2tFdmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfVEFTS19PUEVSQVRJT05TKSBwcm90ZWN0ZWQgX3Rhc2tPcGVyYXRpb25zOiBUYXNrT3BlcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBfc2VsZWN0ZWRDYXNlU2VydmljZTogU2VsZWN0ZWRDYXNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBfdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hZnRlckFjdGlvbkZhY3Rvcnk6IENhbGxDaGFpblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFF1ZXVlOiBFdmVudFF1ZXVlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VzZXJDb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSkge1xuICAgICAgICBzdXBlcihfdGFza0NvbnRlbnRTZXJ2aWNlLCBfc2VsZWN0ZWRDYXNlU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN1Y2Nlc3MkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICAgICAgdGhpcy5fZGF0YVJlbG9hZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRGF0YVJlbG9hZFJlcXVlc3QkLnN1YnNjcmliZShxdWV1ZWRGcm9udGVuZEFjdGlvbiA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVUYXNrRGF0YUZpZWxkcyh0aGlzLl9hZnRlckFjdGlvbkZhY3RvcnkuY3JlYXRlKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzICYmIHF1ZXVlZEZyb250ZW5kQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5wZXJmb3JtRnJvbnRlbmRBY3Rpb24ocXVldWVkRnJvbnRlbmRBY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN1Y2Nlc3MkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFSZWxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNUYXNrUHJlc2VudCgpICYmIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBncm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiBmaWVsZC5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBiYWNrZW5kXG4gICAgICogY2FsbHMgaW4gW3VwZGF0ZVRhc2tEYXRhRmllbGRzXXtAbGluayBUYXNrRGF0YVNlcnZpY2UjdXBkYXRlVGFza0RhdGFGaWVsZHN9IG1ldGhvZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVwZGF0ZVN1Y2Nlc3MkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlU3VjY2VzcyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIERhdGEgRmllbGRzIG9mIGFuIHVuaW5pdGlhbGl6ZWQgVGFzayBmcm9tIGJhY2tlbmRcbiAgICAgKiBhbmQgcG9wdWxhdGVzIHRoZSBUYXNrIG1hbmFnZWQgYnkge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gd2l0aCB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEJld2FyZSB0aGF0IGlmIHRoZSBUYXNrIGhhcyBzb21lIGRhdGEgYWxyZWFkeSBsb2FkZWQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmdcbiAgICAgKiBhbmQgb25seSBwYXNzZXMgYHRydWVgIHRvIHRoZSBgYWZ0ZXJBY3Rpb25gIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogSWYgdGhlIHRhc2sgaGVsZCB3aXRoaW4gdGhlIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGNoYW5nZXMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGlnbm9yZWRcbiAgICAgKiBhbmQgdGhlIGBhZnRlckFjdGlvbmAgd2lsbCBub3QgYmUgZXhlY3V0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgdGhlIHJlcXVlc3QgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBlbWl0cyBgdHJ1ZWAgaW50byB0aGUgU3ViamVjdCwgb3RoZXJ3aXNlIGBmYWxzZWAgd2lsbCBiZSBlbWl0dGVkXG4gICAgICogQHBhcmFtIGZvcmNlIHNldCB0byBgdHJ1ZWAgaWYgeW91IG5lZWQgZm9yY2UgcmVsb2FkIG9mIGFsbCB0YXNrIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLCBmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNUYXNrUHJlc2VudCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtR2V0RGF0YVJlcXVlc3QoYWZ0ZXJBY3Rpb24sIGZvcmNlLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSwgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYGdldERhdGFgIHJlcXVlc3Qgb24gdGhlIHRhc2sgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYHRhc2tDb250ZW50YCBzZXJ2aWNlXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBmb3JjZSBzZXQgdG8gYHRydWVgIGlmIHlvdSBuZWVkIGZvcmNlIHJlbG9hZCBvZiBhbGwgdGFzayBkYXRhXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtR2V0RGF0YVJlcXVlc3QoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBmb3JjZTogYm9vbGVhbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPiAwICYmICFmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgdHJ1ZSk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUubmV4dCh0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ290dGVuVGFza0lkID0gdGhpcy5fc2FmZVRhc2suc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoZ290dGVuVGFza0lkKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmdldERhdGEoZ290dGVuVGFza0lkKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkYXRhR3JvdXBzID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1Y2Nlc3NmdWxHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQsIGRhdGFHcm91cHMsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvbmVvdXNHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQsIGVycm9yLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYGdldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gZ290dGVuVGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyByZXF1ZXN0ZWRcbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgcmV0dXJuZWQgZGF0YSBncm91cHMgb2YgdGhlIHRhc2tcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzU3VjY2Vzc2Z1bEdldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGdvdHRlblRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSByZXNwb25zZSBjb3VsZCBiZSByZWNlaXZlZCwgZGlzY2FyZGluZy4uLicpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHMgPSB7fTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMgPSBkYXRhR3JvdXBzO1xuICAgICAgICBpZiAoZGF0YUdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5pbmZvKCdUYXNrIGhhcyBubyBkYXRhICcgKyB0aGlzLl9zYWZlVGFzayk7XG4gICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3RoaXMuX3NhZmVUYXNrLnN0cmluZ0lkXSA9IHt9IGFzIFRhc2tGaWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW3RoaXMuX3NhZmVUYXNrLmNhc2VJZF0gPSBbdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRdO1xuICAgICAgICAgICAgZGF0YUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhR3JvdXBQYXJlbnRDYXNlSWQ6IHN0cmluZyA9IGdyb3VwLnBhcmVudENhc2VJZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5fc2FmZVRhc2suY2FzZUlkIDogZ3JvdXAucGFyZW50Q2FzZUlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRhc2tJZDogc3RyaW5nID0gZ3JvdXAucGFyZW50VGFza0lkID09PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCA6IGdyb3VwLnBhcmVudFRhc2tJZDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUcmFuc2l0aW9uSWQ6IHN0cmluZyA9IGdyb3VwLnBhcmVudFRyYW5zaXRpb25JZCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2sudHJhbnNpdGlvbklkIDogZ3JvdXAucGFyZW50VHJhbnNpdGlvbklkO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhR3JvdXBQYXJlbnRDYXNlSWQgIT09IHRoaXMuX3NhZmVUYXNrLmNhc2VJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkc1tkYXRhR3JvdXBQYXJlbnRDYXNlSWRdID0gW2dyb3VwLnBhcmVudFRhc2tJZF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0ucHVzaChncm91cC5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhR3JvdXBQYXJlbnRDYXNlSWQgPT09IHRoaXMuX3NhZmVUYXNrLmNhc2VJZFxuICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnRUYXNrSWQgIT09IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0uaW5jbHVkZXMocGFyZW50VGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0ucHVzaChncm91cC5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3BhcmVudFRhc2tJZF0gPSB7fSBhcyBUYXNrRmllbGRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBncm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS50cmFuc2l0aW9uSWQgPSBwYXJlbnRUcmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS5maWVsZHNbZmllbGQuc3RyaW5nSWRdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlQ2hhbmdlcygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgRHluYW1pY0VudW1lcmF0aW9uRmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0RhdGFGaWVsZHModGhpcy5fYWZ0ZXJBY3Rpb25GYWN0b3J5LmNyZWF0ZShib29sID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0RhdGFGaWVsZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBGaWxlRmllbGQgfHwgZmllbGQgaW5zdGFuY2VvZiBGaWxlTGlzdEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5jaGFuZ2VkRmllbGRzJC5zdWJzY3JpYmUoKGNoYW5nZTogQ2hhbmdlZEZpZWxkc01hcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IGdyb3VwLmZpZWxkcy5sZW5ndGggOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSArPSBncm91cC5maWVsZHMubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuR0VUX0RBVEEsIHRydWUpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUubmV4dCh0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLm5leHQodGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCkgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb25lb3VzIG91dGNvbWUgb2YgYSBgZ2V0RGF0YWAgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBnb3R0ZW5UYXNrSWQgdGhlIElEIG9mIHRoZSB0YXNrIHdob3NlIGRhdGEgd2FzIHJlcXVlc3RlZFxuICAgICAqIEBwYXJhbSBlcnJvciB0aGUgcmV0dXJuZWQgZXJyb3JcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzRXJyb25lb3VzR2V0RGF0YVJlcXVlc3QoZ290dGVuVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnZ2V0dGluZyB0YXNrIGRhdGEgZmFpbGVkJywgZXJyb3IpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tSZWxldmFudChnb3R0ZW5UYXNrSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgZ2V0IGRhdGEgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnJvci5zdGF0dXMgPT09IDUwMCAmJiBlcnJvci5lcnJvci5tZXNzYWdlICYmIGVycm9yLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ291bGQgbm90IGZpbmQgdGFzayB3aXRoIGlkJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5XYXJuaW5nU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLm5vTG9uZ2VyRXhpc3RzJykpO1xuICAgICAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIoYCR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLm5vR3JvdXAnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2sudGl0bGV9ICR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmZhaWxlZFRvTG9hZCcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuR0VUX0RBVEEsIGZhbHNlKTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBhbGwgY2hhbmdlZCBkYXRhIGZpZWxkcyBhbmQgbm90aWZpZXMgdGhlIGJhY2tlbmQgb2YgdGhlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsIGNsZWFycyB0aGUgW2NoYW5nZWRde0BsaW5rIERhdGFGaWVsZCNjaGFuZ2VkfSBmbGFnIG9uIGFsbCBkYXRhIGZpZWxkcyB0aGF0IHdlcmUgYSBwYXJ0IG9mIHRoZSByZXF1ZXN0XG4gICAgICogYW5kIGVtaXRzIGEge0BsaW5rIENoYW5nZWRGaWVsZHN9IG9iamVjdCBpbnRvIHRoaXMgb2JqZWN0J3MgW2NoYW5nZWRGaWVsZHMkXXtAbGluayBUYXNrRGF0YVNlcnZpY2UjY2hhbmdlZEZpZWxkcyR9IHN0cmVhbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YXNrIGhlbGQgd2l0aGluIHRoZSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBjaGFuZ2VzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBpZ25vcmVkXG4gICAgICogYW5kIHRoZSBgYWZ0ZXJBY3Rpb25gIHdpbGwgbm90IGJlIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgZW1pdHMgYHRydWVgIGludG8gdGhlIFN1YmplY3QsIG90aGVyd2lzZSBgZmFsc2VgIHdpbGwgYmUgZW1pdHRlZFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVUYXNrRGF0YUZpZWxkcyhhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUHJlc2VudCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ1Rhc2sgaXMgbm90IHByZXNlbnQuIFVwZGF0ZSByZXF1ZXN0IGlnbm9yZWQuJyk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay51c2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGlzIG5vdCBhc3NpZ25lZC4uLicpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXRUYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcblxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPD0gMCkge1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gdGhpcy5jcmVhdGVVcGRhdGVSZXF1ZXN0Q29udGV4dCgpO1xuXG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmlzU2V0RGF0YVJlcXVlc3RTdGlsbFZhbGlkKHJlcXVlc3RDb250ZXh0LmJvZHkpLFxuICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1TZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIHJlcXVlc3RDb250ZXh0LmJvZHksIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRTZXREYXRhUmVxdWVzdChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICogR29lcyBvdmVyIGFsbCB0aGUgZGF0YSBmaWVsZHMgaW4gdGhlIG1hbmFnZWQgVGFzayBhbmQgaWYgdGhleSBhcmUgdmFsaWQgYW5kIGNoYW5nZWQgYWRkcyB0aGVtIHRvIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQge1xuICAgICAgICBjb25zdCBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0ID0ge1xuICAgICAgICAgICAgYm9keToge30sXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlczoge31cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZpbHRlcihkYXRhR3JvdXAgPT4gZGF0YUdyb3VwLnBhcmVudFRhc2tJZCA9PT0gdW5kZWZpbmVkKS5mb3JFYWNoKGRhdGFHcm91cCA9PiB7XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVt0aGlzLl90YXNrLnN0cmluZ0lkXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCB0aGlzLl90YXNrLnN0cmluZ0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZmlsdGVyKGRhdGFHcm91cCA9PiBkYXRhR3JvdXAucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhR3JvdXAuZmllbGRzLnNvbWUoZmllbGQgPT4gdGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVtkYXRhR3JvdXAucGFyZW50VGFza0lkXSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCBkYXRhR3JvdXAucGFyZW50VGFza0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhZGRGaWVsZFRvU2V0RGF0YVJlcXVlc3RCb2R5KGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIHRhc2tJZDogc3RyaW5nLCBmaWVsZDogRGF0YUZpZWxkPGFueT4pOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC5ib2R5W3Rhc2tJZF1bZmllbGQuc3RyaW5nSWRdID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGZpZWxkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9maWVsZENvbnZlcnRlclNlcnZpY2UuZm9ybWF0VmFsdWVGb3JCYWNrZW5kKGZpZWxkLCBmaWVsZC52YWx1ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZC5wcmV2aW91c1ZhbHVlO1xuICAgICAgICBmaWVsZC5jaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbntcbiAgICAgICAgcmV0dXJuIChmaWVsZCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQpICYmIChmaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdhdXRvY29tcGxldGUnKSAmJiAhZmllbGQudmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpZWxkIHRoZSBjaGVja2VkIGZpZWxkXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgZmllbGQgd2FzIHVwZGF0ZWQgb24gZnJvbnRlbmQgYW5kIHRodXMgdGhlIGJhY2tlbmQgc2hvdWxkIGJlIG5vdGlmaWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhc0ZpZWxkVXBkYXRlZChmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZC5pbml0aWFsaXplZCAmJiBmaWVsZC5jaGFuZ2VkICYmIChmaWVsZC52YWxpZCB8fCBmaWVsZC5zZW5kSW52YWxpZFZhbHVlcykgJiYgKCF0aGlzLmlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGNvdWxkIHN0aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgbG9nZ2VkIHVzZXJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1NldERhdGFSZXF1ZXN0U3RpbGxWYWxpZChyZXF1ZXN0OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2sudXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGhpcy5fc2FmZVRhc2sudXNlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrSWRzSW5SZXF1ZXN0OiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMocmVxdWVzdCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0lkIG9mIHRhc2tJZHNJblJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCkuaW5jbHVkZXModGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihgVGFzayBpZCAke3Rhc2tJZH0gaXMgbm90IHByZXNlbnQgaW4gdGFzayBmaWVsZHMgaW5kZXhgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkc09mUmVxdWVzdCA9IE9iamVjdC5rZXlzKHJlcXVlc3RbdGFza0lkXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHNPZlJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGFza0lkXS5maWVsZHNbZmllbGRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBVbmV4cGVjdGVkIHN0YXRlLiBEYXRhZmllbGQgJHtmaWVsZElkfSBvZiB0YXNrICR7dGFza0lkXG4gICAgICAgICAgICAgICAgICAgIH0gaW4gc2V0RGF0YSByZXF1ZXN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSB0YXNrLmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZmllbGQuYmVoYXZpb3IuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKGBGaWVsZCAke2ZpZWxkSWR9LCB3YXMgbWVhbnQgdG8gYmUgc2V0IHRvXG4gICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdFt0YXNrSWRdW2ZpZWxkSWRdKVxuICAgICAgICAgICAgICAgICAgICB9LCBidXQgaXMgbm8gbG9uZXIgZWRpdGFibGUuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgc2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIElEIG9mIHRoZSB0YXNrXG4gICAgICogQHBhcmFtIGJvZHkgY29udGVudCBvZiB0aGUgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsIGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHksIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYm9keSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24oVGFza0V2ZW50LlNFVF9EQVRBLCB0cnVlKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoc2V0VGFza0lkKTtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0VXBkYXRpbmcoc2V0VGFza0lkKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGhpcy5fc2FmZVRhc2suc3RyaW5nSWQsIGJvZHkpLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoc2V0VGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgc2V0IGRhdGEgcmVzcG9uc2UgY291bGQgYmUgcmVjZWl2ZWQsIGRpc2NhcmRpbmcuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wVXBkYXRpbmcoc2V0VGFza0lkKTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1Y2Nlc3NmdWxTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIHJlc3BvbnNlLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBib2R5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVW5zdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkLCByZXNwb25zZSwgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9uZW91c1NldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgZXJyb3IsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGJvZHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIHVuc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyBzZXRcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHJlc3VsdGluZyBFdmVudCBvdXRjb21lIG9mIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gYm9keSBob2xkIHRoZSBkYXRhIHRoYXQgd2FzIHNlbnQgaW4gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzVW5zdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQocmVzcG9uc2UuZXJyb3IpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5mYWlsZWRTYXZlJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5vdXRjb21lKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRjb21lID0gcmVzcG9uc2Uub3V0Y29tZTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWUpO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZEZpZWxkc01hcCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2ZXJ0VG9QcmV2aW91c1ZhbHVlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGJvZHkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5mbyhhZnRlckFjdGlvbiwgZmFsc2UsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyBzZXRcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHJlc3VsdGluZyBFdmVudCBvdXRjb21lIG9mIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gYm9keSBob2xkIHRoZSBkYXRhIHRoYXQgd2FzIHNlbnQgaW4gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzU3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogVGFza1NldERhdGFSZXF1ZXN0Qm9keSkge1xuICAgICAgICBjb25zdCBvdXRjb21lID0gcmVzcG9uc2Uub3V0Y29tZTtcbiAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUob3V0Y29tZSk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZWRGaWVsZHNNYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGJvZHkpO1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuU3VjY2Vzc1NuYWNrQmFyKCEhb3V0Y29tZS5tZXNzYWdlID8gb3V0Y29tZS5tZXNzYWdlIDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmRhdGFTYXZlZCcpKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIHRydWUsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvbmVvdXMgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIGVycm9yIHRoZSByZXR1cm5lZCBlcnJvclxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGJvZHkgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Vycm9uZW91c1NldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdzZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KHNldFRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoKTtcbiAgICAgICAgdGhpcy5jbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoYm9keSk7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5mYWlsZWRTYXZlJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5mbyhhZnRlckFjdGlvbiwgZmFsc2UsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgZWZmZWN0cyBvZiBhIGZhaWxlZCBgc2V0RGF0YWAgcmVxdWVzdCwgc28gdGhhdCB0aGUgdXNlciBzZWVzIGN1cnJlbnQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBmYWlsZWQgcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXZlcnRTZXREYXRhUmVxdWVzdChjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uIGNvdWxkIGJlIGltcHJvdmVkIGlmIHdlIGhhZCBhIG1hcCBvZiBhbGwgdGhlIGRhdGEgZmllbGRzIGluIGEgdGFza1xuICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gT2JqZWN0LmtleXMoY29udGV4dC5ib2R5KS5sZW5ndGg7XG4gICAgICAgIGxldCBmb3VuZENvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGFncm91cCBvZiB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRhdGFncm91cC5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuYm9keVtmaWVsZC5zdHJpbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLmZvcm1hdFZhbHVlRm9yQmFja2VuZChmaWVsZCwgZmllbGQudmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmJvZHlbZmllbGQuc3RyaW5nSWRdLnZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZVdpdGhvdXRDaGFuZ2UoY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvdW5kQ291bnQrKztcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb3VudCA9PT0gdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBJbnZhbGlkIHN0YXRlLiBTb21lIGRhdGEgZmllbGRzIG9mIHRhc2sgJHt0aGlzLl9zYWZlVGFzay5zdHJpbmdJZH0sIGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiBpdCFgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgdmFsdWVzIHRoYXQgYXJlIGluIHRoZSBiYWNrZW5kIGNvbXBhdGlibGUgZm9ybWF0IGFzIGdpdmVuIGJ5IHRoZSB7QGxpbmsgRmllbGRDb252ZXJ0ZXJTZXJ2aWNlfVxuICAgICAqIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUsIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gY3VycmVudCB0aGUgY3VycmVudCB2YWx1ZSAoY2FuIGFsc28gYmUgY2FsbGVkIGB2YWx1ZTFgIG9yIGBsZWZ0YClcbiAgICAgKiBAcGFyYW0gb2xkIHRoZSBuZXcgdmFsdWUgKGNhbiBhbHNvIGJlIGNhbGxlZCBgdmFsdWUyYCBvciBgcmlnaHRgKVxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhbmQgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhjdXJyZW50LCBvbGQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50cyEgQ2Fubm90IGNvbXBhcmUgYXJyYXkgdmFsdWUgdG8gbm9uLWFycmF5IHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gb2xkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gb2xkW2luZGV4XSA9PT0gdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPT09IG9sZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBzdG9wcyBsb2FkaW5nIGFuZCB1cGRhdGluZyBpbmRpY2F0b3JzLCBhbmQgZW1pdHMgdGhlIGByZXN1bHRgIHZhbHVlXG4gICAgICogdG8gYm90aCB0aGUgYGFmdGVyQWN0aW9uYCBhbmQgW191cGRhdGVTdWNjZXNzJF17QGxpbmsgVGFza0RhdGFTZXJ2aWNlI191cGRhdGVTdWNjZXNzJH0gc3RyZWFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgY2FsbCBjaGFpbiBzdGVhbSBvZiB0aGUgdXBkYXRlIGRhdGEgbWV0aG9kXG4gICAgICogQHBhcmFtIHJlc3VsdCByZXN1bHQgb2YgdGhlIHVwZGF0ZSBkYXRhIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUge0BsaW5rIFRhc2t9LCB3aG8ncyBzdGF0ZSBzaG91bGQgYmUgdXBkYXRlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCByZXN1bHQ6IGJvb2xlYW4sIHNldFRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVTdWNjZXNzJC5vYnNlcnZlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdWNjZXNzJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5TRVRfREFUQSwgcmVzdWx0KTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2hlcyBhIGdldC9zZXQgZGF0YSBub3RpZmljYXRpb24gdG8gdGhlIHtAbGluayBUYXNrRXZlbnRTZXJ2aWNlfVxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCB0byB0aGUgdGFza1xuICAgICAqIEBwYXJhbSBzdWNjZXNzIHdoZXRoZXIgdGhlIGdldC9zZXQgZGF0YSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbmROb3RpZmljYXRpb24oZXZlbnQ6IFRhc2tFdmVudC5HRVRfREFUQSB8IFRhc2tFdmVudC5TRVRfREFUQSwgc3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRXZlbnQucHVibGlzaFRhc2tFdmVudChjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb24odGhpcy5fc2FmZVRhc2ssIGV2ZW50LCBzdWNjZXNzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXZlcnRUb1ByZXZpb3VzVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZm9yRWFjaChkYXRhR3JvdXAgPT4ge1xuICAgICAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5pdGlhbGl6ZWQgJiYgZmllbGQudmFsaWQgJiYgZmllbGQuY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoYm9keTogVGFza1NldERhdGFSZXF1ZXN0Qm9keSkge1xuICAgICAgICBPYmplY3Qua2V5cyhib2R5KS5mb3JFYWNoKHRhc2tJZCA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhib2R5W3Rhc2tJZF0pLmZvckVhY2goZmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFt0YXNrSWRdLmZpZWxkc1tmaWVsZElkXS53YWl0aW5nRm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
561
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2svc2VydmljZXMvdGFzay1kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBYSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFVdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFOUUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXpFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBRzdHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFRbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUY7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsbUJBQW1CO0lBS3BELFlBQXNCLFVBQW1DLEVBQ25DLFVBQTRCLEVBQzVCLElBQW1CLEVBQ25CLFNBQTBCLEVBQzFCLG9CQUF5QyxFQUN6QyxzQkFBNkMsRUFDN0MsVUFBNEIsRUFDQyxlQUErQixFQUMxRCxvQkFBeUMsRUFDckQsbUJBQXVDLEVBQzdCLG1CQUFxQyxFQUNyQyxXQUE4QixFQUM5QixlQUFzQyxFQUN0QyxhQUEyQixFQUMzQixxQkFBMkM7UUFDN0QsS0FBSyxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFmL0IsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUFDN0MsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFHNUQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFrQjtRQUNyQyxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFFN0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzlDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDNUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3BFLElBQUksT0FBTyxJQUFJLG9CQUFvQixFQUFFO29CQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDeEU7WUFDTCxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtZQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ2xEO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSx3QkFBd0IsQ0FBQyxjQUEyQixJQUFJLFdBQVcsRUFBRSxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ3ZGLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUMxQyxHQUFHLEVBQUU7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxDQUFDLEVBQ0QsU0FBUyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDWCxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLHFCQUFxQixDQUFDLFdBQXdCLEVBQUUsS0FBYyxFQUFFLFNBQXNCO1FBQzVGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2RSxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLE9BQU87U0FDVjtRQUNELElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pGLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsOEJBQThCLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sK0JBQStCLENBQUMsWUFBb0IsRUFDcEIsVUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsU0FBc0I7UUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztZQUN0RyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN2QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQWdCLENBQUM7U0FDeEY7YUFBTTtZQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixNQUFNLHFCQUFxQixHQUFXLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDcEgsTUFBTSxZQUFZLEdBQVcsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUM3RyxNQUFNLGtCQUFrQixHQUFXLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLENBQUMsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFDM0QsSUFBSSxxQkFBcUIsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtvQkFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO3dCQUMzRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDbkc7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztxQkFDckc7aUJBQ0o7cUJBQU0sSUFBSSxxQkFBcUIsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07dUJBQ25ELFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7dUJBQ3hDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUNyRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNyRztnQkFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQ3BGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBZ0IsQ0FBQztpQkFDN0U7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDM0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2lCQUN0RTtnQkFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7b0JBQ3pGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ3RGLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO3dCQUNoQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQzdCLElBQUksS0FBSyxZQUFZLHVCQUF1QixFQUFFO2dDQUMxQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQ0FDckIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7b0NBQzdELEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dDQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUNQO2lDQUFNO2dDQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOzZCQUMvQjt5QkFDSjtvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLEtBQUssWUFBWSxTQUFTLElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRTt3QkFDOUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUF3QixFQUFFLEVBQUU7NEJBQ3hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDekQsQ0FBQyxDQUFDLENBQUM7cUJBQ047Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUM7b0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRCxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sOEJBQThCLENBQUMsWUFBb0IsRUFDcEIsS0FBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsU0FBc0I7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUNwRixXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsRUFBRTtZQUNwSixJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2pDO2FBQU0sSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNILElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzswQkFDdkUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbEg7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxvQkFBb0IsQ0FBQyxjQUEyQixJQUFJLFdBQVcsRUFBRTtRQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDaEUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ25ELFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsT0FBTztTQUNWO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFFMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUU7WUFDOUIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FDMUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFDMUQsU0FBUyxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxFQUNELFNBQVMsQ0FBQyxFQUFFO1lBQ1IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDTywwQkFBMEI7UUFDaEMsTUFBTSxPQUFPLEdBQThCO1lBQ3ZDLElBQUksRUFBRSxFQUFFO1lBQ1IsY0FBYyxFQUFFLEVBQUU7U0FDckIsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3BHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDcEcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzdDO2lCQUFNO2dCQUNILE9BQU87YUFDVjtZQUNELFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlFLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRVMsNEJBQTRCLENBQUMsT0FBa0MsRUFBRSxNQUFjLEVBQUUsS0FBcUI7UUFDNUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3BELEtBQUssRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDL0UsQ0FBQztRQUNGLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDN0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVTLDJCQUEyQixDQUFDLEtBQXlCO1FBQzNELE9BQU8sQ0FBQyxLQUFLLFlBQVksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNoSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZUFBZSxDQUFDLEtBQXlCO1FBQy9DLE9BQU8sS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUVEOzs7T0FHRztJQUNPLDBCQUEwQixDQUFDLE9BQStCO1FBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDdkIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNuQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBa0IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsTUFBTSxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUN6RSxPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2RCxLQUFLLE1BQU0sT0FBTyxJQUFJLGlCQUFpQixFQUFFO2dCQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0UsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsT0FBTyxZQUFZLE1BQ2xFLGlEQUFpRCxDQUFDLENBQUM7b0JBQ25ELE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsT0FBTztzQkFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQ3pDLDZCQUE2QixDQUFDLENBQUM7b0JBQy9CLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08scUJBQXFCLENBQUMsU0FBaUIsRUFBRSxPQUFrQyxFQUFFLFdBQXdCLEVBQUUsU0FBc0I7UUFDbkksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hELFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pGLFNBQVMsQ0FBQyxDQUFDLFFBQXFDLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztnQkFDdEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU87YUFDVjtZQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUM5RjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2hHO1FBQ0wsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1AsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08saUNBQWlDLENBQUMsU0FBaUIsRUFDakIsUUFBcUMsRUFDckMsV0FBd0IsRUFDeEIsU0FBc0IsRUFDdEIsT0FBa0M7UUFDMUUsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzdFO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztTQUMxRjtRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNsQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE1BQU0sZ0JBQWdCLEdBQXFCLElBQUksQ0FBQyxhQUFhLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFekcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDbEU7U0FDSjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRCxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTywrQkFBK0IsQ0FBQyxTQUFpQixFQUNqQixRQUFxQyxFQUNyQyxXQUF3QixFQUN4QixTQUFzQixFQUN0QixPQUFrQztRQUN4RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ2pDLE1BQU0sZ0JBQWdCLEdBQXFCLElBQUksQ0FBQyxhQUFhLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1FBQzlILElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRCxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sOEJBQThCLENBQUMsU0FBaUIsRUFDakIsS0FBd0IsRUFDeEIsV0FBd0IsRUFDeEIsU0FBc0IsRUFDdEIsT0FBa0M7UUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDTyxvQkFBb0IsQ0FBQyxPQUFrQztRQUM3RCxvRkFBb0Y7UUFDcEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO1lBQy9DLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMvQixTQUFTO2lCQUNaO2dCQUVELElBQUksSUFBSSxDQUFDLGtDQUFrQyxDQUN2QyxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ3JDO29CQUNFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNwRTtnQkFFRCxVQUFVLEVBQUUsQ0FBQztnQkFDYixJQUFJLFVBQVUsS0FBSyxVQUFVLEVBQUU7b0JBQzNCLE9BQU87aUJBQ1Y7YUFDSjtTQUNKO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMkNBQTJDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3hILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxrQ0FBa0MsQ0FBQyxPQUFPLEVBQUUsR0FBRztRQUNyRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQzthQUN2RjtZQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUMvQixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztTQUNoRTtRQUVELE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ08sZUFBZSxDQUFDLFdBQXdCLEVBQUUsTUFBZSxFQUFFLFNBQWlCO1FBQ2xGLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxnQkFBZ0IsQ0FBQyxLQUE4QyxFQUFFLE9BQWdCO1FBQ3ZGLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBa0M7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNsRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztpQkFDakM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDJCQUEyQixDQUFDLElBQTRCO1FBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzZHQTNrQlEsZUFBZSw2UEFZSixtQkFBbUI7aUhBWjlCLGVBQWU7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBYU0sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9tb2RlbHMvY2hhbmdlZC1maWVsZHMnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSAnLi4vLi4vc25hY2stYmFyL3NlcnZpY2VzL3NuYWNrLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1Jlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC90YXNrLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWVsZENvbnZlcnRlclNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tTZXREYXRhUmVxdWVzdEJvZHl9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvdGFzay1zZXQtZGF0YS1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtUYXNrSGFuZGxpbmdTZXJ2aWNlfSBmcm9tICcuL3Rhc2staGFuZGxpbmctc2VydmljZSc7XG5pbXBvcnQge05BRV9UQVNLX09QRVJBVElPTlN9IGZyb20gJy4uL21vZGVscy90YXNrLW9wZXJhdGlvbnMtaW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7VGFza09wZXJhdGlvbnN9IGZyb20gJy4uL2ludGVyZmFjZXMvdGFzay1vcGVyYXRpb25zJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7RmlsZUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9maWxlLWZpZWxkL21vZGVscy9maWxlLWZpZWxkJztcbmltcG9ydCB7U2VsZWN0ZWRDYXNlU2VydmljZX0gZnJvbSAnLi9zZWxlY3RlZC1jYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWxlTGlzdEZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9maWxlLWxpc3QtZmllbGQvbW9kZWxzL2ZpbGUtbGlzdC1maWVsZCc7XG5pbXBvcnQge2NyZWF0ZVRhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7VGFza0V2ZW50fSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudCc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7Q2FsbENoYWluU2VydmljZX0gZnJvbSAnLi4vLi4vdXRpbGl0eS9jYWxsLWNoYWluL2NhbGwtY2hhaW4uc2VydmljZSc7XG5pbXBvcnQge3Rha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RHluYW1pY0VudW1lcmF0aW9uRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2VudW1lcmF0aW9uLWZpZWxkL21vZGVscy9keW5hbWljLWVudW1lcmF0aW9uLWZpZWxkJztcbmltcG9ydCB7RGF0YUdyb3VwfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2RhdGEtZ3JvdXBzJztcbmltcG9ydCB7RXZlbnRRdWV1ZVNlcnZpY2V9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL3NlcnZpY2VzL2V2ZW50LXF1ZXVlLnNlcnZpY2UnO1xuaW1wb3J0IHtRdWV1ZWRFdmVudH0gZnJvbSAnLi4vLi4vZXZlbnQtcXVldWUvbW9kZWwvcXVldWVkLWV2ZW50JztcbmltcG9ydCB7QWZ0ZXJBY3Rpb259IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9hZnRlci1hY3Rpb24nO1xuaW1wb3J0IHtVc2VyQ29tcGFyYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci1jb21wYXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0fSBmcm9tICcuLi9tb2RlbHMvdGFzay1zZXQtZGF0YS1yZXF1ZXN0LWNvbnRleHQnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jaGFuZ2VkLWZpZWxkcy9zZXJ2aWNlcy9jaGFuZ2VkLWZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc01hcH0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXAnO1xuaW1wb3J0IHtUYXNrRmllbGRzfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1maWVsZHMnO1xuaW1wb3J0IHtFbnVtZXJhdGlvbkZpZWxkfSBmcm9tIFwiLi4vLi4vZGF0YS1maWVsZHMvZW51bWVyYXRpb24tZmllbGQvbW9kZWxzL2VudW1lcmF0aW9uLWZpZWxkXCI7XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgbG9hZGluZyBhbmQgdXBkYXRpbmcgb2YgZGF0YSBmaWVsZHMgYW5kIGJlaGF2aW91ciBvZlxuICogYSBzaW5nbGUgVGFzayBvYmplY3QgbWFuYWdlZCBieSBhIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFza0RhdGFTZXJ2aWNlIGV4dGVuZHMgVGFza0hhbmRsaW5nU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVN1Y2Nlc3MkOiBTdWJqZWN0PGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfZGF0YVJlbG9hZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfc25hY2tCYXI6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9maWVsZENvbnZlcnRlclNlcnZpY2U6IEZpZWxkQ29udmVydGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudDogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIF9zZWxlY3RlZENhc2VTZXJ2aWNlOiBTZWxlY3RlZENhc2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIF90YXNrQ29udGVudFNlcnZpY2U6IFRhc2tDb250ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2FmdGVyQWN0aW9uRmFjdG9yeTogQ2FsbENoYWluU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50UXVldWU6IEV2ZW50UXVldWVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2hhbmdlZEZpZWxkc1NlcnZpY2U6IENoYW5nZWRGaWVsZHNTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgICAgICB0aGlzLl9kYXRhUmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tEYXRhUmVsb2FkUmVxdWVzdCQuc3Vic2NyaWJlKHF1ZXVlZEZyb250ZW5kQWN0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKHRoaXMuX2FmdGVyQWN0aW9uRmFjdG9yeS5jcmVhdGUoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcXVldWVkRnJvbnRlbmRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnBlcmZvcm1Gcm9udGVuZEFjdGlvbihxdWV1ZWRGcm9udGVuZEFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZGF0YVJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5pc1Rhc2tQcmVzZW50KCkgJiYgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGJhY2tlbmRcbiAgICAgKiBjYWxscyBpbiBbdXBkYXRlVGFza0RhdGFGaWVsZHNde0BsaW5rIFRhc2tEYXRhU2VydmljZSN1cGRhdGVUYXNrRGF0YUZpZWxkc30gbWV0aG9kLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdXBkYXRlU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVTdWNjZXNzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgRGF0YSBGaWVsZHMgb2YgYW4gdW5pbml0aWFsaXplZCBUYXNrIGZyb20gYmFja2VuZFxuICAgICAqIGFuZCBwb3B1bGF0ZXMgdGhlIFRhc2sgbWFuYWdlZCBieSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQmV3YXJlIHRoYXQgaWYgdGhlIFRhc2sgaGFzIHNvbWUgZGF0YSBhbHJlYWR5IGxvYWRlZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZ1xuICAgICAqIGFuZCBvbmx5IHBhc3NlcyBgdHJ1ZWAgdG8gdGhlIGBhZnRlckFjdGlvbmAgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGFzayBoZWxkIHdpdGhpbiB0aGUge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gY2hhbmdlcyBiZWZvcmUgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgaWdub3JlZFxuICAgICAqIGFuZCB0aGUgYGFmdGVyQWN0aW9uYCB3aWxsIG5vdCBiZSBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiBpZiB0aGUgcmVxdWVzdCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IGVtaXRzIGB0cnVlYCBpbnRvIHRoZSBTdWJqZWN0LCBvdGhlcndpc2UgYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWRcbiAgICAgKiBAcGFyYW0gZm9yY2Ugc2V0IHRvIGB0cnVlYCBpZiB5b3UgbmVlZCBmb3JjZSByZWxvYWQgb2YgYWxsIHRhc2sgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplVGFza0RhdGFGaWVsZHMoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uID0gbmV3IEFmdGVyQWN0aW9uKCksIGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1Rhc2tQcmVzZW50KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1HZXREYXRhUmVxdWVzdChhZnRlckFjdGlvbiwgZm9yY2UsIG5leHRFdmVudCk7XG4gICAgICAgICAgICB9LCBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgZ2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGZvcmNlIHNldCB0byBgdHJ1ZWAgaWYgeW91IG5lZWQgZm9yY2UgcmVsb2FkIG9mIGFsbCB0YXNrIGRhdGFcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBlcmZvcm1HZXREYXRhUmVxdWVzdChhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIGZvcmNlOiBib29sZWFuLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24oVGFza0V2ZW50LkdFVF9EQVRBLCB0cnVlKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5uZXh0KHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnb3R0ZW5UYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0TG9hZGluZyhnb3R0ZW5UYXNrSWQpO1xuXG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuZ2V0RGF0YShnb3R0ZW5UYXNrSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRhdGFHcm91cHMgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3VjY2Vzc2Z1bEdldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZCwgZGF0YUdyb3VwcywgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9uZW91c0dldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZCwgZXJyb3IsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBzdWNjZXNzZnVsIG91dGNvbWUgb2YgYSBgZ2V0RGF0YWAgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBnb3R0ZW5UYXNrSWQgdGhlIElEIG9mIHRoZSB0YXNrIHdob3NlIGRhdGEgd2FzIHJlcXVlc3RlZFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSByZXR1cm5lZCBkYXRhIGdyb3VwcyBvZiB0aGUgdGFza1xuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTdWNjZXNzZnVsR2V0RGF0YVJlcXVlc3QoZ290dGVuVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoZ290dGVuVGFza0lkKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGdldCBkYXRhIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkcyA9IHt9O1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4ID0ge307XG5cbiAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3VwcyA9IGRhdGFHcm91cHM7XG4gICAgICAgIGlmIChkYXRhR3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmluZm8oJ1Rhc2sgaGFzIG5vIGRhdGEgJyArIHRoaXMuX3NhZmVUYXNrKTtcbiAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRdID0ge30gYXMgVGFza0ZpZWxkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbdGhpcy5fc2FmZVRhc2suY2FzZUlkXSA9IFt0aGlzLl9zYWZlVGFzay5zdHJpbmdJZF07XG4gICAgICAgICAgICBkYXRhR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFHcm91cFBhcmVudENhc2VJZDogc3RyaW5nID0gZ3JvdXAucGFyZW50Q2FzZUlkID09PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlVGFzay5jYXNlSWQgOiBncm91cC5wYXJlbnRDYXNlSWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50VGFza0lkOiBzdHJpbmcgPSBncm91cC5wYXJlbnRUYXNrSWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkIDogZ3JvdXAucGFyZW50VGFza0lkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRyYW5zaXRpb25JZDogc3RyaW5nID0gZ3JvdXAucGFyZW50VHJhbnNpdGlvbklkID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay50cmFuc2l0aW9uSWQgOiBncm91cC5wYXJlbnRUcmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cFBhcmVudENhc2VJZCAhPT0gdGhpcy5fc2FmZVRhc2suY2FzZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkc1tkYXRhR3JvdXBQYXJlbnRDYXNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0gPSBbZ3JvdXAucGFyZW50VGFza0lkXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5wdXNoKGdyb3VwLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFHcm91cFBhcmVudENhc2VJZCA9PT0gdGhpcy5fc2FmZVRhc2suY2FzZUlkXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudFRhc2tJZCAhPT0gdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRcbiAgICAgICAgICAgICAgICAgICAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5pbmNsdWRlcyhwYXJlbnRUYXNrSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5wdXNoKGdyb3VwLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChncm91cC5maWVsZHMubGVuZ3RoID4gMCAmJiAhdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXSA9IHt9IGFzIFRhc2tGaWVsZHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChncm91cC5maWVsZHMubGVuZ3RoID4gMCAmJiAhdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3BhcmVudFRhc2tJZF0uZmllbGRzID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLnRyYW5zaXRpb25JZCA9IHBhcmVudFRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWVDaGFuZ2VzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBEeW5hbWljRW51bWVyYXRpb25GaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUYXNrRGF0YUZpZWxkcyh0aGlzLl9hZnRlckFjdGlvbkZhY3RvcnkuY3JlYXRlKGJvb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUYXNrRGF0YUZpZWxkcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIEZpbGVGaWVsZCB8fCBmaWVsZCBpbnN0YW5jZW9mIEZpbGVMaXN0RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmNoYW5nZWRGaWVsZHMkLnN1YnNjcmliZSgoY2hhbmdlOiBDaGFuZ2VkRmllbGRzTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlZEZpZWxkc1NlcnZpY2UuZW1pdENoYW5nZWRGaWVsZHMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID0gZ3JvdXAuZmllbGRzLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplICs9IGdyb3VwLmZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgdHJ1ZSk7XG4gICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5uZXh0KHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpO1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIubmV4dCh0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKSArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvbmVvdXMgb3V0Y29tZSBvZiBhIGBnZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIGdvdHRlblRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgcmVxdWVzdGVkXG4gICAgICogQHBhcmFtIGVycm9yIHRoZSByZXR1cm5lZCBlcnJvclxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NFcnJvbmVvdXNHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSB8IEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdnZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGdvdHRlblRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIGVycm9yLnN0YXR1cyA9PT0gNTAwICYmIGVycm9yLmVycm9yLm1lc3NhZ2UgJiYgZXJyb3IuZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKCdDb3VsZCBub3QgZmluZCB0YXNrIHdpdGggaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3Blbldhcm5pbmdTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIubm9Mb25nZXJFeGlzdHMnKSk7XG4gICAgICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihgJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIubm9Hcm91cCcpfVxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFzay50aXRsZX0gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkVG9Mb2FkJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgZmFsc2UpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGFsbCBjaGFuZ2VkIGRhdGEgZmllbGRzIGFuZCBub3RpZmllcyB0aGUgYmFja2VuZCBvZiB0aGUgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgY2xlYXJzIHRoZSBbY2hhbmdlZF17QGxpbmsgRGF0YUZpZWxkI2NoYW5nZWR9IGZsYWcgb24gYWxsIGRhdGEgZmllbGRzIHRoYXQgd2VyZSBhIHBhcnQgb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBhbmQgZW1pdHMgYSB7QGxpbmsgQ2hhbmdlZEZpZWxkc30gb2JqZWN0IGludG8gdGhpcyBvYmplY3QncyBbY2hhbmdlZEZpZWxkcyRde0BsaW5rIFRhc2tEYXRhU2VydmljZSNjaGFuZ2VkRmllbGRzJH0gc3RyZWFtLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRhc2sgaGVsZCB3aXRoaW4gdGhlIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGNoYW5nZXMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGlnbm9yZWRcbiAgICAgKiBhbmQgdGhlIGBhZnRlckFjdGlvbmAgd2lsbCBub3QgYmUgZXhlY3V0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgdGhlIHJlcXVlc3QgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBlbWl0cyBgdHJ1ZWAgaW50byB0aGUgU3ViamVjdCwgb3RoZXJ3aXNlIGBmYWxzZWAgd2lsbCBiZSBlbWl0dGVkXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVRhc2tEYXRhRmllbGRzKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnVGFzayBpcyBub3QgcHJlc2VudC4gVXBkYXRlIHJlcXVlc3QgaWdub3JlZC4nKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NhZmVUYXNrLnVzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgaXMgbm90IGFzc2lnbmVkLi4uJyk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldFRhc2tJZCA9IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdENvbnRleHQgPSB0aGlzLmNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICgpID0+IHRoaXMuaXNTZXREYXRhUmVxdWVzdFN0aWxsVmFsaWQocmVxdWVzdENvbnRleHQuYm9keSksXG4gICAgICAgICAgICBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybVNldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgcmVxdWVzdENvbnRleHQsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRTZXREYXRhUmVxdWVzdChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICogR29lcyBvdmVyIGFsbCB0aGUgZGF0YSBmaWVsZHMgaW4gdGhlIG1hbmFnZWQgVGFzayBhbmQgaWYgdGhleSBhcmUgdmFsaWQgYW5kIGNoYW5nZWQgYWRkcyB0aGVtIHRvIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQge1xuICAgICAgICBjb25zdCBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0ID0ge1xuICAgICAgICAgICAgYm9keToge30sXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlczoge31cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZpbHRlcihkYXRhR3JvdXAgPT4gZGF0YUdyb3VwLnBhcmVudFRhc2tJZCA9PT0gdW5kZWZpbmVkKS5mb3JFYWNoKGRhdGFHcm91cCA9PiB7XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVt0aGlzLl90YXNrLnN0cmluZ0lkXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCB0aGlzLl90YXNrLnN0cmluZ0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZmlsdGVyKGRhdGFHcm91cCA9PiBkYXRhR3JvdXAucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhR3JvdXAuZmllbGRzLnNvbWUoZmllbGQgPT4gdGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVtkYXRhR3JvdXAucGFyZW50VGFza0lkXSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCBkYXRhR3JvdXAucGFyZW50VGFza0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhZGRGaWVsZFRvU2V0RGF0YVJlcXVlc3RCb2R5KGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIHRhc2tJZDogc3RyaW5nLCBmaWVsZDogRGF0YUZpZWxkPGFueT4pOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC5ib2R5W3Rhc2tJZF1bZmllbGQuc3RyaW5nSWRdID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGZpZWxkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9maWVsZENvbnZlcnRlclNlcnZpY2UuZm9ybWF0VmFsdWVGb3JCYWNrZW5kKGZpZWxkLCBmaWVsZC52YWx1ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZC5wcmV2aW91c1ZhbHVlO1xuICAgICAgICBmaWVsZC5jaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbntcbiAgICAgICAgcmV0dXJuIChmaWVsZCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQpICYmIChmaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdhdXRvY29tcGxldGUnKSAmJiAhZmllbGQudmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpZWxkIHRoZSBjaGVja2VkIGZpZWxkXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgZmllbGQgd2FzIHVwZGF0ZWQgb24gZnJvbnRlbmQgYW5kIHRodXMgdGhlIGJhY2tlbmQgc2hvdWxkIGJlIG5vdGlmaWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhc0ZpZWxkVXBkYXRlZChmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZC5pbml0aWFsaXplZCAmJiBmaWVsZC5jaGFuZ2VkICYmIChmaWVsZC52YWxpZCB8fCBmaWVsZC5zZW5kSW52YWxpZFZhbHVlcykgJiYgKCF0aGlzLmlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGNvdWxkIHN0aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgbG9nZ2VkIHVzZXJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1NldERhdGFSZXF1ZXN0U3RpbGxWYWxpZChyZXF1ZXN0OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2sudXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGhpcy5fc2FmZVRhc2sudXNlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrSWRzSW5SZXF1ZXN0OiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMocmVxdWVzdCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0lkIG9mIHRhc2tJZHNJblJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCkuaW5jbHVkZXModGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihgVGFzayBpZCAke3Rhc2tJZH0gaXMgbm90IHByZXNlbnQgaW4gdGFzayBmaWVsZHMgaW5kZXhgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkc09mUmVxdWVzdCA9IE9iamVjdC5rZXlzKHJlcXVlc3RbdGFza0lkXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHNPZlJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGFza0lkXS5maWVsZHNbZmllbGRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBVbmV4cGVjdGVkIHN0YXRlLiBEYXRhZmllbGQgJHtmaWVsZElkfSBvZiB0YXNrICR7dGFza0lkXG4gICAgICAgICAgICAgICAgICAgIH0gaW4gc2V0RGF0YSByZXF1ZXN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSB0YXNrLmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZmllbGQuYmVoYXZpb3IuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKGBGaWVsZCAke2ZpZWxkSWR9LCB3YXMgbWVhbnQgdG8gYmUgc2V0IHRvXG4gICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdFt0YXNrSWRdW2ZpZWxkSWRdKVxuICAgICAgICAgICAgICAgICAgICB9LCBidXQgaXMgbm8gbG9uZXIgZWRpdGFibGUuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgc2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIElEIG9mIHRoZSB0YXNrXG4gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBvZiB0aGUgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29udGV4dC5ib2R5KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuU0VUX0RBVEEsIHRydWUpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0TG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RhcnRVcGRhdGluZyhzZXRUYXNrSWQpO1xuXG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2Uuc2V0RGF0YSh0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCwgY29udGV4dC5ib2R5KS5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KHNldFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIHNldCBkYXRhIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkLCByZXNwb25zZSwgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Vuc3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgcmVzcG9uc2UsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvbmVvdXNTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIGVycm9yLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBjb250ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiB1bnN1Y2Nlc3NmdWwgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXN1bHRpbmcgRXZlbnQgb3V0Y29tZSBvZiB0aGUgc2V0IGRhdGEgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGJvZHkgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Vuc3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KHJlc3BvbnNlLmVycm9yKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkU2F2ZScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2Uub3V0Y29tZSkge1xuICAgICAgICAgICAgY29uc3Qgb3V0Y29tZSA9IHJlc3BvbnNlLm91dGNvbWU7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzTWFwOiBDaGFuZ2VkRmllbGRzTWFwID0gdGhpcy5fZXZlbnRTZXJ2aWNlLnBhcnNlQ2hhbmdlZEZpZWxkc0Zyb21PdXRjb21lVHJlZShvdXRjb21lKTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZWRGaWVsZHNNYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldmVydFRvUHJldmlvdXNWYWx1ZShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoY29udGV4dC5ib2R5KTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIGZhbHNlLCBzZXRUYXNrSWQpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIHN1Y2Nlc3NmdWwgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXN1bHRpbmcgRXZlbnQgb3V0Y29tZSBvZiB0aGUgc2V0IGRhdGEgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGNvbnRleHQgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1N1Y2Nlc3NmdWxTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgY29uc3Qgb3V0Y29tZSA9IHJlc3BvbnNlLm91dGNvbWU7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWUpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VkRmllbGRzTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyV2FpdGluZ0ZvclJlc3BvbnNlRmxhZyhjb250ZXh0LmJvZHkpO1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuU3VjY2Vzc1NuYWNrQmFyKCEhb3V0Y29tZS5tZXNzYWdlID8gb3V0Y29tZS5tZXNzYWdlIDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmRhdGFTYXZlZCcpKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIHRydWUsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvbmVvdXMgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIGVycm9yIHRoZSByZXR1cm5lZCBlcnJvclxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGJvZHkgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Vycm9uZW91c1NldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdzZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KHNldFRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoY29udGV4dCk7XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGNvbnRleHQuYm9keSk7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5mYWlsZWRTYXZlJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5mbyhhZnRlckFjdGlvbiwgZmFsc2UsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgZWZmZWN0cyBvZiBhIGZhaWxlZCBgc2V0RGF0YWAgcmVxdWVzdCwgc28gdGhhdCB0aGUgdXNlciBzZWVzIGN1cnJlbnQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBmYWlsZWQgcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXZlcnRTZXREYXRhUmVxdWVzdChjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uIGNvdWxkIGJlIGltcHJvdmVkIGlmIHdlIGhhZCBhIG1hcCBvZiBhbGwgdGhlIGRhdGEgZmllbGRzIGluIGEgdGFza1xuICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gT2JqZWN0LmtleXMoY29udGV4dC5ib2R5KS5sZW5ndGg7XG4gICAgICAgIGxldCBmb3VuZENvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGFncm91cCBvZiB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRhdGFncm91cC5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuYm9keVtmaWVsZC5zdHJpbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLmZvcm1hdFZhbHVlRm9yQmFja2VuZChmaWVsZCwgZmllbGQudmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmJvZHlbZmllbGQuc3RyaW5nSWRdLnZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZVdpdGhvdXRDaGFuZ2UoY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvdW5kQ291bnQrKztcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb3VudCA9PT0gdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBJbnZhbGlkIHN0YXRlLiBTb21lIGRhdGEgZmllbGRzIG9mIHRhc2sgJHt0aGlzLl9zYWZlVGFzay5zdHJpbmdJZH0sIGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiBpdCFgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgdmFsdWVzIHRoYXQgYXJlIGluIHRoZSBiYWNrZW5kIGNvbXBhdGlibGUgZm9ybWF0IGFzIGdpdmVuIGJ5IHRoZSB7QGxpbmsgRmllbGRDb252ZXJ0ZXJTZXJ2aWNlfVxuICAgICAqIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUsIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gY3VycmVudCB0aGUgY3VycmVudCB2YWx1ZSAoY2FuIGFsc28gYmUgY2FsbGVkIGB2YWx1ZTFgIG9yIGBsZWZ0YClcbiAgICAgKiBAcGFyYW0gb2xkIHRoZSBuZXcgdmFsdWUgKGNhbiBhbHNvIGJlIGNhbGxlZCBgdmFsdWUyYCBvciBgcmlnaHRgKVxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhbmQgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhjdXJyZW50LCBvbGQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50cyEgQ2Fubm90IGNvbXBhcmUgYXJyYXkgdmFsdWUgdG8gbm9uLWFycmF5IHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gb2xkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gb2xkW2luZGV4XSA9PT0gdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPT09IG9sZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBzdG9wcyBsb2FkaW5nIGFuZCB1cGRhdGluZyBpbmRpY2F0b3JzLCBhbmQgZW1pdHMgdGhlIGByZXN1bHRgIHZhbHVlXG4gICAgICogdG8gYm90aCB0aGUgYGFmdGVyQWN0aW9uYCBhbmQgW191cGRhdGVTdWNjZXNzJF17QGxpbmsgVGFza0RhdGFTZXJ2aWNlI191cGRhdGVTdWNjZXNzJH0gc3RyZWFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgY2FsbCBjaGFpbiBzdGVhbSBvZiB0aGUgdXBkYXRlIGRhdGEgbWV0aG9kXG4gICAgICogQHBhcmFtIHJlc3VsdCByZXN1bHQgb2YgdGhlIHVwZGF0ZSBkYXRhIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUge0BsaW5rIFRhc2t9LCB3aG8ncyBzdGF0ZSBzaG91bGQgYmUgdXBkYXRlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCByZXN1bHQ6IGJvb2xlYW4sIHNldFRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVTdWNjZXNzJC5vYnNlcnZlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdWNjZXNzJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5TRVRfREFUQSwgcmVzdWx0KTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2hlcyBhIGdldC9zZXQgZGF0YSBub3RpZmljYXRpb24gdG8gdGhlIHtAbGluayBUYXNrRXZlbnRTZXJ2aWNlfVxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCB0byB0aGUgdGFza1xuICAgICAqIEBwYXJhbSBzdWNjZXNzIHdoZXRoZXIgdGhlIGdldC9zZXQgZGF0YSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbmROb3RpZmljYXRpb24oZXZlbnQ6IFRhc2tFdmVudC5HRVRfREFUQSB8IFRhc2tFdmVudC5TRVRfREFUQSwgc3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRXZlbnQucHVibGlzaFRhc2tFdmVudChjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb24odGhpcy5fc2FmZVRhc2ssIGV2ZW50LCBzdWNjZXNzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXZlcnRUb1ByZXZpb3VzVmFsdWUoY29udGV4dDogVGFza1NldERhdGFSZXF1ZXN0Q29udGV4dCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGRhdGFHcm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVkICYmIGZpZWxkLnZhbGlkICYmIE9iamVjdC5rZXlzKGNvbnRleHQucHJldmlvdXNWYWx1ZXMpLmluY2x1ZGVzKGZpZWxkLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoYm9keTogVGFza1NldERhdGFSZXF1ZXN0Qm9keSkge1xuICAgICAgICBPYmplY3Qua2V5cyhib2R5KS5mb3JFYWNoKHRhc2tJZCA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhib2R5W3Rhc2tJZF0pLmZvckVhY2goZmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFt0YXNrSWRdLmZpZWxkc1tmaWVsZElkXS53YWl0aW5nRm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|