@cqa-lib/cqa-ui 1.1.79 → 1.1.80

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.
@@ -1,4 +1,4 @@
1
- import { Component, Input, ViewChild, ViewContainerRef, Inject } from '@angular/core';
1
+ import { Component, Input, ViewChild, ViewContainerRef, Inject, ChangeDetectorRef } from '@angular/core';
2
2
  import { STEP_COMPONENT_MAP } from '../step-registry.token';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
@@ -7,39 +7,252 @@ import * as i0 from "@angular/core";
7
7
  * between step components in Angular Ivy partial compilation mode.
8
8
  */
9
9
  export class StepRendererComponent {
10
- constructor(componentMap) {
10
+ constructor(componentMap, cdr) {
11
11
  this.componentMap = componentMap;
12
+ this.cdr = cdr;
12
13
  this.isLive = false;
14
+ this.lastStepId = null;
15
+ this.lastStepType = null;
16
+ this.previousStepKey = '';
13
17
  }
14
18
  ngOnChanges(changes) {
15
- if (changes['step'] && this.container) {
16
- this.loadComponent();
17
- }
18
- // Also reload if step properties change (like nestedSteps, children, steps)
19
- if (changes['step'] && changes['step'].currentValue && this.container) {
20
- const currentStep = changes['step'].currentValue;
21
- const previousStep = changes['step'].previousValue;
22
- // Check if nestedSteps, children, steps, or expanded changed for loop/step-group
23
- if (previousStep && (currentStep.nestedSteps !== previousStep.nestedSteps ||
24
- currentStep.children !== previousStep.children ||
25
- currentStep.steps !== previousStep.steps ||
26
- currentStep.expanded !== previousStep.expanded ||
27
- (currentStep.config && currentStep.config.expanded !== previousStep.config?.expanded))) {
19
+ if (!this.container || !this.step)
20
+ return;
21
+ const currentStep = changes['step']?.currentValue || this.step;
22
+ const previousStep = changes['step']?.previousValue;
23
+ // Get step identifiers
24
+ const currentStepId = currentStep.testStepResultId || currentStep.id;
25
+ const currentStepType = currentStep.type;
26
+ // If this is the first time or step type/ID changed, load component
27
+ const stepTypeChanged = !previousStep || currentStepType !== (previousStep.type || this.lastStepType);
28
+ const stepIdChanged = !previousStep || currentStepId !== (previousStep.testStepResultId || previousStep.id || this.lastStepId);
29
+ if (stepTypeChanged || stepIdChanged) {
30
+ this.lastStepId = currentStepId;
31
+ this.lastStepType = currentStepType;
32
+ if (this.container) {
28
33
  this.loadComponent();
29
34
  }
35
+ return;
36
+ }
37
+ // If only nested data changed (children, nestedSteps, steps, expanded),
38
+ // update properties without recreating component to prevent blinking
39
+ // This prevents parent steps from blinking when nested steps expand
40
+ const onlyNestedDataChanged = previousStep && (currentStep.nestedSteps !== previousStep.nestedSteps ||
41
+ currentStep.children !== previousStep.children ||
42
+ currentStep.steps !== previousStep.steps ||
43
+ currentStep.expanded !== previousStep.expanded ||
44
+ (currentStep.config && currentStep.config.expanded !== previousStep.config?.expanded));
45
+ // Update properties without recreating component to prevent blinking
46
+ if (onlyNestedDataChanged && this.container.length > 0) {
47
+ // Get the stored component instance
48
+ const instance = StepRendererComponent.componentInstances.get(this.container);
49
+ const componentRef = StepRendererComponent.componentRefs.get(this.container);
50
+ if (instance) {
51
+ // Use comprehensive update method from original
52
+ this.updateComponentInstance(currentStep, previousStep);
53
+ }
54
+ return;
55
+ }
56
+ // For other changes, use comprehensive update if component exists
57
+ if (this.container.length > 0) {
58
+ const instance = StepRendererComponent.componentInstances.get(this.container);
59
+ const componentRef = StepRendererComponent.componentRefs.get(this.container);
60
+ if (instance && previousStep && currentStep &&
61
+ previousStep.type === currentStep.type &&
62
+ (previousStep.testStepResultId || previousStep.id) === (currentStep.testStepResultId || currentStep.id)) {
63
+ // Update existing component instance with new step properties
64
+ this.updateComponentInstance(currentStep, previousStep);
65
+ return;
66
+ }
67
+ }
68
+ // For other changes, reload component
69
+ if (this.container) {
70
+ this.loadComponent();
30
71
  }
31
72
  }
32
73
  ngAfterViewInit() {
33
74
  this.loadComponent();
34
75
  }
76
+ updateComponentInstance(currentStep, previousStep) {
77
+ const instance = StepRendererComponent.componentInstances.get(this.container);
78
+ const componentRef = StepRendererComponent.componentRefs.get(this.container);
79
+ if (!instance || !componentRef || !this.container)
80
+ return;
81
+ let hasChanges = false;
82
+ // List of properties that commonly change and need to be updated
83
+ const importantProperties = ['status', 'duration', 'expanded', 'subSteps', 'children', 'nestedSteps', 'steps',
84
+ 'executionData', 'action', 'title', 'result', 'method', 'endpoint', 'statusCode', 'branches',
85
+ 'responseTime', 'actions', 'prompt', 'optimizedRun', 'actionCount', 'iterations', 'selectedIterationId'];
86
+ // Update important properties
87
+ importantProperties.forEach(key => {
88
+ const currentValue = currentStep[key];
89
+ const previousValue = previousStep[key];
90
+ // Use deep comparison for objects/arrays, shallow for primitives
91
+ if (this.hasValueChanged(currentValue, previousValue)) {
92
+ instance[key] = currentValue;
93
+ hasChanges = true;
94
+ }
95
+ });
96
+ // Also update all other properties
97
+ Object.keys(currentStep).forEach(key => {
98
+ if (key !== 'type' && !importantProperties.includes(key)) {
99
+ const currentValue = currentStep[key];
100
+ const previousValue = previousStep[key];
101
+ if (this.hasValueChanged(currentValue, previousValue)) {
102
+ instance[key] = currentValue;
103
+ hasChanges = true;
104
+ }
105
+ }
106
+ });
107
+ // Update special properties that might need special handling
108
+ if (currentStep.type === 'loop' && currentStep.children && !currentStep.nestedSteps) {
109
+ if (instance.nestedSteps !== currentStep.children) {
110
+ instance.nestedSteps = currentStep.children;
111
+ if (instance.config) {
112
+ instance.config.nestedSteps = currentStep.children;
113
+ }
114
+ hasChanges = true;
115
+ }
116
+ }
117
+ if (currentStep.type === 'step-group' && currentStep.children && !currentStep.steps) {
118
+ if (instance.steps !== currentStep.children) {
119
+ instance.steps = currentStep.children;
120
+ if (instance.config) {
121
+ instance.config.steps = currentStep.children;
122
+ }
123
+ hasChanges = true;
124
+ }
125
+ }
126
+ // Special handling for condition-step: ensure branches is properly updated
127
+ if (currentStep.type === 'condition' && currentStep.branches !== undefined) {
128
+ if (instance.branches !== currentStep.branches) {
129
+ instance.branches = currentStep.branches;
130
+ if (instance.config) {
131
+ instance.config.branches = currentStep.branches;
132
+ }
133
+ hasChanges = true;
134
+ }
135
+ }
136
+ // Update expanded state
137
+ if (this.isStepExpandedHandler && currentStep) {
138
+ const expandedState = this.isStepExpandedHandler(currentStep);
139
+ if (instance.expanded !== expandedState) {
140
+ instance.expanded = expandedState;
141
+ if (instance.config) {
142
+ instance.config.expanded = expandedState;
143
+ }
144
+ hasChanges = true;
145
+ }
146
+ }
147
+ else if (currentStep.expanded !== undefined) {
148
+ if (instance.expanded !== currentStep.expanded) {
149
+ instance.expanded = currentStep.expanded;
150
+ if (instance.config) {
151
+ instance.config.expanded = currentStep.expanded;
152
+ }
153
+ hasChanges = true;
154
+ }
155
+ }
156
+ // Update config reference - ensure all properties including branches are included
157
+ if ('config' in instance) {
158
+ // Update config with current step to ensure all properties including branches are synced
159
+ instance.config = { ...instance.config, ...currentStep };
160
+ // Explicitly ensure branches is updated for condition-step (in case it was nested)
161
+ if (currentStep.type === 'condition' && currentStep.branches !== undefined) {
162
+ instance.config.branches = currentStep.branches;
163
+ }
164
+ }
165
+ // Trigger change detection on the component instance if there were changes
166
+ // This ensures only the nested step updates without affecting parent steps
167
+ if (hasChanges) {
168
+ if (componentRef.injector) {
169
+ const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
170
+ if (instanceCdr) {
171
+ instanceCdr.markForCheck();
172
+ instanceCdr.detectChanges();
173
+ }
174
+ }
175
+ else if (instance.cdr) {
176
+ instance.cdr.detectChanges();
177
+ }
178
+ else if (instance.changeDetectorRef) {
179
+ instance.changeDetectorRef.detectChanges();
180
+ }
181
+ // Don't call markForCheck on this component to avoid triggering parent re-renders
182
+ }
183
+ }
184
+ hasValueChanged(current, previous) {
185
+ // Shallow comparison for primitives
186
+ if (current === previous)
187
+ return false;
188
+ // Handle null/undefined
189
+ if (current == null || previous == null)
190
+ return current !== previous;
191
+ // For arrays, check length and reference
192
+ if (Array.isArray(current) || Array.isArray(previous)) {
193
+ if (Array.isArray(current) !== Array.isArray(previous))
194
+ return true;
195
+ if (current.length !== previous.length)
196
+ return true;
197
+ return current !== previous; // Reference check
198
+ }
199
+ // For objects, do shallow comparison (check reference)
200
+ if (typeof current === 'object' && typeof previous === 'object') {
201
+ return current !== previous; // Reference check
202
+ }
203
+ // For primitives
204
+ return current !== previous;
205
+ }
206
+ getStepKey(step) {
207
+ if (!step)
208
+ return '';
209
+ // Create a key from important properties that change
210
+ // Include executionData.stepStatus for live execution scenarios
211
+ const executionStatus = step.executionData?.stepStatus || step.status || '';
212
+ // Include branches length for condition-step change detection
213
+ const branchesLength = (step.branches || []).length;
214
+ return `${step.id || ''}_${executionStatus}_${step.status || ''}_${step.duration || ''}_${step.expanded || false}_${(step.children || []).length}_${(step.nestedSteps || []).length}_${(step.steps || []).length}_${branchesLength}`;
215
+ }
35
216
  loadComponent() {
36
217
  if (!this.container || !this.step)
37
218
  return;
38
- this.container.clear();
219
+ const currentStepId = this.step.testStepResultId || this.step.id;
220
+ const currentStepType = this.step.type;
221
+ // Only clear and recreate if step ID or type actually changed
222
+ const needsRecreation = this.lastStepId !== currentStepId || this.lastStepType !== currentStepType;
223
+ if (needsRecreation) {
224
+ this.container.clear();
225
+ // Clear stored instance when recreating
226
+ StepRendererComponent.componentInstances.delete(this.container);
227
+ StepRendererComponent.componentRefs.delete(this.container);
228
+ this.lastStepId = currentStepId;
229
+ this.lastStepType = currentStepType;
230
+ }
231
+ else {
232
+ // If same step, just update properties without clearing
233
+ const instance = StepRendererComponent.componentInstances.get(this.container);
234
+ if (instance) {
235
+ // Update all properties
236
+ Object.keys(this.step).forEach(key => {
237
+ if (key !== 'type') {
238
+ instance[key] = this.step[key];
239
+ }
240
+ });
241
+ if (instance.config) {
242
+ instance.config = { ...instance.config, ...this.step };
243
+ }
244
+ // Update key for change detection
245
+ this.previousStepKey = this.getStepKey(this.step);
246
+ return;
247
+ }
248
+ }
39
249
  const componentType = this.componentMap.get(this.step.type);
40
250
  if (componentType) {
41
251
  const componentRef = this.container.createComponent(componentType);
42
252
  const instance = componentRef.instance;
253
+ // Store component instance and ref in WeakMap for future updates
254
+ StepRendererComponent.componentInstances.set(this.container, instance);
255
+ StepRendererComponent.componentRefs.set(this.container, componentRef);
43
256
  // Store component reference for cleanup
44
257
  componentRef._componentRef = componentRef;
45
258
  // Spread config properties as individual inputs for components that use individual inputs
@@ -241,10 +454,62 @@ export class StepRendererComponent {
241
454
  if ('config' in instance) {
242
455
  instance.config = this.step;
243
456
  }
457
+ // Store key for change detection
458
+ this.previousStepKey = this.getStepKey(this.step);
459
+ // Trigger change detection on the component instance
460
+ if (componentRef.injector) {
461
+ const instanceCdr = componentRef.injector.get(ChangeDetectorRef, null);
462
+ if (instanceCdr) {
463
+ instanceCdr.markForCheck();
464
+ }
465
+ }
466
+ }
467
+ }
468
+ ngDoCheck() {
469
+ // Use ngDoCheck to detect changes in nested properties that ngOnChanges might miss
470
+ const instance = StepRendererComponent.componentInstances.get(this.container);
471
+ const componentRef = StepRendererComponent.componentRefs.get(this.container);
472
+ if (instance && componentRef && this.step) {
473
+ const currentKey = this.getStepKey(this.step);
474
+ // If step properties changed (even if reference didn't), update the instance
475
+ if (currentKey !== this.previousStepKey) {
476
+ // We need the previous step to compare, so we'll update based on current state
477
+ // Create a minimal previous step from the instance's current state
478
+ const previousStep = {
479
+ id: instance.id,
480
+ type: instance.type,
481
+ status: instance.status,
482
+ duration: instance.duration,
483
+ expanded: instance.expanded,
484
+ children: instance.children,
485
+ nestedSteps: instance.nestedSteps,
486
+ steps: instance.steps,
487
+ executionData: instance.executionData,
488
+ action: instance.action,
489
+ title: instance.title,
490
+ result: instance.result,
491
+ method: instance.method,
492
+ endpoint: instance.endpoint,
493
+ statusCode: instance.statusCode,
494
+ responseTime: instance.responseTime,
495
+ actions: instance.actions,
496
+ prompt: instance.prompt,
497
+ optimizedRun: instance.optimizedRun,
498
+ actionCount: instance.actionCount,
499
+ iterations: instance.iterations,
500
+ selectedIterationId: instance.selectedIterationId,
501
+ branches: instance.branches,
502
+ };
503
+ this.updateComponentInstance(this.step, previousStep);
504
+ this.previousStepKey = currentKey;
505
+ }
244
506
  }
245
507
  }
246
508
  }
247
- StepRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, deps: [{ token: STEP_COMPONENT_MAP }], target: i0.ɵɵFactoryTarget.Component });
509
+ // Use WeakMap to track component instances without storing them as class properties
510
+ StepRendererComponent.componentInstances = new WeakMap();
511
+ StepRendererComponent.componentRefs = new WeakMap();
512
+ StepRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, deps: [{ token: STEP_COMPONENT_MAP }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
248
513
  StepRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepRendererComponent, selector: "cqa-step-renderer", inputs: { step: "step", onExpandHandler: "onExpandHandler", getConditionBranchesHandler: "getConditionBranchesHandler", isStepLoadingHandler: "isStepLoadingHandler", isStepExpandedHandler: "isStepExpandedHandler", convertMsToSecondsHandler: "convertMsToSecondsHandler", formatFailureDetailsHandler: "formatFailureDetailsHandler", getSelfHealAnalysisHandler: "getSelfHealAnalysisHandler", onMakeCurrentBaselineHandler: "onMakeCurrentBaselineHandler", onUploadBaselineHandler: "onUploadBaselineHandler", onAnalyzeHandler: "onAnalyzeHandler", onViewFullLogsHandler: "onViewFullLogsHandler", onSelfHealActionHandler: "onSelfHealActionHandler", isUploadingBaseline: "isUploadingBaseline", getLoopIterationsHandler: "getLoopIterationsHandler", getApiAssertionsHandler: "getApiAssertionsHandler", formatActionsHandler: "formatActionsHandler", onViewAllIterationsHandler: "onViewAllIterationsHandler", isLive: "isLive" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: '<ng-container #container></ng-container>', isInline: true });
249
514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepRendererComponent, decorators: [{
250
515
  type: Component,
@@ -255,7 +520,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
255
520
  }], ctorParameters: function () { return [{ type: Map, decorators: [{
256
521
  type: Inject,
257
522
  args: [STEP_COMPONENT_MAP]
258
- }] }]; }, propDecorators: { step: [{
523
+ }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { step: [{
259
524
  type: Input
260
525
  }], onExpandHandler: [{
261
526
  type: Input
@@ -297,4 +562,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
297
562
  }], isLive: [{
298
563
  type: Input
299
564
  }] } });
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQWlELE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVySSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFNUQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxxQkFBcUI7SUFzQmhDLFlBQ3NDLFlBQW9DO1FBQXBDLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUhqRSxXQUFNLEdBQVksS0FBSyxDQUFDO0lBSTlCLENBQUM7SUFFSixXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7UUFDRCw0RUFBNEU7UUFDNUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDakQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUVuRCxpRkFBaUY7WUFDakYsSUFBSSxZQUFZLElBQUksQ0FDakIsV0FBbUIsQ0FBQyxXQUFXLEtBQU0sWUFBb0IsQ0FBQyxXQUFXO2dCQUNyRSxXQUFtQixDQUFDLFFBQVEsS0FBTSxZQUFvQixDQUFDLFFBQVE7Z0JBQy9ELFdBQW1CLENB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cUI7c0JBQTdCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUM4QyxTQUFTO3NCQUE1RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFDekMsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFR5cGUsIEFmdGVyVmlld0luaXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXhlY3V0aW9uU3RlcENvbmZpZyB9IGZyb20gJy4uL2V4ZWN1dGlvbi1zdGVwLm1vZGVscyc7XG5pbXBvcnQgeyBTVEVQX0NPTVBPTkVOVF9NQVAgfSBmcm9tICcuLi9zdGVwLXJlZ2lzdHJ5LnRva2VuJztcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBhcHByb3ByaWF0ZSBzdGVwIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgc3RlcCB0eXBlLlxuICogVXNlcyBkeW5hbWljIGNvbXBvbmVudCBsb2FkaW5nIGFuZCBhbiBpbmplY3Rpb24gdG9rZW4gdG8gYnJlYWsgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG4gKiBiZXR3ZWVuIHN0ZXAgY29tcG9uZW50cyBpbiBBbmd1bGFyIEl2eSBwYXJ0aWFsIGNvbXBpbGF0aW9uIG1vZGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLXJlbmRlcmVyJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+J1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwUmVuZGVyZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzdGVwITogRXhlY3V0aW9uU3RlcENvbmZpZztcbiAgQElucHV0KCkgb25FeHBhbmRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RlcEV4cGFuZGVkSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBjb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyPzogKGR1cmF0aW9uOiBudW1iZXIpID0+IG51bWJlcjtcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcbiAgQElucHV0KCkgZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xuICBASW5wdXQoKSBvbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQW5hbHl6ZUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblZpZXdGdWxsTG9nc0hhbmRsZXI/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBpc1VwbG9hZGluZ0Jhc2VsaW5lPzogYW55O1xuICBASW5wdXQoKSBnZXRMb29wSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55W107XG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xuICBASW5wdXQoKSBmb3JtYXRBY3Rpb25zSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnlbXTtcbiAgQElucHV0KCkgb25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIEBJbnB1dCgpIGlzTGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9DT01QT05FTlRfTUFQKSBwcml2YXRlIGNvbXBvbmVudE1hcDogTWFwPHN0cmluZywgVHlwZTxhbnk+PlxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGVwJ10gJiYgdGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgIH1cbiAgICAvLyBBbHNvIHJlbG9hZCBpZiBzdGVwIHByb3BlcnRpZXMgY2hhbmdlIChsaWtlIG5lc3RlZFN0ZXBzLCBjaGlsZHJlbiwgc3RlcHMpXG4gICAgaWYgKGNoYW5nZXNbJ3N0ZXAnXSAmJiBjaGFuZ2VzWydzdGVwJ10uY3VycmVudFZhbHVlICYmIHRoaXMuY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3RlcCA9IGNoYW5nZXNbJ3N0ZXAnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBjaGFuZ2VzWydzdGVwJ10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgbmVzdGVkU3RlcHMsIGNoaWxkcmVuLCBzdGVwcywgb3IgZXhwYW5kZWQgY2hhbmdlZCBmb3IgbG9vcC9zdGVwLWdyb3VwXG4gICAgICBpZiAocHJldmlvdXNTdGVwICYmIChcbiAgICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcyB8fFxuICAgICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNoaWxkcmVuIHx8XG4gICAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuc3RlcHMgfHxcbiAgICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5leHBhbmRlZCB8fFxuICAgICAgICAoKGN1cnJlbnRTdGVwIGFzIGFueSkuY29uZmlnICYmIChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLmNvbmZpZz8uZXhwYW5kZWQpXG4gICAgICApKSB7XG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8ICF0aGlzLnN0ZXApIHJldHVybjtcbiAgICBcbiAgICB0aGlzLmNvbnRhaW5lci5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudE1hcC5nZXQodGhpcy5zdGVwLnR5cGUpO1xuICAgIFxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIFxuICAgICAgLy8gU3RvcmUgY29tcG9uZW50IHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgKGNvbXBvbmVudFJlZiBhcyBhbnkpLl9jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG4gICAgICBcbiAgICAgIC8vIFNwcmVhZCBjb25maWcgcHJvcGVydGllcyBhcyBpbmRpdmlkdWFsIGlucHV0cyBmb3IgY29tcG9uZW50cyB0aGF0IHVzZSBpbmRpdmlkdWFsIGlucHV0c1xuICAgICAgLy8gVGhpcyBzdXBwb3J0cyBib3RoIHBhdHRlcm5zOiBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGNvbmZpZyBkaXJlY3RseSBhbmQgdGhvc2UgdGhhdCB1c2UgaW5kaXZpZHVhbCBpbnB1dHNcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IG1hcCBjaGlsZHJlbiB0byBuZXN0ZWRTdGVwcyBpZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJlc2VudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuICYmICEodGhpcy5zdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubmVzdGVkU3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGxvb3BUeXBlIGJhc2VkIG9uIGFjdGlvbk5hbWUgb3IgdGVzdFN0ZXBUeXBlXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICAvLyBTZXQgbG9vcFR5cGUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkubG9vcFR5cGUpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbk5hbWU7XG4gICAgICAgICAgY29uc3QgdGVzdFN0ZXBUeXBlID0gKHRoaXMuc3RlcCBhcyBhbnkpLnRlc3RTdGVwVHlwZTtcbiAgICAgICAgICBpZiAoYWN0aW9uTmFtZSA9PT0gJ0ZPUl9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdGT1JfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ2Zvcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25OYW1lID09PSAnV0hJTEVfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnV0hJTEVfTE9PUCcpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ3doaWxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlIHRpdGxlIGlzIHNldCBmcm9tIGFjdGlvbiBpZiB0aXRsZSBpcyBub3QgcHJlc2VudCBvciBlbXB0eVxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudGl0bGUgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogaW5pdGlhbGl6ZSBpdGVyYXRpb25zIGlmIG5vdCBwcmVzZW50XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAhKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucykge1xuICAgICAgICAvLyBVc2UgaGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB0cnkgdG8gaW5pdGlhbGl6ZSBmcm9tIHN0ZXAuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdFxuICAgICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQ/LnN0ZXBSZXN1bHQgJiYgQXJyYXkuaXNBcnJheSgodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdCkpIHtcbiAgICAgICAgICAvLyBJbml0aWFsaXplIGl0ZXJhdGlvbnMgZGlyZWN0bHkgZnJvbSBzdGVwUmVzdWx0XG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAodGhpcy5zdGVwIGFzIGFueSkuZXhlY3V0ZWRSZXN1bHQuc3RlcFJlc3VsdC5mb3JFYWNoKChpdGVyYXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlcmF0aW9uSW5kZXggPSBpdGVyYXRpb24uaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVyYXRpb24uaW5kZXggIT09IG51bGwgPyBpdGVyYXRpb24uaW5kZXggOiBpdGVyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzdGF0dXM6ICdzdWNjZXNzJyB8ICdmYWlsZWQnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzTG93ZXIgPSBpdGVyYXRpb24uc3RhdHVzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNMb3dlciA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1c0xvd2VyID09PSAncGFzc2VkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXNMb3dlciA9PT0gJ2ZhaWx1cmUnIHx8IHN0YXR1c0xvd2VyID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0xvd2VyID09PSAncnVubmluZycgfHwgc3RhdHVzTG93ZXIgPT09ICdpbl9wcm9ncmVzcycpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBgaXRlci0ke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIGxhYmVsOiBgaXRlciAke2l0ZXJhdGlvbkluZGV4fWAsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgICBzdWJTdGVwczogW10sXG4gICAgICAgICAgICAgIGluZGV4OiBpdGVyYXRpb25JbmRleFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiBzZXQgZGVmYXVsdEl0ZXJhdGlvbiBhbmQgc2VsZWN0ZWRJdGVyYXRpb25JZFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRJdGVyYXRpb24gdG8gJ2xhc3QnIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmRlZmF1bHRJdGVyYXRpb24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCB0byBsYXN0IGl0ZXJhdGlvbiBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgY29uc3QgaXRlcmF0aW9ucyA9IChpbnN0YW5jZSBhcyBhbnkpLml0ZXJhdGlvbnM7XG4gICAgICAgIGlmIChpdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoaXRlcmF0aW9ucykgJiYgaXRlcmF0aW9ucy5sZW5ndGggPiAwICYmICEoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbnNbaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxlY3RlZEl0ZXJhdGlvbklkID0gbGFzdEl0ZXJhdGlvbi5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzdGVwLWdyb3VwOiBtYXAgY2hpbGRyZW4gdG8gc3RlcHMgaWYgc3RlcHMgaXMgbm90IHByZXNlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLnN0ZXBzKSB7XG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogc2V0IGJyYW5jaGVzIGFuZCBjb25kaXRpb25UZXh0XG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFNldCBicmFuY2hlcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSBhbmQgYnJhbmNoZXMgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgJiYgdGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGNvbmRpdGlvblRleHQgZnJvbSBhY3Rpb24gaWYgY29uZGl0aW9uVGV4dCBpcyBub3QgcHJlc2VudFxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgJiYgKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBpc0xvYWRpbmcgdXNpbmcgaGFuZGxlciBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pc0xvYWRpbmcgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyKHRoaXMuc3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gV2lyZSB1cCBjb21tb24gZXZlbnQgZW1pdHRlcnMgZm9yIGFwaSwgYWktYWdlbnQsIGFuZCBsb29wIHN0ZXBzXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhcGknIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYWktYWdlbnQnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgfHwgdGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjb21tb24gb3V0cHV0IGV2ZW50cyBhbmQgY2FsbCBoYW5kbGVyc1xuICAgICAgICAvLyBFdmVudEVtaXR0ZXJzIGFyZSBTdWJqZWN0cywgc28gd2UgY2FuIHN1YnNjcmliZSB0byB0aGVtXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lICYmIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm1ha2VDdXJyZW50QmFzZWxpbmUuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTWFrZUN1cnJlbnRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnVwbG9hZEJhc2VsaW5lICYmIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUgJiYgdGhpcy5vbkFuYWx5emVIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyPy4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzICYmIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcj8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLnNlbGZIZWFsQWN0aW9uICYmIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI/LihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiB3aXJlIHVwIG9uVmlld0FsbEl0ZXJhdGlvbnMgZXZlbnRcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ2xvb3AnKSB7XG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zICYmIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmQgJiYgdGhpcy5vbkV4cGFuZEhhbmRsZXIpIHtcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsbCBvbkV4cGFuZEhhbmRsZXIgd2l0aCB0aGUgc3RlcCBjb25maWdcbiAgICAgICAgICAgIHRoaXMub25FeHBhbmRIYW5kbGVyPy4odGhpcy5zdGVwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgZXhwYW5kZWQgcHJvcGVydHkgaXMgcGFzc2VkIGNvcnJlY3RseVxuICAgICAgLy8gVXNlIGlzU3RlcEV4cGFuZGVkSGFuZGxlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2Ugc3RlcC5leHBhbmRlZCBvciBzdGVwLmNvbmZpZy5leHBhbmRlZFxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xuICAgICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIodGhpcy5zdGVwKTtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQYXNzIGhhbmRsZXIgZnVuY3Rpb25zIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgIGlmICh0aGlzLm9uRXhwYW5kSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25FeHBhbmRIYW5kbGVyID0gdGhpcy5vbkV4cGFuZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcExvYWRpbmdIYW5kbGVyID0gdGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwRXhwYW5kZWRIYW5kbGVyID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlciA9IHRoaXMuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyID0gdGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5mb3JtYXRBY3Rpb25zSGFuZGxlciA9IHRoaXMuZm9ybWF0QWN0aW9uc0hhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblVwbG9hZEJhc2VsaW5lSGFuZGxlciA9IHRoaXMub25VcGxvYWRCYXNlbGluZUhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xuICAgICAgaWYgKHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdGdWxsTG9nc0hhbmRsZXIgPSB0aGlzLm9uVmlld0Z1bGxMb2dzSGFuZGxlcjtcbiAgICAgIGlmICh0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vblNlbGZIZWFsQWN0aW9uSGFuZGxlciA9IHRoaXMub25TZWxmSGVhbEFjdGlvbkhhbmRsZXI7XG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XG4gICAgICBpZiAodGhpcy5pc0xpdmUgIT09IHVuZGVmaW5lZCkgKGluc3RhbmNlIGFzIGFueSkuaXNMaXZlID0gdGhpcy5pc0xpdmU7XG4gICAgICBcbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XG4gICAgICBpZiAoJ2NvbmZpZycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0gdGhpcy5zdGVwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2V4ZWN1dGlvbi1zY3JlZW4vc3RlcC1yZW5kZXJlci9zdGVwLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQTBELE1BQU0sRUFBRSxpQkFBaUIsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFL0ssT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTVEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8scUJBQXFCO0lBNkJoQyxZQUNzQyxZQUFvQyxFQUNoRSxHQUFzQjtRQURNLGlCQUFZLEdBQVosWUFBWSxDQUF3QjtRQUNoRSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQVh2QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBS3pCLGVBQVUsR0FBMkIsSUFBSSxDQUFDO1FBQzFDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxvQkFBZSxHQUFXLEVBQUUsQ0FBQztJQUtsQyxDQUFDO0lBRUosV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRTFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBRXBELHVCQUF1QjtRQUN2QixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsSUFBSSxD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b0JBQzdCLFFBQVEsRUFBRSwwQ0FBMEM7aUJBQ3JEOzBEQStCcUQsR0FBRzswQkFBcEQsTUFBTTsyQkFBQyxrQkFBa0I7NEVBN0JuQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQzhDLFNBQVM7c0JBQTVELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUN6QyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVHlwZSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjaywgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV4ZWN1dGlvblN0ZXBDb25maWcgfSBmcm9tICcuLi9leGVjdXRpb24tc3RlcC5tb2RlbHMnO1xyXG5pbXBvcnQgeyBTVEVQX0NPTVBPTkVOVF9NQVAgfSBmcm9tICcuLi9zdGVwLXJlZ2lzdHJ5LnRva2VuJztcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnQgdGhhdCByZW5kZXJzIHRoZSBhcHByb3ByaWF0ZSBzdGVwIGNvbXBvbmVudCBiYXNlZCBvbiB0aGUgc3RlcCB0eXBlLlxyXG4gKiBVc2VzIGR5bmFtaWMgY29tcG9uZW50IGxvYWRpbmcgYW5kIGFuIGluamVjdGlvbiB0b2tlbiB0byBicmVhayBjaXJjdWxhciBkZXBlbmRlbmNpZXNcclxuICogYmV0d2VlbiBzdGVwIGNvbXBvbmVudHMgaW4gQW5ndWxhciBJdnkgcGFydGlhbCBjb21waWxhdGlvbiBtb2RlLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjcWEtc3RlcC1yZW5kZXJlcicsXHJcbiAgdGVtcGxhdGU6ICc8bmctY29udGFpbmVyICNjb250YWluZXI+PC9uZy1jb250YWluZXI+J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcFJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBEb0NoZWNrIHtcclxuICBASW5wdXQoKSBzdGVwITogRXhlY3V0aW9uU3RlcENvbmZpZztcclxuICBASW5wdXQoKSBvbkV4cGFuZEhhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gdm9pZDtcclxuICBASW5wdXQoKSBnZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXI/OiAoc3RlcDogRXhlY3V0aW9uU3RlcENvbmZpZykgPT4gYW55O1xyXG4gIEBJbnB1dCgpIGlzU3RlcExvYWRpbmdIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaXNTdGVwRXhwYW5kZWRIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY29udmVydE1zVG9TZWNvbmRzSGFuZGxlcj86IChkdXJhdGlvbjogbnVtYmVyKSA9PiBudW1iZXI7XHJcbiAgQElucHV0KCkgZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueTtcclxuICBASW5wdXQoKSBnZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcj86IChzdGVwOiBFeGVjdXRpb25TdGVwQ29uZmlnKSA9PiBhbnk7XHJcbiAgQElucHV0KCkgb25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIG9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgb25BbmFseXplSGFuZGxlcj86ICgpID0+IHZvaWQ7XHJcbiAgQElucHV0KCkgb25WaWV3RnVsbExvZ3NIYW5kbGVyPzogKCkgPT4gdm9pZDtcclxuICBASW5wdXQoKSBvblNlbGZIZWFsQWN0aW9uSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIGlzVXBsb2FkaW5nQmFzZWxpbmU/OiBhbnk7XHJcbiAgQElucHV0KCkgZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xyXG4gIEBJbnB1dCgpIGdldEFwaUFzc2VydGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xyXG4gIEBJbnB1dCgpIGZvcm1hdEFjdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IGFueVtdO1xyXG4gIEBJbnB1dCgpIG9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyPzogKHN0ZXA6IEV4ZWN1dGlvblN0ZXBDb25maWcpID0+IHZvaWQ7XHJcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIFVzZSBXZWFrTWFwIHRvIHRyYWNrIGNvbXBvbmVudCBpbnN0YW5jZXMgd2l0aG91dCBzdG9yaW5nIHRoZW0gYXMgY2xhc3MgcHJvcGVydGllc1xyXG4gIHByaXZhdGUgc3RhdGljIGNvbXBvbmVudEluc3RhbmNlcyA9IG5ldyBXZWFrTWFwPFZpZXdDb250YWluZXJSZWYsIGFueT4oKTtcclxuICBwcml2YXRlIHN0YXRpYyBjb21wb25lbnRSZWZzID0gbmV3IFdlYWtNYXA8Vmlld0NvbnRhaW5lclJlZiwgQ29tcG9uZW50UmVmPGFueT4+KCk7XHJcbiAgcHJpdmF0ZSBsYXN0U3RlcElkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxhc3RTdGVwVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1N0ZXBLZXk6IHN0cmluZyA9ICcnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoU1RFUF9DT01QT05FTlRfTUFQKSBwcml2YXRlIGNvbXBvbmVudE1hcDogTWFwPHN0cmluZywgVHlwZTxhbnk+PixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LmN1cnJlbnRWYWx1ZSB8fCB0aGlzLnN0ZXA7XHJcbiAgICBjb25zdCBwcmV2aW91c1N0ZXAgPSBjaGFuZ2VzWydzdGVwJ10/LnByZXZpb3VzVmFsdWU7XHJcbiAgICBcclxuICAgIC8vIEdldCBzdGVwIGlkZW50aWZpZXJzXHJcbiAgICBjb25zdCBjdXJyZW50U3RlcElkID0gY3VycmVudFN0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBjdXJyZW50U3RlcC5pZDtcclxuICAgIGNvbnN0IGN1cnJlbnRTdGVwVHlwZSA9IGN1cnJlbnRTdGVwLnR5cGU7XHJcbiAgICBcclxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgb3Igc3RlcCB0eXBlL0lEIGNoYW5nZWQsIGxvYWQgY29tcG9uZW50XHJcbiAgICBjb25zdCBzdGVwVHlwZUNoYW5nZWQgPSAhcHJldmlvdXNTdGVwIHx8IGN1cnJlbnRTdGVwVHlwZSAhPT0gKHByZXZpb3VzU3RlcC50eXBlIHx8IHRoaXMubGFzdFN0ZXBUeXBlKTtcclxuICAgIGNvbnN0IHN0ZXBJZENoYW5nZWQgPSAhcHJldmlvdXNTdGVwIHx8IGN1cnJlbnRTdGVwSWQgIT09IChwcmV2aW91c1N0ZXAudGVzdFN0ZXBSZXN1bHRJZCB8fCBwcmV2aW91c1N0ZXAuaWQgfHwgdGhpcy5sYXN0U3RlcElkKTtcclxuICAgIFxyXG4gICAgaWYgKHN0ZXBUeXBlQ2hhbmdlZCB8fCBzdGVwSWRDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMubGFzdFN0ZXBJZCA9IGN1cnJlbnRTdGVwSWQ7XHJcbiAgICAgIHRoaXMubGFzdFN0ZXBUeXBlID0gY3VycmVudFN0ZXBUeXBlO1xyXG4gICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIElmIG9ubHkgbmVzdGVkIGRhdGEgY2hhbmdlZCAoY2hpbGRyZW4sIG5lc3RlZFN0ZXBzLCBzdGVwcywgZXhwYW5kZWQpLCBcclxuICAgIC8vIHVwZGF0ZSBwcm9wZXJ0aWVzIHdpdGhvdXQgcmVjcmVhdGluZyBjb21wb25lbnQgdG8gcHJldmVudCBibGlua2luZ1xyXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBwYXJlbnQgc3RlcHMgZnJvbSBibGlua2luZyB3aGVuIG5lc3RlZCBzdGVwcyBleHBhbmRcclxuICAgIGNvbnN0IG9ubHlOZXN0ZWREYXRhQ2hhbmdlZCA9IHByZXZpb3VzU3RlcCAmJiAoXHJcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMgfHxcclxuICAgICAgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jaGlsZHJlbiB8fFxyXG4gICAgICAoY3VycmVudFN0ZXAgYXMgYW55KS5zdGVwcyAhPT0gKHByZXZpb3VzU3RlcCBhcyBhbnkpLnN0ZXBzIHx8XHJcbiAgICAgIChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkICE9PSAocHJldmlvdXNTdGVwIGFzIGFueSkuZXhwYW5kZWQgfHxcclxuICAgICAgKChjdXJyZW50U3RlcCBhcyBhbnkpLmNvbmZpZyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgIT09IChwcmV2aW91c1N0ZXAgYXMgYW55KS5jb25maWc/LmV4cGFuZGVkKVxyXG4gICAgKTtcclxuICAgIFxyXG4gICAgLy8gVXBkYXRlIHByb3BlcnRpZXMgd2l0aG91dCByZWNyZWF0aW5nIGNvbXBvbmVudCB0byBwcmV2ZW50IGJsaW5raW5nXHJcbiAgICBpZiAob25seU5lc3RlZERhdGFDaGFuZ2VkICYmIHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gR2V0IHRoZSBzdG9yZWQgY29tcG9uZW50IGluc3RhbmNlXHJcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xyXG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGluc3RhbmNlKSB7XHJcbiAgICAgICAgLy8gVXNlIGNvbXByZWhlbnNpdmUgdXBkYXRlIG1ldGhvZCBmcm9tIG9yaWdpbmFsXHJcbiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRJbnN0YW5jZShjdXJyZW50U3RlcCwgcHJldmlvdXNTdGVwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEZvciBvdGhlciBjaGFuZ2VzLCB1c2UgY29tcHJlaGVuc2l2ZSB1cGRhdGUgaWYgY29tcG9uZW50IGV4aXN0c1xyXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoaW5zdGFuY2UgJiYgcHJldmlvdXNTdGVwICYmIGN1cnJlbnRTdGVwICYmIFxyXG4gICAgICAgICAgcHJldmlvdXNTdGVwLnR5cGUgPT09IGN1cnJlbnRTdGVwLnR5cGUgJiYgXHJcbiAgICAgICAgICAocHJldmlvdXNTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgcHJldmlvdXNTdGVwLmlkKSA9PT0gKGN1cnJlbnRTdGVwLnRlc3RTdGVwUmVzdWx0SWQgfHwgY3VycmVudFN0ZXAuaWQpKSB7XHJcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG5ldyBzdGVwIHByb3BlcnRpZXNcclxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwLCBwcmV2aW91c1N0ZXApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGb3Igb3RoZXIgY2hhbmdlcywgcmVsb2FkIGNvbXBvbmVudFxyXG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQ29tcG9uZW50KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKGN1cnJlbnRTdGVwOiBhbnksIHByZXZpb3VzU3RlcDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnN0YW5jZSA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRJbnN0YW5jZXMuZ2V0KHRoaXMuY29udGFpbmVyKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IFN0ZXBSZW5kZXJlckNvbXBvbmVudC5jb21wb25lbnRSZWZzLmdldCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICBcclxuICAgIGlmICghaW5zdGFuY2UgfHwgIWNvbXBvbmVudFJlZiB8fCAhdGhpcy5jb250YWluZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgIFxyXG4gICAgLy8gTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgY29tbW9ubHkgY2hhbmdlIGFuZCBuZWVkIHRvIGJlIHVwZGF0ZWRcclxuICAgIGNvbnN0IGltcG9ydGFudFByb3BlcnRpZXMgPSBbJ3N0YXR1cycsICdkdXJhdGlvbicsICdleHBhbmRlZCcsICdzdWJTdGVwcycsICdjaGlsZHJlbicsICduZXN0ZWRTdGVwcycsICdzdGVwcycsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlY3V0aW9uRGF0YScsICdhY3Rpb24nLCAndGl0bGUnLCAncmVzdWx0JywgJ21ldGhvZCcsICdlbmRwb2ludCcsICdzdGF0dXNDb2RlJywgJ2JyYW5jaGVzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlVGltZScsICdhY3Rpb25zJywgJ3Byb21wdCcsICdvcHRpbWl6ZWRSdW4nLCAnYWN0aW9uQ291bnQnLCAnaXRlcmF0aW9ucycsICdzZWxlY3RlZEl0ZXJhdGlvbklkJ107XHJcbiAgICBcclxuICAgIC8vIFVwZGF0ZSBpbXBvcnRhbnQgcHJvcGVydGllc1xyXG4gICAgaW1wb3J0YW50UHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSAocHJldmlvdXNTdGVwIGFzIGFueSlba2V5XTtcclxuICAgICAgXHJcbiAgICAgIC8vIFVzZSBkZWVwIGNvbXBhcmlzb24gZm9yIG9iamVjdHMvYXJyYXlzLCBzaGFsbG93IGZvciBwcmltaXRpdmVzXHJcbiAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIEFsc28gdXBkYXRlIGFsbCBvdGhlciBwcm9wZXJ0aWVzXHJcbiAgICBPYmplY3Qua2V5cyhjdXJyZW50U3RlcCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYgIWltcG9ydGFudFByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50U3RlcCBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IChwcmV2aW91c1N0ZXAgYXMgYW55KVtrZXldO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlQ2hhbmdlZChjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gVXBkYXRlIHNwZWNpYWwgcHJvcGVydGllcyB0aGF0IG1pZ2h0IG5lZWQgc3BlY2lhbCBoYW5kbGluZ1xyXG4gICAgaWYgKGN1cnJlbnRTdGVwLnR5cGUgPT09ICdsb29wJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKGN1cnJlbnRTdGVwIGFzIGFueSkubmVzdGVkU3RlcHMpIHtcclxuICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzICE9PSAoY3VycmVudFN0ZXAgYXMgYW55KS5jaGlsZHJlbikge1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XHJcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLm5lc3RlZFN0ZXBzID0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnc3RlcC1ncm91cCcgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgIShjdXJyZW50U3RlcCBhcyBhbnkpLnN0ZXBzKSB7XHJcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuY2hpbGRyZW4pIHtcclxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5zdGVwcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogZW5zdXJlIGJyYW5jaGVzIGlzIHByb3Blcmx5IHVwZGF0ZWRcclxuICAgIGlmIChjdXJyZW50U3RlcC50eXBlID09PSAnY29uZGl0aW9uJyAmJiAoY3VycmVudFN0ZXAgYXMgYW55KS5icmFuY2hlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAhPT0gKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMpIHtcclxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgZXhwYW5kZWQgc3RhdGVcclxuICAgIGlmICh0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlciAmJiBjdXJyZW50U3RlcCkge1xyXG4gICAgICBjb25zdCBleHBhbmRlZFN0YXRlID0gdGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIoY3VycmVudFN0ZXApO1xyXG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgIT09IGV4cGFuZGVkU3RhdGUpIHtcclxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5leHBhbmRlZCA9IGV4cGFuZGVkU3RhdGU7XHJcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRTdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgIT09IChjdXJyZW50U3RlcCBhcyBhbnkpLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuZXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcclxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSAoY3VycmVudFN0ZXAgYXMgYW55KS5leHBhbmRlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gVXBkYXRlIGNvbmZpZyByZWZlcmVuY2UgLSBlbnN1cmUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIGJyYW5jaGVzIGFyZSBpbmNsdWRlZFxyXG4gICAgaWYgKCdjb25maWcnIGluIGluc3RhbmNlKSB7XHJcbiAgICAgIC8vIFVwZGF0ZSBjb25maWcgd2l0aCBjdXJyZW50IHN0ZXAgdG8gZW5zdXJlIGFsbCBwcm9wZXJ0aWVzIGluY2x1ZGluZyBicmFuY2hlcyBhcmUgc3luY2VkXHJcbiAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHsgLi4uKGluc3RhbmNlIGFzIGFueSkuY29uZmlnLCAuLi5jdXJyZW50U3RlcCB9O1xyXG4gICAgICAvLyBFeHBsaWNpdGx5IGVuc3VyZSBicmFuY2hlcyBpcyB1cGRhdGVkIGZvciBjb25kaXRpb24tc3RlcCAoaW4gY2FzZSBpdCB3YXMgbmVzdGVkKVxyXG4gICAgICBpZiAoY3VycmVudFN0ZXAudHlwZSA9PT0gJ2NvbmRpdGlvbicgJiYgKGN1cnJlbnRTdGVwIGFzIGFueSkuYnJhbmNoZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5icmFuY2hlcyA9IChjdXJyZW50U3RlcCBhcyBhbnkpLmJyYW5jaGVzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIGlmIHRoZXJlIHdlcmUgY2hhbmdlc1xyXG4gICAgLy8gVGhpcyBlbnN1cmVzIG9ubHkgdGhlIG5lc3RlZCBzdGVwIHVwZGF0ZXMgd2l0aG91dCBhZmZlY3RpbmcgcGFyZW50IHN0ZXBzXHJcbiAgICBpZiAoaGFzQ2hhbmdlcykge1xyXG4gICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcclxuICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgaW5zdGFuY2VDZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jZHIpIHtcclxuICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2UgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIERvbid0IGNhbGwgbWFya0ZvckNoZWNrIG9uIHRoaXMgY29tcG9uZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgcGFyZW50IHJlLXJlbmRlcnNcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQoY3VycmVudDogYW55LCBwcmV2aW91czogYW55KTogYm9vbGVhbiB7XHJcbiAgICAvLyBTaGFsbG93IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZXNcclxuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cykgcmV0dXJuIGZhbHNlO1xyXG4gICAgXHJcbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcclxuICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgcHJldmlvdXMgPT0gbnVsbCkgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzO1xyXG4gICAgXHJcbiAgICAvLyBGb3IgYXJyYXlzLCBjaGVjayBsZW5ndGggYW5kIHJlZmVyZW5jZVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgfHwgQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkgIT09IEFycmF5LmlzQXJyYXkocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoICE9PSBwcmV2aW91cy5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gY3VycmVudCAhPT0gcHJldmlvdXM7IC8vIFJlZmVyZW5jZSBjaGVja1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGb3Igb2JqZWN0cywgZG8gc2hhbGxvdyBjb21wYXJpc29uIChjaGVjayByZWZlcmVuY2UpXHJcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcmV2aW91cyA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IHByZXZpb3VzOyAvLyBSZWZlcmVuY2UgY2hlY2tcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gRm9yIHByaW1pdGl2ZXNcclxuICAgIHJldHVybiBjdXJyZW50ICE9PSBwcmV2aW91cztcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBnZXRTdGVwS2V5KHN0ZXA6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXN0ZXApIHJldHVybiAnJztcclxuICAgIC8vIENyZWF0ZSBhIGtleSBmcm9tIGltcG9ydGFudCBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlXHJcbiAgICAvLyBJbmNsdWRlIGV4ZWN1dGlvbkRhdGEuc3RlcFN0YXR1cyBmb3IgbGl2ZSBleGVjdXRpb24gc2NlbmFyaW9zXHJcbiAgICBjb25zdCBleGVjdXRpb25TdGF0dXMgPSBzdGVwLmV4ZWN1dGlvbkRhdGE/LnN0ZXBTdGF0dXMgfHwgc3RlcC5zdGF0dXMgfHwgJyc7XHJcbiAgICAvLyBJbmNsdWRlIGJyYW5jaGVzIGxlbmd0aCBmb3IgY29uZGl0aW9uLXN0ZXAgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgY29uc3QgYnJhbmNoZXNMZW5ndGggPSAoc3RlcC5icmFuY2hlcyB8fCBbXSkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIGAke3N0ZXAuaWQgfHwgJyd9XyR7ZXhlY3V0aW9uU3RhdHVzfV8ke3N0ZXAuc3RhdHVzIHx8ICcnfV8ke3N0ZXAuZHVyYXRpb24gfHwgJyd9XyR7c3RlcC5leHBhbmRlZCB8fCBmYWxzZX1fJHsoc3RlcC5jaGlsZHJlbiB8fCBbXSkubGVuZ3RofV8keyhzdGVwLm5lc3RlZFN0ZXBzIHx8IFtdKS5sZW5ndGh9XyR7KHN0ZXAuc3RlcHMgfHwgW10pLmxlbmd0aH1fJHticmFuY2hlc0xlbmd0aH1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lciB8fCAhdGhpcy5zdGVwKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGN1cnJlbnRTdGVwSWQgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBSZXN1bHRJZCB8fCB0aGlzLnN0ZXAuaWQ7XHJcbiAgICBjb25zdCBjdXJyZW50U3RlcFR5cGUgPSB0aGlzLnN0ZXAudHlwZTtcclxuICAgIFxyXG4gICAgLy8gT25seSBjbGVhciBhbmQgcmVjcmVhdGUgaWYgc3RlcCBJRCBvciB0eXBlIGFjdHVhbGx5IGNoYW5nZWRcclxuICAgIGNvbnN0IG5lZWRzUmVjcmVhdGlvbiA9IHRoaXMubGFzdFN0ZXBJZCAhPT0gY3VycmVudFN0ZXBJZCB8fCB0aGlzLmxhc3RTdGVwVHlwZSAhPT0gY3VycmVudFN0ZXBUeXBlO1xyXG4gICAgXHJcbiAgICBpZiAobmVlZHNSZWNyZWF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgIC8vIENsZWFyIHN0b3JlZCBpbnN0YW5jZSB3aGVuIHJlY3JlYXRpbmdcclxuICAgICAgU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5kZWxldGUodGhpcy5jb250YWluZXIpO1xyXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5kZWxldGUodGhpcy5jb250YWluZXIpO1xyXG4gICAgICB0aGlzLmxhc3RTdGVwSWQgPSBjdXJyZW50U3RlcElkO1xyXG4gICAgICB0aGlzLmxhc3RTdGVwVHlwZSA9IGN1cnJlbnRTdGVwVHlwZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIElmIHNhbWUgc3RlcCwganVzdCB1cGRhdGUgcHJvcGVydGllcyB3aXRob3V0IGNsZWFyaW5nXHJcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gU3RlcFJlbmRlcmVyQ29tcG9uZW50LmNvbXBvbmVudEluc3RhbmNlcy5nZXQodGhpcy5jb250YWluZXIpO1xyXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcclxuICAgICAgICAvLyBVcGRhdGUgYWxsIHByb3BlcnRpZXNcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0ZXApLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xyXG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KVtrZXldID0gKHRoaXMuc3RlcCBhcyBhbnkpW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZykge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuY29uZmlnID0geyAuLi4oaW5zdGFuY2UgYXMgYW55KS5jb25maWcsIC4uLnRoaXMuc3RlcCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0ZXBLZXkgPSB0aGlzLmdldFN0ZXBLZXkodGhpcy5zdGVwKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuY29tcG9uZW50TWFwLmdldCh0aGlzLnN0ZXAudHlwZSk7XHJcbiAgICBcclxuICAgIGlmIChjb21wb25lbnRUeXBlKSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcclxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgIFxyXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHJlZiBpbiBXZWFrTWFwIGZvciBmdXR1cmUgdXBkYXRlc1xyXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLnNldCh0aGlzLmNvbnRhaW5lciwgaW5zdGFuY2UpO1xyXG4gICAgICBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5zZXQodGhpcy5jb250YWluZXIsIGNvbXBvbmVudFJlZik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBTdG9yZSBjb21wb25lbnQgcmVmZXJlbmNlIGZvciBjbGVhbnVwXHJcbiAgICAgIChjb21wb25lbnRSZWYgYXMgYW55KS5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xyXG4gICAgICBcclxuICAgICAgLy8gU3ByZWFkIGNvbmZpZyBwcm9wZXJ0aWVzIGFzIGluZGl2aWR1YWwgaW5wdXRzIGZvciBjb21wb25lbnRzIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXHJcbiAgICAgIC8vIFRoaXMgc3VwcG9ydHMgYm90aCBwYXR0ZXJuczogY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjb25maWcgZGlyZWN0bHkgYW5kIHRob3NlIHRoYXQgdXNlIGluZGl2aWR1YWwgaW5wdXRzXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3RlcCkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgIT09ICd0eXBlJykge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSlba2V5XSA9ICh0aGlzLnN0ZXAgYXMgYW55KVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IG1hcCBjaGlsZHJlbiB0byBuZXN0ZWRTdGVwcyBpZiBuZXN0ZWRTdGVwcyBpcyBub3QgcHJlc2VudFxyXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW4gJiYgISh0aGlzLnN0ZXAgYXMgYW55KS5uZXN0ZWRTdGVwcykge1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzID0gKHRoaXMuc3RlcCBhcyBhbnkpLmNoaWxkcmVuO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IHNldCBsb29wVHlwZSBiYXNlZCBvbiBhY3Rpb25OYW1lIG9yIHRlc3RTdGVwVHlwZVxyXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJykge1xyXG4gICAgICAgIC8vIFNldCBsb29wVHlwZSBpZiBub3QgYWxyZWFkeSBzZXRcclxuICAgICAgICBpZiAoIShpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlKSB7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gKHRoaXMuc3RlcCBhcyBhbnkpLmFjdGlvbk5hbWU7XHJcbiAgICAgICAgICBjb25zdCB0ZXN0U3RlcFR5cGUgPSAodGhpcy5zdGVwIGFzIGFueSkudGVzdFN0ZXBUeXBlO1xyXG4gICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICdGT1JfTE9PUCcgfHwgdGVzdFN0ZXBUeXBlID09PSAnRk9SX0xPT1AnKSB7XHJcbiAgICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmxvb3BUeXBlID0gJ2Zvcic7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbk5hbWUgPT09ICdXSElMRV9MT09QJyB8fCB0ZXN0U3RlcFR5cGUgPT09ICdXSElMRV9MT09QJykge1xyXG4gICAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5sb29wVHlwZSA9ICd3aGlsZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEVuc3VyZSB0aXRsZSBpcyBzZXQgZnJvbSBhY3Rpb24gaWYgdGl0bGUgaXMgbm90IHByZXNlbnQgb3IgZW1wdHlcclxuICAgICAgICBpZiAoKCEoaW5zdGFuY2UgYXMgYW55KS50aXRsZSB8fCAhKGluc3RhbmNlIGFzIGFueSkudGl0bGUudHJpbSgpKSAmJiAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS50aXRsZSA9ICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBsb29wLXN0ZXA6IGluaXRpYWxpemUgaXRlcmF0aW9ucyBpZiBub3QgcHJlc2VudFxyXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdsb29wJyAmJiAhKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucykge1xyXG4gICAgICAgIC8vIFVzZSBoYW5kbGVyIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHRyeSB0byBpbml0aWFsaXplIGZyb20gc3RlcC5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gdGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIodGhpcy5zdGVwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdD8uc3RlcFJlc3VsdCAmJiBBcnJheS5pc0FycmF5KCh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0KSkge1xyXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpdGVyYXRpb25zIGRpcmVjdGx5IGZyb20gc3RlcFJlc3VsdFxyXG4gICAgICAgICAgY29uc3QgaXRlcmF0aW9uczogYW55W10gPSBbXTtcclxuICAgICAgICAgICh0aGlzLnN0ZXAgYXMgYW55KS5leGVjdXRlZFJlc3VsdC5zdGVwUmVzdWx0LmZvckVhY2goKGl0ZXJhdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbkluZGV4ID0gaXRlcmF0aW9uLmluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXRlcmF0aW9uLmluZGV4ICE9PSBudWxsID8gaXRlcmF0aW9uLmluZGV4IDogaXRlcmF0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXM6ICdzdWNjZXNzJyB8ICdmYWlsZWQnIHwgJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnID0gJ3BlbmRpbmcnO1xyXG4gICAgICAgICAgICBpZiAoaXRlcmF0aW9uLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0xvd2VyID0gaXRlcmF0aW9uLnN0YXR1cy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgIGlmIChzdGF0dXNMb3dlciA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1c0xvd2VyID09PSAncGFzc2VkJykge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3N1Y2Nlc3MnO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdmYWlsdXJlJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2ZhaWxlZCcpIHtcclxuICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzTG93ZXIgPT09ICdydW5uaW5nJyB8fCBzdGF0dXNMb3dlciA9PT0gJ2luX3Byb2dyZXNzJykge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVyYXRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgIGlkOiBgaXRlci0ke2l0ZXJhdGlvbkluZGV4fWAsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IGBpdGVyICR7aXRlcmF0aW9uSW5kZXh9YCxcclxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgICBzdWJTdGVwczogW10sXHJcbiAgICAgICAgICAgICAgaW5kZXg6IGl0ZXJhdGlvbkluZGV4XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5pdGVyYXRpb25zID0gaXRlcmF0aW9ucztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGxvb3Atc3RlcDogc2V0IGRlZmF1bHRJdGVyYXRpb24gYW5kIHNlbGVjdGVkSXRlcmF0aW9uSWRcclxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcclxuICAgICAgICAvLyBTZXQgZGVmYXVsdEl0ZXJhdGlvbiB0byAnbGFzdCcgaWYgbm90IGFscmVhZHkgc2V0XHJcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5kZWZhdWx0SXRlcmF0aW9uID0gJ2xhc3QnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWRJdGVyYXRpb25JZCB0byBsYXN0IGl0ZXJhdGlvbiBpZiBub3QgYWxyZWFkeSBzZXRcclxuICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucztcclxuICAgICAgICBpZiAoaXRlcmF0aW9ucyAmJiBBcnJheS5pc0FycmF5KGl0ZXJhdGlvbnMpICYmIGl0ZXJhdGlvbnMubGVuZ3RoID4gMCAmJiAhKGluc3RhbmNlIGFzIGFueSkuc2VsZWN0ZWRJdGVyYXRpb25JZCkge1xyXG4gICAgICAgICAgY29uc3QgbGFzdEl0ZXJhdGlvbiA9IGl0ZXJhdGlvbnNbaXRlcmF0aW9ucy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQgPSBsYXN0SXRlcmF0aW9uLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc3RlcC1ncm91cDogbWFwIGNoaWxkcmVuIHRvIHN0ZXBzIGlmIHN0ZXBzIGlzIG5vdCBwcmVzZW50XHJcbiAgICAgIGlmICh0aGlzLnN0ZXAudHlwZSA9PT0gJ3N0ZXAtZ3JvdXAnICYmICh0aGlzLnN0ZXAgYXMgYW55KS5jaGlsZHJlbiAmJiAhKHRoaXMuc3RlcCBhcyBhbnkpLnN0ZXBzKSB7XHJcbiAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuc3RlcHMgPSAodGhpcy5zdGVwIGFzIGFueSkuY2hpbGRyZW47XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNvbmRpdGlvbi1zdGVwOiBzZXQgYnJhbmNoZXMgYW5kIGNvbmRpdGlvblRleHRcclxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnY29uZGl0aW9uJykge1xyXG4gICAgICAgIC8vIFNldCBicmFuY2hlcyB1c2luZyBoYW5kbGVyIGlmIGF2YWlsYWJsZSBhbmQgYnJhbmNoZXMgbm90IGFscmVhZHkgc2V0XHJcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5icmFuY2hlcyAmJiB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcikge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMgPSB0aGlzLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlcih0aGlzLnN0ZXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZXQgY29uZGl0aW9uVGV4dCBmcm9tIGFjdGlvbiBpZiBjb25kaXRpb25UZXh0IGlzIG5vdCBwcmVzZW50XHJcbiAgICAgICAgaWYgKCEoaW5zdGFuY2UgYXMgYW55KS5jb25kaXRpb25UZXh0ICYmICh0aGlzLnN0ZXAgYXMgYW55KS5hY3Rpb24pIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmRpdGlvblRleHQgPSAodGhpcy5zdGVwIGFzIGFueSkuYWN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZXQgaXNMb2FkaW5nIHVzaW5nIGhhbmRsZXIgaWYgYXZhaWxhYmxlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIpIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmlzTG9hZGluZyA9IHRoaXMuaXNTdGVwTG9hZGluZ0hhbmRsZXIodGhpcy5zdGVwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFdpcmUgdXAgY29tbW9uIGV2ZW50IGVtaXR0ZXJzIGZvciBhcGksIGFpLWFnZW50LCBhbmQgbG9vcCBzdGVwc1xyXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdhcGknIHx8IHRoaXMuc3RlcC50eXBlID09PSAnYWktYWdlbnQnIHx8IHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcgfHwgdGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XHJcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGNvbW1vbiBvdXRwdXQgZXZlbnRzIGFuZCBjYWxsIGhhbmRsZXJzXHJcbiAgICAgICAgLy8gRXZlbnRFbWl0dGVycyBhcmUgU3ViamVjdHMsIHNvIHdlIGNhbiBzdWJzY3JpYmUgdG8gdGhlbVxyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5tYWtlQ3VycmVudEJhc2VsaW5lICYmIHRoaXMub25NYWtlQ3VycmVudEJhc2VsaW5lSGFuZGxlcikge1xyXG4gICAgICAgICAgKGluc3RhbmNlIGFzIGFueSkubWFrZUN1cnJlbnRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyPy4oZXZlbnQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZSAmJiB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS51cGxvYWRCYXNlbGluZS5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcj8uKGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuYW5hbHl6ZSAmJiB0aGlzLm9uQW5hbHl6ZUhhbmRsZXIpIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmFuYWx5emUuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkFuYWx5emVIYW5kbGVyPy4oKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkudmlld0Z1bGxMb2dzICYmIHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS52aWV3RnVsbExvZ3Muc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXI/LigpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbiAmJiB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5zZWxmSGVhbEFjdGlvbi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcj8uKGV2ZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbG9vcC1zdGVwOiB3aXJlIHVwIG9uVmlld0FsbEl0ZXJhdGlvbnMgZXZlbnRcclxuICAgICAgaWYgKHRoaXMuc3RlcC50eXBlID09PSAnbG9vcCcpIHtcclxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9ucyAmJiB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vblZpZXdBbGxJdGVyYXRpb25zLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXI/Lih0aGlzLnN0ZXApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb25kaXRpb24tc3RlcDogd2lyZSB1cCBvbkV4cGFuZCBldmVudFxyXG4gICAgICBpZiAodGhpcy5zdGVwLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XHJcbiAgICAgICAgaWYgKChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kICYmIHRoaXMub25FeHBhbmRIYW5kbGVyKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5vbkV4cGFuZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBDYWxsIG9uRXhwYW5kSGFuZGxlciB3aXRoIHRoZSBzdGVwIGNvbmZpZ1xyXG4gICAgICAgICAgICB0aGlzLm9uRXhwYW5kSGFuZGxlcj8uKHRoaXMuc3RlcCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBwcm9wZXJ0eSBpcyBwYXNzZWQgY29ycmVjdGx5XHJcbiAgICAgIC8vIFVzZSBpc1N0ZXBFeHBhbmRlZEhhbmRsZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHN0ZXAuZXhwYW5kZWQgb3Igc3RlcC5jb25maWcuZXhwYW5kZWRcclxuICAgICAgaWYgKHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyICYmIHRoaXMuc3RlcCkge1xyXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkU3RhdGUgPSB0aGlzLmlzU3RlcEV4cGFuZGVkSGFuZGxlcih0aGlzLnN0ZXApO1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gZXhwYW5kZWRTdGF0ZTtcclxuICAgICAgICBpZiAoKGluc3RhbmNlIGFzIGFueSkuY29uZmlnKSB7XHJcbiAgICAgICAgICAoaW5zdGFuY2UgYXMgYW55KS5jb25maWcuZXhwYW5kZWQgPSBleHBhbmRlZFN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICgodGhpcy5zdGVwIGFzIGFueSkuZXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkID0gKHRoaXMuc3RlcCBhcyBhbnkpLmV4cGFuZGVkO1xyXG4gICAgICAgIGlmICgoaW5zdGFuY2UgYXMgYW55KS5jb25maWcpIHtcclxuICAgICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZy5leHBhbmRlZCA9ICh0aGlzLnN0ZXAgYXMgYW55KS5leHBhbmRlZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFBhc3MgaGFuZGxlciBmdW5jdGlvbnMgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxyXG4gICAgICBpZiAodGhpcy5vbkV4cGFuZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uRXhwYW5kSGFuZGxlciA9IHRoaXMub25FeHBhbmRIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5nZXRDb25kaXRpb25CcmFuY2hlc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldENvbmRpdGlvbkJyYW5jaGVzSGFuZGxlciA9IHRoaXMuZ2V0Q29uZGl0aW9uQnJhbmNoZXNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5pc1N0ZXBMb2FkaW5nSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuaXNTdGVwTG9hZGluZ0hhbmRsZXIgPSB0aGlzLmlzU3RlcExvYWRpbmdIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5pc1N0ZXBFeHBhbmRlZEhhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmlzU3RlcEV4cGFuZGVkSGFuZGxlciA9IHRoaXMuaXNTdGVwRXhwYW5kZWRIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyID0gdGhpcy5jb252ZXJ0TXNUb1NlY29uZHNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5mb3JtYXRGYWlsdXJlRGV0YWlsc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmZvcm1hdEZhaWx1cmVEZXRhaWxzSGFuZGxlciA9IHRoaXMuZm9ybWF0RmFpbHVyZURldGFpbHNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5nZXRTZWxmSGVhbEFuYWx5c2lzSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0U2VsZkhlYWxBbmFseXNpc0hhbmRsZXIgPSB0aGlzLmdldFNlbGZIZWFsQW5hbHlzaXNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5nZXRMb29wSXRlcmF0aW9uc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLmdldExvb3BJdGVyYXRpb25zSGFuZGxlciA9IHRoaXMuZ2V0TG9vcEl0ZXJhdGlvbnNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5nZXRBcGlBc3NlcnRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZ2V0QXBpQXNzZXJ0aW9uc0hhbmRsZXIgPSB0aGlzLmdldEFwaUFzc2VydGlvbnNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5mb3JtYXRBY3Rpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkuZm9ybWF0QWN0aW9uc0hhbmRsZXIgPSB0aGlzLmZvcm1hdEFjdGlvbnNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vblZpZXdBbGxJdGVyYXRpb25zSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25WaWV3QWxsSXRlcmF0aW9uc0hhbmRsZXIgPSB0aGlzLm9uVmlld0FsbEl0ZXJhdGlvbnNIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyID0gdGhpcy5vbk1ha2VDdXJyZW50QmFzZWxpbmVIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vblVwbG9hZEJhc2VsaW5lSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25VcGxvYWRCYXNlbGluZUhhbmRsZXIgPSB0aGlzLm9uVXBsb2FkQmFzZWxpbmVIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vbkFuYWx5emVIYW5kbGVyKSAoaW5zdGFuY2UgYXMgYW55KS5vbkFuYWx5emVIYW5kbGVyID0gdGhpcy5vbkFuYWx5emVIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vblZpZXdGdWxsTG9nc0hhbmRsZXIpIChpbnN0YW5jZSBhcyBhbnkpLm9uVmlld0Z1bGxMb2dzSGFuZGxlciA9IHRoaXMub25WaWV3RnVsbExvZ3NIYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5vblNlbGZIZWFsQWN0aW9uSGFuZGxlcikgKGluc3RhbmNlIGFzIGFueSkub25TZWxmSGVhbEFjdGlvbkhhbmRsZXIgPSB0aGlzLm9uU2VsZkhlYWxBY3Rpb25IYW5kbGVyO1xyXG4gICAgICBpZiAodGhpcy5pc1VwbG9hZGluZ0Jhc2VsaW5lICE9PSB1bmRlZmluZWQpIChpbnN0YW5jZSBhcyBhbnkpLmlzVXBsb2FkaW5nQmFzZWxpbmUgPSB0aGlzLmlzVXBsb2FkaW5nQmFzZWxpbmU7XHJcbiAgICAgIGlmICh0aGlzLmlzTGl2ZSAhPT0gdW5kZWZpbmVkKSAoaW5zdGFuY2UgYXMgYW55KS5pc0xpdmUgPSB0aGlzLmlzTGl2ZTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFsc28gc2V0IGNvbmZpZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbXBvbmVudHMgdGhhdCBzdGlsbCB1c2UgY29uZmlnIGlucHV0XHJcbiAgICAgIGlmICgnY29uZmlnJyBpbiBpbnN0YW5jZSkge1xyXG4gICAgICAgIChpbnN0YW5jZSBhcyBhbnkpLmNvbmZpZyA9IHRoaXMuc3RlcDtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gU3RvcmUga2V5IGZvciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgIHRoaXMucHJldmlvdXNTdGVwS2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxyXG4gICAgICBpZiAoY29tcG9uZW50UmVmLmluamVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VDZHIgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmLCBudWxsKTtcclxuICAgICAgICBpZiAoaW5zdGFuY2VDZHIpIHtcclxuICAgICAgICAgIGluc3RhbmNlQ2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcbiAgICAvLyBVc2UgbmdEb0NoZWNrIHRvIGRldGVjdCBjaGFuZ2VzIGluIG5lc3RlZCBwcm9wZXJ0aWVzIHRoYXQgbmdPbkNoYW5nZXMgbWlnaHQgbWlzc1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50SW5zdGFuY2VzLmdldCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSBTdGVwUmVuZGVyZXJDb21wb25lbnQuY29tcG9uZW50UmVmcy5nZXQodGhpcy5jb250YWluZXIpO1xyXG4gICAgXHJcbiAgICBpZiAoaW5zdGFuY2UgJiYgY29tcG9uZW50UmVmICYmIHRoaXMuc3RlcCkge1xyXG4gICAgICBjb25zdCBjdXJyZW50S2V5ID0gdGhpcy5nZXRTdGVwS2V5KHRoaXMuc3RlcCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBJZiBzdGVwIHByb3BlcnRpZXMgY2hhbmdlZCAoZXZlbiBpZiByZWZlcmVuY2UgZGlkbid0KSwgdXBkYXRlIHRoZSBpbnN0YW5jZVxyXG4gICAgICBpZiAoY3VycmVudEtleSAhPT0gdGhpcy5wcmV2aW91c1N0ZXBLZXkpIHtcclxuICAgICAgICAvLyBXZSBuZWVkIHRoZSBwcmV2aW91cyBzdGVwIHRvIGNvbXBhcmUsIHNvIHdlJ2xsIHVwZGF0ZSBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWluaW1hbCBwcmV2aW91cyBzdGVwIGZyb20gdGhlIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZVxyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RlcDogYW55ID0ge1xyXG4gICAgICAgICAgaWQ6IChpbnN0YW5jZSBhcyBhbnkpLmlkLFxyXG4gICAgICAgICAgdHlwZTogKGluc3RhbmNlIGFzIGFueSkudHlwZSxcclxuICAgICAgICAgIHN0YXR1czogKGluc3RhbmNlIGFzIGFueSkuc3RhdHVzLFxyXG4gICAgICAgICAgZHVyYXRpb246IChpbnN0YW5jZSBhcyBhbnkpLmR1cmF0aW9uLFxyXG4gICAgICAgICAgZXhwYW5kZWQ6IChpbnN0YW5jZSBhcyBhbnkpLmV4cGFuZGVkLFxyXG4gICAgICAgICAgY2hpbGRyZW46IChpbnN0YW5jZSBhcyBhbnkpLmNoaWxkcmVuLFxyXG4gICAgICAgICAgbmVzdGVkU3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLm5lc3RlZFN0ZXBzLFxyXG4gICAgICAgICAgc3RlcHM6IChpbnN0YW5jZSBhcyBhbnkpLnN0ZXBzLFxyXG4gICAgICAgICAgZXhlY3V0aW9uRGF0YTogKGluc3RhbmNlIGFzIGFueSkuZXhlY3V0aW9uRGF0YSxcclxuICAgICAgICAgIGFjdGlvbjogKGluc3RhbmNlIGFzIGFueSkuYWN0aW9uLFxyXG4gICAgICAgICAgdGl0bGU6IChpbnN0YW5jZSBhcyBhbnkpLnRpdGxlLFxyXG4gICAgICAgICAgcmVzdWx0OiAoaW5zdGFuY2UgYXMgYW55KS5yZXN1bHQsXHJcbiAgICAgICAgICBtZXRob2Q6IChpbnN0YW5jZSBhcyBhbnkpLm1ldGhvZCxcclxuICAgICAgICAgIGVuZHBvaW50OiAoaW5zdGFuY2UgYXMgYW55KS5lbmRwb2ludCxcclxuICAgICAgICAgIHN0YXR1c0NvZGU6IChpbnN0YW5jZSBhcyBhbnkpLnN0YXR1c0NvZGUsXHJcbiAgICAgICAgICByZXNwb25zZVRpbWU6IChpbnN0YW5jZSBhcyBhbnkpLnJlc3BvbnNlVGltZSxcclxuICAgICAgICAgIGFjdGlvbnM6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbnMsXHJcbiAgICAgICAgICBwcm9tcHQ6IChpbnN0YW5jZSBhcyBhbnkpLnByb21wdCxcclxuICAgICAgICAgIG9wdGltaXplZFJ1bjogKGluc3RhbmNlIGFzIGFueSkub3B0aW1pemVkUnVuLFxyXG4gICAgICAgICAgYWN0aW9uQ291bnQ6IChpbnN0YW5jZSBhcyBhbnkpLmFjdGlvbkNvdW50LFxyXG4gICAgICAgICAgaXRlcmF0aW9uczogKGluc3RhbmNlIGFzIGFueSkuaXRlcmF0aW9ucyxcclxuICAgICAgICAgIHNlbGVjdGVkSXRlcmF0aW9uSWQ6IChpbnN0YW5jZSBhcyBhbnkpLnNlbGVjdGVkSXRlcmF0aW9uSWQsXHJcbiAgICAgICAgICBicmFuY2hlczogKGluc3RhbmNlIGFzIGFueSkuYnJhbmNoZXMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudEluc3RhbmNlKHRoaXMuc3RlcCwgcHJldmlvdXNTdGVwKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzU3RlcEtleSA9IGN1cnJlbnRLZXk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn0iXX0=